API reference
Every route, one contract
JSON over HTTPS. Reads are keyless, every response is a typed envelope, and every reserved act answers a typed pending state.
https://api.insureapplication/json/openapi.jsonClaims
The claim file, from first notice to payment. A claim waiting on a license is typed as waiting, never left in an untyped queue.
GET/claims
The claims collection. Filter by peril or stage. A filter that matches nothing answers a typed EMPTY, never a bare list.
{ "type": "OK", "claims": [ { "claim": "clm_8f3ka92", "peril": "wind_hail", "stage": "evaluate", "status": "PENDING_ADJUSTER" }, { "claim": "clm_7d21m40", "peril": "water_nonweather", "stage": "decide", "status": "DECIDED" } ]}
POST/claims
First notice of loss. Opens the claim, starts the state's clocks, and runs the open work: intake, acknowledgment, file assembly, coverage and estimate review.
{ "policy": "HO3-4482-TX", "loss": { "date": "2026-07-14", "peril": "wind_hail", "state": "TX" }, "posture": "first_party"}
{ "type": "OK", "claim": "clm_8f3ka92", "stage": "notice", "openWork": [ "intake", "acknowledge", "assemble", "coverage", "estimate" ], "clocks": { "acknowledge": { "rule": "TX: 15 days", "started": "2026-07-15", "due": "2026-07-30" } }, "webhooks": ["decision.issued", "claim.paid"]}
GET/claims/:id
Waits on a licensed adjuster
One claim, with its stage, open work and clock state. At the reserved act it answers PENDING_ADJUSTER and names the license the act requires.
{ "type": "OK", "claim": "clm_8f3ka92", "policy": "HO3-4482-TX", "line": "homeowners", "posture": "first_party", "stage": "evaluate", "status": "PENDING_ADJUSTER", "openWork": { "fnol": "complete", "acknowledgment": "sent", "file": "assembled", "coverage": "analyzed", "estimate": "checked" }, "reservedAct": { "verb": "adjust", "license": "TX all-lines adjuster", "verified": "at_call_time", "authority": "delegated_by_carrier", "fee": { "shape": "flat", "fixed": "at_post" } }, "clocks": { "acknowledge": { "rule": "TX: 15 days", "closed": "2026-07-16" }, "decide": { "rule": "TX: 15 business days", "started": "2026-07-24", "due": "2026-08-14" } }}
Coverage
Rating is open work, so a rate answers at once. Offering, negotiating and binding are producer-reserved, so a bind waits on a licensed producer.
POST/quotes
Price coverage for a risk in one state and line. The quote holds its premium until it expires.
{ "line": "personal_auto", "state": "TX", "risk": { "vehicle": "2024 Subaru Outback", "garaging": "78704" }, "coverages": [ "liability", "collision", "comprehensive", "gap" ], "term": "6_months"}
{ "type": "OK", "quote": "qt_31c8f0", "premium": { "amount": 650, "currency": "USD", "term": "6_months" }, "expires": "2026-08-12"}
POST/quotes/:id/bind
Waits on a licensed producer
Bind a quote. The call answers PENDING_PRODUCER while a licensed producer reviews and binds, then policy.bound arrives with the policy number.
{ "type": "OK", "quote": "qt_31c8f0", "status": "PENDING_PRODUCER", "reservedAct": { "verb": "bind", "license": "TX general lines producer", "verified": "at_call_time", "fee": { "shape": "flat", "fixed": "at_post" } }, "webhooks": ["policy.bound", "documents.issued"]}
GET/policies/:id
One policy record at ACORD grain: form, term, coverages and deductibles.
{ "type": "OK", "policy": "HO3-4482-TX", "form": "HO-3", "insured": "Jordan Alvarez", "term": { "effective": "2026-03-01", "expires": "2027-03-01" }, "coverages": { "dwelling": 412000, "otherStructures": 41200, "personalProperty": 206000 }, "deductible": { "windHail": "2%" }}
Documents
The documents a claim or a renewal runs on, normalized to one shape.
GET/loss-runs/:id
A normalized loss run: claims and incurred losses for a policy over a stated period.
{ "type": "OK", "lossRun": "lr_4482tx_5y", "policy": "HO3-4482-TX", "years": 5, "claims": 2, "incurred": 22610, "valued": "2026-07-31"}
GET/acord-forms
ACORD forms, normalized. Filter by form number.
GET/cois
Certificates of insurance at ACORD 25 grain.
GET/eobs
Explanations of benefits, normalized.
Events
Webhooks carry each reserved act's result back to your product. decision.issued and policy.bound release the meter; claim.paid and documents.issued are records.
EVENTdecision.issued
The adjuster's decision and their attestation, with the pay clock it starts. A denial is a decision too, and arrives with its reasons.
{ "event": "decision.issued", "claim": "clm_8f3ka92", "stage": "decide", "status": "DECIDED", "decision": { "outcome": "approved", "by": "licensed_adjuster", "license": "TX all-lines adjuster", "attestation": "att_71b0e4", "at": "2026-07-29T15:20:00Z" }, "clocks": { "pay": { "rule": "TX: 5 business days", "started": "2026-07-29", "due": "2026-08-05" } }, "meter": "released"}
EVENTclaim.paid
The payment record once the payment is issued, with the decision it pays.
{ "event": "claim.paid", "claim": "clm_8f3ka92", "stage": "pay", "status": "DECIDED", "decision": { "outcome": "approved", "by": "licensed_adjuster", "attestation": "att_71b0e4", "at": "2026-07-29T15:20:00Z" }, "payment": { "record": "pay_20c4d1", "amount": 14210, "currency": "USD", "issued": "2026-07-31" }}
EVENTpolicy.bound
The bound policy number and its effective date, once a licensed producer binds.
{ "event": "policy.bound", "quote": "qt_31c8f0", "policy": "PAP-7741-TX", "effective": "2026-08-03", "meter": "released"}
EVENTdocuments.issued
The policy's documents: ID cards and the declarations page.
{ "event": "documents.issued", "policy": "PAP-7741-TX", "documents": ["id_cards", "declarations"]}
How it refuses
A refusal is typed and worded, never a bare status code. The page your agent reads says what to do next.
| Status | Type | When |
|---|---|---|
200 | EMPTY | A filter matched nothing. The body says what was asked. |
401, 403 | BLOCKED | A key or scope can't reach this route. Reserved scopes answer with a worded reason. |
402 | OFFER | The request would pass your spend ceiling. The body carries the re-authorization offer. |
404 | The claim, quote or policy doesn't exist. | |
422 | The request is missing a required field, such as the loss date or state on a first notice. |