Skip to the page
Chapters

Claims

Create a claim

POST/api/v1/claims

Makes a dental claim from JSON. With submit true (the default) it is validated at once and, when it has no errors, queued for the next batch; with submit false it is saved as a draft. A claim with errors is still made: it comes back with state needs_attention and its findings (validation.findings), with 201 like any other. A body that is not a claim, or that names an office, provider or payer that does not exist, is refused with 422 and nothing is stored. With kind predetermination it makes a predetermination: the same body with no service dates (a date on a line is a SERVICE_DATE_NOT_ALLOWED error); in test mode the sandbox answers one it accepts with its estimate two minutes after the 277. In test mode the sandbox network answers each file with a 997 after 30 seconds and a 277 after 60; the subscriber's member ID picks a scenario (CH-REJECT-A7, CH-REJECT-A3, CH-997-REJECT, CH-ATTACH-REQUIRED, CH-SOLICITED, CH-PAID-ERA, CH-DENIED). In test mode, a claim with the member ID CH-ATTACH-REQUIRED needs a closed attachment before it can be sent. Needs an Idempotency-Key header and a key with the submit permission.

Needs a key with submit permission.

Request

Headers

Headers
NameTypeRequiredDescription
Idempotency-KeystringrequiredMakes the request safe to repeat: a request with the same key and body returns the first answer (the reply has an idempotent-replayed header), and the same key with a different request is refused. 1 to 255 printable characters; a UUID is a good choice.At least 1 character.At most 255 characters.Matches `^[\x21-\x7e]{1,255}$`.

Body

Body
NameTypeRequiredDescription
kindstringoptionalclaim (the default): treatment done. predetermination: sent before treatment to ask what the payer would pay; it has no service dates and comes back with an estimate. Set when the claim is made; it never changes.One of: `claim`, `predetermination`.
office_idstringrequiredThe office that bills the claim (off_...).
payer_idstringrequiredThe payer (a Claim House payer ID, pyr_..., a payer ID or an alias from the payer directory).
rendering_provider_idstringrequiredThe dentist who did the treatment (prv_...).
subscriberobjectrequiredThe person who holds the coverage. Also the patient unless patient is given.
subscriber.first_namestringrequired
subscriber.last_namestringrequired
subscriber.date_of_birthvalueoptional
subscriber.genderstring or nulloptionalOne of: `F`, `M`, `U`.
subscriber.member_idstringrequired
subscriber.group_numbervalueoptional
subscriber.addressobject or nulloptional
subscriber.address.line1stringrequired
subscriber.address.line2valueoptional
subscriber.address.citystringrequired
subscriber.address.statestringrequired
subscriber.address.postal_codestringrequired
patientobject or nulloptionalThe patient, when not the subscriber.
patient.first_namestringrequired
patient.last_namestringrequired
patient.date_of_birthvalueoptional
patient.genderstring or nulloptionalOne of: `F`, `M`, `U`.
patient.relationshipstringrequiredOne of: `spouse`, `child`, `other`.
patient.addressobject or nulloptional
patient.address.line1stringrequired
patient.address.line2valueoptional
patient.address.citystringrequired
patient.address.statestringrequired
patient.address.postal_codestringrequired
place_of_servicestringoptionalThe place of service code. Default 11 (office).
linesarray of objectrequiredThe procedures, one line each. At least one for a claim to be sent.At most 100 items.
lines[].cdtstringrequired
lines[].descriptionvalueoptional
lines[].service_datevalueoptional
lines[].feenumberoptional
lines[].quantityintegeroptionalAt least 0.At most 99999.
lines[].toothvalueoptional
lines[].surfacesvalueoptional
lines[].areavalueoptional
totalvalueoptionalThe total the claim comes to, in dollars: checked against the lines.
remarksvalueoptionalNotes for the payer: up to 5 notes of 80 characters, split between words (about 370 characters of ordinary text); a remark that does not fit is a TOO_LONG finding.
metadataobjectoptionalUp to 20 pairs of your own, returned with the claim and never sent to the payer.
patient_control_numbervalueoptionalYour identifier for the claim, sent on the claim and returned on its status: unique in your organization. Made for you when omitted.
attachmentsarray of stringoptionalThe attachments the claim carries (att_...), at most 5: of your organization and mode, for the claim's payer, unsolicited and on no other claim. Each must be closed before the claim is sent (ATTACHMENT_OPEN); the claim file carries a PWK and a note for each.At most 5 items.
submitbooleanoptionaltrue (the default): validate the claim and queue it when it has no errors. false: save it as a draft.

Response

The claim, as it is now: queued, validated, a draft, or needing attention. Status 201.

Response fields
NameTypeDescription
idstringAn ID that starts with clm_.
objectstringAlways `claim`.
kindstringclaim, or predetermination (sent before treatment; its answer is an estimate). Set when it was made.One of: `claim`, `predetermination`.
statestringOne of: `draft`, `validated`, `needs_attention`, `queued`, `submitted`, `accepted_clearinghouse`, `accepted_payer`, `rejected`, `voided`, `paid`, `denied`, `reconciled`, `returned`.
next_stepstringOne sentence saying what happens next, or what you must do.
frequencystringoriginal; replacement for a resubmission of a claim the payer has; void for a void transaction.One of: `original`, `replacement`, `void`.
parent_idstring or nullThe claim a void transaction voids.
patient_control_numberstringYour identifier for the claim, or the one we made: unique in your organization, sent on the claim and returned on its status.
officeobject
office.idstringAn ID that starts with off_.
office.namestring
payerobject
payer.idstringAn ID that starts with pyr_.
payer.payer_idstringThe payer's own payer ID.
payer.namestring
rendering_providerobject
rendering_provider.idstringAn ID that starts with prv_.
rendering_provider.first_namestring
rendering_provider.last_namestring
rendering_provider.npistring
patient_nameobjectThe patient: the dependent when there is one, else the subscriber.
patient_name.first_namestring
patient_name.last_namestring
patient_idstring or nullThe patient this is about (pat_...) in the patient directory: the dependent when there is one, else the subscriber. Set by Claim House when a check completes or a claim's patient is written; null while a check is pending, and when the patient has no date of birth or a name with no letters or digits to compare.
service_datesobject
service_dates.firststring (date) or null
service_dates.laststring (date) or null
totalsobject
totals.chargestringThe sum of the line fees, in dollars, as a decimal string.Matches `^-?\d+\.\d{2}$`.
totals.linesintegerAt least -9007199254740991.
paymentobject or nullWhat the payer paid (states paid, denied and reconciled), from its remittances; null before one arrives, when every payment was reversed, and always on a predetermination.
payment.outcomestringpaid or denied: the outcome of the claim's current payment (the latest one no reversal cancelled). A reconciled claim keeps it.One of: `paid`, `denied`.
payment.era_idstringThe ERA of the claim's current payment (era_...): the latest one, when that is not certain.
payment.paidstringWhat the payer paid in all: the sum of every payment applied, reversals subtracted.Matches `^-?\d+\.\d{2}$`.
payment.allowedstring or nullThe amount the current payment allowed, when it said.Matches `^-?\d+\.\d{2}$`.
payment.patient_responsibilitystringWhat the patient owes, as the payer says (deductible, coinsurance and the like).Matches `^-?\d+\.\d{2}$`.
payment.payment_datestring (date) or nullThe payment date of the ERA.
payment.reconciled_atstring (date-time) or nullWhen you confirmed you posted the payment (state reconciled); null until then.
estimateobject or nullA predetermination's estimate (state returned); null before it arrives, and always on a claim.
estimate.era_idstringThe ERA that carried the estimate (era_...).
estimate.allowedstring or nullWhat the payer would allow, when it said.Matches `^-?\d+\.\d{2}$`.
estimate.paystringWhat the payer would pay once the treatment is done.Matches `^-?\d+\.\d{2}$`.
estimate.patientstringThe patient's estimated share.Matches `^-?\d+\.\d{2}$`.
estimate.returned_atstring (date-time)When the estimate arrived.
estimate.linesarray of objectThe estimate per line, where the payer said (line_number is the predetermination's).
estimate.lines[].line_numberintegerAt least 1.
estimate.lines[].allowedstring or nullAn amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`.
estimate.lines[].paystringAn amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`.
estimate.lines[].patientstringAn amount in dollars, as a decimal string with two places (such as "113.60").Matches `^-?\d+\.\d{2}$`.
converted_fromstring or nullOn a claim made from a predetermination: the predetermination.
converted_tostring or nullOn a converted predetermination: the claim made from it.
request_idstring or nullThe API request that made the claim (the x-request-id of its response); null for a claim made in the dashboard.
created_atstring (date-time)
updated_atstring (date-time)
subscriberobject
subscriber.first_namestring
subscriber.last_namestring
subscriber.date_of_birthstring (date) or null
subscriber.genderstring or nullOne of: `F`, `M`, `U`.
subscriber.member_idstring
subscriber.group_numbervalue
subscriber.addressobject or null
subscriber.address.line1string
subscriber.address.line2value
subscriber.address.citystring
subscriber.address.statestring
subscriber.address.postal_codestring
patientobject or nullThe patient, when not the subscriber.
patient.first_namestring
patient.last_namestring
patient.date_of_birthstring (date) or null
patient.genderstring or nullOne of: `F`, `M`, `U`.
patient.relationshipstringOne of: `spouse`, `child`, `other`.
patient.addressobject or null
patient.address.line1string
patient.address.line2value
patient.address.citystring
patient.address.statestring
patient.address.postal_codestring
place_of_servicestring
linesarray of object
lines[].line_numberintegerAt least 1.
lines[].cdtstring
lines[].descriptionvalueThe description you sent, or our short description of the code when you sent none and it is a common one.
lines[].service_datestring (date) or nullThe date of service. Null on a predetermination (it has none), and on a claim made from one until you add it.
lines[].feestringThe charge for the whole line, in dollars, as a decimal string (never multiplied by the quantity).Matches `^-?\d+\.\d{2}$`.
lines[].quantityintegerHow many units the line is for: a count sent with the line (SV306).At least -9007199254740991.
lines[].toothvalue
lines[].surfacesvalue
lines[].areavalueThe oral cavity code: a quadrant (10, 20, 30, 40), an arch (01, 02) or 00.
remarksvalue
metadataobject
attachmentsarray of stringThe attachments the claim carries, in the order the claim file writes them (a PWK and a note for each).Each item matches `^att_[0-9A-HJKMNP-TV-Z]{26}$`.
validationobject or nullThe result of the last validation; null while the claim has not been validated.
validation.validated_atstring (date-time)
validation.errorsintegerAt least -9007199254740991.
validation.warningsintegerAt least -9007199254740991.
validation.findingsarray of object
validation.findings[].fieldvalueThe request field the finding is about, as a dotted path (lines[0].tooth), or null for the claim as a whole.
validation.findings[].codestringA stable code for the finding.
validation.findings[].messagestring
validation.findings[].severitystringAn error keeps the claim from being sent; a warning does not.One of: `error`, `warning`.
networkobject
network.submitted_atstring (date-time) or null
network.clearinghouse_claim_idvalue
network.payer_claim_numbervalueThe payer's own number for the claim, once it has accepted it.
network.rejectionobject or null
network.rejection.sourcestringOne of: `clearinghouse`, `payer`.
network.rejection.categoryvalueThe status category code from the 277 (such as A7).
network.rejection.codevalueThe status code from the 277 (such as 33).
network.rejection.messagestringWhy, in plain words.
network.rejection.fixvalueWhat to change, when it is known.
idempotency_keyvalueThe Idempotency-Key the claim was sent with.

Errors

Errors
HTTP statusCodeWhat it means
401UNAUTHORIZEDA valid API key is required. Send it as "Authorization: Bearer <key>".
403PERMISSION_DENIEDThis API key is not allowed to do that.
422INVALID_REQUESTThe request is not valid.
400IDEMPOTENCY_KEY_REQUIREDPOST and PATCH requests need an Idempotency-Key header.
422IDEMPOTENCY_KEY_REUSEDThat Idempotency-Key was already used with a different request.
409IDEMPOTENCY_KEY_IN_USEA request with that Idempotency-Key is still running. Retry shortly.
413PAYLOAD_TOO_LARGEThe request body is larger than 1 MB.
504TIMEOUTThe 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).
503CLAIMS_UNAVAILABLEClaims are not available in live mode yet. Use a test key.
409CONFLICTThe resource is not in a state that allows this, or it changed while the request was handled. Read it, then decide whether to send the request again.
500INTERNALSomething went wrong on our side. Quote the request ID if you contact us.

Example

Example request

Shell
curl -X POST "https://sandbox.myclaimhouse.com/api/v1/claims" \
  -H "Authorization: Bearer $CLAIMHOUSE_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "office_id": "off_01JM000000E008000000000003",
  "payer_id": "pyr_01JM000000E008000000000004",
  "rendering_provider_id": "prv_01JM000000E008000000000005",
  "subscriber": {
    "first_name": "Alex",
    "last_name": "Example",
    "date_of_birth": "1985-04-12",
    "gender": "F",
    "member_id": "CH-ACTIVE-FULL",
    "address": {
      "line1": "1 Example Street",
      "city": "Exampleville",
      "state": "GA",
      "postal_code": "30000"
    }
  },
  "lines": [
    {
      "cdt": "D2740",
      "fee": 1140,
      "service_date": "2026-09-24",
      "tooth": "3"
    }
  ],
  "metadata": {
    "pms_claim_number": "PMS-1042"
  },
  "attachments": [
    "att_01JM000000E00800000000003G"
  ]
}'

Example response: 201

JSON
{
  "id": "clm_01JM000000E00800000000002G",
  "object": "claim",
  "kind": "claim",
  "state": "queued",
  "next_step": "This claim is queued and goes out in the next batch.",
  "frequency": "original",
  "parent_id": null,
  "patient_control_number": "CH4Q7M2K9TRB",
  "office": {
    "id": "off_01JM000000E008000000000003",
    "name": "Example Family Dental"
  },
  "payer": {
    "id": "pyr_01JM000000E008000000000004",
    "payer_id": "00000",
    "name": "Example Dental Plan"
  },
  "rendering_provider": {
    "id": "prv_01JM000000E008000000000005",
    "first_name": "Riley",
    "last_name": "Example",
    "npi": "1999990017"
  },
  "patient_name": {
    "first_name": "Alex",
    "last_name": "Example"
  },
  "service_dates": {
    "first": "2026-09-24",
    "last": "2026-09-24"
  },
  "totals": {
    "charge": "1140.00",
    "lines": 1
  },
  "payment": null,
  "estimate": null,
  "converted_from": null,
  "converted_to": null,
  "patient_id": "pat_01JM000000E00800000000004K",
  "request_id": "req_01JM000000E00800000000002J",
  "created_at": "2026-09-24T21:00:00.120000+00:00",
  "updated_at": "2026-09-24T21:00:00.310000+00:00",
  "subscriber": {
    "first_name": "Alex",
    "last_name": "Example",
    "date_of_birth": "1985-04-12",
    "gender": "F",
    "member_id": "CH-ACTIVE-FULL",
    "group_number": null,
    "address": {
      "line1": "1 Example Street",
      "line2": null,
      "city": "Exampleville",
      "state": "GA",
      "postal_code": "30000"
    }
  },
  "patient": null,
  "place_of_service": "11",
  "lines": [
    {
      "line_number": 1,
      "cdt": "D2740",
      "description": "Porcelain or ceramic crown",
      "service_date": "2026-09-24",
      "fee": "1140.00",
      "quantity": 1,
      "tooth": "3",
      "surfaces": null,
      "area": null
    }
  ],
  "remarks": null,
  "metadata": {
    "pms_claim_number": "PMS-1042"
  },
  "attachments": [
    "att_01JM000000E00800000000003G"
  ],
  "validation": {
    "validated_at": "2026-09-24T21:00:00.300000+00:00",
    "errors": 0,
    "warnings": 0,
    "findings": []
  },
  "network": {
    "submitted_at": null,
    "clearinghouse_claim_id": null,
    "payer_claim_number": null,
    "rejection": null
  },
  "idempotency_key": "pms-1042"
}