Skip to main content

Eligibility Check

This guide explains how to verify a patient's insurance coverage before an encounter using the Candid Health pre-encounter eligibility API.

Overview​

The eligibility check integration exposes a $candid-check-eligibility custom operation on the CoverageEligibilityRequest resource. It performs a real-time, pre-encounter eligibility check routed through Stedi, and returns a CoverageEligibilityResponse with the patient's benefit details mapped to FHIR.

Pre-encounter timing

Running eligibility checks before the visit lets you catch lapsed coverage or incorrect plan information before care is delivered — when you can still address it with the patient, collect the correct co-pay at the door, or avoid a claim denial entirely. Candid also runs an automatic post-encounter check (free) as part of its rules engine, but pre-encounter checks give you the earliest possible signal.

Required Resources​

CoverageEligibilityRequest​

FieldDescriptionRequired
patientReference to the beneficiary PatientYes
providerReference to the provider Organization (must have NPI)Yes
insurerReference to the payer Organization (must have Stedi or CHC payer ID)Yes
insurance[0].coverageReference to the Coverage resourceYes
servicedDateDate of service for the eligibility checkNo
servicedPeriod.startAlternative to servicedDateNo
item[].categoryX12 service type code to check (system: https://x12.org/codes/service-type-codes, e.g. 55 for Medical Nutrition Therapy). Defaults to 30 (Health Benefit Plan Coverage) when omitted.No

Coverage​

FieldDescriptionRequired
subscriberReference to the subscriber PatientYes
beneficiaryReference to the beneficiary PatientYes
subscriberIdInsurance member IDYes
payorReference to the payer OrganizationYes

If subscriber and beneficiary are different people (e.g. a child on a parent's plan), both must be populated and the bot will include a dependent field in the eligibility request.

Organization (Provider)​

FieldDescriptionRequired
identifierNPI (system: http://hl7.org/fhir/sid/us-npi)Yes
nameOrganization nameYes

Organization (Payer)​

The payer identifier system for eligibility checks differs from claim submission — this API routes through Stedi, so use the Stedi payer network ID when available:

PriorityIdentifierSystem
1Stedi payer network IDhttps://www.stedi.com/healthcare/network
2Candid CHC payer IDhttps://www.joincandidhealth.com/chc-payerid

Payers saved from the Payer Directory include the CHC payer ID. Add the Stedi payer network ID to the saved Organization when you have it.

Running a Check​

Invoke the operation against a stored CoverageEligibilityRequest:

const response = await medplum.post(
medplum.fhirUrl('CoverageEligibilityRequest', request.id, '$candid-check-eligibility')
);

Or at the type level with a CoverageEligibilityRequest in the request body:

POST {base}/fhir/R4/CoverageEligibilityRequest/$candid-check-eligibility

Response​

On success the operation returns a CoverageEligibilityResponse saved to Medplum with coverage status, benefit details, and plan information mapped from the Stedi 271 response. A raw snapshot of the full Candid response is also stored as a DocumentReference (identifier system: https://candidhealth.com/eligibility-check) for debugging.

{
"resourceType": "CoverageEligibilityResponse",
"status": "active",
"purpose": ["benefits"],
"patient": { "reference": "Patient/{id}" },
"created": "2025-01-15",
"insurer": { "reference": "Organization/{payer-id}" },
"insurance": [
{
"coverage": { "reference": "Coverage/{id}" },
"inforce": true,
"item": [
{
"category": { "coding": [{ "code": "30", "display": "Health Benefit Plan Coverage" }] },
"benefit": [
{ "type": { "text": "CoinsurancePercent" }, "allowedUnsignedInt": 20 }
]
}
]
}
]
}

The top-level status reflects the eligibility outcome:

ValueMeaning
activeCoverage confirmed active
cancelledCoverage not active or inactive
entered-in-errorPayer returned errors (check the raw DocumentReference snapshot)

Staging Mock Scenarios​

Candid staging supports mock eligibility checks using specific magic values — no real payer is contacted. Mocks require provider NPI 1999999984.

ScenarioPayer IDSubscriberMember IDResult
Active coverage60054 (Aetna)Jane Doe, DOB 2004-04-04AETNA12345Active
Payer unreachable87726 (UHC)DOB 1970-01-01UHCAAA42AAA 42 error
Missing subscriber ID87726 (UHC)DOB 1990-01-01UHCAAA72AAA 72 error
Missing subscriber name87726 (UHC)DOB 1990-01-01UHCAAA73AAA 73 error
Subscriber not found87726 (UHC)DOB 1990-01-01UHCAAA75AAA 75 error