The contract
NormalizedIngestionPayload
A source the platform has never seen is one adapter away — not a new pipeline, and not a change to anything downstream of it.
Policy Ingest API
Your systems POST policy and consumer data directly. Authenticated, idempotent, rate limited per agency.
Canopy Connect webhook
Carrier pulls arrive as they complete — policies, claims, vehicles, drivers, documents.
Browser extension
Producers capture carrier portal data in place, without an export or a file hand-off.
Mailboxes connect through Microsoft Graph or Nylas. Threads, attachments, and carrier notices land as first-class records.
NormalizedIngestionPayload
Every source resolves to one contract: source type, agency, raw payload, consumer identifiers, policies, documents, metadata. Adding a source means writing one adapter, not a second pipeline.
Policy Ingest API
POST /api/v1/policy-ingest
Your systems submit a policy record directly. The response is immediate; analysis runs after and lands on your webhook.
Required headers
AuthorizationBearer sk_live_REDACTEDClient secret, issued once at credential creation and never stored in plain text on our side.
X-Client-ID44444444-4444-4444-8444-444444444444Your agency identifier.
X-Request-ID55555555-5555-4555-8555-555555555555Unique per request, for tracing.
X-Request-Timestamp2026-08-17T12:00:00.000ZISO 8601. Requests outside the replay window are rejected.
Idempotency-Key66666666-6666-4666-8666-666666666666Repeat a key and you get the original response back, not a duplicate ingest.
Security model
Every request is credentialed, bounded, and logged
Nothing here is optional configuration you have to remember to turn on.
| Control | What it does |
|---|---|
| Credentialed requests | Bearer secret plus a client ID header. Secrets are stored only as bcrypt hashes and shown once at creation. |
| Replay protection | Requests carry a signed timestamp and are rejected beyond a five-minute window. |
| Idempotency keys | A repeated key returns the original response instead of ingesting twice. |
| IP allowlisting | Optional per-agency source-address restriction, enforceable as a hard requirement. |
| Per-agency rate limits | Throughput is bounded per tenant, so one integration cannot affect another. |
| Signed callbacks | Webhooks to your endpoint carry an HMAC-SHA256 signature you verify before trusting the body. |
Scale
A robust book loads the same way it runs
Loading years of existing records is not a separate code path from the traffic that follows it.
History loads without special handling
Mailboxes backfill on request
Ingestion does not block on analysis
Throughput is bounded per tenant
Spend is measured per call
Webhooks back
Results land on your endpoint, not ours
Each agency configures its own webhook URL and chooses which events to receive.
consumer_ai_completeConsumer-facing analysis has finished for a submission.
agent_analysis_completeProducer-facing analysis has finished for a submission.
Aggregators and networks
One integration pattern, repeated per member
A network sending data on behalf of many member agencies uses the same contract as a single agency does — once per member, with isolation between them.
Credentials and ingestion per member
Onboard a member without a deployment
Unstructured material
Not everything arrives as a payload
Two upload paths cover the material that never comes through an adapter — the declaration page someone emails you, and the guidance your agency writes for itself.
Document upload
Knowledge base upload
What happens next
A payload doesn't stop at storage
Ingestion is the first of three steps before your team sees anything.
- Step 1
Normalization
Every source resolves to one contract: source type, agency, raw payload, consumer identifiers, policies, documents, metadata. Adding a source means writing one adapter, not a second pipeline.
- Step 2
Consumer resolution
Identifiers on the payload are matched against existing records for that agency, or a new consumer is created. Everything downstream is scoped to the resolved entity.
- Step 3
Hand-off to analysis
Analysis runs against a deliberately assembled entity dossier rather than whatever happened to be in the prompt.