Guide · Node.js · Healthcare · REST API

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.

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:

1A00

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.

ChapterTitle
01Certain infectious or parasitic diseases
02Neoplasms
06Mental, behavioural or neurodevelopmental disorders
11Diseases of the circulatory system
12Diseases of the respiratory system
21Symptoms, signs or clinical findings, not elsewhere classified
22Injury, poisoning or certain other consequences of external causes
26Supplementary Chapter Traditional Medicine Conditions — Module I
VSupplementary section for functioning assessment
XExtension codes

Some examples:

CodeMeaning
1A00Cholera
2B5ABreast cancer
5A11Type 2 diabetes mellitus
6A00Disorders of intellectual development
BA00Essential hypertension
CA23Asthma
RA01COVID-19

3. ICD-10 vs ICD-11

AspectICD-10ICD-11
Year adopted19902019 (in effect 2022)
Code formatLetter + digits (+ decimal)Digit + alphanum (+ decimal)
Chapters2228
Categories~14,000 (WHO base)~17,000 (MMS)
StructureFlat tabularOntology-based, multi-linearization
Post-coordinationLimitedFirst-class (with extension codes)
API accessFile downloadsWHO ICD-API (OAuth)
ℹ️ICD-11 is not a drop-in replacement for ICD-10 — the code formats are different, and many diagnoses have been reorganised between chapters. WHO publishes a mapping table (TabMap) between the two classifications.

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).

17,000+
Codes
MMS categories
WHO API
Source
monthly refresh
100/day
Free tier
no credit card

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
ICD-11 codes are case-insensitive on input, but letters 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
}
FieldTypeDescription
validbooleanWhether the code matches the ICD-11 MMS stem regex
foundbooleanWhether the code exists in the WHO ICD-11 MMS dictionary
icd11stringNormalised input code
titlestring | nullEntity title
chapterstring | nullChapter number
isLeafboolean | nullTrue if the code has no child entities
foundationUristring | nullWHO foundation URI for the entity
versionstring | nullMMS 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

Distinguish ICD-10 from ICD-11 by the first character — letter means ICD-10, digit means ICD-11
Reject any code containing letters I or O — WHO reserves these
Split post-coordinated expressions on & before validating each stem code
Record the MMS version with each validation for auditability
Do not treat ICD-10 and ICD-11 as interchangeable — map via WHO TabMap when migrating historical data
Do not rely on format alone — dictionary lookup catches OCR and transcription errors

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.