Skip to main content
The Policies API allows you to manage policies for your company. Policies represent the insurance contracts that have been issued. Key Concepts:
  • Policies are insurance contracts issued to insureds
  • Each policy has a number, primary insured, and effective dates
  • Policies are divided into segments when exposures change mid-term
  • Policies can be created directly for historical imports, or via the quote→bind flow
  • Results are paginated with a fixed page size of 50

API Endpoints

  • List Policies - Retrieve paginated list of policies with filtering and sorting
  • Get Policy - Retrieve detailed policy information including segments, coverages, and rating inputs
  • Create Policy - Create a policy directly (for historical imports)
  • Delete Policy - Soft delete a policy by ID

Policy Segments

When exposures (insureds) are added, removed, or modified mid-term, policies are automatically divided into segments. Each segment represents a period where policy data is constant. Example: A policy running from Jan 1 to Dec 31 has one exposure. On June 1, a second exposure is added. The policy will have two segments:
  • Segment 1: Jan 1 - May 31 (one exposure)
  • Segment 2: Jun 1 - Dec 31 (two exposures)
Each segment includes:
  • Date range (start, end)
  • Status (bound, quoted, cancelled)
  • Premium and base premium totals
  • Full coverage details with limits
  • Exposure-level rating inputs showing how premiums were calculated

Time Travel (Historical Views)

The Get Policy endpoint supports the asOf query parameter to retrieve the policy state as it existed at a specific point in time:
GET /api/external/companies/{companyId}/policies/{policyId}?asOf=2024-06-15T10:00:00Z
This is useful for:
  • Auditing: Understanding the policy state at a specific date
  • Reporting: Generating historical reports
  • Debugging: Seeing how the policy looked before endorsements

Creating Policies

The Create Policy endpoint is primarily designed for historical imports where policies need to be created without going through the standard quote→bind wizard flow. Workflow:
  1. Create insureds first via POST /insureds
  2. (Optional) Create broker via POST /brokers if policy has a broker
  3. Create the policy with insured and broker references via POST /policies
  4. The endpoint automatically creates insured snapshots with the provided applicationData

Required Fields

FieldTypeDescription
referenceIdstringPolicy number (must be unique per company)
startsAtDatedatePolicy effective start date (YYYY-MM-DD)
endsAtDatedatePolicy effective end date (YYYY-MM-DD)
typestringPolicy type (C, N, T, O, P, S, Q, R, A)
billingPeriodstringBilling frequency (annual, quarterly, monthly, etc.)
insuredsarrayAt least one insured with exactly one “primary”
coveragesarrayAt least one coverage with valid coverageTypeId

Optional Fields

FieldTypeDescription
coverageTimezonestringIANA timezone (defaults to company default)
descriptionstringPolicy description
premiumnumberPremium in cents (overrides rating calculation)
brokerIduuidID of existing broker (use POST /brokers first)

Policy Types

CodeDescription
CClaims Made
NNew Claims Made
TTail
OOccurrence
POccurrence + Claims Made
SSplit (Half Claims Made/Occurrence)
QQuota Share
ROccurrence + Claims Made + Tail
AClaims Made (Alternative)

Policy Fields (List Response)

FieldTypeDescription
iduuidPolicy identifier
companyIduuidCompany identifier
numberstringPolicy number
createdAtdatetimeWhen the policy was created (ISO 8601)
primaryInsuredIduuid/nullID of the primary insured on this policy

Policy Fields (Get Response)

The Get Policy endpoint returns detailed information including all list fields plus:
FieldTypeDescription
policyIduuidPolicy identifier (same as id)
policyNumberstring/nullPolicy number (same as referenceId)
referenceIdstring/nullPolicy reference ID
startsAtDatedate/nullPolicy effective start date
endsAtDatedate/nullPolicy effective end date
statusstringCurrent policy status (see below)
termStartdate/nullPolicy term start date
termEnddate/nullPolicy term end date
sourceTransactionIduuid/nullTransaction that created/modified the policy
effectiveTimestampdatetime/nullWhen current state became effective
segmentsarrayPolicy segments with coverage and exposure details
typestring/nullPolicy type code (C, N, T, O, etc.)
descriptionstring/nullPolicy description
coverageTimezonestring/nullIANA timezone for coverage dates
currencyCodestring/nullISO 4217 currency code (e.g., “USD”)
prevPolicyIduuid/nullID of previous policy (for renewal chains)
cancelledAtdatetime/nullTimestamp when policy was cancelled
brokerIdstring/nullID of the broker associated with this policy
recipientNamestring/nullName of the policy recipient
recipientEmailstring/nullEmail of the policy recipient
primaryInsuredNamestring/nullName of the primary insured
cancellationReasonstring/nullReason for policy cancellation
cancellationExplanationstring/nullAdditional cancellation explanation

Policy Status Values

StatusDescription
activePolicy is currently in effect
not_startedPolicy start date is in the future
expiredPolicy end date is in the past
pending_signatureAwaiting policyholder signature
pending_paymentAwaiting payment
pending_actionsAwaiting both signature and payment
pending_renewalWithin 60 days of renewal date
renewal_in_progressRenewal submission created but not bound
renewedPolicy has been renewed
cancelledPolicy has been cancelled

Segment Fields

Each segment in the segments array contains:
FieldTypeDescription
startdateSegment start date
enddateSegment end date
statusstringSegment status (bound, quoted, cancelled)
premiumnumber/nullTotal premium for segment (cents)
basePremiumnumber/nullBase premium before adjustments (cents)
coveragesarrayCoverages active during this segment
exposuresarrayExposures with premium breakdown and rating inputs

Exposure Fields

Each exposure in a segment contains:
FieldTypeDescription
exposureIduuidExposure (insured) identifier
exposureTypestring/nullType of exposure (e.g., “company”, “distribution_center”)
premiumnumber/nullPremium for this exposure (cents)
basePremiumnumber/nullBase premium before adjustments (cents)
ratingInputsobject/nullRating factors by coverage type (see below)

Rating Inputs Structure

The ratingInputs object is keyed by coverage type ID. Each coverage contains rating factor objects with:
FieldTypeDescription
fieldNamestringHuman-readable factor name
adjustedPremiumnumberPremium after factor applied
multipliernumber/arrayMultiplier value(s)
valuenumber/arrayBase value(s) used
daysintegerDays for pro-rata calculations
baseintegerBase days (typically 365)

Filtering and Sorting

Filter Parameters

ParameterTypeDescription
primaryInsuredIduuidFilter by primary insured ID
filterTextstringText search across policy number and other fields

Sorting Parameters

ParameterTypeDefaultDescription
sortBystringcreatedAtField to sort by (createdAt, updatedAt, number, startsAtDate, endsAtDate)
sortDirectionstringdescSort direction (asc or desc)

Pagination

ParameterTypeDefaultDescription
pageinteger1Page number (1-based, page size 50)
Response includes:
  • items - Array of policies for the current page
  • totalCount - Total number of matching policies across all pages

Permissions

Access to policies requires the appropriate permissions based on your API key:
OperationRequired Permission
List Policiescompany.policy:read
Get Policycompany.policy:read
Create Policycompany.policy:create
Delete Policypolicy:delete

Example: Create Policy Request

{
  "referenceId": "POL-2025-001",
  "startsAtDate": "2025-01-01",
  "endsAtDate": "2026-01-01",
  "type": "C",
  "billingPeriod": "annual",
  "insureds": [
    {
      "insuredId": "550e8400-e29b-41d4-a716-446655440200",
      "insuredType": "primary",
      "joinDate": "2025-01-01",
      "terminationDate": "2026-01-01",
      "applicationData": {
        "revenue": 5000000,
        "employees": 25
      }
    }
  ],
  "coverages": [
    {
      "coverageTypeId": "550e8400-e29b-41d4-a716-446655440300"
    }
  ]
}
Response: 201 Created
{
  "id": "550e8400-e29b-41d4-a716-446655440100"
}

Example: List Policies Response

{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440100",
      "companyId": "550e8400-e29b-41d4-a716-446655440000",
      "number": "POL-2025-001",
      "createdAt": "2025-01-15T10:30:00.000Z",
      "primaryInsuredId": "550e8400-e29b-41d4-a716-446655440200"
    },
    {
      "id": "550e8400-e29b-41d4-a716-446655440101",
      "companyId": "550e8400-e29b-41d4-a716-446655440000",
      "number": "POL-2025-002",
      "createdAt": "2025-01-16T14:20:00.000Z",
      "primaryInsuredId": "550e8400-e29b-41d4-a716-446655440201"
    }
  ],
  "totalCount": 42
}

Example: Get Policy Response

{
  "id": "84f9b186-08fc-408a-8f8c-d739e161c423",
  "policyId": "84f9b186-08fc-408a-8f8c-d739e161c423",
  "companyId": "7626bc64-e937-4f52-bb4a-05848bd09860",
  "referenceId": "POL-2025-001",
  "policyNumber": "POL-2025-001",
  "createdAt": "2025-01-19T14:58:29.000+00:00",
  "primaryInsuredId": "c018b789-d235-4597-bf2e-8c308465b890",
  "primaryInsuredName": "Acme Corporation",
  "startsAtDate": "2025-01-19",
  "endsAtDate": "2026-01-19",
  "status": "active",
  "termStart": "2025-01-19",
  "termEnd": "2026-01-19",
  "sourceTransactionId": "61b8357e-f92c-404e-825c-63432974c8a1",
  "effectiveTimestamp": "2025-01-19T15:01:45.000+00:00",
  "type": "C",
  "description": "Professional Liability Policy",
  "coverageTimezone": "America/New_York",
  "currencyCode": "USD",
  "prevPolicyId": null,
  "cancelledAt": null,
  "brokerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "recipientName": "John Smith",
  "recipientEmail": "john.smith@acme.com",
  "cancellationReason": null,
  "cancellationExplanation": null,
  "segments": [
    {
      "start": "2025-01-19",
      "end": "2025-05-18",
      "status": "bound",
      "premium": 293016,
      "basePremium": 328490,
      "coverages": [
        {
          "id": "d4d4b369-4b4c-4240-bb32-cfce31be99d7",
          "coverageTypeId": "bodily_injury_and_property_damage",
          "coverageTypeName": "Bodily Injury and Property Damage",
          "deductible": 25000,
          "defenseInsideLimit": "outside",
          "limits": [
            {
              "id": "716bf78a-f714-4904-89b6-053b4e7793b7",
              "name": "Each Occurrence",
              "amount": 1000000
            }
          ]
        }
      ],
      "exposures": [
        {
          "exposureId": "c018b789-d235-4597-bf2e-8c308465b890",
          "exposureType": "company",
          "premium": 146508,
          "basePremium": 164245,
          "ratingInputs": {
            "bodily_injury_and_property_damage": {
              "bipdBaseRate": {
                "fieldName": "BIPD Base Rate",
                "multiplier": 46350,
                "adjustedPremium": 46350
              },
              "deductibleMultiplier": {
                "fieldName": "Deductible Multiplier",
                "multiplier": 0.7,
                "adjustedPremium": 32445
              }
            }
          }
        }
      ]
    }
  ]
}