ICD-11 Validation in Node.js — WHO MMS Diagnosis Codes
ICD-11 is the WHO's successor to ICD-10 — a digital-first classification rolled out in 2022 that is gradually replacing ICD-10 for mortality and morbidity reporting worldwide. Here's how ICD-11 MMS codes are structured, what changed from ICD-10, and how to validate them in Node.js with the IsValid API.
In this guide
1. What is ICD-11?
ICD-11 is the 11th revision of the International Classification of Diseases, adopted by the World Health Assembly in 2019 and in official use since 1 January 2022. Unlike ICD-10, ICD-11 was designed as a digital-native classification — a web-based ontology called the Foundation Component from which multiple linearizations are derived.
The most commonly used linearization is MMS — Mortality and Morbidity Statistics — which serves the role that ICD-10 filled: a flat list of stem codes for reporting, billing, and statistical analysis. MMS has about 17,000 categories, organised into 28 chapters, including entirely new chapters for traditional medicine (Chapter 26) and extension codes (Chapter X).
Adoption is gradual — as of 2026 most member states are still in the transition period. Some systems produce both ICD-10 and ICD-11 codes in parallel, and many jurisdictions have set target dates between 2025 and 2030 for full ICD-11 implementation.
2. MMS stem code structure
An ICD-11 MMS stem code looks like this:
Chapter
1
Infectious diseases
Block
A
Gastrointestinal
Category
00
Cholera
The first character is a digit 1–9 identifying the chapter (or V for extension codes). It is followed by alphanumeric characters — with letters I and O excluded to avoid visual confusion with digits 1 and 0. An optional decimal point followed by one or two characters specifies sub-categories.
| Chapter | Title |
|---|---|
| 01 | Certain infectious or parasitic diseases |
| 02 | Neoplasms |
| 06 | Mental, behavioural or neurodevelopmental disorders |
| 11 | Diseases of the circulatory system |
| 12 | Diseases of the respiratory system |
| 21 | Symptoms, signs or clinical findings, not elsewhere classified |
| 22 | Injury, poisoning or certain other consequences of external causes |
| 26 | Supplementary Chapter Traditional Medicine Conditions — Module I |
| V | Supplementary section for functioning assessment |
| X | Extension codes |
Some examples:
| Code | Meaning |
|---|---|
| 1A00 | Cholera |
| 2B5A | Breast cancer |
| 5A11 | Type 2 diabetes mellitus |
| 6A00 | Disorders of intellectual development |
| BA00 | Essential hypertension |
| CA23 | Asthma |
| RA01 | COVID-19 |
3. ICD-10 vs ICD-11
| Aspect | ICD-10 | ICD-11 |
|---|---|---|
| Year adopted | 1990 | 2019 (in effect 2022) |
| Code format | Letter + digits (+ decimal) | Digit + alphanum (+ decimal) |
| Chapters | 22 | 28 |
| Categories | ~14,000 (WHO base) | ~17,000 (MMS) |
| Structure | Flat tabular | Ontology-based, multi-linearization |
| Post-coordination | Limited | First-class (with extension codes) |
| API access | File downloads | WHO ICD-API (OAuth) |
4. Why ICD-11 validation matters
Parallel ICD-10 / ICD-11 systems
During the transition period, many systems produce or consume both ICD-10 and ICD-11 codes. Validation distinguishes the two (formats are non-overlapping) and routes codes to the correct downstream processor.
FHIR Condition resources
FHIR supports ICD-11 via the http://id.who.int/icd/release/11/mms code system. Invalid codes break cross-system interoperability and are rejected by conformant validators.
WHO reporting and surveillance
Countries report mortality and morbidity statistics to WHO using ICD-11 codes. Invalid codes cause rejections at the WHO submission portal and delay the availability of public health data.
Research datasets
Clinical research increasingly uses ICD-11 for international cohort studies. Syntactically-valid but unknown codes often indicate OCR or transcription errors that would otherwise silently corrupt analysis results.
5. The right solution
The IsValid ICD-11 API validates format with a strict regex and performs dictionary lookup against a locally-maintained mirror of the current WHO ICD-11 MMS linearization (refreshed monthly from the WHO ICD-API).
Full parameter reference: ICD-11 Validation API docs →
6. Node.js code example
import { createClient } from '@isvalid-dev/sdk'; const iv = createClient({ apiKey: process.env.ISVALID_API_KEY }); // ── Validate an ICD-11 MMS code ───────────────────────────────────────────── const result = await iv.icd11('1A00'); if (!result.found) { console.log('Code is not in the WHO ICD-11 MMS dictionary'); } else { console.log('Title:', result.title); // → 'Cholera' console.log('Chapter:', result.chapter); // → '01' console.log('Foundation URI:', result.foundationUri); // → WHO foundation link console.log('Version:', result.version); }
Routing a mixed ICD-10 / ICD-11 stream based on the detected format:
// ICD-10 starts with a LETTER, ICD-11 starts with a DIGIT. // Delegate validation to the right endpoint. async function validateDiagnosis(code) { const first = code.trim().charAt(0); const isDigit = first >= '0' && first <= '9'; if (isDigit) { return { revision: 'ICD-11', ...(await validateIcd11(code)) }; } return { revision: 'ICD-10', ...(await validateIcd10(code)) }; } // Usage console.log(await validateDiagnosis('J45.0')); // → ICD-10 console.log(await validateDiagnosis('CA23')); // → ICD-11
I and O are never valid characters — WHO excluded them to prevent confusion with digits 1 and 0.7. cURL example
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.isvalid.dev/v0/icd11?value=1A00"
Validate a circulatory code:
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.isvalid.dev/v0/icd11?value=BA00"
8. Understanding the response
Known code:
{ "valid": true, "found": true, "icd11": "1A00", "title": "Cholera", "chapter": "01", "parent": null, "isLeaf": false, "foundationUri": "http://id.who.int/icd/entity/257068234", "blockId": null, "version": "ICD-11 for Mortality and Morbidity Statistics" }
Valid format but unknown code:
{ "valid": true, "found": false, "icd11": "9ZZ9", "title": null, "chapter": null, "parent": null, "isLeaf": null, "foundationUri": null, "blockId": null, "version": null }
Invalid format:
{ "valid": false }
| Field | Type | Description |
|---|---|---|
| valid | boolean | Whether the code matches the ICD-11 MMS stem regex |
| found | boolean | Whether the code exists in the WHO ICD-11 MMS dictionary |
| icd11 | string | Normalised input code |
| title | string | null | Entity title |
| chapter | string | null | Chapter number |
| isLeaf | boolean | null | True if the code has no child entities |
| foundationUri | string | null | WHO foundation URI for the entity |
| version | string | null | MMS release version |
9. Edge cases
Letters I and O are reserved
WHO excludes I and O from stem codes to prevent typographic confusion with digits 1 and 0. A code containing either letter fails the regex even if it looks plausible.
Post-coordination and extension codes
ICD-11 supports post-coordination — combining multiple codes into a single expression using the & separator (e.g. CA23.3&XB25). The API validates individual stem codes; post-coordinated expressions must be split before validation.
Chapter V and Chapter X
The extension chapters V (functioning) and X (extension codes) use letter prefixes instead of digits. Their codes pass the permissive regex only when prefixed with an allowed first character; verify chapter context with the chapter field in the response.
Early adoption and version drift
WHO publishes annual MMS releases. Codes valid in one release may be reassigned or retired in a later one. The version field records which release was used for dictionary lookup.
Summary
Node.js integration notes
In a TypeScript project, model ICD-10 and ICD-11 as distinct branded types (Icd10, Icd11) so the compiler prevents accidental cross-revision comparison. A discriminated union type DiagCode = { rev: 10; code: Icd10 } | { rev: 11; code: Icd11 } is useful when storing mixed data during migration periods.
Because the first character unambiguously distinguishes the two revisions, a cheap local dispatch check can route codes to the right endpoint without an extra network call. Use this for high-throughput pipelines.
For services that accept both revisions via the same API, normalise to an internal representation: { revision: 10 | 11, code: string, title: string }. This pattern keeps ICD-related business logic cleanly decoupled from the revision of the incoming code.
See also
Validate ICD-11 codes instantly
Free tier includes 100 API calls per day. Validates against the current WHO ICD-11 MMS linearization.