Configuration-Driven
The Policy API works with the Configuration API. The same field definitions you configure — policy fields, exposure fields, option sets — are the fields you write when creating policies through transactions.- Configure your insurance program — define fields, option sets, exposure types
- Create policies via
POST /transaction/new-business - Manage the lifecycle — endorse, cancel, reinstate, renew
- Query state — get a policy at any point in time, see full audit trail
Core Concepts
Transactions
Policies are modified through immutable transactions. Each transaction records what changed and produces a new policy version.| Transaction | Description |
|---|---|
| New Business | Creates a new policy with initial state |
| Endorse | Modifies an existing policy (add/remove exposures, change fields) |
| Cancel | Cancels a policy from a given date |
| Reinstate | Reinstates a previously cancelled policy |
| Renew | Renews a policy for a new term |
Segments
A segment is a date range where policy state is identical. Segments are derived from final state — they are not one-to-one with transactions. Adjacent segments with identical data are automatically merged. For example, three transactions can produce a single segment if the net effect returns the policy to a uniform state across the term.Versions
Each transaction produces a new version with a complete set of segments representing the full policy timeline. You can query any historical version. For a deeper explanation of these concepts, see Concepts. For how transactions place changes in time —effectiveDate vs transactionTimestamp, backdating, and booking ahead — see Effective Dates & the Policy Timeline. For a full worked example tracing 9 transactions through a realistic policy lifecycle, see the Lifecycle Walkthrough.
API Endpoints
Transactions (write)
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/policies/transaction/new-business | Create a new policy |
| POST | /v1/policies/{policyId}/transaction/endorse | Endorse an existing policy |
| POST | /v1/policies/{policyId}/transaction/cancel | Cancel a policy |
| POST | /v1/policies/{policyId}/transaction/reinstate | Reinstate a cancelled policy |
| POST | /v1/policies/transaction/renew | Renew a policy for a new term |
| DELETE | /v1/policies/{policyId}/transactions/{transactionId} | Delete most recent transaction |
Queries (read)
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/policies/list | List policies (latest version per policy, with segment scope filtering) |
| GET | /v1/policies/versions | List policy versions across all policies |
| GET | /v1/policies/{policyId}/versions/{version} | Get a specific policy version with segments |
| GET | /v1/policies/{policyId}/versions | List versions for a single policy |
| GET | /v1/policies/{policyId}/transactions | Transaction audit trail |
| GET | /v1/policies/{policyId}/transactions/{transactionId} | Get a single transaction with deltas |
Reporting
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/policies/bordereau | List bordereau rows (paginated JSON) |
| GET | /v1/policies/bordereau/download | Download bordereau as CSV |
| POST | /v1/policies/bordereau/export | Export bordereau to Google Sheets |
| GET | /v1/policies/{policyId}/earned-premium | Earned premium for a single policy |
| GET | /v1/policies/list/earned-premium | Earned premium for multiple policies |
| GET | /v1/policies/aggregate/earned-premium | Aggregate earned premium across policies |
Validation
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/policies/{policyId}/validate | Validate a single policy’s data consistency |
| GET | /v1/policies/validate | Validate multiple policies in batch |
Configuration
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/entities/Policy/configuration | Get field configuration |
Permissions
| Operation | Permission |
|---|---|
| List, Get, Configuration, History, Reporting (Earned Premium, Bordereau), Validation | company.policy:read |
| New Business, Renew | company.policy:create |
| Endorse, Cancel, Reinstate | company.policy:update |
| Delete Transaction | policy:delete |
Example: Create a Policy
Request
POST /v1/policies/transaction/new-business
fullTermPolicyInfo.policyStartDate / policyEndDate.
Response
201 Created
Key Points
- Term bounds come solely from
fullTermPolicyInfo.policyStartDate/policyEndDate— there are no top-level date parameters fieldModelV1Data.policycontains all policy-level fields — including any embedded exposure fields your configuration defines (e.g.primaryInsured/additionalExposuresin the default configuration). Their shape is whatever your tenant configuration says; they are validated per-field like any other field. From those embedded values the framework-requiredreferencedExposurescalculated field derives the flat list of Exposure ids the policy references — see Referenced ExposurespolicyStatus("active"/"cancelled") is a segment-scoped policy field — not part offullTermPolicyInfofullTermPolicyInfois required on every policy and must carry the primary-insured identity:primaryInsuredJoin(the UUID of an existing Exposure — create it first via the Exposures API) andprimaryInsuredName(its display name). These two fields are the only exposure-related values the platform itself requiresfullTermPolicyBillingInfois optional (a policy may carry no billing info);fullTermPolicyRatingResultis optionaltransactionTimestampis optional — defaults to the current time if omitted. When set explicitly on a later transaction it must be>=the latest already on the policy (the audit axis only moves forward); effective dates may still backdate freely. See Effective Dates & the Policy Timeline- A transaction’s
effectiveDatemust fall within the term (policyStartDate <= effectiveDate <= policyEndDate) — outside the term it is rejected with400. For howeffectiveDaterelates totransactionTimestampand to each delta’sstartDate, see Effective Dates & the Policy Timeline
