Validate · Enforce · Trust

Insurance Quotation — Requirements v2.112 min read

The Insurance Quotation flow runs on the Client Credentials Grant — there is no per-customer consent. TPPs authenticate as themselves, request a quote, and (where the customer accepts) drive the application through to policy issuance. Your Ozone Connect endpoints execute the quote and policy lifecycle; status updates flow back to subscribed TPPs through the Hub.

The tables below list the rules that apply to Insurance Quotation. All request validation of the TPP's credentials, access token, and OpenAPI schema is performed by the Hub before your Ozone Connect endpoints are called. The rules below cover what your Ozone Connect endpoints must validate and what they must return, and what your LFI must emit through the PATCH /insurance-quote-log/{logId} callback to keep the Hub and any subscribed TPP webhooks in sync.

01 Endpoint

Create Quote

POST/{type}-insurance-quotes

When a TPP requests a quote, the Hub validates the access token and OpenAPI schema, then proxies the request to your Ozone Connect POST /{type}-insurance-quotes endpoint with the sector slug (employment, health, home, life, motor, renters, or travel) baked into the path. Your endpoint receives the customer's quote request and either returns one-or-more quotes (201) or declines to quote (204).

#
Rule
Detail
1
Sector support
The sector slug in the URL path indicates which insurance type the TPP is requesting. If your LFI does not underwrite the requested sector, return 404. Only mount endpoints for sectors you actually offer; the Hub will not route requests for unmounted sectors.
2
Quote Type
The request body carries a QuoteType of New, Renewal, or Switch. See Quote Types for the per-type validation differences (e.g. Renewal references a prior policy, Switch references an incumbent insurer). If the requested QuoteType cannot be supported for the sector (e.g. the LFI does not support switching for Travel), return 204 with an empty body.
3
Multi-quote response
The 201 response carries a data array of one-or-more quotes. Each entry must include a unique QuoteId the LFI generates and persists — the TPP uses this ID to retrieve, accept, or reject the quote. Populate every field marked required by the per-sector quote schema.
4
Decline to quote
If your underwriting rules cannot produce any quote that meets the request (e.g. risk profile out of appetite, vehicle/property out of supported scope), return 204 with an empty body. Do not return a 201 with an empty data array.
5
Quote validity window
Each QuoteId MUST remain retrievable and acceptable for the validity period the LFI advertises on the quote (typically 14–30 days). After expiry, retrievals MUST still return the quote in a Expired terminal state via the quote-log rather than 404 — TPPs need to be able to display an expiry reason.
6
No subscription handling
The Subscription object on the request body is the TPP's webhook configuration. It is consumed by the Hub for event delivery — the LFI MUST NOT act on it. The LFI's only obligation is to emit status events via PATCH /insurance-quote-log/{logId}; the Hub fans those out to any subscribed TPP webhook.
02 Endpoint

Retrieve Quote

GET/{type}-insurance-quotes/{QuoteId}
#
Rule
Detail
1
Quote ownership
Return the quote only if the QuoteId was created in response to a request from the same TPP (identified by the Hub via o3-caller-client-id). If the quote belongs to a different TPP, return 404 — do not leak quote existence across TPPs.
2
Sector match
The sector slug in the URL path MUST match the sector the quote was created under. A motor QuoteId requested via /home-insurance-quotes/{QuoteId} MUST return 404.
3
Current state
Return the quote in its current state. If the quote has progressed past Accepted into the application lifecycle, include the latest QuoteStatus drawn from the same vocabulary the LFI emits on the quote-log (see Status Updates).
03 Endpoint

Accept Quote

PATCH/{type}-insurance-quotes/{QuoteId}

The TPP calls PATCH on the quote to indicate the customer has accepted, kicking off the application lifecycle. The response declares PolicyIssuanceAllowed — the steps the LFI permits the TPP to handle (TPP-Led mode) or retains for itself (LFI-Led mode). This declaration drives whether the TPP collects KYC, hosts payment, and issues policy documents, or whether your LFI does.

#
Rule
Detail
1
Quote ownership
Accept the PATCH only if the QuoteId was created in response to a request from the same TPP. Reject with 404 otherwise — do not return 403 (which would confirm the quote exists).
2
Quote validity
If the quote has expired or has already been progressed past Accepted, reject with 409. The TPP should retrieve the quote to see its current state.
3
PolicyIssuanceAllowed — LFI-Led
For LFI-Led quotes (your LFI hosts customer verification, payment, and documents), return 204 with no body. The TPP knows the quote has been accepted and will await status updates emitted through the quote-log.
4
PolicyIssuanceAllowed — TPP-Led
For TPP-Led quotes, return 200 with data.PolicyIssuanceAllowed set to the steps the TPP may perform: CustomerVerification, Payment, and PolicyDocuments. All three booleans are required. Where the TPP hosts payment, the LFI MUST emit a PaymentRequired or ApplicationApproved event with a BrokerInstructions[].Url that the TPP redirects the customer to (see Status Updates).
5
Subscription not consumed by LFI
The Subscription object is the TPP's webhook registration for the Hub's event delivery. The Hub stores it; the LFI MUST NOT act on it. Your only obligation is to emit status events through PATCH /insurance-quote-log/{logId} and the Hub fans them out.
6
Implicit ApplicationPending
Immediately after responding 200 or 204 to the PATCH, the LFI MUST PATCH the quote-log with QuoteStatus: ApplicationPending so the TPP — whether polling or subscribed — sees a consistent first status. This is the entry point to the application lifecycle.
04 Endpoint

Create Policy

POST/{type}-insurance-policies

After the application has been progressed (KYC collected, payment confirmed where the TPP hosts it), the TPP calls POST /{type}-insurance-policies with the originating QuoteId and any data the LFI requires to finalise issuance. The LFI runs its BAU policy creation flow.

#
Rule
Detail
1
QuoteId binding
The request body MUST reference a QuoteId that this TPP previously accepted at this LFI under the same sector. If the quote is not in a state that permits policy issuance (e.g. application has not reached ApplicationApproved on TPP-Led, or the quote is terminal), reject with 409.
2
Quote sector match
The sector slug in the URL path MUST match the sector the quote was issued under. A mismatch MUST return 404.
3
TPP-supplied data
For TPP-Led quotes, the request body carries the KYC data the TPP collected. Validate it against the same rules your LFI applies internally. If any field fails (Emirates ID mismatch, prohibited customer, etc.) reject with 400 and explain via errorCode / errorMessage.
4
Idempotency
If a previous POST /{type}-insurance-policies against the same QuoteId has already produced a policy, return the existing policy reference rather than minting a new one. Repeated calls with the same payload MUST be safe.
5
Status emission
On successful policy issuance, the LFI MUST PATCH the quote-log to PolicyIssued with the issued InsurancePolicyId (LFI-Led) or with Documents attached (TPP-Led) — and then to Completed once any post-issuance work has settled. See Status Updates.
05 Endpoint

Status Updates (Quote Log)

PATCH/insurance-quote-log/{logId}

The quote lifecycle is observable to TPPs through events the LFI emits to the Hub. The LFI PATCHes /insurance-quote-log/{logId} with the new QuoteStatus; the Hub records it and, where the TPP has subscribed via the Subscription object on the original PATCH Accept Quote, delivers an event to the TPP's webhook. logId is the same value as the QuoteId. The event body conforms to one of three schemas drawn from the Hub spec — terminal, pending-completion, or completed.

#
Status
When the LFI emits it
1
ApplicationPending
Immediately after the LFI responds to PATCH Accept Quote. Signals that the application has been registered and is awaiting next steps (KYC for TPP-Led, internal processing for LFI-Led).
2
ApplicationApproved
TPP-Led only. The LFI has approved the application based on TPP-supplied KYC and is ready for the customer to pay. The event MUST include a BrokerInstructions array containing a Url (the LFI-hosted payment page) for the TPP to redirect the customer to.
3
PaymentRequired
Used where payment hand-off occurs outside the standard ApplicationApproved transition (e.g. mid-flow premium adjustment). Carries BrokerInstructions with the payment URL.
4
PolicyIssued
The LFI has issued the policy. On LFI-Led, attach the InsurancePolicyId. On TPP-Led, attach the policy Documents (Policy Booklet, Terms & Conditions, etc.) as base64 with SHA-256 hashes so the TPP can verify integrity and surface them to the customer.
5
Completed
Final terminal state for a successful flow. Carries the finalised Premium breakdown, PolicyTerm, PolicyStartDate/PolicyEndDate, CustomerPaidInFull, PolicyCountrySubDivision, and (where applicable) the Commission due to the TPP. No further events follow.
6
Expired / Rejected / CustomerCancelled / LFICancelled
Negative terminal states. Emit when the quote times out, the LFI declines to proceed, the customer abandons, or the LFI cancels mid-flow. Include a free-text Reason where possible. No further events follow.
#
Rule
Detail
1
Status ordering
The LFI MUST NOT emit a later status before an earlier one. The valid forward sequence is: ApplicationPending → (optional ApplicationApproved / PaymentRequired) → PolicyIssuedCompleted. Any negative terminal status (Expired, Rejected, CustomerCancelled, LFICancelled) may be emitted from any non-terminal state.
2
No status regression
Once a terminal status (Completed or any negative terminal) has been emitted, the LFI MUST NOT emit any further events for that logId. Subsequent PATCHes will be rejected by the Hub with 400.
3
BrokerInstructions URL
When emitting ApplicationApproved or PaymentRequired in TPP-Led mode where the TPP is to host the customer through payment, the BrokerInstructions[].Url MUST be an HTTPS URL the customer can be redirected to. The URL is single-use and tied to the application; the LFI MUST invalidate it after first redemption or after a reasonable session window.
4
Document delivery
When emitting PolicyIssued in TPP-Led mode, all documents that would normally be delivered to the customer (Policy Booklet, Terms & Conditions, IPID, etc.) MUST be attached as base64-encoded Documents entries with matching SHA-256 hashes. The TPP becomes the document delivery channel — the LFI MUST NOT email or post them separately.
5
Reliability
The Hub treats PATCH /insurance-quote-log/{logId} as fire-and-forget from the LFI's perspective once a 204 is returned. If the Hub responds with 4xx or 5xx, the LFI MUST retry with exponential backoff. Lost events leave subscribed TPPs blind to the lifecycle and MUST NOT be tolerated.
06 Section

QuoteId Stewardship

The QuoteId is the single identifier that threads the entire lifecycle — quote retrieval, acceptance, policy creation, and every status update emitted to the quote-log. The LFI is the sole authority for minting QuoteId values.

#
Rule
Detail
1
Uniqueness
Each QuoteId MUST be globally unique within the LFI. UUIDv4 is recommended.
2
Persistence
The LFI MUST persist the QuoteId for the policy retention period applicable to the sector (typically aligned with the five-year retention floor that applies to issued policies). The QuoteId MUST remain retrievable via GET /{type}-insurance-quotes/{QuoteId} even in terminal states for the lifetime of any policy that may have been issued from it.
3
Cross-sector isolation
A QuoteId belongs to a single sector and is not transferable. The same UUID MUST NOT be re-issued for a different sector.
4
TPP scoping
A QuoteId belongs to the TPP that created it. Any GET, PATCH, or POST referencing it MUST verify ownership via o3-caller-client-id before responding.