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
- 1Type a plain-English term: "knee pain", "type 2 diabetes", "sepsis".
- 2Matching codes and full descriptions appear instantly.
- 3Results are ranked by relevance — most specific matches first.
- 4Click any code to copy it to clipboard.
Search by Code or Prefix
- 1Enter a code prefix: "E11" returns all Type 2 diabetes codes.
- 2Enter a full code: "E11.65" for exact lookup.
- 3Use 3-character category codes to browse all child codes.
- 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 Name | Standard Column Name | Data Type | Notes |
|---|---|---|---|
| Primary Diagnosis Code | prim_diag_cd | VARCHAR(7) | Never INTEGER — leading zeros matter |
| Secondary Diagnosis Code | sec_diag_cd | VARCHAR(7) | Up to 24 on a claim (diag_cd_02 to diag_cd_24) |
| Diagnosis Code | diag_cd | VARCHAR(7) | Generic diagnosis code field |
| Diagnosis Description | diag_desc | VARCHAR(500) | Full clinical description |
| Diagnosis Sequence Number | diag_seq_nbr | INTEGER | 1 = primary, 2-24 = secondary |
| ICD Version | icd_vrsn | VARCHAR(5) | ICD10 or ICD9 — critical for crosswalk |
| Diagnosis Effective Date | diag_eff_dt | DATE | Date code became valid |
| Diagnosis Expiration Date | diag_exp_dt | DATE | NULL if currently active |
| Billable Indicator | billable_ind | BOOLEAN | FALSE for header/category codes |
| Chronic Condition Flag | chronic_cond_flg | BOOLEAN | For population health analytics |
| HCC Category Code | hcc_cat_cd | VARCHAR(10) | CMS-HCC model mapping |
| POA Indicator | poa_ind | VARCHAR(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 enrichedConvert 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.
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
);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
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;
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'));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_cdDownload 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.
Related Guides
ICD-10 Guide
ICD-10-CM structure, database integration, and billing workflows.
HCC Risk Adjustment
RAF scores, CMS-HCC models, and diagnosis code mapping.
Claims Data Glossary
All claims data terms, column names, and DDL examples.
DDL Converter
Convert your ICD-10 schema between Snowflake, BigQuery, and Databricks.