TPP · Sandbox · Model Insurer · Quotation

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.

01 Getting a quote returned

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).

SectorEndpointAvailable (-01)Pending (-02)
MotorPOST /motor-insurance-quotescbuae-motor-2.1-01cbuae-motor-2.1-02
HealthPOST /health-insurance-quotescbuae-health-2.1-01cbuae-health-2.1-02
EmploymentPOST /employment-insurance-quotescbuae-employment-2.1-01cbuae-employment-2.1-02
HomePOST /home-insurance-quotescbuae-home-2.1-01cbuae-home-2.1-02
LifePOST /life-insurance-quotescbuae-life-2.1-01cbuae-life-2.1-02
RentersPOST /renters-insurance-quotescbuae-renters-2.1-01cbuae-renters-2.1-02
TravelPOST /travel-insurance-quotescbuae-travel-2.1-01cbuae-travel-2.1-02
Any other reference returns 204
A create request that is otherwise valid but carries an unrecognised 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:

Create quote — requesthttp
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" }
  }
}
Create quote — 201 response (abridged)json
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": {}
}
02 The happy path

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.

01

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.

02

Retrieve the quote

GET /<sector>-insurance-quotes/{QuoteId} → 200. Optional, but it confirms the QuoteStatus before you accept.

03

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.

04

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.

05

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.

03 Building the Accept message

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.

Accept-Quote request objectjavascript
// 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 — ApplicationPending to accept (or KYCCaptured on the KYC step).
  • QuoteCreationDateTime — copy the quote's CreationDateTime value.
  • InsuranceSubType — a sub-type string chosen by the TPP (the quote does not supply one), e.g. Comprehensive Basic.
  • Premium — echo the Premium object from the quote.
  • Commission — echo the quote's Commission, without CommissionPercentage (that property is not allowed in this message).
  • CustomerSalary (Under4K | Over4K) — required for Health; accepted and optional for the other sectors.
TPP-Led flows carry PolicyIssuanceRequest
If your Create Quote set PolicyIssuanceRequest (the TPP-Led flows set its flags to true), carry the same object through on the Accept and KYC messages.
04 What the LFI does next

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.

Create-policy request objectjavascript
// 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" } }
}
05 Postman

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.