ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

Coverage — Insurance coverage

The resource that describes a patient's health insurance contract. Pivot of FHIR financial flows: pre-authorization, billing, reimbursement.

Purpose of the resource

Coverage represents one insurance coverage: private health insurance, supplemental / secondary plan, public program (Medicare, Medicaid, Securite sociale, NHS), workers' compensation insurance, travel insurance. A Coverage resource corresponds to a single coverage line; a patient may carry several active Coverages (primary + secondary + tertiary).

Coverage is the central piece of FHIR financial flows. It is referenced by Claim (reimbursement request), ClaimResponse, EligibilityRequest, ExplanationOfBenefit. It also carries cost-sharing (co-payments, deductibles, out-of-pocket maximum) on the patient side.

Key fields

FieldTypeCardinalityRole
identifierIdentifier[]0..*Contract identifiers (policy number, contract number).
statuscode1..1active, cancelled, draft, entered-in-error.
kindcode1..1insurance, self-pay, other. New in R5.
typeCodeableConcept0..1Coverage type (EHCPOL = extended healthcare, AUTOPOL = auto, DENTAL, etc.). v3 ActCode.
policyHolderReference(Patient | RelatedPerson | Organization)0..1Policy holder (may differ from beneficiary).
subscriberReference(Patient | RelatedPerson)0..1Subscriber (person under whose name the policy is issued).
subscriberIdIdentifier[]0..*Subscriber number provided by the insurer.
beneficiaryReference(Patient)1..1Coverage beneficiary (mandatory).
dependentstring0..1Dependent identifier (family rank).
relationshipCodeableConcept0..1Beneficiary ↔ subscriber relationship (self, spouse, child, common…).
periodPeriod0..1Contract validity period.
insurerReference(Organization)0..1Insurance company.
classBackboneElement[]0..*Contract classifications (group, plan, subgroup, subclass, subplan).
orderpositiveInt0..1Application order (1 = primary, 2 = secondary…) — essential when the patient holds multiple Coverages.
networkstring0..1Care network (HMO, PPO…).
costToBeneficiaryBackboneElement[]0..*Patient out-of-pocket (co-pay, deductible, out-of-pocket max).
subrogationboolean0..1Indicates whether the insurer exercises subrogation (third-party accident).
contractReference(Contract)[]0..*Links to the full Contract resource.

Primary vs secondary coverage

A patient may hold several active Coverages simultaneously. The order field determines the application order:

  • order=1 — primary coverage. Receives the reimbursement claim first.
  • order=2 — secondary coverage (supplemental / "mutuelle" in France, secondary insurance in the US). Fills the remainder after primary reimbursement.
  • order=3+ — tertiary coverages (rare, but exists for specific programs like CMU-C or travel insurance).

In a Claim, you add one Claim.insurance per Coverage, with focal=true for the coverage on which payment is requested (typically the primary). Coordination of benefits (COB) between primary and secondary is tracked via successive ClaimResponses.

JSON example

Primary coverage Aetna PPO 2026 for Patient "example", self-beneficiary, plan "ACME Group", co-pay USD 20 for primary care office visits:

json coverage-primary-aetna.json
{
  "resourceType": "Coverage",
  "id": "primary-aetna",
  "status": "active",
  "kind": "insurance",
  "type": {
    "coding": [{
      "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
      "code": "EHCPOL",
      "display": "extended healthcare"
    }]
  },
  "policyHolder": { "reference": "Patient/example" },
  "subscriber": { "reference": "Patient/example" },
  "subscriberId": [{
    "value": "W123456789"
  }],
  "beneficiary": { "reference": "Patient/example" },
  "dependent": "01",
  "relationship": {
    "coding": [{
      "system": "http://terminology.hl7.org/CodeSystem/subscriber-relationship",
      "code": "self"
    }]
  },
  "period": {
    "start": "2026-01-01",
    "end": "2026-12-31"
  },
  "insurer": { "reference": "Organization/aetna" },
  "class": [{
    "type": {
      "coding": [{
        "system": "http://terminology.hl7.org/CodeSystem/coverage-class",
        "code": "group"
      }]
    },
    "value": "GRP-2026-ACME",
    "name": "ACME Group Plan"
  }, {
    "type": {
      "coding": [{
        "system": "http://terminology.hl7.org/CodeSystem/coverage-class",
        "code": "plan"
      }]
    },
    "value": "PLN-PPO-2026",
    "name": "Aetna PPO Standard 2026"
  }],
  "order": 1,
  "costToBeneficiary": [{
    "type": {
      "coding": [{
        "system": "http://terminology.hl7.org/CodeSystem/coverage-copay-type",
        "code": "gpvisit",
        "display": "GP Office Visit"
      }]
    },
    "valueQuantity": {
      "value": 20,
      "code": "USD",
      "system": "urn:iso:std:iso:4217"
    }
  }]
}
  • kind=insurance — commercial coverage (vs self-pay).
  • type EHCPOL — extended healthcare policy.
  • subscriber=beneficiary=policyHolder — patient is policy holder, subscriber and beneficiary (self-coverage).
  • relationship.code=self.
  • class[] two entries: group (ACME employer) + plan (Aetna PPO Standard 2026).
  • order=1 — primary coverage.
  • costToBeneficiary[0] — USD 20 co-pay for primary care visits.

REST API

  • GET /Coverage?beneficiary=Patient/example&status=active — active coverages for a patient.
  • GET /Coverage?beneficiary=Patient/example&_sort=order — coverages sorted by application order.
  • POST /Coverage — create a new coverage after eligibility check.
  • GET /Coverage/$eligibility-by-identifier — composite operation (per profile) for real-time eligibility check.
  • GET /Coverage?subscriber-id=W123456789 — search by subscriber number.
  • GET /Coverage?_include=Coverage:insurer — include the issuing Organization.

National profiles

ProfileRegulatorSpecifics
Da Vinci PDex CoverageHL7 Da Vinci ProjectFor Patient Data Exchange (CMS Rule 9115-F). Constrains identifier, type, policyHolder, beneficiary, relationship, period, payor, class.
CARIN BB CoverageHL7 CARIN AllianceFor consumer claims data exchange (Blue Button 2.0).
US Core CoverageHL7 US Realm — ONC EHR (USCDI v4)Minimal profile for USCDI v4 (coverage data class statuses).
FR Core CoverageANSFor AMO (Assurance Maladie Obligatoire) and AMC (Complementary). Slicing on classes.
NCPDP Pharmacy CoverageNCPDPFor US pharmacy context (BIN, PCN).

Common pitfalls

  • Confusing subscriber and beneficiary — subscriber can be a parent covering a child. beneficiary is always the current patient receiving care.
  • No period.end — a Coverage without an end date appears active indefinitely; manage contract end via status=cancelled + filling period.end.
  • Missing order — without order, the EHR cannot determine which coverage to bill first. Always populate when several coverages coexist.
  • Inconsistent classclass[].type codes are standardised (group, plan, subgroup, subclass, subplan, class, sequence, rxbin, rxpcn, rxid…). Inventing a proprietary code breaks interop.
  • Wrong kind — new in R5. Before R5, this concept lived inside type. kind=self-pay is explicit for uninsured patients, do not omit.
  • Active coverage after contract end — a nightly reconciliation job must flip status to cancelled when period.end has passed; otherwise pre-authorisations rely on an expired coverage.
  • Claim — reimbursement request referencing Coverage.
  • ClaimResponse — insurer's response.
  • ExplanationOfBenefit — explanation of benefits.
  • CoverageEligibilityRequest / CoverageEligibilityResponse — real-time eligibility verification.
  • Patient — coverage beneficiary.
  • Organization — insurer.
  • InsurancePlan — insurance plan details (mutualisation).
  • HL7 v2 IN1 / IN2 / IN3 — legacy equivalents.