Reports
Get a report
GET/api/v1/reports/summary
Where money and time went in a period, for the key's organization in the key's mode: billed, paid, first-pass acceptance, median days to pay and the claims unpaid over 30 days; days to payment by payer, rejections by reason, acceptance by office and adjustments by reason. The same figures as the Reports screen and its CSV, each the count or sum the claims and ERAs lists give for the same filter. Periods are calendar days in America/Denver; the answer gives the period's bounds. Every figure is computed from the transaction ledger when you ask for it, for the current mode only (test and live are never mixed). Predeterminations are never counted. No patient data.
Needs a key with read permission.
Request
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| period | string | optional | The period: last_90_days (the default, today included), this_month or this_year, in the billing time zone.One of: `last_90_days`, `this_month`, `this_year`. |
Response
The period's figures. Status 200.
| Name | Type | Description |
|---|---|---|
| object | string | Always `report_summary`. |
| period | string | One of: `last_90_days`, `this_month`, `this_year`. |
| mode | string | One of: `test`, `live`. |
| time_zone | string | The time zone the period's days are counted in. |
| from | string (date-time) | The period starts at this instant (included). |
| to | string (date-time) | The period ends at this instant (not included). |
| first_day | string (date) | |
| last_day | string (date) | |
| billed | object | Billed is the charges of the claims first sent to the payer in the period (handed to the network), and how many there are. A claim corrected and resubmitted, or sent again as a replacement, is the same claim: it is counted once, in the period it was first sent. A void transaction is never a claim. |
| billed.amount | string | Matches `^-?\d+\.\d{2}$`. |
| billed.claims | integer | At least -9007199254740991. |
| paid | object | Paid is what payers have paid so far on those claims (each claim's current payment, after any reversal or correction), and its share of billed. |
| paid.amount | string | Matches `^-?\d+\.\d{2}$`. |
| paid.percent_of_billed | string or null | A percentage with one decimal place ("96.4"); null when there was nothing to count.Matches `^\d+\.\d$`. |
| first_pass_acceptance | object | First-pass acceptance is, of those claims the payer has answered (ever rejected, or accepted, paid, posted or denied as they stand now), the share it accepted without a rejection ever being recorded on them. A rejected claim corrected and sent again still counts as answered, and not first-pass. Claims still on their way the first time and voided claims are not counted. |
| first_pass_acceptance.percent | string or null | A percentage with one decimal place ("96.4"); null when there was nothing to count.Matches `^\d+\.\d$`. |
| first_pass_acceptance.accepted | integer | At least -9007199254740991. |
| first_pass_acceptance.answered | integer | At least -9007199254740991. |
| median_days_to_pay | object | Median days to pay is the median number of calendar days (in Mountain time) from a claim's first sending to its first payment, over those claims that have been paid. With an even number of claims it is the mean of the two middle ones. |
| median_days_to_pay.days | value | |
| median_days_to_pay.payments | integer | At least -9007199254740991. |
| unpaid_over_30_days | object | Unpaid over 30 days is the claims the payer accepted more than 30 days ago that no payment has reached since, whatever the period: the Claims list's Accepted claims unpaid for 30 days, and their charges. |
| unpaid_over_30_days.amount | string | Matches `^-?\d+\.\d{2}$`. |
| unpaid_over_30_days.claims | integer | At least -9007199254740991. |
| days_to_pay_by_payer | array of object | Days to payment by payer is the same median for each payer, for the 10 payers with the most paid claims, fastest first. |
| days_to_pay_by_payer[].payer_id | string | An ID that starts with pyr_. |
| days_to_pay_by_payer[].name | string | |
| days_to_pay_by_payer[].median_days | number | |
| days_to_pay_by_payer[].payments | integer | At least -9007199254740991. |
| rejections_by_reason | object | Rejections by reason counts every rejection recorded on those claims (a claim rejected, corrected and rejected again counts twice), by the status category and code it came with, the 10 most frequent. |
| rejections_by_reason.total | integer | Every rejection recorded on the claims first sent in the period.At least -9007199254740991. |
| rejections_by_reason.claims_sent | integer | The claims first sent in the period.At least -9007199254740991. |
| rejections_by_reason.reasons | array of object | |
| rejections_by_reason.reasons[].source | value | |
| rejections_by_reason.reasons[].category | value | |
| rejections_by_reason.reasons[].code | value | |
| rejections_by_reason.reasons[].description | string | |
| rejections_by_reason.reasons[].rejections | integer | At least -9007199254740991. |
| acceptance_by_office | array of object | Acceptance by office is the first-pass acceptance of each office of the organization; a dash where none of its claims has been answered. |
| acceptance_by_office[].office_id | string | An ID that starts with off_. |
| acceptance_by_office[].name | string | |
| acceptance_by_office[].percent | string or null | A percentage with one decimal place ("96.4"); null when there was nothing to count.Matches `^\d+\.\d$`. |
| acceptance_by_office[].accepted | integer | At least -9007199254740991. |
| acceptance_by_office[].answered | integer | At least -9007199254740991. |
| adjustments_by_reason | array of object | Adjustments by reason adds up the claim and line adjustments of the ERAs received in the period, by group and reason code, the 10 largest. A predetermination's pricing is not an adjustment. |
| adjustments_by_reason[].group | string | |
| adjustments_by_reason[].reason | string | |
| adjustments_by_reason[].code | string | |
| adjustments_by_reason[].description | string | |
| adjustments_by_reason[].amount | string | Matches `^-?\d+\.\d{2}$`. |
| adjustments_by_reason[].adjustments | integer | 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. |
| 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/reports/summary?period=last_90_days" \
-H "Authorization: Bearer $CLAIMHOUSE_KEY"Example response: 200
{
"object": "report_summary",
"period": "last_90_days",
"mode": "live",
"time_zone": "America/Denver",
"from": "2026-07-05T06:00:00.000Z",
"to": "2026-10-03T06:00:00.000Z",
"first_day": "2026-07-05",
"last_day": "2026-10-02",
"billed": {
"amount": "68400.00",
"claims": 60
},
"paid": {
"amount": "42858.50",
"percent_of_billed": "62.7"
},
"first_pass_acceptance": {
"percent": "94.6",
"accepted": 53,
"answered": 56
},
"median_days_to_pay": {
"days": 14,
"payments": 52
},
"unpaid_over_30_days": {
"amount": "2280.00",
"claims": 2
},
"days_to_pay_by_payer": [
{
"payer_id": "pyr_01JM000000E008000000000004",
"name": "Example Dental Plan",
"median_days": 14,
"payments": 52
}
],
"rejections_by_reason": {
"total": 3,
"claims_sent": 60,
"reasons": [
{
"source": "payer",
"category": "A7",
"code": "33",
"description": "Rejected because information is not valid (A7:33)",
"rejections": 3
}
]
},
"acceptance_by_office": [
{
"office_id": "off_01JM000000E008000000000003",
"name": "Example Dental, Main Street",
"percent": "95.6",
"accepted": 43,
"answered": 45
},
{
"office_id": "off_01JM000000E00800000000004G",
"name": "Example Dental, Riverside",
"percent": "90.9",
"accepted": 10,
"answered": 11
}
],
"adjustments_by_reason": [
{
"group": "CO",
"reason": "45",
"code": "CO-45",
"description": "The charge is more than the payer fee schedule allows",
"amount": "9120.00",
"adjustments": 52
},
{
"group": "PR",
"reason": "2",
"code": "PR-2",
"description": "The patient coinsurance share",
"amount": "4865.00",
"adjustments": 37
},
{
"group": "CO",
"reason": "119",
"code": "CO-119",
"description": "The benefit maximum for the period has been reached",
"amount": "1140.00",
"adjustments": 1
}
]
}