Clinical Coding

ICD-10 Code Search.

Instantly search 70,000+ ICD-10-CM codes by description or code number. Powered by the NIH clinical tables API — no account needed.

Results appear as you type. Searches are cached — no DB queries.

Search by description

"diabetes"

Returns all codes matching the condition

Search by code prefix

"E11"

Returns all subcodes under that category

Partial match

"hypertens"

Matches partial words and abbreviations

ICD-10-CM data sourced from NIH National Library of Medicine. Updated annually.

What is ICD-10?

ICD-10 (International Classification of Diseases, 10th Revision) is the global standard for classifying diseases, injuries, and health conditions. In the United States, two separate code sets are used: ICD-10-CM for diagnosis coding and ICD-10-PCS for inpatient procedure coding.

ICD-10-CM — Diagnosis Codes

~70,000 codes. Used by all providers on outpatient and inpatient claims. 3–7 characters (letter + numbers). Maintained by CMS and CDC. Updated every October 1st.

ICD-10-PCS — Inpatient Procedure Codes

~80,000 codes. Used only on hospital facility (UB-04) inpatient claims. Always 7 alphanumeric characters. Completely different structure from CM. Not included in this search tool.

ICD-10-CM codes follow a hierarchical structure: the first three characters form the category (e.g., E11 = Type 2 diabetes mellitus), and characters 4–7 add clinical specificity for etiology, anatomic site, and severity. Codes updated annually — CMS publishes the new code file each May for an October 1st effective date.

ICD-10-CM replaced ICD-9-CM in the United States on October 1, 2015. The transition nearly quadrupled the number of available codes (from ~14,000 to ~70,000), enabling far more precise clinical documentation and analytics. Data teams working with claims from before October 2015 must maintain crosswalk tables between ICD-9 and ICD-10 diagnosis codes for longitudinal analysis.

How to Use This ICD-10 Search

This tool queries the NIH clinical tables API in real time against the official CMS ICD-10-CM file. No login required and results reflect the current code year.

Search by Description

  1. 1Type a plain-English term: "knee pain", "type 2 diabetes", "sepsis".
  2. 2Matching codes and full descriptions appear instantly.
  3. 3Results are ranked by relevance — most specific matches first.
  4. 4Click any code to copy it to clipboard.

Search by Code or Prefix

  1. 1Enter a code prefix: "E11" returns all Type 2 diabetes codes.
  2. 2Enter a full code: "E11.65" for exact lookup.
  3. 3Use 3-character category codes to browse all child codes.
  4. 4Billable codes are marked — non-billable header codes are shown but cannot be submitted on claims.

Tip: When searching for related codes, start with the 3-character category (e.g., J18 for pneumonia) to see the full hierarchy before choosing the most specific billable code.

ICD-10 in Healthcare Data Systems

Claims Adjudication

Payers validate every ICD-10-CM code on inbound 837 claims against the active code file for the date of service. Invalid codes trigger a rejection (277CA). Expired codes — valid in a prior year but removed in the current code set — are a common source of claim denials in January when the new code year begins.

HEDIS Measure Identification

NCQA's HEDIS measures use ICD-10-CM code value sets to identify eligible members and events. For example, the Diabetes Care measure uses a value set of ~50 ICD-10 codes to find members with diabetes in the measurement year. NCQA publishes annual value set updates that must be loaded into your analytics layer each January.

HCC Risk Adjustment

CMS-HCC (Hierarchical Condition Categories) maps ICD-10-CM diagnosis codes to HCC categories that drive Medicare Advantage risk scores and capitation payments. Each HCC maps to a coefficient that adds to a member's RAF score. Accurate ICD-10 coding in claims directly impacts plan revenue — missing a qualifying diagnosis code can mean losing thousands per member per year.

Population Health Analytics

ICD-10-CM codes are the primary signal for chronic condition identification, disease burden analysis, and cohort building in population health platforms. Data teams build materialized views that flag members with diabetes (E10–E13), hypertension (I10–I16), or COPD (J40–J44) based on ICD-10 codes appearing in claims data within a rolling 12-month or 24-month lookback window.

ICD-10 Database Schema

Store the ICD-10-CM code file as a reference table in your data warehouse. Load a new annual snapshot each October and keep prior years for historical claim lookups — always validate a diagnosis code against the version active on the date of service, not the current year.

CREATE TABLE icd10_codes (
  icd10_cd      VARCHAR(10) PRIMARY KEY,
  icd10_desc    VARCHAR(500),
  short_desc    VARCHAR(100),
  category_cd   VARCHAR(3),         -- 3-char parent category (e.g. E11)
  is_billable   BOOLEAN,            -- FALSE for header/category codes
  eff_dt        DATE,               -- Effective date (usually Oct 1)
  exp_dt        DATE,               -- NULL if currently active
  hcc_model_cd  VARCHAR(10),        -- CMS-HCC mapping if applicable
  chronic_flg   BOOLEAN             -- Chronic condition indicator
);

CREATE INDEX idx_icd10_category ON icd10_codes(category_cd);
CREATE INDEX idx_icd10_hcc      ON icd10_codes(hcc_model_cd) WHERE hcc_model_cd IS NOT NULL;
CREATE INDEX idx_icd10_desc     ON icd10_codes USING gin(to_tsvector('english', icd10_desc));

-- Example: find all billable ICD-10 codes that map to an HCC
SELECT
  i.icd10_cd,
  i.icd10_desc,
  i.hcc_model_cd,
  i.chronic_flg
FROM icd10_codes i
WHERE i.is_billable = TRUE
  AND i.hcc_model_cd IS NOT NULL
  AND i.exp_dt IS NULL
ORDER BY i.hcc_model_cd, i.icd10_cd;

Need to convert this DDL for Snowflake, BigQuery, or SQL Server? Use the free DDL Converter →

ICD-10 Column Naming Standards

Standardized column names for ICD-10 fields following ISO-11179 naming conventions for Snowflake, Databricks, and BigQuery.

Business NameStandard Column NameData TypeNotes
Primary Diagnosis Codeprim_diag_cdVARCHAR(7)Never INTEGER — leading zeros matter
Secondary Diagnosis Codesec_diag_cdVARCHAR(7)Up to 24 on a claim (diag_cd_02 to diag_cd_24)
Diagnosis Codediag_cdVARCHAR(7)Generic diagnosis code field
Diagnosis Descriptiondiag_descVARCHAR(500)Full clinical description
Diagnosis Sequence Numberdiag_seq_nbrINTEGER1 = primary, 2-24 = secondary
ICD Versionicd_vrsnVARCHAR(5)ICD10 or ICD9 — critical for crosswalk
Diagnosis Effective Datediag_eff_dtDATEDate code became valid
Diagnosis Expiration Datediag_exp_dtDATENULL if currently active
Billable Indicatorbillable_indBOOLEANFALSE for header/category codes
Chronic Condition Flagchronic_cond_flgBOOLEANFor population health analytics
HCC Category Codehcc_cat_cdVARCHAR(10)CMS-HCC model mapping
POA Indicatorpoa_indVARCHAR(1)Present on Admission (Y/N/W/U/1)

Browse all diagnosis-related column standards in the Clinical domain glossary →

dbt Model for ICD-10 Reference Data

Load the CMS ICD-10-CM annual file as a dbt seed and build a reference model with data quality tests baked in.

seeds/icd10_codes.yml

version: 2

seeds:
  - name: icd10_codes
    config:
      schema: reference
      column_types:
        icd10_cd: varchar(7)
        icd10_desc: varchar(500)
        category_cd: varchar(3)
        is_billable: boolean
        eff_dt: date
        exp_dt: date
    columns:
      - name: icd10_cd
        tests:
          - not_null
          - unique
          - dbt_utils.expression_is_true:
              expression: "length(icd10_cd) between 3 and 7"
      - name: is_billable
        tests:
          - not_null
          - accepted_values:
              values: [true, false]

models/reference/dim_icd10.sql

{{ config(
    materialized='table',
    schema='reference',
    tags=['reference', 'icd10', 'clinical']
) }}

with source as (
    select * from {{ ref('icd10_codes') }}
),

enriched as (
    select
        icd10_cd,
        icd10_desc,
        short_desc,
        left(icd10_cd, 3)       as category_cd,
        is_billable,
        eff_dt,
        exp_dt,
        hcc_model_cd,
        chronic_flg,
        -- Derived fields
        exp_dt is null          as is_active,
        current_date between eff_dt
          and coalesce(exp_dt, '9999-12-31') as is_current_year,
        -- ICD chapter from first character
        case left(icd10_cd, 1)
            when 'A' then 'Infectious and Parasitic Diseases'
            when 'B' then 'Infectious and Parasitic Diseases'
            when 'C' then 'Neoplasms'
            when 'D' then 'Blood and Immune Disorders'
            when 'E' then 'Endocrine and Metabolic Diseases'
            when 'F' then 'Mental and Behavioral Disorders'
            when 'G' then 'Nervous System Diseases'
            when 'H' then 'Eye and Ear Diseases'
            when 'I' then 'Circulatory System Diseases'
            when 'J' then 'Respiratory System Diseases'
            when 'K' then 'Digestive System Diseases'
            when 'L' then 'Skin Diseases'
            when 'M' then 'Musculoskeletal Diseases'
            when 'N' then 'Genitourinary Diseases'
            when 'O' then 'Pregnancy and Childbirth'
            when 'P' then 'Perinatal Conditions'
            when 'Q' then 'Congenital Malformations'
            when 'R' then 'Symptoms and Signs'
            when 'S' then 'Injury and Poisoning'
            when 'T' then 'Injury and Poisoning'
            when 'V' then 'External Causes'
            when 'W' then 'External Causes'
            when 'X' then 'External Causes'
            when 'Y' then 'External Causes'
            when 'Z' then 'Factors Influencing Health'
            else 'Unknown'
        end                     as icd10_chapter
    from source
)

select * from enriched

Convert this DDL for your target platform using the free DDL Converter →

ICD-10 Data Quality Rules for Data Engineers

Common ICD-10 data quality issues found in healthcare data warehouses and how to detect them with SQL.

HIGH

Truncated Codes

Storing "E11" instead of "E11.9" — category codes submitted on claims cause rejections.

-- Find non-billable header codes on claims
SELECT claim_id, diag_cd
FROM fact_claim_header
WHERE diag_cd IN (
    SELECT icd10_cd FROM dim_icd10 WHERE is_billable = FALSE
);
HIGH

ICD-9 Codes in ICD-10 Fields

Legacy data migration often leaves ICD-9 codes (e.g. "250.00") in ICD-10 columns.

-- Detect ICD-9 codes (contain decimal, start with digit, or are 5 chars with decimal)
SELECT claim_id, diag_cd
FROM fact_claim_header
WHERE diag_cd REGEXP '^[0-9]'        -- ICD-9 starts with digit
   OR diag_cd LIKE '%.%'             -- ICD-9 uses decimal format
   OR icd_vrsn = 'ICD9';            -- Version flag mismatch
MEDIUM

Expired Codes

Codes valid in prior years but removed from the current code set cause denials in January.

-- Find claims using codes expired before date of service
SELECT c.claim_id, c.svc_dt, c.diag_cd, i.exp_dt
FROM fact_claim_header c
JOIN dim_icd10 i ON c.diag_cd = i.icd10_cd
WHERE i.exp_dt IS NOT NULL
  AND c.svc_dt > i.exp_dt;
MEDIUM

Missing POA Indicator

Present on Admission (POA) indicator required on inpatient claims — missing values fail CMS edits.

-- Inpatient claims missing POA indicator
SELECT claim_id, diag_cd, poa_ind
FROM fact_claim_header
WHERE claim_type_cd = 'INPATIENT'
  AND (poa_ind IS NULL OR poa_ind NOT IN ('Y','N','W','U','1'));
HIGH

Invalid Code Format

ICD-10 codes must be 3-7 chars, start with a letter, followed by digits. Malformed codes fail all downstream logic.

-- Find malformed ICD-10 codes
SELECT claim_id, diag_cd
FROM fact_claim_header
WHERE diag_cd NOT REGEXP '^[A-Z][0-9]{2}(\.[A-Z0-9]{1,4})?$'
  AND icd_vrsn = 'ICD10';

ICD-9 to ICD-10 Crosswalk for Data Teams

If your data warehouse contains claims from before October 1, 2015, you need a crosswalk table to enable longitudinal analysis across the ICD-9 to ICD-10 transition. CMS publishes the General Equivalence Mappings (GEMs) files for this purpose.

Forward Mapping (ICD-9 → ICD-10)

Maps each ICD-9 code to its closest ICD-10 equivalent. Used when converting historical ICD-9 claims to ICD-10 for trending and population health analysis.

Backward Mapping (ICD-10 → ICD-9)

Maps each ICD-10 code back to ICD-9. Used when legacy payer or vendor systems still require ICD-9 codes, or for comparing current claims to pre-2015 baselines.

Crosswalk dbt model — joining ICD-9 and ICD-10 claims

-- models/reference/icd_crosswalk.sql
-- Unified diagnosis history across ICD-9 and ICD-10 transition

with icd10_claims as (
    select
        mbr_id,
        svc_dt,
        diag_cd,
        'ICD10'     as icd_vrsn,
        diag_cd     as icd10_cd,
        null        as icd9_cd
    from {{ ref('fact_claim_header') }}
    where icd_vrsn = 'ICD10'
),

icd9_claims as (
    select
        mbr_id,
        svc_dt,
        diag_cd,
        'ICD9'      as icd_vrsn,
        xw.icd10_cd as icd10_cd,  -- forward mapped
        diag_cd     as icd9_cd
    from {{ ref('fact_claim_header') }} c
    left join {{ ref('gems_forward_mapping') }} xw
        on c.diag_cd = xw.icd9_cd
    where c.icd_vrsn = 'ICD9'
),

unified as (
    select * from icd10_claims
    union all
    select * from icd9_claims
)

select
    mbr_id,
    svc_dt,
    icd_vrsn,
    icd9_cd,
    icd10_cd,
    d.icd10_desc,
    d.hcc_model_cd,
    d.chronic_flg
from unified u
left join {{ ref('dim_icd10') }} d on u.icd10_cd = d.icd10_cd

Download GEMs files: CMS publishes the ICD-10-CM GEMs crosswalk files annually at cms.gov/icd-10. Load the forward and backward mapping files as dbt seeds alongside your ICD-10 reference data.

Frequently Asked Questions

What is the difference between ICD-10-CM and ICD-10-PCS?

ICD-10-CM (Clinical Modification) contains diagnosis codes used by all healthcare providers — physicians, hospitals, and payers — to classify diseases, conditions, and symptoms. ICD-10-PCS (Procedure Coding System) contains inpatient procedure codes used only for hospital facility billing on UB-04 claims. This tool searches ICD-10-CM diagnosis codes. ICD-10-PCS codes are 7 characters, alphanumeric, and structured completely differently.

How many ICD-10 codes are there?

ICD-10-CM contains approximately 70,000 diagnosis codes as of the FY2026 annual update. The code set is updated each October 1st by CMS and the CDC. Not all codes are billable — many are header/category codes that require a more specific child code for claims submission.

How do I search ICD-10 codes by description?

Enter a plain-English term in the search box above — for example "type 2 diabetes" or "knee pain" — and matching codes with full descriptions will appear instantly. You can also search by code prefix: entering "E11" returns all Type 2 diabetes codes. Results are powered by the NIH clinical tables API, which uses the official CMS ICD-10-CM code file.

How are ICD-10 codes used in claims data?

ICD-10-CM diagnosis codes appear in several places in claims data: the principal diagnosis (DX01) and up to 24 secondary diagnoses on the HI segment of 837 EDI claims, the DIAGNOSIS_CODE columns in your claims warehouse tables, and as inputs to HCC risk adjustment models that calculate Medicare Advantage RAF scores. Every ICD-10 code on a claim drives clinical grouping, quality measure attribution, and payer reimbursement logic.

What is the ICD-10 code structure?

ICD-10-CM codes are 3 to 7 characters. The first character is always a letter (A–Z). Characters 2–3 are numeric. A decimal point separates the category (first 3 characters) from the etiology/anatomic site/severity extension (characters 4–7). Example: E11.65 = E (endocrine) + 11 (type 2 diabetes) + .65 (with hyperglycemia). The 7th character is often a placeholder "X" or an encounter type (A=initial, D=subsequent, S=sequela).

What data type should I use to store ICD-10 codes in Snowflake or BigQuery?

Always store ICD-10 codes as VARCHAR(7), never as INTEGER or NUMERIC. ICD-10 codes contain letters, dots, and leading characters that make numeric storage impossible. VARCHAR(7) accommodates all valid ICD-10-CM codes (3–7 characters). In BigQuery use STRING, in Databricks use STRING or VARCHAR(7). Add a CHECK constraint or dbt test to enforce the 3–7 character length and valid format (first character must be a letter).

How do I validate ICD-10 codes in my data pipeline?

The most reliable approach is joining your claims data against a loaded copy of the official CMS ICD-10-CM code file filtered to is_billable = TRUE and the code year matching the date of service. A regex check (^[A-Z][0-9]{2}(\.[A-Z0-9]{1,4})?$) catches format errors but won't catch valid-format but non-existent codes. In dbt, use a relationships test against your dim_icd10 seed table for complete validation. Always validate against the code year active on the date of service, not the current year.