Every inferred medication comes back with three fields you need to understand
before acting on the data: status, confidence, and (when
verbosity="full") an evidence trail.
status — what we think the medication’s state is
Status mirrors FHIR’s MedicationRequest.status vocabulary:
| Status | Meaning |
|---|
active | Patient is currently taking this medication |
completed | Course finished (end date in past, or explicit completed status) |
stopped | Explicitly stopped by a clinician |
cancelled | Order was cancelled before dispensing |
unknown | Not enough evidence to classify, or all data is too stale |
See the full triggers table for the rules that
produce each status.
confidence — how sure we are of the status
A float from 0.0 to 1.0. This is confidence in the status assignment, not
probability the patient is taking the drug. It reflects data quality:
- Multiple corroborating signals bump it up (e.g., active order + recent dispense → ~0.95)
- Missing dates knock it down (-0.20)
- Missing RxNorm codes knock it down (-0.05)
- Staleness applies a decay curve past 90 days
Use status AND confidence >= threshold together. A common pattern: show
confidently-active meds prominently (confidence ≥ 0.80), show low-confidence
meds in a secondary list with a “verify with patient” label.
evidence — which rules fired (full verbosity only)
When you request verbosity="full", each medication’s provenance entry
includes the list of rules that contributed to the status. Examples:
| Evidence tag | What it means |
|---|
recent_dispense | A dispense was recorded within the last 90 days |
active_order | A MedicationRequest is status=active and authored within 180 days |
self_reported_active | Patient-reported MedicationStatement with reported=true |
course_completed | Explicit completed status or effectivePeriod.end in the past |
prescription_expired | Order authored >365 days ago with no recent fill activity |
order_stopped | MedicationRequest has status=stopped |
order_cancelled | MedicationRequest has status=cancelled |
The evidence list is the audit trail. If a clinician or user asks “why is this
marked active?”, the answer is in provenance[med_id].evidence.
A worked example
Request:
{
"verbosity": "full",
"resources": [
{
"resourceType": "MedicationRequest",
"id": "mr-1",
"status": "active",
"intent": "order",
"authoredOn": "2026-03-05",
"medicationCodeableConcept": { "coding": [{ "system": "http://www.nlm.nih.gov/research/umls/rxnorm", "code": "617312" }] }
},
{
"resourceType": "MedicationDispense",
"id": "md-1",
"status": "completed",
"whenHandedOver": "2026-04-09",
"medicationCodeableConcept": { "coding": [{ "system": "http://www.nlm.nih.gov/research/umls/rxnorm", "code": "617312" }] }
}
]
}
Response (trimmed):
{
"medications": [
{
"id": "med_abc123",
"display_name": "Atorvastatin 40 MG Oral Tablet",
"status": "active",
"confidence": 0.95,
...
}
],
"provenance": {
"med_abc123": {
"sources": ["MedicationRequest/mr-1", "MedicationDispense/md-1"],
"evidence": ["active_order", "recent_dispense"],
"enrichments": []
}
}
}
Two separate FHIR resources were deduplicated to one medication via RxNorm
grouping. Two rules fired: active_order (the order is recent and active) and
recent_dispense (a fill within 90 days). The corroborating signals drive
confidence to 0.95.
Acting on low-confidence results
Low confidence (< 0.7) usually means:
- Only one signal fired (no corroboration)
- The data is old
- Key fields were missing (dates, RxNorm codes)
Don’t ignore low-confidence medications — they’re often the most interesting
cases for clinical review. Surface them in a “needs verification” bucket
rather than hiding them.