Insurance Eligibility Checks
Insurance eligibility checks determine whether a patient's insurance is active, in-network, and has applicable benefits. They ensure that the provider will ultimately get compensated by the patient's insurer for a specific product or service.
Use Cases
Insurance eligibility checks cover a variety of use cases, but generally they are used to answer three questions:
- Is this insurance active?
- Does this insurance cover basic visits to a provider?
- Does this insurance cover a specific service type?
The most basic use case for an eligibility check is simply seeing if the policy is active and in force.
Adding a second layer is checking if the policy is active and also covers basic visits to a provider. These include appointments like physicals and check-ups and is the most common type of eligibility request.
Because it is so common, these types of requests are defined by the X12 Service Type Codes in service code 30. This service type is "Plan Coverage and General Benefits", and checks for active basic coverage.
Two common use cases for this service type are:
- Checking that a new patient's coverage is active and has general benefits.
- Checking coverage directly prior to a visit to ensure that the policy has not changed and the patient is still covered.
Finally, checking that insurance covers a specific service type adds a third layer to an eligibility check. These are done to ensure that a patient is covered for more complex care. It is recommended to use the X12 Service Type Codes to illustrate the type of care that is being checked.
For example, if a patient needs to purchase durable medical equipment, you would use service code 12. This code represents "Durable Medical Equipment Purchased".
It is important to note that you should be checking the service type to be provided, not the specific service, which is exactly what the X12 Service Type Codes are designed to do.
Preparing an Eligibility Check
FHIR follows a request/response pattern for eligibility checks. This uses two resources: the CoverageEligibilityRequest
to model the request to the insurer and the CoverageEligibilityResponse
to model their response.
To complete an eligibility check, you will need the following information:
- Patient demographic info, modeled as a reference to a
Patient
resource. - Patient insurance coverage, modeled as a reference to a
Coverage
resource (see our insurance guide for more info). - Provider info, modeled as a reference to the relevant
Practitioner
,PractitionerRole
, orOrganization
(see the provider network guide for more info). - The procedure/service to be provided and the diagnosis. This information should be on the relevant
Encounter
(see our blog post on Well Defined Service Menus for more info).
Creating a Request
FHIR provides the CoverageEligibilityRequest
resource to model a request for an insurance eligibility check.
Element | Description | Code System | Example |
---|---|---|---|
patient | A reference to the Patient the request is for. | Patient/homer-simpson | |
provider | A reference to the Practitioner or Organization that will be providing the service. This is the party that is submitting the request, but is not necessarily the specific Practitioner who will be providing the service detailed within. | Practitioner/dr-alice-smith | |
insurer | A reference to the insurance Organization that is providing coverage and will be evaluating the request. | Organization/blue-cross | |
purpose | The reason the request is being made. Must be one of the following:
| validation | |
insurance.coverage | A reference to the Coverage resource that is being checked. | Coverage/example-coverage | |
item | Details about the items, services, or procedures for which eligibility is being checked. | See below | |
status | The status of the request. | active | |
supportingInfo | Additional information about the request. This could include a patient's condition, more details about the situation, special considerations, or more. |
The Item Being Checked for Coverage
As mentioned in the table above, the item
element provides details about the eligibility being checked. This includes what procedure, product, or service is being provided as well as why it is being provided.
The item
field also provides additional data about the procedure, product, or service.
Property | Description | Code System | Example |
---|---|---|---|
category | The general type of the service or product being checked for eligibility. | X12 Codes | Vision Coverage |
productOrService | The product, drug, service, etc. that is being provided. | CPT Codes | 92340 - Fitting of eyeglasses |
diagnosis | The diagnosis for which care is being sought. | ICD-10 Codes | Condition/reduced-vision |
provider | A reference to the Practitioner who is responsible for providing the service. | Practitioner/dr-alice-smith | |
quantity | The number of repetitions of the service that will be performed. | 2 | |
unitPrice | The price charged to the patient for a single unit of the service. This is the price that the provider charges for the service. | $200 | |
facility | A reference to the Location or Organization where the service will be provided. | Organization/example-hospital | |
detail | A reference to the CarePlan with details describing the service. | CarePlan/improve-vision |
Example: A coverage eligibility request for a consultation
{
resourceType: 'CoverageEligibilityRequest',
id: 'coverage-validation-request',
status: 'active',
purpose: ['validation'],
created: '2021-01-01T00:00:00.000Z',
patient: {
reference: 'Patient/homer-simpson',
},
provider: {
reference: 'Practitioner/dr-alice-smith',
},
insurer: {
reference: 'Organization/blue-cross-blue-shield',
},
insurance: [
{
coverage: {
reference: 'Coverage/homer-simpson-coverage',
},
},
],
item: [
{
category: {
coding: [
{
system: 'https://x12.org/codes/service-type-codes',
code: '3',
display: 'Consultation',
},
],
},
productOrService: {
coding: [
{
system: 'http://www.ama-assn.org/go/cpt',
code: '80504',
display: 'Consultation for a moderately complex clinical problem',
},
],
},
},
],
};
Example: A plan coverage and general benefits check
{
resourceType: 'CoverageEligibilityRequest',
id: 'general-benefits-check',
status: 'active',
purpose: ['benefits', 'discovery'],
created: '2021-01-01T00:00:00.000Z',
patient: {
reference: 'Patient/jane-doe',
},
provider: {
reference: 'Organization/example-hospital',
},
insurer: {
reference: 'Organization/kaiser-permanente',
},
insurance: [
{
coverage: {
reference: 'Coverage/jane-doe-coverage',
},
},
],
item: [
{
category: {
coding: [
{
system: 'https://x12.org/codes/service-type-codes',
code: '30',
display: 'Plan Coverage and General Benefits',
},
],
},
},
],
};
Sending an Eligibility Check Request
Once you have created your CoverageEligibilityRequest
, you need to send it to the insurer.
In addition to sending it directly to the insurer, there are services that simplify the process. Companies such as Opkit, Availity, Change Healthcare, Waystar and Candid Health allow you to send them eligibility checks directly.
Unfortunately, these companies format their requests based on X12 EDI Format rather than FHIR, so you will need to convert your CoverageEligibilityRequest
to the correct format. This is a good workflow to implement Bots to convert your request, interface with the company's API, and send the request. Additionally, you can have a Subscription to listen for a response and have a bot handle that as well.
Receiving a Response
When you send your request, the insurer will review it and respond. This response will be modeled as a CoverageEligibilityResponse
.
Element | Description | Example |
---|---|---|
outcome | The outcome of the processing of the request. Does NOT answer if the patient is eligible for coverage. | complete |
disposition | A human-readable description of the status of the request. | The policy is currently in-force. |
error | Documents any errors that encountered during the eligibility check. Describes why a check may not have been able to be completed. | Missing Identifier |
insurance.item | Details about the benefits, authorization requirements, and current benefits of the insurance. | See below |
insurance.inforce | A boolean indicating if the coverage is in force for the requested period. | true |
insurance.benefitPeriod | The term period of the benefits documented in the response. | 2023-01-01 – 2023-12-31 |
insurance.coverage | A reference to the patient's Coverage resource. | Coverage/example-coverage |
request | A reference to the original CoverageEligibilityRequest this is in response to. | CoverageEligibilityRequest/check-for-vision-coverage |
purpose | The reason the initial request was made. See the purpose field in the above table for the allowed valueset. | validation |
status | The status of the response. | active |
insurer | A reference to the Organization that is providing coverage and that sent the response. | Organization/blue-cross |
patient | A reference to the Patient the response is for. | Patient/homer-simpson |
The Covered Items
Like its request counterpart, the CoverageEligibilityResponse
also has an item
element, however it is a property on the insurance
element rather than directly on the resource (e.g. CoverageEligibilityResponse.insurance.item
vs CoverageEligibilityRequest.item
). The item
property contains details about allowed products and services under the insurance policy.
This field has some overlap with the request resource, but there are also significant differences between the two.
Property | Description | Code System | Example |
---|---|---|---|
benefit | A description of the benefits allowed and used to date under the coverage. | allowedMoney: $10000, usedMoney: $645.99 | |
description | A more detailed description of the benefits or services that are covered. | Vision is covered in this policy. | |
authorizationRequired | A boolean indicating if authorization is required before providing service. | true | |
authorizationSupporting | Details about additional information or material needed to get authorization. | CoverageEligibilityResponse Auth Support Codes | Lab Report |
excluded | A boolean indicating if the service is excluded from the plan. | false | |
network | Indicates whether the benefits apply to in-network or out-of-network providers. | Network Type Codes | in |
unit | Indicates whether the benefits apply to an individual or to a family. | Unit Type Codes | individual |
term | The term or duration during which service is covered. | Benefit Term Codes | annual |
productOrService | The product, drug, service, etc. that is being provided. | CPT Codes | 92340 - Fitting of eyeglasses |
provider | A reference to the Practitioner who is responsible for providing the service. | Practitioner/dr-alice-smith | |
category | The general type of the service or product being checked for eligibility. | Vision Coverage |
FHIR makes the insurance
field on both the request and response an array, allowing for coordination of benefits across multiple insurance policies.
When sending a request, if there are multiple insurances, the CoverageEligibilityRequest.insurance.focal
field should be set to true
on the specific coverage being checked.
The item
field is also an array on the insurance
element of a CoverageEligibilityResponse
because it can represent multiple items that are covered under a specific insurance. When coordinating care among multiple policies, it can be common for multiple items from multiple coverages to be relevant to the check.
Example: A coverage eligibility response for a basic consultation
{
resourceType: 'CoverageEligibilityResponse',
status: 'active',
purpose: ['validation'],
created: '2021-01-01T00:00:00.000Z',
patient: {
reference: 'Patient/homer-simpson',
},
request: {
reference: 'CoverageEligibilityRequest/coverage-validation-request',
},
outcome: 'complete',
disposition: 'Coverage is currently in-force',
insurer: {
reference: 'Organization/blue-cross-blue-shield',
},
insurance: [
{
coverage: {
reference: 'Coverage/homer-simpson-coverage',
},
inforce: true,
item: [
{
category: {
coding: [
{
system: 'https://x12.org/codes/service-type-codes',
code: '3',
display: 'Consultation',
},
],
},
network: {
coding: [
{
system: 'http://terminology.hl7.org/CodeSystem/benefit-network',
code: 'in',
},
],
},
unit: {
coding: [
{
system: 'http://terminology.hl7.org/CodeSystem/benefit-unit',
code: 'individual',
},
],
},
term: {
coding: [
{
system: 'http://terminology.hl7.org/CodeSystem/benefit-term',
code: 'annual',
},
],
},
benefit: [
{
type: {
coding: [
{
code: 'copay-maximum',
},
],
},
allowedMoney: {
value: 100,
currency: 'USD',
},
},
],
},
],
},
],
};
Example: A plan coverage and general benefits check response
{
resourceType: 'CoverageEligibilityResponse',
status: 'active',
purpose: ['benefits', 'discovery'],
created: '2021-01-01T00:00:00.000Z',
patient: {
reference: 'Patient/jane-doe',
},
request: {
reference: 'CoverageEligibilityRequest/general-benefits-check',
},
outcome: 'complete',
disposition: 'Coverage is currently in-force',
insurer: {
reference: 'Organization/kaiser-permanente',
},
insurance: [
{
coverage: {
reference: 'Coverage/jane-doe-coverage',
},
inforce: true,
item: [
{
category: {
coding: [
{
system: 'https://x12.org/codes/service-type-codes',
code: '30',
display: 'Plan Coverage and General Benefits',
},
],
},
network: {
coding: [
{
system: 'http://terminology.hl7.org/CodeSystem/benefit-network',
code: 'in',
},
],
},
unit: {
coding: [
{
system: 'http://terminology.hl7.org/CodeSystem/benefit-unit',
code: 'family',
},
],
},
term: {
coding: [
{
system: 'http://terminology.hl7.org/CodeSystem/benefit-term',
code: 'lifetime',
},
],
},
benefit: [
{
type: {
coding: [
{
code: 'benefit',
},
],
},
allowedMoney: {
value: 100000,
currency: 'USD',
},
usedMoney: {
value: 1233.4,
currency: 'USD',
},
},
{
type: {
coding: [
{
code: 'copay-percent',
},
],
},
allowedUnsignedInt: 20,
},
],
},
],
},
],
};