Skip to main content
Home Docs Terminology Crosswalk

Terminology Crosswalk

FHIR-native SNOMED CT, CPT, and ICD-10-CM code translation for CMS-0057 compliance. The crosswalk bridges the terminology gap between Da Vinci clinical workflows and payer claims adjudication systems.

1. Overview

The CMS Interoperability and Prior Authorization Final Rule (CMS-0057-F) requires payers to support Da Vinci CRD, DTR, and PAS workflows. These workflows exchange clinical data encoded in SNOMED CT — the standard used by EHRs and clinical decision support systems. But payer core administration platforms (QNXT, Facets, HealthEdge, and others) store and adjudicate claims using CPT and ICD-10-CM codes.

The CHO Terminology Crosswalk service bridges that gap. It provides a FHIR-native ConceptMap/$translate API that converts codes between SNOMED CT, CPT, and ICD-10-CM in real time — with context-aware disambiguation for one-to-many mappings.

Why this matters

Without terminology translation, a prior authorization request containing SNOMED CT code 73211009 (Diabetes mellitus) cannot be matched to the payer's ICD-10-CM benefit configuration (E11.9, E10.9, etc.). The crosswalk ensures that clinical intent is preserved as codes move between systems.

Terminology crosswalk translation pipeline showing 3-tier map resolution (plan overrides, AMA CPT, NLM/UMLS), context rule engine disambiguation, and scoring output

Translation pipeline: 3-tier map resolution with context-aware disambiguation

2. How It Works

The crosswalk implements the FHIR R4 ConceptMap/$translate operation. You provide a source code system, a code, and a target code system. The service returns one or more translated codes with equivalence metadata.

Basic translation flow

# Translate SNOMED CT 73211009 (Diabetes mellitus) to ICD-10-CM
curl -s "http://localhost:5010/fhir/ConceptMap/\$translate?\
system=http://snomed.info/sct&\
code=73211009&\
targetsystem=http://hl7.org/fhir/sid/icd-10-cm" | jq .

# Response (simplified)
{
  "resourceType": "Parameters",
  "parameter": [
    { "name": "result", "valueBoolean": true },
    {
      "name": "match",
      "part": [
        { "name": "equivalence", "valueCode": "narrower" },
        { "name": "concept", "valueCoding": {
            "system": "http://hl7.org/fhir/sid/icd-10-cm",
            "code": "E11.9",
            "display": "Type 2 diabetes mellitus without complications"
        }},
        { "name": "score", "valueDecimal": 0.85 }
      ]
    }
  ]
}

Context-aware disambiguation

Many SNOMED CT concepts map to multiple ICD-10-CM codes. For example, SNOMED 73211009 (Diabetes mellitus) can map to E10.x (Type 1), E11.x (Type 2), E13.x (Other specified), or O24.x (Gestational). The crosswalk uses clinical context to disambiguate:

Context ParameterEffectExample
patient.ageSelects age-appropriate codesPediatric vs. adult diabetes codes
patient.genderExcludes gender-impossible codesProstate conditions excluded for female patients
patient.stateApplies state-specific rulesTexas TMPPM coding conventions
patient.conditionsCo-morbidity-aware selectionDiabetes with CKD selects E11.22 over E11.9
# Context-aware translation — include patient details for disambiguation
curl -s -X POST http://localhost:5010/fhir/ConceptMap/\$translate \
  -H "Content-Type: application/fhir+json" \
  -H "X-Tenant-ID: demo" \
  -d '{
    "resourceType": "Parameters",
    "parameter": [
      { "name": "system", "valueUri": "http://snomed.info/sct" },
      { "name": "code", "valueCode": "73211009" },
      { "name": "targetsystem", "valueUri": "http://hl7.org/fhir/sid/icd-10-cm" },
      { "name": "context-age", "valueInteger": 12 },
      { "name": "context-gender", "valueCode": "male" },
      { "name": "context-state", "valueCode": "TX" },
      { "name": "context-conditions", "valueString": "chronic-kidney-disease" }
    ]
  }' | jq .

3. Data Sources

The crosswalk aggregates maps from three tiers, each with different licensing and update cadences:

SourceMapping DirectionEntriesLicenseUpdate Cadence
NLM / UMLS SNOMED CT → ICD-10-CM ~119,000 Free (UMLS license) Twice yearly (March, September)
AMA CPT ↔ SNOMED CT Varies Customer-provided (bring your own license) Annually
Plan-specific overrides Any direction Varies Tenant-scoped As needed

NLM / UMLS maps

The National Library of Medicine publishes the official SNOMED CT to ICD-10-CM mapping tables as part of the UMLS distribution. These maps are free to use under a UMLS license and contain approximately 119,000 entries. They are distributed in RF2 (Release Format 2) and updated twice per year with each ICD-10-CM annual release and mid-year supplement.

AMA CPT cross maps

The American Medical Association publishes CPT-to-SNOMED CT cross maps. Because CPT is a proprietary code set, customers must provide their own AMA license files. Upload the CSV export through the Admin API or mount the file to the service's data volume. The crosswalk never redistributes AMA content.

Plan-specific overrides

Payers frequently maintain local coding conventions that differ from the national standard. Examples include Texas TMPPM (Texas Medicaid & CHIP Preferred Procedure Manual), state Medicaid variations, and plan-specific coding policies. Overrides are tenant-scoped — each plan can have its own override file, and overrides take the highest priority during translation.

4. Map Management

Auto-loading at startup

When the crosswalk service starts, it scans the configured data volume (/data/maps by default) for RF2 and CSV files. Recognized map files are loaded automatically. Loading is idempotent — if a map version has already been loaded (tracked by filename hash and version header), it is skipped.

Admin API for uploading maps

New map files can be uploaded at runtime without restarting the service:

# Upload an NLM RF2 map file
curl -s -X POST http://localhost:5010/admin/maps/load \
  -H "X-Tenant-ID: demo" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@tls_Icd10cmHumanReadableMap_US1000124_20250301.txt" \
  -F "format=rf2" \
  -F "source=nlm" | jq .

# Upload an AMA CSV cross map
curl -s -X POST http://localhost:5010/admin/maps/load \
  -H "X-Tenant-ID: demo" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@cpt-snomed-crossmap-2025.csv" \
  -F "format=csv" \
  -F "source=ama" | jq .

# Upload plan-specific overrides (tenant-scoped)
curl -s -X POST http://localhost:5010/admin/maps/load \
  -H "X-Tenant-ID: acme-health" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@acme-overrides-2025-q1.csv" \
  -F "format=csv" \
  -F "source=override" | jq .

Version tracking and audit trail

Every loaded map is assigned a version record that includes the filename, SHA-256 hash, source type, entry count, and load timestamp. Every translation response includes a map-version extension so downstream consumers can trace exactly which map version produced a given translation. This is critical for audit and compliance.

# List all loaded map versions
curl -s http://localhost:5010/admin/maps \
  -H "X-Tenant-ID: demo" | jq .

# Example response
{
  "maps": [
    {
      "id": "map-nlm-20250301",
      "source": "nlm",
      "format": "rf2",
      "version": "US1000124_20250301",
      "entries": 119423,
      "loadedAt": "2026-03-26T08:15:00Z",
      "sha256": "a1b2c3d4..."
    },
    {
      "id": "map-ama-2025",
      "source": "ama",
      "format": "csv",
      "version": "2025.1",
      "entries": 8742,
      "loadedAt": "2026-03-26T08:15:02Z",
      "sha256": "e5f6g7h8..."
    }
  ]
}

5. Portal Integration

The Cloud Health Office portal provides a dedicated Terminology Crosswalk page at /terminology/crosswalk with four key features:

Health status dashboard

The top of the page displays real-time service health: connection status (green/red), total active map entries across all loaded maps, and the number of map files currently loaded. If the crosswalk service is unreachable, the dashboard shows a clear error state with troubleshooting guidance.

Interactive translation tester

A form where users can enter a source code system, code, and target system, then execute a live translation. The result displays all matched target codes with their equivalence level, display name, and score. Context fields (age, gender, state, conditions) are optional inputs for disambiguation testing.

Map versions table

A sortable table showing every loaded map version: source, format, version string, entry count, load timestamp, and SHA-256 hash. Administrators can use this view to verify that the correct map versions are active before going live with a configuration change.

Schedule a walkthrough

Want to see live terminology crosswalk in action? Contact Sales to schedule a guided walkthrough of the Terminology > Crosswalk module with pre-loaded NLM maps and SNOMED CT to ICD-10-CM translations.

6. Context Rule Engine

When a SNOMED CT concept maps to multiple ICD-10-CM codes, the context rule engine selects the best match. Rules are evaluated in priority order, and the narrowest matching rule wins.

Rule TypePriorityDescriptionExample
Plan-specific overrides Highest Tenant-scoped overrides from plan coding policy Acme Health maps 73211009 to E11.65 for all members
Co-morbidity rules High Require specific active conditions on the patient Diabetes + CKD selects E11.22 over E11.9
State-specific rules Medium TMPPM, Medicaid state variations, local conventions Texas Medicaid requires specific modifier codes
Gender rules Medium Exclude gender-impossible ICD-10-CM codes Prostate conditions excluded for female patients
Age rules Standard Pediatric vs. adult code selection Juvenile diabetes (E10.x) for patients under 18

Scoring

Each rule that matches adds to the candidate code's score. Narrower rules (those with more specific criteria) contribute higher score values. When multiple candidate codes remain after rule evaluation, the code with the highest aggregate score is returned as the primary match. All other candidates are returned as secondary matches with lower scores, allowing consumers to make their own selection if needed.

Rule evaluation order

Rules are evaluated from highest to lowest priority. If a plan-specific override exists for a given SNOMED code and tenant, it short-circuits all other rules and returns immediately. Otherwise, all applicable rules contribute to scoring, and the best-scoring candidate wins.

7. API Reference

All endpoints require the X-Tenant-ID header. FHIR endpoints accept and return application/fhir+json.

GET /fhir/ConceptMap/$translate

Single code translation via query parameters.

ParameterTypeRequiredDescription
systemuriYesSource code system (e.g., http://snomed.info/sct)
codestringYesSource code value
targetsystemuriYesTarget code system (e.g., http://hl7.org/fhir/sid/icd-10-cm)
context-ageintegerNoPatient age in years
context-gendercodeNoPatient gender (male, female, other)
context-statecodeNoTwo-letter US state code
context-conditionsstringNoComma-separated active condition codes

POST /fhir/ConceptMap/$translate

Single code translation via structured FHIR Parameters resource in the request body. Supports the same context parameters as the GET variant. Preferred for complex requests with multiple context values.

POST /fhir/ConceptMap/$batch-translate

Bulk translation of up to 500 codes in a single request. The request body is a FHIR Bundle of Parameters resources. Each entry is translated independently and the response is a Bundle of translation results in the same order.

# Batch translate 3 SNOMED codes to ICD-10-CM
curl -s -X POST http://localhost:5010/fhir/ConceptMap/\$batch-translate \
  -H "Content-Type: application/fhir+json" \
  -H "X-Tenant-ID: demo" \
  -d '{
    "resourceType": "Bundle",
    "type": "batch",
    "entry": [
      {
        "resource": {
          "resourceType": "Parameters",
          "parameter": [
            { "name": "system", "valueUri": "http://snomed.info/sct" },
            { "name": "code", "valueCode": "73211009" },
            { "name": "targetsystem", "valueUri": "http://hl7.org/fhir/sid/icd-10-cm" }
          ]
        }
      },
      {
        "resource": {
          "resourceType": "Parameters",
          "parameter": [
            { "name": "system", "valueUri": "http://snomed.info/sct" },
            { "name": "code", "valueCode": "386661006" },
            { "name": "targetsystem", "valueUri": "http://hl7.org/fhir/sid/icd-10-cm" }
          ]
        }
      },
      {
        "resource": {
          "resourceType": "Parameters",
          "parameter": [
            { "name": "system", "valueUri": "http://snomed.info/sct" },
            { "name": "code", "valueCode": "195967001" },
            { "name": "targetsystem", "valueUri": "http://hl7.org/fhir/sid/icd-10-cm" }
          ]
        }
      }
    ]
  }' | jq .

GET /admin/maps

List all loaded map versions for the current tenant. Returns source, format, version, entry count, load timestamp, and SHA-256 hash for each map.

POST /admin/maps/load

Upload a new map file. Accepts multipart/form-data with the following fields:

FieldTypeRequiredDescription
filefileYesThe map file (RF2 or CSV)
formatstringYesrf2 or csv
sourcestringYesnlm, ama, or override
Idempotent loading

If the uploaded file has the same SHA-256 hash as an already-loaded map, the upload returns 200 OK with a message indicating the version is already active. The map is never loaded twice.

8. Consumer Integration

Three core CHO services consume the Terminology Crosswalk at runtime:

Consumer integration diagram showing EHR systems sending SNOMED CT codes through CRD, PAS, and DTR servers to the Terminology Crosswalk, which translates to CPT and ICD-10-CM for payer systems

CRD, PAS, and DTR consume the crosswalk to bridge EHR clinical vocabulary to payer adjudication codes

CRD Server (Coverage Requirements Discovery)

When a CRD hook fires, the CRD server receives SNOMED CT codes from the EHR. It calls the crosswalk to translate them into the payer's CPT/ICD-10-CM code space, then checks those codes against the plan's benefit configuration to determine whether prior authorization is required. Without the crosswalk, the CRD server cannot match clinical codes to payer business rules.

PAS Server (Prior Authorization Support)

The PAS server receives X12 278 prior authorization requests and converts them to FHIR. During this conversion, procedure and diagnosis codes may need to be translated between code systems. The PAS server uses the $batch-translate endpoint to convert all codes in a single round trip, keeping latency low for real-time prior auth decisions.

DTR Engine (Documentation Templates and Rules)

Da Vinci DTR questionnaires may reference codes in a different system than the one used by the EHR. The DTR engine uses the crosswalk to resolve questionnaire answer codes so that pre-populated values match the expected code system in each question. This ensures that auto-populated questionnaire responses are clinically accurate and machine-readable.

End-to-end CMS-0057 compliance

The Terminology Crosswalk is a foundational building block for CMS-0057-F compliance. It enables the CRD, DTR, and PAS workflows to operate seamlessly across the SNOMED CT / CPT / ICD-10-CM boundary. See the CMS-0057-F Compliance Guide for the full compliance checklist.