ERAs
Get an ERA
GET/api/v1/eras/{id}
One remittance as JSON: the payment (method, trace number, date, total), whether it adds up, and every claim payment with its lines, each matched to its claim or shown unmatched (with the patient's name as the payer wrote it, to match it by hand). Adjustment codes come with plain words. An ERA of another organization or mode is not found.
Needs a key with read permission.
Request
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | An ERA ID (era_...). |
Response
The ERA. Status 200.
| Name | Type | Description |
|---|---|---|
| id | string | An ID that starts with era_. |
| object | string | Always `era`. |
| state | string | needs_review: received, not yet posted; posted: you posted it.One of: `needs_review`, `posted`. |
| payer | object or null | The payer in the directory, when the remittance names one we know. |
| payer.id | string | An ID that starts with pyr_. |
| payer.payer_id | string | The payer's own payer ID. |
| payer.name | string | |
| payer_name | string | The payer's name as the remittance gives it. |
| office_id | string or null | The office the payment was made to (the payee), when exactly one office of yours matches it. |
| payment | object | |
| payment.method | string | ACH (an electronic transfer), CHK (a check), NON (no payment) or another code as sent. |
| payment.trace_number | string | The EFT trace or check number: matches the deposit in your bank account. |
| payment.date | string (date) or null | |
| payment.total | string | The amount paid.Matches `^-?\d+\.\d{2}$`. |
| payment.provider_adjustments_total | string | Adjustments at provider level (a recoupment, a forward balance): a positive one reduced the payment.Matches `^-?\d+\.\d{2}$`. |
| balanced | boolean | Whether the remittance adds up (the payment, each claim and each line). One that does not is flagged for review: only the claims that add up on their own were applied. |
| counts | object | |
| counts.claims | integer | At least -9007199254740991. |
| counts.matched | integer | At least -9007199254740991. |
| counts.unmatched | integer | At least -9007199254740991. |
| received_at | string (date-time) | |
| posted_at | string (date-time) or null | |
| findings | array of object | What does not add up, if anything: each with where (payment, a claim or a line) and the two figures. |
| findings[].scope | string | |
| findings[].path | string | |
| findings[].message | string | |
| findings[].expected | string or null | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| findings[].actual | string or null | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| provider_adjustments | array of object | |
| provider_adjustments[].reason_code | string | |
| provider_adjustments[].reference | string | |
| provider_adjustments[].amount | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims | array of object | |
| claims[].id | string | An ID that starts with erc_. |
| claims[].object | string | Always `era_claim`. |
| claims[].claim_id | string or null | The claim this payment is for; null while it is unmatched. |
| claims[].match | string | matched: by the patient control number or the payer claim number; manual: matched by hand; unmatched: no claim with certainty (match it by hand).One of: `matched`, `unmatched`, `manual`. |
| claims[].unmatched_reason | string or null | Why a payment naming one of your claims was left unmatched: payer_differs (the ERA's payer is not the claim's), claim_not_payable (the claim could not take a payment in its state, such as while it is being corrected), estimate_for_claim (an estimate naming a claim), payment_for_predetermination (a payment naming a predetermination). Match it by hand once you have checked. Null otherwise.One of: `payer_differs`, `claim_not_payable`, `estimate_for_claim`, `payment_for_predetermination`. |
| claims[].patient_control_number | string | The patient control number as the payer echoed it. |
| claims[].payer_claim_number | string | |
| claims[].status | object | |
| claims[].status.code | string | The payer's claim status (CLP02). |
| claims[].status.description | string | |
| claims[].outcome | string | What the payment does to the claim: paid, denied, reversal (an earlier payment taken back), estimate (the answer to a predetermination, never a payment), or status (reported only).One of: `paid`, `denied`, `reversal`, `status`, `estimate`. |
| claims[].charge | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].paid | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].allowed | string or null | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].patient_responsibility | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].adjustments | array of object | Adjustments at claim level (each line has its own). |
| claims[].adjustments[].group | string | The adjustment group: CO (contractual), PR (patient responsibility), OA (other), PI (payer initiated) or CR (correction). |
| claims[].adjustments[].group_description | string | The group in plain words. |
| claims[].adjustments[].reason | string | The claim adjustment reason code, as sent (such as 45, 2 or 119). |
| claims[].adjustments[].description | string | The reason in our own plain words, for the common codes; the code itself for any other. |
| claims[].adjustments[].amount | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].patient_name | value | The patient as the payer wrote it, shown only while the payment is unmatched, to find its claim; null once matched. |
| claims[].balanced | boolean | Whether its charge less its payment is its adjustments: one that is not was not applied to its claim. |
| claims[].applied | boolean | Whether it moved its claim (paid, denied or reversed). |
| claims[].postable | boolean | Whether posting the ERA marks its claim reconciled: applied, the ERA not posted yet, and the claim paid or denied with this ERA's payment as its current one. |
| claims[].lines | array of object | |
| claims[].lines[].procedure_code | string | The CDT code the payer paid. |
| claims[].lines[].modifiers | array of string | |
| claims[].lines[].service_date | string (date) or null | |
| claims[].lines[].charge | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].lines[].paid | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].lines[].allowed | string or null | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].lines[].units | value | |
| claims[].lines[].adjustments | array of object | |
| claims[].lines[].adjustments[].group | string | The adjustment group: CO (contractual), PR (patient responsibility), OA (other), PI (payer initiated) or CR (correction). |
| claims[].lines[].adjustments[].group_description | string | The group in plain words. |
| claims[].lines[].adjustments[].reason | string | The claim adjustment reason code, as sent (such as 45, 2 or 119). |
| claims[].lines[].adjustments[].description | string | The reason in our own plain words, for the common codes; the code itself for any other. |
| claims[].lines[].adjustments[].amount | string | An amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`. |
| claims[].lines[].remarks | array of string | Remark codes, as sent. |
| claims[].lines[].line_control_number | value | The line control number the payer returned (ours is <patient control number>-<line>). |
| claims[].lines[].claim_line_number | integer or null | The line of the matched claim this pays; null when no line matched with certainty.At least -9007199254740991. |
| postable_count | integer | How many claims posting this ERA marks reconciled now (each claim once); 0 when it was posted, or has nothing to reconcile (posting it then marks it reviewed).At least -9007199254740991. |
Errors
| HTTP status | Code | What it means |
|---|---|---|
| 401 | UNAUTHORIZED | A valid API key is required. Send it as "Authorization: Bearer <key>". |
| 403 | PERMISSION_DENIED | This API key is not allowed to do that. |
| 404 | NOT_FOUND | Not found. |
| 422 | INVALID_REQUEST | The request is not valid. |
| 504 | TIMEOUT | The request took too long to finish. It may still have taken effect: look it up before sending it again with a new Idempotency-Key. What it made is found with GET /api/v1/eligibility?request_id=<this request_id>, and the same filter on /api/v1/claims and /api/v1/attachments (a key with read permission). |
| 500 | INTERNAL | Something went wrong on our side. Quote the request ID if you contact us. |
Example
Example request
curl "https://sandbox.myclaimhouse.com/api/v1/eras/era_01JM000000E00800000000003G" \
-H "Authorization: Bearer $CLAIMHOUSE_KEY"Example response: 200
{
"id": "era_01JM000000E00800000000003G",
"object": "era",
"state": "needs_review",
"payer": {
"id": "pyr_01JM000000E008000000000004",
"payer_id": "00000",
"name": "Example Dental Plan"
},
"payer_name": "EXAMPLE DENTAL PLAN",
"office_id": "off_01JM000000E008000000000003",
"payment": {
"method": "ACH",
"trace_number": "SBXEFT000001042",
"date": "2026-09-24",
"total": "820.80",
"provider_adjustments_total": "0.00"
},
"balanced": true,
"counts": {
"claims": 2,
"matched": 1,
"unmatched": 1
},
"received_at": "2026-09-24T21:03:30.000000+00:00",
"posted_at": null,
"findings": [],
"provider_adjustments": [],
"claims": [
{
"id": "erc_01JM000000E00800000000003H",
"object": "era_claim",
"claim_id": "clm_01JM000000E00800000000002G",
"match": "matched",
"unmatched_reason": null,
"patient_control_number": "CH4Q7M2K9TRB",
"payer_claim_number": "990000001042",
"status": {
"code": "1",
"description": "Processed as primary."
},
"outcome": "paid",
"charge": "1140.00",
"paid": "820.80",
"allowed": "1026.00",
"patient_responsibility": "205.20",
"adjustments": [],
"patient_name": null,
"balanced": true,
"applied": true,
"postable": true,
"lines": [
{
"procedure_code": "D2740",
"modifiers": [],
"service_date": "2026-09-24",
"charge": "1140.00",
"paid": "820.80",
"allowed": "1026.00",
"units": 1,
"adjustments": [
{
"group": "CO",
"group_description": "The provider writes this off under its contract with the payer. The patient is not billed.",
"reason": "45",
"description": "The charge is more than the payer fee schedule allows.",
"amount": "114.00"
},
{
"group": "PR",
"group_description": "The patient owes this.",
"reason": "2",
"description": "The patient coinsurance share.",
"amount": "205.20"
}
],
"remarks": [],
"line_control_number": "CH4Q7M2K9TRB-1",
"claim_line_number": 1
}
]
},
{
"id": "erc_01JM000000E00800000000003J",
"object": "era_claim",
"claim_id": null,
"match": "unmatched",
"unmatched_reason": null,
"patient_control_number": "PMS-77812",
"payer_claim_number": "990000001077",
"status": {
"code": "4",
"description": "Denied."
},
"outcome": "denied",
"charge": "310.00",
"paid": "0.00",
"allowed": null,
"patient_responsibility": "0.00",
"adjustments": [],
"patient_name": "SAMPLE, MIA",
"balanced": true,
"applied": false,
"postable": false,
"lines": [
{
"procedure_code": "D4341",
"modifiers": [],
"service_date": "2026-09-24",
"charge": "310.00",
"paid": "0.00",
"allowed": null,
"units": 1,
"adjustments": [
{
"group": "CO",
"group_description": "The provider writes this off under its contract with the payer. The patient is not billed.",
"reason": "119",
"description": "The benefit maximum for the period has been reached.",
"amount": "310.00"
}
],
"remarks": [
"N130"
],
"line_control_number": "1",
"claim_line_number": null
}
]
}
],
"postable_count": 1
}