Skip to main content
MedListIQ accepts messy, under-coded FHIR and returns clean, standards-rich medication data. “Enrichment” means: we took a free-text value, a missing code, or an implicit concept — and added the explicit terminology codes that downstream systems need. Every enrichment is deterministic and rule-based. The full list of what we applied to a given medication is surfaced in provenance[med_id].enrichments when you request verbosity="full".

Medication identity

RxNorm canonicalization

Raw input often contains free-text drug names, NDC codes, branded names, or locally-coded medications. We map them to a single preferred RxNorm coding and stamp every medication with it.
  • System: http://www.nlm.nih.gov/research/umls/rxnorm
  • TTY preference: SCD (Semantic Clinical Drug) preferred over IN (Ingredient). When both are present, we pick the most specific.
  • Source: NIH RxNav API

Deduplication

The same drug can appear as a MedicationRequest from the EHR, a MedicationDispense from the pharmacy, and a MedicationStatement reported by the patient. We collapse all three into one InferredMedication keyed by its RxNorm identity.

Dose form inference

Tablet, capsule, patch, solution, suspension — inferred from the RxNorm SCD name when the input didn’t carry a discrete form field.

Display name cleanup

SNOMED display strings ship with semantic tags like "Oral route (qualifier value)". We strip the parenthetical tags so UIs can render clean labels ("Oral route") without post-processing.

Dosage semantics

Routes

Free-text routes like "oral", "by mouth", or "PO" get mapped to both SNOMED CT and NCI Thesaurus codings.
  • SNOMED: http://snomed.info/sct — e.g., 26643006 (Oral route)
  • NCIT: http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl — e.g., C38288 (Oral)

Administration methods

Method text ("inject", "infuse", "apply topically") gets mapped to SNOMED CT + NCIT.
  • SNOMED: method concepts under 129445006 (Administration — action)
  • NCIT: procedure concepts

Frequency

Prescription-style frequency abbreviations and natural-language phrases are mapped into standard code systems:
  • FHIR v3 GTSAbbreviation: http://terminology.hl7.org/CodeSystem/v3-GTSAbbreviationQD, BID, TID, QID, QHS, PRN, etc.
  • NCIT: matching frequency concepts for interop with NCI-coded systems

Timing events

Textual timing anchors like "at bedtime", "in the morning", "with meals" are mapped to FHIR’s event-timing and v3 TimingEvent vocabularies:
  • FHIR event-timing: http://hl7.org/fhir/event-timingMORN, AFT, EVE, NIGHT
  • v3 TimingEvent: http://terminology.hl7.org/CodeSystem/v3-TimingEventHS (bedtime), AC (before meals), PC (after meals)

Duration extraction

Duration phrases in free-text sig strings ("for 7 days", "x 10 days") are parsed out and surfaced as structured duration objects with UCUM units.
  • UCUM: http://unitsofmeasure.orgd (day), wk (week), mo (month)

Dose quantity + range

Numeric dose fields are surfaced with explicit UCUM units. Ranges like "1-2 tablets" are preserved as structured low/high rather than flattened.

Clinical context

Indications

reasonCode free-text and partial codings are enriched with both SNOMED CT and ICD-10-CM where mappings are available.
  • SNOMED: http://snomed.info/sct
  • ICD-10-CM: http://hl7.org/fhir/sid/icd-10-cm

Prescription-label sig

A human-readable sig string is composed from the structured dosage fields — the kind of string a pharmacist or patient would see on a prescription label. Example:
"Take 1 tablet by mouth twice daily with meals for 10 days"
This is built from the enriched dosage components — route, frequency, timing events, duration — not from the original free-text patientInstruction. If the input was fully structured with no sig text, we still produce one.

Status + confidence

Each medication is stamped with a status (active, completed, stopped, cancelled, unknown) and a confidence score. This is inference, not enrichment of source fields — see the Understanding the output guide for the signal logic and confidence math.

What gets reported

When you request verbosity="full", every enrichment we applied appears in the provenance block:
{
  "provenance": {
    "med_abc123": {
      "sources": ["MedicationRequest/mr-1", "MedicationDispense/md-1"],
      "evidence": ["active_order", "recent_dispense"],
      "enrichments": [
        "rxnorm_canonicalized",
        "route_snomed_added",
        "route_ncit_added",
        "frequency_coded",
        "dose_form_inferred",
        "sig_composed"
      ]
    }
  }
}
This is the audit trail. Every terminology code in the response is accounted for — either present in the input, or added by an enrichment with a named tag.