When you need information from a payer, picking up the phone seems like the natural choice. Phone calls are flexible and need no setup.
The catch is that calls are slow and labor-intensive, which makes them expensive. Most of what you pay for is hold time. At any real volume, the math stops working.
Stedi's APIs replace most calls with standard healthcare transactions. In most cases, you get the same information as a call in a few seconds, for pennies each.
This guide walks through the most common questions providers ask payers and how Stedi answers each.
Is the patient covered by insurance for this visit?
Most providers check a patient’s insurance before a visit and before submitting a claim.
An eligibility check confirms that a patient has active insurance and returns their plan benefits.
A successful response includes the plan's coverage status and dates. For example, in the JSON Eligibility API response:
{"planDateInformation":{"planBegin":"20270111",// Plan start date"planEnd":"20271231"// Plan end date},..."benefitsInformation":[{"code":"1",// Active coverage"serviceTypeCodes":["30"],// Health Benefit Plan Coverage"benefitsDateInformation":{"service":"20270111-20271231",// Coverage window for this benefit"periodStart":"20270111"// Optional start date (duplicate of above)}}]}
{"planDateInformation":{"planBegin":"20270111",// Plan start date"planEnd":"20271231"// Plan end date},..."benefitsInformation":[{"code":"1",// Active coverage"serviceTypeCodes":["30"],// Health Benefit Plan Coverage"benefitsDateInformation":{"service":"20270111-20271231",// Coverage window for this benefit"periodStart":"20270111"// Optional start date (duplicate of above)}}]}
{"planDateInformation":{"planBegin":"20270111",// Plan start date"planEnd":"20271231"// Plan end date},..."benefitsInformation":[{"code":"1",// Active coverage"serviceTypeCodes":["30"],// Health Benefit Plan Coverage"benefitsDateInformation":{"service":"20270111-20271231",// Coverage window for this benefit"periodStart":"20270111"// Optional start date (duplicate of above)}}]}
{"planDateInformation":{"planBegin":"20270111",// Plan start date"planEnd":"20271231"// Plan end date},..."benefitsInformation":[{"code":"1",// Active coverage"serviceTypeCodes":["30"],// Health Benefit Plan Coverage"benefitsDateInformation":{"service":"20270111-20271231",// Coverage window for this benefit"periodStart":"20270111"// Optional start date (duplicate of above)}}]}
{"planDateInformation":{"planBegin":"20270111",// Plan start date"planEnd":"20271231"// Plan end date},..."benefitsInformation":[{"code":"1",// Active coverage"serviceTypeCodes":["30"],// Health Benefit Plan Coverage"benefitsDateInformation":{"service":"20270111-20271231",// Coverage window for this benefit"periodStart":"20270111"// Optional start date (duplicate of above)}}]}
{"benefitsInformation":[{"code":"A",// Co-insurance"serviceTypeCodes":["7"],// Anesthesia"authOrCertIndicator":"Y",// Prior authorization is required for anesthesia...},...],...}
{"benefitsInformation":[{"code":"A",// Co-insurance"serviceTypeCodes":["7"],// Anesthesia"authOrCertIndicator":"Y",// Prior authorization is required for anesthesia...},...],...}
{"benefitsInformation":[{"code":"A",// Co-insurance"serviceTypeCodes":["7"],// Anesthesia"authOrCertIndicator":"Y",// Prior authorization is required for anesthesia...},...],...}
{"benefitsInformation":[{"code":"A",// Co-insurance"serviceTypeCodes":["7"],// Anesthesia"authOrCertIndicator":"Y",// Prior authorization is required for anesthesia...},...],...}
{"benefitsInformation":[{"code":"A",// Co-insurance"serviceTypeCodes":["7"],// Anesthesia"authOrCertIndicator":"Y",// Prior authorization is required for anesthesia...},...],...}
Some payers include prior authorization details as free-text notes. Look for key phrases like "prior authorization" or "preauthorization" in each benefitsInformation object’s additionalInformation.description field.
These notes can clarify or override the authOrCertIndicator value.
{"benefitsInformation":[{"code":"B",// Co-pay"serviceTypeCodes":["MH"],// Mental health"benefitAmount":"20",// $20 co-pay"inPlanNetworkIndicatorCode":"Y",// Applies to in-network services"additionalInformation":[{"description":"Prior authorization required for mental health visits after 6 sessions."}],...},...],...}
{"benefitsInformation":[{"code":"B",// Co-pay"serviceTypeCodes":["MH"],// Mental health"benefitAmount":"20",// $20 co-pay"inPlanNetworkIndicatorCode":"Y",// Applies to in-network services"additionalInformation":[{"description":"Prior authorization required for mental health visits after 6 sessions."}],...},...],...}
{"benefitsInformation":[{"code":"B",// Co-pay"serviceTypeCodes":["MH"],// Mental health"benefitAmount":"20",// $20 co-pay"inPlanNetworkIndicatorCode":"Y",// Applies to in-network services"additionalInformation":[{"description":"Prior authorization required for mental health visits after 6 sessions."}],...},...],...}
{"benefitsInformation":[{"code":"B",// Co-pay"serviceTypeCodes":["MH"],// Mental health"benefitAmount":"20",// $20 co-pay"inPlanNetworkIndicatorCode":"Y",// Applies to in-network services"additionalInformation":[{"description":"Prior authorization required for mental health visits after 6 sessions."}],...},...],...}
{"benefitsInformation":[{"code":"B",// Co-pay"serviceTypeCodes":["MH"],// Mental health"benefitAmount":"20",// $20 co-pay"inPlanNetworkIndicatorCode":"Y",// Applies to in-network services"additionalInformation":[{"description":"Prior authorization required for mental health visits after 6 sessions."}],...},...],...}
Providers need a patient’s insurance information to bill the payer. But patients often forget their cards, switch plans, or don't know who covers them.
An insurance discovery check (also called coverage discovery) finds active coverage from demographic data the patient is likely to know: name, date of birth, address, and optionally SSN. You can run insurance discovery checks using Stedi’s Insurance Discovery API or the Stedi portal.
Discovery checks return a list of potential matches. Each match carries the same data as an eligibility check, including member ID and benefits. Treat each item as a candidate, not a confirmed match. Use the confidence object to flag low-quality results like last-name mismatches:
{"status":"COMPLETE","coveragesFound":1,"discoveryId":"12345678-abcd-4321-efgh-987654321abc","items":[{"payer":{"name":"Aetna",...},"subscriber":{"memberId":"J9606211996","firstName":"JOHN","lastName":"DOE"},"benefitsInformation":[{"code":"1",// Active coverage...}],"confidence":{"level":"REVIEW_NEEDED","reason":"This record was identified as a low confidence match due to a last name mismatch."}}]}
{"status":"COMPLETE","coveragesFound":1,"discoveryId":"12345678-abcd-4321-efgh-987654321abc","items":[{"payer":{"name":"Aetna",...},"subscriber":{"memberId":"J9606211996","firstName":"JOHN","lastName":"DOE"},"benefitsInformation":[{"code":"1",// Active coverage...}],"confidence":{"level":"REVIEW_NEEDED","reason":"This record was identified as a low confidence match due to a last name mismatch."}}]}
{"status":"COMPLETE","coveragesFound":1,"discoveryId":"12345678-abcd-4321-efgh-987654321abc","items":[{"payer":{"name":"Aetna",...},"subscriber":{"memberId":"J9606211996","firstName":"JOHN","lastName":"DOE"},"benefitsInformation":[{"code":"1",// Active coverage...}],"confidence":{"level":"REVIEW_NEEDED","reason":"This record was identified as a low confidence match due to a last name mismatch."}}]}
{"status":"COMPLETE","coveragesFound":1,"discoveryId":"12345678-abcd-4321-efgh-987654321abc","items":[{"payer":{"name":"Aetna",...},"subscriber":{"memberId":"J9606211996","firstName":"JOHN","lastName":"DOE"},"benefitsInformation":[{"code":"1",// Active coverage...}],"confidence":{"level":"REVIEW_NEEDED","reason":"This record was identified as a low confidence match due to a last name mismatch."}}]}
{"status":"COMPLETE","coveragesFound":1,"discoveryId":"12345678-abcd-4321-efgh-987654321abc","items":[{"payer":{"name":"Aetna",...},"subscriber":{"memberId":"J9606211996","firstName":"JOHN","lastName":"DOE"},"benefitsInformation":[{"code":"1",// Active coverage...}],"confidence":{"level":"REVIEW_NEEDED","reason":"This record was identified as a low confidence match due to a last name mismatch."}}]}
Who is the primary payer?
When a patient has more than one insurance plan, say a child covered by both parents’ health insurance, claims go to the primary payer first, then the secondary. Figuring out the order is called coordination of benefits (COB).
You can use Stedi’s Coordination of Benefits Check API to determine that order. The API response’s primacyDetermined field tells you whether the check resolved a primary payer. Each payer entry’s entityIdentifier field indicates the payer order (primary, secondary, etc.).
{"coordinationOfBenefits":{"coverageOverlap":true,"instanceExists":true,"primacyDetermined":true,// Was the primary payer determined?"classification":"CobInstanceExistsPrimacyDetermined"},"benefitsInformation":[{"code":"R","name":"Other or Additional Payor","serviceTypeCodes":["1"],"benefitsRelatedEntities":[{"entityIdentifier":"Primary Payer",// Primary payer"entityName":"CIGNA",...}]}
...
]}
{"coordinationOfBenefits":{"coverageOverlap":true,"instanceExists":true,"primacyDetermined":true,// Was the primary payer determined?"classification":"CobInstanceExistsPrimacyDetermined"},"benefitsInformation":[{"code":"R","name":"Other or Additional Payor","serviceTypeCodes":["1"],"benefitsRelatedEntities":[{"entityIdentifier":"Primary Payer",// Primary payer"entityName":"CIGNA",...}]}
...
]}
{"coordinationOfBenefits":{"coverageOverlap":true,"instanceExists":true,"primacyDetermined":true,// Was the primary payer determined?"classification":"CobInstanceExistsPrimacyDetermined"},"benefitsInformation":[{"code":"R","name":"Other or Additional Payor","serviceTypeCodes":["1"],"benefitsRelatedEntities":[{"entityIdentifier":"Primary Payer",// Primary payer"entityName":"CIGNA",...}]}
...
]}
{"coordinationOfBenefits":{"coverageOverlap":true,"instanceExists":true,"primacyDetermined":true,// Was the primary payer determined?"classification":"CobInstanceExistsPrimacyDetermined"},"benefitsInformation":[{"code":"R","name":"Other or Additional Payor","serviceTypeCodes":["1"],"benefitsRelatedEntities":[{"entityIdentifier":"Primary Payer",// Primary payer"entityName":"CIGNA",...}]}
...
]}
{"coordinationOfBenefits":{"coverageOverlap":true,"instanceExists":true,"primacyDetermined":true,// Was the primary payer determined?"classification":"CobInstanceExistsPrimacyDetermined"},"benefitsInformation":[{"code":"R","name":"Other or Additional Payor","serviceTypeCodes":["1"],"benefitsRelatedEntities":[{"entityIdentifier":"Primary Payer",// Primary payer"entityName":"CIGNA",...}]}
...
]}
Electronic claim submission is instant, but adjudication, where the payer decides if and what to pay the provider for a claim, can take days or weeks.
In between, the payer sends asynchronous transactions to the provider’s clearinghouse as the claim clears each gate: a claim acknowledgment when the payer accepts (or rejects) the claim for processing and a final remittance when it's paid or denied.
The response includes two codes: a claim status category code for the broad state (accepted, rejected, pending, finalized) and a claim status code for a more specific status for the claim.
Together, these codes show exactly where a claim stands with the payer. For example, in a JSON Real-time Claim Status Check API response for a paid claim:
{"claims":[{"claimStatus":{"statusCategoryCode":"F1",// Finalized/Payment - The claim/line has been paid."statusCode":"65",// Claim/line has been paid....},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"F1",// Finalized/Payment - The claim/line has been paid."statusCode":"65",// Claim/line has been paid....},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"F1",// Finalized/Payment - The claim/line has been paid."statusCode":"65",// Claim/line has been paid....},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"F1",// Finalized/Payment - The claim/line has been paid."statusCode":"65",// Claim/line has been paid....},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"F1",// Finalized/Payment - The claim/line has been paid."statusCode":"65",// Claim/line has been paid....},...}],...}
Some status codes also require an entity identifier code that names who or what the status refers to. For example:
{"claims":[{"claimStatus":{"statusCategoryCode":"A3",// Returned as unprocessable claim"statusCode":"164",// Entity's contract/member number"entityCode":"HK",// Subscriber...},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"A3",// Returned as unprocessable claim"statusCode":"164",// Entity's contract/member number"entityCode":"HK",// Subscriber...},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"A3",// Returned as unprocessable claim"statusCode":"164",// Entity's contract/member number"entityCode":"HK",// Subscriber...},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"A3",// Returned as unprocessable claim"statusCode":"164",// Entity's contract/member number"entityCode":"HK",// Subscriber...},...}],...}
{"claims":[{"claimStatus":{"statusCategoryCode":"A3",// Returned as unprocessable claim"statusCode":"164",// Entity's contract/member number"entityCode":"HK",// Subscriber...},...}],...}
What did the insurer pay the provider for this claim?
After adjudication, the payer sends the provider an Electronic Remittance Advice (ERA), which acts as a receipt for one or more claims. It tells the provider what the payer paid on each claim and why.
ERAs aren't delivered on request. Payers send them asynchronously to the provider’s enrolled clearinghouse. To change that clearinghouse, you must complete ERA transaction enrollment for the provider and payer.
"paymentInfo":[{..."claimAdjustments": [{..."adjustmentReasonCode1": "161",// Claim-level Claim Adjustment Reason Code (CARC) for provider performance bonus"adjustmentReason1":"Provider performance bonus",..."serviceLines": [{..."serviceAdjustments": [{..."adjustmentReasonCode1": "B12",// Service-level CARC for missing documentation"adjustmentReason1":"Services not documented in patient's medical records.",...}],..."healthCareCheckRemarkCodes": [{"codeListQualifierCode":"HE",// Indicates use of a Remittance Advice Remark Code (RARC)"codeListQualifierCodeValue":"Claim Payment Remark Codes","remarkCode":"M30",// RARC for missing pathology report"remark":"Missing pathology report."}],...}]}]}]
"paymentInfo":[{..."claimAdjustments": [{..."adjustmentReasonCode1": "161",// Claim-level Claim Adjustment Reason Code (CARC) for provider performance bonus"adjustmentReason1":"Provider performance bonus",..."serviceLines": [{..."serviceAdjustments": [{..."adjustmentReasonCode1": "B12",// Service-level CARC for missing documentation"adjustmentReason1":"Services not documented in patient's medical records.",...}],..."healthCareCheckRemarkCodes": [{"codeListQualifierCode":"HE",// Indicates use of a Remittance Advice Remark Code (RARC)"codeListQualifierCodeValue":"Claim Payment Remark Codes","remarkCode":"M30",// RARC for missing pathology report"remark":"Missing pathology report."}],...}]}]}]
"paymentInfo":[{..."claimAdjustments": [{..."adjustmentReasonCode1": "161",// Claim-level Claim Adjustment Reason Code (CARC) for provider performance bonus"adjustmentReason1":"Provider performance bonus",..."serviceLines": [{..."serviceAdjustments": [{..."adjustmentReasonCode1": "B12",// Service-level CARC for missing documentation"adjustmentReason1":"Services not documented in patient's medical records.",...}],..."healthCareCheckRemarkCodes": [{"codeListQualifierCode":"HE",// Indicates use of a Remittance Advice Remark Code (RARC)"codeListQualifierCodeValue":"Claim Payment Remark Codes","remarkCode":"M30",// RARC for missing pathology report"remark":"Missing pathology report."}],...}]}]}]
"paymentInfo":[{..."claimAdjustments": [{..."adjustmentReasonCode1": "161",// Claim-level Claim Adjustment Reason Code (CARC) for provider performance bonus"adjustmentReason1":"Provider performance bonus",..."serviceLines": [{..."serviceAdjustments": [{..."adjustmentReasonCode1": "B12",// Service-level CARC for missing documentation"adjustmentReason1":"Services not documented in patient's medical records.",...}],..."healthCareCheckRemarkCodes": [{"codeListQualifierCode":"HE",// Indicates use of a Remittance Advice Remark Code (RARC)"codeListQualifierCodeValue":"Claim Payment Remark Codes","remarkCode":"M30",// RARC for missing pathology report"remark":"Missing pathology report."}],...}]}]}]
"paymentInfo":[{..."claimAdjustments": [{..."adjustmentReasonCode1": "161",// Claim-level Claim Adjustment Reason Code (CARC) for provider performance bonus"adjustmentReason1":"Provider performance bonus",..."serviceLines": [{..."serviceAdjustments": [{..."adjustmentReasonCode1": "B12",// Service-level CARC for missing documentation"adjustmentReason1":"Services not documented in patient's medical records.",...}],..."healthCareCheckRemarkCodes": [{"codeListQualifierCode":"HE",// Indicates use of a Remittance Advice Remark Code (RARC)"codeListQualifierCodeValue":"Claim Payment Remark Codes","remarkCode":"M30",// RARC for missing pathology report"remark":"Missing pathology report."}],...}]}]}]
The ERA also carries the financial information providers need to reconcile claims and payments against bank deposits. For example, the ERA contains the check or Electronic Funds Transfer (EFT) number used for payment:
Some payer phone calls can't be easily replaced. Exceptions to policy and questions about contract terms need a human on each end making a subjective decision.
In other cases, the payer may not return all the details you need in standard transactions. For example, eligibility responses often list frequency limits for a procedure, like two cleanings per year or one MRI per six months, but not how many the patient has already used. To get that information, you need to call the payer or log in to their payer portal.
Even those calls can be automated. Several Stedi Platform Partners offer AI voice agents that handle payer calls programmatically. Other Platform Partners offer browser agents that extract data from payer portals.
Automate at scale
Stedi's Basic plan includes a free monthly allotment of eligibility checks, claim status checks, and ERAs, plus full access to test mode.
Signup takes under two minutes. No credit card is required.
Stedi and the S design mark are registered trademarks of Stedi, Inc. All names, logos, and brands of third parties listed on our site are trademarks of their respective owners (including “X12”, which is a trademark of X12 Incorporated). Stedi, Inc. and its products and services are not endorsed by, sponsored by, or affiliated with these third parties. Our use of these names, logos, and brands is for identification purposes only, and does not imply any such endorsement, sponsorship, or affiliation.
Stedi and the S design mark are registered trademarks of Stedi, Inc. All names, logos, and brands of third parties listed on our site are trademarks of their respective owners (including “X12”, which is a trademark of X12 Incorporated). Stedi, Inc. and its products and services are not endorsed by, sponsored by, or affiliated with these third parties. Our use of these names, logos, and brands is for identification purposes only, and does not imply any such endorsement, sponsorship, or affiliation.
Stedi and the S design mark are registered trademarks of Stedi, Inc. All names, logos, and brands of third parties listed on our site are trademarks of their respective owners (including “X12”, which is a trademark of X12 Incorporated). Stedi, Inc. and its products and services are not endorsed by, sponsored by, or affiliated with these third parties. Our use of these names, logos, and brands is for identification purposes only, and does not imply any such endorsement, sponsorship, or affiliation.