Model Insurer — Quotation 4 min read
The Model Insurer supports the Insurance Quotation journeys — New, Renewal and Switch — across every sector it underwrites. This page explains the one thing you need to get a quote returned, and then how to progress that quote along the happy path as far as a TPP can drive it.
The Quotation requests in the Insurance v2.1 Postman collection are pre-configured with the reference values and messages described here, so you can run the flow end to end without editing anything.
Use a recognised QuoteReference
The Model Insurer returns a quote only for a fixed set of QuoteReference values. Every other reference is a well-formed request that the insurer simply declines to quote.
Create a quote with a client_credentials access token (scope insurance) and set Data.QuoteReference to one of the values below. The -01 reference returns an Available quote (a priced quote you can accept); the -02 reference returns a Pending quote (the insurer will price it asynchronously).
| Sector | Endpoint | Available (-01) | Pending (-02) |
|---|---|---|---|
| Motor | POST /motor-insurance-quotes | cbuae-motor-2.1-01 | cbuae-motor-2.1-02 |
| Health | POST /health-insurance-quotes | cbuae-health-2.1-01 | cbuae-health-2.1-02 |
| Employment | POST /employment-insurance-quotes | cbuae-employment-2.1-01 | cbuae-employment-2.1-02 |
| Home | POST /home-insurance-quotes | cbuae-home-2.1-01 | cbuae-home-2.1-02 |
| Life | POST /life-insurance-quotes | cbuae-life-2.1-01 | cbuae-life-2.1-02 |
| Renters | POST /renters-insurance-quotes | cbuae-renters-2.1-01 | cbuae-renters-2.1-02 |
| Travel | POST /travel-insurance-quotes | cbuae-travel-2.1-01 | cbuae-travel-2.1-02 |
QuoteReference (for example QTE-2024-001) returns 204 No Content — the insurer has declined to quote, and no quote resource is created. If the request body itself is invalid you get a 400 instead; fix the body before assuming the reference is wrong.A full create request for an Available Motor quote:
POST /open-finance/insurance/v2.1/motor-insurance-quotes
Host: rs1.altareq2.sandbox.apihub.openfinance.ae
Authorization: Bearer {client-credentials token, scope: insurance}
Content-Type: application/json
{
"Data": {
"QuoteReference": "cbuae-motor-2.1-01",
"QuoteType": "New",
"CustomerId": "CUST-2024-001",
"PolicyIssuanceRequest": { "CustomerVerification": false, "Payment": false, "PolicyDocuments": false },
"VehicleDetails": { "Make": "Toyota", "Model": "Camry", "ModelYear": "2023", "Trim": "SE", "BodyType": "Saloon", "Specification": "GCC", "NoOfPassengersIncDriver": 5, "EngineProperties": { "EngineType": "InternalCombustionEngine", "EngineCapacity": "2500", "CylinderCapacity": "4" } },
"MainDriver": { "DateOfBirth": "1990-05-15", "Gender": "Male", "Nationality": "ARE", "DrivingLicenseHistory": { "TimeDrivingInUAE": "P3Y" }, "MotorClaims": { "MotorClaimInLast24Months": false, "NoClaimsCertificate": "2Years" } },
"Policy": { "PolicyStartDate": "2026-04-15", "PolicyEndDate": "2027-04-14", "RegistrationType": "New", "Takaful": false, "CarUsage": "Private", "CarValuation": { "Amount": "75000.00", "Currency": "AED" } },
"CarRegistration": { "EmirateOfRegistration": "Dubai", "DateOfFirstRegistration": "2023-06-15" }
}
}201 Created
{
"Data": [
{
"QuoteId": "cd96bc4d-9ba7-43ff-a577-c88bdb8cce73",
"QuoteStatus": "Available",
"QuoteReference": "cbuae-motor-2.1-01",
"CreationDateTime": "2026-04-05T10:43:07Z",
"Premium": {
"PremiumAmountExcludingVAT": { "Amount": "100.00", "Currency": "AED" },
"VATAmount": { "Amount": "5.00", "Currency": "AED" },
"TotalPremiumAmount": { "Amount": "105.00", "Currency": "AED" },
"PaymentFrequency": "Annually"
},
"Commission": { "CommissionAmount": { "Amount": "100.00", "Currency": "AED" }, "PaymentMethod": "DirectToTPP" }
}
],
"Links": { "Self": "https://rs1.altareq2.sandbox.apihub.openfinance.ae/open-finance/insurance/v2.1/motor-insurance-quotes" },
"Meta": {}
}Create, accept, and issue a policy
Every call below is made to the API Hub resource server (rs1.) with the same client-credentials token. The sequence is identical for New, Renewal and Switch, and for every sector.
Create the quote
POST /<sector>-insurance-quotes with a recognised -01 reference → 201. Keep the QuoteId and the whole quote object from the response — the Accept message is built from it.
Retrieve the quote
GET /<sector>-insurance-quotes/{QuoteId} → 200. Optional, but it confirms the QuoteStatus before you accept.
Accept the quote
PATCH /<sector>-insurance-quotes/{QuoteId} with a signed request object whose message.Data.QuoteStatus is ApplicationPending → 200. The quote now reads ApplicationPending. See Building the Accept message for the fields it must carry.
Capture KYC (TPP-Led only)
On TPP-Led flows, PATCH …/{QuoteId} again with QuoteStatusKYCCaptured and a Documents array → 200. LFI-Led flows skip this step.
Create the policy
POST /<sector>-insurance-policies with a signed request object carrying the QuoteId → 201, returning an InsurancePolicyId.
ApplicationPending and KYCCaptured are the two statuses a TPP sets directly on a quote; see What the LFI does next for everything after that.
The Accept-Quote message, field by field
The PATCH body is a PS256-signed request object (application/jwt) wrapping a message. Build the message from the quote the insurer returned, not from hard-coded values — the fields must agree with that quote.
// Signed as a request object (application/jwt) and sent as the PATCH body.
{
"aud": ["https://auth1.altareq2.sandbox.apihub.openfinance.ae"],
"iss": "{your client_id}",
"iat": 1775385600,
"exp": 1775385900,
"nbf": 0,
"message": {
"Data": {
"QuoteReference": "cbuae-motor-2.1-01",
"QuoteStatus": "ApplicationPending",
"QuoteCreationDateTime": "2026-04-05T10:43:07Z", // = the quote's CreationDateTime
"InsuranceSubType": "Comprehensive Basic", // chosen by the TPP
"Premium": { "...": "echoed from the quote" },
"Commission": { "PaymentMethod": "DirectToTPP" }, // CommissionPercentage removed
"CustomerSalary": "Over4K" // required for Health; optional elsewhere
}
}
}The message.Data object must satisfy all of these:
QuoteReference— the reference you quoted on.QuoteStatus—ApplicationPendingto accept (orKYCCapturedon the KYC step).QuoteCreationDateTime— copy the quote'sCreationDateTimevalue.InsuranceSubType— a sub-type string chosen by the TPP (the quote does not supply one), e.g.Comprehensive Basic.Premium— echo thePremiumobject from the quote.Commission— echo the quote'sCommission, withoutCommissionPercentage(that property is not allowed in this message).CustomerSalary(Under4K|Over4K) — required for Health; accepted and optional for the other sectors.
PolicyIssuanceRequest (the TPP-Led flows set its flags to true), carry the same object through on the Accept and KYC messages.Statuses beyond ApplicationPending and KYCCaptured
A TPP drives a quote only as far as ApplicationPending / KYCCaptured, and can then create the policy. The remaining lifecycle is the insurer's to drive.
The later quote statuses — ApplicationApproved, PaymentRequired, PolicyIssued, Completed and the terminal states — are set by the LFI, which patches the quote through the API Hub Consent Manager (PATCH /<cm-version>/insurance-quote-log/{QuoteId}). In the Model Insurer sandbox those updates are performed by the insurer, not by the TPP: your transport certificate authenticates you as a TPP, so the quote-log endpoint is not yours to call.
For TPP functional testing this means the happy path you exercise is Create → Accept (→ KYC) → Create Policy. The create-policy response returns the InsurancePolicyId the insurer allocated for the issued policy.
// Signed as a request object (application/jwt).
{
"aud": ["https://auth1.altareq2.sandbox.apihub.openfinance.ae"],
"iss": "{your client_id}",
"iat": 1775385600, "exp": 1775385900, "nbf": 0,
"message": { "Data": { "QuoteId": "cd96bc4d-9ba7-43ff-a577-c88bdb8cce73" } }
}Running it from the collection
In the Insurance v2.1 Postman collection, under Insurance v2.1 → Quotation, each sector has New, Renewal and Switch flows in both LFI-Led and TPP-Led variants. Every Create Quote is set to the sector's Available reference, and the Accept and KYC steps build their messages from the returned quote. Run a flow top to bottom to go from create through to an issued policy; the LFI-API Hub steps shown in each flow illustrate the insurer-side quote-log updates described above.
