GUIDES
Quickstart
Push one certificate and read the result, in two calls. Everything on this page runs on a test key with nothing to configure first. The surface check comes back as soon as extraction finishes, and the verdict within 72 business-day hours on a live key.
The base URL is https://api.insuranceverified.ai/v1. Every path below is relative to it. The machine-readable contract is at /v1/openapi.yaml. Generate your client from that file.
-
Get a test key
Request an account for your organization and you receive a test key, prefixed
ive_test_. Send it asAuthorization: Bearer <key>. Every test key arrives with a sample consumer,consumer_ref: sample, that already holds a published starter requirement set.Test mode simulates outreach and marks every result
test: true. -
Push a document
POST /documentsasmultipart/form-data. The file field isfiles, repeated once per file, andfiles[]is accepted as an alias. Add aninsured_refof your choosing and aconsumer_refofsample. You get201 Createdback with one object: atransmission_idfor the call,idempotent_replay, theengagement_id, and adocuments[]array carrying anid, the contentsha256, andcontent_bytes_deduplicatedper file. The receipt carries no document status, because extraction runs after the response.Send an
Idempotency-Keyheader. A replay returns this same body withidempotent_replay: true, and creates no second transmission.On a test key the whole lifecycle runs in about a minute: Insurance Verified reads the file, issues the surface check, opens the clocks, sends the question to a simulated agent of record, reads the answer, and issues the line verdicts and the roll-up. No email or call goes out. Add
test_scenarioto the push to choose the answer.test_scenarioWhat the simulated agent does confirmedConfirms the line. The default refusedDeclines to confirm contradictedReports the policy cancelled unclearSends a vague reply that goes to reviewer triage silentSends nothing. The clock runs out in five minutes and the line times out The first document creates the insured and its engagement against
sample's requirement set. Read the whole verification back with the receipt'sengagement_id.To open the clocks with no outreach running, create the engagement first with
outreach: holdonPOST /engagements. Release it later by postingoutreach: autoon the same call. -
Read the surface check, in about a minute
GET /insureds/{insured_ref}/verdicts?consumer_ref=samplereturns the surface check once extraction has run.consumer_refis required, and leaving it off returns422. The body is{data, next_cursor}, newest first. Each entry carrieskind: surface, astatus, andrules[]naming what the paper claims against each rule.Branch on
rules[].surfaceat this stage.rules[].resultreadsunverifiedwith reasonverification_pendinguntil the source answers. -
Get the verdict
Run the same call again later. A verdict carries
kind: verifiedandscope: line, one per coverage line, as soon as that line resolves at the source: confirmed, refused, contradicted, or timed out. A roll-up for the whole engagement,scope: engagement, follows whenever it changes.GET /verdicts/{verdict_id}reads one by id and returns the bare object with nodatawrapper.Branch on
statusand onrules[].result. A verified verdict carries nosurfacefield, andresultcarries the outcome.
A line reads
verifiedwhen a source behind the policy confirms it is in force with the stated terms, with proof attached. A certificate on its own readsclaimed.
What the sample requirement set asks for
One rule. A compliant result against sample covers this rule only.
| Rule | Value | Proof it demands |
|---|---|---|
general_liability.limit_min.each_occurrence |
At least $1,000,000 | A certificate, confirmed by the broker |
The wording on a sample result reads "all 1 requirement". Publish your own consumer's rules before you read a pass as coverage.
Getting a request_id without a webhook
GET /insureds/{insured_ref}/requests?consumer_ref=sample lists the clocks on the engagement, newest first. Take a request_id from it, then call GET /requests/{request_id} for the detail or POST /requests/{request_id}/extend to add hours to the hard stop. The push receipt carries no request_id, because no clock is open when it returns.
Reading the whole verification
GET /engagements/{engagement_id} returns the whole verification in one object: identity, the requirement set it follows, the surface check, the verdict, per-line verdicts, the coverage lines with their clocks, the documents behind them, and the event trail. Poll it with the engagement_id from the push receipt.
What to configure next
| Step | Where | Why |
|---|---|---|
| Push your real consumer's rules | POST /consumers/{consumer_ref}/requirement-sets |
Every result is measured against a requirement set. sample is ours |
| Choose how results reach you | PUT /delivery |
Webhook, scheduled batch file, or both |
| Send outreach from your own domain | Settings, then Sending, in the portal | Agents see your company as the sender. See Send from your own domain |
Changelog
| Date | Change |
|---|---|
| 2026-10-06 | Spec 1.0.0-draft.13. The webhook envelope lists test. document.unreadable_fields and insured_contact.missing join the event schemas. close_reason lists surface_not_passed. Reason codes list policy_form_unconfirmed, policy_form_not_accepted, certificate_text_*, certificate_holder_mismatch, program_unverified, human_review_pending, and coverage_deleted_on_face. The /outreach-identity operations are removed. The verdict status enum drops grace |
| 2026-10-01 | Photos pushed together are read as one packet. A page with no policy number goes to review, and a page marked not usable fires remediation.opened |
| 2026-09-30 | Programs and enrollments, insured aliases, and received_at and channel on POST /documents |
| 2026-09-28 | Insured contact (name, email, phone) on PUT /insureds/{insured_ref} |
| 2026-09-25 | Delivery (webhooks and batch files) and the insured, coverage, and document reads go live |
| 2026-09-23 | Several requirement sets per consumer, named by key, with one engagement per requirement set |
| 2026-09-15 | GET /documents/{document_id} goes live. Requirement sets accept the SOP as text |
| 2026-09-10 | A low-confidence read gets a second read. document.unreadable_fields and document.not_insurance fire. Engagements on outreach: hold do not time out |
| 2026-09-09 | Engagements carry outreach: auto or hold |
| 2026-09-08 | Test mode for ive_test_ keys. GET /verdicts/{verdict_id}, GET /insureds/{insured_ref}/verdicts, GET /requests/{request_id}, and POST /requests/{request_id}/extend go live. One error envelope on /v1 |
| 2026-09-04 | The surface check reads each requirement as pass, fail, or not_yet |
| 2026-09-02 | Verdicts per coverage line, clock extensions, and the sample consumer on test keys |
Versioning
Every path sits under /v1. The spec's info.version in /v1/openapi.yaml names the current revision, 1.0.0-draft.13. Within v1, new optional fields, endpoints, and event types can appear at any time. Ignore fields and events you do not know. An incompatible change ships as /v2 alongside /v1. When a new version ships, the prior version stays supported for 12 months and its retirement date is announced the same day.
Status
Insurance Verified reports service status on request. Email support@insuranceverified.ai.