Insurance Data Sharing — Requirements v2.110 min read
The Authentication requirements, Authorization requirements, and User Journeys must be adhered to.
The tables below list the rules that apply to Insurance Data Sharing. All request validation of the TPP's credentials, access token, and consent 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. The cross-cutting Policy Access Validation check applies to GET /{type}-insurance-policies/{InsurancePolicyId}. Insurance has a five-year data retention floor — your Ozone Connect endpoints MUST return policies from the last five years regardless of current PolicyStatus; there is no status-based 403.
Consent Validation
When a TPP creates an insurance consent, the API Hub calls your POST /consent/action/validate endpoint before the consent is created. You MUST validate the consent and respond with status: "valid" or status: "invalid". If you respond with invalid, the API Hub will not create the consent and the TPP will receive an error. This validation runs before the customer is involved — there is no authentication or authorization at this stage. The purpose is to reject consents early that your systems cannot fulfil. The field names in the rules below match the Ozone Connect newConsent payload the Hub delivers — consentType is cbuae-insurance-consents, standardVersion sits at the top level of the consent object, and Permissions sits under consentBody.Data as an array of { InsuranceType, Permissions[] } blocks.
standardVersionstandardVersion (a top-level property on the consent object) is the URL path version the TPP will call on subsequent insurance requests. If you do not support that version for the Insurance API family, respond with invalid.Where you are dual-running multiple versions during a deprecation window (see Major Version Deprecation) — for example
v2.0 alongside v3.1 — you MUST respond valid for every version you serve.Minor versions are backward compatible (see Version Management), so prior minors within each major you run are also valid (e.g. running
v2.0 and v3.1 means v2.0, v3.0, and v3.1 all resolve to valid).InsuranceTypeconsent.Permissions references an InsuranceType the LFI does not underwrite (e.g. the LFI does not offer Renters products but the consent requests Renters), respond with invalid. Validate against the sectors you have onboarded with Nebras.ReadCustomerClaims for Motor but the LFI does not yet expose claims for Motor policies), respond with invalid.ReadInsurancePolicies required per sectorReadInsurancePolicies — it is the base permission that gates list and detail access. If a block omits it, respond with invalid.BaseConsentIdBaseConsentId, validate that:- The
BaseConsentIdreferences an existing consent known to the LFI. - The referenced consent is an Insurance Data Sharing consent (
authorization_details[0].typeisurn:openfinanceuae:insurance-consent:*). - The referenced consent does not itself have a
BaseConsentId— if it does, the TPP has incorrectly linked to an intermediate consent in the chain rather than the root consent. TheBaseConsentIdmust always reference the original root consent.
invalid.List Policies (per sector)
/{type}-insurance-policiesThe Hub calls this endpoint with the sector slug (employment, health, home, life, motor, renters, or travel) baked into the path and passes InsurancePolicyIds as a query parameter listing the IDs the consent authorised for that sector.
InsurancePolicyIdsInsurancePolicyId matches one of the values in the InsurancePolicyIds query parameter and whose sector matches the URL path. Populate the PolicyStatus field on each policy so the TPP can see the current state.PolicyStatus. This is a minimum availability floor, not a query limit — the endpoint MAY return policies older than five years where it holds them. A PolicyStatus of Expired, Lapsed, Cancelled, Surrendered, etc. MUST NOT cause the policy to be omitted from the response within the retention window.InsurancePolicyId, PolicyNumber, PolicyStatus, Insurer, and the sector-specific identifiers.PremiumReadInsurancePremium, populate the Premium field on each policy in either the cleartext or JWE shape per Premium Encryption. If the consent does not include ReadInsurancePremium, omit the Premium field entirely — do not return an empty object or a placeholder.ReadCustomerBasic / ReadCustomerDetail for policy-holder identity; ReadCustomerPaymentDetails for payment methods; ReadInsuranceProduct for underwritten product detail; ReadCustomerClaims for claims history. Fields the consent does not unlock MUST be omitted.page query parameter on the TPP-facing API, and Meta MUST NOT include TotalPages or TotalRecords. The full consented set for the sector MUST fit in one payload.200 with an empty Policy array. Do not return 404.InsurancePolicyId in the InsurancePolicyIds query parameter, validate that the policy is held — or was held within the five-year window — by the customer resolved from o3-psu-identifier. If any requested policy is not held by the customer, return 403 per Policy Access Validation.Get a Policy
/{type}-insurance-policies/{InsurancePolicyId}policyInsurancePolicyId matches the value in the path parameter and whose sector matches the URL path.PolicyStatus, provided its end date (or last activity date) is within the last five years. There is no status-based 403 on this endpoint — the policy is the artifact, and the customer has consented to share it.PremiumReadInsurancePremium, populate Premium in either the cleartext or JWE shape per Premium Encryption. Otherwise omit the field.InsurancePolicyId in the path parameter is part of the consented set held by the customer resolved from o3-psu-identifier. Apply the Policy Access Validation check before returning — an ID outside the consented set MUST return 403 with errorCode: Consent.PermanentPolicyAccessFailure.Policy Access Validation
Every endpoint that takes a policy identifier — whether as the InsurancePolicyId path parameter on GET /{type}-insurance-policies/{InsurancePolicyId} or as values in the InsurancePolicyIds query parameter on GET /{type}-insurance-policies — MUST validate that each policy is part of the consented set held by the customer resolved from the o3-psu-identifier header before applying the per-endpoint rules above. Policy ownership is authoritative on the LFI side — the Hub stores the insurancePolicyIds patched onto the consent at authorization, but the LFI is the source of truth for which policies the customer actually holds or has held.
If any requested policy is not part of the consented set, return 403 with errorCode: Consent.PermanentPolicyAccessFailure and errorMessage: The policy is permanently inaccessible. This check applies uniformly regardless of PolicyStatus — a policy that is Lapsed or Expired is still readable provided it is in the consented set; a policy that is Active but outside the consented set MUST NOT be returned.
