# FAQs
Source: https://docs.aiinsurance.io/FAQs/FAQs
If a previously sent invoice was updated after you processed an endorsement, this can cause mismatched totals between your **Financials tab** and **Unallocated Funds (Over/Under)** balance.
**How to resolve this:**
1. **Create a Manual Invoice**: Create a new invoice in AI Insurance for the **exact amount** of the excess or affected funds. For instructions, see [Generating One-Off Invoices](/financials/invoicing/generating-one-off-invoices).
2. **Capture the Unallocated Funds**: Use the **Capture Unallocated Funds** action to apply the funds to that manual invoice. For detailed instructions, see [Capturing Unallocated Funds](/platform/companies/cash-management/capturing-unallocated-funds).
3. **Process the Refund Externally**: After capturing the funds, issue the refund through your external accounting or payment system (for example, via check or ACH).
4. **Void the Invoice in AI Insurance**: Once the refund has been processed, **void** the manual invoice in AI Insurance to clear the transaction and maintain accurate financial records.
**Additional steps:**
* If upcoming scheduled invoices are incorrect or not needed, **void them** to prevent automatic issuance
When a client overpays and you have excess funds in your **Unallocated Funds (Over/Under)** balance, you can capture these funds by creating a manual invoice and then processing a refund.
**Step-by-step solution:**
1. **Create a Manual Invoice**: Create a new invoice in AI Insurance for the **exact amount** of the excess funds you want to capture. For instructions, see [Generating One-Off Invoices](/financials/invoicing/generating-one-off-invoices).
2. **Capture the Unallocated Funds**: Use the **Capture Unallocated Funds** action to apply the excess funds to that manual invoice. For detailed instructions, see [Capturing Unallocated Funds](/platform/companies/cash-management/capturing-unallocated-funds).
3. **Process the Refund Externally**: After capturing the funds, issue the refund through your external accounting or payment system (for example, via check or ACH transfer).
4. **Document the Refund (Choose one option)**:
* **Option A**: Create an additional negative invoice to indicate a collection and refund. This provides a clear audit trail for the refund transaction.
* **Option B**: Leave the invoice as is. The invoice will remain in the system to document the transaction.
**Additional options:**
* **Void Scheduled Invoices**: If you don't want upcoming scheduled invoices to be sent automatically, you can **void them** to prevent automatic issuance.
* **Repeat the Process**: If clients continue to overpay on future invoices, you can repeat this process (create custom transaction + capture) for each occurrence.
**Automatic Return**: If you take no action on overpaid unallocated funds, the system will automatically return the funds to the client after **30 days**.
When a policy with premium billing is endorsed and the premium changes, AI Insurance automatically updates the billing schedule and invoices.
**How Invoice Voiding Works:**
**For Recurring / Installment Billing:**
* When an endorsement changes the premium, the system voids and re-schedules any **future scheduled invoices** according to the new billing schedule.
* **Sent invoices are not voided** as part of this process.
**For Annual Invoices:**
* The system voids and re-issues the annual invoice when the policy billing changes after binding.
* **Sent invoices are not voided** as part of this process.
**Key Rules:**
* If an invoice has been **sent**, the system will **not void it** as part of an endorsement.
* Only **scheduled (unsent) invoices** are voided and rescheduled when the premium changes.
* This rule applies to both annual billing and installment (recurring) billing.
**Void Reasons:**
The system tracks void reasons for invoices:
* **Invoice voided through Stripe**: Indicates the invoice was voided through Stripe or our UI that calls Stripe.
* **Policy Billing Updated**: Indicates the invoice was voided as part of a billing update on the policy.
You can resend an invoice in two ways, depending on how it was originally created:
**For AI-Generated Invoices:**
If the invoice was generated automatically by AI Insurance:
1. Navigate to **Financials** → **Transactions**
2. Open the invoice you want to re-send
3. Copy the invoice link
4. Email the link directly to the insured
**For Manual Invoices:**
If the invoice was created manually or does not include a link, you'll need to generate a payment form to collect payment:
1. Keep the existing invoice (do not void it)
2. Generate a payment form using **Forms** and apply it to the policy through an endorsement
3. Send the form link to the insured so they can pay
4. Once payment lands in your bank account, manually mark the invoice as **Paid**
For detailed step-by-step instructions on resending invoices and generating one-off invoices, see [Generating One-Off Invoices](/financials/invoicing/generating-one-off-invoices).
If you have a policy that was originally set up as **agency bill** but you decide after the fact that you want to collect payment directly from the insured (direct bill), you need to void the existing invoice and create a new manual invoice.
**Note**: This is the only scenario where you should void an existing invoice. For all other cases, keep the existing invoice and use the standard one-off invoice process.
**Step-by-step process:**
1. **Void the Agency Bill Invoice**:
* Navigate to **Financials** → **Transactions**
* Find the agency bill invoice you need to void
* Select the checkbox next to the invoice
* Click the **"Mark As"** dropdown button and select **"Void"**
* Confirm the void action
**Important**: Voiding an invoice cannot be undone. The original invoice will be marked as cancelled and will no longer be active for billing purposes.
2. **Generate a Payment Form**:
* Open the policy associated with the original invoice
* Navigate to the **Forms** section
* Create a new form with billing details and ACH information
* Apply the form to the policy through an endorsement
* The form will be sent directly to the client (insured) instead of the broker
3. **Create a New Transaction (Manual Invoice)**:
* Follow the manual invoice creation steps to create a new transaction
* Fill in the invoice details matching the voided invoice
4. **Mark Invoice as Paid** (once payment is received):
* Navigate to **Financials** → **Transactions**
* Find the invoice you created
* Select the checkbox next to the invoice
* Click the **"Mark As"** dropdown button
* Select **"Paid"** to mark the invoice as paid
For detailed step-by-step instructions with screenshots and additional information, see [Generating One-Off Invoices](/financials/invoicing/generating-one-off-invoices).
The **Company Payees** section and the payee dropdowns when adding payees to **Policies** or **Events** show different sets of payees because they serve different purposes.
**Company Payees Section:**
* Only displays **payee-type payees** — these are payees that are manually added as designated payees at the company level (such as law firms, vendors, and experts)
* These are the payees you manage in your company settings
* For more details, see [Payees](/platform/companies/payees/payees)
**Policy/Event Payee Dropdowns:**
* Include a broader set of payees that may apply to that specific transaction type:
* **Insureds** — the parties being insured
* **Brokerages** — the brokerage firms associated with policies
* **Payee-type payees** — the manually added company-level payees
**Why the difference?**
* Insureds and brokerages are **not** considered "payee-type payees"
* They appear in Policy/Event dropdowns because they may receive payments for those specific transactions
* However, they do not appear in the main Company Payees list because they are managed separately as Insureds and Brokerages in your company settings
If your invoice email is being returned or not processed, it is usually because the sending email address is not authorized for the company you are submitting invoices for.
AI Insurance only accepts invoice emails from addresses that are added as payees for the associated company. If your email address is not listed as a payee, the system will reject the email and return an error message.
**What should I check?**
Before sending an invoice by email, please make sure that:
* Your email address is added as a payee in the AI Insurance platform for the correct company. For more information, see [Payees](/platform/companies/payees/payees)
* The invoice is sent as a PDF attachment
* The invoice is sent to the correct invoice email address
* The email address is entered using all lowercase characters
Deposits may take longer to process and appear in the Cash Manager. Transactions typically show up within **5-7 days** after the deposit is initiated.
**What to expect:**
* Deposits are processed through the operating account
* Transaction history will update once the deposit is fully processed
* You can view pending and completed transactions in the **Transaction History** section of the Cash Management page
For more information about Cash Management, see [Cash Management](/platform/companies/cash-management/cash-management).
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/assignees/overview
Assignees allow you to track which users in your organization are responsible for a given entity. The Assignees API supports listing and setting assignees for policies, submissions, insureds, and events.
**Key Concepts:**
* Assignees are users within your organization assigned to an entity
* An entity can have multiple assignees
* Setting assignees is a **full replacement** — the provided list replaces any existing assignees
* Removed assignees are soft-deleted, preserving an audit trail of assignment history
***
## API Endpoints
* **[List Assignees](/api-reference/assignees/list-assignees)** - Retrieve assignees for an entity
* **[Set Assignees](/api-reference/assignees/set-assignees)** - Set assignees for an entity (full replace)
***
## Entity Types
Assignees can be managed on four entity types:
| Entity Type | Read Permission | Update Permission |
| ------------- | ------------------------- | ------------------- |
| `policies` | `company.policy:read` | `policy:update` |
| `submissions` | `company.submission:read` | `submission:update` |
| `insureds` | `company.insured:read` | `insured:update` |
| `events` | `company.claim:read` | `claim:update` |
***
## Full Replace Semantics
The Set Assignees endpoint uses **full replace** semantics. The array of user IDs you provide completely replaces the current assignees.
**Assign users:**
```json theme={null}
{
"assigneeIds": ["google-oauth2|123456789", "google-oauth2|987654321"]
}
```
**Remove all assignees:**
```json theme={null}
{
"assigneeIds": []
}
```
All user IDs in `assigneeIds` must correspond to existing users in your
organization. The API returns an error if any user ID is not found.
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "google-oauth2|123456789",
"name": "John Smith",
"email": "john@example.com",
"assignedAt": "Thu Mar 20 2026 14:30:00 GMT+0000 (Coordinated Universal Time)"
},
{
"id": "google-oauth2|987654321",
"name": "Jane Doe",
"email": "jane@example.com",
"assignedAt": "Sat Mar 21 2026 09:15:00 GMT+0000 (Coordinated Universal Time)"
}
],
"totalCount": 2
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/attorneys/overview
Attorneys represent legal professionals involved in insurance claims and lawsuits. The Attorneys API allows you to programmatically create, read, update, and delete attorney information within your company.
**Key Concepts:**
* Attorneys are company-scoped, reusable entities that can be associated with lawsuits
* An attorney can serve as plaintiff counsel (on a lawsuit) or defense counsel (on a defendant)
* Attorneys can optionally be linked to a law firm payee via `lawFirmId`
***
## API Endpoints
* **[List Attorneys](/api-reference/attorneys/list-attorneys)** - Retrieve paginated list of attorneys with filtering and sorting
* **[Create Attorney](/api-reference/attorneys/create-attorney)** - Create a new attorney
* **[Get Attorney](/api-reference/attorneys/get-attorney)** - Retrieve a single attorney by ID
* **[Update Attorney](/api-reference/attorneys/update-attorney)** - Update an existing attorney
* **[Delete Attorney](/api-reference/attorneys/delete-attorney)** - Soft delete an attorney
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ------------- | -------------------------------------- |
| `email` | Email not provided |
| `phoneNumber` | Phone number not provided |
| `lawFirmId` | No associated law firm |
| `createdAt` | Timestamp not tracked (legacy records) |
| `updatedAt` | Attorney has never been updated |
***
## Filtering and Sorting
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | --------------------------------- |
| `id` | string or array | Filter by specific attorney ID(s) |
| `filterText` | string | Text search across attorney name |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | --------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `name`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of attorneys for the current page
* `totalCount` - Total number of matching attorneys across all pages
***
## Permissions
Access to attorneys requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| --------------- | ------------------------- |
| List Attorneys | `company.attorney:read` |
| Get Attorney | `company.attorney:read` |
| Create Attorney | `company.attorney:create` |
| Update Attorney | `company.attorney:update` |
| Delete Attorney | `company.attorney:delete` |
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "660e8400-e29b-41d4-a716-446655440000",
"name": "Jane Smith",
"email": "jane@smithlaw.com",
"phoneNumber": "+1-555-123-4567",
"lawFirmId": "770e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-01-15T10:30:00.000Z",
"updatedAt": "2026-01-16T14:20:00.000Z"
}
],
"totalCount": 1
}
```
***
# Generating API Keys
Source: https://docs.aiinsurance.io/api-legacy-reference/authentication
## How to Generate API Keys
API keys allow you to programmatically access your AI Insurance data and integrate with external systems. This guide shows you how to generate API keys from your company settings.
## Step-by-Step Instructions
### Step 1: Access Company Settings
1. Log into your AI Insurance account at [https://app.aiinsurance.io](https://app.aiinsurance.io)
2. In the left sidebar, find and click on your company name (e.g., "Demo Insurance Inc.")
3. This will open the company settings page
### Step 2: Navigate to API Keys
1. In the company settings, look for the navigation bar
2. Click on the **"API Keys"** tab
3. Once you're on the **API Keys** page, you will see:
* A table of any existing API keys
* A button to create a new API key
* Your **Company ID** at the bottom of the page (this ID is required in most API requests)
### Step 3: Create Your API Key
1. Click the purple **"+ Create New API Key"** button
2. You'll be prompted to enter:
* **Key Name**: A descriptive name for your API key (e.g., "Production Integration", "Testing API")
* **Description**: Optional description of what this key will be used for
### Step 4: Save Your API Key
1. After creating the key, you'll receive your API key
2. **Store it securely** - API keys grant access to your company's data
**Authentication Header Format**
When making API requests, include your API key in the Authorization header:
```
Authorization: YOUR-API-KEY
```
**Correct:**
```bash theme={null}
-H "Authorization: abc123xyz789"
```
**Incorrect:**
```bash theme={null}
-H "Authorization: Bearer abc123xyz789" ❌
-H "X-API-Key: abc123xyz789" ❌
```
***
## Using Your API Key
Now that you have your API key, you can use it to access the AI Insurance External API. This API allows you to programmatically manage your insurance operations including submissions, quotes, policies, and more.
### Getting Started with the API
**[See the API Overview for complete documentation](/api-legacy-reference/overview)** - This includes:
* All available API resources and endpoints
* Quick start examples
* Request/response formats
* Data models reference
### What You Can Do with the API
Once you have your API key, you can:
* **Submissions**: Create, update, and list insurance submissions
* **Quotes**: Retrieve quote information (lightweight or full details)
* **Configuration**: Access your company's rating fields and coverage types
* **More coming soon**: Policies, Events, Insureds, Financials
### Example: Using Your API Key
With your API key, you can make requests like:
```bash theme={null}
curl -X GET \
"https://app.aiinsurance.io/api/external/companies/YOUR-COMPANY-ID/submissions" \
-H "Authorization: YOUR-API-KEY"
```
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/brokerages/overview
Brokerages represent insurance agencies or brokers that sell insurance on behalf of an MGA or Insurer running their program on the AI Insurance platform. The Brokerages API allows you to programmatically create, read, update, and delete brokerage information, including commission payment settings.
**Key Concepts:**
* Brokerages are insurance agencies or brokers that sell insurance on behalf of an MGA or Insurer
* Each brokerage has a **commission payment method** that determines how commissions are handled
* Brokerages can have contact information including email, phone, and structured address
* A **default commission percentage** can be set for each brokerage
***
## API Endpoints
* **[List Brokerages](/api-reference/brokerages/list-brokerages)** - Retrieve paginated list of brokerages with filtering and sorting
* **[Get Brokerage](/api-reference/brokerages/get-brokerage)** - Retrieve a single brokerage by ID
* **[Create Brokerage](/api-reference/brokerages/create-brokerage)** - Create a new brokerage
* **[Update Brokerage](/api-reference/brokerages/update-brokerage)** - Update an existing brokerage
* **[Delete Brokerage](/api-reference/brokerages/delete-brokerage)** - Soft delete a brokerage
***
## Commission Payment Methods
Each brokerage must have a commission payment method that determines how commissions are processed:
| Method | Description |
| ------------- | --------------------------------------------------------------------------- |
| `agencyBill` | The brokerage collects premiums and remits net of commission to the carrier |
| `directBill` | The carrier bills the insured directly and pays commission to the brokerage |
| `doNotHandle` | Commissions are not processed through the system |
***
## Structured Address
The `addressStructured` field contains a structured address object with the following fields:
| Field | Type | Description |
| --------- | ------ | -------------------------------- |
| `line1` | string | Street address line 1 |
| `line2` | string | Street address line 2 (optional) |
| `city` | string | City |
| `state` | string | State or province |
| `zip` | string | ZIP or postal code |
| `country` | string | Country code |
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ----------------------------- | -------------------------------------- |
| `niprBrokerageNumber` | NIPR number not provided |
| `email` | Email not provided |
| `addressStructured` | Address not provided |
| `phone` | Phone number not provided |
| `defaultCommissionPercentage` | Default commission not configured |
| `createdAt` | Timestamp not tracked (legacy records) |
| `updatedAt` | Brokerage has never been updated |
***
## Filtering and Sorting
List endpoints support comprehensive filtering and sorting options:
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | ------------------------------------------- |
| `id` | string or array | Filter by specific brokerage ID(s) |
| `filterText` | string | Text search across brokerage name and email |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ------------------------------------------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `name`, `email`, `defaultCommissionPercentage`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of brokerages for the current page
* `totalCount` - Total number of matching brokerages across all pages
***
## Permissions
Access to brokerages requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| ---------------- | -------------------------- |
| List Brokerages | `company.brokerage:read` |
| Get Brokerage | `company.brokerage:read` |
| Create Brokerage | `company.brokerage:create` |
| Update Brokerage | `company.brokerage:create` |
| Delete Brokerage | `brokerage:update` |
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"name": "Acme Insurance Agency",
"commissionPaymentMethod": "agencyBill",
"niprBrokerageNumber": "12345678",
"email": "contact@acmeagency.com",
"addressStructured": {
"line1": "123 Main Street",
"line2": "Suite 100",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "US"
},
"phone": "+1-555-123-4567",
"defaultCommissionPercentage": 15,
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-16T14:20:00.000Z"
}
],
"totalCount": 42
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/brokers/overview
Brokers are individual agents or producers associated with a brokerage. The Brokers API allows you to programmatically create, read, update, and delete broker information within your company.
**Key Concepts:**
* Brokers are individual agents who work under a **brokerage**
* Each broker must be associated with an existing brokerage via `brokerageId`
* Brokers can have their own contact information, commission percentage, and producer number
* A broker may optionally have an associated **user ID** for portal access
***
## API Endpoints
* **[List Brokers](/api-reference/brokers/list-brokers)** - Retrieve paginated list of brokers with filtering and sorting
* **[Get Broker](/api-reference/brokers/get-broker)** - Retrieve a single broker by ID
* **[Create Broker](/api-reference/brokers/create-broker)** - Create a new broker
* **[Update Broker](/api-reference/brokers/update-broker)** - Update an existing broker
* **[Delete Broker](/api-reference/brokers/delete-broker)** - Soft delete a broker
***
## Broker vs Brokerage
| Entity | Description |
| ------------- | --------------------------------------------------------------------- |
| **Brokerage** | An insurance agency or broker organization (company level) |
| **Broker** | An individual agent/producer who works for a brokerage (person level) |
A brokerage can have multiple brokers, but each broker belongs to exactly one brokerage.
***
## Structured Address
The `addressStructured` field contains a structured address object with the following fields:
| Field | Type | Description |
| --------- | ------ | -------------------------------- |
| `line1` | string | Street address line 1 |
| `line2` | string | Street address line 2 (optional) |
| `city` | string | City |
| `state` | string | State or province |
| `zip` | string | ZIP or postal code |
| `country` | string | Country code |
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ----------------------------- | -------------------------------------- |
| `email` | Email not provided |
| `phone` | Phone number not provided |
| `workPhone` | Work phone not provided |
| `addressStructured` | Address not provided |
| `defaultCommissionPercentage` | Default commission not configured |
| `producerNumber` | Producer number not assigned |
| `userId` | Broker does not have portal access |
| `createdAt` | Timestamp not tracked (legacy records) |
| `createdBy` | Created by system or unknown user |
| `updatedAt` | Broker has never been updated |
| `updatedBy` | Never updated or updated by system |
***
## Filtering and Sorting
List endpoints support comprehensive filtering and sorting options:
### Filter Parameters
| Parameter | Type | Description |
| ------------- | --------------- | ------------------------------- |
| `id` | string or array | Filter by specific broker ID(s) |
| `brokerageId` | string | Filter by brokerage ID |
| `filterText` | string | Text search across broker name |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ------------------------------------------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `name`, `email`, `defaultCommissionPercentage`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of brokers for the current page
* `totalCount` - Total number of matching brokers across all pages
***
## Permissions
Access to brokers requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| ------------- | ----------------------- |
| List Brokers | `company.broker:read` |
| Get Broker | `broker:read` |
| Create Broker | `company.broker:create` |
| Update Broker | `broker:update` |
| Delete Broker | `company.broker:create` |
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "660e8400-e29b-41d4-a716-446655440000",
"brokerageId": "770e8400-e29b-41d4-a716-446655440000",
"name": "John Smith",
"email": "john.smith@acmeagency.com",
"phone": "+1-555-123-4567",
"workPhone": "+1-555-123-4568",
"addressStructured": {
"line1": "123 Main Street",
"line2": "Suite 100",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "US"
},
"defaultCommissionPercentage": 15,
"producerNumber": "PRD-12345",
"userId": null,
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "880e8400-e29b-41d4-a716-446655440000",
"updatedAt": "2025-01-16T14:20:00.000Z",
"updatedBy": "880e8400-e29b-41d4-a716-446655440000"
}
],
"totalCount": 42
}
```
***
# API Changelog
Source: https://docs.aiinsurance.io/api-legacy-reference/changelog
Track updates and improvements to the AI Insurance API
## Product updates
New updates and improvements to the AI Insurance REST API.
***
## September 25 2026
### Export Presets API
**Added**
* `GET /api/external/companies/{companyId}/export-presets` — List every export preset saved by any user of the company. Each preset returns its `entityType` and `name` (nullable for legacy presets saved without them), ordered `fieldKeys`, and `owner` (`{ id, name, email }` or `null`). Accepts an optional `entityType` query filter; not paginated. Requires `company.export_preset:read`.
***
## May 13 2026
### Configuration Rating Outputs API
**Changed**
* `POST /api/external/companies/{companyId}/configuration/rating/outputs` and `GET /api/external/companies/{companyId}/configuration/rating/outputs` — Field definitions now accept and return an optional `smartTagsNeeded` boolean. When `true`, the rater pushes this field's output into the smart-tag bucket at rating time, allowing the auto-created `AII{key}PrimaryInsured` smart tag to resolve a value. When omitted or `false`, the field is still displayed but the smart tag resolves to `null`.
### Submissions API
**Added**
* `GET /api/external/companies/{companyId}/submissions/{submissionId}/loss-history` — Retrieve the loss history entries on a submission. Returns `{ items: LossHistoryEntry[], totalCount: number }` or `{ items: [], totalCount: 0 }` when no loss history has been set. Requires `company.submission:read`.
* `POST /api/external/companies/{companyId}/submissions/{submissionId}/loss-history` — Append entries to a submission's loss history without replacing existing ones. Same request shape as PUT (`{ history: LossHistoryEntry[] }`), but entries are added to the end. Requires at least one entry; rejects unknown fields. Requires `submission:update`.
***
## May 12 2026
### Submissions API
**Added**
* `PUT /api/external/companies/{companyId}/submissions/{submissionId}/loss-history` — Set (replace) the loss history on a submission. Accepts `{ history: LossHistoryEntry[] }` where each entry has a `year` and claim `data` (only `totalIncurred` is required). Returns `{ success: true }`. For FMV1-enabled companies, automatically recomputes computed loss history fields on associated quotes. Requires `submission:update`.
***
## May 8 2026
### Submissions API
**Changed**
* `POST /api/external/companies/{companyId}/submissions/{submissionId}/files` — Now accepts files of any content type, not just `application/pdf`. The `400 UnsupportedFileType` error has been removed. The multipart field name changed from `files` to `file`.
***
## April 28 2026
### Submissions API
**Added**
* `POST /api/external/companies/{companyId}/submissions/{submissionId}/files` — Attach one or more PDF files to an existing submission. Accepts `multipart/form-data` with each file in a part named `files`; non-PDF content types are rejected with `400 UnsupportedFileType`. Returns `201 { fileIds: string[] }` with IDs in upload order. Files appear in the submission's Files tab. Requires `submission.file:create`.
***
## April 27 2026
### Address Resolution API
**Added**
* `GET /api/external/companies/{companyId}/resolve-address` — Geocode a freeform address string and return its structured subfields (`street`, `city`, `state`, `county`, `country`, `zipCode`) in the shape Field Model V1 rating expects. Pre-flight utility: integrators call this before building create/update payloads so addresses include all required pieces (especially `county`). `zipCode` is returned as a string with leading zeros preserved. Failures (empty input, no match, missing required subfield, upstream geocoder error) surface as `400` (or `502` for upstream errors) with a distinct `problemCode` — partial addresses are never returned as success. Writes are not auto-enriched. Requires `company:read`.
***
## April 24 2026
### Configuration Rating Fields API
**Added**
* `PUT /api/external/companies/{companyId}/configuration/rating/fields/rank` — Reorder rating input fields within a single `(companyId, entityType)` tuple by rewriting `application_fields.rank`. The array index of each `fieldId` becomes its new rank. The provided `fieldIds` must exactly match the set of rating fields currently defined for the entity type — partial reorders, duplicates, unknown ids, and missing ids are rejected with `400`. Updates UI ordering only; does not modify `rating_engine_revisions.config`. Requires `company:update`.
**Changed**
* `GET /api/external/companies/{companyId}/configuration/rating/fields` — Response now includes `rank` (integer, nullable), the UI rendering order of the field within its entity type. Lower values render first; `null` renders last. Not used as the endpoint's sort key.
***
## April 22 2026
### Configuration Rating Form Logic API
**Added**
* `GET /api/external/companies/{companyId}/configuration/rating/form-logic` — List form-logic rules from a rating engine revision's config JSON. Requires `ratingEngineRevisionId` query parameter. Supports filtering by `ruleName` (exact match) and `id`, sorting by `ruleName` (default) or `rank`.
* `POST /api/external/companies/{companyId}/configuration/rating/form-logic` — Create a form-logic rule in a rating engine revision's config JSON (`config.policyFormLogicConfigs`). Rules use a `shouldAdd` conditional expression that supports `AND`/`OR` branches, leaf comparisons (`=`, `!=`, `<`, `<=`, `>`, `>=`, `IN`, `NOTIN`, `EXISTS`, `NOTEXISTS`, `SOME`), and an inverted-leaf shape. Requires `ratingEngineRevisionId`, `revisionStrategy`, `ruleName`, `rank`, and `shouldAdd`.
* `DELETE /api/external/companies/{companyId}/configuration/rating/form-logic/{formLogicId}` — Remove a form-logic rule from a rating engine revision's config JSON. Requires `ratingEngineRevisionId` and `revisionStrategy` query parameters.
***
## April 15 2026
### Configuration Rating Presets API
**Added**
* `GET /api/external/companies/{companyId}/configuration/rating/presets` — List coverage limit presets from a rating engine revision's config JSON. Requires `ratingEngineRevisionId` query parameter. Supports filtering by `coverageTypeKey` and `id`, sorting by `setName` or `coverageTypeKey`.
* `POST /api/external/companies/{companyId}/configuration/rating/presets` — Create a coverage limit preset in a rating engine revision's config JSON. For rating-engine companies where presets are stored in `config.coverageLimitPresets`, not in the `coverage_limit_presets` table. Requires `ratingEngineRevisionId` and `revisionStrategy` parameters. Supports default-steal (setting `isDefault: true` unsets existing defaults for the same coverage type).
* `DELETE /api/external/companies/{companyId}/configuration/rating/presets/{presetId}` — Remove a coverage limit preset from a rating engine revision's config JSON. The preset is permanently removed from the `coverageLimitPresets` array.
***
## April 13 2026
### FMV1 Policy Transaction API — Read Endpoints
**Added**
* `GET /api/v1/external/companies/{companyId}/policies/list` — List policies with segment scope filtering, JSONB field filters, time travel, and pagination
* `GET /api/v1/external/companies/{companyId}/policies/versions` — Search across all policy versions (cross-version search)
* `GET /api/v1/external/companies/{companyId}/policies/{policyId}/versions` — List all versions for a single policy
These endpoints complete the read path for the transaction-based policy model. Use `segmentScope` to filter by date range, `filters` for field-level JSONB queries, and `detail=full` to include complete segment data.
### Configuration Presets API
**Changed**
* Moved coverage limit preset endpoints from `/configuration/rating/presets` to `/configuration/presets` — these endpoints operate on the `coverage_limit_presets` table (for non-rating-engine companies). The `/configuration/rating/presets` path will be used by new config-JSON endpoints for rating-engine companies. **The old path is no longer available — update existing integrations to use the new path.**
### Exposure Types API
**Added**
* `DELETE /api/external/companies/{companyId}/exposure-types/{exposureTypeId}` — Permanently delete an exposure type and remove it from the company's enabled types. Validates the type is not referenced by insureds (409) before deletion.
### Coverage Types API
**Added**
* `DELETE /api/external/companies/{companyId}/coverage-types/{coverageTypeId}` — Permanently delete a company-specific coverage type. Validates the type is not global (403), not enabled (409), and has no field associations (409) before deletion.
***
## April 10 2026
### Coverage Types API
**Added**
* `GET /api/external/companies/{companyId}/coverage-types` — List all coverage types (global and company-specific) with optional label filtering
* `POST /api/external/companies/{companyId}/coverage-types` — Create a company-specific coverage type
* `PUT /api/external/companies/{companyId}/coverage-types/enabled` — Replace the company's enabled coverage types list wholesale
### Exposure Types API
**Added**
* `GET /api/external/companies/{companyId}/exposure-types` — List exposure types with optional label filtering
* `POST /api/external/companies/{companyId}/exposure-types` — Create an exposure type and add it to the company's enabled exposure types
### Configuration Rating Outputs API
**Added**
* `GET /api/external/companies/{companyId}/configuration/rating/outputs` — List rating output fields with filtering by ID, sorting, and pagination
* `DELETE /api/external/companies/{companyId}/configuration/rating/outputs/{fieldId}` — Delete a rating output field and soft-delete its associated smart tag
***
## April 9 2026
### FMV1 Policy Transaction API
The FMV1 Policy API has been rebuilt around an immutable transaction model.
Policies are now managed through transaction endpoints rather than direct CRUD operations.
**Added**
* `POST /api/v1/external/companies/{companyId}/policies/transaction/new-business` — Create a new policy via a NEW\_BUSINESS transaction
The previous CRUD endpoints (`POST /v1/policies`, `DELETE /v1/policies/{policyId}`)
are deprecated and will be removed in a future release.
### Configuration Rating Outputs API
**Added**
* `POST /api/external/companies/{companyId}/configuration/rating/outputs` — Create a rating output field (`rating_engine_display`) with auto-created smart tag
### Configuration Rating Fields API
**Added**
* `DELETE /api/external/companies/{companyId}/configuration/rating/fields/{fieldId}` — Delete a rating input field, its application field association, and its entry in the rating engine revision config
* `GET /api/external/companies/{companyId}/configuration/rating/fields` — List rating input fields with filtering by ID and entity type, sorting, and pagination
***
## April 8 2026
### Configuration Rating Fields API
**Added**
* `POST /api/external/companies/{companyId}/configuration/rating/fields` — Create a rating input field and associate it with an entity type and rating engine revision
### Field Model V1 Quote Lifecycle Endpoints
**Added**
* `POST /api/v1/external/companies/{companyId}/quotes/{quoteId}/bind` — Bind a quote, creating a policy
* `POST /api/v1/external/companies/{companyId}/quotes/{quoteId}/send` — Send a quote, transitioning status to "sent"
***
## April 7 2026
### Configuration Fields API
**Added**
* `GET /api/external/companies/{companyId}/configuration/fields` — List entity fields with filtering by ID and entity name, sorting, and pagination
* `POST /api/external/companies/{companyId}/configuration/fields` — Create a field definition and associate it with an entity type (events, insureds, policies)
* `DELETE /api/external/companies/{companyId}/configuration/fields/{fieldId}` — Delete a field and its entity association
These endpoints manage entity-level configuration fields only. Rating fields are managed through separate `/configuration/rating/` endpoints.
***
### Field Model V1 Quotes API
**Added**
* `GET /api/v1/external/companies/{companyId}/quotes` — List quotes with pagination, sorting, and submission filtering
* `POST /api/v1/external/companies/{companyId}/quotes` — Create a quote with policy and exposure data
* `GET /api/v1/external/companies/{companyId}/quotes/{quoteId}` — Get a single quote
* `PUT /api/v1/external/companies/{companyId}/quotes/{quoteId}` — Update a quote (full replacement of policy and exposures)
* `DELETE /api/v1/external/companies/{companyId}/quotes/{quoteId}` — Soft-delete a quote
* `GET /api/v1/external/companies/{companyId}/quotes/configuration` — Get JSON Schemas for policy and exposure fields
Lifecycle fields (`quoteType`, `quoteStatus`, `quoteNumber`, `quoteBindErrors`, `quoteSubmissionId`) are read-only in responses and rejected on create/update.
***
## March 31 2026
### FMV1 Configuration Management API
**Added**
* `POST /api/v1/external/companies/{companyId}/configuration/generate` — Generate a blank FMV1 configuration template spreadsheet
* `POST /api/v1/external/companies/{companyId}/configuration/export` — Export FMV1 configuration to an existing Google Spreadsheet
* `POST /api/v1/external/companies/{companyId}/configuration/validate` — Validate a configuration spreadsheet
* `POST /api/v1/external/companies/{companyId}/configuration/compare` — Compare spreadsheet against database
* `POST /api/v1/external/companies/{companyId}/configuration/import` — Import configuration from a spreadsheet
These endpoints require the new **FMV1\_CONFIGURATION\_MANAGER** role. New permissions: `company.configuration:export` and `company.configuration:import`.
***
## March 30 2026
### Coverage Type Fields API
**Added**
* `POST /api/external/companies/{companyId}/coverage-types/{coverageTypeId}/fields` - Set fields on a company-specific coverage type
**Changed**
* `GET /api/external/companies/{companyId}/coverage-types/{coverageTypeId}/fields` - Response now includes a `metadata` object with `coverageTypeScope` (global or company) and `fieldSources` (database, static, or both)
***
## March 27 2026
### Coverage Type Fields API
**Added**
* `GET /api/external/companies/{companyId}/coverage-types/{coverageTypeId}/fields` - Get fields associated with a coverage type
### Field Model V1 Events API
**Changed**
* Event responses no longer include `lawsuitId` — lawsuits are now managed via entity relationships, not auto-created on event creation
* `fieldModelV1Data` is now always present (non-nullable) in event responses
* List endpoint now filters `type` and `status` via `fieldModelV1Data` JSONB fields instead of legacy columns
* Creating an event no longer auto-creates a lawsuit record
### Field Model V1 Exposures API
**Changed**
* Exposures now read and write exclusively from `fieldModelV1Data`. Legacy columns (`name`, `entity_type`) are no longer populated on create or update.
* List endpoint filtering and sorting now operate on JSONB fields (`exposureType`, `exposureName`) instead of legacy columns.
***
## March 23 2026
### Assignees API
**Added**
* `GET /api/external/companies/{companyId}/{entityType}/{entityId}/assignees` - List assignees for an entity
* `PUT /api/external/companies/{companyId}/{entityType}/{entityId}/assignees` - Set assignees for an entity (full replace)
Supports policies, submissions, insureds, and events.
***
## March 16 2026
### Field Model V1 Custom Objects API
**Added**
* `GET /api/v1/external/companies/{companyId}/custom-objects` - List custom object types
* `GET /api/v1/external/companies/{companyId}/custom-objects/{objectType}/configuration` - Get field schema and relationship metadata
* `GET /api/v1/external/companies/{companyId}/custom-objects/{objectType}` - List custom objects (paginated)
* `GET /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}` - Get custom object by ID
* `POST /api/v1/external/companies/{companyId}/custom-objects/{objectType}` - Create custom object
* `PUT /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}` - Update custom object (full replacement)
* `DELETE /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}` - Delete custom object
* `PUT /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}/relationships/{fieldRefId}/{targetId}` - Add relationship
* `DELETE /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}/relationships/{fieldRefId}/{targetId}` - Remove relationship
***
## February 27 2026
### Insureds Configuration API
**New Features**
* **Get Insureds Configuration**: Response now includes `fieldEntityTypeMappings` (maps field keys to entity type associations). This allows API consumers to determine which fields apply to which entity types.
* **Entity-type scoped fields**: The configuration response now only includes fields for entity types that are enabled for your company, instead of the union of all possible entity-type-specific fields.
* **Improved validation errors**: When creating or updating an insured with a field that belongs to a different entity type, the error message now indicates which entity types the field belongs to, instead of the generic "Unknown field key" message.
***
## February 26 2026
### Create Policy API
**Breaking Changes**
* **Unified exposures array**: The `primaryInsured` field and separate `exposures` array have been replaced with a single `exposures` array. Exactly one exposure must have `role: "primary"`.
* **Before**: Separate `primaryInsured` object (no `role` field) + optional `exposures` array (roles: `named`, `additional`, `related`)
* **After**: Single required `exposures` array where one entry has `role: "primary"` and others have `role: "named"`, `"additional"`, or `"related"`
* **Field renames in docs**: `insuredType` → `role`, `applicationData` → `ratingInfo`, `insureds` → `exposures` (docs now match actual code field names)
***
## February 24 2026
### Field Model V1 Exposures API
**New Features**
* **Field Model V1 Exposures CRUD API**: Full operations for managing exposures with company-configured dynamic fields
* `GET /api/v1/external/companies/{companyId}/exposures/configuration` - Get JSON Schema of available fields
* `POST /api/v1/external/companies/{companyId}/exposures` - Create an exposure with dynamic fields
* `GET /api/v1/external/companies/{companyId}/exposures` - List exposures with filtering and pagination
* `GET /api/v1/external/companies/{companyId}/exposures/{exposureId}` - Retrieve a single exposure by ID
* `PATCH /api/v1/external/companies/{companyId}/exposures/{exposureId}` - Update an exposure (full replacement of field data)
* `DELETE /api/v1/external/companies/{companyId}/exposures/{exposureId}` - Soft delete an exposure
* Fields are dynamically defined per company — use the configuration endpoint to discover available fields and types
* Supports Text, Number, Boolean, Option Set, and Object field types
* Required permissions: `company.insured:read`, `company.insured:create`, `insured:update`, `insured:delete`
### Field Model V1 Policies API
**New Features**
* **FMV1 Policies CRUD API**: Full operations for managing Field Model V1 policies
* `GET /api/v1/external/companies/{companyId}/policies` - List policies with filtering, sorting, and pagination
* `POST /api/v1/external/companies/{companyId}/policies` - Create a policy with segment data
* `GET /api/v1/external/companies/{companyId}/policies/{policyId}` - Retrieve a single policy by ID
* `DELETE /api/v1/external/companies/{companyId}/policies/{policyId}` - Soft delete a policy
* `GET /api/v1/external/companies/{companyId}/policies/configuration` - Get JSON Schema for available custom fields
* Segment-based data structure with policy, coverage, and exposure custom fields
* Required permissions: `company.policy:read` (read operations), `company.policy:create` (write operations)
***
## February 19 2026
### Defendants API
**New Features**
* **Defendants CRUD API**: Full operations for managing defendants on lawsuits
* `GET /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants` - List defendants with filtering and pagination
* `POST /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants` - Create a defendant for a lawsuit
* `GET /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants/{defendantId}` - Retrieve a single defendant by ID
* `PATCH /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants/{defendantId}` - Update a defendant (send null to clear fields)
* `DELETE /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants/{defendantId}` - Soft delete a defendant
* Each defendant is either an insured (`insuredId`) or non-insured party (`nonInsuredName`)
* FK validation for `insuredId`, `attorneyId`, and `lawFirmId`
* Required permission: `company.event:export`
### Events API
**Improvements**
* **`lawsuitId` field**: Event responses now include `lawsuitId` (nullable). Create and update event requests accept an optional `lawsuitId` to associate a lawsuit with an event.
***
## February 17 2026
### Lawsuits API
**New Features**
* **Lawsuits CRUD API**: Full operations for managing lawsuits on events (1:1 relationship)
* `POST /api/external/companies/{companyId}/events/{eventId}/lawsuit` - Create a lawsuit for an event (409 if one already exists)
* `GET /api/external/companies/{companyId}/events/{eventId}/lawsuit` - Retrieve the lawsuit for an event
* `PATCH /api/external/companies/{companyId}/events/{eventId}/lawsuit` - Update the lawsuit (send null to clear fields)
* `DELETE /api/external/companies/{companyId}/events/{eventId}/lawsuit` - Soft delete the lawsuit
* All fields are optional on create; update supports partial updates with null clearing
* FK validation for `plaintiffAttorneyId` and `plaintiffLawFirmId`
* Required permission: `company.event:export`
***
### Event Financials API
**New Features**
* **Void Event Transaction**: `PATCH /api/external/companies/{companyId}/events/{eventId}/financials/transactions/{transactionId}`
* Void an existing financial transaction by setting `status: "void"`
* Required `voidReason` field to document why the transaction was voided
* Returns full transaction detail after voiding
* Required permission: `company.payment:update`
***
## February 16 2026
### Attorneys API
**New Features**
* **Attorneys API**: Full CRUD operations for managing attorneys
* `GET /api/external/companies/{companyId}/attorneys` - List attorneys with filtering and pagination
* `POST /api/external/companies/{companyId}/attorneys` - Create a new attorney
* `GET /api/external/companies/{companyId}/attorneys/{attorneyId}` - Get attorney details
* `PATCH /api/external/companies/{companyId}/attorneys/{attorneyId}` - Update an attorney
* `DELETE /api/external/companies/{companyId}/attorneys/{attorneyId}` - Soft delete an attorney
* Filter by ID (single or array) or text search across attorney names
* Sort by createdAt, updatedAt, or name
* Optional `lawFirmId` to associate an attorney with a law firm payee
***
## February 11 2026
### Events API
**Improvements**
* **Get Events Configuration**: Response now includes `fieldCoverageTypeMappings` (maps field keys to coverage type associations) and `companyCoverageTypes` (list of enabled coverage type IDs). This allows API consumers to determine which fields apply to which coverage types.
***
## January 26 2026
### Exposures API
**New Features**
* **New `/exposures/` endpoints**: Added `/exposures/` as the preferred endpoint path for managing exposures (previously called "insureds")
* `GET /api/external/companies/{companyId}/exposures` - List exposures with filtering and pagination
* `GET /api/external/companies/{companyId}/exposures/{exposureId}` - Retrieve a single exposure by ID
* `POST /api/external/companies/{companyId}/exposures` - Create a new exposure
* `PATCH /api/external/companies/{companyId}/exposures/{exposureId}` - Update an existing exposure
* `DELETE /api/external/companies/{companyId}/exposures/{exposureId}` - Soft delete an exposure
* The existing `/insureds/` endpoints remain available for backwards compatibility
### Insured API
**New Features**
* **Get insured endpoint**: `GET /api/external/companies/{companyId}/insureds/{insuredId}`
* Retrieve a single insured (exposure) by ID
* Returns insured details including name, entity type, and associated policy IDs
***
## January 13 2026
### Smart Tags API
**New Features**
* **Smart Tags API**: List smart tags for a company
* `GET /api/external/companies/{companyId}/smart-tags` - List smart tags with filtering and pagination
* Filter by ID (single or array) or text search across tag names
* Sort by createdAt, updatedAt, tagName, or tagDisplayName
### Policies API
**New Features**
* **Create policy endpoint**: `POST /api/external/companies/{companyId}/policies`
* Create policies directly for historical imports without going through quote→bind flow
* Takes existing insured IDs (insureds must be created first via POST /insureds)
* Creates insured snapshots with optional applicationData for rating
* Creates policy snapshot with coverages
* Supports: policy type, billing period, timezone, premium override, broker info
* Validates exactly one primary insured, policy number uniqueness
* Returns `{ id }` with HTTP 201
***
## January 6 2026
### Event Financials API
**New Features**
* **Event Financials API**: Full management of financial transactions and reserves for events
* `GET /api/external/companies/{companyId}/events/{eventId}/financials/transactions` - List transactions for an event
* `POST /api/external/companies/{companyId}/events/{eventId}/financials/transactions` - Create payment or invoice
* `GET /api/external/companies/{companyId}/events/{eventId}/financials/transactions/{transactionId}` - Get transaction details with line items
* `GET /api/external/companies/{companyId}/events/{eventId}/financials/reserves` - Get reserve amounts by category
* `PATCH /api/external/companies/{companyId}/events/{eventId}/financials/expected-totals` - Update expected totals/reserves
* `GET /api/external/companies/{companyId}/events/financials/{transactionType}/totals` - Get financial totals across all events
* Support for itemized and non-itemized transaction types
* Transaction statuses: owed, paid, approved, void
### Policies API
**New Features**
* **List policies endpoint**: `GET /api/external/companies/{companyId}/policies`
* Retrieve policies with filtering and pagination support
### Insured API
**New Features**
* **Create insured endpoint**: `POST /api/external/companies/{companyId}/insureds`
* Create new insured (exposure) records with name and entity type
* **Delete insured endpoint**: `DELETE /api/external/companies/{companyId}/insureds/{insuredId}`
* Soft delete insured records
***
## December 30 2025
### Payees & Transaction Categories
**New Features**
* **Payees API**: Full CRUD operations for managing payees
* `GET /api/external/companies/{companyId}/payees` - List all payees with filtering
* `GET /api/external/companies/{companyId}/payees/{payeeId}` - Get payee details
* `POST /api/external/companies/{companyId}/payees` - Create new payee
* `PUT /api/external/companies/{companyId}/payees/{payeeId}` - Update payee
* `DELETE /api/external/companies/{companyId}/payees/{payeeId}` - Delete payee
* Support for saved and non-saved payee types
* **Transaction Categories endpoint**: `GET /api/external/companies/{companyId}/transaction-categories`
* Retrieve available transaction categories for accounting integration
**Improvements**
* Added `batchId` audit logging support for bulk operations
***
## December 22 2025
### Submissions & Configuration Endpoints
**New Features**
* **Submissions CRUD API**: Complete submission management
* `GET /api/external/companies/{companyId}/submissions/{submissionId}` - Get submission details
* `POST /api/external/companies/{companyId}/submissions` - Create new submission
* `PUT /api/external/companies/{companyId}/submissions/{submissionId}` - Update submission
* `DELETE /api/external/companies/{companyId}/submissions/{submissionId}` - Delete submission
* **Events configuration endpoint**: `GET /api/external/companies/{companyId}/events/configuration`
* Retrieve event type configuration and available options
**Improvements**
* Updated currency field documentation to use JSON Schema `money` format type
***
## December 19 2025
### Brokers & Quotes Configuration
**New Features**
* **Brokers CRUD API**: Full broker management
* `GET /api/external/companies/{companyId}/brokers` - List brokers
* `GET /api/external/companies/{companyId}/brokers/{brokerId}` - Get broker details
* `POST /api/external/companies/{companyId}/brokers` - Create broker
* `PUT /api/external/companies/{companyId}/brokers/{brokerId}` - Update broker
* `DELETE /api/external/companies/{companyId}/brokers/{brokerId}` - Delete broker
* **Quotes configuration endpoint**: `GET /api/external/companies/{companyId}/quotes/configuration`
* Retrieve quote-related configuration settings
**Improvements**
* Added `force` parameter to `DELETE /events/{eventId}` for force deletion
***
## December 17 2025
### Brokerages & API Improvements
**New Features**
* **Brokerages CRUD API**: Complete brokerage management
* `GET /api/external/companies/{companyId}/brokerages` - List brokerages
* `GET /api/external/companies/{companyId}/brokerages/{brokerageId}` - Get brokerage details
* `POST /api/external/companies/{companyId}/brokerages` - Create brokerage
* `PUT /api/external/companies/{companyId}/brokerages/{brokerageId}` - Update brokerage
* `DELETE /api/external/companies/{companyId}/brokerages/{brokerageId}` - Delete brokerage
**Improvements**
* Create endpoints now return `201 Created` status code (previously `200 OK`)
* Removed deprecated `requestorEmail` field from all endpoints
***
## December 11 2025
### Events API
**New Features**
* **Events CRUD API**: Full event lifecycle management
* `GET /api/external/companies/{companyId}/events` - List events with filtering
* `GET /api/external/companies/{companyId}/events/{eventId}` - Get event details
* `POST /api/external/companies/{companyId}/events` - Create new event
* `PUT /api/external/companies/{companyId}/events/{eventId}` - Update event
* `DELETE /api/external/companies/{companyId}/events/{eventId}` - Delete event
**Improvements**
* Added `insuredIds` array field for multi-insured event support
* Removed legacy fields from events API for cleaner responses
* Added nullable fields documentation for events API
***
## December 5 2025
### Notes & Quote Operations
**New Features**
* **Notes API**: Create and retrieve notes
* `GET /api/external/companies/{companyId}/notes` - List notes with filtering
* `POST /api/external/companies/{companyId}/notes` - Create new note
* Support for author override fields
* **Quote creation endpoint**: `POST /api/external/companies/{companyId}/quotes`
* Create new quotes programmatically
* **Quote deletion endpoint**: `DELETE /api/external/companies/{companyId}/quotes/{quoteId}`
* Delete quotes that are no longer needed
* **Quote update endpoint**: `PATCH /api/external/companies/{companyId}/quotes/{quoteId}`
* Update existing quote fields
* **Quote binding endpoint**: `POST /api/external/companies/{companyId}/quotes/{quoteId}/bind`
* Bind a quote to convert it to a policy
***
## December 4 2025
### Quotes API Consolidation
**Breaking Changes**
* **Consolidated quote endpoints**: Moved from submission-scoped paths to single company-level endpoints with optional filters
* **Before**: `GET /api/external/companies/{companyId}/submissions/{submissionId}/quotes`
* **After**: `GET /api/external/companies/{companyId}/quotes?submissionId={submissionId}`
* All quote endpoints now use optional `submissionId` and `applicationId` query parameters instead of path parameters
**New Features**
* **Lightweight quote info endpoint**: `GET /api/external/companies/{companyId}/quotes-info`
* Returns essential fields only (9 fields vs 40+)
* Optimized for listing, searching, and filtering
* \~3x faster response times for dashboard views
* Fields: id, number, status, createdAt, updatedAt, description, policyId, policyCurrency, grandTotal
* **Enhanced pagination**: All list endpoints now support robust pagination
* Page size: 50 quotes per page
* 1-based indexing (page=1 is first page, page=0 coerced to 1)
* Response includes `totalCount` for pagination UI
* **Advanced filtering**: Comprehensive query parameters for all list endpoints
* `status`: Filter by single status or array of statuses
* `filterText`: Full-text search across quote fields
* `dateFrom`/`dateTo`: Filter by creation date range
* `applicationId`: Filter by associated application
* **Flexible sorting**: Control result ordering
* `sortBy`: Choose field (createdAt, updatedAt, status, number)
* `sortDirection`: asc or desc
* Default: Most recent first (createdAt desc)
**Improvements**
* **Unified response format**: All list endpoints return `{ items: [], totalCount: number }`
* **Updated quote statuses**: Status values now match actual implementation
* Added: `in_progress`, `complete`, `sent`, `accepted`, `applied_to_policy`
* Updated: More granular status tracking for quote lifecycle
* **Better data models**: Clear distinction between lightweight and full quote representations
* **Improved documentation**: Separate guides for submissions and quotes with detailed examples
***
## August 8 2025
### External API enhancements
**Improvements**
* **New submission creation**: Create submissions with complete policy, coverage, and insured data via `POST /api/external/companies/{companyId}/submissions`
* **Submission updates**: Update existing submissions by adding new quotes via `PUT /api/external/companies/{companyId}/submissions/{submissionId}`
* **Enhanced quote retrieval**: Get detailed quote information including policy data, coverages, and billing configuration via `GET /api/external/companies/{companyId}/quotes/{quoteId}`
* **Configuration endpoint**: Retrieve company-specific configuration including rating fields, entity types, and coverage options via `GET /api/external/companies/{companyId}/configuration`
**API structure improvements**
* All endpoints now use `/api/external/` prefix for better organization and versioning
* Enhanced data models with comprehensive `ImportPolicy`, `ImportPolicyCoverage`, and `ImportInsured` objects
* Added support for policy types: Claims Made (C), Occurrence (O), Claims Paid (P), and more
* Expanded quote response with billing details, forms management, and binding settings
**Developer experience**
* Complete API documentation with detailed request/response examples
* Enhanced error handling and validation
* Comprehensive data model reference with all field descriptions
* Support for complex insurance workflows including renewals and endorsements
***
## Initial Release
### Core API functionality
**New features**
* **List submissions**: Retrieve paginated submissions for a company with filtering and sorting options
* **List quotes**: Get all quotes associated with a specific submission
* **Quote management**: Basic quote retrieval and status tracking
* **Authentication**: API key-based authentication for secure access
**Data models**
* Core `Submission` object with status tracking and metadata
* Basic `Quote` object with pricing and status information
* Support for submission types: new business, renewals, and endorsements
* Quote status management: draft, active, expired, bound, declined, superseded
**API foundation**
* RESTful API design following industry standards
* Comprehensive error handling with detailed error responses
* Rate limiting and security best practices
* UUID-based resource identification
# Get Configuration
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration
**Endpoint:**
```
GET /api/external/companies/{companyId}/configuration
```
Retrieves the configuration for your company in AI Insurance. This includes many enumerated fields like the types of entities that can be covered or whose information is tracked.
### **Parameters**
None
## **Response**
| Key | Type | Description |
| ---------------------- | ------ | --------------------------------------------------------------------- |
| `ratingEngineFields` | object | Rating fields with entity type and field key (used to create a quote) |
| `nonRatingFields` | object | Non‑rating fields for policy and insured entities |
| `insuredEntityTypes` | object | Keys are available insured entity types |
| `enabledCoverageTypes` | object | Keys are enabled coverage type IDs |
### **Example Requests**
**cURL**
```bash theme={null}
curl -X GET \
"https://app.aiinsurance.io/api/external/companies//configuration" \
-H "Authorization: ApiKey "
```
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration-fields/overview
Manage entity field definitions for your company
## Overview
Configuration fields define the custom data fields that appear on entity forms (events, insureds, and policies). Each field has a definition specifying its type, key, display label, and optional configuration like select options or calculations.
These endpoints manage **entity fields** only. Rating fields, rating outputs, and rating presets are managed through separate `/configuration/rating/` endpoints.
## Key Concepts
* **fieldDefinition**: A JSON object defining the field's type (`className`), unique key, data path, and optional properties like label, section, and select options
* **entityName**: The entity type the field is associated with — `events`, `insureds`, or `policies`
* **className**: The field type — `InputField`, `SelectField`, `DateField`, `RadioSelect`, or `ExportResolvedField`
## API Endpoints
| Method | Endpoint | Description |
| ------ | --------------------------------- | ---------------------------------------------------- |
| GET | `/configuration/fields` | List all entity fields with filtering and pagination |
| POST | `/configuration/fields` | Create a new entity field |
| DELETE | `/configuration/fields/{fieldId}` | Delete an entity field |
## Permissions
| Action | Permission |
| ------------ | ---------------- |
| List fields | `company:read` |
| Create field | `company:update` |
| Delete field | `company:update` |
## Field Definition Properties
| Property | Type | Required | Description |
| ----------- | ------- | -------- | ------------------------------------------------------------------------------------------ |
| className | string | Yes | Field type: `InputField`, `SelectField`, `DateField`, `RadioSelect`, `ExportResolvedField` |
| key | string | Yes | Unique field key (cannot be `companyId`) |
| path | string | Yes | Dot-notation path for the field value in entity data |
| label | string | No | Human-readable label |
| section | string | No | UI section grouping |
| required | boolean | No | Whether the field is required |
| fields | object | No | Sub-field configuration (e.g., select options) |
| calculation | object | No | Calculation configuration for computed fields |
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440100",
"entityName": "policies",
"fieldDefinition": {
"className": "InputField",
"key": "policyState",
"path": "policyState",
"label": "Policy State",
"section": "Policy Information",
"required": true
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-20T14:00:00.000Z"
}
],
"totalCount": 1
}
```
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration-presets/overview
Manage coverage limit presets for your company
## Overview
Configuration presets define the available coverage limit options for each coverage type. Each preset specifies a set of named limits (e.g., "Per Occurrence", "Aggregate") with their amounts, and can include additional settings for deductibles, defense costs, retroactive dates, and waiting periods.
Presets are stored in the `coverage_limit_presets` table and are scoped to a company via `company_id`. Each preset references a coverage type via `coverageTypeKey`.
## Key Concepts
* **coverageTypeKey**: The string key of an existing coverage type (global or company-specific). Must exist in the `coverage_types` table.
* **limits**: An object containing an array of named limit amounts and an optional `allowLimitEdits` flag controlling whether users can modify amounts on quotes.
* **isDefault**: Whether this preset is the default for its coverage type. Multiple presets per coverage type are allowed, but only one can be the default. When creating a preset with `isDefault: true`, any existing default for the same coverage type is automatically set to non-default.
* **defenseInsideLimit**: Whether defense costs count inside or outside the limit (`"inside"` or `"outside"`).
* **Settings fields**: Optional JSONB configuration for deductibles, limits, retroactive dates, waiting periods, and prior/pending litigation dates. These are opaque blobs passed through to the rating engine.
## API Endpoints
| Method | Endpoint | Description |
| ------ | ----------------------------------- | ----------------------------------- |
| GET | `/configuration/presets` | List coverage limit presets |
| POST | `/configuration/presets` | Create a new coverage limit preset |
| DELETE | `/configuration/presets/{presetId}` | Soft-delete a coverage limit preset |
## Permissions
| Action | Permission |
| ------------- | ---------------- |
| List presets | `company:read` |
| Create preset | `company:update` |
| Delete preset | `company:update` |
## Request Properties
| Property | Type | Required | Description |
| ---------------------------------- | ------- | -------- | ------------------------------------------------------ |
| coverageTypeKey | string | Yes | Coverage type key (must exist) |
| setName | string | Yes | Display name for the preset |
| limits | object | Yes | Limit definitions (see below) |
| isDefault | boolean | No | Whether this is the default preset (defaults to false) |
| defenseInsideLimit | string | No | `"inside"` or `"outside"` |
| deductible | number | No | Deductible amount in dollars |
| retroactiveDate | string | No | ISO date (YYYY-MM-DD) |
| waitingPeriodSettings | object | No | Waiting period configuration |
| deductibleSettings | object | No | Deductible default amount configuration |
| limitSettings | object | No | Limit default amounts configuration |
| retroactiveDateSettings | object | No | Retroactive date default amount configuration |
| priorPendingLitigationDateSettings | object | No | Prior/pending litigation date configuration |
### Limits Object
| Property | Type | Required | Description |
| ---------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------ |
| limits | array | Yes | Array of limit definitions |
| limits\[].id | string | Yes | Unique identifier for this limit |
| limits\[].name | string | Yes | Display name (e.g., "Per Occurrence") |
| limits\[].amount | number \| string | No | Limit amount — a number (e.g. 1000000) or a string (e.g. "100%", "-"). Omit when not applicable. |
| allowLimitEdits | boolean | No | Whether users can edit limit amounts on quotes |
## Response Properties (GET)
The list endpoint returns `{ items, totalCount }` where each item includes all request properties plus:
| Property | Type | Description |
| --------- | -------------- | ------------------ |
| id | string (UUID) | Preset identifier |
| createdAt | string \| null | ISO 8601 timestamp |
| updatedAt | string \| null | ISO 8601 timestamp |
Nullable fields (`defenseInsideLimit`, `deductible`, `retroactiveDate`, and all settings) return `null` when not set.
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration-rating-fields/overview
Manage rating engine input field definitions for your company
## Overview
Configuration rating fields define the input fields that feed data into the rating engine. Each field has a definition specifying its type, key, display label, and optional configuration like select options or display conditions. Fields are associated with an entity type (e.g., "policies", "dealership") and a rating engine revision.
These endpoints manage **rating input fields** only. Entity fields (events, insureds, policies) are managed through `/configuration/fields` endpoints.
## Key Concepts
* **fieldDefinition**: A JSON object defining the field's type (`className`), unique key, data path, and optional properties like label, section, and display conditions
* **entityType**: The rating entity type the field applies to — can be `policies` or any exposure type (e.g., `dealership`, `company`)
* **ratingEngineRevisionId**: The rating engine revision this field belongs to — must already exist
* **revisionStrategy**: Controls how the revision is updated — `UpdateExistingRevision` modifies the specified revision in place. `CreateNewRevision` is not yet implemented.
* **className**: The field type — `AddressField`, `DateField`, `GroupField`, `InputField`, `LocalCurrency`, `MultiSelectField`, `SelectField`, or `StaticField`
* **rank**: UI rendering order within the entity type — lower values render first, `null` renders last. Returned on list responses. Set via `PUT /configuration/rating/fields/rank`; not set on creation. Not used as the list endpoint's sort key.
## API Endpoints
| Method | Endpoint | Description |
| ------ | ---------------------------------------- | ------------------------------------------------- |
| GET | `/configuration/rating/fields` | List rating input fields |
| POST | `/configuration/rating/fields` | Create a new rating input field |
| DELETE | `/configuration/rating/fields/{fieldId}` | Delete a rating input field |
| PUT | `/configuration/rating/fields/rank` | Reorder rating input fields within an entity type |
## Permissions
| Action | Permission |
| -------------- | ---------------- |
| List fields | `company:read` |
| Create field | `company:update` |
| Delete field | `company:update` |
| Reorder fields | `company:update` |
## Field Definition Properties
| Property | Type | Required | Description |
| ----------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| className | string | Yes | Field type: `AddressField`, `DateField`, `GroupField`, `InputField`, `LocalCurrency`, `MultiSelectField`, `SelectField`, `StaticField` |
| key | string | Yes | Unique field key (cannot be `companyId`) |
| path | string | Yes | Dot-notation path for the field value in rating data |
| label | string | No | Human-readable label |
| section | string | No | UI section grouping |
| required | boolean | No | Whether the field is required |
| fields | object | No | Sub-field configuration (e.g., select options) |
| displayCondition | string \| boolean \| object | No | Condition controlling when the field is displayed. Create accepts a string; list responses may also return a boolean or structured conditional object. |
| displayConditions | object | No | Multiple display conditions |
| value | string \| object | No | Default value. Create accepts a string; list responses may also return a structured value reference (e.g., path-based lookup). |
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration-rating-form-logic/overview
Manage form-attachment rules in rating engine revision config
## Overview
Configuration rating form-logic rules determine which forms are attached to a policy or quote. Rules are stored in the rating engine revision's config JSON (`rating_engine_revisions.config.policyFormLogicConfigs`). Each rule has a `shouldAdd` conditional expression that is evaluated during rating against the policy, insured, coverage, and form data.
## Key Concepts
* **ratingEngineRevisionId**: The rating engine revision whose config holds the rules — must already exist.
* **revisionStrategy**: Controls how the revision is updated — `UpdateExistingRevision` modifies the specified revision in place. `CreateNewRevision` is not yet implemented.
* **ruleName**: Human-readable name for the rule.
* **rank**: Controls the position of attached forms in the output list (lower numbers appear first). Does not control evaluation order. Duplicates are permitted. Required on create, so returned rules always carry a rank.
* **step**: Optional — tag controlling which form-selection contexts the rule's output appears in. `"policies"` (appears during policy form selection), `"quotes"` (appears during quote form selection), or an array of these values. If omitted, the rule's output only appears during policy form selection.
* **shouldAdd**: A conditional expression that evaluates to true or false. When it evaluates to true, the form is attached. See [Expression Shapes](#expression-shapes) below.
## API Endpoints
| Method | Endpoint | Description |
| ------ | ------------------------------------------------ | --------------------------------------------------- |
| GET | `/configuration/rating/form-logic` | List form-logic rules in the revision config |
| POST | `/configuration/rating/form-logic` | Create a new form-logic rule in the revision config |
| DELETE | `/configuration/rating/form-logic/{formLogicId}` | Remove a form-logic rule from the revision config |
## Permissions
| Action | Permission |
| ----------- | ---------------- |
| List rules | `company:read` |
| Create rule | `company:update` |
| Delete rule | `company:update` |
## GET Query Parameters
| Parameter | Type | Required | Description |
| ---------------------- | -------------------------- | -------- | ---------------------------------------------------------------------------------- |
| ratingEngineRevisionId | string (UUID) | Yes | Rating engine revision whose config holds the rules |
| ruleName | string | No | Filter to rules whose `ruleName` matches exactly. Must be non-empty when provided. |
| id | string (UUID) \| string\[] | No | Filter to a single rule ID or an array of rule IDs |
| sortBy | `"ruleName"` \| `"rank"` | No | Sort field — default `ruleName` |
| sortDirection | `"asc"` \| `"desc"` | No | Sort direction — default `asc`. Ties are broken by `id` in the same direction. |
## GET Response Properties
Each item in `items` has the following shape.
| Property | Type | Description |
| --------- | --------------------------- | ----------------------------------------------------------------------------------------------- |
| id | string (UUID) | Server-generated rule ID |
| ruleName | string | Human-readable name for the rule |
| rank | number | Sort rank controlling output position (lower first) |
| step | string \| string\[] \| null | `"policies"`, `"quotes"`, an array of the two, or `null` if the rule was created without a step |
| shouldAdd | object | Conditional expression — see [Expression Shapes](#expression-shapes) |
Filters and sorts run on raw rules; response validation runs only on the surviving rows. A rule that survives filtering but has a missing or malformed `id`, `rank`, or `shouldAdd` returns a 400 `InvalidProperties` response. In practice, rules written through this API always pass validation, so this condition indicates a data-integrity issue with legacy config rather than a caller error.
## POST Request Properties
| Property | Type | Required | Description |
| ---------------------- | ------------------- | -------- | ------------------------------------------------------------------ |
| ratingEngineRevisionId | string (UUID) | Yes | Rating engine revision to add the rule to |
| revisionStrategy | string | Yes | `"UpdateExistingRevision"` or `"CreateNewRevision"` (501) |
| ruleName | string | Yes | Human-readable name for the rule |
| rank | number | Yes | Sort rank — lower values appear earlier in the attached forms list |
| step | string \| string\[] | No | `"policies"`, `"quotes"`, or an array of the two |
| shouldAdd | object | Yes | Conditional expression (see below) |
## Expression Shapes
`shouldAdd` is a recursive structure built from three variants.
### Branch Expression
Combines child expressions with a logical operator.
```json theme={null}
{
"operator": "AND",
"conditions": [
{ "leftKey": "policy.data.state", "operator": "=", "rightValue": "CA" },
{ "leftKey": "form.number", "operator": "=", "rightValue": "FM-0002" }
]
}
```
Supported `operator` values: `AND`, `OR`.
### Leaf Expression
Compares the value at `leftKey` against `rightValue` using the given operator.
```json theme={null}
{ "leftKey": "policy.data.state", "operator": "=", "rightValue": "CA" }
```
Supported `operator` values: `=`, `!=`, `<`, `<=`, `>`, `>=`, `IN`, `NOTIN`, `EXISTS`, `NOTEXISTS`, `SOME`.
Operator-specific behavior:
* `EXISTS` / `NOTEXISTS` — check only whether `leftKey` resolves to a defined, non-null value. `rightValue` is required structurally but ignored.
* `IN` / `NOTIN` — `rightValue` is either an array (membership: the `leftKey` value must be an element) or a string (substring: the `leftKey` value must appear within `rightValue`).
* `SOME` — `rightValue` is a nested expression evaluated against each element of the array at `leftKey`. Returns `false` if `leftKey` does not resolve to an array.
* `=`, `!=`, `<`, `<=`, `>`, `>=` — standard JavaScript-style comparison between the resolved `leftKey` value and `rightValue`.
`rightValue` may be a primitive, an array, `null`, or — for `SOME` — a nested expression.
### Inverted Leaf Expression
Checks whether a static `leftValue` appears in the array (or string) stored at `rightKey`. Only the `IN` operator is supported in this shape.
```json theme={null}
{ "leftValue": "FM-0001", "operator": "IN", "rightKey": "policy.attachedFormNumbers" }
```
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration-rating-outputs/overview
Manage rating output field definitions for your company
## Overview
Configuration rating outputs define the fields that display rating engine results (e.g., annual rate, monthly rate). All rating output fields use the entity name `rating_engine_display` and are stored in `company_fields` with an association in `company_entity_fields`.
Each rating output field automatically gets a smart tag created with the naming convention `AII{key}PrimaryInsured`, enabling the field's output to be referenced in policy and quote documents.
## Key Concepts
* **fieldDefinition**: A JSON object defining the field's type (`className`), unique key, data path, and optional properties like label and display flag
* **className**: Currently restricted to `InputField` (the only type used for rating outputs)
* **Smart tag**: Always auto-created with name `AII{key}PrimaryInsured` and categories `["policy", "quote"]`. The field key must be alphanumeric.
* **displayNeeded**: Whether this field appears in rating output display tables
* **smartTagsNeeded**: Whether the auto-created smart tag can resolve a value at rating time. The smart tag row is always created, but the rater only pushes this field's output into the smart-tag bucket when `smartTagsNeeded` is `true`.
## API Endpoints
| Method | Endpoint | Description |
| ------ | ----------------------------------------- | ---------------------------------------------- |
| GET | `/configuration/rating/outputs` | List rating output fields |
| POST | `/configuration/rating/outputs` | Create a new rating output field |
| DELETE | `/configuration/rating/outputs/{fieldId}` | Delete a rating output field and its smart tag |
## Permissions
| Action | Permission |
| ------------ | ---------------- |
| List fields | `company:read` |
| Create field | `company:update` |
| Delete field | `company:update` |
## Field Definition Properties
| Property | Type | Required | Description |
| --------------- | ------- | -------- | ------------------------------------------------------------------- |
| className | string | Yes | Field type: `InputField` |
| key | string | Yes | Unique field key (cannot be `companyId`; must be alphanumeric) |
| path | string | Yes | Dot-notation path for the field value in entity data |
| label | string | No | Human-readable label |
| section | string | No | UI section grouping |
| required | boolean | No | Whether the field is required |
| fields | object | No | Sub-field configuration |
| displayNeeded | boolean | No | Whether this field is displayed in rating output tables |
| smartTagsNeeded | boolean | No | Whether this field's output is exposed to smart tags at rating time |
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/configuration-rating-presets/overview
Manage coverage limit presets in rating engine revision config
## Overview
Configuration rating presets define coverage limit options stored in the rating engine revision's config JSON (`rating_engine_revisions.config.coverageLimitPresets`). These endpoints are for **rating-engine companies** where presets live in the revision config, not in the `coverage_limit_presets` table.
For non-rating-engine companies, use the [Configuration Presets](/api-legacy-reference/configuration-presets/overview) endpoints instead.
## Key Concepts
* **ratingEngineRevisionId**: The rating engine revision whose config contains the presets — must already exist.
* **revisionStrategy**: Controls how the revision is updated — `UpdateExistingRevision` modifies the specified revision in place. `CreateNewRevision` is not yet implemented.
* **coverageTypeKey**: The string key of an existing coverage type (global or company-specific). Must exist in the `coverage_types` table.
* **limits**: An object containing an array of named limit amounts and an optional `allowLimitEdits` flag controlling whether users can modify amounts on quotes.
* **isDefault**: Whether this preset is the default for its coverage type. When creating a preset with `isDefault: true`, any existing default for the same coverage type within the revision config is automatically set to non-default.
* **Settings fields**: Optional JSON configuration for deductibles, limits, retroactive dates, waiting periods, and prior/pending litigation dates. These are opaque blobs passed through to the rating engine.
## API Endpoints
| Method | Endpoint | Description |
| ------ | ------------------------------------------ | --------------------------------------------------------- |
| GET | `/configuration/rating/presets` | List coverage limit presets from the revision config |
| POST | `/configuration/rating/presets` | Create a new coverage limit preset in the revision config |
| DELETE | `/configuration/rating/presets/{presetId}` | Remove a preset from the revision config |
## Permissions
| Action | Permission |
| ------------- | ---------------- |
| List presets | `company:read` |
| Create preset | `company:update` |
| Delete preset | `company:update` |
## GET Response Properties
The list endpoint returns `{ items }`. Each item has these properties:
| Property | Type | Description |
| ---------------------------------- | -------------- | -------------------------------------------------------- |
| id | string (UUID) | Preset identifier |
| coverageTypeKey | string | Coverage type key this preset belongs to |
| setName | string | Display name for the preset |
| isDefault | boolean | Whether this is the default preset for its coverage type |
| limits | object | Limit definitions (see Limits Object below) |
| defenseInsideLimit | string \| null | `"inside"` or `"outside"` |
| deductible | number \| null | Deductible amount in dollars |
| waitingPeriodSettings | object \| null | Waiting period configuration |
| deductibleSettings | object \| null | Deductible default amount configuration |
| limitSettings | object \| null | Limit default amounts configuration |
| retroactiveDateSettings | object \| null | Retroactive date default amount configuration |
| priorPendingLitigationDateSettings | object \| null | Prior/pending litigation date configuration |
Unlike the table-based [Configuration Presets](/api-legacy-reference/configuration-presets/overview) endpoint, config-JSON presets do not have `createdAt`, `updatedAt`, or `retroactiveDate` fields. Sorting is by `setName` (default) or `coverageTypeKey` instead of timestamps.
## POST Request Properties
| Property | Type | Required | Description |
| ---------------------------------- | ------------- | -------- | --------------------------------------------------------- |
| ratingEngineRevisionId | string (UUID) | Yes | Rating engine revision to add the preset to |
| revisionStrategy | string | Yes | `"UpdateExistingRevision"` or `"CreateNewRevision"` (501) |
| coverageTypeKey | string | Yes | Coverage type key (must exist) |
| setName | string | Yes | Display name for the preset |
| limits | object | Yes | Limit definitions (see below) |
| isDefault | boolean | No | Whether this is the default preset (defaults to false) |
| defenseInsideLimit | string | No | `"inside"` or `"outside"` |
| deductible | number | No | Deductible amount in dollars |
| waitingPeriodSettings | object | No | Waiting period configuration |
| deductibleSettings | object | No | Deductible default amount configuration |
| limitSettings | object | No | Limit default amounts configuration |
| retroactiveDateSettings | object | No | Retroactive date default amount configuration |
| priorPendingLitigationDateSettings | object | No | Prior/pending litigation date configuration |
### Limits Object
| Property | Type | Required | Description |
| ---------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------ |
| limits | array | Yes | Array of limit definitions |
| limits\[].id | string | Yes | Unique identifier for this limit |
| limits\[].name | string | Yes | Display name (e.g., "Per Occurrence") |
| limits\[].amount | number \| string | No | Limit amount — a number (e.g. 1000000) or a string (e.g. "100%", "-"). Omit when not applicable. |
| allowLimitEdits | boolean | No | Whether users can edit limit amounts on quotes |
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/coverage-types/overview
Create, manage, and query coverage types and their fields
## Overview
Coverage types represent the lines of coverage a company offers, such as General Liability, Workers Compensation, or Auto. Each coverage type has a set of **fields** that determine what data can be recorded on events (claims and incidents) of that type.
There are two kinds of coverage types:
* **Global** coverage types (e.g., `general_liability`, `inland_marine`) are shared across all companies and cannot be created or deleted via the API.
* **Company-specific** coverage types are created and owned by a single company.
Use the Coverage Types API to list all available coverage types (global and company-specific), create company-specific coverage types, control which types are active for a company, discover which fields are available for each coverage type, or set the fields on company-specific coverage types.
***
## API Endpoints
* **[List Coverage Types](/api-reference/coverage-types/list-coverage-types)** - List all coverage types (global and company-specific) with optional label filtering
* **[Create Coverage Type](/api-reference/coverage-types/create-coverage-type)** - Create a new company-specific coverage type
* **[Delete Coverage Type](/api-reference/coverage-types/delete-coverage-type)** - Permanently delete a company-specific coverage type
* **[Set Enabled Coverage Types](/api-reference/coverage-types/set-enabled-coverage-types)** - Replace the company's enabled coverage types list
* **[Get Coverage Type Fields](/api-reference/coverage-types/get-coverage-type-fields)** - Retrieve the fields associated with a coverage type
* **[Set Coverage Type Fields](/api-reference/coverage-types/set-coverage-type-fields)** - Replace the fields on a company-specific coverage type
***
## Example: Create a Coverage Type
```json theme={null}
POST /api/external/companies/{companyId}/coverage-types
{
"key": "vfs_general_liability",
"label": "General Liability"
}
```
Response:
```json theme={null}
{
"id": "vfs_general_liability"
}
```
## Example: Get Coverage Type Fields
```json theme={null}
GET /api/external/companies/{companyId}/coverage-types/general_liability/fields
{
"coverageTypeId": "general_liability",
"coverageTypeName": "General Liability",
"fields": [
"reportDate",
"eventDescription",
"settlementDemand",
"indemnityPaid",
"alaeReserveAmount"
],
"metadata": {
"coverageTypeScope": "global",
"fieldSources": ["database", "static"]
}
}
```
# Data Models
Source: https://docs.aiinsurance.io/api-legacy-reference/data-models
This section provides complete reference documentation for all data structures used in the Submissions and Quotes API.
***
## **Submission Object**
| Field | Type | Description |
| ---------------------------------------------------------------------- | ----------------- | --------------------------------- |
| `id` | string (UUID) | Unique submission identifier |
| `createdAt` | string (ISO 8601) | Submission creation timestamp |
| `updatedAt` | string (ISO 8601) | Last update timestamp |
| [`status`](/api-legacy-reference/data-models#submission-status-values) | string | Current submission status |
| [`type`](/api-legacy-reference/data-models#submission-types) | string | Type of submission |
| `number` | string | Human-readable submission number |
| `primaryInsuredName` | string | Name of the primary insured party |
| `applicationId` | string (UUID) | Associated application identifier |
| `name` | string | Submission name/description |
***
## **Quote Object (Lightweight)**
Returned by the **List Quote Info** endpoint (`GET /api/external/companies/{companyId}/quotes-info`). This lightweight representation includes essential fields only for efficient listing and searching.
| Field | Type | Description |
| ----------------------------------------------------------------- | --------------------------- | -------------------------------------------------- |
| `id` | string (UUID) | Unique quote identifier |
| `number` | string | Human-readable quote number (format: Q########-##) |
| [`status`](/api-legacy-reference/data-models#quote-status-values) | enum | Current quote status |
| `createdAt` | string (ISO 8601) | Quote creation timestamp |
| `updatedAt` | string (ISO 8601, optional) | Last update timestamp |
| `description` | string (optional) | Quote description from policy info |
| `policyId` | string (UUID, optional) | Associated policy identifier (if bound) |
| `policyCurrency` | string (optional) | Policy currency code (e.g., "USD", "CAD") |
| `grandTotal` | number (optional) | Total premium amount including taxes and fees |
***
## **Quote Object (Full)**
Returned by the **List Quotes** (`GET /api/external/companies/{companyId}/quotes`) and **Get Quote** (`GET /api/external/companies/{companyId}/quotes/{quoteId}`) endpoints. This complete representation includes all quote data, coverages, and billing information.
| Field | Type | Description |
| ----------------------------------------------------------------- | ----------------------- | ------------------------------------------------------------------------------- |
| `id` | string (UUID) | Unique quote identifier |
| `number` | string | Human-readable quote number |
| `wizardType` | enum | Quote workflow type: `quote`, `endorsement`, `renewal`, `forms`, `cancellation` |
| [`status`](/api-legacy-reference/data-models#quote-status-values) | enum | Current quote status |
| `submissionId` | string (UUID) | Associated submission identifier |
| `applicationId` | string (UUID, optional) | Associated application identifier |
| `policyId` | string (UUID, optional) | Associated policy identifier (if bound) |
| `data` | object | Complete quote data including policy info, coverages, insureds, and billing |
| `previewData` | object (optional) | Rating preview data with premium breakdowns |
| `billingEmail` | string (optional) | Email address for billing communications |
See the **Get Quote** endpoint for the complete QuoteDetail schema with all nested fields.
***
## **ImportPolicy Object**
| Field | Type | Description |
| --------------------------------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------- |
| `policyNumber` | string | Customer facing policy identifier |
| `policyStartDate` | string (ISO 8601) | Date policy begins |
| `policyEndDate` | string (ISO 8601) | Date policy ends |
| [`policyType`](/api-legacy-reference/data-models#policy-type-options) | enum | A single letter "C", "O", etc. (see below) |
| `ratingData` | object | All policy-level rating data (see [config tutorial](/api-legacy-reference/submissions/overview#ratingenginefields)) |
| `billingPeriod` | enum | "doNotSendBill", "annual", "quarterly", "monthly" |
| `renewingPolicyNumber` | string (optional) | If a renewal, the number of the policy being renewed |
| `policyCompanyEntityFields` | object | All non-rating policy-level data (see [config tutorial](/api-legacy-reference/submissions/overview#nonratingfields)) |
| `brokerName` | string (optional) | The name of the broker/agent |
| `brokerageName` | string (optional) | The name of the brokerage/agency |
| `brokerCommission` | number (optional) | A percentage (e.g. 12.3 means 12.3%) |
***
## **ImportPolicyCoverage Object**
```json theme={null}
{
"coverageTypeId": enum,
"deductible": number (in dollars, optional),
"retroactibveDate": string (ISO 8601, optional),
"priorOrPendingLitigationDate": string (ISO 8601, optional),
"defenseInsideLimit": "inside" or "outside" (optional),
"presetId": enum (optional),
"limits": [{ "limitName": string, "amount": number | string }],
"endorsements": {
[insuredId]: {
"deductible": number, (in dollars, optional)
"retroactiveDate": string, // (ISO 8601, optional)
"priorOrPendingLitigationDate": string (ISO 8601, optional),
"limits": [{ "limitName": string, "amount": number | string }],
"presetId": enum (optional)
}
}
}
```
***
## **ImportInsured Object**
| Field | Type | Description |
| ---------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- |
| `insuredName` | string | The name of the insured, used to identify in the system |
| `joinDate` | string (ISO 8601) | Date coverage begins for insured |
| `terminationDate` | string (ISO 8601) | Date coverage ends for insured |
| `policyInsuredType` | enum | "primary", "additional", "named", or "related" |
| `entityType` | enum | The type of covered exposure |
| `applicationData` | object | All insured-level rating data |
| `insuredCompanyEntityFields` | object | All non-rating insured-level data (see [config tutorial](/api-legacy-reference/submissions/overview#nonratingfields)) |
***
## **Policy Type Options**
| Value | Description |
| ----- | -------------------------------------------- |
| `C` | Claims Made |
| `N` | Claims Made "Nose" (Prior Acts) |
| `T` | Claims Made "Tail" (Reporting Endorsement) |
| `O` | Occurrence |
| `P` | Claims Paid |
| `S` | Slot Coverage - Claims Made |
| `Q` | Slot Coverage "Tail" (Reporting Endorsement) |
| `R` | Slot Coverage - Occurrence |
***
## **Submission Status Values**
| Value | Description |
| -------------- | ---------------------------------------- |
| `draft` | Submission is being prepared |
| `submitted` | Submission has been submitted for review |
| `under_review` | Submission is being reviewed |
| `quoted` | Quote has been generated |
| `bound` | Policy has been bound |
| `declined` | Submission was declined |
***
## **Submission Types**
| Value | Description |
| -------------- | --------------------------------------------------------------------------------------------------------------- |
| `new_business` | A submission that will create a new policy |
| `renewal` | Submission that will create a new policy from an existing one. This new policy can contain updated information. |
| `endorsement` | Submission that will update an existing policy |
***
## **Quote Status Values**
| Value | Description |
| ------------------- | ------------------------------------------- |
| `in_progress` | Quote is being created |
| `complete` | Quote is complete and ready for review |
| `sent` | Quote has been sent to the client |
| `accepted` | Quote has been accepted by the client |
| `bound` | Quote has been bound to a policy |
| `cancelled` | Quote was cancelled |
| `archived` | Quote has been archived |
| `applied_to_policy` | Quote changes have been applied to a policy |
***
## Field Types
| Type | Description | Usage in Submission |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- |
| `InputField` | A field that takes a value of type `string` or `number`, based on the `fields.type` value | `"key" : "some string"` or `"key" : 555` |
| `DateField` | A field that takes a value of type `string` in the format `YYYY-MM-DD` | `"key" : "2025-10-03"` |
| `SelectField` or `RadioSelect` | A field that takes a value of type `string` or `number`, based on the `value` property of `fields.options` | `"key" : "some option"`, where `fields.options:[{"value":"some option"},...]` |
| `MultiSelectField` | A field that takes a value of type `string`, based on the `value` properties of `fields.options`. | `"key" : "some option 1, some option 2"`, where `fields.options:[{"value":"some option 1"}, {"value":"some option 2"},...]` |
| `GroupField` | A field that takes a value of type `array`. This `array` is made of objects, whose keys are found in `fields.subFields`. Each field in `fields.subFields` is a type of `Field` | `"key" : [{"subKey": "value"},...]` |
***
## JSON Schema Format Types
Configuration endpoints (like [GET /quotes/configuration](/api-reference/quotes/get-quotes-configuration)) return JSON Schema definitions for custom data fields. The `format` property indicates the semantic type of values:
| Format | Type | Description | Example Value |
| ---------- | -------- | -------------------------- | ---------------------------------- |
| `date` | `string` | ISO 8601 date (YYYY-MM-DD) | `"2025-01-15"` |
| `email` | `string` | Email address | `"user@example.com"` |
| `phone` | `string` | Phone number | `"+1-555-123-4567"` |
| `currency` | `number` | Currency amount (simple) | `1500` |
| `currency` | `object` | Currency amount with code | `{ "code": "USD", "value": 1500 }` |
| `percent` | `string` | Percentage value | `"15.5"` |
| `address` | `string` | Physical address | `"123 Main St, ..."` |
### Currency Fields
There are two types of currency fields:
1. **Simple currency** (`type: "number", format: "currency"`): A plain numeric amount. The currency code is typically derived from the policy's currency setting.
```json theme={null}
{ "annualPremium": 1500 }
```
2. **Currency with code** (`type: "object", format: "currency"`): An object containing both the currency code and value. Used when the currency may differ from the policy default.
```json theme={null}
{ "foreignExpense": { "code": "EUR", "value": 2500 } }
```
These formats are used across all configuration endpoints (quotes, events, etc.) and follow [JSON Schema format semantics](https://json-schema.org/understanding-json-schema/reference/string#format).
***
## **Exposure-Level Rating**
**Exposure-level rating** is a method of calculating insurance premiums where each individual item or entity covered under a policy (called an "exposure") is rated independently based on its specific characteristics and risk factors.
### How Exposure-Level Rating Works
In exposure-level rating, each exposure within a policy is evaluated separately:
1. **Individual Assessment**: Each exposure (e.g., a building, vehicle, healthcare provider, or other entity type) is assessed based on its own unique characteristics, such as:
* Physical attributes (size, construction type, location)
* Operational details (usage patterns, safety features)
* Risk factors specific to that exposure
2. **Independent Premium Calculation**: A premium is calculated for each exposure individually using exposure-specific rating questions and modifier factors.
3. **Aggregation**: The individual exposure premiums are then summed together to form the total exposure-level premium for the policy.
4. **Policy-Level Adjustments**: After exposure-level rating is complete, policy-level modification factors are applied to the aggregated total.
### Exposure-Level vs. Policy-Level Rating
* **Exposure-Level Rating**: Evaluates individual entities (exposures) within a policy. Each exposure has its own set of rating questions and modifier factors. Examples include rating a specific doctor's malpractice risk or a particular building's property risk.
* **Policy-Level Rating**: Evaluates the policy as a whole, applying factors that affect the entire policy regardless of individual exposures. Examples include organizational risk factors, program-level discounts, or overall policy terms.
### Example
Consider a medical malpractice policy covering a hospital with multiple doctors:
* **Exposure-Level Rating**: Each doctor (exposure) is rated individually based on:
* Their medical specialty
* Geographic location
* Years of experience
* Malpractice history
* **Policy-Level Rating**: The policy as a whole is evaluated based on:
* Hospital-wide risk management programs
* Overall claims history
* Negotiated risk agreements
The final premium combines both exposure-level and policy-level calculations.
For more information about how exposure-level rating fits into the overall data model, see [Understanding the AI Insurance Model](/getting-started/intro-to-aiinsurance/understanding-the-ai-insurance-model#2-exposure-level-rating-data).
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/defendants/overview
Defendants represent parties named in a lawsuit. They are sub-resources of lawsuits, which are themselves sub-resources of events. The Defendants API allows you to create, retrieve, update, and delete defendant information for a specific lawsuit.
**Key Concepts:**
* Defendants belong to a lawsuit, accessed via the event path: `/events/{eventId}/lawsuit/defendants`
* Each defendant is either an insured (linked via `insuredId`) or a non-insured party (identified by `nonInsuredName`) — exactly one must be set
* Defendants can optionally be linked to an attorney and/or law firm
* Deleting a defendant is a soft delete — the record is preserved but no longer returned by GET or LIST
***
## API Endpoints
* **[List Defendants](/api-reference/defendants/list-defendants)** - Retrieve paginated list of defendants for a lawsuit
* **[Create Defendant](/api-reference/defendants/create-defendant)** - Create a defendant for a lawsuit
* **[Get Defendant](/api-reference/defendants/get-defendant)** - Retrieve a single defendant by ID
* **[Update Defendant](/api-reference/defendants/update-defendant)** - Update a defendant (send null to clear fields)
* **[Delete Defendant](/api-reference/defendants/delete-defendant)** - Soft delete a defendant
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ---------------- | -------------------------------------- |
| `insuredId` | Defendant is a non-insured party |
| `nonInsuredName` | Defendant is an insured |
| `phoneNumber` | Phone number not provided |
| `email` | Email not provided |
| `attorneyId` | No attorney assigned |
| `lawFirmId` | No law firm assigned |
| `createdAt` | Timestamp not tracked (legacy records) |
| `updatedAt` | Defendant has never been updated |
***
## Filtering and Sorting
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | ----------------------------------- |
| `id` | string or array | Filter by specific defendant ID(s) |
| `filterText` | string | Text search across defendant fields |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of defendants for the current page
* `totalCount` - Total number of matching defendants across all pages
***
## Permissions
Access to defendants requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| ---------------- | ---------------------- |
| List Defendants | `company.event:export` |
| Create Defendant | `company.event:export` |
| Get Defendant | `company.event:export` |
| Update Defendant | `company.event:export` |
| Delete Defendant | `company.event:export` |
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "660e8400-e29b-41d4-a716-446655440000",
"lawsuitId": "770e8400-e29b-41d4-a716-446655440000",
"insuredId": null,
"nonInsuredName": "John Doe",
"phoneNumber": "+1-555-123-4567",
"email": "john@example.com",
"attorneyId": "880e8400-e29b-41d4-a716-446655440000",
"lawFirmId": "990e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-02-15T10:30:00.000Z",
"updatedAt": "2026-02-16T14:20:00.000Z"
}
],
"totalCount": 1
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/event-financials/overview
The Event Financials API allows you to manage financial transactions and reserves for events (claims and incidents). This includes creating payments, tracking reserves, and viewing financial totals across events.
**Key Concepts:**
* **Transactions**: Financial records associated with events (payments, invoices)
* **Reserves**: Expected costs set aside for future payments
* **Transaction Types**: Categories like `indemnity_invoice` (loss payments) and `alae_invoice` (allocated loss adjustment expenses)
* **Amounts in cents**: Most endpoints return amounts in cents (multiply by 100 from dollars)
***
## API Endpoints
### Transaction Management
* **[List Event Transactions](/api-reference/event-financials/list-event-transactions)** - Get paginated list of transactions for an event
* **[Get Event Transaction](/api-reference/event-financials/get-event-transaction)** - Get a single transaction with line items
* **[Create Event Transaction](/api-reference/event-financials/create-event-transaction)** - Create a new payment or invoice
* **[Void Event Transaction](/api-reference/event-financials/void-event-transaction)** - Void an existing transaction
* **[Get Event Transaction Totals](/api-reference/event-financials/get-event-transaction-totals)** - Get transaction totals by category for an event
### Reserves & Totals
* **[Get Event Reserves](/api-reference/event-financials/get-event-reserves)** - Get reserve amounts by category for an event
* **[Update Expected Totals](/api-reference/event-financials/update-expected-totals)** - Update expected total (reserves) for a category
* **[List Expected Total Timeline](/api-reference/event-financials/list-expected-total-timeline)** - Get chronological timeline of reserve changes
* **[List Financial Totals](/api-reference/event-financials/list-event-financial-totals)** - Get financial totals across all events by transaction type
***
## Transaction Types
Transaction types are configurable per company. Common built-in types include:
| Type | Description |
| ------------------- | ---------------------------------- |
| `indemnity_invoice` | Loss payments (indemnity) |
| `alae_invoice` | Allocated Loss Adjustment Expenses |
Use the [GET /transaction-categories](/api-reference/transaction-categories/list-transaction-categories) endpoint to see all available transaction types for your company.
### Itemized vs Non-Itemized
Transaction types can be either:
* **Non-itemized**: Single amount per transaction (e.g., `indemnity_invoice`)
* **Itemized**: Multiple line items per transaction (e.g., `alae_invoice`)
When creating transactions, use the appropriate field:
* Non-itemized: `amount` field (required), `lineItems` forbidden
* Itemized: `lineItems` array (required), `amount` forbidden
***
## Transaction Status
| Status | Description |
| ---------- | ---------------------------------------- |
| `owed` | Payment is pending/due |
| `paid` | Payment has been made |
| `approved` | Transaction is approved but not yet paid |
| `void` | Transaction has been voided |
***
## Amount Conventions
**Important:** Different endpoints use different units:
| Endpoint | Unit |
| ------------------------- | ----------- |
| GET transactions | Cents |
| GET reserves | Cents |
| GET totals | Cents |
| POST transactions | Cents |
| **PATCH expected-totals** | **Dollars** |
The PATCH expected-totals endpoint uses dollars for historical compatibility.
***
## Reserves vs Expected Totals
* **Expected Total**: The anticipated total cost for a category (set by user/adjuster)
* **Reserves**: Calculated as `expectedTotal - paid - owed`
* **Owed**: Total amount of pending transactions
* **Paid**: Total amount of completed transactions
Example:
```
Expected Total: $15,000
Paid: $5,000
Owed: $2,000
Reserves: $8,000 (15000 - 5000 - 2000)
```
***
## Permissions
| Operation | Permission |
| ---------------------------- | -------------------------------------------------- |
| List/Get Transactions | `company.event:export` |
| Create Transactions | `company.payment:create` |
| Void Transaction | `company.payment:update` |
| Get Transaction Totals | `company.payment:read` |
| Get Reserves | `company.payment:read` |
| Update Expected Totals | `company.claim:update` / `company.incident:update` |
| List Expected Total Timeline | `company.payment:read` |
| List Financial Totals | `company.payment:read` |
***
## Example: Creating a Payment
```json theme={null}
// POST /events/{eventId}/financials/transactions
{
"transactionType": "indemnity_invoice",
"transactionDate": "2025-01-15",
"amount": 500000,
"payeeId": "550e8400-e29b-41d4-a716-446655440050",
"description": "Initial claim payment",
"status": "paid",
"paidDate": "2025-01-20"
}
```
Response:
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440010"
}
```
***
## Example: Voiding a Transaction
```json theme={null}
// PATCH /events/{eventId}/financials/transactions/{transactionId}
{
"status": "void",
"voidReason": "Duplicate invoice"
}
```
Response returns the full transaction detail with `status: "void"` and the provided `voidReason`.
***
## Example: Updating Reserves
```json theme={null}
// PATCH /events/{eventId}/financials/expected-totals
{
"type": "claim",
"categoryId": "indemnity_invoice",
"expectedTotal": 15000
}
```
Response:
```json theme={null}
{
"eventId": "550e8400-e29b-41d4-a716-446655440001",
"categoryId": "indemnity_invoice",
"expectedTotal": 15000,
"reserves": 10000
}
```
The `type` field (claim/incident) is required for permission resolution. The event type must match the value provided.
***
## Nullable Fields
| Field | When null |
| --------------- | ------------------------------------ |
| `payeeId` | No payee associated with transaction |
| `invoiceNumber` | No invoice number assigned |
| `invoiceDate` | No invoice date set |
| `dueDate` | No due date set |
| `paidDate` | Transaction is not paid |
| `description` | No description provided |
| `voidReason` | Transaction is not voided |
| `reserves` | Category doesn't support reserves |
| `updatedAt` | Transaction has never been updated |
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/events/overview
Events represent claims and incidents in AI Insurance. The Events API allows you to programmatically create, read, update, and delete event information, including custom entity data specific to your company's configuration.
**Key Concepts:**
* Events come in two types: **claims** and **incidents**
* Events can have **open** or **closed** status
* Events must have one or more **insureds** (required)
* Events can optionally be associated with a **policy**
* Events contain **custom entity data** (`data` field) with field keys mapped to values
***
## API Endpoints
* **[List Events](/api-reference/events/list-events)** - Retrieve paginated list of events with filtering and sorting
* **[Get Event](/api-reference/events/get-event)** - Retrieve a single event by ID
* **[Create Event](/api-reference/events/create-event)** - Create a new claim or incident
* **[Update Event](/api-reference/events/update-event)** - Update an existing event
* **[Delete Event](/api-reference/events/delete-event)** - Soft delete an event
* **[Get Events Configuration](/api-reference/events/get-events-configuration)** - Retrieve JSON Schema for event custom fields
***
## Event Types
Events can be one of two types:
| Type | Description |
| ---------- | ----------------------------------------------- |
| `claim` | Insurance claim filed against a policy |
| `incident` | Incident or occurrence that may lead to a claim |
***
## Event Status
Events can have one of two statuses:
| Status | Description |
| -------- | ----------------------------------- |
| `open` | Event is active and being processed |
| `closed` | Event has been resolved and closed |
***
## Associated Insureds
Events are associated with one or more insureds via the `insuredIds` field.
By default, the API returns an array of insured IDs:
```json theme={null}
{
"insuredIds": [
"550e8400-e29b-41d4-a716-446655440200",
"550e8400-e29b-41d4-a716-446655440201"
]
}
```
When using `GET /events/{eventId}`, you can request expanded insured details with `expand=insureds`:
```json theme={null}
{
"insureds": [
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"name": "John Smith",
"entityType": "individual",
"email": "john.smith@example.com",
"phoneNumber": "+1-555-123-4567",
"billingEmail": null
}
]
}
```
***
## Custom Entity Data
The `data` field contains custom entity data specific to each company's configuration. This allows you to store and retrieve company-specific information about events.
### Field Keys vs Field IDs
**Important:** The `data` field uses **field keys** (human-readable names like "eventDescription") instead of field IDs (UUIDs).
```json theme={null}
{
"data": {
"eventDescription": "Vehicle accident at intersection",
"claimAmount": "50000",
"adjusterId": "ADJ-12345"
}
}
```
### When is `data` null?
The `data` field returns:
* **`null`** - When no custom entity data exists for the event
* **`{ ... }`** - An object with field key-value pairs when custom data exists
### Field Configuration
Custom entity data fields are configured per company in AI Insurance. The available fields and their keys depend on your company's setup.
To see which fields are available for events, use the [Get Events Configuration](/api-reference/events/get-events-configuration) endpoint. The response includes:
* **`data`** — a standard JSON Schema (draft 2020-12) describing all possible fields
* **`fieldCoverageTypeMappings`** — maps each field key to `"all"` (applies to all events) or an array of coverage type IDs
* **`companyCoverageTypes`** — the list of coverage types enabled for your company
```json theme={null}
{
"data": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"eventDescription": {
"type": "string",
"title": "Event Description"
},
"claimAmount": {
"type": "number",
"title": "Claim Amount",
"format": "currency"
},
"adjusterId": {
"type": "string",
"title": "Adjuster ID"
}
}
},
"fieldCoverageTypeMappings": {
"eventDescription": "all",
"claimAmount": "all",
"adjusterId": ["general_liability", "workers_comp"]
},
"companyCoverageTypes": ["general_liability", "workers_comp", "auto"]
}
```
A field mapped to `"all"` applies to every event. A field mapped to an array of coverage type IDs only applies to events of those coverage types. If a field's coverage type list matches every ID in `companyCoverageTypes`, it effectively applies to all events today — but won't automatically extend to new coverage types added in the future.
See [JSON Schema Format Types](/api-legacy-reference/data-models#json-schema-format-types) for the list of supported `format` values.
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ----------- | ------------------------------------------ |
| `policyId` | Event is not associated with a policy |
| `createdBy` | Creator was not tracked |
| `updatedAt` | Event has never been updated |
| `data` | No custom entity data exists for the event |
***
## Filtering and Sorting
List endpoints support comprehensive filtering and sorting options:
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | ------------------------------------------ |
| `type` | string or array | Filter by event type (`claim`, `incident`) |
| `status` | string or array | Filter by status (`open`, `closed`) |
| `policyId` | string | Filter by associated policy ID (UUID) |
| `filterText` | string | Text search across event fields |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ---------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `referenceId`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of events for the current page
* `totalCount` - Total number of matching events across all pages
***
## Deleting Events with Financial Transactions
By default, events with **paid** or **processing** financial transactions cannot be deleted. This protects financial data integrity.
If you need to delete such an event, you can set `force: true` in the DELETE request body:
```json theme={null}
{
"requestorEmail": "user@example.com",
"type": "claim",
"force": true
}
```
**Use `force: true` with caution.** Force deleting an event with financial transactions will **orphan** those financial records. The transactions will remain in the system but will no longer be linked to an event. This action cannot be undone.
If you attempt to delete an event with financial transactions without `force: true`, the API will return an error message indicating how many transactions are blocking deletion.
***
## Permissions
Access to events requires the appropriate permissions based on your API key. Permissions are event-type specific:
| Operation | Claims Permission | Incidents Permission |
| ----------------- | ---------------------- | ------------------------- |
| List Events | `company.claim:read` | `company.incident:read` |
| Get Event | `company.claim:read` | `company.incident:read` |
| Create Event | `company.claim:create` | `company.incident:create` |
| Update Event | `claim:update` | `incident:update` |
| Delete Event | `company.claim:delete` | `company.incident:delete` |
| Get Configuration | `company.event:read` | `company.event:read` |
**Note:** Update permissions use a slightly different format (`claim:update` vs `company.claim:update`).
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "550e8400-e29b-41d4-a716-446655440000",
"type": "claim",
"status": "open",
"referenceId": "CLM-2025-001",
"coverageTypeId": "general_liability",
"policyId": "550e8400-e29b-41d4-a716-446655440100",
"insuredIds": [
"550e8400-e29b-41d4-a716-446655440200",
"550e8400-e29b-41d4-a716-446655440201"
],
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "google-oauth2|123456789",
"updatedAt": "2025-01-16T14:20:00.000Z",
"data": {
"eventDescription": "Vehicle accident at intersection",
"claimAmount": "50000",
"dateOfLoss": "2025-01-10"
}
}
],
"totalCount": 42
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/export-presets/overview
List the export presets saved in a company
## Overview
An export preset is a named, ordered list of export column keys that one user saved for one entity type (for example `event`, `insured`, `policy` or `quote`).
`GET /api/external/companies/{companyId}/export-presets` returns every preset in the company, including presets saved by other users. Results are not paginated and are ordered by `entityType`, then `name`. Preset names are not unique, so two presets with the same name can both appear.
## Filtering
| Parameter | Description |
| ------------ | ---------------------------------------------------------------- |
| `entityType` | Optional. Return only presets whose `entityType` matches exactly |
## Permissions
| Endpoint | Method | Permission |
| ---------------------------------------------------- | ------ | ---------------------------- |
| `/api/external/companies/{companyId}/export-presets` | GET | `company.export_preset:read` |
## Example Response
```json theme={null}
{
"items": [
{
"id": "7a6b5c4d-3e2f-4a1b-8c9d-0e1f2a3b4c5d",
"entityType": "policy",
"name": "Renewals",
"fieldKeys": ["policyNumber", "policyEndDate", "premium"],
"owner": {
"id": "auth0|64f1a2b3c4d5e6f7a8b9c0d2",
"name": "John Doe",
"email": "john.doe@example.com"
}
}
],
"totalCount": 1
}
```
`owner` is `null` when the preset has no owner. `entityType` and `name` can also be `null`, and `fieldKeys` is empty, for presets that were saved without those values.
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/exposure-types/overview
Manage exposure type definitions for your company
## Overview
The Exposure Types API lets you manage the categories of insured entities
(exposure types) available to a company. Exposure types define what kinds of
exposures can be created — for example, "Franchise Truck Dealer", "Auto", or
"Company".
Each exposure type has a unique `key` (used as a programmatic identifier) and
a `label` (displayed in the UI).
## API Endpoints
| Method | Endpoint | Description |
| ------ | ---------------------------------- | ----------------------------------------------------- |
| GET | `/exposure-types` | List all exposure types with optional label filtering |
| POST | `/exposure-types` | Create a new exposure type |
| DELETE | `/exposure-types/{exposureTypeId}` | Delete an exposure type |
## Permissions
| Action | Permission |
| -------------------- | ---------------- |
| List exposure types | `company:read` |
| Create exposure type | `company:update` |
| Delete exposure type | `company:update` |
## Request Properties
| Property | Type | Required | Description |
| -------- | ------ | -------- | -------------------------------------------------------------------------- |
| `value` | string | Yes | Unique identifier for the exposure type (e.g., `"franchise_truck_dealer"`) |
| `label` | string | Yes | Human-readable display name (e.g., `"Franchise Truck Dealer"`) |
## Example
```bash theme={null}
curl -X POST \
https://app.aiinsurance.io/api/external/companies/{companyId}/exposure-types \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"value": "franchise_truck_dealer",
"label": "Franchise Truck Dealer"
}'
```
Response:
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440003"
}
```
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/exposure/overview
The Exposures API allows you to manage exposure entities for your company. Exposures represent the individuals or organizations that are covered by insurance policies.
**Key Concepts:**
* Exposures are entities (individuals or organizations) covered by insurance policies
* Each exposure has a **name** and **entityType** that classify them
* Exposures can be associated with policies and events
* Deleting an exposure performs a soft delete (the record is marked as deleted but retained)
***
## API Endpoints
* **[List Exposures](/api-reference/exposures/list-exposures)** - Retrieve paginated list of exposures with filtering and sorting
* **[Get Exposure](/api-reference/exposures/get-exposure)** - Retrieve a single exposure by ID
* **[Create Exposure](/api-reference/exposures/create-exposure)** - Create a new exposure
* **[Update Exposure](/api-reference/exposures/update-exposure)** - Update an existing exposure
* **[Delete Exposure](/api-reference/exposures/delete-exposure)** - Soft delete an exposure by ID
***
## Exposure Fields
| Field | Type | Required | Description |
| ----------------- | -------- | -------- | -------------------------------------------------------------- |
| `id` | uuid | - | Exposure identifier (returned in responses) |
| `name` | string | Yes | Name of the exposure |
| `entityType` | string | Yes | Entity type (e.g., "individual", "organization", "dealership") |
| `email` | string | No | Exposure email address |
| `phoneNumber` | string | No | Exposure phone number |
| `billingEmail` | string | No | Billing email address |
| `defaultBrokerId` | uuid | No | Default broker ID for this exposure |
| `policyIds` | uuid\[] | - | IDs of associated policies (returned in list responses) |
| `createdAt` | datetime | - | When the exposure was created |
***
## Filtering and Sorting (List)
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | --------------------------------------- |
| `id` | uuid or uuid\[] | Filter by exposure ID (single or array) |
| `entityType` | string | Filter by entity type |
| `filterText` | string | Text search across exposure name |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ---------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `name`, `entityType`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
***
## Permissions
Access to exposures requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| --------------- | ------------------------ |
| List Exposures | `company.insured:read` |
| Get Exposure | `company.insured:read` |
| Create Exposure | `company.insured:create` |
| Update Exposure | `insured:update` |
| Delete Exposure | `insured:delete` |
***
## Example List Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"name": "John Smith",
"entityType": "individual",
"policyIds": ["550e8400-e29b-41d4-a716-446655440100"],
"createdAt": "2025-01-15T10:30:00.000Z"
}
],
"totalCount": 1
}
```
## Example Create Request
```json theme={null}
{
"name": "Acme Manufacturing GmbH",
"entityType": "organization"
}
```
## Example Create Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440003"
}
```
## Example Update Request
```json theme={null}
{
"name": "John Smith Jr.",
"email": "john.smith@example.com"
}
```
## Example Update Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"companyId": "550e8400-e29b-41d4-a716-446655440000",
"name": "John Smith Jr.",
"entityType": "individual",
"phoneNumber": null,
"email": "john.smith@example.com",
"billingEmail": null,
"defaultBrokerId": null,
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "google-oauth2|123456789",
"updatedAt": "2025-01-20T14:00:00.000Z",
"updatedBy": "google-oauth2|987654321"
}
```
## Example Delete Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440002",
"deleted": true
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/lawsuits/overview
Lawsuits represent legal proceedings associated with insurance events. Each event can have at most one lawsuit. The Lawsuits API allows you to create, retrieve, update, and delete lawsuit information for a specific event.
**Key Concepts:**
* A lawsuit is a 1:1 sub-resource of an event — each event has at most one lawsuit
* Lawsuits are accessed via the event path: `/events/{eventId}/lawsuit`
* There is no list endpoint — use the GET endpoint to retrieve the single lawsuit for an event
* Creating a lawsuit when one already exists returns `409 Conflict`
* Deleting a lawsuit is a soft delete — the record is preserved but no longer returned by GET
***
## API Endpoints
* **[Create Lawsuit](/api-reference/lawsuits/create-lawsuit)** - Create a lawsuit for an event (409 if one exists)
* **[Get Lawsuit](/api-reference/lawsuits/get-lawsuit)** - Retrieve the lawsuit for an event
* **[Update Lawsuit](/api-reference/lawsuits/update-lawsuit)** - Update the lawsuit for an event
* **[Delete Lawsuit](/api-reference/lawsuits/delete-lawsuit)** - Soft delete the lawsuit for an event
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ------------------------------- | -------------------------------------- |
| `caseNumber` | Case number not assigned |
| `caseName` | Case name not provided |
| `lawsuitFiledDate` | Filing date not recorded |
| `suitServedDate` | Service date not recorded |
| `trialDate` | Trial date not scheduled |
| `venueName` | Venue not specified |
| `venueAddress` | Venue address not provided |
| `judgeName` | Judge not assigned |
| `plaintiffs` | No plaintiffs recorded |
| `plaintiffAttorneyId` | No plaintiff attorney assigned |
| `plaintiffLawFirmId` | No plaintiff law firm assigned |
| `plaintiffAddress` | Plaintiff address not provided |
| `settlementDemand` | No settlement demand recorded |
| `settlementType` | Settlement type not set |
| `arbitrationInvolved` | Arbitration status not recorded |
| `dateDefenseCounselAdded` | Defense counsel date not recorded |
| `expertDefense` | No defense expert assigned |
| `expertPlaintiff` | No plaintiff expert assigned |
| `declaratoryJudgementFiledDate` | No declaratory judgement filed |
| `createdAt` | Timestamp not tracked (legacy records) |
| `updatedAt` | Lawsuit has never been updated |
***
## Permissions
Access to lawsuits requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| -------------- | ---------------------- |
| Create Lawsuit | `company.event:export` |
| Get Lawsuit | `company.event:export` |
| Update Lawsuit | `company.event:export` |
| Delete Lawsuit | `company.event:export` |
***
## Example Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "660e8400-e29b-41d4-a716-446655440000",
"eventId": "770e8400-e29b-41d4-a716-446655440000",
"caseNumber": "CASE-2026-001",
"caseName": "Smith v. Jones Insurance Co.",
"lawsuitFiledDate": "2026-01-10T00:00:00.000Z",
"suitServedDate": "2026-01-15T00:00:00.000Z",
"trialDate": "2026-06-01T00:00:00.000Z",
"venueName": "District Court of Springfield",
"venueAddress": {
"value": "100 Court St, Springfield, IL 62701"
},
"judgeName": "Hon. Sarah Williams",
"plaintiffs": ["John Smith", "Mary Smith"],
"plaintiffAttorneyId": "880e8400-e29b-41d4-a716-446655440000",
"plaintiffLawFirmId": "990e8400-e29b-41d4-a716-446655440000",
"plaintiffAddress": null,
"settlementDemand": "250000",
"settlementType": "N",
"arbitrationInvolved": "No",
"dateDefenseCounselAdded": "2026-01-20T00:00:00.000Z",
"expertDefense": "Dr. Expert Defense",
"expertPlaintiff": "Dr. Expert Plaintiff",
"declaratoryJudgementFiledDate": null,
"createdAt": "2026-01-10T10:30:00.000Z",
"updatedAt": "2026-02-01T14:20:00.000Z"
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/notes/overview
Notes allow you to attach comments and documentation to entities (events, policies, and insureds (exposures)) in AI Insurance. The Notes API supports creating, listing, retrieving, and deleting notes programmatically.
**Key Concepts:**
* Notes are attached to a specific entity (event, policy, or insured)
* Notes can be **privileged** (restricted visibility) or standard
* Notes support **author override** for historical imports and on-behalf-of scenarios
***
## API Endpoints
* **[List Notes](/api-reference/notes/list-notes)** - Retrieve notes for an entity
* **[Create Note](/api-reference/notes/create-note)** - Create a new note
* **[Get Note](/api-reference/notes/get-note)** - Retrieve a specific note
* **[Delete Note](/api-reference/notes/delete-note)** - Delete a note (soft delete)
***
## Author Override
When creating notes via the API, you can specify who the note author should be. This is useful for:
* **Historical imports** - Migrating notes from legacy systems with original author names
* **On-behalf-of creation** - Creating notes attributed to a specific user
### Author Fields
| Field | Type | Description |
| ------------ | ------ | ------------------------------------------------------------------------- |
| `authorId` | string | ID of an existing user in the system. Use when the author has an account. |
| `authorName` | string | Free-text author name. Use for external authors or historical imports. |
`authorId` and `authorName` are **mutually exclusive**. Provide one or the
other, not both.
### How Author is Determined
When creating a note:
1. **If `authorId` is provided** - The note is linked to that user. The user must exist in the system.
2. **If `authorName` is provided** - The name is stored directly (no user lookup). Use for external authors.
3. **If neither is provided** - The note has no specific author assigned.
### Response: Author Display
When retrieving notes, the response includes both `author` (user details) and `authorName` (display string):
| Response Field | Type | Description |
| -------------- | -------------- | -------------------------------------------------------------------------- |
| `author` | object or null | User details (`id`, `name`, `email`) if linked to a user, otherwise `null` |
| `authorName` | string | Display name using fallback: user's name → stored authorName → "UNKNOWN" |
Always use `authorName` for display purposes. It provides a consistent display
string regardless of how the author was specified.
### Examples
**Creating a note with an existing user as author:**
```json theme={null}
{
"text": "Note created on behalf of another user.",
"authorId": "google-oauth2|123456789"
}
```
**Creating a note with an external author name:**
```json theme={null}
{
"text": "Historical note imported from legacy system.",
"authorName": "Jane Doe (External)",
"createdAt": "2024-06-15T14:30:00.000Z"
}
```
**Response with linked user:**
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440003",
"entityId": "550e8400-e29b-41d4-a716-446655440001",
"entityType": "events",
"text": "Adjuster contacted claimant.",
"author": {
"id": "google-oauth2|123456789",
"name": "John Smith",
"email": "john@example.com"
},
"authorName": "John Smith",
"isPrivileged": false,
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": null
}
```
**Response with external author (no linked user):**
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440004",
"entityId": "550e8400-e29b-41d4-a716-446655440001",
"entityType": "events",
"text": "Historical note from legacy system.",
"author": null,
"authorName": "Jane Doe (External)",
"isPrivileged": false,
"createdAt": "2024-06-01T14:00:00.000Z",
"updatedAt": null
}
```
***
## Privileged Notes
Notes can be marked as **privileged** to restrict their visibility. Privileged notes are only visible to users with the `privileged_notes:read` permission (typically carrier admins and managers).
**Creating a privileged note:**
```json theme={null}
{
"text": "Internal investigation notes - do not share with claimant.",
"isPrivileged": true
}
```
To create a privileged note, the requestor must have `privileged_notes:read`
permission. The API will return an error if the requestor lacks this
permission.
***
## Entity Types
Notes can be attached to three entity types:
| Entity Type | Permission Required | Example Use Case |
| ----------- | --------------------------- | ----------------------------------------------- |
| `events` | `claim.notes:read/update` | Claim investigation notes, adjuster comments |
| `policies` | `policy.notes:read/update` | Policy documentation, underwriting notes |
| `insureds` | `insured.notes:read/update` | Customer communication logs, verification notes |
***
## Pagination and Sorting
List endpoints support pagination and sorting:
| Parameter | Type | Default | Description |
| --------------- | ------- | ----------- | --------------------------------------------- |
| `page` | integer | 1 | Page number (1-based) |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt` or `updatedAt`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
**Response includes:**
* `items` - Array of notes for the current page
* `totalCount` - Total number of matching notes
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/overview
## Overview
Welcome to the AI Insurance External API documentation. This API allows you to programmatically manage your insurance operations, including submissions, quotes, policies, and more.
**Current API Resources:**
* **Submissions** - Create and manage insurance submissions
* **Quotes** - Generate and retrieve quote information
* **Notes** - Attach comments and documentation to entities
* **Configuration** - Access your company's rating fields and coverage types
**Coming Soon:**
* Policies
* Events
* Insureds
* Financials
***
## Getting Started
### Base URL
All API endpoints are relative to your AI Insurance instance base URL:
```
https://app.aiinsurance.io
```
### Route Prefix
All legacy API endpoints are served under the `/api/external/` path prefix. V1 API endpoints use a separate `/api/v1/external/` prefix — see the [V1 API Reference](/api-v1-reference/overview).
### Authentication
All API requests require authentication using an API key. Include your API key in the request headers:
```bash theme={null}
Authorization: YOUR-API-KEY
```
To generate an API key, see [Authentication](/api-legacy-reference/authentication).
***
## API Resources
### Submissions
Create and manage insurance submissions with complete policy and insured information.
* **[List Submissions](/api-reference/submissions/list-submissions)** - Retrieve submissions for your company
* **[Create Submission](/api-reference/submissions/create-submission)** - Create a new submission
* **[Update Submission](/api-reference/submissions/update-submission)** - Update an existing submission
* **[Overview](/api-legacy-reference/submissions/overview)** - Detailed guide on working with submissions
### Quotes
Generate and retrieve quote information for submissions.
* **List Quotes** (`GET /api/external/companies/{companyId}/quotes`) - Retrieve complete quote details with all nested data
* **List Quote Info** (`GET /api/external/companies/{companyId}/quotes-info`) - Retrieve lightweight quote information (faster)
* **Get Quote** (`GET /api/external/companies/{companyId}/quotes/{quoteId}`) - Get detailed quote information by ID
See the Quotes section in the sidebar for interactive API documentation.
### Configuration
Access your company's configuration including rating fields, coverage types, and entity types.
* **[Get Configuration](/api-legacy-reference/configuration)** - Retrieve company configuration
***
## Reference Documentation
### Data Models
Complete reference for all data structures used in the API:
* **[Submission Object](/api-legacy-reference/data-models#submission-object)** - Submission response structure
* **[Quote Object (Lightweight)](/api-legacy-reference/data-models#quote-object-lightweight)** - Lightweight quote representation
* **[Quote Object (Full)](/api-legacy-reference/data-models#quote-object-full)** - Complete quote structure
* **[ImportPolicy](/api-legacy-reference/data-models#importpolicy-object)** - Policy information for submissions
* **[ImportPolicyCoverage](/api-legacy-reference/data-models#importpolicycoverage-object)** - Coverage data
* **[ImportInsured](/api-legacy-reference/data-models#importinsured-object)** - Insured party information
See [Data Models](/api-legacy-reference/data-models) for complete reference.
***
## Quick Start Example
Here's a simple example to create a submission:
```bash theme={null}
curl -X POST \
"https://app.aiinsurance.io/api/external/companies//submissions" \
-H "Authorization: " \
-H "Content-Type: application/json" \
-d '{
"name": "My First Submission",
"type": "new_business",
"policy": {
"policyNumber": "POL-001",
"policyType": "O",
"policyStartDate": "2024-01-01",
"policyEndDate": "2025-01-01"
}
}'
```
See the [Submissions Guide](/api-legacy-reference/submissions/overview) for detailed examples and tutorials.
***
## Audit Logging
All external API calls are automatically logged for audit and debugging purposes. The audit log captures request details, response status, and timing information.
### Batch ID for Request Correlation
When making multiple related API calls (e.g., creating several submissions as part of a batch import), you can include an optional `batchId` field in the request body of any mutation endpoint (POST, PUT, PATCH, DELETE). This allows you to correlate and query related requests later.
**Key points:**
* `batchId` is a pass-through field—it's not validated or part of the request schema
* Include it at the root level of your request body
* The value is stored in the `external_api_audit_log` table (indexed for efficient querying)
* Use any string value that helps you identify related requests (e.g., UUID, timestamp, job ID)
### Example: Including batchId
```bash theme={null}
# Create multiple submissions with the same batchId for correlation
BATCH_ID="import-2024-01-15-abc123"
curl -X POST \
"https://app.aiinsurance.io/api/external/companies//submissions" \
-H "Authorization: " \
-H "Content-Type: application/json" \
-d '{
"batchId": "'"$BATCH_ID"'",
"name": "Submission 1",
"type": "new_business",
"policy": {
"policyNumber": "POL-001",
"policyType": "O",
"policyStartDate": "2024-01-01",
"policyEndDate": "2025-01-01"
}
}'
curl -X POST \
"https://app.aiinsurance.io/api/external/companies//submissions" \
-H "Authorization: " \
-H "Content-Type: application/json" \
-d '{
"batchId": "'"$BATCH_ID"'",
"name": "Submission 2",
"type": "new_business",
"policy": {
"policyNumber": "POL-002",
"policyType": "O",
"policyStartDate": "2024-01-01",
"policyEndDate": "2025-01-01"
}
}'
```
This makes it easy to later query the audit log for all API calls associated with a specific batch operation.
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/payees/overview
Payees are entities that receive payments, such as law firms, experts, vendors, and other third parties. The Payees API allows you to programmatically create, read, update, and delete payee information within your company.
**Key Concepts:**
* Payees represent external entities that receive payments from insurance operations
* Each payee has a **type** (lawFirm, expert, vendor, other, financingCompany)
* Law firm payees can specify a **law firm type** (defense or plaintiff)
* Payees can have bank information for payment processing
* Only "saved" payees (isSaved: true) are returned by the API. A non-saved payee is one that was created via a UI flow but for which no transaction was ever completed.
***
## API Endpoints
* **[List Payees](/api-reference/payees/list-payees)** - Retrieve paginated list of payees with filtering and sorting
* **[Get Payee](/api-reference/payees/get-payee)** - Retrieve a single payee by ID
* **[Create Payee](/api-reference/payees/create-payee)** - Create a new payee
* **[Update Payee](/api-reference/payees/update-payee)** - Update an existing payee
* **[Delete Payee](/api-reference/payees/delete-payee)** - Soft delete a payee
***
## Payee Types
| Type | Description |
| ------------------ | ------------------------------------------- |
| `lawFirm` | Law firm (can specify defense or plaintiff) |
| `expert` | Expert witness or consultant |
| `vendor` | Third-party vendor or service provider |
| `other` | Other type of payee |
| `financingCompany` | Financing or premium finance company |
***
## Law Firm Types
When `payeeType` is `lawFirm`, you can specify the `lawFirmType`:
| Type | Description |
| ----------- | ---------------------------------------- |
| `defense` | Defense counsel representing the insured |
| `plaintiff` | Plaintiff counsel (opposing party) |
***
## Structured Address
The `addressStructured` field contains a detailed address object with the following fields:
| Field | Type | Description |
| -------------- | ------ | ---------------------------------------- |
| `streetNumber` | string | Street number |
| `streetName` | string | Street name |
| `city` | string | City name |
| `state` | object | State with `short` and `long` properties |
| `postalCode` | string | ZIP or postal code |
| `country` | string | Country name or code |
| `county` | string | County name |
| `neighborhood` | string | Neighborhood name |
| `sublocality` | string | Sublocality or district |
| `timezone` | string | Timezone identifier |
| `location` | object | Geographic coordinates (`lat`, `lng`) |
***
## Bank Information
The `bankInfo` field contains payment information:
| Field | Type | Description |
| ------------------- | ---------------- | ------------------- |
| `bankAccountNumber` | string or number | Bank account number |
| `bankRoutingNumber` | string or number | Bank routing number |
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ------------------- | -------------------------------------- |
| `email` | Email not provided |
| `alternateEmails` | No alternate emails provided |
| `phoneNumber` | Phone number not provided |
| `description` | Description not provided |
| `address` | Unstructured address not provided |
| `addressStructured` | Structured address not provided |
| `lawFirmType` | Payee is not a law firm |
| `bankInfo` | Bank information not provided |
| `taxIdNumber` | Tax ID not provided |
| `externalPayee` | No external system reference |
| `createdAt` | Timestamp not tracked (legacy records) |
| `createdBy` | Created by system or unknown user |
| `updatedAt` | Payee has never been updated |
| `updatedBy` | Never updated or updated by system |
***
## Filtering and Sorting
List endpoints support comprehensive filtering and sorting options:
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | ------------------------------ |
| `id` | string or array | Filter by specific payee ID(s) |
| `payeeType` | string | Filter by payee type |
| `filterText` | string | Text search across payee name |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ------------------------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `name`, `email`, `payeeType`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of payees for the current page
* `totalCount` - Total number of matching payees across all pages
***
## Permissions
Access to payees requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| ------------ | ---------------------- |
| List Payees | `company.payee:read` |
| Get Payee | `company.payee:read` |
| Create Payee | `company.payee:create` |
| Update Payee | `company.payee:create` |
| Delete Payee | `company.payee:create` |
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "660e8400-e29b-41d4-a716-446655440000",
"name": "Smith & Associates Law Firm",
"payeeType": "lawFirm",
"email": "contact@smithlaw.com",
"alternateEmails": ["billing@smithlaw.com"],
"phoneNumber": "+1-555-123-4567",
"description": "Defense law firm specializing in insurance litigation",
"address": "123 Legal Plaza, Suite 500, New York, NY 10001",
"addressStructured": {
"streetNumber": "123",
"streetName": "Legal Plaza",
"city": "New York",
"state": {
"short": "NY",
"long": "New York"
},
"postalCode": "10001",
"country": "US"
},
"lawFirmType": "defense",
"bankInfo": {
"bankAccountNumber": "****1234",
"bankRoutingNumber": "****5678"
},
"taxIdNumber": "12-3456789",
"externalPayee": null,
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "880e8400-e29b-41d4-a716-446655440000",
"updatedAt": "2025-01-16T14:20:00.000Z",
"updatedBy": "880e8400-e29b-41d4-a716-446655440000"
}
],
"totalCount": 42
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/policies/overview
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](/api-reference/policies/list-policies)** - Retrieve paginated list of policies with filtering and sorting
* **[Get Policy](/api-reference/policies/get-policy)** - Retrieve detailed policy information including segments, coverages, and rating inputs
* **[Create Policy](/api-reference/policies/create-policy)** - Create a policy directly (for historical imports)
* **[Delete Policy](/api-reference/policies/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 `ratingInfo`
### Required Fields
| Field | Type | Description |
| --------------- | ------ | ----------------------------------------------------- |
| `referenceId` | string | Policy number (must be unique per company) |
| `startsAtDate` | date | Policy effective start date (YYYY-MM-DD) |
| `endsAtDate` | date | Policy effective end date (YYYY-MM-DD) |
| `type` | string | Policy type (C, N, T, O, P, S, Q, R, A) |
| `billingPeriod` | string | Billing frequency (annual, quarterly, monthly, etc.) |
| `exposures` | array | At least one exposure with exactly one role "primary" |
| `coverages` | array | At least one coverage with valid coverageTypeId |
### Optional Fields
| Field | Type | Description |
| ------------------ | ------ | ------------------------------------------------- |
| `coverageTimezone` | string | IANA timezone (defaults to company default) |
| `description` | string | Policy description |
| `premium` | number | Premium in cents (overrides rating calculation) |
| `brokerId` | uuid | ID of existing broker (use `POST /brokers` first) |
### Policy Types
| Code | Description |
| ---- | ----------------------------------- |
| C | Claims Made |
| N | New Claims Made |
| T | Tail |
| O | Occurrence |
| P | Occurrence + Claims Made |
| S | Split (Half Claims Made/Occurrence) |
| Q | Quota Share |
| R | Occurrence + Claims Made + Tail |
| A | Claims Made (Alternative) |
***
## Policy Fields (List Response)
| Field | Type | Description |
| ------------------ | --------- | ---------------------------------------- |
| `id` | uuid | Policy identifier |
| `companyId` | uuid | Company identifier |
| `number` | string | Policy number |
| `createdAt` | datetime | When the policy was created (ISO 8601) |
| `primaryInsuredId` | uuid/null | ID of the primary insured on this policy |
***
## Policy Fields (Get Response)
The Get Policy endpoint returns detailed information including all list fields plus:
| Field | Type | Description |
| ------------------------- | ------------- | -------------------------------------------------- |
| `policyId` | uuid | Policy identifier (same as `id`) |
| `policyNumber` | string/null | Policy number (same as `referenceId`) |
| `referenceId` | string/null | Policy reference ID |
| `startsAtDate` | date/null | Policy effective start date |
| `endsAtDate` | date/null | Policy effective end date |
| `status` | string | Current policy status (see below) |
| `termStart` | date/null | Policy term start date |
| `termEnd` | date/null | Policy term end date |
| `sourceTransactionId` | uuid/null | Transaction that created/modified the policy |
| `effectiveTimestamp` | datetime/null | When current state became effective |
| `segments` | array | Policy segments with coverage and exposure details |
| `type` | string/null | Policy type code (C, N, T, O, etc.) |
| `description` | string/null | Policy description |
| `coverageTimezone` | string/null | IANA timezone for coverage dates |
| `currencyCode` | string/null | ISO 4217 currency code (e.g., "USD") |
| `prevPolicyId` | uuid/null | ID of previous policy (for renewal chains) |
| `cancelledAt` | datetime/null | Timestamp when policy was cancelled |
| `brokerId` | string/null | ID of the broker associated with this policy |
| `recipientName` | string/null | Name of the policy recipient |
| `recipientEmail` | string/null | Email of the policy recipient |
| `primaryInsuredName` | string/null | Name of the primary insured |
| `cancellationReason` | string/null | Reason for policy cancellation |
| `cancellationExplanation` | string/null | Additional cancellation explanation |
### Policy Status Values
| Status | Description |
| --------------------- | ---------------------------------------- |
| `active` | Policy is currently in effect |
| `not_started` | Policy start date is in the future |
| `expired` | Policy end date is in the past |
| `pending_signature` | Awaiting policyholder signature |
| `pending_payment` | Awaiting payment |
| `pending_actions` | Awaiting both signature and payment |
| `pending_renewal` | Within 60 days of renewal date |
| `renewal_in_progress` | Renewal submission created but not bound |
| `renewed` | Policy has been renewed |
| `cancelled` | Policy has been cancelled |
### Segment Fields
Each segment in the `segments` array contains:
| Field | Type | Description |
| ------------- | ----------- | -------------------------------------------------- |
| `start` | date | Segment start date |
| `end` | date | Segment end date |
| `status` | string | Segment status (`bound`, `quoted`, `cancelled`) |
| `premium` | number/null | Total premium for segment (cents) |
| `basePremium` | number/null | Base premium before adjustments (cents) |
| `coverages` | array | Coverages active during this segment |
| `exposures` | array | Exposures with premium breakdown and rating inputs |
### Exposure Fields
Each exposure in a segment contains:
| Field | Type | Description |
| -------------- | ----------- | ---------------------------------------------------------- |
| `exposureId` | uuid | Exposure (insured) identifier |
| `exposureType` | string/null | Type of exposure (e.g., "company", "distribution\_center") |
| `premium` | number/null | Premium for this exposure (cents) |
| `basePremium` | number/null | Base premium before adjustments (cents) |
| `ratingInputs` | object/null | Rating 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:
| Field | Type | Description |
| ----------------- | ------------ | ------------------------------ |
| `fieldName` | string | Human-readable factor name |
| `adjustedPremium` | number | Premium after factor applied |
| `multiplier` | number/array | Multiplier value(s) |
| `value` | number/array | Base value(s) used |
| `days` | integer | Days for pro-rata calculations |
| `base` | integer | Base days (typically 365) |
***
## Filtering and Sorting
### Filter Parameters
| Parameter | Type | Description |
| ------------------ | ------ | ------------------------------------------------- |
| `primaryInsuredId` | uuid | Filter by primary insured ID |
| `filterText` | string | Text search across policy number and other fields |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ----------------------------------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `number`, `startsAtDate`, `endsAtDate`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page 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:
| Operation | Required Permission |
| ------------- | ----------------------- |
| List Policies | `company.policy:read` |
| Get Policy | `company.policy:read` |
| Create Policy | `company.policy:create` |
| Delete Policy | `policy:delete` |
***
## Example: Create Policy Request
```json theme={null}
{
"referenceId": "POL-2025-001",
"startsAtDate": "2025-01-01",
"endsAtDate": "2026-01-01",
"type": "C",
"billingPeriod": "annual",
"exposures": [
{
"insuredId": "550e8400-e29b-41d4-a716-446655440200",
"role": "primary",
"joinDate": "2025-01-01",
"terminationDate": "2026-01-01",
"ratingInfo": {
"revenue": 5000000,
"employees": 25
}
}
],
"coverages": [
{
"coverageTypeId": "550e8400-e29b-41d4-a716-446655440300"
}
]
}
```
**Response:** `201 Created`
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440100"
}
```
***
## Example: List Policies Response
```json theme={null}
{
"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
```json theme={null}
{
"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
}
}
}
}
]
}
]
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/quotes/overview
Quotes represent insurance pricing proposals in AI Insurance. The Quotes API allows you to programmatically create, read, and delete quotes, including policy information and custom data specific to your company's configuration.
**Key Concepts:**
* Quotes are associated with a **submission**
* Quotes progress through various **statuses** from creation to binding
* Quotes contain **policy information** (`policyInfo`) with coverage details and custom data
* When bound, quotes become **policies**
***
## API Endpoints
* **[List Quotes](/api-reference/quotes/list-quotes)** - Retrieve paginated list of quotes with filtering and sorting
* **[Create Quote](/api-reference/quotes/create-quote)** - Create a new quote
* **[List Quote Info](/api-reference/quotes/list-quote-info)** - Retrieve lightweight quote information (faster for dashboards)
* **[Get Quote](/api-reference/quotes/get-quote)** - Retrieve a single quote by ID with full details
* **[Delete Quote](/api-reference/quotes/delete-quote)** - Soft delete a quote
* **[Get Quotes Configuration](/api-reference/quotes/get-quotes-configuration)** - Retrieve JSON Schema for quote custom fields
***
## Quote Status
Quotes progress through the following statuses:
| Status | Description |
| ------------------- | ---------------------------------------------- |
| `in_progress` | Quote is being prepared |
| `complete` | Quote is complete and ready to send |
| `sent` | Quote has been sent to the applicant |
| `accepted` | Quote has been accepted by the applicant |
| `bound` | Quote has been bound and converted to a policy |
| `cancelled` | Quote has been cancelled |
| `archived` | Quote has been archived |
| `applied_to_policy` | Quote has been applied to an existing policy |
***
## Policy Information
Quotes contain a `policyInfo` object with policy-level details:
```json theme={null}
{
"policyInfo": {
"policyNumber": "POL-2025-001",
"policyStartDate": "2025-01-01T00:00:00.000Z",
"policyEndDate": "2026-01-01T00:00:00.000Z",
"data": {
"policyDescription": "General Liability Coverage",
"specialConditions": "Standard terms apply"
}
}
}
```
### Custom Data
The `policyInfo.data` field contains custom data specific to your company's configuration. This allows you to store and retrieve company-specific information about quotes and policies.
**Important:** The `data` field uses **field keys** (human-readable names) instead of field IDs (UUIDs).
### Field Configuration
Custom data fields are configured per company in AI Insurance. To see which fields are available for quotes, use the [Get Quotes Configuration](/api-reference/quotes/get-quotes-configuration) endpoint.
The response structure mirrors the quote request shape, making it clear where each schema applies:
```json theme={null}
{
"policyInfo": {
"data": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"policyDescription": {
"type": "string",
"title": "Policy Description"
},
"effectiveDate": {
"type": "string",
"title": "Effective Date",
"format": "date"
},
"contactEmail": {
"type": "string",
"title": "Contact Email",
"format": "email"
},
"coverageTerritory": {
"type": "string",
"title": "Coverage Territory",
"enum": ["domestic", "worldwide", "north_america"]
}
}
}
}
}
```
The `policyInfo.data` schema is a standard JSON Schema (draft 2020-12) that you can use directly with validation libraries like Ajv or Zod.
See [JSON Schema Format Types](/api-legacy-reference/data-models#json-schema-format-types) for the list of supported `format` values.
***
## Filtering and Sorting
List endpoints support comprehensive filtering and sorting options:
### Filter Parameters
| Parameter | Type | Description |
| --------------- | --------------- | -------------------------------------------- |
| `submissionId` | string | Filter by submission ID (UUID) |
| `applicationId` | string | Filter by application ID (UUID) |
| `status` | string or array | Filter by quote status |
| `filterText` | string | Text search across quote fields |
| `dateFrom` | string | Filter quotes created on or after this date |
| `dateTo` | string | Filter quotes created on or before this date |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | --------------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `status`, `number`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of quotes for the current page
* `totalCount` - Total number of matching quotes across all pages
***
## Permissions
Access to quotes requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| ----------------- | ---------------------- |
| List Quotes | `company.quote:read` |
| Get Quote | `company.quote:read` |
| Create Quote | `company.quote:create` |
| Delete Quote | `company.quote:delete` |
| Get Configuration | `company.quote:read` |
***
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440002",
"number": "Q00000001-01",
"status": "complete",
"submissionId": "550e8400-e29b-41d4-a716-446655440001",
"createdAt": "2025-01-15T10:30:00.000Z",
"description": "General Liability Coverage",
"policyCurrency": "USD",
"grandTotal": 2700.00,
"policyInfo": {
"policyNumber": "POL-2025-001",
"policyStartDate": "2025-01-01T00:00:00.000Z",
"policyEndDate": "2026-01-01T00:00:00.000Z",
"data": {
"policyDescription": "General Liability Coverage",
"specialConditions": "Standard terms apply"
}
}
}
],
"totalCount": 15
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/smart-tags/overview
Retrieve smart tags for categorizing and labeling entities
## Overview
Smart tags are customizable labels that can be applied to entities within the system. They provide a flexible way to categorize, filter, and organize data according to your business needs.
Each smart tag includes:
* **tagName**: A unique identifier for the tag (used programmatically)
* **tagDisplayName**: A human-readable display name
* **tagDescription**: Optional description explaining the tag's purpose
* **tagCategories**: Array of category strings for grouping related tags
* **tagData**: Flexible JSON object for storing additional metadata
## Use Cases
Smart tags can be used to:
* Categorize policies by coverage type or risk profile
* Label insureds by segment or acquisition channel
* Mark events by severity or handling priority
* Group entities for reporting and analytics
## Permissions
* **Read**: Requires `company:read` permission
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"companyId": "123e4567-e89b-12d3-a456-426614174000",
"tagName": "high_value_account",
"tagDisplayName": "High Value Account",
"tagDescription": "Accounts with annual premium over $100k",
"tagCategories": ["account_tier", "priority"],
"tagData": {
"type": "account_classification"
},
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
],
"totalCount": 1
}
```
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/submissions/overview
Submissions are containers for quotes in AI Insurance. The Submissions API allows you to programmatically create, read, update, and delete submissions.
**Key Concepts:**
* Submissions are containers for **quotes** - create a submission first, then add quotes via the [Quotes API](/api-legacy-reference/quotes/overview)
* Submissions progress through various **statuses** from creation to binding
* Submissions have a **type** indicating if it's new business, renewal, endorsement, or cancellation
* For renewals, submissions can reference the **renewing policy** via `renewingPolicyId`
***
## API Endpoints
* **[List Submissions](/api-reference/submissions/list-submissions)** - Retrieve paginated list of submissions with filtering and sorting
* **[Create Submission](/api-reference/submissions/create-submission)** - Create a new submission
* **[Get Submission](/api-reference/submissions/get-submission)** - Retrieve a single submission by ID
* **[Update Submission](/api-reference/submissions/update-submission)** - Update an existing submission
* **[Delete Submission](/api-reference/submissions/delete-submission)** - Soft delete a submission
* **[Attach Files to Submission](/api-reference/submissions/attach-files-to-submission)** - Attach one or more PDF files to a submission
* **[Get Submission Loss History](/api-reference/submissions/get-submission-loss-history)** - Retrieve the loss history entries on a submission
* **[Set Submission Loss History](/api-reference/submissions/set-submission-loss-history)** - Replace the loss history entries on a submission
* **[Add Submission Loss History Entries](/api-reference/submissions/add-submission-loss-history-entries)** - Append entries to the loss history on a submission
***
## Submission Status
Submissions progress through the following statuses:
| Status | Description |
| ------------------- | ---------------------------------------------- |
| `in_progress` | Submission is being prepared |
| `submitted` | Submission has been submitted for review |
| `quote_in_progress` | Quote is being prepared |
| `quoted` | Quote has been generated |
| `bound` | Quote has been bound and converted to a policy |
| `declined` | Submission was declined |
| `expired` | Submission has expired |
| `cancelled` | Submission was cancelled |
***
## Submission Type
When creating a submission via the API, use these type values:
| API Type | Description |
| --------------- | ------------------------------------- |
| `quote` | New business submission |
| `renewal` | Renewal of an existing policy |
| `endorsement` | Mid-term change to an existing policy |
| `cancellation` | Cancellation of an existing policy |
| `reinstatement` | Reinstatement of a cancelled policy |
Use `quote` as the type for new business submissions. The API maps this to `new_business` internally.
***
## Submission Workflow
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Create │────▶│ Add Quotes │────▶│ Bind Quote │
│ Submission │ │ (Quotes API) │ │ (Creates │
│ │ │ │ │ Policy) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
1. **Create Submission** - Use `POST /submissions` to create a new submission
2. **Add Quotes** - Use the [Quotes API](/api-legacy-reference/quotes/overview) to add quotes to the submission
3. **Bind Quote** - When a quote is bound, it becomes a policy
***
## Associated Quotes
When using `GET /submissions/{submissionId}`, submissions include a `quoteIds` array by default:
```json theme={null}
{
"quoteIds": [
"660e8400-e29b-41d4-a716-446655440001",
"660e8400-e29b-41d4-a716-446655440002"
]
}
```
You can request expanded quote details with `expand=quotes`:
```json theme={null}
{
"quotes": [
{
"id": "660e8400-e29b-41d4-a716-446655440001",
"number": "Q00000001-01",
"status": "complete",
"submissionId": "550e8400-e29b-41d4-a716-446655440001",
"applicationId": null,
"policyId": null,
"description": "General Liability Coverage",
"policyCurrency": "USD",
"grandTotal": 2500.00,
"createdAt": "2024-01-15T11:00:00.000Z",
"updatedAt": "2024-01-15T12:00:00.000Z"
}
]
}
```
***
## List vs Get Response
The **List Submissions** endpoint returns minimal fields for performance:
| Field | List | Get |
| ---------------------- | ---- | --- |
| `id` | ✓ | ✓ |
| `companyId` | | ✓ |
| `number` | ✓ | ✓ |
| `name` | ✓ | ✓ |
| `status` | ✓ | ✓ |
| `type` | ✓ | ✓ |
| `primaryInsuredName` | ✓ | ✓ |
| `applicationId` | ✓ | ✓ |
| `renewingPolicyId` | | ✓ |
| `renewingPolicyNumber` | | ✓ |
| `declineReason` | | ✓ |
| `quoteIds` | | ✓ |
| `createdAt` | ✓ | ✓ |
| `updatedAt` | ✓ | ✓ |
| `closedAt` | | ✓ |
| `boundAt` | | ✓ |
***
## Nullable Fields
The following fields may be `null` in the response:
| Field | When null |
| ---------------------- | ------------------------------------ |
| `name` | Submission name not set |
| `primaryInsuredName` | No primary insured on the submission |
| `applicationId` | Application not linked |
| `renewingPolicyId` | Not a renewal or policy not linked |
| `renewingPolicyNumber` | Not a renewal or policy not linked |
| `declineReason` | Submission not declined |
| `updatedAt` | Submission has never been updated |
| `closedAt` | Submission not closed |
| `boundAt` | Submission not bound |
***
## Filtering and Sorting
List endpoints support comprehensive filtering and sorting options:
### Filter Parameters
| Parameter | Type | Description |
| ------------ | --------------- | ------------------------------------ |
| `status` | string or array | Filter by submission status |
| `type` | string or array | Filter by submission type |
| `filterText` | string | Text search across submission fields |
### Sorting Parameters
| Parameter | Type | Default | Description |
| --------------- | ------ | ----------- | ----------------------------------------------------------------- |
| `sortBy` | string | `createdAt` | Field to sort by (`createdAt`, `updatedAt`, `primaryInsuredName`) |
| `sortDirection` | string | `desc` | Sort direction (`asc` or `desc`) |
### Pagination
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `page` | integer | 1 | Page number (1-based, page size 50) |
**Response includes:**
* `items` - Array of submissions for the current page
* `totalCount` - Total number of matching submissions across all pages
***
## Deleting Submissions
Submissions with associated quotes cannot be deleted. You must delete all quotes first using the [Quotes API](/api-legacy-reference/quotes/overview) before deleting the submission.
***
## Permissions
Access to submissions requires the appropriate permissions based on your API key:
| Operation | Required Permission |
| -------------------------- | --------------------------- |
| List Submissions | `company.submission:read` |
| Get Submission | `company.submission:read` |
| Create Submission | `company.submission:create` |
| Update Submission | `company.submission:update` |
| Delete Submission | `company.submission:delete` |
| Attach Files to Submission | `submission.file:create` |
| Set Loss History | `submission:update` |
| Add Loss History Entries | `submission:update` |
***
## Example List Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"number": "SUB-2024-001",
"name": "Acme Corp Submission",
"status": "quoted",
"type": "new_business",
"primaryInsuredName": "Acme Corporation",
"applicationId": "550e8400-e29b-41d4-a716-446655440010",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-16T14:20:00.000Z"
}
],
"totalCount": 150
}
```
***
## Example Get Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "660e8400-e29b-41d4-a716-446655440000",
"number": "SUB-2024-001",
"name": "Acme Corp Submission",
"status": "quoted",
"type": "new_business",
"primaryInsuredName": "Acme Corporation",
"applicationId": "550e8400-e29b-41d4-a716-446655440010",
"renewingPolicyId": null,
"renewingPolicyNumber": null,
"declineReason": null,
"quoteIds": [
"660e8400-e29b-41d4-a716-446655440001",
"660e8400-e29b-41d4-a716-446655440002"
],
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-16T14:20:00.000Z",
"closedAt": null,
"boundAt": null
}
```
***
# Overview
Source: https://docs.aiinsurance.io/api-legacy-reference/transaction-categories/overview
Retrieve available transaction categories for financial transactions
## Overview
Transaction categories define the types of financial transactions that can be recorded in the system. Each category specifies:
* **Direction**: Whether the transaction is a Payable (money going out) or Receivable (money coming in)
* **Scopes**: Which entity types (policies or events) the category applies to, and which payee types are supported
* **Line Item Categories**: Subcategories for itemized transactions
* **Reserves Support**: Whether the category supports reserve tracking (for event-related categories)
## Transaction Direction
| Direction | Description |
| ------------ | ------------------------------------------------ |
| `Payable` | Money owed by the company (expenses, claims) |
| `Receivable` | Money owed to the company (premiums, recoveries) |
## Transaction Scopes
Each category has one or more scopes that define where it can be used:
* **Entity Type**: Either `policy` or `event`
* **Supported Payee Types**: Which payee types can receive payments for this category (for payable categories)
### Supported Payee Types
| Type | Description |
| ----------- | ------------------------------------------------- |
| `insured` | The policyholder/insured party |
| `payee` | A general payee (law firm, expert, vendor, etc.) |
| `brokerage` | A brokerage that receives commissions or payments |
## Line Item Categories
Some transaction categories support line items (itemized breakdowns). These categories have `isItemized: true` and include a `lineItemCategories` array with subcategories.
Each line item category has:
* `categoryId`: Unique identifier for the line item category
* `name`: Display name
* `parentTransactionCategoryId`: Reference to the parent transaction category
## Permissions
* **Read**: Requires `externalApi:read` permission
## Example Response
```json theme={null}
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"categoryId": "alae_invoice",
"name": "ALAE",
"lineItemCategories": [
{
"categoryId": "attorney_fees_expenses",
"name": "Attorney Fees Expenses",
"parentTransactionCategoryId": "alae_invoice"
},
{
"categoryId": "expert_fees_expenses",
"name": "Expert Fees Expenses",
"parentTransactionCategoryId": "alae_invoice"
}
],
"isItemized": true,
"direction": "Payable",
"scopes": [
{
"entityType": "event",
"supportedPayeeTypes": ["payee"]
}
],
"supportsReserves": true
},
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"categoryId": "policy_invoice",
"name": "Policy Invoice",
"lineItemCategories": [],
"isItemized": true,
"direction": "Receivable",
"scopes": [
{
"entityType": "policy",
"supportedPayeeTypes": ["insured", "brokerage", "payee"]
}
],
"supportsReserves": false
}
],
"totalCount": 2
}
```
# Resolve Address
Source: https://docs.aiinsurance.io/api-reference/address/resolve-address
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/resolve-address
Geocodes a freeform address string and returns the structured subfields
(`street`, `city`, `state`, `county`, `country`, `zipCode`) in the shape
Field Model V1 rating expects.
Intended as a pre-flight utility: integrators call this before constructing
create/update payloads so addresses include all required pieces (especially
`county`, which is required for rating but often missing from upstream
systems). Writes are not auto-enriched — this endpoint is read-only.
**Strict response contract.** If geocoding succeeds but any required
subfield cannot be determined, the endpoint returns a `400` with a
distinct `problemCode` rather than a partial address. Integrators can
branch on the `problemCode` to know which field was missing.
`zipCode` is always returned as a string with leading zeros preserved
(e.g. `"02140"`).
**Required permission:** `company:read`
# List Assignees
Source: https://docs.aiinsurance.io/api-reference/assignees/list-assignees
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/{entityType}/{entityId}/assignees
Returns the list of users assigned to a specific entity.
**Required permission:** Permission depends on entity type:
- `policies` → `company.policy:read`
- `submissions` → `company.submission:read`
- `insureds` → `company.insured:read`
- `events` → `company.claim:read`
# Set Assignees
Source: https://docs.aiinsurance.io/api-reference/assignees/set-assignees
/openapi/generated-external-api.yaml put /api/external/companies/{companyId}/{entityType}/{entityId}/assignees
Sets the assignees for a specific entity. This is a full replacement — the provided list of user IDs completely replaces any existing assignees. Pass an empty array to remove all assignees.
Previously removed assignees are soft-deleted (preserved for audit history) and can be re-assigned.
**Required permission:** Permission depends on entity type:
- `policies` → `policy:update`
- `submissions` → `submission:update`
- `insureds` → `insured:update`
- `events` → `claim:update`
# Create Attorney
Source: https://docs.aiinsurance.io/api-reference/attorneys/create-attorney
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/attorneys
Creates a new attorney.
**Required fields:**
- `name` - Attorney name
**Optional fields:**
- `email` - Attorney email address
- `phoneNumber` - Phone number
- `lawFirmId` - Associated law firm payee ID (must reference an existing payee)
**Required permission:** `company.attorney:create`
# Delete Attorney
Source: https://docs.aiinsurance.io/api-reference/attorneys/delete-attorney
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/attorneys/{attorneyId}
Soft deletes an attorney by setting deletedAt and deletedBy timestamps.
The attorney will no longer be returned in list or get operations.
**Required permission:** `company.attorney:delete`
# Get Attorney
Source: https://docs.aiinsurance.io/api-reference/attorneys/get-attorney
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/attorneys/{attorneyId}
Returns a single attorney by ID.
**Required permission:** `company.attorney:read`
# List Attorneys
Source: https://docs.aiinsurance.io/api-reference/attorneys/list-attorneys
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/attorneys
Returns a paginated list of attorneys for the company.
Attorneys represent legal professionals that can be associated with lawsuits as plaintiff or defense counsel.
Filter by ID or search text, and sort by various fields.
**Required permission:** `company.attorney:read`
# Update Attorney
Source: https://docs.aiinsurance.io/api-reference/attorneys/update-attorney
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/attorneys/{attorneyId}
Updates an existing attorney. Only send fields you want to change.
Send `null` for nullable fields to clear them.
**Optional update fields:**
- `name` - Update attorney name
- `email` - Update email address (send null to clear)
- `phoneNumber` - Update phone number (send null to clear)
- `lawFirmId` - Update law firm association (send null to clear)
**Required permission:** `company.attorney:update`
# Bind Quote
Source: https://docs.aiinsurance.io/api-reference/basic-policies/bind-quote
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/quotes/{quoteId}/bind
Binds a Field Model V1 quote, creating a Basic Policy. The quote must
not already be bound.
On success, returns the newly created policy ID, policy number, and any
bind errors encountered during the process. Bind errors are non-fatal
warnings — the policy is still created.
**Required permission:** `company.quote:create`
# Create Basic Policy
Source: https://docs.aiinsurance.io/api-reference/basic-policies/create-basic-policy
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies
Creates a new basic policy. The request body is a flat object of
company-configured fields plus a nested `exposures` array.
Each exposure's `id` (and the top-level `primaryInsured`) must
reference an existing exposure record — create exposures first via
the [Exposures API](/api-v1-reference/exposures/overview).
Additional company-configured fields (custom text, number, option-set,
or object fields) may be included alongside the required fields below.
**Required permission:** `company.policy:create`
# Delete Basic Policy
Source: https://docs.aiinsurance.io/api-reference/basic-policies/delete-basic-policy
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/policies/{policyId}
Soft-deletes a basic policy.
**Required permission:** `policy:delete`
# Get Basic Policy
Source: https://docs.aiinsurance.io/api-reference/basic-policies/get-basic-policy
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}
Returns a single basic policy by ID, with the flat `fieldModelV1Data`
object including the nested `exposures` array.
**Required permission:** `company.policy:read`
# List Basic Policies
Source: https://docs.aiinsurance.io/api-reference/basic-policies/list-basic-policies
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies
Returns a paginated list of basic policies for the company.
**Filtering:**
- `id` — one or more policy UUIDs.
- `policyNumberFilterText` — case-insensitive substring match against
`policyNumber` only. It does not search any other field. Prefer
`filters` for anything beyond a policy-number substring search.
- `filters` — zero or more structured per-field filters
(`FieldModelV1ListFilter[]`) applied against any FMV1 field or
system column (`createdAt`, `updatedAt`, `createdBy`, `updatedBy`).
Combined with AND semantics.
**Sorting:** `sortBy` accepts `createdAt`, `updatedAt`, or `number`
(default `createdAt`). `sortDirection` accepts `asc` or `desc`
(default `desc`).
**Pagination:** page size is server-controlled. Pass `page` as a
1-based page number to iterate.
**Required permission:** `company.policy:read`
# Create Brokerage
Source: https://docs.aiinsurance.io/api-reference/brokerages/create-brokerage
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/brokerages
Creates a new brokerage.
**Required fields:**
- `name` - Brokerage name
- `commissionPaymentMethod` - How commissions are handled
**Optional fields:**
- `niprBrokerageNumber` - NIPR brokerage number
- `email` - Brokerage email address
- `addressStructured` - Structured address object
- `phone` - Phone number
- `defaultCommissionPercentage` - Default commission percentage
**Required permission:** `company.brokerage:create`
# Delete Brokerage
Source: https://docs.aiinsurance.io/api-reference/brokerages/delete-brokerage
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/brokerages/{brokerageId}
Soft deletes a brokerage by setting deletedAt and deletedBy timestamps.
The brokerage will no longer be returned in list or get operations.
**Required permission:** `brokerage:update`
# Get Brokerage
Source: https://docs.aiinsurance.io/api-reference/brokerages/get-brokerage
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/brokerages/{brokerageId}
Returns a single brokerage by ID.
**Required permission:** `company.brokerage:read`
# List Brokerages
Source: https://docs.aiinsurance.io/api-reference/brokerages/list-brokerages
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/brokerages
Returns a paginated list of brokerages for the company.
Brokerages represent insurance agencies or brokers that distribute policies.
Filter by ID or search text, and sort by various fields.
**Required permission:** `company.brokerage:read`
# Update Brokerage
Source: https://docs.aiinsurance.io/api-reference/brokerages/update-brokerage
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/brokerages/{brokerageId}
Updates an existing brokerage. Only send fields you want to change.
**Optional update fields:**
- `name` - Update brokerage name
- `commissionPaymentMethod` - Update commission handling method
- `niprBrokerageNumber` - Update NIPR number
- `email` - Update email address
- `addressStructured` - Update address
- `phone` - Update phone number
- `defaultCommissionPercentage` - Update default commission
**Required permission:** `company.brokerage:create`
# Create Broker
Source: https://docs.aiinsurance.io/api-reference/brokers/create-broker
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/brokers
Creates a new broker associated with an existing brokerage.
**Required fields:**
- `brokerageId` - ID of an existing brokerage (use GET /brokerages to find valid IDs)
- `name` - Broker name
**Optional fields:**
- `email` - Broker email address
- `defaultCommissionPercentage` - Default commission percentage (0-100)
- `addressStructured` - Structured address object
- `phone` - Primary phone number
- `workPhone` - Work phone number
- `producerNumber` - Producer number/identifier
**Required permission:** `company.broker:create`
# Delete Broker
Source: https://docs.aiinsurance.io/api-reference/brokers/delete-broker
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/brokers/{brokerId}
Soft deletes a broker by setting deletedAt and deletedBy timestamps.
The broker will no longer be returned in list or get operations.
**Note:** This operation will fail if the broker is associated with any
policies, drafts, or insureds.
**Required permission:** `company.broker:create`
# Get Broker
Source: https://docs.aiinsurance.io/api-reference/brokers/get-broker
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/brokers/{brokerId}
Returns a single broker by ID.
**Required permission:** `broker:read`
# List Brokers
Source: https://docs.aiinsurance.io/api-reference/brokers/list-brokers
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/brokers
Returns a paginated list of brokers for the company.
Brokers are individual agents associated with brokerages.
Filter by broker ID, brokerage ID, or search text, and sort by various fields.
**Required permission:** `company.broker:read`
# Update Broker
Source: https://docs.aiinsurance.io/api-reference/brokers/update-broker
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/brokers/{brokerId}
Updates an existing broker. Only send fields you want to change.
**Optional update fields:**
- `name` - Update broker name
- `email` - Update email address (send null to clear)
- `defaultCommissionPercentage` - Update default commission (0-100)
- `addressStructured` - Update address
- `phone` - Update phone number
- `workPhone` - Update work phone number
- `producerNumber` - Update producer number
- `brokerageId` - Update associated brokerage
- `createdAt` - Update creation timestamp
**Required permission:** `broker:update`
# Create Folder
Source: https://docs.aiinsurance.io/api-reference/company-files/create-folder
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/folders
Creates a new folder in the company file system.
Optionally nest the folder under an existing parent by providing
`parentFolderId`. Omit it (or leave it out) to create a root-level
folder.
**Required permission:** `company.file:create`
# Delete File
Source: https://docs.aiinsurance.io/api-reference/company-files/delete-file
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/files/{fileId}
Soft-deletes a file. The file is no longer returned by list endpoints
and its content can no longer be downloaded.
**Required permission:** `company.file:delete`
# Delete Folder
Source: https://docs.aiinsurance.io/api-reference/company-files/delete-folder
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/folders/{folderId}
Soft-deletes a folder and all of its contents recursively (subfolders
and files). Deleted items are no longer returned by list endpoints.
**Required permission:** `company.file:delete`
# Download File Content
Source: https://docs.aiinsurance.io/api-reference/company-files/download-file-content
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/files/{fileId}/content
Streams the binary content of a file. The response `Content-Type` is
set to the file's MIME type (or `application/octet-stream` if unknown),
and `Content-Disposition` is set to `attachment` with the file name.
**Required permission:** `company.file:read`
# Get File Metadata
Source: https://docs.aiinsurance.io/api-reference/company-files/get-file-metadata
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/files/{fileId}
Returns metadata for a single file. Does not return the file content —
use the [Download File Content](#tag/Company-Files/GET/api/v1/external/companies/{companyId}/files/{fileId}/content)
endpoint to stream the binary content.
**Required permission:** `company.file:read`
# List Folder Contents
Source: https://docs.aiinsurance.io/api-reference/company-files/list-folder-contents
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/folders/{folderId}
Returns a paginated list of items (files and subfolders) inside the
specified folder. Each item has a `contentType` discriminator (`file`
or `folder`).
**Sorting:** `createdAt` (default)
**Required permission:** `company.file:read`
# List Folder Tree
Source: https://docs.aiinsurance.io/api-reference/company-files/list-folder-tree
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/folders
Returns a flat, paginated list of all folders in the company. Each folder
includes a `parentFolderId` so consumers can reconstruct the hierarchy
client-side.
**Sorting:** `createdAt` (default), `name`
**Required permission:** `company.file:read`
# Rename or Move File
Source: https://docs.aiinsurance.io/api-reference/company-files/rename-or-move-file
/openapi/generated-external-api.yaml patch /api/v1/external/companies/{companyId}/files/{fileId}
Renames a file, moves it to a different folder, or both. Send only the
fields you want to change.
Set `folderId` to a folder ID to move the file into that folder, or to
`null` to remove it from its current folder (move to root).
**Required permission:** `company.file:update`
# Rename or Move Folder
Source: https://docs.aiinsurance.io/api-reference/company-files/rename-or-move-folder
/openapi/generated-external-api.yaml patch /api/v1/external/companies/{companyId}/folders/{folderId}
Renames a folder, moves it to a different parent, or both. Send only the
fields you want to change.
Set `parentFolderId` to a folder ID to move the folder, or to `null` to
move it to the root level.
**Required permission:** `company.file:update`
# Upload File
Source: https://docs.aiinsurance.io/api-reference/company-files/upload-file
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/files
Uploads a file to the company file system. The request body must be
`multipart/form-data`.
Optionally place the file inside a folder by providing `folderId`. Omit
it to upload to the root level (no folder).
**Required permission:** `company.file:create`
# Create Configuration Field
Source: https://docs.aiinsurance.io/api-reference/configuration-fields/create-configuration-field
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/configuration/fields
Creates a new configuration field and associates it with the specified entity type.
**Allowed entity names:** `events`, `insureds`, `policies`
**Allowed field class names:** `InputField`, `SelectField`, `DateField`, `RadioSelect`, `ExportResolvedField`
The field key cannot be `companyId` (reserved).
**Required permission:** `company:update`
# Delete Configuration Field
Source: https://docs.aiinsurance.io/api-reference/configuration-fields/delete-configuration-field
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/configuration/fields/{fieldId}
Deletes a configuration field by ID. The field must be an entity field
(events, insureds, or policies) — rating fields cannot be deleted through
this endpoint.
The field definition and its entity association are permanently deleted.
**Required permission:** `company:update`
# List Configuration Fields
Source: https://docs.aiinsurance.io/api-reference/configuration-fields/list-configuration-fields
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/configuration/fields
Returns a paginated list of configuration fields for the company.
Only returns entity fields (events, insureds, policies) — rating fields
are managed through separate endpoints.
**Filtering:**
- `id` - Filter by field ID (single UUID or array)
- `entityName` - Filter by entity type (events, insureds, policies)
**Sorting:**
- `createdAt` (default), `updatedAt`
**Required permission:** `company:read`
# Create Configuration Preset
Source: https://docs.aiinsurance.io/api-reference/configuration-presets/create-configuration-preset
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/configuration/presets
Creates a new coverage limit preset for the company. The preset is stored
directly in the `coverage_limit_presets` table.
The `coverageTypeKey` must reference an existing coverage type (global or
company-specific). If the coverage type does not exist, a 404 is returned.
If `isDefault` is `true`, any existing default preset for the same coverage
type is automatically set to non-default. Only one preset per coverage type
can be the default at a time.
**Required permission:** `company:update`
# Delete Configuration Preset
Source: https://docs.aiinsurance.io/api-reference/configuration-presets/delete-configuration-preset
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/configuration/presets/{presetId}
Soft-deletes a coverage limit preset by ID. The preset is marked as deleted
and will no longer appear in list results, but is not physically removed
from the database.
**Required permission:** `company:update`
# List Configuration Presets
Source: https://docs.aiinsurance.io/api-reference/configuration-presets/list-configuration-presets
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/configuration/presets
Returns a paginated list of coverage limit presets for the company.
**Filtering:**
- `coverageTypeKey` - Filter by coverage type (exact match)
- `id` - Filter by preset ID (single UUID or array)
**Sorting:**
- `createdAt` (default), `updatedAt`
**Required permission:** `company:read`
# Create Configuration Rating Field
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-fields/create-configuration-rating-field
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/configuration/rating/fields
Creates a new rating input field and associates it with the specified entity type
and rating engine revision.
The field definition is stored in `company_fields`, an association is created in
`application_fields`, and the field is added to the rating engine revision's
`config.applicationFields` array.
**Allowed field class names:** `AddressField`, `DateField`, `GroupField`, `InputField`, `LocalCurrency`, `MultiSelectField`, `SelectField`, `StaticField`
The field key cannot be `companyId` (reserved).
**Required permission:** `company:update`
# Delete Configuration Rating Field
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-fields/delete-configuration-rating-field
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/configuration/rating/fields/{fieldId}
Deletes a rating input field by ID. The field definition, its application field
association, and its entry in the rating engine revision's `config.applicationFields`
are all permanently removed.
**Required permission:** `company:update`
# List Configuration Rating Fields
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-fields/list-configuration-rating-fields
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/configuration/rating/fields
Returns a paginated list of rating input fields for the company.
Only returns rating fields — entity fields (events, insureds, policies)
are managed through `/configuration/fields` endpoints.
**Filtering:**
- `id` - Filter by field ID (single UUID or array)
- `entityType` - Filter by entity type (e.g., "policies", "dealership")
**Sorting:**
- `createdAt` (default), `updatedAt`
**Required permission:** `company:read`
# Reorder Configuration Rating Fields
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-fields/reorder-configuration-rating-fields
/openapi/generated-external-api.yaml put /api/external/companies/{companyId}/configuration/rating/fields/rank
Reorders the rating input fields for a single `(companyId, entityType)`
tuple by rewriting `application_fields.rank`. The array index of each
field id in the request becomes its new `rank` (lower renders first,
`null` renders last).
This endpoint updates the UI rendering order only — it does **not**
modify rating engine revisions (`rating_engine_revisions.config`).
**Semantics — full set required:**
The provided `fieldIds` must exactly match the set of rating fields
currently defined for this `entityType`. Partial reorders, duplicate
ids, unknown ids, and missing ids are all rejected.
**Required permission:** `company:update`
# Create Rating Revision Form Logic
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-form-logic/create-rating-revision-form-logic
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/configuration/rating/form-logic
Creates a new form-logic rule in the rating engine revision's config JSON
(`rating_engine_revisions.config.policyFormLogicConfigs`). Rules determine
which forms are attached to policies or quotes based on a `shouldAdd`
expression evaluated during rating.
The `ratingEngineRevisionId` must reference an existing, non-deleted
revision owned by this company.
**Required permission:** `company:update`
# Delete Rating Revision Form Logic
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-form-logic/delete-rating-revision-form-logic
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/configuration/rating/form-logic/{formLogicId}
Removes a form-logic rule from the rating engine revision's config JSON
by ID. The rule is permanently removed from the `policyFormLogicConfigs`
array in the revision's config.
The `ratingEngineRevisionId` must reference an existing, non-deleted
revision owned by this company.
**Required permission:** `company:update`
# List Rating Revision Form Logic
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-form-logic/list-rating-revision-form-logic
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/configuration/rating/form-logic
Returns all form-logic rules from a rating engine revision's config JSON
(`config.policyFormLogicConfigs`). Rules are returned as a flat list with
no pagination.
**Filtering:**
- `ruleName` - Filter by rule name (exact match, non-empty)
- `id` - Filter by rule ID (single UUID or array)
**Sorting:**
- `ruleName` (default), `rank`
- Default direction: ascending
- Ties are broken by `id` ascending (or descending when `sortDirection=desc`)
**Required permission:** `company:read`
# Create Configuration Rating Output
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-outputs/create-configuration-rating-output
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/configuration/rating/outputs
Creates a new rating output field (entity name: `rating_engine_display`) and an
associated smart tag with the naming convention `AII{key}PrimaryInsured`.
The field definition is stored in `company_fields`, an association is created in
`company_entity_fields`, and a smart tag is created in `smart_tags`.
**Allowed field class names:** `InputField`
The field key cannot be `companyId` (reserved) and must be alphanumeric
(`[A-Za-z0-9]+`) since the smart tag name is derived from it.
**Required permission:** `company:update`
# Delete Configuration Rating Output
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-outputs/delete-configuration-rating-output
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/configuration/rating/outputs/{fieldId}
Deletes a rating output field by ID. The field definition, its
`company_entity_fields` association, and its associated smart tag are all
removed. The field and association are permanently deleted; the smart tag
is soft-deleted (`deleted_at` is set).
**Required permission:** `company:update`
# List Configuration Rating Outputs
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-outputs/list-configuration-rating-outputs
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/configuration/rating/outputs
Returns a paginated list of rating output fields (`rating_engine_display`)
for the company.
**Filtering:**
- `id` - Filter by field ID (single UUID or array)
**Sorting:**
- `createdAt` (default), `updatedAt`
**Required permission:** `company:read`
# Create Rating Revision Preset
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-presets/create-rating-revision-preset
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/configuration/rating/presets
Creates a new coverage limit preset in the rating engine revision's config JSON.
This endpoint is for **rating-engine companies** — presets are stored in
`rating_engine_revisions.config.coverageLimitPresets`, not in the
`coverage_limit_presets` table.
For non-rating-engine companies, use `POST /configuration/presets` instead.
The `coverageTypeKey` must reference an existing coverage type (global or
company-specific). If the coverage type does not exist, a 404 is returned.
If `isDefault` is `true`, any existing default preset for the same coverage
type within the revision's config is automatically set to non-default.
**Required permission:** `company:update`
# Delete Rating Revision Preset
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-presets/delete-rating-revision-preset
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/configuration/rating/presets/{presetId}
Removes a coverage limit preset from the rating engine revision's config JSON
by ID. The preset is permanently removed from the `coverageLimitPresets` array
in the revision's config.
This endpoint is for **rating-engine companies** — presets are stored in
`rating_engine_revisions.config.coverageLimitPresets`, not in the
`coverage_limit_presets` table.
For non-rating-engine companies, use `DELETE /configuration/presets/{presetId}` instead.
**Required permission:** `company:update`
# List Rating Revision Presets
Source: https://docs.aiinsurance.io/api-reference/configuration-rating-presets/list-rating-revision-presets
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/configuration/rating/presets
Returns all coverage limit presets from a rating engine
revision's config JSON (`config.coverageLimitPresets`). This endpoint is
for **rating-engine companies**.
For non-rating-engine companies, use `GET /configuration/presets` instead.
**Filtering:**
- `coverageTypeKey` - Filter by coverage type (exact match)
- `id` - Filter by preset ID (single UUID or array)
**Sorting:**
- `setName` (default), `coverageTypeKey`
- Default direction: ascending
**Required permission:** `company:read`
# Create Coverage Type
Source: https://docs.aiinsurance.io/api-reference/coverage-types/create-coverage-type
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/coverage-types
Creates a new company-specific coverage type. The coverage type is inserted
into the `coverage_types` table with `company_identifier` set to the company ID.
This endpoint only creates the coverage type row — it does **not** enable it.
To control which coverage types are active for a company, use the
Set Enabled Coverage Types endpoint.
The `key` is a caller-provided string (not a UUID), typically following the
convention `{shortName}_{snake_case_name}` (e.g., `vfs_general_liability`).
**Required permission:** `company:update`
# Delete Coverage Type
Source: https://docs.aiinsurance.io/api-reference/coverage-types/delete-coverage-type
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/coverage-types/{coverageTypeId}
Permanently deletes a company-specific coverage type. Global coverage types
cannot be deleted.
Before deletion, the coverage type must be:
- **Not enabled** — remove it from the enabled list first using the
Set Enabled Coverage Types endpoint
- **Not referenced by fields** — remove field associations first using the
Set Coverage Type Fields endpoint
**Required permission:** `company:update`
# Get Coverage Type Fields
Source: https://docs.aiinsurance.io/api-reference/coverage-types/get-coverage-type-fields
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/coverage-types/{coverageTypeId}/fields
Returns the list of field keys associated with a given coverage type.
Fields are sourced from both the database (`entity_type_fields` table)
and static configuration, then merged and deduplicated. The returned
field keys are human-readable strings (e.g., "reportDate") that match
the keys used in event `data` objects.
**Required permission:** `company.event:export`
# List Coverage Types
Source: https://docs.aiinsurance.io/api-reference/coverage-types/list-coverage-types
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/coverage-types
Returns all coverage types available to the company, including both
global types and company-specific types. Results are sorted alphabetically by key.
**Filtering:**
- `label` - Filter by label (case-insensitive substring match)
**Required permission:** `company:read`
# Set Coverage Type Fields
Source: https://docs.aiinsurance.io/api-reference/coverage-types/set-coverage-type-fields
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/coverage-types/{coverageTypeId}/fields
Sets the fields associated with a company-specific coverage type.
This is a **replace** operation — the provided field list completely
replaces all existing fields for the coverage type. Pass an empty array
to remove all fields. Duplicate field keys in the request are
automatically deduplicated.
Only company-specific coverage types can be modified. Attempting to
modify a global (shared) coverage type returns a 403 error.
**Required permission:** `company:update`
# Set Enabled Coverage Types
Source: https://docs.aiinsurance.io/api-reference/coverage-types/set-enabled-coverage-types
/openapi/generated-external-api.yaml put /api/external/companies/{companyId}/coverage-types/enabled
Replaces the company's enabled coverage types list wholesale. The provided
`coverageTypeKeys` array becomes the new complete list of enabled coverage
types for the company.
Each key must refer to an existing coverage type that is either:
- A **global** coverage type (e.g., `general_liability`, `inland_marine`)
- A **company-specific** coverage type owned by this company
Duplicate keys in the request are automatically deduplicated.
At least one key must be provided.
Coverage types that belong to other companies are treated as not found
to avoid leaking information about other companies' configurations.
**Required permission:** `company:update`
# Create Defendant
Source: https://docs.aiinsurance.io/api-reference/defendants/create-defendant
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants
Creates a defendant for a lawsuit. A lawsuit must exist for the given event.
Each defendant must have either an `insuredId` or a `nonInsuredName` (not both).
**Required permission:** `company.event:export`
# Delete Defendant
Source: https://docs.aiinsurance.io/api-reference/defendants/delete-defendant
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants/{defendantId}
Soft-deletes a defendant. The defendant will no longer be returned by GET or LIST requests.
**Required permission:** `company.event:export`
# Get Defendant
Source: https://docs.aiinsurance.io/api-reference/defendants/get-defendant
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants/{defendantId}
Returns a single defendant by ID.
The defendant must belong to the lawsuit associated with the given event.
**Required permission:** `company.event:export`
# List Defendants
Source: https://docs.aiinsurance.io/api-reference/defendants/list-defendants
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants
Returns a paginated list of defendants for a lawsuit.
Defendants are sub-resources of lawsuits. A lawsuit must exist for the given event.
Each defendant is either an insured (linked via `insuredId`) or a non-insured party (identified by `nonInsuredName`).
**Required permission:** `company.event:export`
# Update Defendant
Source: https://docs.aiinsurance.io/api-reference/defendants/update-defendant
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/events/{eventId}/lawsuit/defendants/{defendantId}
Updates a defendant. Only provided fields are updated.
Send `null` for a field to clear its value. Omit a field to preserve its existing value.
**Required permission:** `company.event:export`
# Create Event Transaction
Source: https://docs.aiinsurance.io/api-reference/event-financials/create-event-transaction
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/events/{eventId}/financials/transactions
Creates a new financial transaction for an event.
**Transaction Types:**
- **Non-itemized types** (e.g., `indemnity_invoice`): Require `amount` field, `lineItems` is forbidden
- **Itemized types** (e.g., `alae_invoice`): Require `lineItems` array, `amount` is forbidden
Use the [GET /transaction-categories](/api-reference/transaction-categories/list-transaction-categories) endpoint to see available transaction types and whether they are itemized.
**Note:** This endpoint does NOT automatically update reserves. Use [PATCH /events/{eventId}/financials/expected-totals](/api-reference/event-financials/update-expected-totals) to update reserves.
**Required permission:** `company.payment:create`
# Delete Event Transaction
Source: https://docs.aiinsurance.io/api-reference/event-financials/delete-event-transaction
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/events/{eventId}/financials/transactions/{transactionId}
Permanently soft-deletes a financial transaction. Unlike voiding, deletion is for transactions that should not have existed at all. Sets `deletedAt` and `deletedBy` on the transaction and recalculates reserves.
**Required permission:** `company.payment:update`
# Get Event Reserves
Source: https://docs.aiinsurance.io/api-reference/event-financials/get-event-reserves
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/financials/reserves
Returns reserve information for all transaction categories on an event.
Each category includes:
- `reserves`: Current reserve amount (null if category doesn't support reserves)
- `owed`: Total amount owed
- `paid`: Total amount paid
- `expectedTotal`: Expected total amount
**All amounts are in cents.**
**Required permission:** `company.payment:read`
# Get Event Transaction
Source: https://docs.aiinsurance.io/api-reference/event-financials/get-event-transaction
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/financials/transactions/{transactionId}
Returns a single financial transaction by ID, including line items (itemizations).
**Required permission:** `company.event:export`
# Get Event Transaction Totals
Source: https://docs.aiinsurance.io/api-reference/event-financials/get-event-transaction-totals
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/financials/transactions/totals
Returns transaction totals for all expense categories on a specific event.
Each category includes:
- `categoryId`: The transaction category identifier
- `reserves`: Current reserve amount (null if category doesn't support reserves)
- `owed`: Total amount owed
- `paid`: Total amount paid
- `expectedTotal`: Expected total amount
**All amounts are in cents.**
**Required permission:** `company.payment:read`
# List Event Financial Totals
Source: https://docs.aiinsurance.io/api-reference/event-financials/list-event-financial-totals
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/financials/{transactionType}/totals
Returns a paginated list of all events with their financial totals for a specific transaction type.
Each event item includes:
- `hasCategoryTransactions`: Whether the event has any transactions of the specified type
- Financial totals (reserves, owed, paid, expectedTotal) - null if no transactions exist
**All amounts are in cents.**
**Note:** Sorting is limited to `createdAt` only. Computed financial values cannot be sorted.
**Required permission:** `company.payment:read`
# List Event Transactions
Source: https://docs.aiinsurance.io/api-reference/event-financials/list-event-transactions
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/financials/transactions
Returns a paginated list of financial transactions for a specific event.
Supports filtering by transaction type, status, payee, and text search.
**Required permission:** `company.event:export`
# List Expected Total Timeline
Source: https://docs.aiinsurance.io/api-reference/event-financials/list-expected-total-timeline
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/financials/expected-totals/timeline
Returns a chronological timeline of expected total (reserve) changes for specified events.
Each entry represents a point in time when reserves were updated, including:
- The expected total at that moment
- Who made the change
- Which transaction category was affected
Use this to audit reserve history or build reserve trend visualizations.
**All amounts are in cents.**
**Required permission:** `company.payment:read`
# Update Expected Totals
Source: https://docs.aiinsurance.io/api-reference/event-financials/update-expected-totals
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/events/{eventId}/financials/expected-totals
Updates the expected total for a transaction category on an event.
This endpoint is used to set or update reserve amounts for categories that support reserves.
**Important:** Amounts are in **dollars** (not cents) for this endpoint.
**Required permission:** `company.claim:update` or `company.incident:update` (depending on event type)
# Void Event Transaction
Source: https://docs.aiinsurance.io/api-reference/event-financials/void-event-transaction
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/events/{eventId}/financials/transactions/{transactionId}
Voids a financial transaction. Once voided, a transaction cannot be modified further. Optionally provide a custom void reason.
**Required permission:** `company.payment:update`
# Create Event
Source: https://docs.aiinsurance.io/api-reference/events/create-event
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/events
Creates a new event (claim or incident).
**Required fields:**
- `type` - Event type (`claim` or `incident`)
- `coverageTypeId` - Coverage type identifier
- `insuredIds` - At least one insured must be associated
**Optional fields:**
- `status` - Defaults to `open` if not provided
- `policyId` - Associate with a policy
- `data` - Custom entity data as key-value pairs
**Required permission:** `company.claim:create` or `company.incident:create` (depending on type)
# Delete Event
Source: https://docs.aiinsurance.io/api-reference/events/delete-event
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/events/{eventId}
Soft deletes an event by setting deletedAt and deletedBy timestamps.
The event will no longer be returned in list or get operations.
**Financial Transaction Protection:**
By default, events with paid or processing financial transactions cannot be deleted.
This protects financial data integrity. If you need to delete such an event,
set `force: true` in the request body.
**⚠️ WARNING:** Using `force: true` will orphan the associated financial records.
Only use this option if you understand the implications.
**Required fields in request body:**
- `type` - Event type (required for permission resolution)
**Optional fields:**
- `force` - Set to `true` to delete events with paid/processing transactions (use with caution)
**Required permission:** `company.claim:delete` or `company.incident:delete` (depending on type)
# Get Event
Source: https://docs.aiinsurance.io/api-reference/events/get-event
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}
Returns a single event by ID.
Use `expand=insureds` to include full insured details instead of just IDs.
**Required permission:** `company.claim:read` or `company.incident:read` (depending on event type)
# Get Events Configuration
Source: https://docs.aiinsurance.io/api-reference/events/get-events-configuration
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/configuration
Returns a JSON Schema describing the custom fields available for the
`data` object when creating or updating events, along with mappings
that indicate which fields apply to which coverage types.
The `data` schema is a standard JSON Schema (draft 2020-12) that can be
used directly with validation libraries like Ajv or Zod.
The `fieldCoverageTypeMappings` object maps each field key to either
`"all"` (field applies to all events) or an array of coverage type IDs.
Every key in `data.properties` has a corresponding entry in this mapping.
**Required permission:** `company.event:read`
# List Events
Source: https://docs.aiinsurance.io/api-reference/events/list-events
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events
Returns a paginated list of events (claims and incidents) for the company.
Events represent insurance claims and incidents. Each event includes:
- Basic event information (type, status, reference ID)
- Associated policy and insured references
- Custom entity data specific to your company's configuration
The `data` field contains custom entity data with **field keys** (not field IDs) mapped to values.
Returns `null` when no custom data exists for the event.
**Required permission:** `company.claim:read` or `company.incident:read` (depending on event type filter)
# Update Event
Source: https://docs.aiinsurance.io/api-reference/events/update-event
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/events/{eventId}
Updates an existing event. Only send fields you want to change.
**Required fields in request body:**
- `type` - Event type (required for permission resolution)
**Optional update fields:**
- `status` - Update event status
- `coverageTypeId` - Update coverage type
- `policyId` - Update associated policy (use `null` to remove)
- `insuredIds` - Replace associated insureds
- `data` - Update custom entity data (merged with existing)
**Required permission:** `claim:update` or `incident:update` (depending on type in request body)
# List Export Presets
Source: https://docs.aiinsurance.io/api-reference/export-presets/list-export-presets
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/export-presets
Returns every export preset saved by any user of the company. An export preset is a named, ordered list of export column keys that one user saved for one entity type.
Use the optional `entityType` query parameter to return only presets for one entity type. Results are not paginated: every matching preset is returned, ordered by `entityType`, then `name`. Preset names are not unique, so two presets with the same name may both be returned.
**Required permission:** `company.export_preset:read`
# Create Exposure Type
Source: https://docs.aiinsurance.io/api-reference/exposure-types/create-exposure-type
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/exposure-types
Creates a new exposure type for the company and adds it to the
company's enabled exposure types.
Exposure types define the categories of insured entities a company
can manage (e.g., "Franchise Truck Dealer", "Auto", "Company").
The `value` must be unique within the company. Attempting to create
a duplicate value returns a validation error.
**Required permission:** `company:update`
# Delete Exposure Type
Source: https://docs.aiinsurance.io/api-reference/exposure-types/delete-exposure-type
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/exposure-types/{exposureTypeId}
Permanently deletes a company-specific exposure type and removes it from
the company's enabled exposure types.
Before deletion, the exposure type must not be referenced by any insureds.
If insureds exist with this exposure type, the request returns 409.
**Required permission:** `company:update`
# List Exposure Types
Source: https://docs.aiinsurance.io/api-reference/exposure-types/list-exposure-types
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/exposure-types
Returns all exposure types configured for the company.
Results are sorted alphabetically by key.
**Filtering:**
- `label` - Filter by label (case-insensitive substring match)
**Required permission:** `company:read`
# Create Exposure
Source: https://docs.aiinsurance.io/api-reference/exposures/create-exposure
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/exposures
Creates a new exposure for the company.
**Required fields:**
- `name` - Name of the exposure
- `entityType` - Entity type (e.g., "individual", "organization", "dealership")
**Required permission:** `company.insured:create`
# Delete Exposure
Source: https://docs.aiinsurance.io/api-reference/exposures/delete-exposure
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/exposures/{exposureId}
Soft deletes an exposure by ID.
The exposure will be marked as deleted and will no longer appear in list operations.
**Required permission:** `insured:delete`
# Get Exposure
Source: https://docs.aiinsurance.io/api-reference/exposures/get-exposure
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/exposures/{exposureId}
Returns a single exposure by ID.
**Required permission:** `company.insured:read`
# List Exposures
Source: https://docs.aiinsurance.io/api-reference/exposures/list-exposures
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/exposures
Returns a paginated list of exposures for the company.
**Filtering:**
- `id` - Filter by exposure ID (single or array)
- `entityType` - Filter by entity type
- `filterText` - Text search across exposure name
**Sorting:**
- `createdAt` (default), `name`, `entityType`
**Required permission:** `company.insured:read`
# Update Exposure
Source: https://docs.aiinsurance.io/api-reference/exposures/update-exposure
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/exposures/{exposureId}
Updates an existing exposure.
All fields are optional - only send fields being changed.
Does NOT allow updating entityType or applicationData (rating data).
**Required permission:** `insured:update`
# Download Bordereau CSV
Source: https://docs.aiinsurance.io/api-reference/field-model-bordereau/download-bordereau-csv
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/bordereau/download
Downloads the bordereau report as a CSV file. Returns the same transaction-level
premium data as the [List Bordereau Rows](/api-reference/field-model/bordereau/list)
endpoint, serialized as RFC 4180 CSV with a `Content-Disposition: attachment` header.
The CSV includes fixed columns (Policy Number, Insured Name, Transaction Action,
Policy Version, Effective Date, Transaction Timestamp, Policy Start Date,
Policy End Date, Created At, Created By, Policy Premium, Policy Premium
Change) plus any additional columns specified via the `additionalColumns`
parameter.
Default limit is 50,000 rows (maximum 50,000).
**Required permission:** `company.policy:read`
# Export Bordereau to Google Sheets
Source: https://docs.aiinsurance.io/api-reference/field-model-bordereau/export-bordereau-to-google-sheets
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies/bordereau/export
Exports the bordereau report to a Google Sheets spreadsheet. Writes the same
transaction-level premium data as the
[List Bordereau Rows](/api-reference/field-model/bordereau/list) endpoint into
a Google Sheets tab.
Provide either `spreadsheetId` (to write into an existing spreadsheet) or
`folderId` (to create a new spreadsheet in that Google Drive folder). When using
`folderId`, the spreadsheet name defaults to
`"{companyShortName}-bordereau-export {UTC timestamp}"` unless overridden via
`spreadsheetName`.
The caller must supply a `googleOAuthToken` with write access to the target
spreadsheet or folder.
Default limit is 50,000 rows (maximum 50,000).
**Required permission:** `company.policy:read`
# List Bordereau Rows
Source: https://docs.aiinsurance.io/api-reference/field-model-bordereau/list-bordereau-rows
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/bordereau
Returns a paginated, flat list of transaction-level premium rows (a "bordereau").
Each row represents one policy transaction and includes fixed columns (policy number,
insured name, action, dates, premium, premium change) plus optional dynamic columns
resolved from FullTerm custom object fields.
Use `periodStart` and `periodEnd` to scope the report to transactions whose
`transactionTimestamp` falls within the half-open interval `[periodStart, periodEnd)`.
Use `actions` to filter by transaction type (e.g. only NEW_BUSINESS and ENDORSE).
Use `additionalColumns` to transpose FullTerm custom object fields into extra
columns. Each entry maps a dot-path into the segment's policy data to a named
column header.
**Required permission:** `company.policy:read`
# Add Custom Object Relationship
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/add-custom-object-relationship
/openapi/generated-external-api.yaml put /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}/relationships/{fieldRefId}/{targetId}
Links a custom object to a target entity via a relationship field. Use
the `fieldRefId` from the
[Get Configuration](/api-reference/field-model/custom-objects/get-custom-object-configuration)
endpoint.
**Cardinality behavior:**
- **one_to_one**: Replaces any existing link from this object *and* any
existing link to the target. Each side can have at most one link.
- **one_to_many**: Replaces any existing link from this object (the "one"
side), but the target (the "many" side) can have multiple links.
- **many_to_one**: Appends the link. The source (the "many" side) can
have multiple links, but existing links to the target from other
sources on the "one" side are replaced.
- **many_to_many**: Appends the link. Both sides can have multiple links.
If the exact same link already exists, the operation is idempotent and
returns `created: false`.
**Required permission:** `company.fmv1_custom_object:update`
# Create Custom Object
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/create-custom-object
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/custom-objects/{objectType}
Creates a new custom object of the given type.
The request body must include a `data` object where keys are field
`referenceId`s defined in the type's configuration. Use the
[Get Configuration](/api-reference/field-model/custom-objects/get-custom-object-configuration)
endpoint to discover available fields.
**Relationship fields are not accepted in `data`** — use the dedicated
relationship management endpoints instead.
**Required permission:** `company.fmv1_custom_object:create`
# Delete Custom Object
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/delete-custom-object
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}
Deletes a custom object by ID.
**Required permission:** `company.fmv1_custom_object:delete`
# Get Custom Object
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/get-custom-object
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}
Returns a single custom object by ID. The response includes both `data`
(regular field values) and `relationships` (linked entity IDs).
**Required permission:** `company.fmv1_custom_object:read`
# Get Custom Object Configuration
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/get-custom-object-configuration
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/custom-objects/{objectType}/configuration
Returns the field configuration for a custom object type. The response
includes:
- **`data`**: A JSON Schema describing the regular fields available for
create and update operations.
- **`relationships`**: An array of relationship field metadata, each
containing the `fieldRefId` to use with the relationship management
endpoints.
**Required permission:** `company.fmv1_custom_object:read`
# List Custom Object Types
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/list-custom-object-types
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/custom-objects
Returns the list of custom object types configured for the company. Use
the `type` value from the response as the `objectType` path parameter
for all other custom object endpoints.
**Required permission:** `company.fmv1_custom_object:read`
# List Custom Objects
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/list-custom-objects
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/custom-objects/{objectType}
Returns a paginated list of custom objects for the given type.
**Sorting:** `createdAt` (default), `updatedAt`, `displayName`
**Required permission:** `company.fmv1_custom_object:read`
# Remove Custom Object Relationship
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/remove-custom-object-relationship
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}/relationships/{fieldRefId}/{targetId}
Removes the link between a custom object and a target entity for the
given relationship field.
If the link does not exist, the operation is idempotent and returns
`removed: false`.
**Required permission:** `company.fmv1_custom_object:update`
# Update Custom Object
Source: https://docs.aiinsurance.io/api-reference/field-model-custom-objects/update-custom-object
/openapi/generated-external-api.yaml put /api/v1/external/companies/{companyId}/custom-objects/{objectType}/{objectId}
Updates a custom object's data fields. The request body must include a
`data` object — this is a **full replacement** of the object's field data,
not a merge. Include all fields you want the object to have after the update.
**Relationship fields are not accepted in `data`** — use the dedicated
relationship management endpoints instead.
**Required permission:** `company.fmv1_custom_object:update`
# Aggregate Earned Premium
Source: https://docs.aiinsurance.io/api-reference/field-model-earned-premium/aggregate-earned-premium
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/aggregate/earned-premium
Returns earned premium per day summed across all matching policies. No
per-policy or per-transaction breakdown — just a daily time series and
a grand total.
Use `segmentScope` to control which policies are included based on
segment date matching:
- `"all"` — every policy
- `{"asOf":"YYYY-MM-DD"}` — policies with segments active on that date
- `{"fromDate":"YYYY-MM-DD","toDate":"YYYY-MM-DD"}` — policies with
segments overlapping the date range
Use `filters` to narrow results by field values in policy data.
The earned premium date range is a half-open interval `[startDate, endDate)`
and must not exceed 366 days.
**Required permission:** `company.policy:read`
# Get Earned Premium (Single Policy)
Source: https://docs.aiinsurance.io/api-reference/field-model-earned-premium/get-earned-premium-single-policy
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}/earned-premium
Returns earned premium for a single policy over a date range. Each
transaction on the policy produces a daily contribution (a fixed daily
rate over its effective range), and the earned premium on any given day
is the sum of all active contributions.
Use the `detail` parameter to control response granularity:
- `transactions` (default) — transaction-level totals only
- `days` — adds a daily time series of net earned premium
- `daysAndTransactions` — adds a daily time series with per-transaction
contributions on each day
The date range is a half-open interval `[startDate, endDate)` and must
not exceed 366 days.
Use `timeTravelBackToDate` to see earned premium as it would have been
calculated at a prior point in time — only transactions created before
that timestamp are included.
**Required permission:** `company.policy:read`
# List Earned Premium (Multi-Policy)
Source: https://docs.aiinsurance.io/api-reference/field-model-earned-premium/list-earned-premium-multi-policy
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/list/earned-premium
Returns earned premium for multiple policies, paginated by policy. Each
item in the response has the same shape as the single-policy endpoint
for the requested detail level.
Use `segmentScope` to control which policies are included based on
segment date matching:
- `"all"` — every policy
- `{"asOf":"YYYY-MM-DD"}` — policies with segments active on that date
- `{"fromDate":"YYYY-MM-DD","toDate":"YYYY-MM-DD"}` — policies with
segments overlapping the date range
Use `filters` to narrow results by field values in policy data.
The earned premium date range is a half-open interval `[startDate, endDate)`
and must not exceed 366 days.
**Required permission:** `company.policy:read`
# List Event Financial Transactions
Source: https://docs.aiinsurance.io/api-reference/field-model-event-financials/list-event-financial-transactions
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/events/{eventId}/financials/transactions
Returns a paginated list of financial transactions for a specific event.
Default sort is by `invoiceDate` descending (most recent first).
**Required permission:** `company.event:read`
# Create Event
Source: https://docs.aiinsurance.io/api-reference/field-model-events/create-event
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/events
Creates a new Field Model V1 event for the company.
The request body is a flat JSON object where keys are field `referenceId`s
defined in the company's field configuration. Use the
[Get Configuration](/api-reference/field-model/events/overview) endpoint
to discover available fields.
**Required base fields:** `eventType`, `eventCoverageType`, `eventInsureds`
(array of exposure IDs).
**Optional base fields:** `eventStatus` (defaults to `Open`),
`eventReferenceId` (auto-generated if omitted), `policyId` (mapped to the
`eventPolicy` Join field inside `fieldModelV1Data`).
**Date fields** must be submitted as objects: `{ "date": "YYYY-MM-DD", "timezone": "America/New_York" }` — plain date strings are not accepted.
**Required permission:** `company.claim:create` or `company.incident:create`
(determined by `eventType`)
# Delete Event
Source: https://docs.aiinsurance.io/api-reference/field-model-events/delete-event
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/events/{eventId}
Deletes a Field Model V1 event by ID.
The `type` field is required in the request body for permission resolution.
Use `force: true` to bypass financial transaction checks.
**Required permission:** `company.claim:delete` or `company.incident:delete`
(determined by `type`)
# Get Event
Source: https://docs.aiinsurance.io/api-reference/field-model-events/get-event
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/events/{eventId}
Returns a single Field Model V1 event by ID.
**Required permission:** `company.event:export`
# Get Event Configuration
Source: https://docs.aiinsurance.io/api-reference/field-model-events/get-event-configuration
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/events/configuration
Returns a JSON Schema describing the fields available for creating or
updating Field Model V1 events.
The `fields` schema is a standard JSON Schema (draft 2020-12) that can be
used directly with validation libraries like Ajv or Zod. The `required`
array lists fields that must be provided when creating or updating an
event.
**Required permission:** `company.event:export`
# List Events
Source: https://docs.aiinsurance.io/api-reference/field-model-events/list-events
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/events
Returns a paginated list of Field Model V1 events for the company.
**Filtering:**
- `type` - Filter by event type (`claim` or `incident`)
- `status` - Filter by event status (`open` or `closed`)
- `policyId` - Filter by associated policy ID
- `filterText` - Text search across event fields
**Sorting:**
- `createdAt` (default), `updatedAt`, `referenceId`
**Required permission:** `company.event:export`
# Update Event
Source: https://docs.aiinsurance.io/api-reference/field-model-events/update-event
/openapi/generated-external-api.yaml put /api/v1/external/companies/{companyId}/events/{eventId}
Updates a Field Model V1 event. The request body is a flat JSON object
with field `referenceId`s as keys — the same shape as the create request.
**This is a full replacement** of the event's field data, not a merge.
Include all fields you want the event to have after the update.
The `eventType` field is required in the body for permission resolution.
**Required permission:** `claim:update` or `incident:update`
(determined by `eventType`)
# Update Expected Totals
Source: https://docs.aiinsurance.io/api-reference/field-model-events/update-expected-totals
/openapi/generated-external-api.yaml patch /api/v1/external/companies/{companyId}/events/{eventId}/financials/expected-totals
Updates the expected total (reserve) for a transaction category on a Field Model V1 event.
This endpoint is used to set or update reserve amounts for categories that support reserves.
Unlike the legacy expected-totals endpoint, this endpoint resolves the event type from
`fieldModelV1Data.eventType` rather than the internal `type` column. Use this endpoint
for events created via the V1 API.
**Important:** Amounts are in **dollars** (not cents) for this endpoint.
**Required permission:** `claim:update` or `incident:update` (depending on event type)
# Create Exposure
Source: https://docs.aiinsurance.io/api-reference/field-model-exposures/create-exposure
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/exposures
Creates a new Field Model V1 exposure for the company.
The request body is a flat JSON object where keys are field `referenceId`s
defined in the company's field configuration. Use the
[Get Configuration](/api-reference/field-model/exposures/overview) endpoint
to discover available fields.
**Required fields:** `exposureName`, `exposureType` (and any fields marked
required in your company's configuration).
**Required permission:** `company.insured:create`
# Delete Exposure
Source: https://docs.aiinsurance.io/api-reference/field-model-exposures/delete-exposure
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/exposures/{exposureId}
Soft deletes a Field Model V1 exposure by ID.
The exposure will be marked as deleted and will no longer appear in list
operations. Exposures with associated policies, quotes, events, or
transactions cannot be deleted.
**Required permission:** `insured:delete`
# Get Exposure
Source: https://docs.aiinsurance.io/api-reference/field-model-exposures/get-exposure
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/exposures/{exposureId}
Returns a single Field Model V1 exposure by ID.
**Required permission:** `company.insured:read`
# Get Exposure Configuration
Source: https://docs.aiinsurance.io/api-reference/field-model-exposures/get-exposure-configuration
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/exposures/configuration
Returns a JSON Schema describing the fields available for creating or
updating Field Model V1 exposures.
The `fields` schema is a standard JSON Schema (draft 2020-12) that can be
used directly with validation libraries like Ajv or Zod. The `required`
array lists fields that must be provided when creating or updating an
exposure.
**Required permission:** `company.insured:read`
# List Exposures
Source: https://docs.aiinsurance.io/api-reference/field-model-exposures/list-exposures
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/exposures
Returns a paginated list of Field Model V1 exposures for the company.
**Filtering:**
- `id` - Filter by exposure ID (single or array)
- `exposureType` - Filter by exposure type
- `filterText` - Text search across exposure name
**Sorting:**
- `createdAt` (default), `updatedAt`, `exposureName`, `exposureType`
**Required permission:** `company.insured:read`
# Update Exposure
Source: https://docs.aiinsurance.io/api-reference/field-model-exposures/update-exposure
/openapi/generated-external-api.yaml put /api/v1/external/companies/{companyId}/exposures/{exposureId}
Updates a Field Model V1 exposure. The request body is a flat JSON object
with field `referenceId`s as keys — the same shape as the create request.
**This is a full replacement** of the exposure's field data, not a merge.
Include all fields you want the exposure to have after the update.
**Required permission:** `insured:update`
# Get Policies Configuration
Source: https://docs.aiinsurance.io/api-reference/field-model-policies/get-policies-configuration
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/configuration
Returns JSON Schemas describing the custom fields available for
Field Model V1 policies. The response contains separate schemas for
policy-level fields and exposure-level fields.
Each schema is a standard JSON Schema (draft 2020-12) that can be
used directly with validation libraries like Ajv or Zod.
The `policy` schema covers policy-level custom fields (used in
policy `fieldModelV1Data.policy` or segment `policy` objects).
The `exposure` schema covers exposure-level custom fields.
The `policy` schema excludes fields that are system-managed and
not user-input: calculated (Jexl-derived) fields, server-populated
fields (rating responses, billing, Google Drive ids, target rater),
and policy lifecycle fields (`policyStatus`, `policyNumber`).
**Required permission:** `company.policy:read`
# Cancel Policy Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies/{policyId}/transaction/cancel
Cancels a policy as of a given date via a CANCEL transaction. The policy must
be Active at the cancellation date. The action sets `policyStatus` to
`cancelled` from the cancellation date through the end of the policy term and
records a `policyEarlyTerminationDate` on `fullTermPolicyInfo`.
Optional `fullTermDeltas` allow adjusting `fullTermPolicyBilling` fields (e.g.
short-rate penalties, cancellation fees). Only `fullTermPolicyBilling`-prefixed
paths are accepted — per-segment data and policy dates are not modifiable via
cancel. Dates are not accepted on these deltas because they always span the
full policy term; the server injects them.
**Required permission:** `company.policy:update`
# Delete Policy Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/delete-policy-transaction
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/policies/{policyId}/transactions/{transactionId}
Deletes the most recent transaction on a policy, rolling the policy back to
its prior version. Only the most recent transaction (highest `policyVersion`)
can be deleted — attempting to delete an older transaction returns a 400 error.
After deletion, the policy state reverts to what it was before the deleted
transaction was applied. If the only transaction (NEW_BUSINESS) is deleted,
the policy has no remaining transactions.
**Required permission:** `policy:delete`
# Endorse Policy Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies/{policyId}/transaction/endorse
Applies an ENDORSE transaction to an existing policy. Endorsements modify
policy state over specified date ranges using per-field deltas. Each delta
targets a specific path within the policy data (e.g. `policy.annualPremium`,
`policy.exposures`) and can Add, Remove, or Overwrite values.
Deltas come in two flavors:
- **`deltas`** — segmented deltas for per-segment fields. Each delta
specifies a `startDate` / `endDate` within the policy term.
- **`fullTermDeltas`** — deltas for cross-segment invariant fields
(`fullTermPolicyBilling`, `fullTermPolicyInfo`, `fullTermPolicyRatingResponse`,
`fullTermExposureRatingResponse`). These are applied uniformly across
the entire policy term, so no dates are accepted — the server injects
`policyStartDate` → `policyEndDate` automatically.
Mixing the two is a validation error: `fullTerm*` paths in `deltas` are
rejected, and non-`fullTerm*` paths in `fullTermDeltas` are rejected. At
least one of the two arrays must be non-empty.
The engine recomputes segments after applying all deltas — adjacent
segments with identical data are automatically merged. The response
includes the full set of resulting segments.
**Required permission:** `company.policy:update`
# Get Policy Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/get-policy-transaction
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}/transactions/{transactionId}
Returns a single policy transaction by ID, including its per-field deltas.
Each delta describes a specific field change (add, remove, or overwrite) within
a date range.
Use this endpoint to inspect exactly what changed in a given transaction.
**Required permission:** `company.policy:read`
# Get Policy Version
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/get-policy-version
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}/versions/{version}
Returns a specific version of a policy with all its derived segments.
Each segment contains the full policy state (policy-level fields and nested exposures)
for a contiguous date range. The `fullTermPolicyInfo` and `fullTermPolicyBilling`
fields are extracted from the segments for convenience — these are full-term invariant
fields that are identical across all segments in a version.
**Required permission:** `company.policy:read`
# List Policies
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/list-policies
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/list
Returns a paginated list of policies, resolving each policy to its latest version
(or the latest version as of `timeTravelBackToDate`), then applying segment scope
filters and field-level JSONB filters.
**Example questions this endpoint answers:**
- "Show me all current policies" — `segmentScope="all"`, no filters
- "Current policies providing coverage on March 15" — `segmentScope={"asOf":"2025-03-15"}`
- "Current policies providing coverage during Q1" — `segmentScope={"fromDate":"2025-01-01","toDate":"2025-03-31"}`
- "What did the book of business look like on Jan 1?" — `timeTravelBackToDate=2025-01-01`, `segmentScope="all"`
Use `segmentScope` to control which segments within each policy version participate
in filtering:
- `"all"` — every segment of the resolved version
- `{"asOf":"2025-03-15"}` — point-in-time: segments where `startDate <= asOf <= endDate`
- `{"fromDate":"2025-01-01","toDate":"2025-12-31"}` — date range: segments overlapping the window
Use `timeTravelBackToDate` to see what the book of business looked like at a prior point
in time. Each policy is resolved to the version that was latest at that timestamp.
Use `detail=full` to include complete field data for the scope-matched segments in each
result. Use `detail=summary` for lightweight responses with only matched segment date ranges.
**Required permission:** `company.policy:read`
# List Policy Transactions
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/list-policy-transactions
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}/transactions
Returns a paginated list of all transactions for a policy, ordered by
`policyVersion`. Each transaction represents an immutable change set
(new business, endorsement, cancellation, reinstatement, or renewal).
Use this endpoint to see the full transaction history of a policy.
For detailed per-field deltas, retrieve a single transaction via the
Get Policy Transaction endpoint.
**Related:** The Bordereau APIs provide a similar transaction-level view
across all policies, with the ability to include additional columns for
full-term policy fields. Use this endpoint when you need per-field deltas
for a single policy; use the Bordereau APIs when you need a flat,
reportable listing across policies.
**Required permission:** `company.policy:read`
# List Policy Versions
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/list-policy-versions
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/versions
Lists policy versions across all policies. Unlike "List Policies" (which resolves
each policy to one version), this endpoint returns every `(policy, version)` pair
that matches the filters. A single policy can appear multiple times if multiple
versions match.
**Example questions this endpoint answers:**
- "Find all policy versions where premium exceeded $100k" — `segmentScope="all"`, `filters` on premium field
- "Which policy versions provided coverage on June 15?" — `segmentScope={"asOf":"2025-06-15"}`
- "Find policies that ever matched a specific coverage type on a given date" — `segmentScope={"asOf":"..."}`, `filters` on coverage field
Query parameters (`detail`, `segmentScope`, `filters`, pagination, sorting) work
identically to the List Policies endpoint except that `timeTravelBackToDate` is
not available — all versions are listed.
**Required permission:** `company.policy:read`
# List Single Policy Versions
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/list-single-policy-versions
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}/versions
Returns a paginated list of all versions for a single policy. Each version is a
snapshot of the policy state produced by a transaction. Use this to see how a policy
changed over time, or to find versions that match specific field criteria.
**Example questions this endpoint answers:**
- "Show me all versions of policy ABC" — `segmentScope="all"`, no filters
- "Which versions of policy ABC had premium above $50k?" — `segmentScope="all"`, `filters` on premium field
- "Which versions of policy ABC provided coverage on March 15?" — `segmentScope={"asOf":"2025-03-15"}`
Query parameters (`detail`, `segmentScope`, `filters`, pagination, sorting) work
identically to the List Policy Versions endpoint, scoped to a single policy.
**Required permission:** `company.policy:read`
# New Business Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/new-business-transaction
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies/transaction/new-business
Creates a new policy via a NEW_BUSINESS transaction. This is the entry point for the
transaction-based policy lifecycle. The transaction produces a single segment covering
the full policy term.
The request body contains the policy term dates and the initial policy state, including
policy-level fields, full-term aggregates, and nested exposures. Exposures must reference
existing exposure records by ID.
**Required permission:** `company.policy:create`
# Reinstate Policy Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/reinstate-policy-transaction
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies/{policyId}/transaction/reinstate
Reinstates a previously cancelled policy as of a given date via a REINSTATE
transaction. The policy must be Cancelled at the reinstatement date. The action
sets `policyStatus` back to `active` from the reinstatement date through the
end of the policy term and clears the `policyEarlyTerminationDate` on
`fullTermPolicyInfo`.
Optional `fullTermDeltas` allow adjusting `fullTermPolicyBilling` fields (e.g.
reinstatement fees). Only `fullTermPolicyBilling`-prefixed paths are accepted —
per-segment data and policy dates are not modifiable via reinstate. Dates are
not accepted on these deltas because they always span the full policy term;
the server injects them.
**Required permission:** `company.policy:update`
# Renew Policy Transaction
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-transactions/renew-policy-transaction
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/policies/transaction/renew
Creates a new policy via a RENEW transaction, linking it to a previous policy.
The new policy term must start on or after the previous policy's end date.
The request body follows the same structure as NEW_BUSINESS — it contains the
new policy term dates and the full initial policy state, including policy-level
fields, full-term aggregates, and nested exposures. The transaction produces a
new policy record with a single segment covering the full renewal term.
**Required permission:** `company.policy:create`
# Validate Policies (Batch)
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-validation/validate-policies-batch
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/validate
Runs data consistency checks against multiple policies in a single
request and returns paginated results. This is a read-only
diagnostic endpoint — no data is modified.
Three modes control which policies are validated (mutually
exclusive):
1. **Explicit pairs** (`policyVersions`) — validate specific
policy/version combinations. Pagination parameters are ignored.
2. **Time travel** (`timeTravelBackToDate`) — validate the latest
version of each policy as of a historical point in time.
Paginated via `limit`/`offset`.
3. **Default** (neither parameter) — validate the latest version of
all policies in the company. Paginated via `limit`/`offset`.
The same eight checks from the single-policy validation endpoint
are available. Use the `checks` parameter to select a subset.
### Available checks
| Check | Scope | What it validates |
|-------|-------|-------------------|
| `contiguity` | version | Segments form a contiguous date range with no gaps or overlaps |
| `fullTermInvariance` | version | Billing and policy metadata fields are constant across all segments in a version |
| `hashCorrectness` | version | Stored segment hash matches the computed hash of the segment data |
| `noDuplicateSegments` | version | No adjacent segments have identical hashes |
| `transactionSegmentExistence` | version | At least one segment exists for the version |
| `versionSequentiality` | policy | Versions are sequential starting from 1 with no gaps |
| `cancelEarnedPremium` | policy | Cancel transaction premium matches earned premium through the cancellation date |
| `cancelReinstatePremium` | policy | Reinstate transaction premium matches the pre-cancel version premium |
**Required permission:** `company.policy:read`
# Validate Policy
Source: https://docs.aiinsurance.io/api-reference/field-model-policy-validation/validate-policy
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/policies/{policyId}/validate
Runs data consistency checks against a single policy and returns
detailed results. This is a read-only diagnostic endpoint — no data
is modified.
Eight checks are available, covering segment contiguity, hash
correctness, version sequentiality, full-term invariance, duplicate
detection, transaction-segment existence, and cancel/reinstate
premium consistency. By default all checks run; use the `checks`
parameter to select a subset.
Checks are either **version-scoped** (run once per policy version)
or **policy-scoped** (run once for the whole policy). A policy with
3 versions and all 8 checks enabled produces up to 18 results
(5 version-scoped checks x 3 versions + 3 policy-scoped checks).
Use the `version` parameter to validate a single version instead of
all versions.
### Available checks
| Check | Scope | What it validates |
|-------|-------|-------------------|
| `contiguity` | version | Segments form a contiguous date range with no gaps or overlaps |
| `fullTermInvariance` | version | Billing and policy metadata fields are constant across all segments in a version |
| `hashCorrectness` | version | Stored segment hash matches the computed hash of the segment data |
| `noDuplicateSegments` | version | No adjacent segments have identical hashes |
| `transactionSegmentExistence` | version | At least one segment exists for the version |
| `versionSequentiality` | policy | Versions are sequential starting from 1 with no gaps |
| `cancelEarnedPremium` | policy | Cancel transaction premium matches earned premium through the cancellation date |
| `cancelReinstatePremium` | policy | Reinstate transaction premium matches the pre-cancel version premium |
**Required permission:** `company.policy:read`
# Create Quote
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/create-quote
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/quotes
Creates a new Field Model V1 quote.
The `quote` and `exposures` fields contain custom field data where keys
are field `referenceId`s defined in the company's field configuration.
Use the [Configuration endpoint](/api-reference/field-model-quotes/get-quotes-configuration)
to discover available fields.
**Required fields in `quote`:** `policyStartDate`, `policyEndDate`,
`policyType`, `policyTimeZone`. Fields like `policyNumber` and
`policyEffectiveDate` are not required.
**Lifecycle fields** (`quoteType`, `quoteStatus`, `quoteNumber`,
`quoteBindErrors`, `quoteSubmissionId`) are system-managed and will be
rejected with a 400 error if included in the request.
**Required permission:** `company.quote:create`
# Delete Quote
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/delete-quote
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/quotes/{quoteId}
Soft-deletes a Field Model V1 quote.
**Required permission:** `company.quote:delete`
# Get Quote
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/get-quote
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/quotes/{quoteId}
Returns a single Field Model V1 quote by ID, including custom field
data and exposures.
**Required permission:** `company.quote:read`
# Get Quotes Configuration
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/get-quotes-configuration
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/quotes/configuration
Returns JSON Schemas describing the custom fields available for
Field Model V1 quotes. The response contains separate schemas for
quote-level fields and exposure-level fields.
Each schema is a standard JSON Schema (draft 2020-12) that can be
used directly with validation libraries like Ajv or Zod.
The `quote` schema covers fields used in the quote's `data` object.
It excludes calculated fields, policy-only fields (policyNumber,
policyStatus, policyCancelDate, etc.), server-populated fields
(rating responses, google drive fields, etc.), and lifecycle fields.
The `exposure` schema covers fields used in the `exposures[]` array.
**Lifecycle fields** (`quoteType`, `quoteStatus`, `quoteNumber`,
`quoteBindErrors`, `quoteSubmissionId`) are omitted from the
configuration since they are system-managed.
**Required permission:** `company.quote:read`
# List Quotes
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/list-quotes
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/quotes
Returns a paginated list of Field Model V1 quotes for the company.
**Filtering:**
- `submissionId` — Filter by submission ID
**Sorting:**
- `createdAt` (default), `updatedAt`
**Required permission:** `company.quote:read`
# Send Quote
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/send-quote
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/quotes/{quoteId}/send
Sends a Field Model V1 quote, transitioning its status to "sent".
**Required permission:** `company.quote:update`
# Update Quote
Source: https://docs.aiinsurance.io/api-reference/field-model-quotes/update-quote
/openapi/generated-external-api.yaml put /api/v1/external/companies/{companyId}/quotes/{quoteId}
Updates a Field Model V1 quote. This is a **full replacement** of the
quote's custom field data and exposures.
The `quote` object is merged with existing lifecycle fields (the system
preserves `quoteType`, `quoteStatus`, `quoteNumber`, `quoteBindErrors`,
`quoteSubmissionId`). The `exposures` array fully replaces the existing
exposures.
**Lifecycle fields** are rejected with a 400 error if included in the
request body.
**Required permission:** `company.quote:update`
# Create Submission
Source: https://docs.aiinsurance.io/api-reference/field-model-submissions/create-submission
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/submissions
Creates a new Field Model V1 submission.
The request body is a flat JSON object where keys are field
`referenceId`s defined in the company's field configuration.
Use the [Configuration endpoint](/api-reference/field-model/submissions/overview)
to discover available fields.
**Required field:** `submissionType` must be provided.
**Lifecycle fields** (`submissionStatus`, `submissionNumber`,
`submissionName`, `submissionPrimaryInsured`, `submissionBoundDate`,
`submissionQuotes`) are system-managed. `submissionStatus` defaults
to `inProgress` if not provided.
**Required permission:** `company.submission:create`
# Delete Submission
Source: https://docs.aiinsurance.io/api-reference/field-model-submissions/delete-submission
/openapi/generated-external-api.yaml delete /api/v1/external/companies/{companyId}/submissions/{submissionId}
Soft-deletes a Field Model V1 submission.
**Required permission:** `company.quote:delete`
> Note: Uses `company.quote:delete` because `company.submission:delete`
> does not exist yet.
# Get Submission
Source: https://docs.aiinsurance.io/api-reference/field-model-submissions/get-submission
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/submissions/{submissionId}
Returns a single Field Model V1 submission by ID, including custom
field data.
**Required permission:** `company.submission:read`
# Get Submissions Configuration
Source: https://docs.aiinsurance.io/api-reference/field-model-submissions/get-submissions-configuration
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/submissions/configuration
Returns a JSON Schema describing the custom fields available for
Field Model V1 submissions. The schema can be used directly with
validation libraries like Ajv or Zod.
The schema excludes calculated fields, server-populated fields,
and lifecycle fields (`submissionStatus`, `submissionType`,
`submissionNumber`, `submissionName`, `submissionPrimaryInsured`,
`submissionBoundDate`, `submissionQuotes`).
**Required permission:** `company.submission:read`
# List Submissions
Source: https://docs.aiinsurance.io/api-reference/field-model-submissions/list-submissions
/openapi/generated-external-api.yaml get /api/v1/external/companies/{companyId}/submissions
Returns a paginated list of Field Model V1 submissions for the company.
**Filtering:**
- `submissionType` — Filter by submission type (single value or comma-separated)
- `submissionStatus` — Filter by submission status (single value or comma-separated)
- `filterText` — Text search across submission fields
**Sorting:**
- `createdAt` (default), `updatedAt`, `submissionNumber`, `submissionName`,
`submissionStatus`, `submissionType`
**Required permission:** `company.submission:read`
# Update Submission
Source: https://docs.aiinsurance.io/api-reference/field-model-submissions/update-submission
/openapi/generated-external-api.yaml put /api/v1/external/companies/{companyId}/submissions/{submissionId}
Updates a Field Model V1 submission. The request body is a flat JSON
object where keys are field `referenceId`s. Fields not included in the
request are preserved — this is a **merge**, not a full replacement.
**Lifecycle fields** (`submissionStatus`, `submissionNumber`,
`submissionName`, `submissionPrimaryInsured`, `submissionBoundDate`,
`submissionQuotes`) are system-managed and will be rejected with a
400 error if included in the request body.
**Required permission:** `company.quote:update`
> Note: Uses `company.quote:update` because `company.submission:update`
> does not exist yet.
# Compare Configuration
Source: https://docs.aiinsurance.io/api-reference/fmv1-configuration/compare-configuration
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/configuration/compare
Compares an FMV1 configuration spreadsheet against the current database state and returns
a diff summary. Each configuration category (field definitions, option sets, custom objects,
etc.) includes counts of additions, updates, deletes, and unchanged items.
Use this to preview what an import would change before applying it.
The caller must provide their own Google OAuth2 access token with read permission on the
target spreadsheet.
**Required permission:** `company.configuration:export`
This endpoint requires an API key created with the **FMV1_CONFIGURATION_MANAGER** role.
See [Authentication](/api-reference/authentication) for how to create API keys with specific roles.
# Export Configuration
Source: https://docs.aiinsurance.io/api-reference/fmv1-configuration/export-configuration
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/configuration/export
Exports the company's FMV1 configuration to an existing Google Spreadsheet. The spreadsheet
is overwritten with the current configuration including field definitions, option sets,
custom objects, card definitions, card sections, and field locations.
The caller must provide their own Google OAuth2 access token with edit permission on the
target spreadsheet.
**Required permission:** `company.configuration:export`
This endpoint requires an API key created with the **FMV1_CONFIGURATION_MANAGER** role.
See [Authentication](/api-reference/authentication) for how to create API keys with specific roles.
# Generate Configuration Spreadsheet
Source: https://docs.aiinsurance.io/api-reference/fmv1-configuration/generate-configuration-spreadsheet
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/configuration/generate
Creates a new Google Spreadsheet with the FMV1 configuration template structure.
The spreadsheet contains all the required sheets, headers, and formatting but no
data — it is a blank template ready to be filled in.
The spreadsheet is created in the caller's Google Drive.
**Required permission:** `company.configuration:export`
This endpoint requires an API key created with the **FMV1_CONFIGURATION_MANAGER** role.
See [Authentication](/api-reference/authentication) for how to create API keys with specific roles.
# Import Configuration
Source: https://docs.aiinsurance.io/api-reference/fmv1-configuration/import-configuration
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/configuration/import
Imports FMV1 configuration from a Google Spreadsheet into the database. This runs the
full pipeline: validate, parse, compare, and apply changes.
If validation fails, no changes are applied and the response returns `success: false`
with a `message` describing the failure.
The caller must provide their own Google OAuth2 access token with read permission on the
target spreadsheet.
**Required permission:** `company.configuration:import`
This endpoint modifies the company's FMV1 configuration. Changes take effect immediately
and affect all users of the company. Use the **compare** endpoint first to preview changes.
This endpoint requires an API key created with the **FMV1_CONFIGURATION_MANAGER** role.
See [Authentication](/api-reference/authentication) for how to create API keys with specific roles.
# Validate Configuration Spreadsheet
Source: https://docs.aiinsurance.io/api-reference/fmv1-configuration/validate-configuration-spreadsheet
/openapi/generated-external-api.yaml post /api/v1/external/companies/{companyId}/configuration/validate
Validates the structure and data of an FMV1 configuration spreadsheet without applying
any changes. Use this to check for errors before running an import.
Returns a list of validation errors with details about the sheet, column, and row
where each issue was found.
The caller must provide their own Google OAuth2 access token with read permission on the
target spreadsheet.
**Required permission:** `company.configuration:export`
This endpoint requires an API key created with the **FMV1_CONFIGURATION_MANAGER** role.
See [Authentication](/api-reference/authentication) for how to create API keys with specific roles.
# Create Lawsuit
Source: https://docs.aiinsurance.io/api-reference/lawsuits/create-lawsuit
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/events/{eventId}/lawsuit
Creates a lawsuit for an event. Each event can have at most one lawsuit.
Returns 409 Conflict if a lawsuit already exists for the event.
**Required permission:** `company.event:export`
# Delete Lawsuit
Source: https://docs.aiinsurance.io/api-reference/lawsuits/delete-lawsuit
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/events/{eventId}/lawsuit
Soft-deletes the lawsuit for an event. The lawsuit will no longer be returned by GET requests.
**Required permission:** `company.event:export`
# Get Lawsuit
Source: https://docs.aiinsurance.io/api-reference/lawsuits/get-lawsuit
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/events/{eventId}/lawsuit
Returns the lawsuit associated with an event. Each event has at most one lawsuit.
**Required permission:** `company.event:export`
# Update Lawsuit
Source: https://docs.aiinsurance.io/api-reference/lawsuits/update-lawsuit
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/events/{eventId}/lawsuit
Updates the lawsuit for an event. Only provided fields are updated.
Send `null` for a field to clear its value. Omit a field to preserve its existing value.
**Required permission:** `company.event:export`
# Create Note
Source: https://docs.aiinsurance.io/api-reference/notes/create-note
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/{entityType}/{entityId}/notes
Creates a new note attached to an event, policy, or insured.
**Required permission:** Permission depends on entity type:
- `events` → `claim.notes:update`
- `policies` → `policy.notes:update`
- `insureds` → `insured.notes:update`
**Privileged notes:** If `isPrivileged` is true, the API key must also have `privileged_notes:read` permission.
# Delete Note
Source: https://docs.aiinsurance.io/api-reference/notes/delete-note
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/{entityType}/{entityId}/notes/{noteId}
Soft deletes a note by setting deletedAt and deletedBy timestamps.
The note will no longer be returned in list or get operations.
**Required permission:** Permission depends on entity type:
- `events` → `claim.notes:update`
- `policies` → `policy.notes:update`
- `insureds` → `insured.notes:update`
# Get Note
Source: https://docs.aiinsurance.io/api-reference/notes/get-note
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/{entityType}/{entityId}/notes/{noteId}
Returns a single note by ID.
**Required permission:** Permission depends on entity type:
- `events` → `claim.notes:read`
- `policies` → `policy.notes:read`
- `insureds` → `insured.notes:read`
**Privileged notes:** If the note is privileged, the API key must have `privileged_notes:read` permission to view it.
# List Notes
Source: https://docs.aiinsurance.io/api-reference/notes/list-notes
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/{entityType}/{entityId}/notes
Returns a paginated list of notes for a specific entity.
**Required permission:** Permission depends on entity type:
- `events` → `claim.notes:read`
- `policies` → `policy.notes:read`
- `insureds` → `insured.notes:read`
**Privileged notes:** Notes marked as privileged are automatically filtered out unless the API key has `privileged_notes:read` permission.
# Create Payee
Source: https://docs.aiinsurance.io/api-reference/payees/create-payee
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/payees
Creates a new payee.
**Required fields:**
- `name` - Payee name
- `payeeType` - Type of payee (lawFirm, expert, vendor, other, financingCompany)
**Optional fields:**
- `email` - Primary email address
- `alternateEmails` - Additional email addresses
- `phoneNumber` - Phone number
- `description` - Description of the payee
- `address` - Unstructured address string
- `addressStructured` - Structured address object
- `lawFirmType` - Type of law firm (defense, plaintiff) - only for lawFirm payeeType
- `bankInfo` - Bank account information
- `taxIdNumber` - Tax identification number
**Required permission:** `company.payee:create`
# Delete Payee
Source: https://docs.aiinsurance.io/api-reference/payees/delete-payee
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/payees/{payeeId}
Soft deletes a payee by setting deletedAt and deletedBy timestamps.
The payee will no longer be returned in list or get operations.
Deletion is blocked if the payee has associated transactions.
**Required permission:** `company.payee:create`
# Get Payee
Source: https://docs.aiinsurance.io/api-reference/payees/get-payee
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/payees/{payeeId}
Returns a single payee by ID.
Returns 404 if the payee is not found, soft-deleted, or unsaved (isSaved: false).
**Required permission:** `company.payee:read`
# List Payees
Source: https://docs.aiinsurance.io/api-reference/payees/list-payees
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/payees
Returns a paginated list of payees for the company.
Payees are entities that receive payments, such as law firms, experts, vendors, etc.
Filter by payee type, ID, or search text, and sort by various fields.
Only returns saved payees (isSaved: true).
**Required permission:** `company.payee:read`
# Update Payee
Source: https://docs.aiinsurance.io/api-reference/payees/update-payee
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/payees/{payeeId}
Updates an existing payee. Only send fields you want to change.
**Optional update fields:**
- `name` - Update payee name
- `payeeType` - Update payee type
- `email` - Update email address (send null to clear)
- `alternateEmails` - Update alternate emails
- `phoneNumber` - Update phone number
- `description` - Update description
- `address` - Update unstructured address
- `addressStructured` - Update structured address
- `lawFirmType` - Update law firm type
- `bankInfo` - Update bank information
- `taxIdNumber` - Update tax ID number
- `externalPayee` - Update external payee reference
- `createdAt` - Update creation timestamp (for imports)
**Required permission:** `company.payee:create`
# Create Policy
Source: https://docs.aiinsurance.io/api-reference/policies/create-policy
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/policies
Creates a new policy directly, primarily for historical imports where policies
need to be created without going through the quote→bind wizard flow.
**Workflow:**
1. Create insureds first via `POST /insureds`
2. Create the policy with insured references via this endpoint
3. The endpoint creates insured snapshots with the provided ratingInfo
**Required fields:**
- `referenceId` - Policy number (must be unique)
- `startsAtDate`, `endsAtDate` - Coverage dates
- `type` - Policy type (C, N, T, O, P, S, Q, R, A)
- `billingPeriod` - Billing frequency
- `exposures` - At least one exposure with exactly one having `role: "primary"`
- `coverages` - At least one coverage with valid `coverageTypeId`
**Required permission:** `company.policy:create`
# Delete Policy
Source: https://docs.aiinsurance.io/api-reference/policies/delete-policy
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/policies/{policyId}
Soft deletes a policy by setting deletedAt and deletedBy timestamps.
The policy will no longer be returned in list operations.
**Important:** Policies with associated events (claims/incidents) cannot be deleted.
You must delete all events first before deleting the policy.
**Required permission:** `policy:delete`
# Get Policy
Source: https://docs.aiinsurance.io/api-reference/policies/get-policy
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/policies/{policyId}
Retrieves detailed information about a specific policy, including its segments,
coverages, exposures, and rating inputs.
**Segments:**
Policies are divided into segments when exposures are added, removed, or modified
mid-term. Each segment represents a period where policy data is constant, with
non-overlapping date ranges covering the full policy term.
**Time Travel (asOf parameter):**
Use the `asOf` query parameter to retrieve the policy state as it existed at a
specific point in time. This is useful for auditing, reporting, or understanding
how the policy looked before endorsements or modifications.
**Required permission:** `company.policy:read`
# List Policies
Source: https://docs.aiinsurance.io/api-reference/policies/list-policies
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/policies
Returns a paginated list of policies for the company.
**Filtering:**
- `primaryInsuredId` - Filter by primary insured ID
- `filterText` - Text search across policy number and other fields
**Sorting:**
- `createdAt` (default), `updatedAt`, `number`, `startsAtDate`, `endsAtDate`
**Required permission:** `company.policy:read`
# List Policy Transactions
Source: https://docs.aiinsurance.io/api-reference/policies/list-policy-transactions
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/policies/{policyId}/transactions
Returns a paginated list of policy transactions (change sets) for a specific policy.
Transactions represent the activity log/audit trail of changes made to the policy,
including binds, endorsements, cancellations, reinstatements, and renewals.
**Filtering:**
- `type` - Filter by transaction type (bind, endorsement, cancellation, reinstatement, renewal)
**Sorting:**
- `processedAt` (default), `effectiveDate`, `type`
**Required permission:** `company.policy:read`
# Create Quote
Source: https://docs.aiinsurance.io/api-reference/quotes/create-quote
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/quotes
Creates a new quote for an existing submission.
Only `submissionId` is required - all other fields are optional.
The quote will be initialized with default values based on the submission type
(new_business, renewal, endorsement, cancellation, or reinstatement).
**Note:** The `applicant` field is not supported for external API. The concept
of "applicant" (human who initiated an insurance application) doesn't apply to
programmatic API calls. Use `recipients` to track who should receive the quote.
**Required permission:** `company.quote:create`
# Delete Quote
Source: https://docs.aiinsurance.io/api-reference/quotes/delete-quote
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/quotes/{quoteId}
Soft deletes a quote by setting deletedAt and deletedBy timestamps.
The quote will no longer be returned in list or get operations.
**Required permission:** `company.quote:delete`
# Get Quote
Source: https://docs.aiinsurance.io/api-reference/quotes/get-quote
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/quotes/{quoteId}
Returns a single quote with all details.
**Required permission:** `company.quote:read`
# Get Quotes Configuration
Source: https://docs.aiinsurance.io/api-reference/quotes/get-quotes-configuration
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/quotes/configuration
Returns a JSON Schema describing the custom fields available for the
`policyInfo.data` object when creating or updating quotes.
The response is a standard JSON Schema (draft 2020-12) that can be used
directly with validation libraries like Ajv or Zod. This enables clients
to validate quote data before submission, reducing API errors.
**Required permission:** `company.quote:read`
# List Quote Info
Source: https://docs.aiinsurance.io/api-reference/quotes/list-quote-info
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/quotes-info
Returns lightweight quote information with essential fields only.
Faster response than List Quotes - ideal for dashboards and lists.
**Required permission:** `company.quote:read`
# List Quotes
Source: https://docs.aiinsurance.io/api-reference/quotes/list-quotes
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/quotes
Returns complete Quote objects with all data fields, including nested quote data,
preview data, coverages, and billing information.
For lightweight quote information (faster response), use List Quote Info instead.
**Required permission:** `company.quote:read`
# Create Smart Tag
Source: https://docs.aiinsurance.io/api-reference/smart-tags/create-smart-tag
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/smart-tags
Creates a new smart tag for the company.
**Required fields:**
- `tagName` - Tag identifier (must match pattern /^AII[A-Za-z0-9]+$/)
- `tagDisplayName` - Display name for the tag
- `tagCategories` - Array of categories (e.g., ['quote', 'policy'])
**Optional fields:**
- `tagDescription` - Description of what the tag does
- `tagData` - Custom smart tag configuration (see below)
**Custom Smart Tag Types:**
When creating a custom smart tag, specify the `type` field in `tagData`. Available types include:
*Coverage & Premium Types:*
- `coveragePremium` - Coverage premium amount
- `coveragePremiumTax` - Coverage premium tax
- `coveragePremiumPlusTax` - Coverage premium plus tax
- `specificCoverageProperty` - Specific coverage property
- `specificCoverageLimit` - Specific coverage limit
*Policy Types:*
- `policy` - Policy-level data
- `policyLevelRatingOutput` - Policy-level rating outputs
- `policyList` - List of policies
- `policyTable` - Policy data table
- `firstPolicyCoverage` - First policy coverage
- `firstPolicyLimit` - First policy limit
*Insured Types:*
- `insuredsSchedule` - Schedule of insureds
- `selectedInsured` - Selected insured data
- `primaryInsured` - Primary insured information
- `primaryInsuredCoverageRatingOutput` - Primary insured coverage rating output
- `primaryInsuredCoverageRatingOutputTable` - Primary insured coverage rating output table
- `insuredCoverageRatingOutputsTable` - Insured coverage ratings outputs table
- `summedInsuredCoverageRatings` - Summed insured coverage ratings
- `insuredClaimsTable` - Insured claims table
*Other Types:*
- `dynamic` - Dynamic field lookup (most flexible for custom fields)
- `staticTable` - Static table data
- `stateSpecificDisclosures` - State-specific disclosure text
- `eventFinancialAmount` - Event financial amount
**Allowed tagData fields:**
- `type` - Smart tag type (required if using custom smart tags)
- `fieldId` - Field identifier
- `fieldKey` - Field key
- `fieldLabel` - Field label
- `fieldSection` - Field section
- `entityType` - Entity type
- `outputLabel` - Output label
- `coverageKey` - Coverage key
- `filters` - Filter conditions (array)
- `columns` - Column definitions (array)
**Required permission:** `company:update`
# List Smart Tags
Source: https://docs.aiinsurance.io/api-reference/smart-tags/list-smart-tags
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/smart-tags
Returns a paginated list of smart tags for the company.
**Filtering:**
- `id` - Filter by smart tag ID (single or array)
- `filterText` - Text search across tag name
**Sorting:**
- `createdAt` (default), `updatedAt`, `tagName`, `tagDisplayName`
**Required permission:** `company:read`
# Add Submission Loss History Entries
Source: https://docs.aiinsurance.io/api-reference/submissions/add-submission-loss-history-entries
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/submissions/{submissionId}/loss-history
Appends loss history entries to a submission without replacing
existing ones. The new entries are added after any previously
stored entries.
For FMV1-enabled companies, adding entries automatically
recomputes computed loss history aggregation fields on all quotes
attached to the submission.
The request must contain at least one entry — an empty array
is rejected with a 400 error. Unknown fields are also rejected.
**Required permission:** `submission:update`
# Attach Files to Submission
Source: https://docs.aiinsurance.io/api-reference/submissions/attach-files-to-submission
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/submissions/{submissionId}/files
Attaches one or more files to an existing submission. The files
appear in the submission's Files tab and are downloadable from
there.
The request body must be `multipart/form-data` with each file in a
part named `file`. Repeat the same field name for multiple files.
**Constraints:**
- At least one file is required.
- All files must be submitted in a single request. Files are not
partially attached on validation failure — either every file lands or
none do.
**Required permission:** `submission.file:create`
# Create Submission
Source: https://docs.aiinsurance.io/api-reference/submissions/create-submission
/openapi/generated-external-api.yaml post /api/external/companies/{companyId}/submissions
Creates a new submission.
Submissions are containers for quotes. Create a submission first, then add quotes via the Quotes API.
**Required fields:**
- `type` - Submission type (quote, renewal, endorsement, cancellation, reinstatement)
**Optional fields:**
- `renewingPolicyId` - Policy ID being renewed (for renewal submissions)
**Note:** Use `quote` as the type for new business submissions.
**Required permission:** `company.submission:create`
# Delete Submission
Source: https://docs.aiinsurance.io/api-reference/submissions/delete-submission
/openapi/generated-external-api.yaml delete /api/external/companies/{companyId}/submissions/{submissionId}
Soft deletes a submission by setting deletedAt and deletedBy timestamps.
The submission will no longer be returned in list or get operations.
**Important:** Submissions with associated quotes cannot be deleted.
You must delete all quotes first before deleting the submission.
**Required permission:** `company.submission:delete`
# Get Submission
Source: https://docs.aiinsurance.io/api-reference/submissions/get-submission
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/submissions/{submissionId}
Returns a single submission by ID.
By default, returns `quoteIds` as an array of quote IDs.
Use `expand=quotes` to include full quote details.
**Required permission:** `company.submission:read`
# Get Submission Loss History
Source: https://docs.aiinsurance.io/api-reference/submissions/get-submission-loss-history
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/submissions/{submissionId}/loss-history
Returns the loss history entries stored on a submission.
When no loss history has been set, returns an empty array.
**Required permission:** `company.submission:read`
# List Submissions
Source: https://docs.aiinsurance.io/api-reference/submissions/list-submissions
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/submissions
Returns a paginated list of submissions for the company.
Filter by status, type, or search text.
**Required permission:** `company.submission:read`
# Set Submission Loss History
Source: https://docs.aiinsurance.io/api-reference/submissions/set-submission-loss-history
/openapi/generated-external-api.yaml put /api/external/companies/{companyId}/submissions/{submissionId}/loss-history
Replaces the entire loss history on a submission. The request body
contains an array of loss history entries — any previously stored
entries are overwritten. Unknown fields are rejected with a 400 error.
For FMV1-enabled companies, setting loss history automatically
recomputes computed loss history aggregation fields on all quotes
attached to the submission.
**Required permission:** `submission:update`
# Update Submission
Source: https://docs.aiinsurance.io/api-reference/submissions/update-submission
/openapi/generated-external-api.yaml patch /api/external/companies/{companyId}/submissions/{submissionId}
Updates an existing submission. Only send fields you want to change (PATCH semantics).
**Optional update fields:**
- `name` - Update submission name (send null to clear)
- `status` - Update submission status
- `type` - Update submission type
- `renewingPolicyId` - Update renewing policy (send null to clear)
- `declineReason` - Update decline reason (send null to clear)
**Note:** The `renewingPolicyId` must reference an existing, non-deleted policy.
**Required permission:** `company.submission:update`
# List Transaction Categories
Source: https://docs.aiinsurance.io/api-reference/transaction-categories/list-transaction-categories
/openapi/generated-external-api.yaml get /api/external/companies/{companyId}/transaction-categories
Returns a list of transaction categories available for the company.
Transaction categories define the types of financial transactions that can be
created, such as indemnity payments, defense costs, expert fees, etc.
Each category includes:
- **Direction**: Whether it's Payable (company pays out) or Receivable (company receives)
- **Scopes**: Where the category can be used (policy or event level) and which payee types
- **Line items**: Sub-categories for itemized transactions
- **Reserves support**: Whether the category supports reserve amounts
Returns company-specific custom categories if configured, otherwise returns
the built-in default categories.
**Required permission:** `company:read`
# Resolve Address
Source: https://docs.aiinsurance.io/api-v1-reference/address-tools/resolve-address
Geocode a freeform address string into the FMV1 Address object-primitive shape — including county.
`GET /api/external/companies/{companyId}/resolve-address?address=`
Pre-flight utility for FMV1 integrators. Geocodes a freeform address string and returns the structured sub-fields (`street`, `city`, `state`, `county`, `country`, `zipCode`) in the shape FMV1 rating expects. Most often used to derive `county` when upstream data does not include it.
The endpoint is **read-only** — writes are not enriched automatically. Call this before constructing your create/update payload.
***
## Why this exists
FMV1 enforces [strict completeness on `Address` object-primitive values](/api-v1-reference/object-primitives/overview#address): if any sub-field is missing, the write is rejected. `county` is the sub-field most often missing from upstream sources. This endpoint fills that gap.
***
## Request
| Parameter | In | Required | Description |
| ----------- | ----- | -------- | ---------------------------------------------------------------------------------------------- |
| `companyId` | path | yes | Your company UUID |
| `address` | query | yes | Freeform address string. Must be non-empty and non-blank (whitespace-only values are rejected) |
```bash theme={null}
curl -G "https://app.aiinsurance.io/api/external/companies//resolve-address" \
-H "Authorization: " \
--data-urlencode "address=350 5th Ave, New York, NY"
```
**Required permission:** `company:read`
***
## Response — `200 OK`
Returns the [`Address` object primitive](/api-v1-reference/object-primitives/overview#address) — all six sub-fields populated.
```json theme={null}
{
"street": "350 5th Avenue",
"city": "New York",
"state": "NY",
"county": "New York County",
"country": "United States",
"zipCode": "10001"
}
```
`zipCode` is always returned as a string with leading zeros preserved (e.g. `"02140"`).
The response shape is identical to the FMV1 `Address` sub-object — paste the response straight into a create/update payload's address field.
***
## Failure behavior
If geocoding succeeds but any required sub-field cannot be determined, the endpoint returns `400` with a distinct `problemCode` — partial addresses are **never** returned as success. Branch on `problemCode` to know which sub-field was the problem.
| HTTP | `problemCode` | Meaning |
| ---- | ----------------------- | ---------------------------------------------------------------------------------------------- |
| 400 | `BlankString` | Input was empty or whitespace-only |
| 400 | `AddressNotFound` | Geocoder returned no results — provide a more specific input |
| 400 | `AddressMissingStreet` | No street number/route in the result |
| 400 | `AddressMissingCity` | No locality / postal town / sublocality in the result |
| 400 | `AddressMissingState` | No `administrative_area_level_1` in the result |
| 400 | `AddressMissingCounty` | No `administrative_area_level_2` in the result — most common cause is an under-specified input |
| 400 | `AddressMissingCountry` | No country in the result |
| 400 | `AddressMissingZipCode` | No postal code in the result |
| 502 | `GeocodingFailed` | Upstream geocoder is unreachable or returned an error — retry after a short delay |
```json theme={null}
{
"error": {
"code": "AddressMissingCounty",
"message": "Resolved address is missing a county. Provide a more specific address that includes a county."
}
}
```
***
## Related
* [Object Primitives → Address](/api-v1-reference/object-primitives/overview#address) — full sub-field reference.
* [V1 API Changelog](/api-v1-reference/changelog) — strict `Address` validation was rolled out on 2026-04-28.
# Generating API Keys
Source: https://docs.aiinsurance.io/api-v1-reference/authentication
## How to Generate API Keys
API keys allow you to programmatically access your AI Insurance data and integrate with external systems. This guide shows you how to generate API keys from your company settings.
## Step-by-Step Instructions
### Step 1: Access Company Settings
1. Log into your AI Insurance account at [https://app.aiinsurance.io](https://app.aiinsurance.io)
2. In the left sidebar, find and click on your company name (e.g., "Demo Insurance Inc.")
3. This will open the company settings page
### Step 2: Navigate to API Keys
1. In the company settings, look for the navigation bar
2. Click on the **"API Keys"** tab
3. Once you're on the **API Keys** page, you will see:
* A table of any existing API keys
* A button to create a new API key
* Your **Company ID** at the bottom of the page (this ID is required in most API requests)
### Step 3: Create Your API Key
1. Click the purple **"+ Create New API Key"** button
2. You'll be prompted to enter:
* **Key Name**: A descriptive name for your API key (e.g., "Production Integration", "Testing API")
* **Description**: Optional description of what this key will be used for
### Step 4: Save Your API Key
1. After creating the key, you'll receive your API key
2. **Store it securely** - API keys grant access to your company's data
**Authentication Header Format**
When making API requests, include your API key in the Authorization header:
```
Authorization: YOUR-API-KEY
```
**Correct:**
```bash theme={null}
-H "Authorization: abc123xyz789"
```
**Incorrect:**
```bash theme={null}
-H "Authorization: Bearer abc123xyz789" ❌
-H "X-API-Key: abc123xyz789" ❌
```
***
## Using Your API Key
Now that you have your API key, you can use it to access the AI Insurance V1 API.
### Example: Using Your API Key
```bash theme={null}
curl -X GET \
"https://app.aiinsurance.io/api/v1/external/companies/YOUR-COMPANY-ID/exposures" \
-H "Authorization: YOUR-API-KEY"
```
# API Changelog
Source: https://docs.aiinsurance.io/api-v1-reference/changelog
## V1 API Changelog
Track changes, additions, and deprecations to the V1 API.
***
### 2026-05-15
#### New: Company Files API (folders + files)
Added 10 endpoints for managing company-level folders and files:
**Folders:** `POST`, `GET`, `GET /{folderId}`, `PATCH /{folderId}`, `DELETE /{folderId}` under `/api/v1/external/companies/{companyId}/folders`
**Files:** `POST` (multipart upload), `GET /{fileId}`, `GET /{fileId}/content` (binary download), `PATCH /{fileId}`, `DELETE /{fileId}` under `/api/v1/external/companies/{companyId}/files`
Key capabilities:
* Create nested folder hierarchies with `parentFolderId`
* Upload files via `multipart/form-data`, optionally placing them in a folder
* Stream binary file content with correct `Content-Type` and `Content-Disposition` headers
* Rename and move files/folders (including moving to root by setting parent to `null`)
* Recursive soft-delete of folders (deletes all contents)
All endpoints use `company.file:{action}` permissions. See the [Company Files overview](/api-v1-reference/company-files/overview) for details.
These are company-level file endpoints only. Entity-scoped file endpoints (attached to exposures, policies, events) are planned for a future release.
***
### 2026-05-07
#### New endpoint: Update Expected Totals for V1 events
Added `PATCH /api/v1/external/companies/{companyId}/events/{eventId}/financials/expected-totals`
for Field Model V1 events.
The legacy expected-totals endpoint at `/api/external/...` relies on an internal `type` column
that is always `null` for V1-created events, causing a `TypeMismatch` error. This new endpoint
resolves the event type from `fieldModelV1Data.eventType` instead.
The request body is identical to the legacy endpoint (`type`, `categoryId`, `expectedTotal`,
optional `asOfDate`). The `type` field is still required for permission routing.
***
### 2026-05-01
#### Event→Policy relationship migrated to `eventPolicy` Join field (additive)
Event responses now surface the associated policy in two places: the existing
top-level `policyId` and the new `eventPolicy` key inside `fieldModelV1Data`.
Both reflect the same value — `policyId` stays at the top level for backwards
compatibility, while `eventPolicy` is the underlying `Join: Policy` field
where the value is stored.
**What changed:**
* `GET /api/v1/external/companies/{companyId}/events` and `/events/{eventId}`
responses include `eventPolicy` inside `fieldModelV1Data` alongside the
pre-existing top-level `policyId`. No fields were removed.
* `POST` and `PUT` event endpoints continue to accept `policyId` as a
top-level request param. The server maps it to
`fieldModelV1Data.eventPolicy` internally; clients that already submit
`policyId` need no changes.
* `policyId` is no longer stored on a dedicated `events.policy_id` column on
the FMV1 read/write paths — it now lives in `fieldModelV1Data.eventPolicy`,
consistent with how `eventInsureds` was migrated previously. The external
API contract is unchanged for existing integrators.
This is a non-breaking change. Integrators can ignore `eventPolicy` and
continue using `policyId`, or migrate to reading the value from
`fieldModelV1Data.eventPolicy` to align with the rest of the field model.
***
#### `Address.zipCode` must be a JSON string (breaking)
`Address` object-primitive writes that send `zipCode` as a JSON number are now rejected with `400` and `problemCode: "InvalidAddressZipCode"`. Previously, numeric ZIPs were accepted by the API but silently lost their leading zeros — `02140` parses as `2140`, corrupting the stored address.
**Affected endpoints:** every FMV1 create/update endpoint that can carry an `Address` value (top-level field or nested inside a custom object), including all exposure, event, quote, basic-policy, segmented-policy-transaction, and custom-object writes.
**What to send:** quote ZIP codes in your payload — `"zipCode": "02140"`, never `"zipCode": 02140`. The [Address sub-field reference](/api-v1-reference/object-primitives/overview#address) and the [`Fmv1Address` OpenAPI schema](/api-v1-reference/object-primitives/overview#address) both call this out explicitly.
**Why this is most likely to bite:**
* **Spreadsheets** (Excel / Google Sheets) auto-coerce ZIP-shaped cells to numbers — export as text or wrap in `=TEXT(...)` before serializing.
* **OpenAPI clients / codegen** that infer the `zipCode` JSON type from a sample value rather than the schema (which has always been `type: string`).
* **LLM-generated requests** that "helpfully" unquote numeric-looking strings.
The geocoded shape returned by [`GET /resolve-address`](/api-v1-reference/address-tools/resolve-address) already returns `zipCode` as a string — paste responses straight into your write payload and you avoid this failure.
***
### 2026-04-29
#### Documentation: Object Primitives + Address Tools
* New [Object Primitives reference page](/api-v1-reference/object-primitives/overview) documenting the five FMV1 built-in object shapes (`Address`, `CoverageLimit`, `Currency`, `Date`, `QuoteBindError`) — sub-field tables, JSON examples, the strict-completeness rule, and List cardinality.
* New [Resolve Address](/api-v1-reference/address-tools/resolve-address) endpoint page surfacing the V1-relevant pre-flight utility for deriving a complete `Address` (including `county`) from a freeform input string. The endpoint itself was added on 2026-04-27 under the legacy URL — this page exposes it to V1 integrators directly.
* OpenAPI spec now exports reusable `Fmv1Address`, `Fmv1CoverageLimit`, `Fmv1Currency`, `Fmv1Date`, and `Fmv1QuoteBindError` schemas under `components.schemas` for client-codegen consumers. Schemas mark every sub-field as `required`.
***
### 2026-04-28
#### Strict object-primitive sub-field validation (breaking)
When a request body for an FMV1 create/update endpoint includes an object-primitive value (`Address`, `CoverageLimit`, `Currency`, `Date`, `QuoteBindError`), every declared sub-field must now be present and non-empty. Affected endpoints:
* `POST/PATCH /api/v1/external/companies/{companyId}/exposures` and `/exposures/{id}`
* `POST/PATCH /api/v1/external/companies/{companyId}/events` and `/events/{id}`
* `POST/PATCH /api/v1/external/companies/{companyId}/quotes` and `/quotes/{id}`
* `POST /api/v1/external/companies/{companyId}/policies` (Basic Policies)
* All segmented policy transaction endpoints (`new-business`, `endorse`, `renew`)
* `POST/PATCH /api/v1/external/companies/{companyId}/custom-objects/{objectType}` and `/{objectId}`
**What changed:**
* A `null`, `undefined`, or empty-string (`""`) sub-field on a present object-primitive value now returns `400` with `Field '' is missing required sub-field ''`. Previously, partial object primitives were silently accepted and surfaced as confusing rating errors downstream. The most common case is `Address` without `county` — call `GET /api/external/companies/{companyId}/resolve-address` first if upstream data lacks county.
* Numeric `0` (e.g. `Currency.value: 0`) and Boolean `false` are still valid — the rule only treats `null` / `undefined` / `""` as missing.
* **Whitespace-only strings (e.g. `" "`) are NOT treated as missing** by this validator. A consumer sending `county: " "` will pass this check; downstream rating may still reject it. Trim/normalize sub-field strings client-side before submitting.
* Custom-object sub-fields keep their existing `requiredCondition` rules unchanged.
* Omitting the parent object-primitive field entirely is unchanged — the strict rule only fires when the parent value is provided.
***
### 2026-04-20
* **Bind Quote** — documented under Basic Policies: `POST /api/v1/external/companies/{companyId}/quotes/{quoteId}/bind`. Binds a Field Model V1 quote to create a Basic Policy. Returns `{ policyId, policyNumber, bindErrors }`. Requires `company.quote:create`.
***
### 2026-04-17
* **Basic Policies API** — introduced as a simplified CRUD alternative to the transaction-based Policy API at `GET/POST /api/v1/external/companies/{companyId}/policies` and `GET/DELETE /api/v1/external/companies/{companyId}/policies/{policyId}`. Request body is a flat field-model object with nested `exposures`. See the [Basic Policies overview](/api-v1-reference/policies/basic-overview).
* **List Basic Policies** supports `id`, `policyNumberFilterText` (substring match on `policyNumber` only), and `filters` (structured per-field `FieldModelV1ListFilter[]` against any FMV1 field or system column, combined with AND).
* Removed the "Deprecated" group from the V1 docs. The previous CRUD endpoint shape (`{ referenceId, startsAtDate, endsAtDate, segments: [...] }`) is no longer documented; use the new flat-shape Basic Policies API instead.
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/company-files/overview
Manage company-level folders and files via the API
The Company Files API lets you create a folder hierarchy, upload files, and
organize them into folders — all at the company level.
These endpoints manage **company-level** files and folders only. Entity-scoped
file endpoints (attached to exposures, policies, events, etc.) are planned for
a future release.
## Key Concepts
* **Folder** — a named container that can hold files and other folders. Folders form a tree via `parentFolderId` (null = root).
* **File** — a binary object with metadata (name, MIME type, category). Files can optionally live inside a folder.
* **Folder contents** — the `GET /folders/{folderId}` endpoint returns a mixed list of files and subfolders, discriminated by the `contentType` field (`file` or `folder`).
* **Soft delete** — both file and folder deletes are soft (the record is marked as deleted). Deleting a folder recursively soft-deletes all contents.
## API Endpoints
### Folders
| Method | Endpoint | Description |
| ------ | ------------------------ | ----------------------------------------- |
| POST | `/v1/folders` | Create a folder |
| GET | `/v1/folders` | List all folders (flat, paginated) |
| GET | `/v1/folders/{folderId}` | List folder contents (files + subfolders) |
| PATCH | `/v1/folders/{folderId}` | Rename or move a folder |
| DELETE | `/v1/folders/{folderId}` | Soft-delete folder (recursive) |
### Files
| Method | Endpoint | Description |
| ------ | ---------------------------- | ------------------------------------- |
| POST | `/v1/files` | Upload a file (multipart) |
| GET | `/v1/files/{fileId}` | Get file metadata |
| GET | `/v1/files/{fileId}/content` | Download file content (binary stream) |
| PATCH | `/v1/files/{fileId}` | Rename or move a file |
| DELETE | `/v1/files/{fileId}` | Soft-delete a file |
## Permissions
| Operation | Permission |
| -------------------------------------------------------------- | --------------------- |
| List folders, List folder contents, Get file, Download content | `company.file:read` |
| Create folder, Upload file | `company.file:create` |
| Rename/move folder, Rename/move file | `company.file:update` |
| Delete folder, Delete file | `company.file:delete` |
## Workflow Example
A typical integration creates a folder structure, uploads files into it, then
retrieves them later.
**1. Create a folder**
```bash theme={null}
curl -X POST https://app.aiinsurance.io/api/v1/external/companies/{companyId}/folders \
-H "Authorization: YOUR-API-KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Claims Documents"}'
# → {"id": "folder-uuid"}
```
**2. Upload a file into the folder**
```bash theme={null}
curl -X POST https://app.aiinsurance.io/api/v1/external/companies/{companyId}/files \
-H "Authorization: YOUR-API-KEY" \
-F "file=@claim-report.pdf" \
-F "fileName=claim-report.pdf" \
-F "mimeType=application/pdf" \
-F "folderId=folder-uuid"
# → {"id": "file-uuid", "name": "claim-report.pdf", ...}
```
**3. List folder contents**
```bash theme={null}
curl https://app.aiinsurance.io/api/v1/external/companies/{companyId}/folders/folder-uuid \
-H "Authorization: YOUR-API-KEY"
# → {"items": [{"contentId": "file-uuid", "contentType": "file", ...}], "totalCount": 1}
```
**4. Download the file**
```bash theme={null}
curl https://app.aiinsurance.io/api/v1/external/companies/{companyId}/files/file-uuid/content \
-H "Authorization: YOUR-API-KEY" \
-o claim-report.pdf
```
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/configuration/overview
The FMV1 Configuration API provides endpoints for exporting, validating, comparing, and importing company configuration via Google Spreadsheets. This is the programmatic interface to the onboarding spreadsheet pipeline.
## Authentication
These endpoints require an API key created with the **FMV1\_CONFIGURATION\_MANAGER** role. Standard API keys (e.g., those with `CARRIER_ADMIN`) will not have the required permissions.
To create an API key with this role, go to **Settings > API Keys** and select the **FMV1 Configuration Manager** role when generating the key.
## Google OAuth Token
All endpoints require the caller to provide a `googleOAuthToken` — a Google OAuth2 access token with permission to read from (or write to) the target spreadsheet. The server does not use its own Google credentials for these operations.
You can obtain a token via Google's OAuth2 flow with the `https://www.googleapis.com/auth/spreadsheets` scope.
***
## Workflow
The typical round-trip workflow is:
1. **Generate** — Create a new blank configuration spreadsheet template (or use **Export** to populate an existing one with current config)
2. Edit the spreadsheet manually
3. **Validate** — Check the spreadsheet for structural or data errors
4. **Compare** — Preview what changes the import would apply
5. **Import** — Apply the changes from the spreadsheet to the database
***
## API Endpoints
* **[Generate Spreadsheet](/api-reference/fmv1-configuration/generate-configuration-spreadsheet)** — Create a blank configuration template spreadsheet
* **[Export Configuration](/api-reference/fmv1-configuration/export-configuration)** — Write current config to an existing spreadsheet
* **[Validate Configuration](/api-reference/fmv1-configuration/validate-configuration-spreadsheet)** — Check spreadsheet for errors
* **[Compare Configuration](/api-reference/fmv1-configuration/compare-configuration)** — Diff spreadsheet against database
* **[Import Configuration](/api-reference/fmv1-configuration/import-configuration)** — Apply spreadsheet changes to database
***
## Permissions
| Operation | Required Permission |
| --------- | ------------------------------ |
| Generate | `company.configuration:export` |
| Export | `company.configuration:export` |
| Validate | `company.configuration:export` |
| Compare | `company.configuration:export` |
| Import | `company.configuration:import` |
***
## Configuration Categories
The compare endpoint returns change counts for each category:
| Category | Description |
| ------------------ | -------------------------------------------------- |
| `fieldDefinitions` | Field definitions (name, type, reference ID, etc.) |
| `optionSets` | Option set values for dropdown fields |
| `customObjects` | Custom object type definitions |
| `cardDefinitions` | UI card layout definitions |
| `cardSections` | Sections within cards |
| `fieldLocations` | Where fields appear on cards |
***
## Smart Tag Configuration Walkthrough
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/custom-objects/overview
The Custom Objects API allows you to manage company-defined entity types with dynamic fields and relationships. Custom object types are configured per company — use the [List Types](#discovery) endpoint to discover available types.
**Key Concepts:**
* **Discovery**: Call `GET /custom-objects` to list available types, then use the `type` value as the `objectType` path parameter for all other endpoints.
* **Configuration**: Call `GET /custom-objects/{objectType}/configuration` to get a JSON Schema for data fields and metadata about relationship fields.
* **Data vs relationships**: Responses include separate `data` (regular field values) and `relationships` (linked entity IDs) objects. Create and update only accept `data` — relationship fields are rejected with a clear error directing you to the relationship management endpoints.
* **Relationship management**: Dedicated `PUT` / `DELETE` endpoints for linking and unlinking entities. Use the `fieldRefId` from the configuration endpoint.
* **Object type format**: Object types use `snake_case` in URLs and responses.
***
## Discovery
Call `GET /v1/custom-objects` to list the custom object types configured for your company:
```json theme={null}
{
"items": [
{ "id": "...", "type": "vehicle", "displayNameExpression": "vehicleMake + \" \" + vehicleModel" },
{ "id": "...", "type": "building_info", "displayNameExpression": null }
]
}
```
Use the `type` value (e.g., `vehicle`) as the `{objectType}` path parameter in all other endpoints.
***
## Configuration
Call `GET /v1/custom-objects/{objectType}/configuration` to get:
* **`data`**: JSON Schema (draft 2020-12) describing the available fields, their types, and which are required.
* **`relationships`**: Array of relationship metadata, each with `fieldRefId`, `label`, `targetType`, and `cardinality`.
***
## Data vs Relationships
GET responses split the object's data into two sections:
```json theme={null}
{
"id": "...",
"type": "vehicle",
"displayName": "Toyota Camry",
"data": {
"vehicleMake": "Toyota",
"vehicleModel": "Camry",
"year": 2024
},
"relationships": {
"ownerExposure": "550e8400-e29b-41d4-a716-446655440200"
}
}
```
* **`data`**: Regular field values. Can be set via create/update.
* **`relationships`**: Linked entity IDs keyed by `fieldRefId`. Single-cardinality relationships have a string value; multi-cardinality relationships have an array of strings. Managed via the relationship endpoints only.
***
## Relationship Management
Use the dedicated relationship endpoints to link and unlink entities:
* **Add**: `PUT /custom-objects/{objectType}/{objectId}/relationships/{fieldRefId}/{targetId}`
* **Remove**: `DELETE /custom-objects/{objectType}/{objectId}/relationships/{fieldRefId}/{targetId}`
**Cardinality behavior:**
| Cardinality | Add Behavior |
| -------------- | ----------------------------------------------------------------------------- |
| `one_to_one` | Replaces any existing link on both sides |
| `one_to_many` | Replaces existing link from the source (the "one" side); target can have many |
| `many_to_one` | Appends link; existing links to the target from the "one" side are replaced |
| `many_to_many` | Appends link; both sides can have multiple |
Both operations are idempotent — adding an existing link returns `created: false`, removing a non-existent link returns `removed: false`.
***
## API Endpoints
* **[List Custom Object Types](/api-reference/field-model-custom-objects/list-custom-object-types)** - Discover available types
* **[Get Configuration](/api-reference/field-model-custom-objects/get-custom-object-configuration)** - JSON Schema and relationship metadata
* **[List Custom Objects](/api-reference/field-model-custom-objects/list-custom-objects)** - Paginated list for a type
* **[Get Custom Object](/api-reference/field-model-custom-objects/get-custom-object)** - Retrieve by ID
* **[Create Custom Object](/api-reference/field-model-custom-objects/create-custom-object)** - Create a new object
* **[Update Custom Object](/api-reference/field-model-custom-objects/update-custom-object)** - Full replacement update (PUT)
* **[Delete Custom Object](/api-reference/field-model-custom-objects/delete-custom-object)** - Delete an object
* **[Add Relationship](/api-reference/field-model-custom-objects/add-custom-object-relationship)** - Link to another entity
* **[Remove Relationship](/api-reference/field-model-custom-objects/remove-custom-object-relationship)** - Unlink from another entity
***
## Permissions
| Operation | Required Permission |
| -------------------- | ----------------------------------- |
| List Types | `company.fmv1_custom_object:read` |
| Get Configuration | `company.fmv1_custom_object:read` |
| List Custom Objects | `company.fmv1_custom_object:read` |
| Get Custom Object | `company.fmv1_custom_object:read` |
| Create Custom Object | `company.fmv1_custom_object:create` |
| Update Custom Object | `company.fmv1_custom_object:update` |
| Delete Custom Object | `company.fmv1_custom_object:delete` |
| Add Relationship | `company.fmv1_custom_object:update` |
| Remove Relationship | `company.fmv1_custom_object:update` |
***
## Sorting (List Custom Objects)
| Sort Field | Description |
| ------------- | ------------------------------- |
| `createdAt` | Sort by creation date (default) |
| `updatedAt` | Sort by last update date |
| `displayName` | Sort by computed display name |
# Data Models
Source: https://docs.aiinsurance.io/api-v1-reference/data-models
Reference for all V1 API data structures, field types, and conventions
This page documents the data structures and conventions used across all V1 API endpoints.
***
## Common Conventions
### IDs
All entity identifiers are **UUIDs** (RFC 4122):
```
"550e8400-e29b-41d4-a716-446655440000"
```
### Timestamps
All timestamp fields (`createdAt`, `updatedAt`, `transactionTimestamp`, etc.) are returned as **ISO 8601** strings in UTC:
```
"2026-04-14T10:30:45.123Z"
```
### Dates
Date-only fields (`startDate`, `endDate`, `effectiveDate`, `policyStartDate`, `policyEndDate`) use **ISO 8601 date** format:
```
"2026-01-15"
```
### Nullable Fields
Fields that may be absent are typed as `T | null`. For example, `policyId: string | null` means the field is always present in the response but may be `null`.
***
## Pagination
All list endpoints return the same paginated response shape:
```json theme={null}
{
"items": [],
"totalCount": 0
}
```
| Field | Type | Description |
| ------------ | ------- | --------------------------------------- |
| `items` | array | Entities for the current page |
| `totalCount` | integer | Total matching records across all pages |
**Query parameters** for list endpoints:
| Parameter | Type | Default | Description |
| --------------- | --------------- | ----------- | ---------------------------------- |
| `page` | integer | `1` | 1-based page number |
| `sortBy` | string | `createdAt` | Field to sort by (entity-specific) |
| `sortDirection` | `asc` \| `desc` | `desc` | Sort direction |
Page size is fixed at **50 items per page**.
***
## fieldModelV1Data
Most V1 entities store their custom field data in a `fieldModelV1Data` object. The shape of this object is defined by your company's field configuration — call the entity's `/configuration` endpoint to discover available fields, types, and validation rules.
Keys in `fieldModelV1Data` are **field reference IDs** (the stable identifiers you define when configuring fields).
### Field Value Types
| Field Type | JSON Type | Example |
| ------------------------ | ------------------- | ------------------------------------------------------------------------- |
| Text | `string` | `"Acme Corp"` |
| Number | `number` | `42` |
| Boolean | `boolean` | `true` |
| Date | `object` | `{ "day": 15, "month": 1, "year": 2026, "timezone": "America/New_York" }` |
| Single-select option set | `string` | `"commercial"` |
| Multi-select option set | `array` of `string` | `["general_liability", "property"]` |
### Date Fields
Date fields in `fieldModelV1Data` are represented as objects with individual components:
```json theme={null}
{
"policyEffectiveDate": {
"day": 15,
"month": 1,
"year": 2026,
"timezone": "America/New_York"
}
}
```
| Property | Type | Description |
| ---------- | ------ | ------------------------ |
| `day` | number | Day of the month (1-31) |
| `month` | number | Month (1-12) |
| `year` | number | Four-digit year |
| `timezone` | string | IANA timezone identifier |
API parameters that accept dates directly (such as `policyStartDate`, `effectiveDate`, and other endpoint-level fields) use **ISO 8601 date strings** (`"2026-01-15"`), not the component object format. The component format is specific to custom field data inside `fieldModelV1Data`.
### Option Set Fields
Option set values are stored as **string keys** (not labels). Use the `/configuration` endpoint to map keys to human-readable labels.
**Single-select:**
```json theme={null}
{
"exposureType": "commercial_property"
}
```
**Multi-select:**
```json theme={null}
{
"coverageLines": ["general_liability", "property", "auto"]
}
```
The configuration schema uses `oneOf` to enumerate valid options:
```json theme={null}
{
"exposureType": {
"type": "string",
"title": "exposureType",
"oneOf": [
{ "const": "commercial_property", "title": "Commercial Property" },
{ "const": "residential", "title": "Residential" }
]
}
}
```
***
## Configuration Schema
All entity types have a `/configuration` endpoint that returns a **JSON Schema (Draft 2020-12)** describing valid field data:
```json theme={null}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"fieldReferenceId": {
"type": "string",
"title": "fieldReferenceId",
"format": "date"
}
},
"required": ["fieldReferenceId"]
}
```
### Schema Format Values
The `format` property indicates the semantic type of a field:
| Format | JSON Type | Description | Example Value |
| ----------------- | --------- | ----------------------------- | ----------------------- |
| `date` | `string` | ISO 8601 date | `"2026-01-15"` |
| `email` | `string` | Email address | `"user@example.com"` |
| `phone` | `string` | Phone number | `"+1-555-123-4567"` |
| `currency` | `number` | Monetary amount | `15000` |
| `percent` | `string` | Percentage | `"15.5"` |
| `address` | `string` | Physical address | `"123 Main St, ..."` |
| `entity:exposure` | `string` | Reference to an exposure type | `"commercial_property"` |
***
## Entities
### Exposure
Exposures represent insured entities (e.g., a building, vehicle, or healthcare provider).
| Field | Type | Description |
| ------------------ | ------------------------- | ----------------------- |
| `id` | string (UUID) | Exposure identifier |
| `companyId` | string (UUID) | Company identifier |
| `fieldModelV1Data` | object | Custom field data |
| `policyIds` | string\[] | Associated policy IDs |
| `createdAt` | string (ISO 8601) \| null | Creation timestamp |
| `updatedAt` | string (ISO 8601) \| null | Last update timestamp |
| `createdBy` | string \| null | User ID of creator |
| `updatedBy` | string \| null | User ID of last updater |
### Event
Events represent claims and incidents.
| Field | Type | Description |
| ------------------ | ------------------------- | ----------------------- |
| `id` | string (UUID) | Event identifier |
| `companyId` | string (UUID) | Company identifier |
| `policyId` | string (UUID) \| null | Associated policy |
| `fieldModelV1Data` | object | Custom field data |
| `createdAt` | string (ISO 8601) \| null | Creation timestamp |
| `updatedAt` | string (ISO 8601) \| null | Last update timestamp |
| `createdBy` | string \| null | User ID of creator |
| `updatedBy` | string \| null | User ID of last updater |
### Quote
Quotes are top-level FMV1 entities with their own field definitions. On bind, a quote creates a new policy.
| Field | Type | Description |
| -------------- | ------------------------- | ------------------------------------ |
| `id` | string (UUID) | Quote identifier |
| `companyId` | string (UUID) | Company identifier |
| `submissionId` | string (UUID) | Parent submission |
| `policyId` | string (UUID) \| null | Associated policy (set after bind) |
| `data` | object | Quote-level custom field data |
| `exposures` | object\[] | Array of exposure field data objects |
| `createdAt` | string (ISO 8601) | Creation timestamp |
| `updatedAt` | string (ISO 8601) \| null | Last update timestamp |
| `createdBy` | string \| null | User ID of creator |
Quotes use `data` and `exposures` rather than `fieldModelV1Data` because they contain data for two entity types in a single response. Quote-specific fields (quoteStatus, quoteType, quoteNumber, quoteSubmissionId, quoteBindErrors) are system-managed and cannot be set via the API.
**Quote configuration** returns schemas for both entity types:
```json theme={null}
{
"quote": { "$schema": "...", "type": "object", "properties": { ... } },
"exposure": { "$schema": "...", "type": "object", "properties": { ... } }
}
```
The `quote` schema excludes calculated fields, policy-only fields, server-populated fields, and lifecycle fields. The `exposure` schema (singular) describes the shape of **each item** in the quote's `exposures` array (plural).
### Custom Object
Custom objects are configurable entity types with relationships to other objects.
| Field | Type | Description |
| --------------- | ------------------------- | ----------------------- |
| `id` | string (UUID) | Object identifier |
| `companyId` | string (UUID) | Company identifier |
| `type` | string | Object type name |
| `displayName` | string | Computed display name |
| `data` | object | Custom field data |
| `relationships` | object | Relationship mappings |
| `createdAt` | string (ISO 8601) \| null | Creation timestamp |
| `updatedAt` | string (ISO 8601) \| null | Last update timestamp |
| `createdBy` | string \| null | User ID of creator |
| `updatedBy` | string \| null | User ID of last updater |
**Custom object configuration** includes field schema and relationship definitions:
```json theme={null}
{
"data": { "$schema": "...", "type": "object", "properties": { ... } },
"relationships": [
{
"fieldRefId": "primaryBroker",
"label": "Primary Broker",
"targetType": "broker",
"cardinality": "many_to_one"
}
]
}
```
**Relationship cardinality values:** `one_to_one`, `one_to_many`, `many_to_one`, `many_to_many`
***
## Policy Model
Policies use a **transaction-based, temporally-versioned** data model. Rather than directly editing policy fields, you submit transactions (new business, endorsement, cancellation, etc.) that produce immutable versions.
For a deep dive, see [Policy Concepts](/api-v1-reference/policies/concepts).
### Policy Version
Each transaction produces a new policy version containing one or more **segments** — date ranges where the policy state is identical.
| Field | Type | Description |
| ----------------------- | ----------------- | -------------------------------------- |
| `policyId` | string (UUID) | Policy identifier |
| `policyVersion` | integer | Version number (incrementing) |
| `transactionId` | string (UUID) | Transaction that produced this version |
| `startDate` | string (date) | Policy term start |
| `endDate` | string (date) | Policy term end |
| `createdAt` | string (ISO 8601) | Version creation timestamp |
| `fullTermPolicyBilling` | object \| null | Billing data for the full term |
| `fullTermPolicyInfo` | object \| null | Policy info for the full term |
| `segments` | PolicySegment\[] | Array of policy segments |
### Policy Segment
A segment is a date range within the policy term where the policy state is constant. Segments are **derived from final state** — they are not one-per-transaction.
| Field | Type | Description |
| ------------------ | ------------- | ------------------------------------- |
| `startDate` | string (date) | Segment start date |
| `endDate` | string (date) | Segment end date |
| `fieldModelV1Data` | object | Policy field data for this date range |
### Policy Transaction
Transactions are the immutable record of changes to a policy.
| Field | Type | Description |
| ---------------------- | ------------------- | ---------------------------------- |
| `id` | string (UUID) | Transaction identifier |
| `policyId` | string (UUID) | Policy identifier |
| `policyVersion` | integer | Version this transaction produced |
| `action` | string | Transaction type (see below) |
| `effectiveDate` | string (date) | When this change takes effect |
| `transactionTimestamp` | string (ISO 8601) | When this transaction was recorded |
| `createdAt` | string (ISO 8601) | Creation timestamp |
| `createdBy` | string \| null | User ID of creator |
| `deltas` | TransactionDelta\[] | Field-level changes (optional) |
**Transaction action values:** `NEW_BUSINESS`, `ENDORSE`, `CANCEL`, `REINSTATE`, `RENEW`
### Transaction Delta
Deltas describe the field-level changes a transaction made within a date range.
| Field | Type | Description |
| --------------- | ------------------------- | ------------------------------------- |
| `id` | string (UUID) | Delta identifier |
| `transactionId` | string (UUID) | Parent transaction |
| `startDate` | string (date) | Date range start |
| `endDate` | string (date) | Date range end |
| `path` | string | JSON pointer to the changed field |
| `action` | string | `Add`, `Remove`, or `Overwrite` |
| `value` | string, number, or object | New value (for `Add` and `Overwrite`) |
### Policy List Item
List endpoints return a summary with optional segment detail:
```json theme={null}
{
"summary": {
"id": "...",
"policyId": "...",
"companyId": "...",
"createdAt": "2026-01-15T10:30:00.000Z",
"policyVersion": 3,
"versionCreatedAt": "2026-03-01T14:00:00.000Z",
"fullTermPolicyBilling": null,
"fullTermPolicyInfo": { ... },
"matchedSegments": [
{ "startDate": "2026-01-15", "endDate": "2026-07-15" }
]
},
"segments": []
}
```
### Earned Premium
Per-policy earned premium calculations, available at different detail levels.
| Field | Type | Description |
| -------------------- | ------------------ | -------------------------------------- |
| `policyId` | string (UUID) | Policy identifier |
| `policyNumber` | string | Human-readable policy number |
| `earnedPremiumTotal` | number | Total earned premium for the period |
| `transactionTotals` | array | Per-transaction contribution breakdown |
| `days` | array \| undefined | Per-day breakdown (when requested) |
**Detail levels** (set via `detail` query parameter):
| Value | Description |
| --------------------- | ---------------------------------------------------- |
| `transactions` | Per-transaction totals only (default) |
| `days` | Adds daily earned premium totals |
| `daysAndTransactions` | Adds daily totals with per-transaction contributions |
### Bordereau Row
Bordereau export provides a flat row per policy transaction for reporting.
| Field | Type | Description |
| ---------------------- | ----------------- | ------------------------------------- |
| `policyNumber` | string \| null | Policy number |
| `primaryInsuredName` | string \| null | Primary insured |
| `transactionAction` | string | Transaction type |
| `policyVersion` | integer | Version number |
| `effectiveDate` | string (date) | Transaction effective date |
| `transactionTimestamp` | string (ISO 8601) | When recorded |
| `policyStartDate` | string (date) | Term start |
| `policyEndDate` | string (date) | Term end |
| `createdAt` | string (ISO 8601) | Creation timestamp |
| `createdBy` | string \| null | Creator |
| `policyPremium` | number \| null | Total premium at this version |
| `policyPremiumChange` | number \| null | Premium change from prior version |
| `additionalColumns` | object | Company-configured additional columns |
***
## Entity Relationships
```
Submission ──has many──> Quotes
Quote ──binds to──> Policy (one-to-one)
Policy ──has many──> Transactions ──produces──> Versions ──contains──> Segments
Exposure ──standalone entity──
Quote / Policy ──embeds──> Exposure data (snapshot, can diverge)
Event ──optionally linked──> Policy (via policyId)
Custom Object ──relationships──> Custom Object (configurable cardinality)
```
| Relationship | Description |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Quote → Policy | Binding a quote creates a policy and sets `policyId` on the quote |
| Policy → Transactions | Transactions are the write path; each produces a new version |
| Policy → Versions → Segments | Versions contain segments representing the policy state over time |
| Quote / Policy → Exposure | Quotes and policies **embed** exposure data. They store a reference back to the standalone exposure object, but the embedded exposure data can evolve independently — e.g., an endorsement may change exposure fields on the policy without modifying the standalone exposure record |
| Event → Policy | Events may reference a policy via `policyId` |
| Custom Object → Custom Object | Configurable relationships with defined cardinality |
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/documents/overview
Generate quote and policy documents from smart tag templates via API
**Planned** — Document generation endpoints are being added to the v1 API. See the [Roadmap](/api-v1-reference/roadmap) for overall API direction.
The Document Generation API lets you upload form templates, generate populated documents for quotes and policies, and download the results.
## Key Concepts
* **Form template** — a DOCX file containing smart tags (placeholders) that get resolved against entity data
* **Smart tags** — placeholder tokens in a template that map to configured fields. Every field you define in your configuration automatically gets a smart tag
* **Document generation** — the process of resolving all smart tags in a template against a quote or policy, producing a final PDF
## Planned Endpoints
### Template Management
| Method | Endpoint | Description |
| ------ | -------------------------------------------- | -------------------------------------- |
| POST | `/v1/form-templates` | Upload a DOCX template with smart tags |
| GET | `/v1/form-templates` | List templates |
| GET | `/v1/form-templates/{templateId}` | Get template metadata |
| DELETE | `/v1/form-templates/{templateId}` | Delete a template |
| GET | `/v1/form-templates/{templateId}/smart-tags` | List smart tags found in the template |
### Quote Documents
| Method | Endpoint | Description |
| ------ | --------------------------------------------- | ------------------------------------ |
| POST | `/v1/quotes/{quoteId}/documents/generate` | Generate documents for a quote |
| GET | `/v1/quotes/{quoteId}/documents` | List generated documents for a quote |
| GET | `/v1/quotes/{quoteId}/documents/{documentId}` | Download a generated quote document |
### Policy Documents
| Method | Endpoint | Description |
| ------ | ------------------------------------------------ | ------------------------------------- |
| POST | `/v1/policies/{policyId}/documents/generate` | Generate documents for a policy |
| GET | `/v1/policies/{policyId}/documents` | List generated documents for a policy |
| GET | `/v1/policies/{policyId}/documents/{documentId}` | Download a generated policy document |
## Workflow
1. **Upload a template** — upload a DOCX file containing smart tags to `POST /v1/form-templates`
2. **Inspect smart tags** — call `GET /v1/form-templates/{templateId}/smart-tags` to see which tags the system found in your template
3. **Generate a document** — call the generate endpoint for a quote or policy. The system resolves all smart tags against the entity data and produces a PDF
4. **Download the result** — retrieve the generated PDF via the document download endpoint
## Smart Tags
Every field you define in your configuration automatically gets a corresponding smart tag. When you add a field (e.g., `insuredName`), its smart tag becomes immediately available for use in templates. The smart tags endpoint on a template lets you verify that all tags in your template map to configured fields.
A dedicated configuration endpoint will also be available for listing all smart tags across your company, independent of any specific template:
| Method | Endpoint | Description |
| ------ | ---------------- | ---------------------------------------------- |
| GET | `/v1/smart-tags` | List all available smart tags for your company |
## Related Resources
* [Configuration API](/api-v1-reference/configuration/overview) — define the fields that power smart tags
* [Quotes API](/api-v1-reference/quotes/overview) — create quotes to generate documents for
* [Policy API](/api-v1-reference/policies/overview) — generate documents for bound policies
* [Roadmap](/api-v1-reference/roadmap) — overall API direction
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/event-financials/overview
The Event Financials API allows you to manage financial reserves for FMV1 events (claims and incidents).
***
## API Endpoints
### Reserves & Totals
* **[Update Expected Totals](/api-reference/field-model-events/update-expected-totals)** - Set expected total (reserve) for a financial category
***
## Amount Conventions
The PATCH expected-totals endpoint accepts amounts in **dollars** (not cents), matching the legacy endpoint convention.
***
## Reserves vs Expected Totals
* **Expected Total**: The anticipated total cost for a category (set by user/adjuster)
* **Reserves**: Calculated as `expectedTotal - paid - owed`
***
## Permissions
| Operation | Permission |
| ---------------------- | ----------------------------------- |
| Update Expected Totals | `claim:update` or `incident:update` |
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/events/overview
The Field Model V1 Events API allows you to manage events (claims and incidents) with company-configured dynamic fields. Unlike the standard Events API where fields are fixed, Field Model V1 companies define their own fields per entity type — the set of available fields is configured per company.
**Key Concepts:**
* Events have **two types**: `claim` and `incident`. Permissions are type-specific.
* Fields are **dynamically defined** per company. Use the [Configuration endpoint](#configuration) to discover available fields and their types.
* The request body for create and update is a **flat JSON object** where keys are field `referenceId`s (e.g., `lossDescription`, `lossDate`).
* Responses include a `fieldModelV1Data` object containing all field values (including base fields like `eventType` and `eventCoverageType`).
* Updates are **full replacements** — include all fields you want the event to have, not just the changed ones.
***
## Base Fields
These fields are handled specially by the API:
| Field | Required | Description |
| ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `eventType` | Yes | `Claim` or `Incident` (case-insensitive) |
| `eventCoverageType` | Yes | Coverage type name string (e.g. `"Professional Liability"`, `"Board Defense"`) |
| `eventInsureds` | Yes | Array of exposure IDs |
| `eventStatus` | No | `Open` (default) or `Closed` (case-insensitive) |
| `eventReferenceId` | No | Auto-generated if omitted |
| `policyId` | No | Associated policy ID. Accepted at the top level of the request body for backwards compatibility; stored internally on the `eventPolicy` Join field inside `fieldModelV1Data`. Responses surface it both at the top level (`policyId`) and inside `fieldModelV1Data.eventPolicy`. |
***
## Configuration
Call `GET /v1/events/configuration` to get a JSON Schema of available fields for your company. The schema includes:
* **Field types:** `string`, `number`, `boolean`, `object`
* **Option Set fields:** include an `enum` array of valid values
* **Required fields:** listed in the `required` array
***
## Field Types
| FMV1 Type | JSON Type | Description |
| ---------- | -------------------- | ------------------------------------------------------------------------------- |
| Text | `string` | Free-text string |
| Number | `number` | Numeric value |
| Boolean | `boolean` | True/false |
| Option Set | `string` or `number` | Constrained to enum values |
| Date | `object` | `{ "date": "YYYY-MM-DD", "timezone": "America/New_York" }` — not a plain string |
| Object | `object` | Nested object |
***
## API Endpoints
* **[Get Configuration](/api-reference/field-model-events/get-event-configuration)** - JSON Schema of available fields
* **[Create Event](/api-reference/field-model-events/create-event)** - Create a new event
* **[List Events](/api-reference/field-model-events/list-events)** - Paginated list with filtering and sorting
* **[Get Event](/api-reference/field-model-events/get-event)** - Retrieve a single event by ID
* **[Update Event](/api-reference/field-model-events/update-event)** - Full replacement update (PUT)
* **[Delete Event](/api-reference/field-model-events/delete-event)** - Delete with type-based permission
See also: **[Event Financials](/api-v1-reference/event-financials/overview)** for reserves and expected totals endpoints.
***
## Permissions
Permissions are **type-specific** for create, update, and delete operations.
| Operation | Required Permission |
| ----------------- | --------------------------------------------------- |
| Get Configuration | `company.event:export` |
| List Events | `company.event:export` |
| Get Event | `company.event:export` |
| Create Event | `company.claim:create` or `company.incident:create` |
| Update Event | `claim:update` or `incident:update` |
| Delete Event | `company.claim:delete` or `company.incident:delete` |
***
## Example Create Request
```json theme={null}
{
"eventType": "Claim",
"eventCoverageType": "Professional Liability",
"eventInsureds": ["550e8400-e29b-41d4-a716-446655440200"],
"policyId": "550e8400-e29b-41d4-a716-446655440100",
"lossDescription": "Water damage to building",
"lossDate": { "date": "2025-01-10", "timezone": "America/New_York" }
}
```
## Example Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440300",
"companyId": "550e8400-e29b-41d4-a716-446655440000",
"policyId": "550e8400-e29b-41d4-a716-446655440100",
"lawsuitId": null,
"fieldModelV1Data": {
"eventType": "Claim",
"eventCoverageType": "Professional Liability",
"eventPolicy": "550e8400-e29b-41d4-a716-446655440100",
"lossDescription": "Water damage to building",
"lossDate": { "date": "2025-01-10", "timezone": "America/New_York" }
},
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "google-oauth2|123456789",
"updatedAt": null,
"updatedBy": null
}
```
The top-level `policyId` and `fieldModelV1Data.eventPolicy` always reflect the same value — `policyId` is a convenience alias preserved for backwards compatibility.
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/exposures/overview
The Field Model V1 Exposures API allows you to manage exposures with company-configured dynamic fields. Unlike the standard Exposures API where fields are fixed, Field Model V1 companies define their own fields per entity type — the set of available fields is configured per company.
**Key Concepts:**
* Fields are **dynamically defined** per company. Use the [Configuration endpoint](#configuration) to discover available fields and their types.
* The request body for create and update is a **flat JSON object** where keys are field `referenceId`s (e.g., `exposureName`, `numberOfEmployees`).
* Responses include a `fieldModelV1Data` object containing all field values (including base fields like `exposureName` and `exposureType`).
* Updates are **full replacements** — include all fields you want the exposure to have, not just the changed ones.
***
## Configuration
Call `GET /v1/exposures/configuration` to get a JSON Schema of available fields for your company. The schema includes:
* **Field types:** `string`, `number`, `boolean`, `object`
* **Option Set fields:** include an `enum` array of valid values
* **Required fields:** listed in the `required` array
***
## Field Types
| FMV1 Type | JSON Type | Description |
| ---------- | -------------------- | -------------------------- |
| Text | `string` | Free-text string |
| Number | `number` | Numeric value |
| Boolean | `boolean` | True/false |
| Option Set | `string` or `number` | Constrained to enum values |
| Object | `object` | Nested object |
***
## API Endpoints
* **[Get Configuration](/api-reference/field-model-exposures/get-exposure-configuration)** - JSON Schema of available fields
* **[Create Exposure](/api-reference/field-model-exposures/create-exposure)** - Create a new exposure
* **[List Exposures](/api-reference/field-model-exposures/list-exposures)** - Paginated list with filtering and sorting
* **[Get Exposure](/api-reference/field-model-exposures/get-exposure)** - Retrieve a single exposure by ID
* **[Update Exposure](/api-reference/field-model-exposures/update-exposure)** - Full replacement update (PUT)
* **[Delete Exposure](/api-reference/field-model-exposures/delete-exposure)** - Soft delete
***
## Permissions
| Operation | Required Permission |
| ----------------- | ------------------------ |
| Get Configuration | `company.insured:read` |
| List Exposures | `company.insured:read` |
| Get Exposure | `company.insured:read` |
| Create Exposure | `company.insured:create` |
| Update Exposure | `insured:update` |
| Delete Exposure | `insured:delete` |
***
## Filtering
| Parameter | Type | Description |
| -------------- | ---------------------- | --------------------------------------------------------------------- |
| `id` | `string` or `string[]` | Filter by exposure ID (single or array) |
| `exposureType` | `string` | Filter by exposure type |
| `entityType` | `string` | **Deprecated.** Alias for `exposureType` — use `exposureType` instead |
| `filterText` | `string` | Text search across exposure name |
***
## Sorting
| Value | Description |
| -------------- | ---------------------------------------- |
| `createdAt` | Sort by creation date (default) |
| `updatedAt` | Sort by last update date |
| `exposureName` | Sort by exposure name |
| `exposureType` | Sort by exposure type |
| `name` | **Deprecated.** Alias for `exposureName` |
| `entityType` | **Deprecated.** Alias for `exposureType` |
Use the `sortDirection` parameter (`asc` or `desc`) to control sort order.
***
## Example Create Request
```json theme={null}
{
"exposureName": "Acme Corporation",
"exposureType": "business",
"numberOfEmployees": 150,
"riskLevel": "Medium"
}
```
## Example Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"companyId": "550e8400-e29b-41d4-a716-446655440000",
"fieldModelV1Data": {
"exposureName": "Acme Corporation",
"exposureType": "business",
"numberOfEmployees": 150,
"riskLevel": "Medium"
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": null,
"createdBy": "google-oauth2|123456789",
"updatedBy": null
}
```
# Object Primitives
Source: https://docs.aiinsurance.io/api-v1-reference/object-primitives/overview
Built-in object types used as field values across FMV1 create/update payloads (Address, CoverageLimit, Currency, Date, QuoteBindError).
Object primitives are five built-in object shapes that FMV1 fields can be typed as. Unlike custom objects (which you define in your configuration spreadsheet), object primitives have a **fixed structure across every company** and are recognized natively by the rating engine, snapshots, and bind logic.
You will encounter object primitives whenever a field's `fieldType` in your configuration is one of:
* `Object: Address`
* `Object: CoverageLimit`
* `Object: Currency`
* `Object: Date`
* `Object: QuoteBindError`
***
## Required-completeness rule
If an object-primitive field is **provided** in a create/update payload, **every sub-field listed below is required**. Partial values are rejected with HTTP `400` and a problem code naming the offending sub-field:
```json theme={null}
{
"error": {
"code": "InvalidFieldModelV1Data",
"message": "Field 'mailingAddress' is missing required sub-field 'county'"
}
}
```
**The rule only fires when the parent field is provided.** Omitting the field entirely is unchanged — object-primitive fields can still be optional at the field-definition level.
**What counts as missing:** `null`, `undefined`, or empty string (`""`). Numeric `0` and Boolean `false` are valid values. Whitespace-only strings (e.g. `" "`) currently slip past this validator — trim sub-field strings client-side before submitting.
**Custom objects keep their existing rules.** Sub-fields of a custom object follow each sub-field's own `requiredCondition` from your configuration; only object primitives are strict-by-default.
This rule applies to every FMV1 external write endpoint:
* `POST` / `PUT` exposures, events, quotes
* `POST` Basic Policies
* All segmented policy transactions (`new-business`, `endorse`, `renew`)
* `POST` / `PUT` custom objects (including an object-primitive sub-field nested inside a custom object)
***
## Address
Structured postal address. Used wherever a property, mailing, or risk location appears in your field model.
| Sub-field | Type | Description |
| --------- | ------ | ---------------------------------------------------------------------------- |
| `street` | string | Street number and route (e.g. `"350 5th Avenue"`) |
| `city` | string | City or locality |
| `state` | string | State or first-order administrative region. US: 2-letter postal code |
| `county` | string | County or second-order administrative area |
| `country` | string | Country name |
| `zipCode` | string | Postal / zip code as a JSON string. Always quoted (`"02140"`, never `02140`) |
```json theme={null}
{
"mailingAddress": {
"street": "350 5th Avenue",
"city": "New York",
"state": "NY",
"county": "New York County",
"country": "United States",
"zipCode": "10001"
}
}
```
**`zipCode` must be a JSON string, never a number.** JSON numbers cannot represent leading zeros — `02140` parses as `2140`, silently corrupting the ZIP. The API rejects numeric `zipCode` values with `400`:
```json theme={null}
{
"error": {
"code": "InvalidAddressZipCode",
"message": "Field 'mailingAddress.zipCode' must be a string. JSON numbers cannot preserve leading-zero ZIP codes (e.g. \"02109\" parses as 2109); send the value as a string. Got number 2109."
}
}
```
This is the most common failure when payloads are generated from spreadsheets, OpenAPI codegen with the wrong type, or LLMs that "helpfully" unquote numeric-looking strings — always quote ZIP codes in your payload.
If your upstream data does not include `county`, call [`GET /api/external/companies/{companyId}/resolve-address`](/api-v1-reference/address-tools/resolve-address) first to derive a complete address before submitting.
***
## CoverageLimit
A single coverage limit pair: a name and a monetary amount.
| Sub-field | Type | Description |
| --------------------- | ------ | ------------------------------------------------------------------------ |
| `coverageLimitName` | string | Display name (e.g. `"Per Occurrence"`, `"Aggregate"`) |
| `coverageLimitAmount` | number | Limit value in the policy's currency. `0` is valid (e.g. excluded peril) |
```json theme={null}
{
"perOccurrenceLimit": {
"coverageLimitName": "Per Occurrence",
"coverageLimitAmount": 1000000
}
}
```
***
## Currency
A monetary value with its currency code.
| Sub-field | Type | Description |
| --------- | ------ | ----------------------------------------------------------------------------------- |
| `value` | number | Numeric amount. `0` is a valid value |
| `code` | string | ISO 4217 currency code (e.g. `"USD"`, `"GBP"`, `"EUR"`). Empty strings are rejected |
```json theme={null}
{
"annualPremium": {
"value": 12500,
"code": "USD"
}
}
```
***
## Date
A calendar date with an explicit timezone. The API accepts two input shapes and stores both in the canonical DMY form.
| Sub-field | Type | Description |
| ---------- | ------- | ------------------------------------------------------------- |
| `day` | integer | Day of month, 1-based (1–31) |
| `month` | integer | Month, 1-based (1=January, 12=December) |
| `year` | integer | Four-digit calendar year |
| `timezone` | string | IANA timezone identifier (e.g. `"America/New_York"`, `"UTC"`) |
```json theme={null}
{
"policyEffectiveDate": {
"day": 15,
"month": 3,
"year": 2026,
"timezone": "America/New_York"
}
}
```
You may also submit the ISO form on input — the API canonicalizes it to the DMY form before storage:
```json theme={null}
{
"policyEffectiveDate": {
"date": "2026-03-15",
"timezone": "America/New_York"
}
}
```
`timezone` is required in both shapes. Responses always use the DMY form.
***
## QuoteBindError
A single bind-time error surfaced on a quote that failed to bind. The bind endpoint populates `quoteBindErrors` (an Object List of these) on the quote when bind fails; you generally do not write this directly.
| Sub-field | Type | Description |
| --------- | ------ | ---------------------------------------------- |
| `message` | string | Human-readable description of the bind failure |
```json theme={null}
{
"quoteBindErrors": [
{ "message": "Effective date is in the past" },
{ "message": "Coverage limit exceeds underwriter authorization" }
]
}
```
***
## Cardinality
Any of these object primitives can appear as a single value or as a list, depending on how the field is configured. List-cardinality fields enforce the same required-completeness rule **per array element** — each item must be a complete object primitive.
```json theme={null}
{
"additionalLocations": [
{
"street": "1 Main St",
"city": "Cambridge",
"state": "MA",
"county": "Middlesex County",
"country": "United States",
"zipCode": "02140"
},
{
"street": "500 Boylston St",
"city": "Boston",
"state": "MA",
"county": "Suffolk County",
"country": "United States",
"zipCode": "02116"
}
]
}
```
***
## Related
* [Address resolution endpoint](/api-v1-reference/address-tools/resolve-address) — derive a complete `Address` (including `county`) from a freeform input string.
* [V1 API Changelog](/api-v1-reference/changelog) — the strict-validation rule was rolled out on 2026-04-28.
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/overview
## Overview
Welcome to the AI Insurance V1 API documentation. The V1 API provides a modern, configuration-driven interface for managing your insurance operations — exposures, events, policies, quotes, and custom objects — all backed by the flexible Field Model V1 system.
**API Resources:**
* **[Exposures](/api-v1-reference/exposures/overview)** — Create and manage insured entities with configurable fields
* **[Events](/api-v1-reference/events/overview)** — Create and manage claims and incidents with configurable fields
* **[Policies](/api-v1-reference/policies/overview)** — Transaction-based policy lifecycle (new business, endorsements, cancellations, reinstatements, renewals) with version history, earned premium reporting, and bordereau export
* **[Quotes](/api-v1-reference/quotes/overview)** — Create and manage quotes, bind quotes to create policies, and send quotes to recipients
* **[Custom Objects](/api-v1-reference/custom-objects/overview)** — Define and manage configurable entity types with typed relationships between objects
* **[Configuration Management](/api-v1-reference/configuration/overview)** — Programmatic import, export, validation, and diff of company configuration via spreadsheets
See the **[Roadmap](/api-v1-reference/roadmap)** for upcoming capabilities including submissions, rating, document generation, and submission parsing.
***
## Getting Started
### Base URL
All API endpoints are relative to your AI Insurance instance base URL:
```
https://app.aiinsurance.io
```
### Route Prefix
All V1 API endpoints are served under the `/api/v1/external/` path prefix. If you're looking for legacy API endpoints, those are under `/api/external/` (without the `v1` segment) — see the [Legacy API Reference](/api-legacy-reference/overview).
### Authentication
All API requests require authentication using an API key. Include your API key in the request headers:
```bash theme={null}
Authorization: YOUR-API-KEY
```
To generate an API key, see [Generating API Keys](/api-v1-reference/authentication).
***
## Configuration-Driven Fields
V1 API entities use configurable fields defined through the Field Model system. Each entity type (exposures, events, policies) has a `/configuration` endpoint that returns the available fields, their types, and validation rules for your company.
Always call the configuration endpoint first to understand what fields are available before creating or updating entities.
### Example: Check Available Fields
```bash theme={null}
curl -X GET \
"https://app.aiinsurance.io/api/v1/external/companies//exposures/configuration" \
-H "Authorization: "
```
***
## Key Capabilities
Beyond basic CRUD, the V1 API provides several deeper capabilities:
* **Transaction-based policy lifecycle** — Policies are managed through immutable transactions (new business, endorse, cancel, reinstate, renew) rather than direct mutation. Each transaction produces a new policy version, giving you a complete audit trail. See [Policy Concepts](/api-v1-reference/policies/concepts) and the [Lifecycle Walkthrough](/api-v1-reference/policies/lifecycle-walkthrough).
* **Earned premium & bordereau** — Calculate earned premium at the individual policy, list, or aggregate level. Export bordereau reports for bulk policy transaction data.
* **Quote-to-policy binding** — Bind a quote to convert it into a policy, or send quotes directly to recipients.
* **Custom object relationships** — Link custom objects to each other with typed relationships (one-to-one, one-to-many, many-to-one, many-to-many).
* **Spreadsheet-based configuration** — Generate configuration templates, export current configuration, validate proposed changes, compare diffs, and import updates — all programmatically.
***
## Quick Start Example
Here's a simple example to create an exposure:
```bash theme={null}
curl -X POST \
"https://app.aiinsurance.io/api/v1/external/companies//exposures" \
-H "Authorization: " \
-H "Content-Type: application/json" \
-d '{
"exposureType": "your-exposure-type",
"fields": {
"name": "Example Insured",
"email": "example@test.com"
}
}'
```
***
## Audit Logging
All external API calls are automatically logged for audit and debugging purposes. The audit log captures request details, response status, and timing information.
### Batch ID for Request Correlation
When making multiple related API calls, you can include an optional `batchId` field in the request body of any mutation endpoint (POST, PUT, PATCH, DELETE). This allows you to correlate and query related requests later.
**Key points:**
* `batchId` is a pass-through field — it's not validated or part of the request schema
* Include it at the root level of your request body
* Use any string value that helps you identify related requests (e.g., UUID, timestamp, job ID)
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/parsing/overview
Extract structured data from unstructured insurance documents
**Planned** — Submission parsing endpoints are being added to the v1 API. See the [Roadmap](/api-v1-reference/roadmap) for overall API direction.
The Submission Parsing API will provide AI-powered extraction of structured data from unstructured insurance documents. Upload an application, loss run, or other document and receive structured field data that can be fed directly into the transaction APIs.
## Key Concepts
* **Application parsing** — extract structured quote fields from ACORD forms, custom applications, and other submission documents
* **Loss history parsing** — extract structured loss history from loss run documents, focused on tabular financial data
* **Confidence scores** — each extracted field includes a confidence score so your workflow can decide what needs manual review
## Planned Endpoints
| Method | Endpoint | Description |
| ------ | ------------------------------------ | ----------------------------------------------------- |
| POST | `/v1/submissions/parse/application` | Parse an application into structured quote fields |
| POST | `/v1/submissions/parse/loss-history` | Parse loss run documents into structured loss history |
| POST | `/v1/submissions/parse` | Best-effort parse of any document type |
## How It Will Work
### Application Parsing
1. Upload an application document (ACORD form, custom application PDF)
2. The system extracts structured field data matching your company's configured quote fields
3. The response includes extracted fields with confidence scores
4. Feed the results into `POST /v1/quotes` to create a pre-populated quote, or into the policy transaction APIs for endorsements and renewals
### Loss History Parsing
1. Upload a loss run document
2. The system extracts structured loss history focused on tabular financial data
3. The response includes extracted loss history with confidence scores
4. Feed the results into a submission for underwriting review
### General Parsing
1. Upload any insurance document
2. The system determines the document type and extracts whatever structured data it can
3. Feed the results into a submission for review and processing
## Example: Automated Intake Workflow
Submission parsing composes with the rest of the v1 API to support automated intake:
1. **Parse** an incoming application → structured fields
2. **Create a quote** from the parsed fields → `POST /v1/quotes`
3. **Rate** the quote → `POST /v1/quotes/{quoteId}/rate`
4. **Review** — use confidence scores to flag fields for manual review
5. **Bind** → `POST /v1/quotes/{quoteId}/bind`
## Related Resources
* [Quotes API](/api-v1-reference/quotes/overview) — create quotes from parsed application data
* [Events API](/api-v1-reference/events/overview) — create events from parsed loss run data
* [Roadmap](/api-v1-reference/roadmap) — overall API direction
# Basic Policies Overview
Source: https://docs.aiinsurance.io/api-v1-reference/policies/basic-overview
Simple flat-shape CRUD for policies that don't need transaction history
The Basic Policies API is a **simplified way of managing policies in the app** — flat-shape CRUD over policies with company-configured dynamic fields. Use it when you don't need the temporal versioning, segments, or earned-premium calculations of the [transaction-based Policy API](/api-v1-reference/policies/overview).
**Key Concepts:**
* Fields are **dynamically defined** per company. Use the [Configuration endpoint](#configuration) to discover available fields and their types.
* The request body for create is a **flat JSON object** where keys are field `referenceId`s (e.g., `policyNumber`, `policyStartDate`, `policyType`).
* Exposures are **nested inline** in the policy — each exposure is an object in the `exposures` array, with an `id` referencing an existing exposure record.
* Responses include a `fieldModelV1Data` object containing all field values plus the nested `exposures` array.
***
## When to use Basic vs Transaction-Based Policies
| Use case | API |
| ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| Simple data ingestion, policies that won't be modified after creation, no audit trail needed | **Basic Policies** |
| Endorsements, cancellations, reinstatements, renewals, earned-premium reporting, full audit trail | [Transaction-Based Policies](/api-v1-reference/policies/overview) |
Both APIs share the same underlying storage and configuration — they're alternative write paths over the same policy records.
***
## Configuration
Call [`GET /v1/policies/configuration`](/api-reference/field-model-policies/get-policies-configuration) to get a JSON Schema of the available policy and exposure fields for your company. The same endpoint drives both the Basic and the Transaction-Based Policy APIs — one configuration, shared across both.
***
## API Endpoints
* **Get Configuration** — `GET /v1/policies/configuration`
* **Create Policy** — `POST /v1/policies`
* **Bind Quote to Create Policy** — `POST /v1/quotes/{quoteId}/bind` (creates a Basic Policy from an existing quote)
* **List Policies** — `GET /v1/policies` with filtering, sorting, pagination
* **Get Policy** — `GET /v1/policies/{policyId}`
* **Delete Policy** — `DELETE /v1/policies/{policyId}` (soft delete)
***
## Permissions
| Operation | Required Permission |
| ----------------- | ----------------------- |
| Get Configuration | `company.policy:read` |
| List Policies | `company.policy:read` |
| Get Policy | `company.policy:read` |
| Create Policy | `company.policy:create` |
| Bind Quote | `company.quote:create` |
| Delete Policy | `policy:delete` |
***
## Filtering
| Parameter | Type | Description |
| ------------------------ | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | `string` or `string[]` | Filter by policy ID (single or array). |
| `policyNumberFilterText` | `string` | Case-insensitive substring match against `policyNumber` only. Does not search any other field. |
| `filters` | `FieldModelV1ListFilter[]` | Structured per-field filters against any FMV1 field or system column. Combined with AND semantics. See [Filters](#filters-structured-field-matching) below. |
### Filters: structured field matching
Each item in `filters` is an object with `fieldReferenceId`, `fieldType`, `operator`, and a `value` (plus `valueTo` for `between` operators and `systemColumn` for `systemUser` / `systemDate`). The set of operators and the shape of `value` depend on `fieldType`.
Supported field types and their operators:
| `fieldType` | Operators | `value` shape |
| ----------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------- |
| `text` | `matches`, `contains`, `doesNotContain` | string |
| `optionSet` | `in` | string\[] (allowed option keys) |
| `number` | `equals`, `greaterThan`, `lessThan`, `between` | number (+ `valueTo` for `between`) |
| `boolean` | `equals` | boolean |
| `date` | `on`, `before`, `after`, `between` | `{ year, month, day }` (+ `valueTo` for `between`) |
| `currency` | `equals`, `greaterThan`, `lessThan`, `between` | number (+ `valueTo` for `between`) |
| `address` | `contains` | string (substring across street/city/state/zip) |
| `join` | `in` | string\[] (allowed linked-entity IDs) |
| `textList` / `numberList` / `addressList` | `listIncludes` | one item value of the list element type |
| `optionSetList` | `listIn`, `listAll`, `listExcludes` | string\[] |
| `systemUser` | `in` | string\[] + `systemColumn: "createdBy" \| "updatedBy"` |
| `systemDate` | `on`, `before`, `after`, `between` | `{ year, month, day }` + `systemColumn: "createdAt" \| "updatedAt"` |
Example: policies created after Jan 1 2026 whose `policyStatus` is `active`:
```json theme={null}
[
{
"fieldReferenceId": "policyStatus",
"fieldType": "optionSet",
"operator": "in",
"value": ["active"]
},
{
"fieldReferenceId": "createdAt",
"fieldType": "systemDate",
"operator": "after",
"value": { "year": 2026, "month": 1, "day": 1 },
"systemColumn": "createdAt"
}
]
```
***
## Sorting
| Value | Description |
| ----------- | ------------------------------- |
| `createdAt` | Sort by creation date (default) |
| `updatedAt` | Sort by last update date |
| `number` | Sort by policy number |
Use the `sortDirection` parameter (`asc` or `desc`) to control sort order.
***
## Example Create Request
Before creating a policy, create any exposures it references via the [Exposures API](/api-v1-reference/exposures/overview) — `primaryInsured` and each entry in `exposures[].id` must point to an existing exposure record.
```json theme={null}
{
"policyNumber": "POL-2026-0001",
"policyStartDate": { "date": "2026-01-01", "timezone": "America/New_York" },
"policyEndDate": { "date": "2027-01-01", "timezone": "America/New_York" },
"policyEffectiveDate": { "date": "2026-01-01", "timezone": "America/New_York" },
"policyType": "generalLiability",
"policyTimeZone": "America/New_York",
"primaryInsured": "550e8400-e29b-41d4-a716-446655440010",
"exposures": [
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"exposureName": "Acme Corporation",
"exposureType": "business"
}
]
}
```
Additional company-configured fields (custom text, number, option-set, or object fields defined in your FMV1 configuration) may be included alongside the standard fields above.
### 201 Created
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440001"
}
```
## Example Get Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "550e8400-e29b-41d4-a716-446655440000",
"fieldModelV1Data": {
"policyNumber": "POL-2026-0001",
"policyStartDate": { "year": 2026, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyEndDate": { "year": 2027, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyEffectiveDate": { "year": 2026, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyType": "generalLiability",
"policyTimeZone": "America/New_York",
"primaryInsured": "550e8400-e29b-41d4-a716-446655440010",
"exposures": [
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"exposureName": "Acme Corporation",
"exposureType": "business"
}
]
},
"createdAt": "2026-01-15T10:30:00.000Z",
"updatedAt": null,
"createdBy": "google-oauth2|123456789",
"updatedBy": null
}
```
Date-typed fields (`policyStartDate`, `policyEndDate`, `policyEffectiveDate`) are canonicalized on write from the `{ date: "YYYY-MM-DD", timezone }` input form to the internal `{ day, month, year, timezone }` form shown in responses.
# Concepts
Source: https://docs.aiinsurance.io/api-v1-reference/policies/concepts
How transactions, deltas, segments, and versions work in the Policy API
This page explains the core data model behind the transaction-based Policy API. Understanding these concepts will help you predict how the API behaves when you create, endorse, cancel, and reinstate policies.
## Transaction Model
Every change to a policy is recorded as an immutable **transaction**. Transactions are the single source of truth — policy state is always derived from them, never authored directly.
Define your fields, option sets, and exposure types via the [Configuration API](/api-v1-reference/configuration/overview).
`POST /transaction/new-business` creates a policy with initial state covering the full term.
`POST /{policyId}/transaction/endorse` modifies the policy — add exposures, change field values, adjust coverage.
`POST /{policyId}/transaction/cancel` cancels the policy from a specified date.
`POST /{policyId}/transaction/reinstate` reinstates a cancelled policy.
`POST /transaction/renew` starts a new policy term linked to the previous one.
### Transaction Types
Creates the policy. The effective date is the policy start date. Produces one segment covering the full term.
Modifies policy state from a given effective date. Accepts an array of field-level deltas. May split existing segments or merge them if the change aligns state across periods.
Sets `policyStatus` to `"cancelled"` from the cancellation date through end of term. Also sets `fullTermPolicyInfo.policyEarlyTerminationDate` to the cancellation date. Optionally accepts billing-only deltas (e.g., short-rate penalties).
Sets `policyStatus` back to `"active"` from the reinstatement date. Clears `fullTermPolicyInfo.policyEarlyTerminationDate`. Optionally accepts billing-only deltas (e.g., reinstatement fees).
Creates a new policy term linked to the previous via `previousPolicyId`. Accepts a full `fieldModelV1Data` payload — the caller provides the complete initial state for the new term.
### Effective Date vs Transaction Timestamp
Each transaction has two timestamps:
* **`effectiveDate`** — when the policy state changes. For an endorsement, this is when the new coverage begins. For a cancellation, this is when coverage ends.
* **`transactionTimestamp`** — when the business decision was made. Defaults to the current time, but can be set explicitly for imports (e.g., aligning to a bordereau booking date).
## Deltas
A **delta** is a single field-level change within a transaction. Endorsements carry one or more deltas — in two parallel arrays — that describe exactly what changed, where, and (for per-segment fields) for what date range.
### Two Delta Arrays
* **`deltas`** — per-segment changes. Each carries its own `startDate` and `endDate` within the policy term.
* **`fullTermDeltas`** — changes to cross-segment invariant fields (`fullTermPolicyBilling`, `fullTermPolicyInfo`, `fullTermPolicyRatingResponse`, `fullTermExposureRatingResponse`). No dates — the server applies them across the whole policy term.
The server rejects `fullTerm*` paths sent via `deltas` and non-`fullTerm*` paths sent via `fullTermDeltas`. At least one of the two arrays must be non-empty.
### Delta Structure
**Per-segment delta (`deltas`):**
| Field | Type | Description |
| ----------- | ------ | ----------------------------------------------- |
| `path` | string | Dot-notation path to a non-`fullTerm*` field |
| `action` | string | `Overwrite`, `Add`, or `Remove` |
| `value` | any | The new value, value to add, or value to remove |
| `startDate` | string | Start of the date range this change applies to |
| `endDate` | string | End of the date range this change applies to |
**Full-term delta (`fullTermDeltas`):**
| Field | Type | Description |
| -------- | ------ | ----------------------------------------------- |
| `path` | string | Dot-notation path into a `fullTerm*` field |
| `action` | string | `Overwrite`, `Add`, or `Remove` |
| `value` | any | The new value, value to add, or value to remove |
Dates are implicit on `fullTermDeltas` — the delta always spans `policyStartDate` → `policyEndDate`, because `fullTerm*` fields must be identical across every segment of a version.
### Delta Actions
#### Overwrite
Replace a scalar value or an entire object. This is the most common action.
```json theme={null}
{
"path": "policy.exposures[exp-1].bedCount",
"action": "Overwrite",
"value": 110
}
```
#### Add
Append to a collection. Uses **set semantics** — objects are matched by `id`, primitives by equality. If the value already exists, the delta is a no-op.
```json theme={null}
{
"path": "policy.exposures[exp-1].coveredSpecialties",
"action": "Add",
"value": "Neurology"
}
```
#### Remove
Remove from a collection. Same matching rules as Add. If the value is not present, the delta is a no-op.
```json theme={null}
{
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Remove",
"value": "Dr. Nguyen"
}
```
### Path Notation
Paths use dot-notation to target fields at any depth. Bracket syntax targets specific items in an array by their `id` field.
| Path | Targets |
| ---------------------------------- | --------------------------------------------------------------------------- |
| `policy.deductible` | A scalar field on the policy |
| `policy.exposures[exp-1].bedCount` | A field on a specific exposure |
| `policy.exposures` | The exposures collection itself (for Add/Remove of entire exposure objects) |
| `policy.fullTermPolicyBilling` | A cross-segment invariant (same value in every segment of the version) |
| `policy.policyStatus` | The policy status (used internally by Cancel/Reinstate) |
**Overwrite on an indexed path** (e.g., `policy.exposures[exp-1]`) replaces the entire exposure object. **Add on a collection path** (e.g., `policy.exposures`) appends an exposure. These are different operations targeting different levels.
### Example: Endorsement with Deltas
An endorsement to `POST /v1/policies/{policyId}/transaction/endorse` effective April 1 that adds a new exposure and updates billing:
```json theme={null}
{
"effectiveDate": "2025-04-01",
"deltas": [
{
"startDate": "2025-04-01",
"endDate": "2025-12-31",
"path": "policy.exposures",
"action": "Add",
"value": {
"id": "exp-2",
"exposureType": "OutpatientClinic",
"facilityName": "Greenfield West Clinic",
"bedCount": 0,
"coveredSpecialties": ["Dermatology", "Family Medicine"],
"namedPhysicians": ["Dr. Kim"]
}
}
],
"fullTermDeltas": [
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": {
"policyPremium": 98000,
"policyTaxes": 4900,
"policyFees": 500,
"policyGrandTotal": 103400
}
}
]
}
```
The exposure delta applies from April 1 through the end of the term and will split the existing segment at that boundary. The `fullTermPolicyBilling` delta lives under `fullTermDeltas` and is applied uniformly across the **full policy term** — no explicit dates because `fullTerm*` fields must be identical in every segment.
## Segments
A **segment** is a maximal contiguous date range where the policy state is identical.
**Segments are NOT one-to-one with transactions.** A single endorsement may split one segment into many. Backdated corrections can merge segments back together. Six transactions can produce two segments — or one.
### Segment Properties
Every version's segments satisfy three invariants:
* **No overlaps** — segments never share a date
* **Full coverage** — segments span the entire policy term with no gaps
* **No adjacent duplicates** — adjacent segments with identical state are automatically merged
### How Segments Change
A new policy starts with **one segment** covering the full term.
| # | Date Range | Exposures |
| - | -------------- | ------------------------ |
| 1 | Jan 1 – Dec 31 | Main Hospital (120 beds) |
An endorsement effective April 1 adds a satellite clinic, splitting the segment:
| # | Date Range | Exposures |
| - | -------------- | -------------------------------- |
| 1 | Jan 1 – Mar 31 | Main Hospital |
| 2 | Apr 1 – Dec 31 | Main Hospital + Satellite Clinic |
Two segments — different exposure counts on each side of the boundary.
A backdated correction adds the clinic to Jan–Mar too, making it match Apr–Dec:
| # | Date Range | Exposures |
| - | -------------- | -------------------------------- |
| 1 | Jan 1 – Dec 31 | Main Hospital + Satellite Clinic |
Three transactions, but only **one segment**. The correction converged per-segment state across the full term.
**Segments reflect the final state of the policy, not its change history.** The full audit trail is preserved in the transaction history.
## Versions
Each transaction produces a new policy **version**. A version is a complete snapshot — it contains the full set of segments representing the policy at that point in the transaction history.
| Property | Description |
| ----------------------- | ------------------------------------------ |
| `policyVersion` | Sequential integer (1, 2, 3, ...) |
| `transactionId` | The transaction that produced this version |
| `segments` | Complete set of segments for this version |
| `startDate` / `endDate` | Policy term boundaries |
You can query any historical version to see what the policy looked like after a specific transaction.
## How It Works
When you submit a transaction, the system:
1. **Loads the previous version** — gets the current segments
2. **Applies deltas** — applies each delta to all segments whose date range overlaps the delta's date range
3. **Normalizes** — produces deterministic JSON and computes a hash for each resulting segment
4. **Merges** — collapses adjacent segments with identical hashes into one
5. **Persists** — stores the new version with its segments
You don't need to understand the internal algorithm to use the API — just know that the system automatically handles segment splitting and merging based on the deltas you submit.
**No-op deltas are safe.** Adding a value that already exists or removing one that's already gone has no effect. This means a delta that spans a wide date range may change some segments and leave others untouched — the system handles it correctly.
## Premiums and Rating
**The API does not calculate premiums.** When you submit a transaction, you supply field values and billing totals yourself. The system stores what you send — it does not rate, pro-rate, or re-aggregate.
Policy financial data lives at two levels:
### Full-Term Billing
`fullTermPolicyBilling` is a **cross-segment invariant** — identical across every segment in a version. It contains the billing summary for the entire policy term: `policyPremium`, `policyTaxes`, `policyFees`, `policyGrandTotal`. Every endorsement should include a `fullTermPolicyBilling` delta spanning the full policy term to keep billing current.
### Per-Segment Rating
Each segment can carry its own rating data via `PolicyRatingResponse` (on the policy) and `ExposureRatingResponse` (on each exposure). These typically include:
* **`annualPremium`** — the premium as if that segment's state applied for the full year
* **`dailyProratedPremium`** — the daily premium rate for that segment's risk profile
Both values are **time-independent** — they describe the risk characteristics, not the segment's duration. Per-segment rating provides visibility into which exposures contribute how much premium over which time periods.
**`fullTermPolicyBilling` is not necessarily derivable from per-segment rates.** Full-term billing can include flat premium minimums, surplus lines taxes, policy fees, or other adjustments that are independent of per-segment rating. The `FullTermPolicyRatingResponse` (a separate cross-segment field) captures these aggregate rating details.
Callers don't *have* to pass per-segment field changes. You could submit endorsements that only modify `fullTermPolicyBilling` and leave per-segment data untouched. However, this reduces the system to **importing bordereau** — you'd know the billing changed, but not what policy details produced the change. Per-segment deltas capture the actual changing characteristics of the policy over time.
**Time-dependent per-segment values prevent merging.** If a per-segment field's value depends on segment duration (e.g. a total prorated premium for the time slice), segments with identical risk but different lengths will never merge. Use time-independent values like `annualPremium` and `dailyProratedPremium` instead. See [Merging and Time-Dependent Fields](#merging-and-time-dependent-fields) for details.
When using the application UI (not headless) with a rater configured, an aggregation rater automatically computes billing and rating totals across segments. Through the API, this is your responsibility.
## Worked Example
A medical facility policy (Greenfield Medical Center) for Jan 1 – Dec 31 with one exposure. This shows the core segment behaviors — splitting, maintaining, and merging — with the actual delta payloads. Each endorsement also includes a `fullTermPolicyBilling` update (omitted from the segment tables since it's the same in every segment).
Create the policy with initial state spanning the full term. Grand total: 89,750.
```json theme={null}
{
"policyStartDate": "2025-01-01",
"policyEndDate": "2025-12-31",
"fieldModelV1Data": {
"policy": {
"fullTermPolicyInfo": {
"policyStatus": "active",
"policyStartDate": { "year": 2025, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyEndDate": { "year": 2025, "month": 12, "day": 31, "timezone": "America/New_York" },
"primaryInsuredId": "exp-1"
},
"fullTermPolicyBilling": {
"policyPremium": 85000, "policyTaxes": 4250,
"policyFees": 500, "policyGrandTotal": 89750
},
"exposures": [{
"id": "exp-1",
"exposureType": "MedicalFacility",
"facilityName": "Greenfield Main Campus",
"bedCount": 120,
"coveredSpecialties": ["Cardiology", "Orthopedics", "General Surgery"],
"namedPhysicians": ["Dr. Patel", "Dr. Nguyen", "Dr. Hoffman"]
}]
}
}
}
```
**Segments:**
| # | Date Range | Exposures |
| - | -------------- | ------------------------------------ |
| 1 | Jan 1 – Dec 31 | Main Campus (120 beds, 3 physicians) |
A satellite clinic opens. The `Add` action appends a new exposure to the collection. Grand total increases to 103,400 (+13,650) — the additional exposure adds risk for the remaining 9 months.
```json theme={null}
{
"effectiveDate": "2025-04-01",
"deltas": [
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures",
"action": "Add",
"value": {
"id": "exp-2", "exposureType": "OutpatientClinic",
"facilityName": "Greenfield West Clinic", "bedCount": 0,
"coveredSpecialties": ["Dermatology", "Family Medicine"],
"namedPhysicians": ["Dr. Kim"]
}
}
],
"fullTermDeltas": [
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": { "policyPremium": 98000, "policyTaxes": 4900,
"policyFees": 500, "policyGrandTotal": 103400 }
}
]
}
```
**Segments:**
| # | Date Range | Exposures |
| - | -------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | Main Campus |
| 2 | Apr 1 – Dec 31 | Main Campus + West Clinic |
The original segment split at April — different exposure count on each side.
A new surgeon joins the main campus. Neurology added as a covered specialty. Grand total increases to 111,800 (+8,400) — the additional physician and expanded specialty coverage increase risk.
```json theme={null}
{
"effectiveDate": "2025-06-01",
"deltas": [
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Add", "value": "Dr. Okafor"
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].coveredSpecialties",
"action": "Add", "value": "Neurology"
}
],
"fullTermDeltas": [
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": { "policyPremium": 106000, "policyTaxes": 5300,
"policyFees": 500, "policyGrandTotal": 111800 }
}
]
}
```
**Segments:**
| # | Date Range | Physicians | Specialties |
| - | -------------- | ---------------------------------- | ----------------------------------------------- |
| 1 | Jan 1 – Mar 31 | Patel, Nguyen, Hoffman | Cardiology, Orthopedics, Surgery |
| 2 | Apr 1 – May 31 | Patel, Nguyen, Hoffman | Cardiology, Orthopedics, Surgery |
| 3 | Jun 1 – Dec 31 | Patel, Nguyen, Hoffman, **Okafor** | Cardiology, Orthopedics, Surgery, **Neurology** |
The Apr–Dec segment from version 2 split at the June boundary.
Internal audit reveals the physician change, bed reduction, and Neurology addition should all have been effective April 1, not June 1. A single endorsement corrects everything retroactively. Grand total decreases to 106,550 (-5,250) — the physician departure and bed reduction reduce risk, partially offset by Neurology covering a longer period.
```json theme={null}
{
"effectiveDate": "2025-04-01",
"deltas": [
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].bedCount",
"action": "Overwrite", "value": 110
},
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Remove", "value": "Dr. Nguyen"
},
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Add", "value": "Dr. Okafor"
},
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].coveredSpecialties",
"action": "Add", "value": "Neurology"
}
],
"fullTermDeltas": [
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": { "policyPremium": 101000, "policyTaxes": 5050,
"policyFees": 500, "policyGrandTotal": 106550 }
}
]
}
```
All four per-segment deltas span Apr 1 – Dec 31. The Jun–Dec segment **already had** beds=110, Nguyen removed, Okafor present, and Neurology — those deltas are no-ops there. Only Apr–May changes. After applying, Apr–May and Jun–Dec have converged to identical state. The system merges them:
**Segments:**
| # | Date Range | Beds | Physicians | Specialties |
| - | -------------- | ---- | ---------------------- | ------------------------------------------- |
| 1 | Jan 1 – Mar 31 | 120 | Patel, Nguyen, Hoffman | Cardiology, Orthopedics, Surgery |
| 2 | Apr 1 – Dec 31 | 110 | Patel, Hoffman, Okafor | Cardiology, Orthopedics, Surgery, Neurology |
**Four transactions, two segments.** The Apr–May / Jun–Dec boundary vanished — not because a transaction was reversed, but because the correction *converged the per-segment state* on both sides. `fullTermPolicyBilling` didn't affect the merge — it's the same in every segment.
For the complete 9-transaction walkthrough — including cancellation, reinstatement, transaction deletion, and both types of segment merging — see the [Lifecycle Walkthrough](/api-v1-reference/policies/lifecycle-walkthrough).
## Cancellation and Reinstatement
Cancel and reinstate are simpler than endorsements but follow the same segment mechanics. The system automatically generates the status and early termination date deltas.
* **Cancel** sets `policyStatus` to `"cancelled"` from the cancellation date through end of term and sets `fullTermPolicyInfo.policyEarlyTerminationDate` to the cancellation date. This typically splits the existing segment at the cancellation boundary.
* **Reinstate** sets `policyStatus` back to `"active"` from the reinstatement date and clears `fullTermPolicyInfo.policyEarlyTerminationDate`. If this makes the reinstated segment identical to its predecessor, they merge.
* Both optionally accept **billing-only deltas** (restricted to `fullTermPolicyBilling` paths) for short-rate penalties or reinstatement fees.
A cancel followed by a reinstate at the same date is **invisible in the final segments** — the policy returns to the same state it had before cancellation. Both transactions are preserved in the audit trail, but the derived segments are identical to the pre-cancellation version.
## Transaction Deletion
Only the **most recent** transaction on a policy can be deleted. Deleting a transaction:
* Rolls back to the prior version — the deleted transaction's segments are removed, and the previous version becomes current (no new version is created)
* Preserves the audit trail — the deleted transaction is archived, not erased
* Is irreversible through the API once deleted (the transaction can be re-created manually)
Transaction deletion undoes the most recent change. It does not allow arbitrary transaction removal from the middle of the history.
## Merging and Time-Dependent Fields
Segment merging compares the *entire* per-segment state, including rating. If any per-segment field's value depends on the segment's duration, two segments with identical risk profiles but different durations will never merge.
### The Problem
Suppose you store a `totalProratedPremium` that represents the premium for each segment's time slice. After a backdated correction converges two segments' structural data, they still can't merge:
| # | Date Range | Risk Profile | `totalProratedPremium` | Merge? |
| - | ------------------------- | ------------ | ---------------------- | ----------------- |
| A | Apr 1 – May 31 (61 days) | identical | 18,700 | ✗ — values differ |
| B | Jun 1 – Dec 31 (214 days) | identical | 65,500 | |
This is a chicken-and-egg problem: you can't compute the merged segment's prorated premium without knowing the merge will happen, but the merge can't happen while the values differ.
### The Solution Today
Use **time-independent** per-segment values. `annualPremium` and `dailyProratedPremium` describe the risk profile, not the duration. Two segments with the same risk produce the same values regardless of how many days each covers, so merging works naturally.
If you need to know the total premium for a specific segment's time span, derive it from the daily rate and the segment's date range after reading the policy — don't store it as a per-segment field.
### Looking Ahead
We are working on support for **calculated fields** — per-segment fields whose values are automatically derived after segment computation. This will allow fields like `totalProratedPremium` to be stored on segments without blocking merges, because the system will exclude them from the merge comparison and recompute them based on each segment's final date range.
# Lifecycle Walkthrough
Source: https://docs.aiinsurance.io/api-v1-reference/policies/lifecycle-walkthrough
A step-by-step trace through 9 transactions showing how segments evolve
This page traces a realistic policy through its full lifecycle — creation, multiple endorsements, backdated corrections, cancellation, reinstatement, and transaction deletion. Each step shows the request payload and resulting segments.
If you haven't read the [Concepts](/api-v1-reference/policies/concepts) page yet, start there for an introduction to transactions, deltas, and segments.
## Scenario
| | |
| ----------- | ----------------------------------------- |
| **Insured** | Greenfield Medical Center |
| **Line** | Professional Liability — Medical Facility |
| **Term** | January 1, 2025 – December 31, 2025 |
## Delta Actions Reference
| Action | Description | Matching |
| ------------- | -------------------------------------- | --------------------------------------- |
| **Overwrite** | Replace a scalar or entire object | N/A — overwrites |
| **Add** | Append to a collection (set semantics) | Objects by `id`, primitives by equality |
| **Remove** | Remove from a collection | Objects by `id`, primitives by equality |
## Premiums and Billing
Policy financial data lives at two levels: **per-segment rating** and **full-term billing**.
### Per-Segment Rating
Each segment carries its own rating data — a `PolicyRatingResponse` on the policy and an `ExposureRatingResponse` on each exposure. These typically include:
* **`annualPremium`** — the premium as if that segment's state applied for the full policy year
* **`dailyProratedPremium`** — the daily premium rate for that segment's risk profile
Both values are **time-independent** — they describe the risk characteristics of the segment, not its duration. This means two segments with identical risk produce the same rating values regardless of how many days each covers, which is what allows segment merging to work.
### Full-Term Billing
`fullTermPolicyBilling` is a **cross-segment invariant** — it's identical across every segment in a version. It contains the billing summary for the entire policy term:
```json theme={null}
"fullTermPolicyBilling": {
"policyPremium": 85000,
"policyTaxes": 4250,
"policyFees": 500,
"policyGrandTotal": 89750
}
```
Every endorsement should include a `fullTermPolicyBilling` delta with `startDate`/`endDate` spanning the **full policy term** (not just the endorsement effective date). This keeps the billing summary current.
**`fullTermPolicyBilling` is not necessarily derivable from per-segment rates.** Full-term billing can include flat premium minimums, surplus lines taxes, policy fees, or other adjustments that are independent of per-segment rating. The `FullTermPolicyRatingResponse` (a separate cross-segment field) captures these aggregate rating details.
### Minimal vs Full Tracking
Callers are not *required* to pass per-segment field changes. You could submit endorsements that only modify `fullTermPolicyBilling` and leave per-segment data untouched. However, this reduces the system to **importing transaction bordereau** — you'd know the billing changed, but not what policy details produced the change.
Per-segment deltas capture the *actual changing characteristics* of the policy over time: which exposures were added, which physicians changed, when beds were decommissioned. This is the difference between a ledger of billing events and a true temporal record of the policy.
### In This Walkthrough
Each transaction below includes structural per-segment deltas, per-segment `PolicyRatingResponse` and `ExposureRatingResponse` rating, and the `fullTermPolicyBilling` update. The segment tables include a **Policy Annualized Premium** column — notice that this per-segment rate typically does **not** match the `fullTermPolicyBilling.policyPremium` shown below each table.
***
## Creation
**Effective:** Jan 1 · **Version:** 1
Initial policy creation. One exposure (Main Campus), three named physicians.
```json Request theme={null}
{
"policyStartDate": "2025-01-01",
"policyEndDate": "2025-12-31",
"fieldModelV1Data": {
"policy": {
"policyStatus": "active",
"carrier": "National Indemnity Co",
"deductible": 25000,
"aggregateLimit": 5000000,
"fullTermPolicyInfo": {
"policyStatus": "active",
"policyStartDate": { "year": 2025, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyEndDate": { "year": 2025, "month": 12, "day": 31, "timezone": "America/New_York" },
"primaryInsuredId": "exp-1"
},
"ratingResponse": {
"annualPremium": 85000,
"dailyProratedPremium": 233
},
"fullTermPolicyBilling": {
"policyPremium": 85000,
"policyTaxes": 4250,
"policyFees": 500,
"policyGrandTotal": 89750
},
"exposures": [{
"id": "exp-1",
"exposureType": "MedicalFacility",
"facilityName": "Greenfield Main Campus",
"bedCount": 120,
"coveredSpecialties": ["Cardiology", "Orthopedics", "General Surgery"],
"namedPhysicians": ["Dr. Patel", "Dr. Nguyen", "Dr. Hoffman"],
"ratingResponse": {
"annualPremium": 85000,
"dailyProratedPremium": 233
}
}]
}
}
}
```
**Segments (1):**
| # | Date Range | Status | Exposures | Policy Annualized Premium |
| - | -------------- | ------ | ------------------------------------ | ------------------------- |
| 1 | Jan 1 – Dec 31 | active | Main Campus (120 beds, 3 physicians) | 85,000 |
**fullTermPolicyBilling:** Premium 85,000 · Taxes 4,250 · Fees 500 · Total 89,750
With a single full-year segment, the annualized premium matches the billing premium. This won't last.
## Endorsements
**Effective:** Apr 1 · **Version:** 2
A satellite clinic opens April 1. The new exposure is **Added** to the collection. The Apr–Dec segment gets updated rating reflecting the additional exposure. Jan–Mar rating is unchanged — the risk profile didn't change, only the segment's duration.
```json deltas theme={null}
[
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures",
"action": "Add",
"value": {
"id": "exp-2",
"exposureType": "OutpatientClinic",
"facilityName": "Greenfield West Clinic",
"bedCount": 0,
"coveredSpecialties": ["Dermatology", "Family Medicine"],
"namedPhysicians": ["Dr. Kim"],
"ratingResponse": {
"annualPremium": 19000,
"dailyProratedPremium": 52
}
}
},
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 104000, "dailyProratedPremium": 285 }
}
]
```
```json fullTermDeltas theme={null}
[
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": {
"policyPremium": 98000,
"policyTaxes": 4900,
"policyFees": 500,
"policyGrandTotal": 103400
}
}
]
```
**Segments (2):** `+1`
| # | Date Range | Exposures | Policy Annualized Premium |
| - | -------------- | ----------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | Main Campus | 85,000 |
| 2 | Apr 1 – Dec 31 | Main Campus + **West Clinic** | 104,000 |
**fullTermPolicyBilling:** Premium 98,000 · Taxes 4,900 · Fees 500 · Total 103,400
The annualized premiums are 85,000 and 104,000 — neither matches the billing premium of 98,000. The billing total reflects the blended cost across both periods plus a flat surplus lines assessment.
**Effective:** Jun 1 · **Version:** 3
A new surgeon (Dr. Okafor) joins the main campus June 1. Neurology added as a covered specialty. Both deltas use **Add** on nested exposure fields. Rating updated for Jun–Dec where the risk profile changed; Apr–May is unchanged.
```json deltas theme={null}
[
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Add",
"value": "Dr. Okafor"
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].coveredSpecialties",
"action": "Add",
"value": "Neurology"
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 118000, "dailyProratedPremium": 323 }
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 96000, "dailyProratedPremium": 263 }
}
]
```
```json fullTermDeltas theme={null}
[
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": {
"policyPremium": 106000,
"policyTaxes": 5300,
"policyFees": 500,
"policyGrandTotal": 111800
}
}
]
```
**Segments (3):** `+1`
| # | Date Range | Physicians | Specialties | Policy Annualized Premium |
| - | -------------- | ---------------------------------- | ----------------------------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | Patel, Nguyen, Hoffman | Cardiology, Orthopedics, Surgery | 85,000 |
| 2 | Apr 1 – May 31 | Patel, Nguyen, Hoffman | Cardiology, Orthopedics, Surgery | 104,000 |
| 3 | Jun 1 – Dec 31 | Patel, Nguyen, Hoffman, **Okafor** | Cardiology, Orthopedics, Surgery, **Neurology** | 118,000 |
**fullTermPolicyBilling:** Premium 106,000 · Taxes 5,300 · Fees 500 · Total 111,800
The Apr–Dec segment from version 2 split at the June boundary. Three different annualized rates (85k, 104k, 118k) but a single billing premium of 106k.
**Effective:** Jun 1 · **Version:** 4
Dr. Nguyen leaves the practice effective June 1. 10 beds decommissioned. Uses **Remove** on a primitive collection and **Overwrite** on a scalar.
```json deltas theme={null}
[
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Remove",
"value": "Dr. Nguyen"
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].bedCount",
"action": "Overwrite",
"value": 110
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 112000, "dailyProratedPremium": 307 }
},
{
"startDate": "2025-06-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 93000, "dailyProratedPremium": 255 }
}
]
```
```json fullTermDeltas theme={null}
[
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": {
"policyPremium": 101000,
"policyTaxes": 5050,
"policyFees": 500,
"policyGrandTotal": 106550
}
}
]
```
**Segments (3):** `unchanged`
| # | Date Range | Beds | Physicians | Policy Annualized Premium |
| - | -------------- | ------- | ---------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | 120 | Patel, Nguyen, Hoffman | 85,000 |
| 2 | Apr 1 – May 31 | 120 | Patel, Nguyen, Hoffman | 104,000 |
| 3 | Jun 1 – Dec 31 | **110** | Patel, Hoffman, Okafor | 112,000 |
**fullTermPolicyBilling:** Premium 101,000 · Taxes 5,050 · Fees 500 · Total 106,550
Same segment count — the boundaries didn't move, only the Jun–Dec data and rate changed. The annualized rate dropped from 118k to 112k reflecting fewer beds and one fewer physician.
**Effective:** Apr 1 · **Version:** 5
Internal audit reveals the bed decommissioning actually happened in April, not June. Dr. Nguyen's departure was also effective April 1. Dr. Okafor started in April too. Retroactive corrections applied.
```json deltas theme={null}
[
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].bedCount",
"action": "Overwrite",
"value": 110
},
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Remove",
"value": "Dr. Nguyen"
},
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].namedPhysicians",
"action": "Add",
"value": "Dr. Okafor"
},
{
"startDate": "2025-04-01", "endDate": "2025-05-31",
"path": "policy.ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 108000, "dailyProratedPremium": 296 }
},
{
"startDate": "2025-04-01", "endDate": "2025-05-31",
"path": "policy.exposures[exp-1].ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 89000, "dailyProratedPremium": 244 }
}
]
```
```json fullTermDeltas theme={null}
[
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": {
"policyPremium": 100000,
"policyTaxes": 5000,
"policyFees": 500,
"policyGrandTotal": 105500
}
}
]
```
**Segments (3):** `unchanged`
| # | Date Range | Beds | Physicians | Specialties | Policy Annualized Premium |
| - | -------------- | ------- | -------------------------- | ------------------------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | 120 | Patel, Nguyen, Hoffman | Cardiology, Orthopedics, Surgery | 85,000 |
| 2 | Apr 1 – May 31 | **110** | Patel, Hoffman, **Okafor** | Cardiology, Orthopedics, Surgery | 108,000 |
| 3 | Jun 1 – Dec 31 | 110 | Patel, Hoffman, Okafor | Cardiology, Orthopedics, Surgery, Neurology | 112,000 |
**fullTermPolicyBilling:** Premium 100,000 · Taxes 5,000 · Fees 500 · Total 105,500
The structural deltas span Apr 1 – Dec 31, but the Jun–Dec segment **already had** beds=110, Nguyen removed, and Okafor present — no-ops there. Only Apr–May changed. Segment 2's annualized rate is 108,000 (vs segment 3's 112,000) because it lacks Neurology.
**Setup for what's next:** Segments 2 and 3 now share the same beds, physicians, and exposures. They differ only in whether Neurology is a covered specialty — which also produces different annualized rates (108k vs 112k). One more endorsement that adds Neurology to segment 2 will converge both the structural data and the rating.
**Effective:** Apr 1 · **Version:** 6
Neurology coverage was contractually effective from the clinic opening date (April 1), not June 1 as originally recorded. Correction applied retroactively.
```json deltas theme={null}
[
{
"startDate": "2025-04-01", "endDate": "2025-12-31",
"path": "policy.exposures[exp-1].coveredSpecialties",
"action": "Add",
"value": "Neurology"
},
{
"startDate": "2025-04-01", "endDate": "2025-05-31",
"path": "policy.ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 112000, "dailyProratedPremium": 307 }
},
{
"startDate": "2025-04-01", "endDate": "2025-05-31",
"path": "policy.exposures[exp-1].ratingResponse",
"action": "Overwrite",
"value": { "annualPremium": 93000, "dailyProratedPremium": 255 }
}
]
```
```json fullTermDeltas theme={null}
[
{
"path": "policy.fullTermPolicyBilling",
"action": "Overwrite",
"value": {
"policyPremium": 101000,
"policyTaxes": 5050,
"policyFees": 500,
"policyGrandTotal": 106550
}
}
]
```
The Neurology delta adds it to Apr–May. Jun–Dec already has Neurology — no-op. The rating delta updates Apr–May's annualized rate from 108,000 to 112,000 to match Jun–Dec.
After applying, segments 2 and 3 have **identical per-segment state** — same structural data, same rating. The system merges them.
**Segments (2):** `-1`
| # | Date Range | Exposures | Specialties | Policy Annualized Premium |
| - | -------------- | ------------------------- | ----------------------------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | Main Campus | Cardiology, Orthopedics, Surgery | 85,000 |
| 2 | Apr 1 – Dec 31 | Main Campus + West Clinic | Cardiology, Orthopedics, Surgery, **Neurology** | 112,000 |
**fullTermPolicyBilling:** Premium 101,000 · Taxes 5,050 · Fees 500 · Total 106,550
**Key insight — endorsements can reduce segments.** This is not an undo. Six separate transactions produced only 2 segments. The Apr–May / Jun–Dec boundary was erased because corrections **converged both the structural data and the rating** on both sides. The annualized rates are 85k and 112k — the billing premium of 101k reflects neither.
## Cancellation and Reinstatement
**Effective:** Sep 1 · **Version:** 7
Greenfield is acquired by a hospital network with its own coverage. Policy cancelled effective September 1. The system generates the `policyStatus` delta internally — the caller only provides the cancellation date and updated billing.
```json Request theme={null}
{
"cancellationDate": "2025-09-01",
"fullTermDeltas": [
{
"path": "policy.fullTermPolicyBilling",
"value": {
"policyPremium": 72000,
"policyTaxes": 3600,
"policyFees": 500,
"policyGrandTotal": 76100
}
}
]
}
```
Cancel and reinstate accept only `fullTermDeltas` — each entry is just `path` and `value`, no `startDate`/`endDate`/`action`. The system handles the date ranges and status change internally.
**Segments (3):** `+1`
| # | Date Range | Status | Exposures | Policy Annualized Premium |
| - | -------------- | ------------- | ------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | active | Main Campus | 85,000 |
| 2 | Apr 1 – Aug 31 | active | Main Campus + West Clinic | 112,000 |
| 3 | Sep 1 – Dec 31 | **cancelled** | Main Campus + West Clinic | 112,000 |
**fullTermPolicyBilling:** Premium 72,000 · Taxes 3,600 · Fees 500 · Total 76,100
The Apr–Dec segment split at September. The annualized rate stays 112,000 in both segments — the underlying risk profile didn't change, only the status. But the billing dropped to 72,000 reflecting the shortened coverage period.
**Effective:** Sep 1 · **Version:** 8
The acquisition falls through. Policy reinstated at the same effective date as the cancellation. A 250 reinstatement fee is added.
```json Request theme={null}
{
"reinstatementDate": "2025-09-01",
"fullTermDeltas": [
{
"path": "policy.fullTermPolicyBilling",
"value": {
"policyPremium": 101000,
"policyTaxes": 5050,
"policyFees": 750,
"policyGrandTotal": 106800
}
}
]
}
```
Segment 3 returns to `"active"` — now identical per-segment state to segment 2. They merge.
**Segments (2):** `-1`
| # | Date Range | Status | Exposures | Policy Annualized Premium |
| - | -------------- | ------ | ------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | active | Main Campus | 85,000 |
| 2 | Apr 1 – Dec 31 | active | Main Campus + West Clinic | 112,000 |
**fullTermPolicyBilling:** Premium 101,000 · Taxes 5,050 · Fees 750 (was 500) · Total 106,800
**Cancel + Reinstate are invisible in the segments.** Both transactions are preserved in the audit trail, but the per-segment state is identical to version 6 (pre-cancellation). Only `fullTermPolicyBilling` changed — the reinstatement fee increased fees from 500 to 750. This is the second type of segment reduction: **reversal**, where an action directly undoes a prior change's per-segment effects.
## Transaction Deletion
**Latest version after delete:** 7
The acquisition is back on. The reinstatement was premature — delete it.
Transaction deletion removes the most recent transaction (the REINSTATE) and its segments. No new version is created — version 7 (the CANCEL version) becomes current again via `MAX(policy_version)`. The deleted transaction is archived for audit purposes.
**Segments (3):** `+1`
| # | Date Range | Status | Exposures | Policy Annualized Premium |
| - | -------------- | --------- | ------------------------- | ------------------------- |
| 1 | Jan 1 – Mar 31 | active | Main Campus | 85,000 |
| 2 | Apr 1 – Aug 31 | active | Main Campus + West Clinic | 112,000 |
| 3 | Sep 1 – Dec 31 | cancelled | Main Campus + West Clinic | 112,000 |
**fullTermPolicyBilling:** Premium 72,000 · Taxes 3,600 · Fees 500 · Total 76,100
The deleted transaction still exists in the audit trail — it's archived, not erased. But the live policy state has reverted to the cancelled state, including the pre-reinstatement billing.
***
## Summary
### Segment Count Over Time
| Version | Transaction | Description | Segments | Change |
| ------- | ------------- | ----------------------------------------------------------------- | -------- | ------ |
| 1 | NEW\_BUSINESS | Initial policy | 1 | — |
| 2 | ENDORSE | Add clinic | 2 | +1 |
| 3 | ENDORSE | Add physician + specialty from Jun | 3 | +1 |
| 4 | ENDORSE | Remove physician, reduce beds from Jun | 3 | — |
| 5 | ENDORSE | Backdate corrections to Apr | 3 | — |
| **6** | **ENDORSE** | **Retroactive Neurology to Apr** | **2** | **-1** |
| 7 | CANCEL | Cancellation from Sep | 3 | +1 |
| 8 | REINSTATE | Reinstatement from Sep | 2 | -1 |
| *(7)* | DELETE | Undo reinstatement — version 8 removed, version 7 becomes current | 3 | +1 |
### Two Types of Segment Reduction
Retroactive corrections made the Apr–May segment identical to the Jun–Dec segment — both structurally and in rating. Adjacent identical segments merged.
Segments can reduce through **normal business operations** — corrections, reconciliations, and backdated adjustments that happen to converge per-segment state across a boundary.
Reinstatement undid the cancellation, making Sep–Dec identical to Apr–Aug. Adjacent identical segments merged.
An action that inverts a prior change can collapse the segments that action created — but the **audit trail preserves both transactions**.
### Key Takeaways
**Transactions** are authored. **Policy state** is derived. **Segments** are compressed representations of per-segment state.
Segment count may increase, decrease, or stay the same with each transaction — independently of whether a change was added, corrected, or reversed. `fullTermPolicyBilling` and other cross-segment invariants do not affect segment boundaries at all — only per-segment data (including per-segment rating) drives merging.
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/policies/overview
Transaction-based policy management with temporal versioning
The FMV1 Policy API manages policies through immutable transactions. Each transaction (new business, endorsement, cancellation, reinstatement, renewal) produces a new policy version with a complete set of time-based segments.
## Configuration-Driven
The Policy API works with the [Configuration API](/api-v1-reference/configuration/overview). The same field definitions you configure — policy fields, exposure fields, option sets — are the fields you write when creating policies through transactions.
1. **Configure** your insurance program — define fields, option sets, exposure types
2. **Create policies** via `POST /transaction/new-business`
3. **Manage the lifecycle** — endorse, cancel, reinstate, renew
4. **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](/api-v1-reference/policies/concepts). For a full worked example tracing 9 transactions through a realistic policy lifecycle, see the [Lifecycle Walkthrough](/api-v1-reference/policies/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/policies/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
```json POST /v1/policies/transaction/new-business theme={null}
{
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"fieldModelV1Data": {
"policy": {
"annualPremium": 85000,
"fullTermPolicyInfo": {
"policyStatus": "active",
"policyStartDate": { "year": 2025, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyEndDate": { "year": 2026, "month": 1, "day": 1, "timezone": "America/New_York" },
"primaryInsuredId": "550e8400-e29b-41d4-a716-446655440010"
},
"fullTermPolicyBilling": {
"policyPremium": 85000,
"policyTaxes": 0,
"policyFees": 500,
"policyGrandTotal": 85500
},
"exposures": [
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"exposureType": "MedicalFacility",
"bedCount": 120
}
]
}
}
}
```
### Response
```json 201 Created theme={null}
{
"policyId": "550e8400-e29b-41d4-a716-446655440001",
"policyVersion": 1,
"transactionId": "550e8400-e29b-41d4-a716-446655440002",
"startDate": "2025-01-01",
"endDate": "2026-01-01",
"createdAt": "2025-01-15T10:30:00.000Z",
"fullTermPolicyBilling": {
"policyPremium": 85000,
"policyTaxes": 0,
"policyFees": 500,
"policyGrandTotal": 85500
},
"fullTermPolicyInfo": {
"policyStatus": "active",
"policyStartDate": { "year": 2025, "month": 1, "day": 1, "timezone": "America/New_York" },
"policyEndDate": { "year": 2026, "month": 1, "day": 1, "timezone": "America/New_York" },
"primaryInsuredId": "550e8400-e29b-41d4-a716-446655440010"
},
"segments": [
{
"startDate": "2025-01-01",
"endDate": "2026-01-01",
"fieldModelV1Data": {
"policy": {
"annualPremium": 85000,
"fullTermPolicyInfo": { "...": "..." },
"fullTermPolicyBilling": { "...": "..." },
"exposures": [
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"exposureType": "MedicalFacility",
"bedCount": 120
}
]
}
}
}
]
}
```
### Key Points
* **`policyStartDate` / `policyEndDate`** define the policy term boundaries
* **`fieldModelV1Data.policy`** contains all policy-level fields, with exposures nested inside
* **`fullTermPolicyInfo`** and **`fullTermPolicyBilling`** are required on every policy
* **Exposures** reference existing exposure records by `id` — create exposures first via the [Exposures API](/api-v1-reference/exposures/overview)
* **`transactionTimestamp`** is optional — defaults to the current time if omitted
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/quotes/overview
Manage quotes using the Field Model V1 data structure
Quotes are top-level FMV1 entities with their own field definitions. Custom field data lives in a `quote` object on create/update and a `data` object on GET responses, with exposures in an `exposures` array. The available fields are configured per company — use the Configuration endpoint to discover them.
## Data Structure
Each quote contains:
* **`quote`** (create/update) / **`data`** (GET response) — quote-level custom field values (key-value pairs). Includes read-only lifecycle fields in responses.
* **`exposures`** — array of exposure objects, each with custom field values.
## Lifecycle Fields
These fields are **system-managed** and read-only. They appear in GET/List responses inside `data` but are rejected on create/update and omitted from the Configuration endpoint:
| Field | Description |
| ------------------- | --------------------------------- |
| `quoteType` | Quote type (e.g., "New Business") |
| `quoteStatus` | Current status |
| `quoteNumber` | Auto-generated quote number |
| `quoteBindErrors` | Binding validation errors |
| `quoteSubmissionId` | Associated submission ID |
## API Endpoints
| Method | Endpoint | Description |
| ------ | --------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| GET | `/v1/quotes` | List quotes |
| POST | `/v1/quotes` | Create a quote |
| GET | `/v1/quotes/{quoteId}` | Get a quote |
| PUT | `/v1/quotes/{quoteId}` | Update a quote (full replace) |
| DELETE | `/v1/quotes/{quoteId}` | Delete a quote |
| POST | `/v1/quotes/{quoteId}/send` | Send a quote |
| POST | `/v1/quotes/{quoteId}/bind` | Bind a quote to create a Basic Policy (documented under [Basic Policies](/api-v1-reference/policies/basic-overview)) |
| GET | `/v1/quotes/configuration` | Get field configuration |
## Configuration
Call `GET /v1/quotes/configuration` to get JSON Schemas of available fields for your company. The response contains:
* **`quote`** schema — fields for the `quote` object (excludes calculated fields, policy-only fields, server-populated fields, and lifecycle fields)
* **`exposure`** schema — fields for each `exposures[]` item
Lifecycle fields are excluded from the configuration.
## Permissions
| Operation | Permission |
| ------------------------ | ---------------------- |
| List, Get, Configuration | `company.quote:read` |
| Create | `company.quote:create` |
| Update | `company.quote:update` |
| Delete | `company.quote:delete` |
| Bind | `company.quote:create` |
| Send | `company.quote:update` |
## Example Create Request
```json theme={null}
{
"submissionId": "550e8400-e29b-41d4-a716-446655440010",
"quote": {
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"policyType": "new_business",
"policyTimeZone": "America/New_York",
"premium": 15000
},
"exposures": [
{
"exposureName": "Acme Corp",
"employeeCount": 150
}
]
}
```
`policyNumber` and `policyEffectiveDate` are not required on create. The only required fields are `policyStartDate`, `policyEndDate`, `policyType`, and `policyTimeZone`.
## Example Response
```json theme={null}
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"companyId": "550e8400-e29b-41d4-a716-446655440000",
"submissionId": "550e8400-e29b-41d4-a716-446655440010",
"policyId": null,
"data": {
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"policyType": "new_business",
"policyTimeZone": "America/New_York",
"premium": 15000,
"quoteType": "New Business",
"quoteStatus": "in_progress",
"quoteNumber": "Q-2025-001"
},
"exposures": [
{
"exposureName": "Acme Corp",
"employeeCount": 150
}
],
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": null,
"createdBy": "google-oauth2|123456789"
}
```
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/rating/overview
Invoke the rating engine or supply external rating results via API
**Planned** — Rating endpoints are being added to the v1 API. See the [Roadmap](/api-v1-reference/roadmap) for overall API direction.
The Rating API lets you compute premium and rating results for a quote or endorsement. Two approaches serve different use cases, and they can be used together.
## Hosted Rating
Invoke the AI Insurance-configured rating engine for a quote or endorsement. The system runs the configured rater (per company), computes results, and writes them to the rating response fields.
### Planned Endpoints
| Method | Endpoint | Description |
| ------ | -------------------------------------------- | --------------------------------------------------- |
| POST | `/v1/quotes/{quoteId}/rate` | Invoke the configured rating engine for a quote |
| POST | `/v1/policies/{policyId}/rating/endorsement` | Rate an endorsement (a set of deltas) for a policy |
| POST | `/v1/rating/rate` | General rating — feed in a segment and get it rated |
### How It Works
1. Call the appropriate rating endpoint for your use case
2. The system invokes the rating engine configured for your company
3. Rating results are written to the `policyRatingResponse` and `exposureRatingResponse` fields
4. The response returns the computed rating results
### When to Use
* You use AI Insurance's built-in rating engine
* You want the system to compute premium based on your configured rating logic
* You want a single API call to rate and store results
## External Rating (Bring Your Own Engine)
If you compute rating externally, no new endpoint is needed. Write your rating results directly to the quote or endorsement using the existing update endpoints.
### How It Works
1. Compute rating results in your own system
2. Call `PUT /v1/quotes/{quoteId}` (or the endorsement update endpoint) with `policyRatingResponse` and `exposureRatingResponse` fields populated
3. The system treats these as regular field data — no special handling required
### When to Use
* You have a proprietary rating engine
* Rating is computed outside AI Insurance
* You need full control over the rating calculation
## Both Approaches Work Together
The API doesn't require rating results to come from any specific source. Whether you use hosted rating, external rating, or a combination, the downstream workflow is the same: once rating fields are populated on a quote or endorsement, it can proceed through the workflow.
## Permissions
| Operation | Permission |
| ------------------------- | ---------------------- |
| Rate a quote (hosted) | `company.quote:rate` |
| Update a quote (external) | `company.quote:update` |
## Related Resources
* [Quotes API](/api-v1-reference/quotes/overview) — create and manage quotes
* [Policy API](/api-v1-reference/policies/overview) — bind rated quotes into policies
* [Roadmap](/api-v1-reference/roadmap) — overall API direction
# Roadmap
Source: https://docs.aiinsurance.io/api-v1-reference/roadmap
Where the v1 API is headed — upcoming capabilities and how the pieces fit together
The v1 API is built to make AI Insurance fully programmable. Every part of the platform — configuration, submissions, quoting, rating, policy management, claims, reporting, and document generation — is accessible through APIs. This makes it straightforward to get data into and out of the system, integrate with external platforms, and build automated workflows including AI-powered ones.
Today, the v1 API covers configuration, exposures, quotes, policy transactions, events, custom objects, and reporting. Below is how these pieces fit together, and what's coming next.
## How the Pieces Fit Together
The API surface maps to the insurance lifecycle. Each capability is a composable building block — use the ones you need, in whatever combination fits your workflow. The system is configuration-driven, so the same endpoints work for any line of business, any field schema, any document template.
Define fields, exposure types, coverage types, custom objects, and form templates via API. **Available today** via the [Configuration API](/api-v1-reference/configuration/overview).
Create submissions that group related quotes for a single applicant. **Planned** — [Submissions](/api-v1-reference/submissions/overview).
Create and iterate on quotes with configurable field data. **Available today** via the [Quotes API](/api-v1-reference/quotes/overview).
Invoke AI Insurance's hosted rating engine via API. If you use your own rating engine, the existing quote endpoints already support writing rating results directly. **Planned** — [Rating](/api-v1-reference/rating/overview).
Generate quote and policy documents from uploaded templates using smart tags. **Planned** — [Document Generation](/api-v1-reference/documents/overview).
Convert a quote into a policy via the transaction model. **Planned** — a v1 bind endpoint that creates a new-business transaction from a quote.
Endorse, cancel, reinstate, and renew policies via the immutable transaction model. **Available today** via the [Policy API](/api-v1-reference/policies/overview).
Earned premium, bordereau exports, and financial reporting. **Available today** via the [Policy Reporting API](/api-v1-reference/policies/overview).
Create and manage events linked to policies. **Available today** via the [Events API](/api-v1-reference/events/overview).
Submit unstructured documents (applications, loss runs) and receive structured data. **Planned** — [Submission Parsing](/api-v1-reference/parsing/overview).
***
## What's Available Today
| Capability | API |
| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Configuration (field definitions, option sets, exposure types, coverage types, custom objects) | [Configuration Management](/api-v1-reference/configuration/overview) |
| Exposure CRUD with configurable fields | [Exposures](/api-v1-reference/exposures/overview) |
| Quote lifecycle (create, update, send) | [Quotes](/api-v1-reference/quotes/overview) |
| Policy transactions (new business, endorse, cancel, reinstate, renew) | [Policies](/api-v1-reference/policies/overview) |
| Policy version history and audit trail | [Policy Concepts](/api-v1-reference/policies/concepts) |
| Earned premium and bordereau reporting | [Policies — Reporting](/api-v1-reference/policies/overview) |
| Event (claims) CRUD with configurable fields | [Events](/api-v1-reference/events/overview) |
| Custom object CRUD with typed relationships | [Custom Objects](/api-v1-reference/custom-objects/overview) |
***
## What's Coming
### Submissions
v1-native submission endpoints for grouping related quotes. Submission types include new business, renewal, endorsement, cancellation, and reinstatement.
[View Submissions documentation](/api-v1-reference/submissions/overview)
### Rating
New endpoints to invoke AI Insurance's hosted rating engine for a quote or endorsement. If you use your own rating engine, the existing [Quotes](/api-v1-reference/quotes/overview) and [Policy](/api-v1-reference/policies/overview) APIs are built to support writing rating results directly.
[View Rating documentation](/api-v1-reference/rating/overview)
### Document Generation
API-driven document generation using smart tag templates:
* Upload and manage DOCX form templates with smart tags
* Generate populated PDF documents for quotes and policies
* Download generated documents via signed URLs
[View Document Generation documentation](/api-v1-reference/documents/overview)
### Submission Parsing
AI-powered structured extraction from unstructured insurance documents:
* Parse applications (ACORD forms, custom applications) into structured quote fields
* Parse loss run documents into structured loss history
[View Submission Parsing documentation](/api-v1-reference/parsing/overview)
# Overview
Source: https://docs.aiinsurance.io/api-v1-reference/submissions/overview
Group related quotes under a single submission
A submission groups related quotes for a single applicant. It serves as the entry point for new business, renewals, endorsements, cancellations, and reinstatements.
## Key Concepts
* **Submission** — a container that groups one or more quotes. Each submission has a type that describes its purpose.
* **Submission types** — `newBusiness`, `renewal`, `endorsement`, `cancellation`, `reinstatement`
* **Quote association** — quotes are linked to a submission via `submissionId` when creating the quote. The `submissionQuotes` join field on the submission response contains the linked quote IDs.
## API Endpoints
| Method | Endpoint | Description |
| ------ | -------------------------------- | --------------------------------------------------- |
| POST | `/v1/submissions` | Create a submission |
| GET | `/v1/submissions` | List submissions (filterable by type, status, text) |
| GET | `/v1/submissions/{submissionId}` | Get a submission |
| PUT | `/v1/submissions/{submissionId}` | Update a submission |
| DELETE | `/v1/submissions/{submissionId}` | Soft-delete a submission |
| GET | `/v1/submissions/configuration` | Get available fields schema |
## Data Model
Submissions use `fieldModelV1Data` — a flat JSON object where keys are field reference IDs. System-managed fields include:
| Field | Description |
| -------------------------- | -------------------------------------------------------------- |
| `submissionNumber` | Auto-generated submission number |
| `submissionType` | Submission type (required on create) |
| `submissionStatus` | Current status (defaults to `inProgress`) |
| `submissionName` | Display name |
| `submissionPrimaryInsured` | Primary insured name (set from first quote's primary exposure) |
| `submissionBoundDate` | Date when the submission's quote was bound |
| `submissionQuotes` | Array of linked quote IDs (populated via join field) |
Use the [Configuration endpoint](#) to discover all available fields including custom fields defined in the onboarding spreadsheet.
## Workflow
1. **Create a submission** — specify the `submissionType` and any custom fields
2. **Create quotes** under the submission using `POST /v1/quotes` with the `submissionId` field
3. **Iterate on quotes** — update, rate, and refine
4. **Bind the accepted quote** — converts to a policy via the [Policy Transaction API](/api-v1-reference/policies/overview). The submission status is automatically updated to `boundToPolicy`.
## Permissions
| Operation | Permission |
| ------------------------ | --------------------------- |
| List, Get, Configuration | `company.submission:read` |
| Create | `company.submission:create` |
| Update | `company.quote:update` |
| Delete | `company.quote:delete` |
Update and Delete currently use `company.quote:update` and `company.quote:delete` permissions because dedicated `company.submission:update` and `company.submission:delete` permissions have not been created yet.
## Related Resources
* [Quotes API](/api-v1-reference/quotes/overview) — create and manage quotes within a submission
* [Policy API](/api-v1-reference/policies/overview) — bind quotes to create policies
# Create an Event
Source: https://docs.aiinsurance.io/events/create-new-events
Take the following steps to create an event:
1. Navigate to the **Events** page by clicking the **Events** tab on the navigation bar by the left.
2. Click the **New Event** button at the top right corner and select the type of event you’re creating: **Incident** or **Claim**.
3. Fill out event details.
a. Choose the relevant Coverage Type. The lines of coverage shown are configured by your organization and can be customized or changed by your admin.
b. Associate it with the appropriate Insured(s). You can type to search for a specific insured. If you don't see the insured you're looking for, you will need to [Create an Insured](/policing/insured-management/creating-insureds).
c. Provide any additional helpful notes in the event description field.
4. Click the **Create Incident** or **Create Claim** button, depending on the event you are creating.
The **Create Incident** and **Create Claim** buttons will be grayed out until you enter **Coverage Type** and **Name**.
# Edit Events
Source: https://docs.aiinsurance.io/events/edit-events
Follow these steps to edit your events:
1. Navigate to the **Events** page by clicking the **Events** tab on the sidebar to see all your events.
2. Select the group of Events - **Claims** or **Incidents** - that holds the specific event you want to edit.
3. Select the Event you wish to edit.
4. [An event page](/events/view-events) has six tabs: **Event Details**, **Legal**, **Files**, **Notes**, **Financials**, and **Activity**. The **Event Details** and **Legal** sections are split into small sections, each with an **Edit** button. Click on the button, modify the sections, and click the **Save** button to edit the information.
5. You can also edit the information in the [Files](/platform/components/files) and [Notes](/platform/components/notes) sections. Refer to their respective documentation to learn more.
# Event Reserve Updates Smart Tag
Source: https://docs.aiinsurance.io/events/event-reserve-updates
The **Event Reserve Updates** smart tag automatically summarizes reserve changes on a claim/incident and renders them into your form (e.g., a Claim Report). This guide shows how to add the tag to a form template and how users generate a form from a claim/incident.
For more information about smart tags and how they work, see the [Smart Tags documentation](/platform/components/smart-tags).
## 1. Create (or edit) a Claim/Incident form template
1. Go to **Company Settings** on your side bar. Navigate to **Form**
2. Create a new form (or open an existing one)
3. Set **Category** to **Claim/Incident**.
4. In the form editor, click **Insert Smart Tag** (top-right).
5. From the sidebar, select **Event Reserve Updates** to insert the tag where you want the table to appear.
6. Save the template.
> The tag can also be inserted later when editing a generated form (see step 3).
## 2. Use the template from a claim/incident
1. Go to the **Events** tab on your sidebar.
2. Select either **Claims** or **Incidents** tab depending on your event type.
3. Find and click on the specific **Event** (claim/incident) record you want to generate a form for.
4. On the event page, click the **Actions** dropdown in the top-right corner.
5. Select **Generate Claim Form** from the dropdown menu.
6. Choose your **Claim/Incident** template that includes the **Event Reserve Updates** tag.
7. Click **Generate**. The system generates a document and populates the smart tag from the event's reserve data.
## 3. Edit a generated form
* If you need to tweak the output or add the tag after generation:
1. Open the **generated form** you created before. Click **Edit**
2. Click **Insert Smart Tag** and pick **Event Reserve Updates** (if it wasn't already in the template).
3. Save or download as needed.
# Export an Event
Source: https://docs.aiinsurance.io/events/exporting-event
Refer to the [Exporting data documentation](/platform/reporting-and-reports/exporting-data) to learn how to export Events data.
# Overview
Source: https://docs.aiinsurance.io/events/understanding-events
An event is a general term for things that happen, and it is divided into two groups: Incidents and Claims.
## Incident vs Claims
Although incidents and claims are classified under events, they differ in the following ways:
### Incident
An [incident](/getting-started/glossary) refers to an unexpected event or occurrence that is recorded and tracked, as it can potentially become a lawsuit or claim.
### Claim
A [claim](/getting-started/glossary) is typically created when an incident leads to a formal lawsuit or a demand for money being made.
Imagine a patient slipping on an icy sidewalk at a care facility. This is recorded as an incident since it could lead to legal action. If the patient or their representative later files a lawsuit or requests a settlement, it becomes a claim.
Claims and Incidents follow the same creation process. To create one, follow the instructions for creating an Event.
## Connecting Events with Policies
Events often need to be associated with insurance policies. If you're having trouble connecting an event to a policy, or if you need to understand the relationship between events, policies, quotes, and brokerages, see our comprehensive [Event to Policy Workflow](/workflows/event-policy-workflow) guide.
# View Events
Source: https://docs.aiinsurance.io/events/view-events/view-events
Select the **Events** tab on the sidebar to see all Events logged in your instance.
Next, select the tab for any group of Events you'd like to see, either [Claims or Incidents](/events/understanding-events).
## View an Event
Click on a specific event - Claims or Incidents - to learn more about it.
On the event's dedicated page, you'll find six tabs:
* Event Details
* Legal
* Files
* Notes
* Financials
* Activity
### **Event Details**
Event Details display all information related to your Events.
Your team configures the fields in the **Event Details** section. Ask your Account Manager, and they can add custom fields for you. We also provide recommendations on why specific fields are present.
Fields in **Event Details** are automatically grouped into sections depending on the coverage line.
For example, a Medical Professional Liability coverage line will have related sections such as Medical, Allegations, and more.
Similarly, an Event will only have the **Claimant** section if the Event does have a Claimant.
However, **Event Details** typically includes at least these three sections:
* **Event**: Provides an overview, including details such as Coverage Type, Money Demanded, Event Date, Time of Event, and more.
* **Policy**: Contains information about the policy the claim/incident applies to.. The platform will automatically select the most active policy to the claim and pull all relevant information.
However, to change the policy, click the downward-facing arrow in the **Policy Number** section and select a policy from the dropdown.
**Note**: If no policy is automatically applied, it likely means there isn’t one. In that case, you should [Create a Policy](/policing/policy-management/policy-issuance).
* **Location**: Displays information about where the event occurred.
### **Legal**
The Legal section contains all the legal information concerned with an Event. It is split into different sections, which are:
* **Lawsuit Information**: Displays all the information for any lawsuit related to an Event.
* **Plaintiff Legal Information**: Tracks all information about a plaintiff in fields like **Plaintiff Name**, **Plaintiff Address**, **Plaintiff Attorney**, and more.
* **Defendants**: Tracks all defendants, insured and non-insured, associated with a lawsuit. Add a defendant with the following steps:
1. Click the **Add New Defendant** button in the **Defendants** section.
ii. Enter the defendant's information. If the defendant, their attorney, or law firm doesn’t already exist, a **Create New** modal will appear. Use it to add a new defendant, attorney, or law firm.
iii. Click the **Add Defendant** button to save the information.
### **Files**
This section holds all the files related to an Event. Refer to the [Files documentation](/platform/components/files) to learn more about uploading, editing, and deleting files on the platform.
### **Notes**
This section holds all the notes related to an Event. Refer to the [Notes documentation](/platform/components/notes) to learn more.
### **Financials**
This section holds all the financial information related to an Event. This section is divided into two:
* Summary
* Transactions
#### Summary
This section summarizes all the financial information related to the Event. The details are organized into various fields, including:
* **Indemnity Reserve Amount**: This is the estimated amount set aside to cover potential indemnity payments for a claim. It is calculated as Expected Total Indemnity - Total Indemnity Transactions Paid.
* **ALAE Reserve Amount**: The estimated amount reserved for Allocated Loss Adjustment Expenses (ALAE) related to claim handling. It is calculated as **Expected Total ALAE - Total ALAE Transactions Paid**.
* **Expected Total Indemnity**: This is the total gross indemnity amount allocated for a claim. Enter the expected indemnity amount in this field to update the Indemnity Reserve Amount accordingly
* **Expected Total ALAE**: The total gross ALAE amount anticipated for resolving the claim. Enter the expected ALAE amount in this field to update the **ALAE Reserve Amount** accordingly.
* **Coverage Expenses Owed**: The amount of coverage-related expenses that have yet to be paid by the insurer.
* **Coverage Expenses Paid**: The total amount of coverage-related expenses already paid by the insurer.
* **Deductible Owed**: The amount of deductible that the insured party still owes.
* **Deductible Paid**: The amount of deductible that the insured party has already paid.
* **Indemnity Owed**: This is the indemnity payment amount the insurer has not yet disbursed.
* **Indemnity Paid**: The total indemnity amount already paid to the claimant.
* **Claim Handling Costs Owed**: The claim handling expenses that are still pending payment by the insurer.
* **Claim Handling Costs Paid**: The total claim handling expenses that the insurer has already paid.
* **ALAE Owed**: The amount of Allocated Loss Adjustment Expenses (ALAE) still owed by the insurer.
##### Expected Total History
The Expected Total History modal lists all the updates made to a transaction type's expected total.
Users can set an expected total value for transaction types that have reserves.
Expected total represents the amount of money to set aside for a particular transaction type.
In addition, the system will update the expected total value to prevent reserves from going negative.
In the above example, the modal shows the Expected Total History for indemnity. There has been two updates to expected total.
1. The first one was updated by a user.
2. The second one was updated by the system.
#### Invoices and Transactions
The **Invoices and Transactions** section displays all the invoices and transactions associated with the Event.
You can do the following:
* **Add a Transaction**: Take these steps to add a transaction on the platform:
* In the **Invoices and Transactions** section, click the **Add new** button and select the type of transaction from the dropdown to open a **New Transaction** page.
* Complete the **Basic Information** section with details about the invoice.
* Click **Save** to save the transaction.
* **Mark a Transaction**: Mark a transaction as **Approved**, **Paid**, or **Owed** by selecting the transaction, clicking the **Mark As** button, and choosing the appropriate option.
* **Export a Transaction**: Select the transactions you would like to export, and click the **Export** button at the top right of the **Invoices and Transactions** section.
### **Activity**
This section holds all the notes related to an Event. Refer to the [Activity Feed documentation](/platform/components/activity-feed) to learn more.
# Billings
Source: https://docs.aiinsurance.io/financials/billings/billings
AI Insurance lets you manage billing from the platform. A bill can have one of five statuses:
* Owed
* Approved
* Processing
* Paid
* Void
## Create a Bill
There are two ways to create bills:
* From the **Transaction** section
* From the **Forwarded Invoices** section
### **Create a bill from the Transaction section**
Do the following to create a bill from the **Transaction** section:
1. Click on the **Financials** tab to open the **Financials** page.
2. Go to the **Transaction** section, click the **New Transaction** button, and select the type of transaction you want to create. This action opens the **New Transaction** page.
3. Fill out the **New Transaction** page fields with information on your bill OR drag and drop your bill so the platform automatically parses your data for you.
4. Click the **Add item** in the **Itemizations** section to add expenses and calculate your total bill.
5. Fill in the following details:
* **Item Name**: Enter the name of the expense.
* **Amount**: Enter the cost of the expense.
* **Type**: Choose the category of the expense. You can select from **Attorney Fees**, **Expert Fees**, or **Other**.
Any item you add will automatically affect the **Total**.
6. Save the invoice to your instance by clicking the **Save** button.
### **Creating a bill from a forwarded email**
The second way to create a bill is by using the **Forwarded Invoices** feature. Take the following steps to create a bill:
1. Click the **Financials** tab in the sidebar, then select the **Forwarded Invoices** tab as shown below:
2. Forward your bills to the email address provided in the tab.
3. Locate your bill on the **Forwarded Invoices** screen, confirm, and save the bill.
## Pay a Bill
Refer to the [Payment documentation](/financials/payments) to learn how to pay a bill from your AI Insurance instance.
# Changing Invoice Name After Sending
Source: https://docs.aiinsurance.io/financials/invoicing/changing-invoice-name
## Overview
Once an invoice has been sent, it cannot be modified directly. If you need to change the name or any other details on a sent invoice, you'll need to void the existing invoice and create a new one from scratch.
## Step-by-Step Process
### Step 1: Void the Existing Invoice
1. Navigate to **Financials** in the sidebar
2. Go to the **Transactions** section
3. Find the sent invoice you need to modify
4. Select the box next to the invoice
5. Click the **"Mark As"** dropdown button
6. Select **"Void"** from the options
7. Confirm the void action
**Important**: Voiding an invoice cannot be undone. The original invoice will be marked as cancelled and will no longer be active for billing purposes.
### Step 2: Build Invoice Form and Apply to Policy
1. Navigate to your **Company** in the sidebar (click on your company name)
2. In the company settings, click on the **"Forms"** tab
3. Click **"Create New Form"** to build a new invoice form
4. In the form editor, click **"Insert Smart Tag"** button
5. Add the **Billing Details** smart tag with the correct name
6. Save the form as an "Invoice" type form
7. Navigate to **Policies** in the sidebar
8. Find and open the policy associated with the original invoice
9. Click **"Endorse Policy"**
10. Skip through the endorsement steps
11. Select the newly created invoice form when prompted
12. Complete the endorsement process
### Step 3: Export the New Invoice
After completing the endorsement process, the new invoice will be automatically generated. You can then export it for your records or to send it to the client.
1. Navigate to **Financials** → **Transactions**
2. In the **Transactions** table, find the newly generated invoice
3. Select the invoice by checking its checkbox
4. Click the **"Export"** button
5. An "Export" modal will appear, asking "What would you like to export?"
* Select **"1 selected items"** (this option will be pre-selected if you checked only one invoice)
* You can also choose "All items" if you wish to export more
6. Click the purple **"Finish Export"** button to download the invoice
# Custom Billing
Source: https://docs.aiinsurance.io/financials/invoicing/custom-billing
Custom billing gives you full control over when invoices are sent, how they are split across the policy term, and how broker commissions are handled — for both new policies and endorsements.
Custom billing is currently in beta and is not available to all accounts. Contact [support@aiinsurance.io](mailto:support@aiinsurance.io) to request access.
## New Policy Billing
When binding a new policy, the **New Invoices** card lets you configure the invoice schedule before confirming the bind.
### Invoice Strategy
The **Strategy** dropdown controls how many invoices are generated and how the total premium is divided:
| Strategy | What it does |
| ------------------ | ----------------------------------------------------------------------- |
| **Single Invoice** | Sends one invoice for the full premium amount |
| **Monthly** | Splits the premium into equal monthly invoices across the policy term |
| **Quarterly** | Splits the premium into equal quarterly invoices across the policy term |
| **Skip Billing** | No invoices are generated |
For monthly and quarterly schedules, invoices are evenly pro-rated across the number of periods. The final invoice in the schedule always collects any remaining balance, so the total billed always matches the rated premium exactly regardless of rounding errors.
### Timing Controls
| Field | Default | Description |
| -------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **First Due Date** | Today, or the policy start date (whichever is later) | The due date for the first invoice. Subsequent due dates are calculated from this date at the selected interval. |
| **Send Before Due (days)** | 30 | How many days before each invoice's due date it is sent. For example, a quarterly invoice due June 1 with a 30-day lead time is sent on May 2. |
| **Send First Invoice** | Send on Bind | Controls timing for the first invoice only. **Send on Bind** sends the first invoice immediately when the policy or endorsement is bound, regardless of the lead time setting. **Send on Schedule** applies the same lead time to the first invoice as to subsequent ones. |
| **Auto Send Invoices** | Send Invoice | **Send Invoice** automatically creates and sends invoices via stripe on the scheduled send date. **Do not Send** creates the invoice as an outstanding balance without sending it. |
### Commission Billing
If a broker commission is configured on the policy, a **Commission Billing** dropdown appears:
| Option | What it does |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Direct Bill** | Creates a separate commission invoice for each policy invoice, payable by the brokerage. The policy invoice is sent to the insured (unless overridden below). |
| **Agency Bill** | Combines the premium and commission into a single invoice sent to the brokerage. |
| **Do Not Handle** | No commission invoice is generated. |
### Policy Invoice Payee
Under **Direct Bill**, a **Policy Invoice Payee** dropdown lets you redirect the policy invoice to the **Brokerage** rather than the **Primary Insured**. This is useful when the brokerage is collecting and remitting the full premium. This option is only visible when a brokerage is attached to the policy.
Under **Agency Bill**, the policy invoice is always directed to the brokerage and this selector is hidden.
### Invoice Preview
The card displays a preview table of all invoices that will be created when the policy is bound:
* **Type** — Policy Invoice or Commission Invoice
* **Payee** — Who receives the invoice
* **Status** — When the invoice will be sent: **Send on Bind** (immediately at bind), **Scheduled** (sent on a future date), or **Owed** (created but not auto-sent)
* **Due Date** — When payment is due; scheduled invoices also show the date the invoice will be sent
* **Amount** — Total invoice amount, with the premium and commission amounts shown separately below
Commission invoices are grouped beneath their linked policy invoice.
### Billing Email
At the bottom of the billing step, you can review and update the email address that will receive the invoices.
***
## Endorsement Billing
When endorsing a policy, the billing step shows two cards: **Existing Invoices** and **New Invoices**.
### Existing Invoices
This card lists all active invoices on the policy and lets you decide what happens to them when the endorsement is confirmed.
#### Void Strategy
The **Strategy** dropdown controls which existing invoices are voided at bind:
| Strategy | What it does |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Void None** | All existing invoices remain in place. New invoices are issued only for the net change in premium. |
| **Void Scheduled** | *(Default)* Voids only future scheduled invoices. Outstanding (owed) invoices are left as-is. The new invoice schedule picks up from the endorsement. |
| **Void All Unpaid** | Voids all unpaid invoices — both scheduled and currently outstanding. |
| **Custom** | Lets you individually control which invoices are voided (see below). |
Paid and partially paid invoices can never be voided and will always remain in place regardless of the selected strategy.
#### Custom Per-Invoice Actions
Switching to **Custom** — or clicking **Void** on any individual invoice — lets you manage each invoice independently:
* **Void / Unvoid** — Mark an invoice to be voided when the endorsement is confirmed. Voiding a policy invoice automatically voids its linked commission invoice as well. Click **Unvoid** to reverse the selection.
* **Exclude / Include** — Remove an invoice from the billing calculation entirely. Excluded invoices are not counted in the premium totals and are not factored into the amount owed on new invoices. Use this for one-off fees or manually created invoices that are unrelated to the policy's main billing schedule. Excluding a policy invoice also excludes its linked commission invoice.
**Void** vs **Exclude**: A voided invoice is cancelled at bind and its amount is accounted for in the new invoices. An excluded invoice is left unchanged and simply ignored by the billing calculation — the new invoices are sized as if it does not exist.
#### Viewing Scheduled Invoices
Scheduled invoices are collapsed by default. Check **Show scheduled** to view them. The section expands automatically when the selected strategy leaves scheduled invoices active (e.g. Void None).
### New Invoices
After choosing how to handle existing invoices, the **New Invoices** card works identically to the new policy billing step above. Configure the strategy, timing, commission handling, and payee for the invoices that will be created to cover the net premium change.
If **Void None** was selected and the endorsement results in no change in premium, no new invoices will be generated.
### Billing Totals
Below both cards, a totals summary shows the premium, fees, taxes, and commission amounts before and after the endorsement, so you can confirm the net change before proceeding.
# Delete Files from Invoice
Source: https://docs.aiinsurance.io/financials/invoicing/delete-files-from-invoice
This guide explains how to remove files that have been attached to an invoice transaction.
## **Overview**
When you need to remove files from an invoice, you must be in edit mode to access the delete functionality. This ensures that file deletions are intentional and properly tracked.
## **Step-by-Step Process**
### **Step 1: Navigate to the Invoice**
1. Go to **Financials** in the left sidebar
2. Navigate to the **Transactions** section
3. Find the invoice that contains the files you want to delete
### **Step 2: Enter Edit Mode**
1. Click on the **Actions** dropdown menu for the invoice
2. Select **"Edit Transaction"** from the dropdown options
3. The invoice will now be in edit mode
### **Step 3: Delete Files**
1. Once in edit mode, you'll see a **trash can icon** next to each file name
2. Click the **trash can icon** next to the file you want to delete
3. The file will be removed from the invoice
4. Repeat this process for any additional files you want to delete
### **Step 4: Save Changes**
1. After deleting the desired files, click **"Save Changes"** to confirm your modifications
2. The invoice will be updated and you'll exit edit mode
3. The deleted files will no longer be associated with the invoice
# Down Payment Invoices
Source: https://docs.aiinsurance.io/financials/invoicing/down-payment-invoices
## How Down Payments Appear on Invoices
When a policy includes a **down payment** and **installments**, each invoice separates the **Down Payment**, **Down Payment Credit**, and **Premium** line items.\
This ensures transparency in accounting and accurate allocation of the upfront payment across all future invoices.
***
### How It Works
The system processes down payments as follows:
#### Example Breakdown
| Line Item | Amount | Description |
| ------------------- | -------- | ----------------------------------------------------------------- |
| Down Payment | +\$1,620 | Charged upfront at policy start |
| Down Payment Credit | –\$135 | Offset applied to each monthly invoice (12 × $135 = $1,620 total) |
| Total Premium | +\$750 | Premium due for this invoice |
| Total Due | \$2,235 | Amount due for this billing period |
1. **Down Payment**\
The amount charged upfront at the start of the policy term.\
Appears as a positive line item (for example, `+$1,620`) on the first invoice.
2. **Down Payment Credit**\
The offset applied evenly across all invoices, including the first one.\
Appears as a negative line item (for example, `–$135`) on each invoice.\
This ensures the total of all credits equals the full down payment amount.
**Formula:**
```
Down Payment Credit = -1 × (Down Payment distributed across invoices)
```
**Example:**\
If the down payment is `$1,620` and there are `12` monthly invoices:
```text theme={null}
Down Payment Credit = -$135 × 12 = -$1,620
```
3. **Premium**\
The actual premium amount due for that billing period.\
This line item is separate so accounting can clearly distinguish between what's been paid upfront and what's owed later.
### Why It Looks This Way
Although this layout may look unusual, it's intentional. This breakdown allows accounting and billing systems to:
* Clearly show the upfront amount collected
* Track how that amount is credited over time
* Maintain accurate financial records for installment-based policies
### Summary Formula
```
Down Payment Credit = -1 × (Down Payment ÷ Number of Invoices)
```
This formula ensures the total of all invoice credits equals the original down payment.
Together, these ensure the total billed equals the full policy premium while maintaining a clear audit trail.
# Financial Transactions
Source: https://docs.aiinsurance.io/financials/invoicing/financial-transactions
## Overview
Financial transactions are records of all monetary activities in AI Insurance, including invoices, payments, refunds, and other financial operations. The **Transactions** section in Financials serves as the central hub for managing all financial records.
## What are Financial Transactions?
Financial transactions represent any financial activity related to policies, events, or other business operations. Common transaction types include:
* **Policy Invoices**: Bills sent to insureds for policy premiums
* **Commission Invoices**: Invoices for broker commissions
* **ALAE (Allocated Loss Adjustment Expense)**: Expenses related to claim handling
* **ULAE (Unallocated Loss Adjustment Expense)**: Unallocated expenses related to claim handling
* **Indemnity**: Payments made for claims
* **Claim Handling Costs**: Costs associated with processing claims
* **Retention**: Amounts retained by the carrier
* **Coverage Expense**: Expenses related to coverage
Each transaction includes important details such as:
* **Transaction Type**: The type of financial transaction
* **Status**: Current status (Approved, Paid, Owed, or Void)
* **Event**: Associated event (if applicable)
* **Payee**: The party receiving or making the payment
* **Invoice Date**: Date the invoice was created
* **Invoice Number**: Reference number for the invoice
* **Due Date**: When the transaction is due
* **Paid Date**: Date payment was received (if applicable)
* **Memo**: Additional notes or descriptions
* **Amount**: The transaction amount
## Accessing the Transactions Section
To view and manage financial transactions:
1. Navigate to **Financials** in the sidebar
2. Click on the **Transactions** tab
The Transactions page displays all financial transactions in a table format, allowing you to search, filter, and manage your financial records.
## Creating a Manual Financial Transaction
You can manually create financial transactions when you need to record invoices, payments, or other financial activities that aren't automatically generated by the system.
### Step 1: Navigate to Transactions
1. Go to **Financials** in the sidebar
2. Click on the **Transactions** tab
### Step 2: Create a New Transaction
1. Click the **"New Transaction"** button in the top right corner
2. A dropdown menu will appear with available transaction types
### Step 3: Select Transaction Type
Select the appropriate transaction type from the dropdown menu:
* **Policy Invoice**: For billing insureds for policy premiums
* **Commission Invoice**: For broker commission invoices
* **ALAE**: For allocated loss adjustment expenses
* **ULAE**: For unallocated loss adjustment expenses
* **Indemnity**: For claim indemnity payments
* **Claim Handling Costs**: For claim processing costs
* **Retention**: For retention amounts
* **Coverage Expense**: For coverage-related expenses
### Step 4: Fill in Transaction Details
After selecting a transaction type, a form will open where you can enter the following information:
* **Transaction Type**: The type of transaction (pre-selected from Step 3, but can be changed)
* **Status**: The current status of the transaction. Default is typically **"Owed"** for invoices
* Options: Approved, Paid, Owed, or Void
* **Event**: (Optional) Link to an associated event
* **Payee**: The party receiving or making the payment
* **Invoice Date**: The date the invoice was created
* **Invoice Number**: Reference number for the invoice
* **Due Date**: When the transaction is due
* **Paid Date**: (Optional) Date payment was received
* **Memo**: Additional notes, descriptions, or reference information
* **Amount**: The transaction amount (defaults to \$0)
### Step 5: Save the Transaction
1. Review all entered information
2. Click **"Save"** or **"Create Transaction"** to finalize
The new transaction will appear in your Transactions list with a default status (typically **"Owed"** for invoices or **"Approved"** for other transactions).
# Forwarded Invoices
Source: https://docs.aiinsurance.io/financials/invoicing/forwarded-invoices
Forwarded Invoices allows you to automatically process invoices by forwarding them via email. This is the recommended method for submitting invoices to the system, as it streamlines the invoice parsing and auditing workflow.
## Authorized Senders
The system only accepts invoices from recognized email addresses. The address you forward from must match one of the following:
* **A user** in your company (the user must have permission to update payments)
* **A payee**, matched against either the payee's **Email** field or **Alternate Emails** field
* **An attorney**, matched against the attorney's email
If the sending address doesn't match any of these, the invoice is rejected and the sender receives a bounce-back email explaining why.
If a vendor or third party will be forwarding invoices directly, add their email address to the corresponding payee's **Email** or **Alternate Emails** field before they send their first invoice.
## How to Forward Invoices
1. In the sidebar, click the **Financials** tab to open the **Financials** page.
2. Click the **Forwarded Invoices** tab.
3. Copy the email address displayed on the page.
4. Forward your invoice email to that address.
## What Happens Next
After forwarding an invoice:
* The system automatically parses the invoice data
* A new transaction is created for you to review
* The invoice is processed through Invoice Audit (if enabled)
* You can review and validate the parsed data
## Using Forwarded Invoices for Invoice Audit
Forwarded Invoices is the primary method for submitting invoices to the Invoice Audit system. When you forward an invoice:
1. The invoice is automatically parsed and evaluated against your audit rules
2. Violations and compliant items are flagged for your review
3. You can fine-tune your audit rules based on the results
For more information about Invoice Audit, see [Invoice Auditing](financials/invoicing/invoice-auditing#validation-and-fine-tuning).
**Note**: Forwarding invoices via email is the recommended primary workflow. You can also manually upload invoices, but email forwarding provides a more streamlined experience.
# Generating One-Off Invoices
Source: https://docs.aiinsurance.io/financials/invoicing/generating-one-off-invoices
## Overview
This guide describes how to collect a one-off payment when an invoice has already been issued, or when you need to collect money directly from the insured using a payment form.
## When to Use This Workflow
Use this process when you need to collect a single payment directly from the insured but do not want to change the billing method on the policy. This process is also used when an invoice was already sent and you need to re-collect payment.
For example If you are changing a policy from **agency bill to direct bill**, the workflow is different and involves voiding the invoice and creating a new manual invoice. That use case is described separately.
## Step-by-Step Process
### Step 1: Confirm the Existing Invoice
If the invoice has already been sent, **do not void it**. You will continue to use the existing invoice record in the system.
If no invoice exists for the amount you need to collect, create one manually before continuing. To do this:
1. Go to **Financials** → **Transactions**
2. Click the **"New Transaction"** button
3. Select the appropriate transaction type from the dropdown (e.g., **Policy Invoice**, **Commission Invoice**, etc.)
4. Fill in the invoice details
5. Save the transaction
This becomes the invoice you will later mark as paid.
For detailed instructions on creating manual financial transactions, see [Financial Transactions](/financials/invoicing/financial-transactions).
### Step 2: Generate a Payment Form
1. Open the policy associated with the invoice
2. Go to the **Forms** section
3. Create a new form with billing information and ACH fields. For detailed instructions, see [Creating and Validating Forms](/platform/companies/creating-and-validating-forms/creating-and-validating-forms)
4. Apply the form to the policy through an endorsement. For detailed instructions, see [Endorse a Policy](/policing/policy-management/endorsing-policy/overview)
5. The form will be sent to the insured so they can submit payment directly to the bank account specified in the form
**Important**: There is no form type called "Invoice." The form is only used to collect payment.
### Step 3: Mark the Invoice as Paid Once Funds Arrive
The payment collected through the form goes directly to the financial account entered in the form. When the payment is deposited, return to the invoice inside AI Insurance and manually mark it as paid:
1. Navigate to **Financials** → **Transactions**
2. Find the invoice
3. Select the checkbox next to the invoice
4. Click the **"Mark As"** dropdown button
5. Select **"Paid"** to mark the invoice as paid
## Re-Sending an Invoice
You can resend an invoice in two ways, depending on how it was originally created:
### For AI-Generated Invoices
If the invoice was generated automatically by AI Insurance:
1. Navigate to **Financials** → **Transactions**
2. Open the invoice you want to re-send
3. Copy the invoice link
4. Email the link directly to the insured
### For Manual Invoices
If the invoice was created manually or does not include a link, follow the step-by-step process above (Steps 1-3) to generate a payment form and collect payment.
## Converting Agency Bill to Direct Bill
If you are changing a policy from **agency bill to direct bill**, you need to void the existing invoice and create a new manual invoice. Follow these steps:
**Note**: This is the only scenario where you should void an existing invoice. For all other cases, keep the existing invoice and use the process above.
### Step 1: Void the Agency Bill Invoice
1. Navigate to **Financials** → **Transactions**
2. Find the agency bill invoice you need to void
3. Select the checkbox next to the invoice
4. Click the **"Mark As"** dropdown button
5. Select **"Void"** from the options
6. Confirm the void action
**Important**: Voiding an invoice cannot be undone. The original invoice will be marked as cancelled and will no longer be active for billing purposes.
### Step 2: Generate a Payment Form
1. Open the policy associated with the original invoice
2. Navigate to the **Forms** section
3. Create a new form with billing details and ACH information. For detailed instructions, see [Creating and Validating Forms](/platform/companies/creating-and-validating-forms/creating-and-validating-forms)
4. Apply the form to the policy through an endorsement. For detailed instructions, see [Endorse a Policy](/policing/policy-management/endorsing-policy/overview)
5. The form will be sent directly to the client (insured) instead of the broker
**Important**: Generating a form does **not** create an invoice. You need to manually create a new transaction in the Financials tab (see Step 3 below).
### Step 3: Create a New Transaction (Manual Invoice)
Follow the manual invoice creation steps from **Step 1** above to create a new transaction. Fill in the invoice details matching the voided invoice.
For detailed instructions on creating manual financial transactions, including all available fields and transaction types, see [Financial Transactions](/financials/invoicing/financial-transactions).
### Step 4: Mark Invoice as Paid
Once payment has been received in your bank account:
1. Navigate to **Financials** → **Transactions**
2. Find the invoice you created
3. Select the checkbox next to the invoice
4. Click the **"Mark As"** dropdown button
5. Select **"Paid"** to mark the invoice as paid
# Invoice Auditing
Source: https://docs.aiinsurance.io/financials/invoicing/invoice-auditing
Invoice Audit is an AI Insurance service that leverages advanced large language models to meticulously evaluate invoices for any discrepancies or breaches of service agreements between Claims Managers and the firms submitting those invoices.
The Invoice Audit service is only available to customers who have purchased the Invoice Audit module and is only for ALAE transactions.
## Key features
The Invoice Audit product has several key features, some of which are:
* **Invoice parsing**: Invoice Audit employs sophisticated natural language processing techniques to accurately extract and interpret data from invoices, including line items, charges, and other relevant details.
* **Rules-based evaluation**: Users can define custom rules and criteria to guide the invoice evaluation. These rules can specify which fees should not be charged, ensuring that invoices adhere to the agreed-upon service agreements.
* **Automated discrepancy detection**: Invoice Audit automatically identifies and highlights discrepancies when fees are miscalculated, including sums of line items across the invoice.
* **Validation and adjustment:** Users can easily validate the results of the invoice audit by comparing the system's findings with their assessments. They can adjust the invoice audit settings to refine the evaluation process and achieve optimal results if necessary.
## Invoice Audit use cases
The Invoice Audit service can be used for different scenarios, including:
* Identifying and flagging invoices that contain charges for services not covered in the service agreement.
* Detecting duplicate or inflated charges within invoices.
* Ensuring compliance with contractual terms and conditions related to invoice submission and payment.
## Setting up Invoice Audit
Follow these steps to get started with the Invoice Audit service:
1. Go to your company settings by clicking your company name in the sidebar and selecting the **Company** tab.
2. Click the **Edit** button at the top right of the section and insert your rules.
While inserting your rules, we recommend following these best practices:
* Use a vocabulary that’s industry standard. Using company-specific terminology will likely cause issues with AI determining definitions and flagging inappropriate fees.
* Explain your rules like you’re instructing an intern unfamiliar with most of your internal practices.
* Rules should be broad. Artificial Intelligence has less efficacy when the rules are too specific and context-rich. Invoice Audit should be used to find potential violations. For example:
* **Do not use**: “We will only pay for up to 4 hours of document filing.”
* **Do use**: “We will not pay for document filing.”\*\*
## Validation and fine-tuning
To validate your rules, forward an invoice to the system. For detailed instructions on how to use forwarded invoices, see [Forwarded Invoices](/financials/invoicing/forwarded-invoices).
The system will automatically parse the invoice and create a new transaction for you to review.
### **Review results**
After forwarding or uploading an invoice, the platform will parse the data and automatically fill in as many fields as possible. Your results will look like this:
In the **Itemizations** section, you'll see each item on the invoice, categorized by two icons: a flag and a wand. They represent:
* A flag indicates a violation detected by our auditing system. Clicking the flag shows the predicted violation.
* A wand means the itemization was parsed, evaluated, and found to be compliant with the rules.
### **Fine-tuning your audit rules:**
You should fine-tune your rules for better accuracy in Invoice Audit evaluations. Adjust the wording of your regulations and reprocess invoices to identify the best phrasing for detecting violations.
# Mark Transaction Status Function
Source: https://docs.aiinsurance.io/financials/invoicing/mark-transaction-status
The **Mark Transaction Status** function allows you to update the status of any financial transaction in the system. This function is available across multiple sections of the platform for comprehensive financial transaction management.
## Where to Access Mark Transaction Status
The **Mark Transaction Status** function is available in multiple locations throughout the platform, but you can primarily find it in the **Financial** sidebar by following these steps:
Find **Financials** in the sidebar navigation. Locate and access the **Transactions** section
1. Select Transaction: Click on the transaction you want to update
2. Open Status Menu: Click the **Mark As** dropdown button
3. The interface adapts based on your selections and available actions
The Mark Transaction Status function enables you to change the status of any financial transaction to one of four available statuses: **Approved**, **Paid**, **Owed**, **Void**
## Other locations
* **Financials Section**: For system-wide transaction management
* **Policy Financials Tab**: For policy-specific transaction updates
* Navigate: [**Policies**](https://aiinsurance-1ef97d09.mintlify.app/policing/policy-management/viewing-a-policy) → Select policy → Financials tab
* **Event Financials Tab**: For event-related transaction changes
* Navigate: [**Events**](https://aiinsurance-1ef97d09.mintlify.app/events/view-events/view-events) → Select event → Financials tab
**Status Change Restrictions:**
* Paid transactions should generally not be changed to Owed (create reversing entry instead)
* Void transactions cannot be reactivated (create new transaction if needed)
* Always verify impact before changing from Paid status
## Understanding All Transaction Statuses
Use the Approved status when an invoice has been reviewed and validated, is ready for payment processing, or is awaiting final payment execution.
Transaction has been successfully completed and payment received. Use it when payment has been confirmed and processed
Transaction is outstanding and awaiting payment. Use it for unpaid invoices that are due for collection
Transaction has been cancelled and is no longer active. For billing errors, cancellations, or corrections.
Voided invoices cannot be adjusted further once their status is set to **"void"**
## Integration with Stripe
For customers with premium billing enabled, invoices issued through Stripe can be updated using the **Mark Transaction Status** function. Any status changes are automatically synchronized with the Stripe dashboard, ensuring consistency across both platforms. This applies to all Stripe transaction types.
# Overview
Source: https://docs.aiinsurance.io/financials/invoicing/overview
The platform manages invoicing by :
* Generating invoices to collect policy premium
* Automating invoice reconciliation.
* Providing invoice payment plans (Monthly or Quarterly) and supporting down payments
* Receiving and paying ALAE bills directly from AI Insurance.
## Prerequisite
Set up [Cash Management](/platform/companies/cash-management/cash-management) within your application to manage invoices and billings.
## Invoicing
You can create, send, and pay invoices out of the platform.
### **Create an Invoice**
When **Cash Management** is all set up, a new **Billing** section will be added whenever you [Create a PoIicy](/policing/policy-management/policy-issuance).
The **Billing** section is divided into two parts, as shown in the image below: **Bill** and **Payment.**
#### Bill section
This section contains information on the total amount, including premiums, taxes, and fees, an insured is expected to pay, as stated in the policy.
You can also add additional fees in this section; these additions will automatically affect the policy’s grand total and appear directly on the generated invoice.
#### Payment
This section allows you to indicate the insured's payment periods and billing email address. We offer three payment schedule options.
* **Annually**: This method sends the recipient an invoice for the due amount.
* **Quarterly Payments**: In this payment method, we’ll create four equal payments and send them to the recipient. We’ve also added the option to increase the total amount due by a percentage of your choice if you wish to add an additional charge for this option.
The initial invoice will be generated up to one quarter before the policy start date, and then future invoices will continue to be issued a quarter in advance.
* **Monthly Payments**: We will generate separate monthly payments, and the recipient will receive links to the new invoice on the same day of the month that the policy starts (e.g., If the policy start date is 1/4/2024, then invoices will be sent each month on the 4th day).
Each invoice is sent a month in advance and is due on the same day of the next month. Similar to the **Quarterly** payment period option, we allow for an adjustment in the total amount due.
We also provide the functionality to require down payments.
* **Do not send bill**: We don’t require that you bill through AI Insurance. Select this option to avoid creating an invoice and sending it to the recipient.
**Note:** When using this option, please note that, in addition to an invoice not being generated, we will not automatically track this invoice in the Financial section of our app.
After creating the invoice, we’ll automatically send it to the billing email address provided. This can be the email of the insured, their broker, an AP department, a premium finance company, or others. You can even send the invoice to yourself if you still want to track it and mark it as paid manually.
Invoices are only generated and sent once the created policy has been bound/confirmed or a quote has been accepted.
## View Invoices
After entering your billing information, create a policy to receive the invoice link in the recipient’s email. Here’s an example invoice below:
A link to the invoice and payment details will also be added to the **Transactions** section on the **Financials** page. Click the **Financials** tab at the sidebar to open the **Financials** page as shown below:
Clicking on the invoice takes you to the digital version, which you can download as a PDF or share with another third party via the URL.
## Premium Changes
It’s common for [endorsements](/policing/policy-management/endorsing-a-policy) to impact premiums throughout a policy's active lifecycle. These endorsements may mean adding insureds (increasing the premium), terminating insureds (decreasing the premium), or changing the terms of their coverage. We handle this increase or decrease automatically for our users, depending on the payment period associated with the policy:
#### Paid in Full
We handle premium changes for a policy with a payment period of **Pay in full** as follows:
* **Premium Increase**: We will generate a new invoice to request the additional premium payment required.
* **Premium Decrease**: We will issue a refund if the entire premium has already been paid. Otherwise, we'll void the outstanding invoice and re-issue a new one for the correct amount.
#### Quarterly or Monthly
We handle premium changes for a policy with a payment period of **Quarterly or Monthly** as follows:
* **Premium Increase**: The additional premium amount will be amortized over all remaining invoices to be sent.
* **Premium Decrease**: The decrease in premium will be amortized over all remaining invoices to be sent.
## Policy Deletion and Invoice Handling
When a policy is deleted under Actions → Delete Policy, the system automatically:
* **Voids all associated invoices** automatically
* **Maintains financial records** - deleted policies and their voided invoices remain viewable in the Financials tab for recordkeeping purposes
For more information on deleting policies, see [Delete a Policy](/policing/policy-management/deleting-a-policy).
## Payment Reconciliation
The platform automatically handles payment reconciliation for invoices, including scenarios where payments are over or under the expected amount.
### Auto-Reconciliation Rules
Our auto-reconciliation feature applies the following rules:
* **30-Day Window**: Auto-reconciliation only applies to invoices that are less than 30 days overdue
* **Due Date Alignment**: Due dates align with the invoice date (e.g., if an invoice is generated on January 15th, it's due on February 15th)
* **Payment Matching**: The system automatically matches payments to the corresponding invoices within the reconciliation window
### Handling Over/Underpaid Funds
When payments don't match the exact invoice amount, the platform handles the difference as follows:
#### Overpaid Amounts
* **Credit Application**: Overpaid amounts are automatically applied as credits to the insured's account
* **Future Invoice Deduction**: Credits are automatically deducted from the next invoice due
* **Credit Balance**: You can view the current credit balance in the **Transactions** section of the **Financials** page
#### Underpaid Amounts
* **Partial Payment Recording**: The system records the partial payment and maintains the outstanding balance
* **Reminder Notifications**: Automated reminders are sent for the remaining balance
* **Late Fee Application**: Late fees may be applied if the invoice exceeds the 30-day overdue period
#### Manual Reconciliation
For invoices that exceed the 30-day auto-reconciliation window:
* Manual intervention may be required to properly allocate payments
* You can manually adjust payment allocations in the **Transactions** section
* Contact support if you need assistance with complex reconciliation scenarios
Regular monitoring of the **Transactions** section in **Financials** is recommended to ensure all payments are properly reconciled and to address any discrepancies promptly.
## Down Payment Invoices
For detailed information about how down payments appear on invoices, including examples and explanations of the credit system, see [Down Payment Invoices](/financials/invoicing/down-payment-invoices).
## Handling Duplicate Payments
If you receive an incoming payment for an invoice that has already been marked as paid, the system automatically places these funds into unallocated funds. You can then create an additional invoice to apply the funds to, followed by a refund invoice to properly document the return of funds to the client. For detailed steps on this workflow, see the [Handling Payments on Already-Paid Invoices](/financials/payments#handling-payments-on-already-paid-invoices) section in the Payments documentation.
# Record Payment
Source: https://docs.aiinsurance.io/financials/invoicing/record-payment
## Overview
The 'Record Payment' action allows you to manually record payments or refunds for invoices. This feature is useful for various scenarios including handling complex payment situations.
## How to Record a Payment
### Step 1: Navigate to the Invoice
1. Go to **Financials** in the sidebar
2. Navigate to the **Transactions** section
3. Select the invoice you want to record a payment for
### Step 2: Use the 'Record Payment' Action
1. On the invoice's detail page, locate the **Actions** dropdown button
2. Click **"Record Payment"** from the dropdown menu
### Step 3: Enter Payment Details
The "Record Payment" modal will open with the following fields:
1. **Amount**: Enter the payment amount in the 'Amount' field
2. **Memo**: This is a field where you can add information about the payment. You can record:
* Payment method (check number, wire transfer, etc.)
* Reference numbers
* Additional notes about the payment
3. **Paid Date**: Enter the date the payment was received
### Step 4: Save the Payment
1. Verify the entered details
2. Click the **"Record Payment"** button within the modal to save the entry
## Special Use Case: Payments for Multiple Invoices
As a special use case, you can use the Record Payment feature when a single check covers multiple invoices or when the payment amount doesn't match any single invoice exactly.
### How to Handle Multiple Invoice Payments
When you receive a single check that covers multiple invoices, you should:
1. Record a payment for each invoice you want to mark as paid
2. Use the memo field to document that all payments were from the same check
### Step-by-Step Process
1. Identify all invoices covered by the check
2. Start with the first invoice:
* Navigate to Financials → Transactions
* Select the first invoice
* Click Actions → "Record Payment"
* Enter the portion of the check amount that applies to THIS specific invoice
* In the memo field, include the check number and note it's part of a multi-invoice payment
* Click "Record Payment" to save
3. **Move to the next invoice**:
* Go back to Financials → Transactions
* Select the second invoice
* Click Actions → "Record Payment"
* Enter the portion of the check amount that applies to THIS specific invoice
* Use the same memo format
* Click "Record Payment" to save
4. Continue for each remaining invoice until all invoices are marked as paid
### Example
If Check #3231 for `$1000` covers three invoices (`$200`, `$400`, `$400`):
* **Invoice #101**: Record `$200` payment with memo "200 applied of 1000 check #3231, remainder credited to invoices #101, #012, #104"
* **Invoice #012**: Record `$400` payment with memo "200 applied of 1000 check #3231, remainder credited to invoices #101, #012, #104"
* **Invoice #104**: Record `$400` payment with memo "200 applied of 1000 check #3231, remainder credited to invoices #101, #012, #104"
**Note**: You could record the check number and a comment about the check paying multiple invoices in the memo field. This ensures proper reconciliation and provides a clear audit trail for complex payment scenarios.
This approach ensures that each invoice is properly marked as paid with the appropriate portion of the refund amount, while maintaining clear documentation of how the refund was allocated across multiple invoices.
# Payments
Source: https://docs.aiinsurance.io/financials/payments/payments
We support payment options through any of the methods mentioned on the [payment method](https://docs.stripe.com/connect/account-capabilities) list. Typically, our customers will use one or more of the following:
* ACH Direct Debit
* Bank Transfers
* Credit Card Payments (Please note that, at the time of this writing, there is a 2.9% + 30 cents fee per transaction)
## Payment Fees
When you make a payment out of AI Insurance using Stripe Treasury ACH, no fee is charged.
## Pay a Bill
Take the following steps to pay the bills:
1. Click on the **Financials** tab to open the **Financials** page.
2. Locate the **Transactions** section and click to open the bill you wish to pay. This action will lead you to a Stripe page.
3. Select the appropriate payment method and complete the payment.
**Note:** After payment, the bill status will remain as **Processing** until the payment is confirmed via our payments provider. Once confirmed, this status will change to **Paid**.
## Pay a Bill outside of the platform
You can mark a bill as paid, even if they were paid outside of AI Insurance, by:
1. Navigate to the **Transactions** section and select the transaction you want to mark as paid.
2. Click the **Mark As** button and select **Paid** from the options.
### Record a payment
You can easily record payments made in installments by following these steps:
1. Open the bill or transaction you want to record a payment for.
2. Click the **Actions** button in the top-right corner of the page, then select **Record Payment**.
3. Fill in the payment details:
* **Memo**: Add a note about the payment.
* **Amount**: Enter the amount paid.
* **Paid Date**: Enter the date the payment was made.
4. Click the **Record Payment** button. After saving, you’ll see a **Payments** section appear on the transaction.
**Note**: If the payment amount exceeds the balance, a **Total Paid** value will also appear in the Basic Information section of the transaction.
## Overpayment and Underpayment
AI Insurance will automatically apply your client's ACH funds to the correct invoice if the amounts match.
If the amounts do not match, we will apply the funds to the largest invoice that these funds can completely pay. The remaining amount will be held for 30 days unless additional funds are ACH'd, bringing the total above the amount of an outstanding invoice for that client.
After 30 days, any unmatched funds will be returned to the client.
Let's look at this example to better understand how overpayment or underpayment is handled in the AI Insurance platform.
Your client (Manu Corp Inc.) has two outstanding invoices
* \$1000 (A)
* \$3500 (B)
They pay the second (B) but underpay only ACH \$2000. AI Insurance will apply the funds to Invoice A. The client's state will then look like this
* \$3500 (B) Owed
* \$1000 (held in temporary account)
If the client ACHs the additional \$2500 you are owed within 30 days, invoice B will be paid. If they do not, the \$1000 will be returned to them.
## Handling Payments on Already-Paid Invoices
When you receive an incoming payment for an invoice that has already been marked as paid, AI Insurance handles this scenario through its unallocated funds system and refund invoice workflow.
### Automatic Processing
When a payment is received for an already-paid invoice:
1. **Unallocated Funds**: The payment is automatically placed into **unallocated funds** rather than being applied to the paid invoice
2. **System Recognition**: The platform recognizes that the invoice is already marked as paid and prevents duplicate payment application
3. **Fund Tracking**: The unallocated funds are tracked in your operating account balance
### Refund Invoice Workflow
To properly handle and return the duplicate payment:
#### Step 1: Create Additional Invoice
1. Navigate to the appropriate policy or transaction
2. Create an additional invoice for the amount received
3. Apply the unallocated funds to this new invoice
#### Step 2: Create Refund Invoice
1. Once the funds are applied to the additional invoice, create a **refund invoice**
2. The refund invoice indicates that the funds are being returned to the client
3. This creates a proper audit trail for the refund transaction
#### Step 3: Process Refund
1. Use the refund invoice to authorize the return of funds
2. Cut a check or initiate an electronic transfer to send the money back to the client
3. The refund invoice serves as documentation for the returned payment
### Benefits of This Workflow
* **Proper Audit Trail**: Creates clear documentation of the duplicate payment and refund
* **Balance Accuracy**: Maintains accurate account balances by properly tracking unallocated funds
* **Compliance**: Ensures proper financial record-keeping for accounting and regulatory purposes
* **Client Transparency**: Provides clear documentation for clients regarding duplicate payments and refunds
**Important**: This workflow ensures that all payments are properly tracked and that refunds are documented correctly for both internal accounting and client transparency purposes.
# Glossary
Source: https://docs.aiinsurance.io/getting-started/glossary
**Activity Tab**
Records and tracks events happening on the platform, ensuring transparency and traceability of event information.
**ALAE**
ALAE, or Allocated Loss Adjustment Expense, refers to the costs directly linked to handling a specific insurance claim. These expenses include things like legal fees, investigation costs, or expert services that are necessary to process or resolve a claim
**ALAE Paid**
The actual sum of all paid ALAE invoices associated with an event.
**ALAE Reserve**
The calculated reserve amount for ALAE is the difference between the expected total ALAE and ALAE paid.
**Adjustments**
Custom changes made to the premium, including credits (discounts), debits (surcharges), and other modifications based on specific conditions or policies.
**Base Rate**
The base rate is the starting cost used to calculate an insurance premium before any adjustments like surcharges, discounts, or other rating factors are applied. It reflects the standard cost of insuring a specific risk under typical conditions.
**Binding**
To bind a policy means to make the coverage official and active by finalizing the terms and conditions of the insurance agreement between the insurer and the policyholder. Binding a policy essentially means that the insurance contract is in force, and the insurer is committed to providing the coverage specified in the policy.
**Broker**
An individual or representative working under a brokerage who sells insurance policies and earns commissions.
**Brokerage**
A business entity that manages brokers and facilitates the sale of insurance policies. Brokerages can have multiple brokers working under them.
**Captive Managers**
Captive managers are responsible for managing a captive insurance company, which is an insurance company created and owned by one or more non-insurance companies to insure their own risks.
**Certificate of Insurance (COI)**
A document issued by an insurance company that verifies the existence of insurance coverage for an individual or business.
**Claim**
A formal demand for money or a lawsuit that arises from an incident.
**Commission Rate**
The percentage of the policy premium that a broker earns as compensation for their role in selling the policy.
**Coverage**
Refers to the specific protections provided by the insurance policy. It defines the situations and events that the insurance policy will pay for. For example, a car insurance policy may cover accidents but not mechanical breakdowns.
**Coverage Type**
The type of insurance coverage applied to the event configured by the organization.
**Credits and Debits**
Adjustments that either decrease (credits) or increase (debits) the premium based on specific criteria, such as exposure level, behavior, or location.
**Defendant**
In an insurance context, a defendant is someone being sued or held responsible in a legal case.
**Deductible**
The amount the insured must pay out of pocket before the insurer starts to cover the costs of a claim.
**Entity Type**
The classification of individuals, organizations, or objects under an insurance policy based on their roles or exposure profiles. This classification helps determine the coverage type and exposure assessment.
**Endorse a Policy**
To endorse a policy means to make changes or updates to an existing insurance policy after it has been issued. These changes could include alterations in coverage or terms.
**Expected Total ALAE (Allocated Loss Adjustment Expense)**
The total expected cost for handling a claim, such as legal or investigation fees, by the time the claim closes.
**Fees**
Administrative charges or fees added to the insurance premium, unrelated to the coverage itself but often charged by the carrier.
**Form Editor**
An AI Insurance tool that allows users to create and modify policy forms. It features word-processing-like functionality, including the ability to import, edit, and add Smart Tags.
**Forms (Policy Issuance)**
Documents required for policy review and acceptance. Smart Tags can auto-populate these forms with information from the policy creation process.
**Historical Data Import**
A service that allows customers to populate their AI Insurance system with historical data, eliminating the need to maintain records across multiple systems.
**Incident**
An unexpected event or occurrence that is tracked because it could potentially lead to a claim or lawsuit.
**Insured**
An entity (individual, business, or organization) covered by an insurance policy.
**Insurance Policy**
A formal agreement between the insurance company and the insured, outlining the terms, conditions, coverage, and other details about the insurance contract.
**Invoice Audit**
An AI Insurance service designed to automatically review invoices for discrepancies, ensuring they align with service agreements and identifying potential billing errors.
**Liability**
Refers to legal responsibility for something. Liability insurance protects against costs associated with being found legally responsible for damages or injuries caused by accidents.
**Loss**
The event or damage that leads to a claim being made under the insurance policy.
**Modifier Factor**
An adjustment factor applied to the base rate to reflect specific characteristics, behaviors, or conditions that impact the insured’s risk. Modifier factors help tailor the base rate to the individual’s risk profile, making the premium more accurate and fair based on their unique circumstances.
**MGAs (Managing General Agents)**
Entities or agents that operate on behalf of an insurance carrier. They can perform several tasks, such as selling policies, managing claims, and even underwriting. They act as intermediaries between the insurer and the insured.
**Operating Account**
An account set up within AI Insurance to enable premium billing functionality and process payments.
**Payee**
An individual or company that receives payment.
**Policy Issuance**
The process of creating and issuing an insurance policy, which involves adding forms, reviewing information, and confirming details.
**Premium**
The total cost of an insurance policy, calculated using the base rate and modifier factors and adjusted for other variables like surcharges, discounts, or taxes.
**Premium Billing**
An AI Insurance feature that enables you to generate invoices, collect policy premiums, and manage payments for insurance policies.
**Premium Calculation Formula**
The formula used to calculate the policy premium:
```
Policy premium = Base rate * Modifier factor
```
**Presets**
Predefined configurations of export settings that save time when exporting data. Users can create, update, or remove presets for frequently used export configurations.
**Policy-Level Rating Questions**
These questions evaluate the overall risk associated with the policyholder, typically used to assess the organization or entity as a whole, such as a company or hospital.
**Rating Engine**
A system or tool used to calculate an insurance policy's premium based on the insured's responses to a series of rating questions, which determine the exposure level and appropriate adjustments to the base rate.
**Rating Question**
A question asked to an insured to assess their exposure and determine their policy premium. These questions can be about age, lifestyle, medical history, or other factors affecting the exposure level.
**Exposure**
A specific entity, individual, or item covered under an insurance policy, such as a person (e.g., doctor), object (e.g., vehicle), or location (e.g., hospital). These are evaluated with exposure-level rating questions.
**Exposure-Level Rating Questions**
These questions assess the individual or specific exposures associated with entities under a policy, such as individual professionals (e.g., doctors) or specific items (e.g., vehicles, properties).
**Taxes**
State-specific charges applied to an insurance premium that vary depending on the location of the insured.
**Underwriting**
The process of evaluating the risk and determining the terms and conditions of an insurance policy, including premium calculations based on questions answered by the insured.
**Warranty**
A guarantee made by the insurer that certain conditions will be met, often linked to the performance or maintenance of covered items.
**Smart Tags**
Dynamic placeholders used in forms or documents that auto-populate with policy-specific data for faster and more accurate processing.
**Submission**
The process of presenting an application or risk to an insurer for evaluation and potential underwriting.
**Reserves**
Funds set aside by the insurer to cover future claim obligations, including both known claims and potential liabilities.
**Written Premium**
The total amount of premiums recorded by an insurer for policies issued within a specific accounting period.
**Active Premium**
The portion of the written premium that corresponds to active policies currently in force.
**Earned Premium**
The portion of the written premium that reflects the revenue earned for the coverage provided during a specific period.
**Applicant**
An individual or entity applying for insurance coverage, subject to risk evaluation and pricing decisions.
**Avg Close Rate**
```
Avg Close Rate=(Number of Policies Sold/Total Quotes Provided )×100
```
**Expense vs. Indemnity**
It reflects how much the company spends on operational costs relative to the actual claims paid.
A comparison of operational costs versus claims payouts.
**Expense**: Costs associated with underwriting and managing claims.
**Indemnity**: Payments made to policyholders to cover losses.
**Average Incurred Cost (Claims)**
The average total cost of claims incurred by the insurer, including both indemnity payments (actual claim payouts) and related expenses (e.g., investigation, legal fees, etc.).
**Assumed Risk**
The portion of risk transferred to a reinsurer through reinsurance agreements.
**Beneficiary**
The person or entity entitled to receive benefits or proceeds from an insurance policy.
**Binder**
A temporary agreement providing immediate coverage while the formal policy is being prepared.
**Book of Business**
The total portfolio of insurance policies or clients managed by an insurer, agent, or broker.
**Cancellation**
Termination of an insurance policy before its expiration date, either by the insured or the insurer.
**Coinsurance**
A cost-sharing arrangement where the insured and insurer share the claim payment in a specified ratio, e.g., 80/20.
**Contingent Liability**
Liability that may arise in the future depending on the outcome of an uncertain event.
**Declarations Page**
The summary section of an insurance policy that outlines key details like coverage limits, policyholder information, and premiums.
**Direct Premiums Written**
Total premiums collected directly by an insurance company before reinsurance.
**Endorsement**
A document that modifies the terms of an existing insurance policy.
**Exclusions**
Specific risks or circumstances that are not covered under an insurance policy.
**Exposure**
The measure of risk or the potential for loss, often expressed in terms like number of vehicles, properties, or payroll amounts.
**Grace Period**
A specified period after a premium due date during which coverage remains active, even if the premium has not been paid.
**Indemnification**
The process of compensating an insured party for a loss, restoring them to their financial position prior to the loss.
**Loss Ratio**
A key profitability metric calculated as:
```
Loss Ratio = Claims Paid / Premiums Earned
```
**Policy Lapse**
The termination of a policy due to non-payment of premiums or other contractual breaches.
**Reinsurance**
The process of transferring a portion of risk from one insurer to another to reduce exposure to large losses.
**Umbrella Policy**
An additional layer of liability coverage that provides protection beyond the limits of standard policies (e.g., auto or home insurance).
**Additional Insured**
A person or entity added to a policy to receive coverage under the primary insured's policy.
**Aggregate Deductible**
The total deductible amount that must be met across multiple claims before the insurer starts covering costs.
**Claim Reserve**
Funds set aside to pay for anticipated claims, including known and potential liabilities.
**Captive Insurance**
A self-insurance arrangement in which a business forms its own insurance company to cover its risks.
**Proof of Loss**
Documentation provided by the insured to substantiate a claim, including details about the loss and its value.
**Replacement Cost Value (RCV)**
The cost to replace damaged property with new property of similar type and quality, without considering depreciation.
**Subrogation**
The insurer’s right to recover the claim amount from a third party responsible for the loss after reimbursing the insured.
**No-Fault Insurance**
A type of auto insurance where insureds are reimbursed for their damages by their own insurer, regardless of fault.
**Retroactive Date**
The date after which losses must occur to be covered under a claims-made policy.
**Split Limits**
Separate coverage limits for different types of losses, such as bodily injury per person, bodily injury per accident, and property damage.
**Program Managers**
Program Managers design and oversee specialized insurance programs on behalf of insurers, focusing on specific markets, industries, or risk categories.
They manage underwriting, marketing, and administration tasks, leveraging their expertise to help insurers efficiently serve niche markets.
**Captive Managers**
Captive Managers handle the operations of captive insurance companies, which are created by businesses to insure their own risks. They ensure regulatory compliance, manage finances, oversee underwriting, and handle claims administration. Captive Managers empower businesses to take control of their risk management and reduce insurance costs.
**Expected Total Incurred**
This is the total expected cost of a claim, including both indemnity and allocated loss adjustment expenses (ALAE). It's typically calculated as: Expected Total Incurred = Expected Indemnity + Expected ALAE. Expected Indemnity refers to the anticipated amount the insurer expects to pay the insured or claimant, excluding expenses. This is typically estimated using actuarial models that account for factors like claim history, policy terms, and risk characteristics. Expected ALAE includes expenses directly tied to handling the claim, such as legal fees, investigations, or expert consultations. These are often estimated based on historical averages or predictive analytics. Together, these two components form the Expected Total Incurred, giving a complete view of the insurer's expected financial responsibility for a claim.
**Expected Total ALAE**
Expected Total ALAE (Allocated Loss Adjustment Expenses) refers to the projected costs directly tied to handling a specific claim, such as legal fees, expert witness fees, and investigation costs. These expenses are not general overhead but are specifically allocated to individual claims. The expected value is typically estimated using historical data or predictive models that consider characteristics like the line of business, jurisdiction, and expected claim severity.
**Expected Total Indemnity**
Expected Total Indemnity refers to the estimated amount an insurer anticipates paying to the insured or claimant for losses covered under the policy, excluding any claim-handling expenses. This value is typically calculated using actuarial models that incorporate historical claims data, policy terms, exposure characteristics, and assumptions about claim frequency and severity. It serves as a key input in pricing, reserving, and assessing the overall risk of an insurance portfolio.
**TPA (Third-Party Administrator)**
Third-Party Administrators (TPAs) are organizations that manage critical insurance services such as claims processing, underwriting support, customer service, and compliance on behalf of insurers or self-insured companies. By outsourcing to TPAs, companies can streamline operations and focus on their core business activities.
**RRG (Risk Retention Group)**
A Risk Retention Group (RRG) is a member-owned liability insurance company formed under the federal Liability Risk Retention Act. It allows businesses or professionals from similar industries to pool resources and self-insure against liability risks, providing greater control and potential cost savings.
**Captive Owners**
Captive Owners are businesses or organizations that establish captive insurance companies to cover their unique risks. By owning a captive insurer, these entities gain flexibility in policy design, control over claims handling, and potential financial advantages, such as reduced premiums and tax benefits.
**Small Liability Carriers**
Small Liability Carriers are insurance companies specializing in liability coverage with smaller premium volumes, often focusing on niche markets or localized risks. These carriers can benefit from tailored insurance technology platforms, like AI Insurance, that provide scalable solutions for underwriting, claims, and policy management without the high costs of larger systems.
**Application Parsing**
Application Parsing is the process of extracting and analyzing data from insurance applications to streamline policy issuance. With AI Insurance, customers can drag and drop applications into the platform, which uses AI to automatically populate relevant fields. This reduces manual entry errors, speeds up the underwriting process, and improves operational efficiency.
**Actuary**
A professional who evaluates financial risks associated with insurable events using mathematics, statistics, and financial modeling. Actuaries in insurance play a critical role in designing, pricing, and managing policies by assessing the probability of future events, such as accidents, illnesses, or natural disasters, and their associated costs.
**Self-Reconciling Billing**
A billing system that automatically matches payments with invoices, simplifying financial management.
**User Permissions**
Settings that control access levels and functionalities for different users within the insurance platform.
**Indemnity Prediction**
Utilizing AI to forecast the potential costs associated with claims, aiding in better financial planning.
**Underwriting Guidelines**
Criteria and procedures that insurers follow to assess risks and determine policy terms.
# Understanding the AI Insurance Model
Source: https://docs.aiinsurance.io/getting-started/intro-to-aiinsurance/understanding-the-ai-insurance-model
At the core of AI Insurance’s platform is a flexible, object-based data model designed to reflect how insurance policies are structured in the real world. This page explains how rating data is structured within the AI Insurance platform, giving you a clear understanding of how we organize and store the information that drives underwriting, pricing, and claims analysis.
## What Is Rating Data?
**Rating data** is the information used to calculate the price—or **premium**—of an insurance policy. It helps underwriters and rating engines evaluate how risky something is to insure, and how much it should cost. This includes:
* What kind of policy it is
* What is being insured (e.g., buildings, vehicles, people)
* Specific details about those things—like size, structure, revenue, or safety features
***
## How AI Insurance Organizes This Data
Think of a policy like a **folder** that holds everything about an insurance contract. Inside that folder, rating data is organized into two main levels:
### 1. Policy-Level Rating Data
This includes information that applies to the entire policy—regardless of how many items (or "exposures") it covers. This is like the cover sheet of the folder—it applies to everything inside.
Examples:
* Policy Type (e.g., "Claims Made")
* Brokerage (e.g., NFP)
* Program name, Effective/Expiration Dates, etc.
### 2. Exposure-Level Rating Data
Each item being insured—called an exposure—has its own set of data fields.
For example, if you're insuring three buildings, each one is treated as a separate **exposure object**, each with its own details:
* Number of stories
* Construction material (e.g., stone, wood)
* Fire suppression system (Yes/No)
* Estimated replacement cost
* Annual revenue (for business exposures)
This level of detail allows the platform to rate each exposure independently based on its features.
### Example: Insuring 3 Buildings
Let’s say the policy is for **Resident’s Group LLC**, which owns 3 buildings. Here’s how that data would be structured in AI Insurance:
Policy: `ABC-1234`
* **Policy Type**: Claims Made
* **Brokerage**: NFP
* **Insured Entity**: Resident’s Group LLC
* **FEIN**: \[XX-XXXXXXX]
* **Annual Revenue**: \$X,XXX,XXX
Covered Exposures:
* **Building 1**
* 3 stories
* Stone masonry
* Fire suppression system: Yes
* **Building 2**
* 4 stories
* Joisted wood
* Fire suppression system: Yes
* **Building 3**
* 6 stories
* Stone masonry
* Fire suppression system: No
In AI Insurance, each building has its own digital "card" inside the policy folder. This enables precise pricing, reporting, and analytics.
## How the Data Model Works for Quotes and Policies
The same object-based structure that organizes rating data also powers the entire insurance lifecycle—from initial quotes to active policies. Here's how it works:
### Quotes: The Foundation
When creating a quote, the data model captures the same two-level structure:
1. Quote-Level Data:
* Quote type and effective dates
* Brokerage and program information
* Overall terms and conditions
2. Exposure-Level Data:
* Individual exposure characteristics for pricing
* Coverage limits and deductibles per exposure
* Rating factors and modifiers
This structure allows rating engines to calculate premiums for each exposure independently, then aggregate them into a total quote premium.
### From Quote to Policy
When a quote is bound and becomes a policy, the data model maintains the same structure but adds policy-specific information:
**Policy-Level Additions:**
* Policy number and binding information
* Premium payment schedules
* Policy endorsements and modifications
**Exposure-Level Continuity:**
* The same exposure objects carry forward from quote to policy
* Individual exposure premiums and coverages are preserved
* Exposure-specific endorsements can be added
### Example: Quote to Policy Flow
**Step 1: Quote Creation**
* Quote `Q-2024-001` for Resident's Group LLC
* 3 buildings with individual exposure assessments
* Each building rated independently based on its characteristics
**Step 2: Quote Binding**
* Quote becomes Policy `ABC-1234`
* All exposure-level data preserved
* Policy-level terms finalized
**Step 3: Policy Management**
* Individual buildings can be modified, added, or removed
* Exposure-specific endorsements applied
* Claims linked to specific exposure objects
This seamless flow from quote to policy ensures data consistency and enables precise tracking throughout the insurance lifecycle.
## Why This Data Model Matters
The AI Insurance data model isn't just about organizing information—it's about **enabling better insurance decisions** through structured, granular data. Here's what this approach delivers:
### Precision in Pricing
By treating each exposure as an independent object with its own characteristics, underwriters can apply the most accurate rating factors to each individual item. A 6-story building without fire suppression gets rated differently than a 3-story building with full sprinkler systems, even if they're on the same policy.
### Flexibility in Policy Structure
The folder-and-cards approach mirrors real-world insurance relationships. Whether you're insuring one building or fifty, the same data structure applies. Add or remove exposures without disrupting the overall policy framework.
### Enhanced Analytics and Reporting
With each exposure object containing its own detailed data, you can generate insights at multiple levels:
* Policy-level reports show overall portfolio performance
* Exposure-level analysis reveals which specific items drive losses or profitability
* Comparative analytics help identify patterns across different exposure types
### Streamlined Workflows
This object-based approach supports modern insurance workflows:
* Rating engines can access individual exposure data for automated pricing
* Claims systems can link incidents to specific exposure objects
* Audit processes can verify coverage against individual exposure characteristics
AI Insurance's data model organizes rating data into policy-level and exposure-level components, the platform provides the foundation for accurate pricing, comprehensive reporting, and data-driven decision making—all while maintaining the intuitive structure that insurance professionals expect.
# What is AI Insurance
Source: https://docs.aiinsurance.io/getting-started/intro-to-aiinsurance/what-is-aiinsurance
Founded in 2018, AI Insurance is a cloud-based platform designed to automate and streamline insurance processes for small and midsize insurance companies, including Programs, Captives, RRGs, and TPAs. By replacing outdated systems and spreadsheets and supercharging with artificial intelligence(AI), AI Insurance offers an affordable, scalable, and efficient solution for managing everything from policy creation and management to claims processing.
Our platform enables insurance companies to operate at the speed and efficiency of top tech companies, even with fewer resources. With customizable access levels, AI Insurance ensures that every stakeholder can easily view and export the information they need to run their part of the business.
## Key features of AI Insurance
AI Insurance provides comprehensive features to streamline and enhance your insurance operations. Here’s a look at some of its key capabilities:
* **Rating engine & underwriting workbench:** AI Insurance automates much of the underwriting process using its [](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine)[Rating Engine](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine). It gathers data, such as the insured’s location, claims history, and overall risk profile, allowing the system to assess potential risks and determine the appropriate premiums for each applicant.
* **Indemnity prediction using AI:** By leveraging AI, AI Insurance can analyze documents such as invoices and automatically extract useful information. It also scans your company’s policies to identify claims that may not be covered, helping you effectively manage risks.
* **Policy issuance & management:** With AI Insurance, you can easily generate quotes based on answers to submission questions. These quotes can then be bound into policies depending on the agreements between carriers, brokers, and insured parties.
* **Claims management:** AI Insurance allows you to digitize and automate claims management. Through the user-friendly dashboard, you can create, close, or delete incidents and claims seamlessly. You can also add important details such as whether the claim escalated into a lawsuit, if a payout was made, and who was involved. All information related to a specific claim is consolidated in one place, including the relevant policy details.
* **Financial tracking & audit control:** AI Insurance automatically tracks and logs every action in your system. This provides a detailed audit trail, helping you monitor activities such as identifying who initiated payouts, the amounts involved, and the reasons behind them. This feature is useful for auditing purposes, ensuring transparency and accountability.
* **Applicant & broker portals:** AI Insurance offers separate portals for different stakeholders—carriers, insured parties, and brokers—each with tailored access to relevant information. This ensures that users see only the data they need to perform their tasks.
## Why AI Insurance?
AI Insurance is a fully integrated SaaS solution designed to tackle the unique challenges insurance programs face. Here’s why it stands out:
* **Affordable:** Perfectly suited for small and midsize programs, with transparent and predictable pricing.
* **Fast deployment:** Launch in as little as 2 weeks, getting your system up and running quickly.
* **Comprehensive features:** Manage policies, claims, vendors, and billing all in one platform.
* **AI-Powered:** Automate key tasks like invoice auditing, submissions processing and more.
* **Scalable:** Built to grow with your business—no extra charges per user or premium percentage.
* **In-House development**: All development is done in-house with no outsourcing, ensuring quality and control.
## How does AI Insurance differ?
AI Insurance is the only insurance core-systems platform powered by AI that handles every part of the program workflow in a single software. It’s also the only platform on the market that doesn’t charge based on premium.
Unlimited custom report building, unlimited support, unlimited seats, and unlimited data and document storage are all included for free.
AI-powered automation minimizes manual effort for data entry, claims processing, and submissions. Intelligent financial architecture means billing, invoicing, and accounts receivable are all self-reconciling. Reminders and collections happen with no human intervention needed. Best of all, the platform is **more affordable** than traditional insurance platforms, offering a cost-effective solution with no hidden fees.
# Getting Started for New Users
Source: https://docs.aiinsurance.io/getting-started/onboarding/getting-started-for-new-users
Welcome to AI Insurance — we’re excited to have you onboard! This guide covers the key steps to get started and ensure your data integrates smoothly with our platform.
Please complete the setup tasks below before you begin. If you have any questions, feel free to contact us at [support@aiinsurance.io](mailto:support@aiinsurance.io).
### 1. Understand Our Data Model
Our platform uses a structured data model to streamline submissions, quoting, and policy management. Understanding this model will help ensure a smoother and more efficient setup. Please take a moment to review the page below:
[Understand the AI Insurance Data Model](https://aiinsurance-1ef97d09.mintlify.app/getting-started/intro-to-aiinsurance/understanding-the-ai-insurance-model)
### 2. Field Mapping
To ensure your data integrates smoothly with our platform, you'll need to map your existing fields to our data model. This process helps us configure your system accurately and reduces delays during onboarding.
For detailed instructions on field mapping, including how to access the Fields Data Model spreadsheet and complete your field mapping, see [How to Add Field Data Model](/getting-started/setting-up-ai-insurance/adding-data-fields).
In addition to field mapping, you’ll also need to complete the following:
1. **Complete the onboarding form**\
You will receive a form from AI Insurance requesting basic information about your organization. This includes your company’s legal name, website, email address, primary admin contact, branding colors, and more.
2. **Pay your invoice**\
We will send an invoice to your billing contact. Once paid, we can move forward with system configuration.
3. **Schedule a kick-off call**\
Meet with your onboarding team to align on goals, clarify features, and outline the implementation timeline. This is also a chance to introduce your internal team and ask any outstanding questions.
Please provide all forms used in your workflows:
* Include both `.docx` and `.pdf` versions
* Place all files in a **single folder** (no subfolders)
* Make sure the folder is compressed into a `.zip` file before uploading
### 3. Send Your Rating Engine Spreadsheets
The [Rating Engine](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine) calculates an insured's policy premium. To set it up:
1. **Lines of Coverage:** Fill out the form and provide us with each line of coverage and associated risk type.
2. **Upload Completed Application**
3. **Complete the Base Rate Spreadsheet:** Fill out the [Base Rate Calculator template](https://docs.google.com/spreadsheets/d/13Gge5MNj3rkwSFypt3U_GmMpPz_hoKxO-JjisEvHdWc/edit?gid=1995514162#gid=1995514162) provided by AI Insurance with base rates and modifying factors for calculating premiums. Refer to the [Rating Engine Documentation](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine) to learn more about the rating engine module.
4. **Complete the Form Attachment Logic Sheet:** Copy into a new spreadsheet and complete the [Forms Logic Template](https://docs.google.com/spreadsheets/d/1voAjQk6Tu0GiioN7mfMyWkaUfpfMJVDyS8JeIJwL4E8/edit?gid=1781450428#gid=1781450428).
5. **Complete the Rating Questions, Adjustments, Fees, and Taxes spreadsheet:** Copy into a new spreadsheet and fill out the [Rating Questions, Adjustments, Taxes, and Fees spreadsheet](https://docs.google.com/spreadsheets/d/1H4QK-TpqgtlnxaXpWKtQYu76QJOzcrx_QPOmJE2abio/edit?gid=788288296#gid=788288296) with the rating questions and their modifier factors. Refer to the [Rating Questions Documentation](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine).
6. **Manual Example Rating Done:** Copy to a new doc and fill out the [Manual Example Rating](https://docs.google.com/document/d/16L-m00hWDuDf8Wj21p2nELIp-SgQBxzNBRpuevmEu24/edit?tab=t.0).
7. **Base Rate Validation+Signoff**: Review and sign off on your base rate.
8. **Ratings Engine Testing, Validation, and Requirements Adjustment (If Applicable)**: Reach out to the team for any adjustments or edits to your rating engine. Refer to the [Validate a Rating Engine documentation](/getting-started/setting-up-ai-insurance/rating-engine/validating-rating-engine) to learn how to validate it.
9. **Rating Engine Instrumentation Sign-off**: Validate, review, and sign off on your rating engine instrumentation.
### 4. Premium Billing
The Premium Billing module handles payments within the AI Insurance platform. To set it up:
1. **Complete the Premium Billing Questionnaire:** AI Insurance will send you a questionnaire to gather your billing preferences, complete this questionnaire.
2. **Confirm Payment Methods:** Choose and confirm your default payment methods.
3. **Set Up a Cash Management Account:** Follow the [Cash Management Documentation](/platform/companies/cash-management/cash-management) to configure your cash management account in the AI Insurance platform.
4. **Attend the training**: The team at AI Insurance will walk you through Premium Billing processes in the application such as:
* Create an invoice
* Manage invoices
* Receive payment
Additionally, refer to the [Invoicing](/financials/invoicing/invoicing), [Billings](/financials/billings/billings), and [Payments](/financials/payments/payments), documentation to learn how to manage your invoices and payments.
### 5. Insured Portal
This portal allows insured customers to access their policies and submissions. To set it up:
1. **Submit Application Questions:** Copy the [Application template](https://docs.google.com/spreadsheets/d/1Mw6xSztaZFdf9F1xv5l6b7NQrqoAn30-MCqse5QHfWk/edit?gid=1897111390#gid=1897111390\&range=A1) provided by AI Insurance into a new spreadsheet. Then, fill out the spreadsheet with the rating questions you want to ask a customer interested in buying insurance.
2. **Inform AI Insurance of preferred branding and logos**: Share your branding preferences and logos to customize the portal’s interface. Using this submission, AI Insurance will create and configure your portal.
3. **Customer Feedback and Changes:** Provide feedback or request changes via your onboarding customer portal. AI Insurance will make the necessary updates.
4. **Validation and Sign-off:** Review and approve the final application form.
### 6. Historical Data Import
This module allows you to import existing data into AI Insurance. To set this module up, do the following:
1. **Send Historical Data:** Follow the [provided import structure](/platform/reporting-and-reports/historical-data-imports) to submit your historical data.
2. **Confirm Data Submission:** Verify that all data has been sent.
3. **Review and Sign Off:** Review the imported data and sign off once it is accurate and complete. Refer to the [Historical Data Imports: Guidelines and Templates documentation](/platform/reporting-and-reports/historical-data-imports) for more information on reviewing imported data.
### 7. Invoice Audit
The Invoice Audit module uses artificial intelligence modules to evaluate invoices for discrepancies. To set it up:
1. **Upload Payment Guidelines:** Define and upload your rules for invoice evaluations to the AI Insurance platform. Refer to the [Invoice Audit Documentation](/platform/companies/invoice-auditing).
2. **Validation Testing:** Test and validate the rules. Refer to the [Validate your invoice Audit settings documentation.](/platform/companies/invoice-auditing)
### 8: Claims Module
The Claims Module helps you track incidents that may lead to lawsuits or financial demands. This module is included by default with your AI Insurance base instance. However, refer to the [Adding data fields documentation](/getting-started/setting-up-ai-insurance/adding-data-fields) if you need additional data fields for creating or editing an event.
### 9. Policy Issuance
This module allows you to create, issue, endorse, and delete policies. To set this module up, follow these steps:
1. **Upload Forms and Insert Smart Tags:** Follow the [Forms and Smart Tags Documentation](/platform/companies/creating-and-validating-forms/creating-and-validating-forms) for guidance.
2. **Request Custom Smart Tags (If Needed):** If you require custom smart tags that are not available on the AI Insurance platform, fill out this form to [request custom forms](https://share.hsforms.com/1hRZubTCWSKKrsFFTfb5GEQqsjs3). These custom Smart Tags cost 500 dollars each.
3. **Smart Tag request Sign-off:** Sign off after you have made the request for custom smart tags.
4. **New Business issuance validation**: Create a new policy from start to finish for a new insured, and validate that the forms added during policy creation look and function as expected.
5. **Renewal forms issuance validation**: Renew a policy from start to finish to validate that the forms added during the renewal process look and function as expected.
6. **Endorsement forms issuance validation**: Validate forms added during a policy endorsement by endorsing a policy end to end and ensuring the forms created for these endorsements look and act as expected.
7. **Forms Sign-Off:** Review, validate, and sign off on the forms.
If you encounter any issues during the onboarding process, contact AI Insurance support at [**support@aiinsurance.io**](mailto:support@aiinsurance.io).
# How to Add Field Data Model
Source: https://docs.aiinsurance.io/getting-started/setting-up-ai-insurance/adding-data-fields
To ensure your data integrates smoothly with our platform, we need to understand how your existing fields align with our data model.
### What is Field Mapping?
When creating objects such as [Policies](/policing/policy-management/policy-issuance), [Events](/events/create-new-events), or [Insureds](/insureds/creating-insureds) on the AI Insurance platform, you must gather data specific to each object. To simplify this process, the platform provides hundreds of preset data fields to help you collect, store, organize, and retrieve information effectively.
Field mapping is the process of aligning your existing data fields with AI Insurance's data model. This ensures that your current data structure integrates seamlessly with our platform's configuration.
### Why is Field Mapping Important?
Many fields in the AI Insurance platform are **configurable**, meaning we can customize them to match your specific business needs and data requirements. By mapping your existing fields to our data model, we can:
* Accurately configure your system to match your workflows
* Ensure data consistency across all objects
* Reduce onboarding delays
* Maintain data integrity when importing historical data
* Optimize your workflows
## Step-by-Step Field Mapping Process
### Step 1: Receive and Review the Field Data Model Form
The first step is to receive the **Field Data Model** form from AI Insurance via Rocketlane. This form contains the standard fields, their locations, and usage in our system.
Once you receive the form, review it to understand the structure and fields available in the AI Insurance platform. You can also reference the original **AI Insurance Fields Data Model** spreadsheet for additional context: [**View Fields Data Model Template**](https://docs.google.com/spreadsheets/d/1bPW5yy74Lnyjd6jYP5yY-X8M2KcBc7mEKxSrLBGZeR4/edit?gid=0#gid=0)
#### Understanding the Spreadsheet Structure
The Field Data Model spreadsheet is organized into multiple tabs, with each tab representing a different section or page in the AI Insurance application. **To add custom fields, add a new row in the appropriate tab and fill in the required columns**. We will use this information to configure your instance to match your specific needs and workflows.
#### Spreadsheet Tabs Explained
This tab contains detailed instructions on how to fill out the spreadsheet. **Be sure to read this tab first** before adding any fields to your spreadsheet. It provides essential guidance on column meanings, data types, and formatting requirements that will help you complete the form accurately.
**Review Only**: This tab is for reference only. Do not fill out or modify this tab.
This tab lists all fields that already exist in the AI Insurance platform. **Review this tab carefully** before adding custom fields to see what's already available.
**Important**: Do not add these fields again as custom fields, as this will create duplicates in your application.
Use this tab for fields at the **policy level** when writing policies, submissions, and quotes. These fields contain information that applies to the **entire policy**, regardless of how many items (or "exposures") it covers. Think of this as the "cover sheet" of a folder—it applies to everything inside. Examples include policy number, effective dates, broker information, and total premium. **Add your custom policy-level fields here**.
When you add fields in the Policy Fields tab, they will be displayed in the **Policy Details** section of the policy page. These fields appear in collapsible sections on the policy details page where you can view and edit policy-level information. For more information about viewing and managing policies, see [Viewing a Policy](/policing/policy-management/viewing-a-policy).
For detailed instructions on how to fill out the Policy Fields tab, see the "Step 2: How to Fill Out Each Tab" section below.
**Example:**
The images below show how a field entered in the Field Data Model spreadsheet appears in the application:
**1. Field entry in the Field Data Model spreadsheet:**
**2. How the field displays in the application:**
Use this tab for fields at the **exposure level** (also known as insured or risk level). These fields contain information specific to individual exposures within a policy. If you're unsure whether a field should be at the policy or exposure level, refer to our [Understanding the AI Insurance Model documentation](/getting-started/intro-to-aiinsurance/understanding-the-ai-insurance-model) for clarification. Examples include individual insured details, specific coverage limits per exposure, and exposure-specific ratings. **Add your custom exposure-level fields here**.
When you add fields in the Exposure Fields tab, they will be displayed in the exposure details section when viewing individual exposures or insureds. These fields appear in the exposure information sections where you can view and edit exposure-level data. For more information about viewing and managing exposures, see [Viewing Insureds](/insureds/viewing-insureds).
**Example:**
The images below show how a field entered in the Field Data Model spreadsheet appears in the application:
**1. Field entry in the Field Data Model spreadsheet:**
**2. How the field displays in the application:**
Use this tab for operational records such as **claims** or **incidents**. These fields are used for tracking and managing events that occur after policy issuance. Examples include claim number, incident date, loss amount, and reserve information. **Add your custom event-level fields here**.
For events, you can track both **claims** and **incidents**. The way you fill out the field data model for Event Fields is very similar to the other sections (Policy Fields and Exposure Fields). Follow the same column-by-column instructions and formatting requirements as described in the "Step 2: How to Fill Out Each Tab" section below.
When you add fields in the Event Fields tab, they will be displayed in the event details section when viewing individual claims or incidents. These fields appear in the event information sections where you can view and edit event-level data. For more information about viewing and managing events, see [Viewing Events](/events/view-events/view-events).
**Example:**
The images below show how a field entered in the Field Data Model spreadsheet appears in the application:
**1. Field entry in the Field Data Model spreadsheet:**
**2. How the field displays in the application:**
**Tip**: If you have questions about what a specific column is for, check the comments in the header row of each tab. These comments provide detailed explanations for each column's purpose and requirements.
### Step 2: How to Fill Out Each Tab
This section provides detailed instructions on how to fill out each tab in the Field Data Model spreadsheet. For each tab, we will explain it column by column.
The System Default Fields tab displays all the standard fields that already exist in the AI Insurance platform. This tab is **for reference only**—do not fill out or modify this tab. Understanding the columns in this tab will help you understand how to fill out the other tabs when adding custom fields.
**Field Explanation:**
* **Field ID**: This is a sequential number assigned to each field for quick reference. Use this number when discussing specific fields with the AI Insurance team.
* **Name of Customer Fields**: This shows the name of the field as it appears in your existing data or system. This helps identify which of your fields corresponds to each AI Insurance standard field.
* **Field Name In AI Insurance**: This is the standard field name used in the AI Insurance platform. This is how the field will be displayed in your AI Insurance instance.
* **Definition**: This provides a plain English definition of what each field represents and how it's used in the system.
* **Default or New**: In the System Default Fields tab, all fields are marked as **"System Default"**, indicating these are predefined fields that come standard with the platform. You do not need to add these fields again as custom fields.
* **Location**: This indicates where the field is located in the AI Insurance data model. The location determines where the field appears and how it's used in the application. You can select from the dropdown menu to see all available options. The available locations are:
* **Policy Details**: Information that applies to the entire policy—regardless of how many items (or "exposures") it covers. This is like the cover sheet of the folder—it applies to everything inside. Policy details is information that is **NOT** used for rating.
* **Policy Ratings**: Information that applies to the entire policy but **IS** used for rating.
* **Exposure Level Rating**: For information at the exposure level (sometimes known as the risk or insured level). You can find the difference between policy vs. exposure level in the [Understanding the AI Insurance Model documentation](/getting-started/intro-to-aiinsurance/understanding-the-ai-insurance-model). This is always a rating field, so you need to tell us which entity types the exposure field applies to. For more info on what entity types are, see the [Exposure Type documentation](/getting-started/setting-up-ai-insurance/rating-engine/exposure-types).
* **Submission Details**: Information that goes into a submission but **NOT** a policy. If it also goes into a policy, use Policy Details instead.
* **Quote Details**: Information that goes into a quote but **NOT** a policy. If it also goes into a policy, use Policy Details instead.
* **Event Details**: For information for operational records such as claims or incidents.
Use the dropdown box to see all available location options.
* **If exposure level, exposure Type**: This is only relevant when the **Location** is set to **"Exposure Level Rating"**. An **entity type** refers to the classification of exposures covered under an insurance policy based on their roles, characteristics, or exposure profiles. These classifications help determine the nature of coverage, exposure assessment, and premium calculation.
For example, consider a company providing comprehensive insurance to a hospital. This insurance covers not only the hospital itself but also the doctors working within it and potentially the hospital's vehicles. In this scenario, the hospital might have an entity type of **Company**, the doctors an entity type of **Healthcare Provider**, and the vehicles an entity type of **Auto**.
Common entity types include:
* **Company**: For organizational entities
* **Healthcare Provider**: For medical professionals
* **Property**: For physical properties or locations
* **Auto**: For vehicles
* **Location**: For specific geographic locations
When a field is set to "Exposure Level Rating" in the Location field, you must specify which entity type this field applies to. Use the dropdown box to select the appropriate entity type. For more information about entity types, see the [Rating Engine documentation](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine#what-are-entity-types%3F).
* **If exposure level, relationship to policy (optional)**: This is **optional** and is only relevant when the **Location** is set to **"Exposure Level Rating"**. This defines the relationship between the exposure and the policy, helping to clarify how the exposure relates to the overall policy structure.
Use the dropdown box to select the appropriate relationship type. Available options include:
* **First Named Insured**: The primary insured party listed first on the policy
* **Named Insured**: A party specifically named in the policy
* **Additional Insured**: A party added to the policy who receives coverage under the policy
* **Related Entity/Exposure**: An entity or exposure that is related to the policy but may not be directly named
This field is optional, so you only need to fill it out if you need to specify the relationship between the exposure and the policy for your specific use case.
* **Smart Tag Needed**: If you would like a custom smart tag for this specific field to add information about it in your forms, select **"Customer Smart Tag Needed"**.
Smart tags are variables that can be inserted into your forms to pull data from objects such as policies, insureds, or events. For more information about smart tags and how they work, see the [Smart Tags documentation](/platform/components/smart-tags/smart-tags). For information about coverage-specific smart tags, see the [Coverage Smart Tags documentation](/policing/policy-management/coverage/smart-tags).
* **Header**: The header is used to group related fields together to help organize the details. For example, if you want a group of basic policy detail fields to be under the header "Policy Detail", you would place a header field here. Headers help organize fields into logical sections, making it easier to navigate and manage related information.
* **Field Type**: The field type determines how each field is presented and what kind of data it accepts.
Available field types:
* **Text**: Free-form text input. Example: "ABC Insurance Company" or "Medical Professional Liability"
* **Number**: Numeric values. Example: `123421` (policy number) or `5000` (quantity)
* **Currency**: Monetary values. Example: `$1,000.00` or `USD 50,000`
* **Percentage**: Percentage values. Example: `12.5%` or `5%`
* **Date**: Date values. Example: `01/15/2024` or `12/31/2025`
* **Address**: Address information. Example: `123 Main St, New York, NY 10001`
* **Website**: URL or website links. Example: `https://example.com` or `www.company.com`
* **Dropdown**: Single selection from a list. Example: Select "Active" from \[Active, Inactive, Pending]
* **Multi-select Dropdown**: Multiple selections from a list. Example: Select "General Liability" and "Property" from coverage options
* **Possible Values**: Provide an example value that demonstrates what data would be entered in this field. This serves as a reference to help understand the expected input format and content.
Example: If the field is called "Insured ID" and it's a number field, the possible value would be `123123123`. If it's a text field called "Company Name", the possible value might be `ABC Insurance Company`.
* **Display Logic**: AI Insurance supports the following display logic options:
1. **Conditional Field Display**: If field 1 equals X, show field Y. Multiple conditions can be combined using AND and OR operators.
2. **Default Values**: Set default values for fields, including default values based on other fields. For example, if field X equals a specific value, pre-fill field Y with a corresponding value.
3. **Validation Logic**: Define numerical range validation. For example, a field must fall within a specific numerical range (e.g., between 0 and 100).
* **Export Required**: This section indicates whether this field is required when exporting policies, events, or exposures. Specify if the field should be included in exports by default. For more information about adding fields for export, see the [Export Customization and Configuration documentation](/platform/reporting-and-reports/export-customization-and-configuration#add-fields-for-export).
The Policy Fields tab follows the same structure and column requirements as the System Default Fields tab. The columns are very similar, but only policy-level data will be displayed here.
**What is Policy Level Rating Data?**
Policy level rating data refers to information that applies to the **entire policy** and is used for **rating calculations**. This is different from policy details, which are also policy-level but are **not** used for rating. Policy level rating data affects how premiums are calculated for the entire policy.
**What Should Be Added Here?**
Add custom fields that:
* Apply to the entire policy (not specific to individual exposures)
* Are used in rating calculations to determine premium
* Represent policy-wide characteristics that impact pricing
Examples of policy level rating data include:
* Policy-wide discount factors
* Overall policy risk modifiers
* Policy-level surcharges or credits
* Aggregate policy characteristics used in rating formulas
**Important Notes:**
* The column structure is identical to the System Default Fields tab
* When setting the **Location** field, use **"Policy Ratings"** for fields used in rating, or **"Policy Details"** for policy-level information not used in rating
* Only policy-level fields should be added here—exposure-specific fields belong in the Exposure Fields tab
* Refer to the System Default Fields Tab section above for detailed column explanations
The Exposure Fields tab follows the same structure and column requirements as the [System Default Fields Tab](#system-default-fields-tab) section above. The columns are very similar, but only exposure-level data will be displayed here.
**What are Exposures?**
Exposures are all the entities (insureds) in each policy. Each policy can contain multiple exposures, and each exposure represents an individual entity or risk covered under the policy. For example, a single policy might cover multiple companies, healthcare providers, properties, vehicles, or other entity types. Each of these individual entities is considered an exposure.
To better understand exposures and how they relate to policies, refer to the [Understanding the AI Insurance Model documentation](/getting-started/intro-to-aiinsurance/understanding-the-ai-insurance-model) and the [Rating Engine documentation](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine).
**What Should Be Added Here?**
Add custom fields that:
* Apply to individual exposures (entities) within a policy
* Are specific to each insured or risk, not the entire policy
* Are used in rating calculations at the exposure level
* Represent characteristics of individual entities that impact pricing
Examples of exposure-level fields include:
* Individual insured details (company name, address, etc.)
* Exposure-specific coverage limits
* Entity-specific risk characteristics
* Individual exposure ratings and modifiers
* Exposure-level deductibles or retentions
**How to Fill Out This Tab:**
The column structure is identical to the System Default Fields tab. When filling out exposure fields:
1. **Location**: Set this to **"Exposure Level Rating"** for fields used in rating calculations
2. **Exposure Type**: When Location is set to "Exposure Level Rating", you must specify which entity type this field applies to (e.g., Company, Healthcare Provider, Property, Auto, Location). Use the dropdown to select the appropriate entity type. For more information about entity types, see the [Rating Engine documentation](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine#what-are-entity-types%3F).
3. **Relationship to Policy (optional)**: If needed, specify the relationship between the exposure and the policy (First Named Insured, Named Insured, Additional Insured, or Related Entity/Exposure)
**Important Notes:**
* Only exposure-level fields should be added here—policy-level fields belong in the Policy Fields tab
* Each exposure field must specify which entity type it applies to when used for rating
* Refer to the System Default Fields Tab section above for detailed column explanations
The Event Fields tab follows the same structure and column requirements as the [System Default Fields Tab](#system-default-fields-tab) section above. The columns are very similar, but only event-level data will be displayed here.
**What are Events?**
Events are operational records that track **claims** and **incidents** that occur after policy issuance. An event is a general term for things that happen, and it is divided into two groups: **Incidents** and **Claims**.
* **Incidents**: Unexpected events or occurrences that are recorded and tracked, as they can potentially become a lawsuit or claim.
* **Claims**: Typically created when an incident leads to a formal lawsuit or a demand for money being made.
For more information about events, claims, and incidents, see the [Understanding Events documentation](/events/understanding-events).
**What Should Be Added Here?**
Add custom fields that:
* Apply to individual events (claims or incidents)
* Track information about events that occur after policy issuance
* Are used for managing and reporting on claims and incidents
Examples of event-level fields include:
* Claim number or incident number
* Incident date and time
* Loss amount
* Reserve information
* Event status
* Claimant details
* Allegation information
**How to Fill Out This Tab:**
The column structure is identical to the System Default Fields tab. When filling out event fields:
1. **Location**: Set this to **"Event Details"** for all event fields
2. **Field Name**: Use clear, descriptive names that indicate the field is event-related
3. **Definition**: Provide a clear explanation of what information the field captures and how it's used
**Important Notes:**
* Only event-level fields should be added here—policy and exposure fields belong in their respective tabs
* Event fields apply to both claims and incidents, as they share the same data structure
* Refer to the System Default Fields Tab section above for detailed column explanations
### Step 3: Review and Submit the Spreadsheet
Once you have completed filling out the Field Data Model spreadsheet:
1. **Review the spreadsheet** to ensure all information is accurate and complete
2. **Send it back to the onboarding team** via the designated channel (typically Rocketlane)
3. **Schedule a meeting** with the onboarding team to review your field mapping and move forward with the configuration
The onboarding team will use your completed spreadsheet to configure your AI Insurance instance to match your specific data model and workflows.
# What is a Rating Engine
Source: https://docs.aiinsurance.io/getting-started/setting-up-ai-insurance/rating-engine/rating-engine
The rating engine is a tool used to calculate the policy premium for an insured based on their responses to input questions. It evaluates these answers to assess the insured's exposure level and determines the appropriate premium to charge based on that assessment.
Imagine an insured named Ben, who lives and works in San Francisco and is seeking medical insurance from ABC Insurance Company. Ben is 26 years old and has been smoking since he was 15, but he has no family history of heart disease. How much would his policy premium be?
To calculate his premium, we need to consider two key elements:
* **Base Rate**: The base rate is the starting cost to calculate an insurance premium before adjustments like surcharges, discounts, or other rating factors are applied. It represents the standard cost of insuring a particular risk, in this case, Ben, under typical conditions without accounting for individual risk characteristics. This base rate can vary by state or country. In Ben's case, since he lives in California, let's assume his base rate starts at \$100.
* **Modifier Factor**: This adjustment factor is applied to the base rate to reflect specific characteristics, behaviors, or conditions that impact the insured’s risk. Modifier factors help tailor the base rate to the individual’s risk profile, making the premium more accurate and fair based on their unique circumstances.
While Ben’s base rate starts at \$100 due to his location in California, his smoking history likely makes him riskier to insure than some, though less risky than others. The modifier factor helps adjust the base rate, ensuring that his premium is more customized and fair for his situation.
For this documentation, assume the following modifier factors for the rating questions:
* **Rating Question: How old are you?**
| Age range | Modifier factor |
| --------- | --------------- |
| 0 - 20 | 0.8 |
| 21 - 60 | 1.5 |
| 61+ | 2.5 |
* **Rating Question: Do you smoke?**
| Do you smoke? | Modifier factor |
| ------------- | --------------- |
| Yes | 2.0 |
| No | 1.0 |
* **Rating Question: History of Heart Disease in family?**
| History of Heart Disease or family? | Modifier factor |
| ----------------------------------- | --------------- |
| Yes | 2.0 |
| No | 1.0 |
## How is a base policy premium calculated?
A base policy premium is calculated thus:
```
Base policy premium = Base rate * Modifier factor
```
So, for 26-year-old Ben, who lives in California and started with a base rate of 100 dollars. Who smokes but does not have any family history of heart disease.
We can calculate his policy premium as:
```
Base premium = 100 * 1.5 * 2.0 * 2.0
Base premium = 600
```
So Ben’s base premium before adding credits, debits, fees, or taxes is 600 dollars.
## Rating engine with AI Insurance
It’s up to you, the underwriter, to define and provide your base and modifier factors. When a potential insured applies for a policy through you, AI Insurance asks relevant questions (questions you have sent us), gathers additional information, and calculates the policy premium based on what we learn.
The questions we ask depend on the insured and their entity type. For example, if you’re determining the right premium for a group of doctors, the questions will differ significantly from those you'd ask when insuring a group of pilots.
Similarly, the questions will change depending on whether you’re insuring a group of farmers, a farm, or a tractor.
You need to know entity types to fully understand a multi-level rating engine, how they relate to policies and premiums, and the difference between policy-level and exposure-level rating questions.
### **What are entity types?**
An **entity type** refers to the classifying exposures covered under an insurance policy based on their roles, characteristics, or exposure profiles. These classifications help determine the nature of coverage, exposure assessment, and premium calculation.
For example, consider a company providing comprehensive insurance to a hospital. This insurance covers not only the hospital itself but also the doctors working within it and potentially the hospital's vehicles. In this scenario, the hospital might have an entity type of **company**, the doctors an entity type of **healthcare provider**, and the vehicles an entity type of **auto**.
When issuing a policy to the hospital, insurers use **policy-level rating questions** to evaluate the organization’s overall risk. These questions help determine how likely it is for the hospital to be involved in incidents involving patients, doctors, or others. Examples of such questions include:
* What is the average length of employment across all hospital locations?
* Does the hospital have a negotiated risk agreement?
Although covered by the same policy and influenced by the policy-level rating questions, doctors working at these hospitals have varying degrees of individual exposure. For instance, an allergy doctor poses a much lower exposure than a heart surgeon and would pay a lower premium. Additionally, a doctor working in California might pay a higher premium than one in Ohio due to higher lawsuit payouts in California. Questions that assess the individual exposure of a doctor are called **Exposure-level rating questions**, and the doctors themselves are referred to as **Exposures**.
Similarly, hospital vehicles, classified under the entity type **auto**, are also considered **Exposures**. Insurers use exposure-level rating questions to determine the level of exposure associated with these vehicles.
To clarify this hierarchy, here's an example of how policy and exposure-level rating questions are structured for a medical insurance policy:
* **Policy-Level Rating Questions** (evaluate the organization as a whole):
* Does the hospital have a negotiated risk agreement?
* What is the average length of employment across all locations?
* **Exposure-Level Rating Questions** (evaluate specific entities within the policy):
* **Exposure A (Doctor)**: Questions about specialization, location, malpractice history, etc.
* **Exposure B (Truck)**: Questions about usage, maintenance, accident history, etc.
## How the customer and AI Insurance work together to get you your rating engine
As a customer, your first step is to define the rating questions and their corresponding modifier factors. You need to clearly outline your calculations so we can assist you in automating the underwriting process for potential insureds.
To begin, contact the [AI Insurance team](mailto:support@aiinsurance.io) to request a Rating Engine Requirements Doc. This template outlines the rating information you require to automate the underwriting process.
Following the instructions outlined in this template, you must specify some information, such as:
* The line of business you're insuring, such as General Liability, Business Interruption, Commercial Property, Cannabis Liability, Medical Malpractice, or more.
* The entity types you are insuring under each line of business—such as Company, Healthcare Providers, Property, Auto, and others.
For each combination of line of business and entity type, you’ll need to replicate and customize the [Base Rate Calculator](https://docs.google.com/spreadsheets/d/13Gge5MNj3rkwSFypt3U_GmMpPz_hoKxO-JjisEvHdWc/edit?usp=sharing) spreadsheet template accordingly.
**Important: Separate Spreadsheets Required**
Please create a separate spreadsheet for each entity type used for [exposure-level rating](/api-legacy-reference/data-models#exposure-level-rating), plus one additional spreadsheet for policy-level rating. Exposure-level and policy-level rating must not be combined into a single spreadsheet.
The rating engine works by:
1. First rating each entity (exposure) under a policy individually
2. Adding those entity-level premiums together
3. Then applying policy-level modification factors to the total
This two-step process requires separate spreadsheets because the calculations happen at different levels. Behind the scenes, for exposure-level rating, AI Insurance uses one exposure-level rater but runs it multiple times if there are multiple lines of coverage on the policy.
In this template, you will outline the base rates for an insured based on factors such as the state in which they reside. You will then define the modifier factors used to adjust these base rates and calculate the base policy premium, as demonstrated in the example with Ben.
| Line of Business | Entity Type | Base rate spreadsheet |
| ----------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| General Liability | Company | [Link](https://docs.google.com/spreadsheets/d/13Gge5MNj3rkwSFypt3U_GmMpPz_hoKxO-JjisEvHdWc/edit?gid=27081183#gid=27081183) |
| General Liability | Healthcare Provider | [Link](https://docs.google.com/spreadsheets/d/13Gge5MNj3rkwSFypt3U_GmMpPz_hoKxO-JjisEvHdWc/edit?gid=27081183#gid=27081183) |
In addition to the base rate spreadsheet, you'll complete a [Rating Questions, Adjustments, Taxes, and Fees](https://docs.google.com/spreadsheets/d/1H4QK-TpqgtlnxaXpWKtQYu76QJOzcrx_QPOmJE2abio/edit?gid=788288296#gid=788288296) spreadsheet. Here, you'll list the questions you’d like AI Insurance to use during the underwriting process—these are the rating questions—and define the corresponding modifier factors for each.
Furthermore, you'll outline any custom adjustments to the premium policy, including credits, debits, warnings, caps, fees, and taxes. All of these details will also be documented in the spreadsheet to ensure a comprehensive and automated underwriting process.
### **Rating Questions, Adjustments, Taxes, and Fees**
In the **Rating Questions, Adjustments, Taxes, Fees** spreadsheet, you will do four things:
* **Define Underwriting Questions:** You should specify what questions you want AI Insurance to ask an insured, broker, or underwriter during policy creation. This section of the spreadsheet is organized into six columns, which are:
* **Question**: What is the question?
* **Possible Values**: What type of answer are you expecting (e.g., long-form text, date, or dropdown option)?
* **Display Logic**: Based on the answers, what tasks should be performed related to the policy?
* **Location**: Does this question apply at the policy level or exposure level?
* **If Exposure Level, Entity Type**: If the question pertains to the exposure level, specify the entity type it relates to.
* **Question ID**: What is the number for this question?
* **Credits and Debits:** Specify discretionary adjustments— additions or deductions—to the original base policy premium rates initially calculated. This section also includes discounts, which are always subtracted from the original amount (unlike factors, which are multiplied). This section is divided into seven columns:
* **Adjustment Name**: What is the name of the credit or debit affecting the calculated base policy premium?
* **Increase or Decrease**: Does this adjustment increase or decrease the policy premium? Indicate the direction.
* **Entity Type or Policy**: Does this adjustment apply at the policy or the exposure levels? If exposure level, specify the entity type.
* **Percent of Base Premium or Fixed Dollar Amount**: Is this adjustment a fixed amount or a percentage of the original base premium?
* **Logic/Calculation for Applying the Adjustment**: How was the adjustment figure determined, and why is this insured receiving the adjustment?
* **Relevant Files for Calculation/Logic**: Are any files associated with this adjustment?
* **Warnings and Caps**
Define conditions to flag specific scenarios as warnings. Additionally, set caps on discounts to ensure they do not exceed certain limits. This section is divided into three columns:
* **Warning or Cap**: Specify whether this is a warning or a cap. Warnings are used to display notifications, such as when discounts exceed a certain percentage. Caps specify the maximum discount amount an insured can receive, regardless of the number of credits or debits.
* **Name**: What is the name of this warning or cap?
* **Logic**: What is the logic applied to this condition?
* **Fees and Taxes**
* **Fees**: Add administrative fees that carriers charge, unrelated to the insurance coverage.
* **Taxes**: Include taxes, which vary by state and must be applied accordingly.
After completing the data entry and premium calculations, you can make final discretionary adjustments to an insured's premium. These adjustments can be applied at the policy or exposure levels as a percentage or a fixed cash amount.
# Validate a Rating Engine
Source: https://docs.aiinsurance.io/getting-started/setting-up-ai-insurance/rating-engine/validating-rating-engine
Validating the rating engine ensures that our code matches your Rating Engine Configuration Document. Since each rating engine is different, we need to confirm that our code accurately reflects how your rating engine is set up. Validating includes the following:
* **Testing Recent Applications**: This involves testing applications you’ve quoted outside of AI Insurance. We use this data to compare similar scenarios directly.
* **Testing Edge Cases**: We don't just test the basics; we also check how well AI Insurance handles unusual situations. For example, we look at scenarios like part-time applicants, retroactive dates, and customized coverage options to ensure our system can handle them effectively.
* **Testing User Experience**: We evaluate how the system feels and flows for users. For instance, we examine how rating questions are presented at the insured and policy levels to ensure a smooth and intuitive experience.
## **How to rate in the AI Insurance platform**
[Insureds](/policing/insured-management/creating-insureds) and [Policies](/policing/policy-management/viewing-a-policy) live separately in AI Insurance. As such, some Rating questions are located on the insureds and, separately, on their corresponding policies. In the steps below, we'll create Insureds and Policies and test the Rating Engine.
### **Creating an Insured:**
Follow these steps to ensure that all the necessary questions are being asked to properly rate an Insured
1. Click on **Insureds**
2. Click on **New Insured**
3. Select the appropriate entity type with a rating question (e.g. a Healthcare Provider’s specialty) and enter information for the insured. Click **Create** when finished.
### **Creating Policies:**
Follow these steps to ensure that all the necessary questions are being asked to properly rate an Insured.
1. Click on **Policies**
2. Click on **New Policy**
3. Enter the following:
* Primary Insured/Policyholder (Choose the Insured created above)
* Policy Number
**Note**: This can be changed before the policy is bound, so you can use whatever you like for testing and/or quoting purposes
* Coverage Start/End Dates
* Policy Type
* Time Zone
4. Add insureds to policy (This may or may not be relevant based upon your use case)
As you add insureds, select the relationship, which includes the following options:
* Named
* Additional
* Related Entity
5. Enter the policy-specific Rating engine answer
*Note: Your screen will look different and be custom to your specific use case and Rating engine. It’s important to confirm that the policy-level Rating questions we’re asking are sufficient to rate your policies properly.*
6. Evaluate the Rating calculations + default lines of coverage
**Components**:
* Premium and Fees
* Lines of coverage
* Editing Lines of Coverage
7. Determine if all fees have been added and calculated correctly in the next step
## **Compare to the Rating Engine configuration document**
Now that a policy has been generated that includes Rating compare the results to your Rating Engine Configuration Document. The goal is not to match whatever your old or internal rater says, but rather the documented requirements are. This will verify whether or not the numbers are matching. If it does not match, here are some debugging recommendations on where to investigate:
* **Are all credits and debits accounted for?** Check the section in your Rating Engine Configuration document listing all credits and debits. Make sure nothing is missing and that the calculations are accurate.
* **Is there a difference in rounding?** If the results are within +/- 1%, it could be due to rounding variations between the two raters. Ensure rounding rules are documented in your Rating Engine Configuration document for confirmation. Please consult to confirm.
* **Comparing Apples to Apples is extremely important. Confirm the following:**
* Your configuration document is correct.
* All insureds have been added to the policy.
* The correct policy start and end dates have been selected.
* The appropriate policy type was chosen (e.g., Claims Made vs Occurrence).
* All lines of coverage are included.
* The limits for each line of coverage are correct.
* Policy-level limits are correctly set.
* Retroactive dates have been properly set for all insureds or at the line of coverage.
* All Rating-oriented questions at the policy and insured level are accurately answered.
## **Next Steps**
Test the Rating engine and all facets of the calculations we've instrumented within your Rating Engine Configuration Document. Testing edge cases and complex scenarios is just as important as ensuring that the simpler calculations work as expected. You know your business and Rating best, so build additional insureds and policies that test all possible iterations of generating a rating.
If you have any questions, you can always reach out to our support team either through the chat icon on the bottom right of this screen or by emailing [support@aiinsurance.io](mailto:support@aiinsurance.io).
# Customer Support Portal
Source: https://docs.aiinsurance.io/getting-started/troubleshooting-and-support/customer-support-portal
## Access the Customer Support Portal
The Customer Support Portal provides a centralized location to get help, submit tickets, and find answers to common questions.
To access the portal, visit: [https://support.aiinsurance.io/customer-portal](https://support.aiinsurance.io/customer-portal)
**Live Chat**: Use the live chat icon (shown in the image below) to chat with our team for more immediate responses.
## How to Set Up Your Support Portal
1. You will receive an invitation email to create your account for the portal
2. Click the link in the invitation email to create your account
3. After creating your account, you will be brought to your portal where you can submit tickets and chat with our support team
For more detailed information about managing customer portal settings, see the [HubSpot Customer Portal documentation](https://knowledge.hubspot.com/inbox/manage-customer-portal-settings).
## What You Can Do in the Portal
* Submit support tickets
* Share feedback
* Track the status of your requests
* Chat with our support team
**Unable to Log In?** If you're not able to log in to the Customer Support Portal, please reach out to support to grant access to this portal.
For additional support options, see [Reach out to Support](/getting-started/troubleshooting-and-support/reach-out-support).
# Reach out to Support
Source: https://docs.aiinsurance.io/getting-started/troubleshooting-and-support/reach-out-support
If you have any inquiries, reach out to us at [support@aiinsurance.io](mailto:support@aiinsurance.io). Additionally, you can submit a ticket using the appropriate form based on your request:
* To request a custom Smart Tag, use the [Smart Tag Request Form](https://share.hsforms.com/1hRZubTCWSKKrsFFTfb5GEQqsjs3).
* For general support or feature requests, use the [AI Insurance feedback form](https://share.hsforms.com/1tjCXBAomQPq4mu9TsYzLfAqsjs3)
.
# Welcome
Source: https://docs.aiinsurance.io/homepage
Learn how to build on AI Insurance
Get help and find answers to common questions
Step-by-step tutorial to get started with AI Insurance
Explore AI Insurance's core features and capabilities
Learn the basics and understand how AI Insurance works
Integrate with your existing systems using our API
Create, manage, and endorse policies with ease
Manage invoices, payments, and financial transactions
# Create and Edit an Insured
Source: https://docs.aiinsurance.io/insureds/creating-insureds
Insureds are independent entities within the AI Insurance platform. They can be linked to multiple policies or events. The platform supports nearly 100 entity types, including but not limited to:
* Company
* Healthcare Provider
* Care Facility
* Manufacturer
* Mortgagee
* Contractor
* Dealership, and more.
## Create an Insured
Follow these steps to create a new insured in AI Insurance:
1. Click on the **Insureds** tab in the sidebar to open the Insureds page.
2. On the Insureds page, click the **New Insured** button in the top-right corner to open the **Create New Insured** page.
3. The **Create New Insured** page is divided into sections. Depending on your AI Insurance instance, you may see up to three sections:
* **Insured Information**: Enter details about the insured, including: **Entity type**, **Insured Name**, **Insured Address**, and **Apartment** or **Suite Number**.
* **Rating Information**: This section is available only to users with the **Rating Engine** feature enabled. If you have this feature, use the section to provide details for risk assessment. The questions are based on your organization’s onboarding process.
Check the Rating Information section for any missing questions or fields. If you find any, contact our support team through the chat bubble in the lower-right corner or email [**support@aiinsurance.io**](mailto:support@aiinsurance.io).
Check the **Do not rate this Insured** box at the section's top-right corner, to skip the rating process.
* **Upload Files**: You can upload files related to the insured. Simply drag and drop the files onto the upload area, or click the **Upload** button to browse your computer and select the files you want to upload.
## Edit an Insured
It's normal for an insured's information to change. Follow these steps, to update an insured's details in the platform:
**Important**: If you're changing an insured's name on a bound policy, this will automatically trigger an endorsement to ensure compliance with state reporting requirements. See the [Changing Insured Names on Bound Policies](#changing-insured-names-on-bound-policies) section below for more details.
1. Click the **Insureds** tab in the sidebar to navigate to the **Insureds** page.
2. Locate the insured whose information you want to edit, and select their profile.
3. Navigate to the **Summary** tab on the insured's profile page.
This tab is usually divided into three sections, each with its own **Edit** button. Select the **Edit** button for the section you wish to update, make your changes, and click **Save** to apply them.
You can also upload new files in the **Files** tab or leave notes in the **Notes** tab.
All changes are automatically tracked and displayed in the **Activity** tab.
## Changing Insured Names on Bound Policies
When you change an insured's name on a bound policy, AI Insurance automatically triggers an endorsement to ensure compliance with state reporting requirements. This is particularly important because name changes are considered "reportable" in many states.
### Automatic Endorsement Process
When you update an insured's name through the platform:
1. **Automatic Trigger**: The system automatically recognizes that a name change has occurred on a bound policy
2. **Endorsement Creation**: An endorsement is automatically generated to document the name change
3. **Compliance Compliance**: This ensures your organization meets state reporting requirements for policy changes
### Important Considerations
* **State Requirements**: Many states require name changes on bound policies to be reported through endorsements
* **Audit Trail**: The automatic endorsement process maintains a complete audit trail of all name changes
* **Policy Integrity**: This process ensures the policy remains legally compliant and properly documented
# Export Insured Loss Run Report
Source: https://docs.aiinsurance.io/insureds/exporting-insured-loss-run-report/exporting-insured-loss-run-report
The Loss Run Report provides a comprehensive summary of claims history for a specific insured. This report can be exported as a PDF and includes detailed information about claims, reserves, and payments.
## How to Export a Loss Run Report
Follow these steps to export a loss run report for a specific insured:
Any filters applied on the Exposures page will carry over to the export. Make sure to apply your desired filters before exporting.
### Step 1: Navigate to Exposures
1. Go to the **Exposures** page by clicking on the **Exposures** tab in the left sidebar
2. Search for and select the insured you want to generate a loss run report for
### Step 2: Access Export Options
1. Once you've selected the insured, look for the **Actions** dropdown menu
2. Click on the **Actions** dropdown button
3. Select **"Export Loss Run"** from the dropdown options
### Step 3: Configure Date Range
The "Export Loss Run For This Insured" modal will open with the following options:
1. **Select date range for reported claims**:
* **From (Optional)**: Enter the start date for the report period
* **To (Optional)**: Enter the end date for the report period
2. If no dates are specified, the report will include all available claims data
### Step 4: Insured Page Review
1. Click the **"Export"** button to generate the report
2. The system will process the data and generate a PDF report
3. The PDF will automatically download to your device
4. You can also click **"Edit"** to make changes to the form before exporting
5. Click **"Cancel"** if you want to close the modal without exporting
## Customizing the Loss Run Report Form
If you need to make changes to the loss run report template (such as adding fields, modifying layout, or updating formatting), you can edit the form template:
1. Navigate to your **Company** settings in the left sidebar
2. Go to the **Forms** tab
3. Find and select the **"Loss Run Report"** form
4. Make your desired changes using the form editor
5. Save your updates
For detailed instructions on creating and editing forms, see our [Creating and Validating Forms](/platform/companies/creating-and-validating-forms/creating-and-validating-forms) documentation.
# Export Insureds
Source: https://docs.aiinsurance.io/insureds/exporting-insureds
Refer to the [Exporting data](/platform/reporting-and-reports/exporting-data) documentation to learn how to export Insured data.
# Filter and Sort Insureds
Source: https://docs.aiinsurance.io/insureds/filter-and-sort-insureds/filter-and-sort-insureds
## Overview
The **Insureds** page allows you to view and manage all insured entities within your organization. With built-in filtering and sorting tools, you can quickly find specific records based on status, relationship type, dates, and more—making it easy to stay organized and efficient.
## How to access the Insured Filters
Follow these steps to find and use the filtering options on the **Insureds** page:
1. On the left-hand sidebar, locate and click on the **Insureds** section.
2. This will bring you to the **Insureds** page, where you can view all existing insured entries.
3. To filter the list, click on the **Add Filters** icon located near the top of the page.
4. A dropdown menu will appear with filter options such as **Insured Status**, **Relationship Type**, **Policy Number**, **Join Date**, and **Termination Date**.
\
Available filters include:
* **Insured Status**: This filter lets you view insureds based on their current status. Options include: **Active** and **Inactive**.
* **Relationship Type**: This filter helps categorize insureds by their relationship to the policy. Options include: **Primary**, **Named**, **Additional**, and **Related Entity**.
* **Policy Number**: This filter allows you to find insureds by a specific policy number. You can choose from the following conditions: **Matches**, **Contains**, or **Does not Contain**.
* **Join Date**: Use this filter to narrow down insureds based on when they were added. Options include: **On**, **Before**, or **After** a selected date.
* **Termination Date**: This filter works the same way as Join Date, allowing you to filter by **On**, **Before**, or **After** a specified termination date.
5. Select your desired filter, configure the conditions, and click **Add Filter** to apply it.
After you click **Add Filter**, the insureds list will automatically update to show only the entries that match your selected criteria.
## Sort filters
On this page, you will see a list of all your insureds. You can search through them using the **search bar** at the top of the page. You can also **sort** the insureds by:
* **Alphabetical**: Sorts insureds by name from A to Z.
* **Last updated** (default): Organizes entries based on the most recent changes made.
* **Days until renewal**: Sorts entries based on how soon each insured’s associated policy is up for renewal.
Together, the **filter** and **sort** features make it easy to navigate large lists of insureds, helping you quickly find and organize the information most relevant to your workflow.
# Generate artifacts on a single Insured
Source: https://docs.aiinsurance.io/insureds/generating-insured-reports
The carrier can generate and export a range of artifacts for the Insured, such as:
* **Certificate of Insurance (COI):** A document that serves as proof of insurance coverage. It provides essential details about the insured’s policy, such as the type of coverage, policy limits, effective dates, and the insurer’s information.
* **Insured Forms:** These are forms specific to the insured, which could include policy-related documents, applications, endorsements, or declarations. They provide detailed information about the insured and their policies.
* **Loss Runs:** A report summarizing the insured’s claims history. It typically includes details of past claims, such as dates, types of incidents, amounts paid, and statuses (open or closed).
## Generate a COI
Take the following steps to generate a COI for a specific insured:
1. Navigate to the **Insureds** page by clicking the **Insureds** tab.
2. Select the **Insureds** you want to create a COI for
3. Go to the **Actions** dropdown and select the **Generate COI** option. This action opens up a **Generate COI** modal.
4. Fill out the following fields:
* **Select a Policy**: Choose an active policy associated with the insured to generate the COI
* **As of Date (optional)**: Optionally, link the COI to a specific date
* **Add Additional Interest**: If other parties need access to the COI, check this box and enter their names
5. Click the **Generate** button to redirect you to the COI preview page.
6. On this page, you can now **Edit** or **Download** the COI.
* **Edit the COI:** Click the **Edit** button to make changes.
You can also add smart tags by dragging your cursor to the desired location, clicking the **Insert Smart Tag** button, and selecting the tag to insert.
* **Download the COI:** Click the **Download** button to save the COI to your device based on your browser's download settings.
## Generate Insured forms
To generate an Insured forms, take the following steps:
1. Navigate to the **Insureds** page by clicking the **Insureds** tab.
2. Select the I**nsured** you want to create a form for
3. Open the **Actions** dropdown and choose **Generate Insured Form**. This will open the **Generate Insured Form** modal.
4. In the modal, complete the following fields:
* **Select a Form:** Choose the form you want to generate for the insured.
* **As of Date (optional):** Optionally, specify a date associated with the form.
* **Add Additional Interest:** If other parties need access to this form, check this box and enter their names.
5. Next, click the **Generate** button to create the form.
## Export loss forms
To export loss forms, take the following steps:
1. Navigate to the **Insureds** page by clicking the **Insureds** tab.
2. Select the insured for whom you want to create a COI.
3. Open the **Actions** dropdown and choose the **Export Loss Run** option. This will open the **Export Loss Run for This Insured** form modal.
4. (Optional) Select the date range for the loss runs you want to export.
5. Click the **Export** button to download the loss run artifact. The file will be saved to your computer based on your browser's download settings.
# OFAC Screening for Insureds
Source: https://docs.aiinsurance.io/insureds/ofac-screening/ofac-screening
## Overview
AI Insurance supports OFAC screening for insureds classified as `Person` or `Company`. Screening can occur when you create an insured, during the quote flow, and can be re-run during endorsements or renewals.
OFAC screening is only triggered for insureds with entity type `Person` or `Company`.
## Create a New Insured (Exposures)
1. Go to Insureds → [Create New Insured](../creating-insureds).
2. Fill in the insured information.
3. Set Entity Type to `Person` or `Company` to enable OFAC screening.
4. Review the screening results:
* If a potential match appears, you can choose:
* **Confirm**: acknowledge the match applies to this insured; follow your internal procedures.
* **Decline**: the match does not apply to this insured. Declining all matches marks the screening as passed.
5. Use **Rerun OFAC Verification** any time to refresh results.
The OFAC sanctions list changes over time. An insured who previously passed can appear on a subsequent screening, and vice versa.
## Quote Flow (Submissions)
You can also screen during quoting:
1. Start a new submission → [Create a Submission](../../submissions-and-quotes/creating-a-new-submission/for-carriers).
2. In the Edit Insured step, if the insured is a `Person` or `Company`, the OFAC check is available.
3. Confirm/Decline potential matches as needed, or rerun the verification.
## Endorsements and Renewals Policy
* Endorsements: When you [Endorse a Policy](../../policing/policy-management/endorsing-policy/overview), the system does not automatically re-screen previously screened insureds. You can manually **Rerun OFAC Verification** if you need an updated check.
* Renewals: Same behavior as endorsements—no automatic re-screen, but you can rerun the verification if required.
## Previously Created Insureds
If an insured was created before OFAC screening was enabled for your workspace, you can still add and run the OFAC process for them from the insured record or during endorsement/renewal.
# Overview
Source: https://docs.aiinsurance.io/insureds/overview/overview
An event is a general term for things that happen, and it is divided into two groups: Incidents and Claims.
## Incident vs Claims
Although incidents and claims are classified under events, they differ in the following ways:
### Incident
An [incident](/getting-started/glossary) refers to an unexpected event or occurrence that is recorded and tracked, as it can potentially become a lawsuit or claim.
### Claim
A [claim](/getting-started/glossary) is typically created when an incident leads to a formal lawsuit or a demand for money being made.
Imagine a patient slipping on an icy sidewalk at a care facility. This is recorded as an incident since it could lead to legal action. If the patient or their representative later files a lawsuit or requests a settlement, it becomes a claim.
Claims and Incidents follow the same creation process. To create one, follow the instructions for creating an Event.
# View Insured
Source: https://docs.aiinsurance.io/insureds/viewing-insureds
Navigate to the **Insureds** page by clicking the **Insureds** tab on the sidebar, to see all the insureds in your organization.
You’ll see a list of all insureds. You can search for specific insureds using the search bar at the top. Additionally, you can sort the list by: **Alphabetical**, **Last Updated**, and **Days Until Renewal**. You can also filter the insureds using various filters, such as:
* **Insured Status**: Filter by status, such as **Active** or **Inactive**.
* **Relationship Type**: Filter by the insured’s relationship to policies, such as **Primary**, **Named**, **Additional**, or **Related Entity**.
* **Policy Number**: Find insureds whose policy numbers **Match**, **Contain**, or **Do Not Contain** a specific value.
* **Join Date**: Filter insureds who joined **On**, **Before**, or **After** a specific date.
* **Termination Date**: Filter insured whose policies ended **On**, **Before**, or **After** a specific date.
## View an Insured
To view detailed information about a specific insured on the platform, search the list of insureds and click on the desired insured to open their profile page. This page includes the following tabs:
* **Summary**: Displays key details about the insured, such as addresses, license numbers, and specialties.
* **Policies**: Lists all of the active and inactive policies that the insured has ever been attached to.
* **Files**: Lets you upload files related to the insured, such as applications, resumes, or loss run reports. Learn more about files from the official [Files documentation](/platform/components/files).
* **Events**: Shows all events, including claims and incidents, that the insured has been involved in.
* **Notes**: Contains user-entered notes about the insured. Learn more about note taking for insureds in the [Notes documentation](/platform/components/notes).
* **Activities**: Tracks every action related to the insured, such as: Editing insured information, adding notes, uploading or downloading files, and adding the insured to policies. Learn more about an entity’s activity in the official [Activity Feed documentation](/platform/components/activity-feed).
Each activity is time-stamped and records the identity of the user who made the change, providing a complete history of updates.
# Setting Up Custom Accounts
Source: https://docs.aiinsurance.io/platform/companies/accounting/setting-up-custom-accounts
Custom accounts allow you to create and track specific transaction types for your insurance operations. This feature enables you to set up custom accounting categories like ULAE, IBNR LAE, IBNR Indemnity, and other specialized account types with hierarchical parent-child relationships.
## Understanding Parent-Child Account Relationships
The accounting system supports hierarchical account structures where parent accounts can have child accounts that inherit their payable/receivable status and other properties.
### Parent Accounts
Parent accounts serve as high-level groupings that define the overall category and properties:
* **Payable Parent**: Money owed by the insurance company (e.g., "ULAE", "IBNR LAE")
* **Receivable Parent**: Money owed to the insurance company (e.g., "Policy Invoice", "Premium Receivable")
### Child Accounts
Child accounts are subordinate to parent accounts and inherit their parent's properties:
* **Inherited Status**: Child accounts automatically inherit the payable/receivable status from their parent
* **Detailed Tracking**: Allow for more granular tracking within the parent category
* **Consolidated Reporting**: Child account balances roll up to the parent account
### Example Parent-Child Structure
**Payable Accounts:**
* **Parent**: "ULAE" (Payable, Event Invoice, Yes for Reserves)
* **Child**: "ULAE - Legal Fees" (inherits Payable, Event Invoice, Yes for Reserves)
* **Child**: "ULAE - Adjuster Fees" (inherits Payable, Event Invoice, Yes for Reserves)
**Receivable Accounts:**
* **Parent**: "Policy Invoice" (Receivable, Policy Invoice, No for Reserves)
* **Child**: "Policy Invoice - Premium" (inherits Receivable, Policy Invoice, No for Reserves)
* **Child**: "Policy Invoice - Fees" (inherits Receivable, Policy Invoice, No for Reserves)
This hierarchical structure allows for detailed tracking while maintaining consolidated reporting at the parent level.
## Set Up Custom Account Types
### Access Company Settings
1. Navigate to **Company Settings** from your account menu
2. Select the **Accounting** tab
3. You'll see the accounting configuration interface
### Add Custom Transaction Types
Follow these generic steps to add any custom account type:
1. Click **Edit** in the accounting section
2. Scroll down to find **"Add Transaction Type"** at the bottom
3. Enter your custom transaction type name
4. Click **"Add \[Your Transaction Type]"**
5. Configure the settings for your specific needs:
* **Payable/Receivable**: Choose whether this is money owed by or to the insurance company
* **Invoice Type**: Select "Event Invoice" for claim-related transactions or "Policy Invoice" for policy-related transactions
* **Reserves**: Choose "Yes" if this transaction affects claim reserves, or "No" if it doesn't
### Create Parent-Child Relationships
To set up parent-child account relationships:
1. **Create the Parent Account First**:
* Follow the steps above to create your main account (e.g., "ULAE")
* Set the payable/receivable status, invoice type, and reserves settings
* Save the parent account
2. **Add Child Accounts**:
* In the accounting table, find the parent account you created
* Click **"Add Child Account"** next to the parent account
* Enter the child account name (e.g., "ULAE - Legal Fees")
* The child account will automatically inherit the parent's payable/receivable status and other properties
* Save the child account
3. **Multiple Child Accounts**:
* You can add multiple child accounts under the same parent
* Each child inherits the parent's properties but can be tracked separately
* Child accounts roll up to the parent for consolidated reporting
### Repeat for Additional Account Types
You can add as many custom account types as needed by repeating the above steps for each new transaction type you want to create.
### Save Configuration
1. Click **Save** to apply all your custom account settings
2. Verify that all transaction types have been added correctly
## Export Policies with Custom Account Data
### Navigate to Events
1. Go to the **Events** section from the sidebar
2. Select a claim/event from the list
3. Click on the event title to open the details
### Get Policy Information
1. In the event details, na vigate to the **Insureds** section
2. Copy the **Policy Number** from the policy information
3. Navigate to the **Policies** section from the sidebar
### Search and Export Policies
1. In the Policies section, paste the policy number into the **search bar**
2. **Do not click on the policy** - instead, click **"Export Policies"** in the top-right corner
3. In the export dialog:
* Select the fields you want to include in the export
* Choose from available custom account fields (ULAE, IBNR LAE, IBNR Indemnity, etc.)
* Select any additional policy information fields
4. Click **"Export Policies"** to generate the Excel file
# API Keys
Source: https://docs.aiinsurance.io/platform/companies/api-keys
## API Keys Management
API keys allow your company to programmatically access AI Insurance data and integrate with external systems. This section covers how to manage API keys from your company settings.
## Overview
API keys provide secure, programmatic access to your AI Insurance platform. They enable:
* **Data Integration**: Connect external systems to your AI Insurance data
* **Automated Workflows**: Automate submission and quote management
* **Custom Applications**: Build custom tools that interact with your insurance data
* **Third-party Integrations**: Connect with other business systems
## Learn More About API Keys
For detailed information about generating API keys and how to use them with the API:
* **[How to Generate API Keys](/submissions-and-quotes/api/generating-api-keys)** - Step-by-step guide to creating your first API key
* **[API Reference](https://docs.aiinsurance.io/api-v1-reference/overview)** - Complete API reference, playground, and usage examples
# Brokerages and Broker Management
Source: https://docs.aiinsurance.io/platform/companies/brokerage/brokerage
You can manage your brokerages and brokers on the platform by doing the following
1. **Document**: Record details about Brokerages and Brokers, like their business information and commission rates.
2. **Track**: Record and report Brokerage and Broker commissions across individual policies and your entire business.
Click on your company's tab in the left sidebar, then select the **Brokerages** tab to open your **Brokerages** page. Here, you can start managing your brokerages and brokers. On this page, you'll see a list of all the brokerages you've created.
## Add a Brokerage
Follow these steps to add a brokerage:
1. Navigate to the **Brokerages** page and click the **Add Brokerage** button. This will open the **Add Brokerage** modal.
2. Enter the brokerage details, including the Name, Email, NIPR Brokerage Number, and other relevant information.
3. Select your **Commission Payment Settings.** There are three options:
* **Agency Bill**: The policy invoice is sent to the broker, and the commission is deducted from the total invoice amount.
* **Direct Bill**: The full policy invoice is sent to the insured, and a separate **Commission Invoice** transaction is created for the broker’s commission.
* **Do Not Handle Commissions**: No additional commission-related transactions will be created, and no commissions will be deducted from outbound policy invoices.
4. Click the **Add Brokerage** button to save the brokerage.
## View a Brokerage
On the **Brokerages** page, select a brokerage to open its dedicated page and view detailed information.
This dedicated page is split into four sections
* **Brokerage information**: This section provides an overview of your brokerage and is further divided into three subsections:
* **Brokerage Details:** Displays key information such as the brokerage name, email, phone number, default commission, and NIPR brokerage number.
* **Commission Summary:** Provides an overview of all commissions paid or owed by the brokerage over a specific period.
* **Commission History:** Shows a detailed record of commission transactions. Click the **Export** button to download this information.
* **Payment Information**: This section contains details about payment methods and commissions, divided into two subsections:
* **Payment Information:** Displays your brokerage’s bank details. Click the **Edit** button to update this information.
* **Commission Payment Settings:** Click the **Edit** button to modify your commission payment settings. Available options include **Agency Bill**, **Direct Bill**, or **Do Not Handle Commissions**.
* **Files**: This section stores all files associated with the brokerage and its brokers. Refer to the [Files documentation](/platform/components/files/files) to learn more about uploading and managing files on the platform.
* **Brokers**: This tab contains information about all brokers working under the brokerage.
## Edit a Brokerage
To edit a Brokerage:
1. Search for and locate the Brokerage you want to edit on the **Brokerages** page.
2. Click the edit icon next to the Brokerage to open the **Edit Brokerage** modal.
3. Update the necessary information in the form input fields.
4. Click the **Update Brokerage** button to save your changes.
## Add a Broker
Follow these steps to add a broker to a brokerage:
1. On the **Brokerages** page, select the brokerage where you want to add a broker.
2. Click the **Broker** tab, then select the **Add Broker** button to open the **Add Broker** modal.
3. Enter the new broker's information in the modal and click **Add Broker** to complete the process.
\
### How to create multiple users or brokers with the same email address
If you need to create multiple user or broker accounts using the same base email address, insert a "+" followed by a unique identifier before the "@" symbol. Most email providers, such as Gmail, will still deliver all emails to the original inbox.
For example, if your base email is:
`alex@example.com`
You can create variations like:
* `alex+broker1@example.com`
* `alex+user2@example.com`
* `alex+nyoffice@example.com`
This allows you to manage multiple accounts while receiving all emails in one central inbox.
## View a Broker
To view a Broker:
1. On the **Brokerages** page, select the brokerage that employs the broker you want to view.
2. Click the **Broker** tab to see a list of brokers under that brokerage.
3. Select a broker to open their designated **Broker** page for more details.
A **Broker** page has two tabs: **Broker Information** and **Files**.
* **Broker Information: This tab contains all details related to a broker, divided into four sections:**
* **Broker Information:** Includes the broker’s name, email, phone number, default commission, and producer number.
* **Brokerage Details:** Displays information about the brokerage the broker works for, such as brokerage name, email, phone number, default commission, NIPR brokerage number, and commission payment details.
* **Commission Summary:** Provides an overview of all commissions paid or owed by the brokerage over a specific time period.
* **Commission History:** A detailed record of commission transactions within the brokerage. Click the **Export** button to download this data.
* **File**: This tab contains all files associated with the broker. Refer to the [Files documentation](/platform/components/files/files) to learn more about uploading and managing files on the platform.
## Attaching a Broker to a policy
During [policy creation](https://app.aiinsurance.io/docs/policy-management/creating), you can attach an existing Broker or create a new one. When a Broker is linked to a policy, the policy automatically gets the Broker's default commission. However, you can change this commission manually if there's a special agreement for that policy.
# Commission Status Overview
Source: https://docs.aiinsurance.io/platform/companies/brokerage/commission-status-pending-premium
Commission statuses track the lifecycle of broker commissions from creation to payment. The system automatically links policy invoices to commission invoices, ensuring commissions are only paid after the corresponding premium has been collected. With direct bill payments, commissions aren't paid until the insured actually pays the invoice they owe.
## Overview
AI Insurance's automated commission tracking system manages the complete lifecycle of broker commissions. When a policy is issued, the system automatically creates commission records and tracks their status through three main stages: Pending Premium, Owed, and Paid. This ensures proper commission management and payment timing based on actual premium collection.
## Direct Bill Payment Process
### How Direct Bill Affects Commission Status
With **Direct Bill** payment method:
* **Commission Creation**: Commission records are created when the policy is issued
* **Initial Status**: Commissions start as "Pending Premium"
* **Payment Requirement**: Commissions remain pending until the **insured pays their invoice**
* **Status Progression**: Only after the insured pays does the commission progress to "Owed"
### How It Works
1. **Automatic Commission Creation**: When a policy is issued, commission records are automatically generated
2. **Status Assignment**: Commissions are initially set to "Pending Premium" status
3. **Payment Monitoring**: The system monitors the corresponding policy invoice payment status
4. **Automatic Status Progression**: Once the linked policy invoices are paid, the commission status automatically progresses from "Pending Premium" to "Owed"
## Viewing Commission Status
### Access Commission History
To view commissions with Pending Premium status:
1. Navigate to your **Company** settings from the sidebar
2. Go to the **Brokerage** section
3. Find and click on the specific **brokerage** you want to review
4. Scroll down to the **Commission** section
5. You'll see the commission history table with various statuses including "Pending Premium"
## Commission Status Types
### Pending Premium
* **Meaning**: Commission is not yet owed because the linked policy invoice payment hasn't been received
* **When It Occurs**: Immediately when a policy is issued and commission records are created
* **Action Required**: None - system automatically progresses when policy invoice is paid
* **Next Status**: Automatically progresses to "Owed" when the linked policy invoices are paid
* **Business Impact**: No commission payment is due until premium is collected
### Owed
* **Meaning**: Premium has been paid, commission is now due to the broker
* **When It Occurs**: After the linked policy invoice has been successfully paid
* **Action Required**: Commission payment can be processed and scheduled
* **Previous Status**: Was "Pending Premium" before premium payment
* **Business Impact**: Commission payment is now required and can be processed
* **Next Status**: Progresses to "Paid" once commission payment is completed
### Paid
* **Meaning**: Commission has been successfully paid to the broker
* **When It Occurs**: After the commission payment has been processed and completed
* **Action Required**: None - commission cycle is complete
* **Previous Status**: Was "Owed" before commission payment
* **Business Impact**: Commission obligation is fulfilled, cycle complete
* **Next Status**: Final status - no further progression
## Commission Lifecycle
### Complete Status Flow
The commission lifecycle follows a clear progression:
1. **Policy Issued** → Commission created with "Pending Premium" status
2. **Premium Paid** → Status automatically progresses to "Owed"
3. **Commission Paid** → Status changes to "Paid" (final status)
### Timeline Expectations
* **Pending Premium**: Duration depends on when insured pays their invoice
* **Owed**: Typically processed within standard payment cycles
* **Paid**: Final status indicating completion of commission cycle
## Monitoring and Management
### Viewing Commission Statuses
To monitor all commission statuses:
1. Access the **Commission History** section as described above
2. Review entries by status type:
* **"Pending Premium"**: Commissions awaiting premium payment
* **"Owed"**: Commissions ready for payment processing
* **"Paid"**: Completed commission payments
3. For each status, review:
* **Related Policy**: The policy associated with the commission
* **Amount**: Commission amount in USD
* **Date**: When the status was set
* **Payment Method**: How the commission is structured
### Exporting Commission Data
You can export commission data for further analysis:
1. In the Commission History section, click the **Export** button
2. Select the data range and filters you need
3. Download the Excel file for detailed commission tracking
# Run Payout Report
Source: https://docs.aiinsurance.io/platform/companies/brokerage/run-payout-report
The Run Payout Report feature allows you to generate comprehensive payout reports for brokerages and other payees using custom form templates with smart tags. This workflow combines form creation, smart tag integration, and automated report generation.
## **Step-by-Step Guidance**
### **Step 1: Optionally Edit/Customize the Commission Report Form**
1. Go to **Companies** in the left sidebar
2. Select the **Brokerage** you want to generate a report for
3. Navigate to the **Commission Summary** section
4. Review the outstanding commissions that need to be included in the report
5. Note the commission amounts and details
### **Step 3: Run Payout Report**
1. In the Commission Summary section, click the **"Run Payout Report"** button
2. The system will open the Payout Report Wizard
### **Step 4: Create Report Settings**
1. In the **"Create Report"** step:
* Select which items to include in your report:
* **"1 selected items"** - For specific commission entries
* **"All Owed Invoices"** - For all outstanding commissions
* Choose your form template from the dropdown menu:
* **Option 1: Use Auto-generated Form** - Select "Commission Report (Auto-generated)" for the standard template (recommended)
* **Option 2: Use Custom Form** - Select any custom form you've created and customized
* Verify the template name appears in the input field
2. Click **"Next"** to proceed
### **Step 5: Review Generated Report**
1. In the **"Review Report"** step:
* The system will display your generated report with all smart tags populated
* Review the commission data, payee information, and formatting
* Verify that all smart tags have been replaced with actual data
* Check that the totals and calculations are correct
2. Use the **"Download"** button if you need a copy of the report
3. Click **"Next"** to continue
### **Step 6: Configure Payment Settings**
1. In the **"Payment Settings"** step:
* Choose how to handle payment for the reported items:
* **"Mark reported items as paid"** - Updates the status of included commissions
* **"No Action"** - Leaves commission status unchanged
2. Click **"Next"** to proceed
### **Step 7: Review and Confirm**
1. In the **"Review & Confirm"** step:
* Review all settings and generated content
* Verify the payment handling selection
* Confirm the report includes all intended commission data
2. Click **"Confirm"** to finalize the payout report
# Capturing Unallocated Funds
Source: https://docs.aiinsurance.io/platform/companies/cash-management/capturing-unallocated-funds
When you receive funds from clients that don't match any invoice amount, they appear as unallocated funds in the **Over/Underpaid Funds** section of the Cash Management page. You can capture these funds and apply them to a specific invoice using the improved capture workflow.
## Overview
Unallocated funds occur when:
* A client sends funds that are insufficient to pay any of their invoices
* Payment amounts don't exactly match any outstanding invoice
* Funds are received but cannot be automatically applied
These funds are tracked in the **Over/Underpaid Funds** section until they can be manually applied to the correct invoice.
## How to Capture Unallocated Funds
### Step 1: Access the Capture Feature
1. Navigate to **Company** → **Cash Management** tab
2. Scroll down to the **Over/Underpaid Funds** section
3. Find the insured with unallocated funds
4. Click the **Capture** button next to the unallocated funds amount
### Step 2: Select an Invoice
The **Collect Unallocated Funds** modal will open. Use the searchable dropdown to find the invoice you want to apply the funds to:
1. Click in the **"Select an Invoice"** search field
2. Search by:
* Insured name
* Invoice number
* Policy number
* Event ID
3. Select the invoice from the dropdown results
### Step 3: Apply Funds to Invoice
1. In the **Apply Funds to Invoice** section, enter:
* **Invoice ID**: Input the invoice number or identifier
* **Applied Amount**: Enter the amount you want to apply from the unallocated funds
2. Review the **Customer Funds History** table to see the transaction history for this customer, including:
* **Reference Number**: Transaction reference numbers
* **Amount**: Transaction amounts (positive for credits, negative for debits)
3. Click **Collect** to apply the funds to the specified invoice, or click **Close** to cancel
## Minimum Capture Amount
Stripe requires a minimum payment amount of **\$0.50 USD**. If a customer's unallocated balance is less than \$0.50, the **Capture** button will be disabled. You will need to wait until additional funds are received to bring the balance above the minimum before capturing.
If you need to resolve a balance under \$0.50, contact support at [support@aiinsurance.io](mailto:support@aiinsurance.io) for assistance.
## Handling Overpaid Unallocated Funds
If you have overpaid unallocated funds that you want to capture, you'll need to create an invoice first, then contact support to have the funds allocated to that invoice.
### Step 1: Create an Invoice
1. Generate a one-off invoice for the amount you want to capture
2. For detailed instructions on creating one-off invoices, see [Generating One-Off Invoices](/financials/invoicing/generating-one-off-invoices)
### Step 2: Contact Support
After creating the invoice, reach out to support at [support@aiinsurance.io](mailto:support@aiinsurance.io) to request that the unallocated funds be allocated to the newly created invoice. Support will handle the allocation process for you.
**Note**: This process requires support assistance to complete the allocation. Make sure to have the invoice number ready when contacting support.
**Note**: For more information about the Over/Underpaid Funds section and how unallocated funds work, see [Cash Management](/platform/companies/cash-management/cash-management).
## Need Help?
If you encounter any issues while capturing unallocated funds or have questions about the process, please contact support at [support@aiinsurance.io](mailto:support@aiinsurance.io).
# Cash Management
Source: https://docs.aiinsurance.io/platform/companies/cash-management/cash-management
The Cash Management feature lets you automatically issue invoices and collect premiums directly from the platform. Additionally, you initiate deposits and withdrawals.
This feature is only available to Premium Billing users
## What is Cash Management?
Cash Management is a representation of Stripe Treasury Financial Account. In simple terms, Stripe Treasury Financial Account is the carrier's bank account.
## When do transactions link to internal invoices?
The Transaction History table shows the Stripe Treasury transactions (money movements) that have occurred on the Stripe Treasury Financial Account. The table also includes links to internal invoices, when available.
There are two types of transactions that may have links to internal invoices:
* **Outbound payment**
* **Received credit**
### Outbound Payments
Outbound payment is when money leaves the bank account.
**Example:** A carrier pays a claim.
It is possible for an outbound payment to not have an associated internal invoice.
**Example:** Carrier sends money from Cash Management. No internal invoice will be used to track it.
If an associated internal invoice exists:
* There is a 1:1 mapping between outbound payment and our internal invoice
* The outbound payment amount should match the associated internal invoice amount
### Received Credits
A received credit represents money entering the carrier's Stripe Treasury Financial Account (i.e., the bank account). Received credits correspond to Stripe payouts, not directly to invoices.
Because of how Stripe structures money movement, a received credit does not inherently know which invoices it relates to.
***
## How Money Flows Before It Becomes a Received Credit
To understand how received credits may be linked to internal invoices, it's important to distinguish three separate Stripe systems:
### 1. Stripe Invoicing
Stripe Invoices represent billing intent.
There is a 1:1 mapping between:
* Stripe Invoices
* Internal invoices in our system
**Example:** A carrier bills an insured for their policy premium.
Stripe Invoices do not represent cash movement.
### 2. Stripe Payment Balance
The Stripe Payment Balance is an internal Stripe ledger associated with the carrier's connected account. All incoming funds land here first before being paid out to the carrier's bank account.
Funds can come from:
* Stripe Invoice payments (e.g., premium payments)
* Non-invoice payments (e.g., direct charges, transfers)
**Example:** An insured pays their policy premium → funds land in the carrier's Stripe Payment Balance (not directly in their bank account).
The Stripe Payment Balance may contain funds from multiple sources and multiple invoices, commingled together. Stripe automatically pays out this balance to the carrier's linked bank account on a schedule (typically daily, depending on the account's country and settings).
### 3. Payouts
A payout moves money from Stripe Payment Balance → Stripe Treasury Financial Account.
Each payout appears in Cash Management as a received credit.
A payout:
* May include funds from one or more Stripe Invoices
* May include funds not associated with any invoice
***
## Why Received Credits Have Indirect Invoice Links
Because these systems are separate:
* Received credits reflect payouts
* Payouts draw from Stripe Balance
* Stripe Balance aggregates money from multiple sources
* Only Stripe Invoices carry internal invoice / transaction IDs
As a result, the relationship between received credits and internal invoices is indirect and inferred, not explicit.
***
## Mapping Received Credits to Internal Invoices
When internal invoices can be linked to a received credit:
**The relationship can be:**
* 1 received credit : 1 internal invoice
* 1 received credit : many internal invoices
* many received credits : 1 internal invoice (due to partial payments applied via the Unallocated Funds tool)
> ⚠️ **Note:** The many-to-one case (multiple received credits linked to a single internal invoice) may not display correctly in the UI. This is in development.
**Amount relationship:**
* The received credit amount will be greater than or equal to the sum of the linked internal invoices
**Attribution method:**
* The mapping is derived by tracing funds through Stripe objects, not from a direct reference
**The attribution path is:**
```
Received Credit (Financial Account)
→ Payout
→ Stripe Balance
→ Stripe Invoice
→ Internal invoice / transaction ID
```
## How to set up your operating account
You send and receive money from an [operating account](/platform/companies/cash-management/operating-account) in the platform. Take the following steps to set up your operating account:
1. Navigate to the **Cash Management** page by clicking your Company’s tab at the sidebar and selecting the **Cash Management** tab to set up an operating account.
2. Click the **Set up** button on the **Cash Management** page to set up your operating account.
3. This action will redirect you to create a Stripe account. This is because Stripe and Fifth Third Bank power the operating account.
## Components of the Cash Management page
Your Cash Management page will look similar to the image below after you set it up:
### **Account Details**
This section details the operating account, including the **Account Number**, **Routing Number**, **Bank Name**, and **Holder Name**.
You can also perform the following actions in this section:
* **View your operating account details**: Click the **Account Details** button to open the **Manage AI Insurance Cash Payment** modal. This modal displays your operating account details, allowing you to transfer funds to this account to facilitate payments.
* **Withdraw funds**: Click the **Send Money** button to transfer money from your operating account to a bank account of your choice.
**Payment Fees**: When you make a payment out of AI Insurance using Stripe Treasury ACH, no fee is charged.
* **Delete the operating account**: Click the **Delete** button to remove the operating account.
### **Account Balance**
This section overviews the current cash balance, including all inbound and outbound transactions initiated through the user interface.
### **Transaction History**
This section lists all transactions involving the operating account. Click the **Export** button in the top-right corner to export all your transactions.
## How your operating account works behind the Scenes
The operating account is not a bank account. Instead, it's an FBO Account maintained by Stripe as the custodian. Funds are held at Fifth Third Bank, an FDIC-insured bank, and ACH and Wire Transfers are fully supported.
For more detailed information about what the Operating Account is and how it works, see [AI Insurance Operating Account](/platform/companies/cash-management/operating-account).
Below is a diagram of the flexibility and extensibility of the Operating Account
# Invoice Links in Cash Management
Source: https://docs.aiinsurance.io/platform/companies/cash-management/invoice-links-in-cash-management
Cash Management is a representation of a Stripe Treasury Financial Account. In simple terms, the Stripe Treasury Financial Account is the carrier’s bank account. For an overview, see [Cash Management](/platform/companies/cash-management/cash-management).
## Feature description
Cash Management now has an additional column in the **Transaction History** table to link Stripe Treasury transactions to our internal transactions.
Each Stripe Treasury transaction may or may not have one or more internal invoices associated with it.
* If internal invoices are found, links are provided in the **Invoice** column.
* If no internal invoices are found, "-" is displayed in the **Invoice** column.
## How invoice links work
When invoice links are present:
* If multiple invoices are linked, the link opens a list of invoices.
* The list shows the invoice number when available; if not, it shows the invoice date.
For details on the association between Stripe Treasury transactions and internal transactions, see [Cash Management](/platform/companies/cash-management/cash-management).
# Operating Account
Source: https://docs.aiinsurance.io/platform/companies/cash-management/operating-account
The AI Insurance Operating Account is a dedicated account designed specifically for funding claims and managing financial transactions within the AI Insurance platform. It provides a secure, streamlined way to handle payments and improve your financial operations.
## What is the Operating Account?
The Operating Account is a **distinct account** created exclusively for funding claims on AI Insurance. It operates independently from your existing bank accounts and provides a dedicated financial infrastructure for your insurance operations.
### Key Characteristics
* **Separate from Your Bank Accounts**: There is **no connection** to your existing bank account access. The Operating Account is completely independent and isolated from your other banking relationships.
* **Dedicated Purpose**: Designed specifically for funding claims and managing transactions within the AI Insurance platform.
* **FDIC-Insured**: The account is FDIC-insurance eligible, providing protection for your funds.
* **Unique Account Details**: You receive a distinct account number and routing number for the Operating Account.
## How It Works
The Operating Account is an FBO (For Benefit Of) Account maintained by Stripe as the custodian. Funds are held at Fifth Third Bank, an FDIC-insured bank, and ACH and Wire Transfers are fully supported.
### Account Structure
* **Custodian**: Stripe manages the account as the custodian
* **Bank**: Fifth Third Bank (FDIC-insured)
* **Account Type**: FBO Account (For Benefit Of)
* **Transfer Methods**: ACH and Wire Transfers are fully supported
## Benefits
### Enhanced Security and Fraud Prevention
* **Reduced Fraud Risk**: Pay everything by ACH, eliminating the need for checks and reducing fraud exposure
* **Isolated Account**: Complete separation from your primary banking relationships provides an additional layer of security
### Streamlined Operations
* **One-Click Payments**: Streamline your payment process with one-click payment capabilities
* **Faster Processing**: ACH payments process more quickly than traditional check payments
* **Automated Workflows**: Integrate directly with your existing accounting systems
### Improved Audit Posture
* **Audit-Friendly**: We work directly with many audit firms, and the Operating Account improves your audit posture
* **Clear Transaction History**: All transactions are tracked and recorded within the AI Insurance platform
* **Transparent Reporting**: Easy-to-access financial records for audit purposes
### Accounting System Integration
The Operating Account integrates directly with various accounting systems, including:
* **NetSuite**
* **QuickBooks**
* And other major accounting platforms
This integration allows for seamless synchronization of financial data between AI Insurance and your accounting systems.
## Setting Up Your Operating Account
To set up your Operating Account, see [Cash Management](/platform/companies/cash-management/cash-management) for step-by-step instructions.
**Note**: The Cash Management feature, including the Operating Account, is only available to Premium Billing users.
# Change Company Legal Name
Source: https://docs.aiinsurance.io/platform/companies/company/changing-company-name
### How to Change Company Legal Name
1. Navigate to the **company instance** by clicking on your company name in the sidebar
2. Go to the **Company** tab
3. Click the **Edit** button under the company section
4. In the edit view, locate the **Company Legal Name** field
5. Update the company name as needed
6. Click **Save** to apply the changes
# Change Coverage Names
Source: https://docs.aiinsurance.io/platform/companies/company/changing-coverage-names
### How to Change Coverage Names
1. Go to **Company**
2. Scroll down to find the coverage you want to edit
3. Click the **edit button**
4. In the "Edit Coverage Type Name" modal:
* Change the name in the "Coverage Type Name" field as needed
* The original name is displayed below the input field for reference
5. Choose your action:
* Click **"Save Changes"** to apply the new name
* Click **"Reset to Original"** to restore the original name
* Click **"Cancel"** to close the modal without saving changes
### Related Information
For information on changing coverage limits, see [Changing Coverage Limits](/policing/policy-management/changing-coverage-limits).
# Company
Source: https://docs.aiinsurance.io/platform/companies/company/company
The **Company** section outlines your organization's guiding rules, specifying the events your insurance company does not cover or pay for.
These rules are crucial for invoice auditing. By applying these custom rules, the AI Insurance platform can automatically identify and flag invoices that include charges for services not covered under the service agreement.
To add, remove, or modify the rules in the **Company** section, click the **Edit** button, make your changes, and then click **Save** to apply the updates.
Refer to the [invoice audit documentation](/financials/invoicing/invoice-auditing) to learn more about how AI Insurance leverages artificial intelligence to automate the invoice audit process and best practices for writing your rules.
# Creating and Validating Forms
Source: https://docs.aiinsurance.io/platform/companies/creating-and-validating-forms/creating-and-validating-forms
AI Insurance offers a user-friendly forms editor that lets you create, edit, or import your existing policy form templates. You can also add [Smart Tags](/platform/components/smart-tags) to fill in details about insured individuals and policies automatically. With familiar word processing tools, you can easily modify your forms—all in one place.
## View forms
Follow these steps to view your forms:
1. Navigate to the left sidebar and click on your company’s name to open the company-level settings.
2. Click on the **Forms** tab on your company’s designated page, as shown in the image below. You will be presented with a list of all your currently available forms.
### **Certificate of Insurance (Auto-generated)**
If this is your first time accessing the Forms page, you’ll notice a form already exists. This form is the automatically generated [Certificate of Insurance](/policing/insured-management/generating-insured-reports#generate-a-coi), fully customizable to meet your needs.
You can click and open up the document to get a better understanding of how forms can work.
## Categorize Forms
You can create forms tailored to specific object categories such as Insured, Policy, and Events. This simplifies the form creation process and enables the use of Smart Tags that are specific to each category.
To create a form for a specific object category:
1. On the **Forms** page, click the **Create New Form** button to open the **Edit Document** page.
2. On the **Edit Document** page, you’ll need to fill in the following fields:
* **Document Name**: The name of the form you are creating.
* **Category**: The object type the form will be associated with (e.g., Policy, Insured, Event).
## Category field
The Category input field determines what Smart Tag you can add to a document.
For example, you can add Smart Tags, like Billing Details and Binding Conditions, to forms created for quotes and endorsements; however, these tags will not be available for forms belonging to the Event category.
Available form categories include:
* Policy (Quote/Endorsement)
* Insured (Single Policy)
* Insured (Policies/Claims/Incidents)
* Claim/Incident
**Note**: Once you select a category and create the form, you cannot change the category later.
After selecting the appropriate category, you can proceed to [create your form](/platform/companies/creating-and-validating-forms/creating-and-validating-forms).
## Create a Form
Click the **Create New Form** button on the forms page to open the form editor. The editor has a familiar interface similar to Microsoft Word, making it easy to use.
Create a new form template from scratch or import an existing `.docx` file into the editor.
Only .docx files can be imported, and forms with macros are not supported.
### **Adding Smart Tags**
AI Insurance comes preloaded with several Smart Tags that automatically inject information about your insureds or the policy directly into a form. Common Smart Tags include Schedules of Insureds, Policy Numbers, Policy Start and End Date, etc. A complete list, including examples, is located on the [Smart Tags documentation](/platform/components/smart-tags), and inserting them is as easy as placing your cursor in the correct place within your form and inserting a smart tag from the menu on the right:
### **Saving a Form Template**
After creating and reviewing your form, to save the form, edit the Document Name and click the **Save** button to save your form.
## Edit a Form
On your forms page, select the form you would like to edit. This action will open the form in the form editor. Make your changes, and click the **Save** button to save the changes.
## Testing a Form Template
We recommend integrating your form into a policy for thorough validation that your form looks and behaves as expected. To do so, create a policy by following the steps outlined in the Policy Issuance documentation.
During policy creation, do the following:
1. Take note of the smart tags, as you might need to reference them in your form
2. During the Select Forms section of the policy creation process, search and add your form and click **Edit or Rename** to review your form within the Forms Editor
3. Confirm that your form looks as intended
## Deleting a Form Template
To delete a form, select the form by clicking the checkbox by the form and click the Delete button.
Forms cannot be recovered once deleted.
# Data Import
Source: https://docs.aiinsurance.io/platform/companies/data-import/data-import
The **Data Import** feature allows you to easily manage and track all your historical data import or bordereau import operations in one place.
To access the **Data Import** feature:
1. Click your company's name in the sidebar on the left to open the company-level settings.
2. Under your Company's name, locate and click on the **Data Import** tab to view and manage your import operations.
## Overview Imported Data Job History
The **Import History** section provides a comprehensive summary of all your imported data jobs. This function includes:
* **Job ID**: A unique identifier for each import job (displayed as a clickable blue link)
* **Upload Date**: The date and time when the import was initiated (sortable column with down arrow)
* **Status**: The current status of the import job (e.g., "Complete", "In Progress", "Failed")
* **Last Updated**: The most recent update timestamp for the job
The table displays all import jobs in chronological order, with the most recent imports appearing at the top. You can change the chronological order by clicking the **Upload Date** header.
## Import New Job Features
To create a new import job:
1. In the **Import History** section, click the **New Import** button located in the top-right corner.
2. This will open a file upload interface where you can:
* Select the file you want to import
* Choose the appropriate file format
* Configure any import settings
3. Click **Import** to generate a new job ID and begin the import process.
The system will automatically assign a unique Job ID to track your import progress.
## Job Detail Page
Click on any Job ID in the Import History table to access the detailed view of that specific import job.
This function includes:
### Admin Control
* **Status Management**: Change the status of the imported job between "Complete" and "Incomplete"
### Job Information
* **Job Status**: Current status of the import job
* **Created Time**: When the job was initially created
* **Last Updated Time**: The most recent modification timestamp
### Uploaded Files
* **File Management**: View all files uploaded for this specific job
* **File Details**: Access file information, download options, and file status
* **File Processing**: Monitor the processing status of uploaded files
From the job detail page, you can always return to the job history by clicking the button on the top right corner.
# Files
Source: https://docs.aiinsurance.io/platform/companies/files
This section includes all the files stored within the company-level settings. To learn more about managing files, including uploading, downloading, editing, and deleting, refer to the [Files Documentation](/platform/components/files).
# Multi Companies
Source: https://docs.aiinsurance.io/platform/companies/multi-companies/multi-companies
At AI Insurance, you can switch between insurance companies that you work for and issue insurance policies. To do so, click the **Switch Company** tab at the sidebar and select an insurance company from the option.
# Payees
Source: https://docs.aiinsurance.io/platform/companies/payees/payees
The Payees feature makes it easy to manage various payment recipients, like law firms, vendors, and experts. You can quickly add, update, and organize payee details, payments, and files. Payees are tracked for easy association with invoices.
## View Payees
To view your Payees, follow these steps :
1. Click your company’s name in the sidebar on the left to open the company-level settings.
2. Under your Company’s name, locate and click on the **Payees** option to view and manage your payees.
## Add a Payee
To add a payee, do the following:
1. Click the **Add Payee** button in the top-right corner of the **Payees** section to open the **Add Payee** modal.
2. Fill out the modal with the Payee information.
3. Click the **Add Payee** button to save.
The **Add Payee** button will be initially grayed out until you enter **Payee Type** and **Name**.
## Add a Payee with their corresponding invoice
To add a Payee with their respective invoice, do the following:
1. Click the **Financials** tab at the left sidebar to open the **Financials** page.
2. Go to the **Transactions** section, click the **New Transaction** button, and select the transaction type for the payee.
3. On the **New Transaction** page, fill out the **Basic Information** form.
4. Add the **To** field in the **Basic Information** form, which represents the Payee. You can either select an existing Payee or create a new one. To create a new Payee:
a. Enter the Payee's name. If the Payee doesn't exist, click the **Create New Payee \[Payee Name]** option to open the **Add Payee** modal.
b. Fill out the Payee information in the modal.
c. If this Payee is a one-time payment (for a single, isolated transaction), uncheck the **Save this Payee** checkbox.
d. Click the **Add Payee** button to save and return to the **Basic Information** form.
5. Complete the information for the **New Transaction** page and click the **Save** button. The Payee and their transaction will now appear in the Transactions section.
## Edit Payee information
In the AI Insurance platform, you can edit Payee information by:
1. Navigate to your Company’s page by selecting the Company on the sidebar and selecting the **Payees** tab.
2. Select the Payee whose information you want to update.
3. Click the **Edit** button at the top right on the designated Payees page and update the information as needed.
### **Add an attorney**
You can add an attorney to a Payee, especially in legal representation cases. Here's how:
1. Click the **Add Attorney** button in the Attorneys section to open the modal.
2. Fill out the attorney's information in the modal.
3. Click the **Add Attorney** button to save.
### **Uploading Payee Files**
To upload files to payees, follow these steps:
1. Go to your Company's page by selecting the Company from the sidebar, then click the **Payees** tab.
2. Choose the Payee you want to upload a file for.
3. On the Payee's page, select the **Company Files** tab.
4. Click the **Upload File** button on the right side to add a new file.
## Remove a Payee
Go to **Company Settings** > **Payee** section, check the Payee you want to remove and click **Remove Payee**.
# Single Sign-On (SSO) Support
Source: https://docs.aiinsurance.io/platform/companies/single-sign-on
## Overview
Single Sign-On (SSO) is an enterprise feature that lets your users authenticate into AI Insurance using identity providers you already trust. We currently support:
* Sign in with Google
* Sign in with Microsoft
SSO improves security (centralized identity, MFA, conditional access) and simplifies onboarding by removing the need to manage separate passwords.
## How Users Sign In
1. Navigate to your AI Insurance login page: `https://app.aiinsurance.io`
2. Choose one of:
* Continue with Google
* Continue with Microsoft Account
3. Complete the IdP prompt (MFA, approvals, etc.). You’ll be redirected back and signed in.
# Roles Reference
Source: https://docs.aiinsurance.io/platform/companies/user-roles-and-permissions/roles-reference
This page describes each user role available when [adding a user](/platform/companies/user-roles-and-permissions/user-roles-and-permissions#add-a-user) to your company, and the access each role grants across the different areas of the platform.
For instructions on adding, editing, and removing users, see [User Roles and Permissions](/platform/companies/user-roles-and-permissions/user-roles-and-permissions).
## How access levels work
Every role is a bundle of permissions. Each permission grants an action (such as read, create, update, delete, export, or download) on a specific kind of data (such as policies, claims, or files). The tables below summarize each role's access using the following levels:
| Level | Meaning |
| ----------------- | --------------------------------------------------------------------------------------- |
| **Write** | Can create, edit, and generally also delete records in this area (includes read access) |
| **Read + export** | Can view records and export or download data and files in this area |
| **Read** | Can view records in this area |
| — | No access to this area |
In AI Insurance, **events** is the umbrella term for **claims and incidents** — see
[Understanding Events](/events/understanding-events). Roles with write access to events can
manage claims, incidents, and the related attorneys and law firms.
## Role comparison
| Role | Submissions & applications | Quotes | Policies | Insureds | Events (claims & incidents) | Financials & payments | Brokers & brokerages | Company files | Form templates | Users |
| ----------------------------------------------------------------- | -------------------------- | ------ | ------------- | ------------- | --------------------------- | --------------------- | -------------------- | ------------- | -------------- | ----- |
| [Carrier Admin](#carrier-admin) | Write | Write | Write | Write | Write | Write | Write | Write | Write | Write |
| [Manager](#manager) | Write | Write | Write | Write | Write | Write | Write | Write | Write | Read |
| [UW/Ops Team Member](#uw-ops-team-member) | Write | Write | Write | Write | Write | Write | Write | Write | Write¹ | Read |
| [Policy Administrator](#policy-administrator) | Write | Write | Write | Write | — | Write | Write | Write | Write | — |
| [Event Manager](#event-manager) | Read + export | Write | Write | Write | Write | Write | Write | Write | Write | — |
| [MGA](#mga) | Write | Write | Write | Write | Write | Write | Read | Write | Read | Read |
| [Claims Manager](#claims-manager) | — | — | Read | Read | Write | Read | — | Write | — | — |
| [Accounts Payable](#accounts-payable) | Read + export | Read | Read + export | Read | Read + export | Write | Write² | Read + export | Read | — |
| [Captive Manager](#captive-manager) | Read + export | Read | Read + export | Read + export | Read + export | Read | Read + export | Write | Read | — |
| [Viewer/Exporter](#viewer-exporter) | Read + export | Read | Read + export | Read + export | Read + export | Read | Read + export | Read + export | Read | — |
| [Viewer/Exporter - Insured Forms](#viewer-exporter-insured-forms) | Read + export | Read | Read + export | Write³ | Read + export | Read | Read + export | Read + export | Read | — |
| [Viewer](#viewer) | Read + export | Read | Read + export | Read | Read + export | Read | Read | Read | Read | — |
| [Broker](#broker) | Write | Read | — | — | — | — | — | — | — | — |
| [Client Member](#client-member) | — | — | — | — | — | — | — | Read + export | — | — |
| [Configuration Manager](#configuration-manager) | — | — | — | — | — | — | — | — | — | — |
¹ Can create and delete form templates but cannot edit existing ones.
² Write access is limited to broker and brokerage files; broker and brokerage records themselves are read-only.
³ Write access is limited to insured forms; other insured data is read and export only.
## Role details
### Carrier Admin
Full read/write access on all carrier data. A Carrier Admin can also add new carrier members and change their roles — it is the only standard role that can manage users.
### Manager
Full read/write access on all carrier data, equivalent to a Carrier Admin except for user management: a Manager can view the user list but cannot add users or change roles.
### UW/Ops Team Member
Full read/write access to all company data, except write access to forms and templates is limited: a UW/Ops Team Member can create and delete form templates but cannot edit existing ones. Can view the user list but cannot manage users.
### Policy Administrator
Full access to create and edit submissions, quotes, policies, insureds, and forms, but no access to claims or incidents.
### Event Manager
Full read/write access on carrier events (claims and incidents). Read and export access on submissions and applications, including the ability to reject applications, and write access to most other carrier data. Cannot view or manage users.
### MGA
For Managing General Agents. Full read/write access on carrier incidents, claims, submissions, policies, and insureds. Read-only access to brokers, brokerages, and form templates. Can view the user list but cannot manage users.
### Claims Manager
Full read/write/export access for claims and incidents, including the related attorneys and law firms. Read-only access to policies, insureds, and payments, and write access to company files. No access to submissions or quotes. Additional permissions will be granted as needed to suit the needs of the role.
### Accounts Payable
Full read and export access on all carrier data. Write access is limited to financial transactions and to broker and brokerage files.
### Captive Manager
Full read and export access on all carrier data. Write access to company-level files only.
### Viewer/Exporter
Full read and export access on all carrier data, but no permissions to modify data.
### Viewer/Exporter - Insured Forms
Full read and export access on all carrier data, plus the ability to create and edit insured forms.
### Viewer
Full read access on all carrier data, but no permissions to modify data. Can export events and policies.
### Broker
For third parties selected by the carrier to help applicants with their applications. A Broker can create, edit, and submit applications and submissions (including their files) and view quotes and payment information. No access to any other carrier data.
### Client Member
Full read and download access to company files, and read access to contacts. No access to any other carrier data.
### Configuration Manager
Can export and import company configuration via the onboarding spreadsheet pipeline. No access to any company data.
## Privileged notes
Certain objects on the platform, such as [Notes](/platform/components/notes/notes), can be marked as **Privileged**, making them viewable only by users whose roles contain privileges. The following roles can view privileged notes:
* Carrier Admin
* Manager
* UW/Ops Team Member
* Event Manager
* MGA
[Contact support](mailto:support@aiinsurance.io) if you would like to configure privileges for other roles.
## Custom roles
If none of the standard roles fit your needs, AI Insurance can create custom roles tailored to your company. Contact [support](mailto:support@aiinsurance.io) to design roles that control access to specific features and data based on your requirements.
# User Roles and Permissions
Source: https://docs.aiinsurance.io/platform/companies/user-roles-and-permissions/user-roles-and-permissions
The **Users and Permissions** feature is critical for maintaining data security by effectively managing user roles and permissions. By assigning specific roles to team members, you can control their actions and the information they can access in the system.
## Overview of the available user roles and their scope
AI Insurance offers various user roles, each with its own permissions. The available roles are:
* **Carrier Admin**: This role provides full read/write access to all carrier data. A **Carrier Admin** can also add new carrier members and modify their roles.
* **Manager**: A **Manager** has full read/write access to all carrier data, similar to the **Carrier Admin**, but without the ability to manage carrier members.
* **UW/Ops Team Member**: Full read/write access to all company data, except write access to forms and templates.
* **Policy Administrator**: Full access to create and edit submissions, quotes, policies, insureds, and forms; no access to claims or incidents.
* **Event Manager**: The **Event Manager** role grants complete read/write access to carrier events (claims and incidents) but only read and export access to submissions and applications. It is focused on managing events within the platform.
* **MGA (Managing General Agent)**: An **MGA** has full read/write access to carrier incidents and claims, with read-only access to brokers, brokerages, and form templates.
* **Claims Manager**: Full read/write/export access for claims and incidents, with read-only access to policies and insureds.
* **Accounts Payable**: Full read and export access on all carrier data. Write access limited to Financials transactions only.
* **Captive Manager**: Full read and export access on all carrier data. Write access to company‑level files only.
* **Viewer/Exporter**: This role is similar to the **Viewer** role but with added export access. A **Viewer/Exporter** can view and export all carrier data.
* **Viewer/Exporter - Insured Forms**: Full read and export access on all carrier data and access to insured forms.
* **Viewer**: A **Viewer** has full read access to all carrier data but no permissions to modify or interact with the data beyond viewing.
* **Broker**: A third party selected by the carrier to help applicants with their applications. A **Broker** can only work with applications and submissions.
* **Client Member**: Full read and download access to company files.
* **Configuration Manager**: Can export and import company configuration via the onboarding spreadsheet; no access to company data.
For a detailed breakdown of what each role can access, see the [Roles Reference](/platform/companies/user-roles-and-permissions/roles-reference).
For tailored role configurations, please contact our Support team at [support@aiinsurance.io](mailto:support@aiinsurance.io).
## View Users and Permissions
To see your company's current users and their permissions, navigate to the **Users** page by clicking your company’s tab in the sidebar to open the company-level settings and then selecting the **Users** tab.
On the **Users** page, you will see all the AI Insurance users in your company and their different access levels.
## Add a User
To add a user:
1. Click the **Add New User** button at the top-right of the page. This action will open the **Add New User** modal.
2. Select the appropriate role for the user, enter their name and email, and click **Add User** to save the new user.
## Edit a User role
To modify a user's role:
1. On the **Users** page, locate the user whose role you want to edit.
2. Click the dropdown in the **Role** column next to the user’s name.
3. Select the new role for the user.
## Delete a User
To delete a user and revoke their permissions:
1. On the **Users** page, find the user you wish to remove.
2. Click the trash icon in the **Remove** column of their row.
3. Confirm the deletion by clicking **Remove User** to remove the user and their associated permissions.
## Privilege
Roles can optionally contain privileges. Certain objects with the platform, such as [Notes](/platform/components/notes/notes), can be marked as **Privileged**, making them only viewable by users whose roles contain privileges. By default, the following Roles can have privileges:
* Carrier Admin
* Manager
* UW/Ops Team Member
* Event Manager
* MGA
However, [contact support](mailto:support@aiinsurance.io) if you would like to configure Privileges for other roles.
## Custom Roles
AI Insurance offers the option to create custom roles tailored to your needs. Contact [support](mailto:support@aiinsurance.io) to design roles that control access to specific features and data based on your company's unique requirements.
# Activity Feed
Source: https://docs.aiinsurance.io/platform/components/activity-feed/activity-feed
The Activity Feed is an immutable timeline that records and displays a history of actions, events, and user changes within the AI Insurance platform. It’s a valuable tool for promoting transparency and accountability, providing a real-time overview of user interactions, system events, and changes to notes or other relevant data. Users can rely on the Activity Feed to stay updated on the progression of activities and changes within the system.
The Activity Feed is available for the **Events**, **Insureds**, and **Policies** entities. This documentation will provide further details:
## Invoice Due Date Tracking
The Activity Feed now automatically tracks changes to invoice due dates, providing better transparency and accountability across your organization.
### How It Works
When invoice due dates are updated, the system automatically creates activity log entries that appear on the related parent entity (Policy, Event, etc.).
* **Automatic Logging**: Any changes to invoice due dates are automatically recorded
* **Parent Entity Visibility**: Due date updates appear in the activity feed of the related policy or event
* **Real-time Updates**: Changes are immediately reflected in the activity feed
* **Audit Trail**: Provides a complete history of due date modifications
### What Gets Tracked
* **Due Date Changes**: When an invoice due date is modified
* **User Information**: Who made the change and when
* **Previous Values**: What the due date was changed from and to
* **Related Context**: Which policy or event the invoice belongs to
This enhancement ensures that all stakeholders can see when invoice due dates are updated, providing better transparency and accountability across your organization.
## Insureds Activity Feed
Follow these steps to find the Activity Feed on Insureds:
1. Go to the **Insureds** page on the platform by clicking on the **Insureds** tab on the sidebar by the left.
2. Search through the list of Insureds.
3. Select the **Activity** tab to open the Activity Feed.
4. Next, you can filter through the Activity Feed or search to find specific actions, changes, or events that happen to the particular Insureds.
## Events Activity Feed
Follow these steps to find the Activity Feed on an Event, whether Claims or Incidents:
1. Go to the **Events** page on the platform by clicking on the **Events** tab on the sidebar on the left
2. Select what group of Events you would be looking through, whether **Claims** or **Incidents**.
3. Search through the list of Events (Claims or Incidents).
4. Select the **Activity** tab from their designated Event page to open the Activity Feed.
5. Next, you can filter through the Activity Feed or search for specific actions, changes, or events related to a particular Event.
## Policies Activity Feed
To find the Activity Feed on Insureds, which contains every action and user change that occurred on a single Insured, follow these steps:
1. Go to the Policies page on the platform by clicking on the **Policies** tab on the sidebar by the left
2. Search through the list of **Policies** either manually or using the search bar, and select the policy of your choice.
3. Select the **Activity** tab to open the Activity Feed on their designated Policy page.
4. Next, you can filter through the Activity Feed or search for specific actions, changes, or events related to the Policy.
# Assignees
Source: https://docs.aiinsurance.io/platform/components/assignees/assignees
## Overview
Submissions, policies, insureds, and events can have "assignees": users who have been assigned responsibility for that particular item.
Since the assignee information is generally not relevant to those outside the organization, the feature is not currently enabled in portal mode.
## Viewing Assignees
The assignees appear in the "Assigned To" field in the item. The location of this field varies by entity type.
* Policies: Toward the end of the "Policy Details" card, before the "Submission Description"
* Submissions: At the end of the "Submission Details" card
* Insureds: In the "Insured Information" card, after "Entity Type"
* Events: In the "Event" card, after "Coverage Type"
## Adding/Removing Assignees
1. Navigate to the item that needs to have assignees added/removed
2. Click **Actions** in the top right to open a list of possible actions
3. Click **Assign to User**
4. In the **Assign \ to User(s)** modal that pops up, modify, as needed, the list of assigned users (which appears as a series of chips below the *Search Users* dropdown)
* New assignees can be added by selecting them in the dropdown
* The current user can be assigned by clicking **Assign to myself**
* Assignees can be removed by clicking the **X** button on their chips
5. Click **Save** on the modal
## Filtering by Assignees
It is also possible to filter by assignees when searching for an item; this can be done by creating an "Assignee" filter through the **Add Filter** mechanism. The assignee filter works in the following way:
* It provides a checkbox list of all users, as well as the "Unassigned" keyword
* An item will match the filter if at least one of its assignees was selected in the filter
* An item will also match the filter if it has no assignees and the "Unassigned" keyword was selected in the filter
# Contacts
Source: https://docs.aiinsurance.io/platform/components/contacts/contacts
The **Contacts** section allows you to associate people—such as brokers, agents, or clients—with an entity like an Insured, Policy, or Claim. This improves clarity and ensures easy access to key contact details throughout your workflow.
## Accessing the Contacts Tab
1. To create a contact, navigate to an entity (Policy, Insured or Claim) in this example we'll add a contact to an **Insured**.
2. After that, from the navigation tabs near the top of the page, click **Contacts**.
This opens a table view showing all existing contacts. If none have been added yet, you'll see a message:\
“No contacts have been added yet.”
***
## Adding a New Contact
To add a contact to the current entity:
1. Click the **Add Contact** button on the right side of the Contacts table.
* This will open a dropdown with options to either:
* Add New Contact
* Link Existing Contact (if available)
2. Select **Add New Contact**.
3. Fill in the contact details in the form:
* Contact Name
* Title
* Email
* Phone Number
* Address
* Apartment or Suite Number
* Description (optional notes or context)
4. Click **Add Contact** to add the contact.
Once saved, the contact will appear in the Contacts table associated with the current entity.
***
## Adding an Existing Contact
If a contact already exists in your system (e.g. previously added to another policy, insured, or claim), you can quickly associate them with this entity using the **Existing Contact** option:
#### Steps to Add an Existing Contact
1. Navigate to the entity’s **Contacts** tab (e.g. for an insured, policy, or claim).
2. Click the **Add Contact** button in the top-right of the Contacts table.
3. From the dropdown, select **Existing Contact**.
4. In the **Add Existing Contacts** modal:
* Use the dropdown to search for an existing contact by name.
* Select the desired contact(s).
5. Click **Add Contacts** to associate the selected contact(s) with this entity.
The selected contacts will now appear in the Contacts table and be associated with this entity
# Files
Source: https://docs.aiinsurance.io/platform/components/files/files
The Files section in AI Insurance allows you to easily upload, store, retrieve, and view files associated with entities such as policies, insureds, and events.
## View Files
You can access files related to Events, Insureds, and Policies. Follow these steps to view files:
1. Select the specific Event, Insured, or Policy you want to view.
2. Click the **Files** tab to see the files associated with your selection.
3. To preview a file in your browser, simply click on it. You can preview PDFs, images, Word documents ( `.doc` and `.docx` ), and email files ( `.msg `and `.eml` ) that were dragged in from Outlook.
## Download Files
To download a file:
1. Select the file you wish to download.
2. Click the **Download** icon on the file, or click the **Download** button at the top of the Files section.
## Upload Files
You can upload files either by dragging and dropping them into the Files section, or by clicking the **Upload File** button.
## Create Folders
1. Create a folder:
* Click the **Create Folder** button.
* Enter the folder name and click **Create**.
2. Open the folder by clicking on it.
3. Clicking "Upload Files" or dragging and dropping files into the folder will upload the files to the folder.
## Categories
While you can create folders to organize your files, you can also categorize files by adding a category to a file. A category allows you to quickly search for all files with that category without needing to click into folders, so is much faster. Often users start by using folders and then switch to categories once they become power users.
**Customizing Categories**
You can customize the categories that appear on your Events, Submissions, Policies, and Insureds, and Companies by contacting [support@aiinsurance.io](mailto:support@aiinsurance.io)
## Edit Files
You can edit file details using either of these methods:
* **Using the Edit Icon:** Edit
* Select the file.
* Click the **Edit** icon.
* Modify the file details in the **Edit File Details** modal.
* Click **Save** to apply changes.
* **Using the More Button:**
* Select the file.
* Click the **More** button at the top of the Files section.
* Choose the specific edits you wish to make.
## Delete Files
To delete a file or folder:
1. Select the file or folder you wish to delete.
2. Click the **Delete** icon on the selected item.
This docs is constantly improving, if you find anything you would like to correct, please email us at [support@aiinsurance.io](mailto:support@aiinsurance.io)
# Notes
Source: https://docs.aiinsurance.io/platform/components/notes/notes
You can take notes throughout AI Insurance. These notes are text records linked to specific entities and are available as sub-tabs under Policies, Insureds, and Events. Notes support plain text without formatting, and there is no limit to their length.
When you create a note, it is automatically tagged with the date, time, and author. If needed, you can edit the content of your note at any time.
## View Notes
Notes are available for entities such as Events, Insureds, and Policies. To view notes taken on each of these entities, do the following.
### **View Event Notes**
Follow these steps to view notes taken for an event:
1. Select the **Events** section on the screen's left sidebar.
2. On the **Events** page, select the event, whether a claim or an incident, for which you want to view notes.
3. Select any specific events you would like to see its notes.
4. Select the **Notes** tab to see the notes on that event.
### **View Insured Notes**
Follow these steps to view notes taken on an Insured:
1. Select the **Insureds** section on the screen's left sidebar.
2. Select any one of your specific insureds.
3. Click the **Notes** tab to see the notes taken on that Insured.
### **View the Policies’ Notes**
To view notes taken on a policy, take the following steps:
1. Select the **Policies** section on the screen's left sidebar.
2. Select the policy you would like to see notes on.
3. Click the **Notes** tab to see the notes.
## Create a Note
Take the following steps to create a note:
1. Navigate to the entity where you want to create the note, such as a policy, insured, or event, and click on the **Notes** tab.
2. Type your note into the provided text field in the **Notes** section of the selected entity.
3. After entering your note, you can set its visibility to either **Visible to everyone** or **Privileged**. **Privileged** notes are only accessible to users with the appropriate permissions, such as Carrier Admins and Event Managers. Refer to the [User Roles and Permissions documentation](/platform/companies/user-roles-and-permissions) for more details on privileges.
If you change a privileged note to be **Visible to everyone**, its contents will be visible on the activity log forever.
4. Click the **Create Note** button to complete your note.
5. Once created, your notes will appear in the **Notes** section, arranged from most recent to oldest.
## Edit a Note
Editing notes are ideal for updating information that changes frequently, such as statuses or numeric values, while avoiding duplicate note entries.
Any changes made to a note will be tracked in the activity log. This log tracks the user who created the changes, the time the changes were made, and the before-and-after values of the edited note.
### **How to edit a Note**
Edit a Note with the following steps:
1. Click on **Policies**, **Events**, or **Insureds** in the left sidebar to navigate to the entity that contains the note you want to edit.
2. Select the specific Policy, Insured, or Event and navigate to the **Notes** tab on this entity.
3. Locate the note you want to edit, and click the button on the note.
4. Make your changes to the note and click on the **Save** button to save the new changes to the note.
# Overview
Source: https://docs.aiinsurance.io/platform/components/overview
This section of the documentation covers user interface pages that appear in multiple areas of the platform. The aim is to reduce repetition by consolidating explanations of components that are identical, even though they may be located in different parts of the platform. The following components are included:
* **Notes**: Notes are present in every entity on the AI Insurance platform, such as Events, Insureds, and Policies. They serve as text records where you can add contextual information to an entity. Refer to the [Notes documentation](/platform/components/notes) for more details.
* **Files**: Files are available in every entity on the platform, including Insureds, Policies, and Events. These files are associated with a specific entity and allow you to view them without the risk of deletion. Refer to the [Files documentation](/platform/components/files) for more details.
* **Activity Feed**: The Activity Feed is present in all entity types on the AI Insurance platform. It records all activities, making it easier to trace actions and simplifying the auditing process. Refer to the [Activity Feed documentation](/platform/components/activity-feed) for more details.
* **Underwriting Workbench**: The Underwriting Workbench allows you to review and manage premium changes for insureds during endorsements and policy modifications. It provides detailed breakdowns showing how changes affect each insured. Refer to the [Underwriting Workbench documentation](/platform/components/underwriting-workbench) for more details.
* **Assignees**: Assignees allow you to assign one or more users from your organization to submissions, policies, insureds, and events. This helps teams track ownership and responsibility for items across the platform. Refer to the [Assignees documentation](/platform/components/assignees/assignees) for more details.
# Smart Tags
Source: https://docs.aiinsurance.io/platform/components/smart-tags/smart-tags
Smart Tags are variables that can be inserted into your forms. They pull data from an object such as a Policy, Insured, or claim and insert it into your generated form. Refer to its official documentation to learn more about [Forms](/platform/companies/creating-and-validating-forms/creating-and-validating-forms).
Variables inserted into a form by Smart Tags will adopt its document formatting (font, size, bold, italic, or underline).
There are three kinds of smart tags: Text Tags, Table Tags, and Action Tags.
## Text Tags
Text tags insert text information into your forms, and they include the following:
* **Company Legal Name**: This tag inserts your company's legal name, as defined during your instance setup via the onboarding form your team completed. To update this information, contact your AI Insurance Account Manager.
* **Current Date**: This tag inserts the date when the form is generated, meaning the date is set when the form is selected—not at the final "confirm" step of your flow. The date follows the `DD/MM/YYYY` format.
The Current Date is based on the policy's timezone, which is set in the first step of creating the policy. It may not match your local timezone.
* **Current Year**: Inserts the year when the form is generated. The year is populated when the form is selected, not when it is sent or confirmed.
* **Effective Date**: Inserts the date the user selects in the **Effective Date** field within the platform for a given flow. If no date is selected, the current date is used. The format is `DD/MM/YYYY`.
* **Policy End Date**: Inserts the date the user selects in the **Policy End Date** field within the platform for policy flows. The format is `DD/MM/YYYY`.
* **Policy Number**: Inserts the policy number. If auto-generated by AI Insurance, it uses the system-generated ID. If manual entry is enabled, it uses the value entered by the user in the **Policy Number** field.
* **Policy Premium**: Inserts the total premium amount of the policy, excluding taxes and fees. The value is formatted as currency, with a "\$" symbol, comma separators, and two decimal places.
* **Policy Start Date**: Inserts the date the user selects in the "Policy Start Date" field within AI Insurance for policy flows. The format is `DD/MM/YYYY`.
* **Policy Type**: Inserts the type of policy selected by the user in AI Insurance. Possible values include **Claims Made**, **Claims Made "Nose" (Prior Acts)**, **Occurrence**, **Claims Paid**, **Slot Coverage "Tail" (Reporting Endorsement)**, **Slot Coverage—Occurrence**, **Slot Coverage—Claims Made**, and **Claims Made "Tail" (Reporting Endorsement)**.
* **Primary Insured**: Inserts the name of the primary insured in AI Insurance. Each policy must have one designated primary insured.
* **Primary Insured Address**: Inserts the primary insured’s address in AI Insurance. The address is displayed on a single line, with commas separating its components.
* **Description of Operations**: Inserts the Description of Operations for the selected insured when generating a Certificate of Insurance.
* **Insured-Specific Limits**: Inserts a table displaying the selected insured’s policy limits, deductibles, and retroactive dates when generating a Certificate of Insurance. If no insured-specific values exist, the default coverage limits, deductibles, and retroactive dates are used. If a customer uses a smart tag that pulls a risk-specific retroactive date, this flowchart shows how AI Insurance will set and display that date:
* **Prior Policy Number**: Inserts the policy number of the policy being renewed. It returns nothing if the tag is used in documents outside the renewal process.
* **Timezone**: Inserts the policy’s timezone, which is displayed in the format **Country/City**.
## Table Tags
Table tags insert a table of information into your form. If there are no values, nothing will be inserted. Additionally, if an entire column has no values in any row, it will be omitted.
**Note**: You cannot insert one Table tag inside another.
Examples of table tags include:
* **Additional Insureds Schedule**: Inserts a table where the first row contains column headers, and each subsequent row lists an "Additional Insured" from AI Insurance. You can customize the table columns by adding any tracked field related to the insured or policy-insured relationship, such as an address, Tax ID, or rating response.
* **Billing Changes**: Inserts a table whose first row contains column headers, followed by line items from the current policy bill, with the final row showing the total cost. The table includes the following columns: Item Name, Old Value, Change in Value, and New Value. This tag is typically used in endorsement documents.
* **Billing Details**: Inserts a table whose first row contains column headers, followed by line items from the current policy bill, with the final row showing the total cost. The table includes the following columns: Item Name, Amount, and Item Type. This tag is typically used in initial policy documents. Item Types are pulled from the bill and can be "Premium," "Taxes," or "Fee."
* **Claim Details**: This tag inserts a table listing every claim associated with an insured. It is available in Insureds forms, such as the [Loss Run Report form](https://docs.aiinsurance.io/insureds/generating-insured-reports#generate-insured-forms). The table includes default columns that display claim information, and these columns can be customized by the customer to match their specific reporting needs. This tag is typically used in insured-specific reports and loss run documents.
*Billing Details Smart Tag*


* **\[Entity Type] Schedule**: Every insured entity type in your instance will have a schedule tag. (This is automatic: if a new entity type is added, a schedule tag will be created for it.) These tags are available for policy-category forms. An \[Entity Type] Schedule tag takes all insureds that are related to the policy in AI Insurance and finds the ones that are of \[Entity Type]. It creates a table where the first row contains column headers, and the subsequent rows list out the matching insureds. Like other schedule tags, you can fully customize which columns are included. The example below shows the **Company Schedule** tag.
*\[Entity Type] Schedule Smart Tag*


You can customize the columns in this table by working with your AI Insurance Account Manager. By default, the columns include Name, Coverage, and Coverage Details. This tag is typically used in initial policy documents.
* **Insureds Schedule**: This tag combines the **Additional Insureds Schedule** and **Named Insureds Schedule** tags. It generates a table where the first row contains column headers, and each subsequent row represents an entity related to the policy in AI Insurance.
You can customize the table's columns to include any field tracked in the insured or policy-insured relationship, such as Address, Tax ID, Rating Response, etc. By default, the columns include Name, Coverage, and Coverage Details. This tag is typically used in initial policy documents.
*Insured Schedule Smart Tag*


* **Named Insureds Schedule**: This tag inserts a table whose first row contains column headers. Each subsequent row lists a designated Named Insured in your platform.
You can customize the table's columns to include any field tracked in the insured or policy-insured relationship, such as Address, Tax ID, Rating Response, and more. By default, the columns include Name, Coverage, and Coverage Details. This tag is typically used in initial policy documents.
*Named Insureds Schedule Smart Tag*


* **Policy Changes**: This tag inserts a table summarizing five types of changes made to a policy:
* Insured(s) Added
* Insured(s) Terminated
* Insured(s) Updated
* Coverage Change(s)
* Policy Information Updated
A header will appear only if that specific type of change occurred. For example, if no insureds were added during an endorsement with this tag, the **Insured(s) Added** header will not appear. This tag is typically used for policy endorsements.
In the above example, the only change made to the policy was the addition of a new insured, Alannah Simon.
* **Policy Coverage Details**: This tag inserts a table displaying a breakdown of policy-level coverages and limits based on the "Edit Coverages" step in AI Insurance.
* The first row serves as the header, containing columns such as Coverage, Limits, and other policy-level details (e.g., Deductible, Retroactive Date, or Retention).
* As with other Table Tags, columns are included only if they contain a value for at least one row.
* Each subsequent row represents a specific line of coverage under the policy.
*Policy Coverage Details Smart tag*


**NOTE:** In the above example, the General Liability line of coverage has no listed Retroactive Date, and the Medical Professional Liability line has no deductible. The "Deductible" column would not appear if neither line had a deductible.
* **Policy Forms**: This tag inserts a table listing all forms attached to the policy. Each row contains the form's name, and entries are separated by new lines.
* **Event Reserve Updates**: This tag inserts a table displaying reserve information for claims and incidents. It shows the current reserve amounts, expected totals, and paid amounts for both indemnity and ALAE (Allocated Loss Adjustment Expenses). This tag is only available for forms with the **Claim/Incident** category and can be used when editing forms within a claim or incident event.
The Event Reserve Updates tag will only appear when editing a form with the Claim/Incident Category. These forms can be created in the Company's "Form" tab when viewing the company settings. Once created, they can be used within a claim/incident under the actions dropdown by selecting "Generate Claim Form" and choosing one of the templates. The tag can also be added when editing a generated form.
## Action Tags
The **Signature** tag designates a form for digital signing. It is sent to the recipient specified in the **Forms** step of the policy creation flow.
* In the quoting flow, the form is sent to the broker (if one exists); otherwise, it goes to the application submitter.
* Forms requiring a signature are sent in a separate email with a link to HelloSign.
* Once signed, the recipient’s signature and audit history are recorded.
## Custom Tags
If your forms need a smart tag that doesn’t currently exist, and the data is available in AI Insurance, we can likely create a custom smart tag for your instance. To request one, fill out the [Smart Tag Reqest form](https://share.hsforms.com/1hRZubTCWSKKrsFFTfb5GEQqsjs3). After submitting the form, you’ll receive a requirements document to complete. The cost is \$500 per tag, and implementation typically takes about 4 weeks.
# Underwriting Workbench
Source: https://docs.aiinsurance.io/platform/components/underwriting-workbench/underwriting-workbench
## Overview
The Underwriting Workbench is a tool that allows you to review and manage changes made to individual insureds during policy-related processes, when creating new submissions, and when creating new quotes. It provides detailed breakdowns of premium changes, helping you understand the impact of modifications before finalizing them.
## Accessing the Underwriting Workbench
The Underwriting Workbench is available in multiple workflows:
1. **Policy Processes**: When working with policies (endorsements, renewals, or other policy modifications)
2. **Submission Creation**: When creating a new submission
3. **Quote Creation**: When creating a new quote
4. Navigate through the workflow and **Expand the Underwriting Workbench** section to view it
5. The workbench will display detailed breakdowns of premium changes for each insured
xd
When collapsed, the Underwriting Workbench shows a snapshot of the details. Expand it to view all detailed breakdowns and premium information.
## Main Components
### 1. Loss History Tile
Displays **historical losses**, a **Loss Pick** calculation, and **projected premium** based on your goal loss ratio.
#### What It Shows
* **Average Annual Losses**: Developed and deductible-adjusted average across year windows (see calculation below)
* **Projected Premium (Goal Loss Ratio)**: Premium projection (e.g., at 50% Loss Ratio)
* **5-Year Loss History**: Graph of losses over time\\
#### Data Sources
The Loss Pick calculation draws from three inputs:
1. **Historical Losses**
* **Purpose**: Provides the historical loss input data used in the calculation
* **Location**: Submission's **Loss History Tab** — Navigate to the submission and open the Loss History Tab to input or update historical loss data
2. **Development Factors**
* **Purpose**: Adjusts each loss record upward to account for losses that may not yet be fully developed (IBNR — Incurred But Not Reported)
* **Location**: **Company Settings** → **Underwriting / Rating Configuration** — Set your development factors here
3. **Goal Loss Ratio**
* **Purpose**: Target ratio for loss vs. premium (e.g., 50% Loss Ratio) used to calculate the projected premium
* **Location**: **Company Settings** → **Underwriting / Rating Configuration** — Set your goal loss ratio here
#### How Average Annual Losses Is Calculated
The **Average Annual Losses** figure is computed per loss record in three steps:
**Step 1 — Filter by time window**
Depending on the toggle selection, only losses within the relevant window are included:
* **Last 5 Years**: includes records whose loss date (event date or policy effective date) falls within the five anniversary-year windows before the quote start date.
* **All**: includes all records prior to the quote start date.
Year windows are anniversary-based from the quote start date, not calendar years. For example, with a June 16, 2025 start date:
* Year 1: June 16, 2024 – June 15, 2025
* Year 2: June 16, 2023 – June 15, 2024
* Year 3: June 16, 2022 – June 15, 2023
* (and so on)
**Step 2 — Compute an adjusted loss for each record**
For each loss record within the window:
1. Assign it to a year (1–5+) based on which anniversary window its loss date falls into.
2. Apply the corresponding **development factor** to project the ultimate loss:
```
Ultimate Loss = Total Incurred × Development Factor
```
3. Subtract the **per-claim deductible** (multiplied by the number of claims on the record) to get the adjusted loss:
```
Total Deductible = Deductible × Number of Claims
Adjusted Loss = max(0, Ultimate Loss − Total Deductible)
```
If no deductible is configured for the coverage type, this step has no effect. If `Number of Claims` is not recorded on the loss, it defaults to 1.
For losses in year 5 or older, the year-5 development factor is applied.
**Step 3 — Average the adjusted losses**
```
Average Annual Losses = Sum of Adjusted Losses / Count of Year Windows
```
This is a **mean across year windows**, not across individual loss records. Each anniversary-year window in the selected time range contributes equally to the average, regardless of how many claims occurred in that year. Years with no losses count as zero and are included in the denominator.
**Loss Pick**
The **Projected Premium** shown alongside the average is derived directly from it:
```
Projected Premium = Average Annual Losses / Goal Loss Ratio
```
### 2. Rating Stats
Displays real-time underwriting statistics.
To customize which stats appear here, contact support at **[support@aiinsurance.io](mailto:support@aiinsurance.io)**.
### 3. Premium by Line of Coverage
Breaks down premiums by coverage type.
| **Line of Coverage** | **Premium** |
| ------------------------------------ | ----------- |
| General Liability | \$2,389.32 |
| Commercial Property | \$2,389.32 |
| | |
### 4. Premium by Exposure
Shows premium allocation across **individual insureds** or **exposures**.
#### Features:
* **Search & Filter** – Locate specific insureds
* **Columns** –
* *Name* – Insured or exposure
* *Premium* – Premium amount
* *Change* – Difference since last update
#### Expanding Rows
When you expand a row for a specific exposure, you can view:
* **Current Premium** – The premium amount for that exposure
* **Rating Status** – Shows if the exposure is rated or not (e.g., "Not Rated (Insured type not rated)")
* **Historical Premium** – The previous premium amount for comparison
#### Custom Adjustments
You can add custom adjustments to individual exposures:
1. **Expand the exposure row** you want to adjust
2. **Add Adjustment**:
* Enter an **Adjustment Description** to document why the adjustment is being made
* Enter the **Adjustment Amount**
* Toggle between **"%"** (percentage) or **"\$"** (dollar amount) for the adjustment calculation
3. **Save the adjustment** – The adjustment will be applied to that exposure's premium
4. **Delete adjustments** – Use the trash icon to remove any custom adjustments you've added
Custom adjustments allow you to make manual premium modifications for specific exposures outside of the standard rating calculations.
#### Managing Insured Ratings
When working with exposures in the Premium by Exposure section, you have options to:
* **Exclude insureds from re-rating** using the "Do Not Rate" option
* **Revert rating changes** for specific insureds back to their previous rating
> For detailed step-by-step instructions on how to exclude insureds from re-rating and revert rating changes, see [Managing Insured Ratings During Endorsements](/policing/policy-management/endorsing-policy/removing-insureds-from-rerating).
### 5. Premium and Fees
#### 5.1 Total Premium and Summary
Provides an overview of total premium and policy-level fees.
**Includes:**
* **Total Premium** – Displays the total calculated premium for the policy.
* **Policy-Level Rating Factors** – Click **Show Policy-level Rating Factors** to view rating variables applied at the policy level.
* **Other Fees** – Lists non-premium charges applied to the policy such as:
* Example Fee 1
* Example Fee 2
* Example Fee
* Capital Contribution
* **Total Amount** – The combined total of premium and all fees.
Example:
* Total Premium: \$4,778.63
* Example Fee 1: \$900
* Example Fee 2: \$955.73
* Example Fee: \$75
* Capital Contribution: \$238.93
* **Total Amount: \$6,948.29**
#### 5.2 Managing Fees
Allows users to view, add, and edit fees associated with the policy.
**Features:**
* **View Existing Fees** – Displays a list of applied fees.
* **Add Fee** – Click **+ Add Fee** to open a form where you can specify the fee name and amount.
* **Edit or Remove Fees** – Modify or delete existing fee entries.
Example:
* Example Fee 1 — \$900
* Example Fee 2 — \$955.73
* Example Fee — \$75
* Capital Contribution — \$238.93
* \[+ Add Fee] button at the bottom.
#### 5.3 Taxes
Displays all applied taxes, which are shown separately from premiums and fees.
**Includes:**
* **Existing Taxes** – Each tax entry shows name and amount.
* **Add Tax** – Click **+ Add Tax** to input a new tax description and amount.
* **Save / Cancel** – Use buttons to confirm or discard changes.
Example:
* Example Tax 1 — \$167
* Example Tax 4 — \$48
* Example Tax — \$96
* Input fields for "Tax Description" and "Amount," with **Save** and **Cancel** buttons.
# Calendar and Tasks
Source: https://docs.aiinsurance.io/platform/dashboard/calendar-and-tasks
The Dashboard page is split into two sections: **Tasks** and **Company Overview**.
Tasks are a great way to set reminders and log activities that need to be completed by a specific date or time.
## Create a task
To create a new task:
1. **Log in** to the AI Insurance dashboard and navigate to the **Dashboard** tab.
2. In the Dashboard, you'll find the **Calendar and Tasks** section.
3. Click on the **New Task** button to open the task creation modal.
4. Fill out the following details for your task:
* **Task Name:** The title of the task.
* **Description:** (Optional) Any additional details about the task.
* **Task Date:** The date when you want to be alerted about the task, ideally before it’s due.
* **Task Time:** The time when you'd like to receive the alert.
* **Assignee:** The person responsible for this task.
5. Click **Create** to save the task.
Once the date and time you’ve set for the task arrives, you’ll receive an alert reminding you about the task.
## View tasks
To view all the tasks you’ve created:
1. In the **Calendar and Tasks** section, click on the **View All Tasks** button. This action will take you to a page where you can see all your tasks.
2. There are two task view options:
* **Calendar view**: Displays tasks based on the selected date on the calendar. Click this button to switch to the calendar view.
* **List view**: Displays all tasks in a simple list format. Click this button to switch to the list view.
3. You can click on a specific task to:
* **Mark as Complete**
* **Edit** the task
* **Delete** the task
You can also **search** for tasks and use filters to narrow down the list. To apply filters, click on **Add Filters**, then choose the criteria you’d like to use.
# Company Overview
Source: https://docs.aiinsurance.io/platform/dashboard/company-overview
The **Company Overview** section provides a comprehensive dashboard that displays your organization's key performance metrics and trends. This section helps you track your business performance across different time periods and visualize important data through interactive graphs and summary statistics.
## Time Range Selection
The Company Overview dashboard includes a time range selector that allows you to view your organization's performance across different periods. When you click on different time ranges, the dashboard will automatically update to show:
* **Graph data** for the selected time period
* **Summary statistics** relevant to that timeframe
* **Trend analysis** based on the chosen range
This dynamic functionality enables you to analyze your organization's performance over various periods, from daily views to annual summaries.
## Dashboard Graphs
The Company Overview section includes 8 interactive graphs that visualize your organization's performance:
| Graph | Type | Purpose | Key Metrics |
| --------------------------- | ---------------- | ------------------------------------ | ------------------------------------- |
| **Written Premium** | Area Chart | Track premium growth trends | Written vs Earned premium over time |
| **Incurred Loss Ratio** | Line Chart | Monitor claims performance | Loss ratio percentage (0-100%) |
| **Net Loss Ratio** | Line Chart | Assess risk management effectiveness | Net loss ratio after reinsurance |
| **Loss Development** | Multi-line Chart | Predict ultimate loss amounts | Loss development by cohorts over time |
| **Active Primary Insureds** | Line Chart | Track client growth patterns | Number of active insureds over time |
| **Average Policy Cost** | Line Chart | Monitor pricing trends | Average policy cost over time |
| **Open Accounts** | Bar Chart | Overview of quote pipeline | Quote distribution by status |
| **New Business vs Renewal** | Bar Chart | Compare business performance | New vs renewal quote breakdown |
### Interactive Features
* **Time Range Selection**: All graphs update based on selected time period
* **Hover Tooltips**: Hover over data points for specific values
* **Current Values**: Real-time metrics displayed on each graph
* **Responsive Design**: Graphs adapt to different screen sizes
## Key Metrics Summary
The Company Overview section also provides a snapshot of important business metrics that update based on your selected time range:
* **Open Claims**: The number of active claims your organization is currently handling
* **Claim Closure Rate**: The average rate at which claims are being resolved
* **Cost Difference**: The percentage difference between insured's incurred costs and your company's payouts
* **Average Claim Cost**: The average cost of claims during the selected period
## Interactive Map
The Company Overview dashboard includes an **Interactive Map** feature that provides a geographical visualization of your organization's data. This feature displays all claims, policies, and insureds on an interactive map, giving you a spatial view of your business operations.
### Map Display
The Interactive Map displays three types of entities using color-coded markers:
* **Claims (Red)**: Red pins mark the locations of all claims. Click on a claim marker to view details about that specific claim.
* **Policies (Green)**: Green pins indicate policy locations. These show where your policies are geographically distributed.
* **All Covered Risks / Insureds (Blue)**: Blue pins represent insured locations, showing where all covered risks and insured entities are located.
### Map Features
* **Zoom Controls**: Use the zoom in (+) and zoom out (-) buttons to adjust the map view
* **Map Legend**: Toggle visibility of different entity types using the checkboxes in the map legend
* **Interactive Markers**: Click on any marker to view detailed information about that entity
* **Geographic Coverage**: The map displays data across all states and regions where your organization operates
### Statistics Panels
The Interactive Map includes two statistics panels that provide additional context:
* **State-Level Statistics**: Shows a breakdown by state including:
* Number of policies per state
* Total indemnity amounts
* Additional financial metrics
* **Visible Area Statistics**: Displays aggregated metrics for the currently visible map area:
* Loss Ratio percentage
* Total Incurred amounts
* Earned Premium
* Total number of Claims and Policies
**Notes:**
* Entities without location data are automatically excluded from the map
* For policies without a policy address, the primary insured's address is used as a fallback
* The API requires `company:read` permission to access map data
# Key Components
Source: https://docs.aiinsurance.io/platform/platform-overview/key-components
The AI Insurance Platform is your all-in-one solution for managing insurance needs. Everything you do with AI Insurance happens seamlessly within the platform. Once you're onboarded, you can create tasks, policies, events, insured records, and more—all in one place.
## Prerequisites
Before you can access the platform, you need to be onboarded by the AI Insurance team. If you haven’t been onboarded yet, please contact the team at [**support@aiinsurance.io**](mailto:support@aiinsurance.io).
## Accessing the Platform
To log in to the AI Insurance platform, visit the [AI Insurance official website](https://app.aiinsurance.io/) and click **Log in**.
## Key Components of the AI Insurance Platform
The platform features an intuitive design centered around a **persistent sidebar** that remains visible regardless of which page you're on. Here's an overview of the sidebar tabs:
* **Global Search**: This feature allows you to search across the entire platform, making it easy to locate specific information or features quickly.
* **Dashboard**: The [Dashboard](/platform/dashboard/calendar-and-tasks) allows you to create tasks and also provides a snapshot of your activities, with a graph of your company’s premium trends over time.
* **Events**: The Events tab is divided into two sections: **Claims** and **Incidents**. While they serve different purposes, they share the same platform structure.
* **Insureds**: This section contains all information about insured parties, including their current and past policies. In this section, you can:
* Search through the list of insureds
* Export data
* Add or delete insured records
* **Policies**: The Policies tab provides details on all policies in the system, categorized by status such as: Active, Inactive, Pending Signature, Pending Payment, Pending Renewal, and Endorsements in progress.
You can filter, search, create, delete, or export policy information here. For more insights, check out the [Policies documentation](/policing/policy-management/policy-issuance).
* **Submission**: The Submissions tab opens a dedicated page where you can manage all submissions on the platform, categorized by their statuses: In Progress, Submitted, Quote In Progress, Quote Complete, and Quote Accepted.
On this page, you can:
* Search for specific submissions or filter them by status.
* Create new submissions as a **carrier**, **insured**, or **broker**.
* Export submission data.
* Delete submissions as needed.
For more details, refer to the official [Submissions documentation](/submissions-and-quotes/overview).
* **Financials**: The Financials section tracks all transactions processed through the platform, and you can also document external transactions. This feature simplifies auditing, with options to export financial records. For details, refer to the [Financials documentation](/financials/invoicing).
* **Company**: The Company section contains all relevant information about your company, including:
* Current users and their permissions
* Company account details
* Payment history and recipients
* Uploaded files
* Brokerages and associated brokers
* Custom account configuration and accounting settings
For more details, refer to the official [Companies documentation](/platform/companies/multi-companies) and [Accounting documentation](/platform/companies/accounting/overview).
# Export Customization and Configuration
Source: https://docs.aiinsurance.io/platform/reporting-and-reports/export-customization-and-configuration
The best thing about exporting data from the AI Insurance platform is that you can filter through large amounts of data to get only the data you want. You can configure Export customization and configuration for objects such as Policies, Insureds, or Events, and these export pages are split into four sections which are:
## Export Settings
In this section, you can choose the amount of data you want to export. The platform offers three Export options:
* **Selected**: Export only the specific items you have manually selected.
* **Filtered Search**: Export items that match the results of a filtered search. For example, if you applied filters to your list of objects—such as Events, Policies, or Insureds—you can export only the filtered results.
* **All**: Export all data associated with a particular object.
## Export Fields
In this section, you can select an existing preset in the **Select Preset** dropdown for this current Export or create a new preset.
### **Creating Export Presets**
A preset is a predefined configuration or set of options designed to save time by providing a ready-made starting point.
Report presets are user-specific, not company-wide. When you save a preset, it is only available to you and cannot be shared with other users in your company.
If you frequently use a specific Export configuration, you can create a preset from it. This lets you quickly select the preset during future exports, streamlining the process.
Do the following to create a preset:
1. Configure the Export to your liking, adding, removing, or reordering fields as needed.
2. Click the **Save as Preset** button to open the **Save Preset** modal.
3. Enter a name for your preset and select the **Create new preset \[Preset Name]** button.
4. Select **Save**, and your preset will be created.
### **Updating an Existing Preset**
Take the following steps to update an existing preset:
1. Configure your Export settings by adding and reordering your desired fields.
2. Select the **Save as Preset** button to open the **Save Preset** modal.
3. Enter the name of the preset you want to update
4. Click the **Save** button to update your preset.
### **Removing an Existing Preset**
Follow these steps to remove an existing preset:
1. Click the **Select Preset** dropdown in the **Export Fields** section.
2. Next to each preset's name, there is a trash can icon. Select the icon to receive a **Delete Preset** confirmation modal.
3. Select **Delete** to confirm the deletion of the preset.
## Reorder Fields for Export
In this section, you will determine the column order for the policy fields you want to export.
Before reordering the fields for Export, you must add the fields you want your exported data to contain in your **Add Fields to Export** section.
The **Reorder Fields for Export** section, shows how your data would be arranged in columns when exported. The exported data columns are ordered from left to right and top to bottom.
To change the order in which the columns appear, select and drag the fields pill to the position you want.
## Add Fields for Export
In this section, you will determine the fields you want your exported policy data to contain. To add a field to your export data, manually search through the list of fields or by using the search bar and clicking on the field. This field will then be added to the **Reorder fields for Export** section above.
# Export Data
Source: https://docs.aiinsurance.io/platform/reporting-and-reports/exporting-data
AI Insurance believes you should always own and have control of your data. That is why, with the Exporting Data feature, you can generate and export various reports on our platform, with options to customize the fields you wish to export. You can export data related to your [Events](/events/view-events), [Insureds](https://aiinsurance-1ef97d09.mintlify.app/insureds/viewing-insureds), [Policies](/policing/policy-management/viewing-a-policy), [Submissions](/submissions-and-quotes/viewing-submissions/viewing-submissions), or [Financials](/financials/billings).
**Formatting**
All data exported out of AI Insurance are exported as **XLSX** files.
Report presets are user-specific, not company-wide. When you save a preset, it is only available to you and cannot be shared with other users in your company.
## How to export Policy data
To export Policy data, follow the detailed instructions in our [Export Policy](/policing/policy-management/exporting-policies/export-policy) documentation.
For exporting policy bordereaux (comprehensive reports), see our [Export Policy Bordereau](/policing/policy-management/exporting-policies/export-policy-bordereau) documentation.
## How to export Submissions data
Any filters applied on the Submissions page will carry over to the export. Make sure to apply your desired filters before exporting.
1. Navigate to the **Submissions** page from the left navigation pane.
2. Select the fields you want to include and configure any filters or sorting.
3. Click the **Export** button to open the export configuration page.
4. Customize your export settings and fields as needed. See the [Export Customization and Configuration documentation](/platform/reporting-and-reports/export-customization-and-configuration) for more details.
5. Click **Export Submissions** to create the export job.
6. Go to the **Downloads** page (click your company name, then **Export Downloads** tab) to download your file when the status shows **"Completed"**.
**Background Processing**: You can navigate away from the Export page or close your browser—the export will continue processing in the background.
For more information about exporting submissions, see the [Export Submissions documentation](/submissions-and-quotes/exporting-submissions).
## How to export Insured data
Take the following steps to export Insured data:
Any filters applied on the Insureds page will carry over to the export. Make sure to apply your desired filters before exporting.
1. Navigate to the **Insureds** page from the left navigation pane.
2. Select the fields you want to include in your export and configure any filters or sorting.
This page allows you to customize further the information you want your exported data to carry. This page has four sections: **Export Settings**, **Export Fields**, **Reorder Fields for Export**, and **Add Fields for Export**. Check out the [Export Customization and Configuration documentation to learn more about these sections](http://platform/reporting-and-reports/export-customization-and%20configuration.mdx).
3. When you finish your export selection, click **Export Insureds** to continue.
4. You'll see a success message: **"Export job created! Go to the Downloads page to download when ready"** with a link to the Downloads page.
5. Click the link in the success message or head over to the **Downloads** page by clicking the company, and then the **Export Downloads** tab.
6. On the Downloads page, you'll see a table called **"Export Downloads"** showing all your export jobs with:
* **Status** (Processing, Completed, or Failed)
* **File name**
* **Export type** (events, insureds, policies, or submissions)
* **Requested date/time**
* **Download button** (when completed)
7. When the export status shows **"completed"**, click the download button to get your Excel file.
**Background Processing**: You can navigate away from the Export page or close your browser—the export will continue processing in the background.
## How to export Events data
Take the following steps to export Event data:
Any filters applied on the Events page will carry over to the export. Make sure to apply your desired filters before exporting.
1. Navigate to the **Events** page from the left navigation pane.
2. Choose the events you'd like to export: either claims or incidents.
3. Click the **Export Events** button to export data on the events.
4. The **Export Events** page allows you to select and reorder the fields you wish to export. Configure your export before selecting **Export Events** to continue.
Like the previous section, the **Export Events** page has four sections: **Export Settings**, **Export Fields**, **Reorder Fields for Export**, and **Add Fields for Export**. Check out the [Export Customization and Configuration documentation](http://platform/reporting-and-reports/export-customization-and%20configuration.mdx) to learn more about these sections.
5. You can export a subset of your events' financial data in the **Export Settings** section. Entering a date into the **Export Financials as of** field will export the financial values of your selected events at the selected date.
For example, if you only wish to include the invoices and transactions on and before "12/20/2023" and omit the transactions after, enter an “as of” date of “12/20/2023”.
6. After selecting your export options, click the **Export Events** button to proceed.
Once the export is complete, the file will be downloaded to your machine based on your browser's download settings.
## **Exporting Financials Data**
Financial data can be exported in two ways: as transaction records directly from the Financials page, or as financial summary fields included in Event and Policy exports.
### Financial Fields in Event and Policy Exports
When exporting Events or Policies, each active financial category (e.g., ALAE, Indemnity, Deductible) contributes the following summary fields per category:
| Field | Description |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------- |
| **\{Category} - Reserves** | The estimated reserve amount for open claims. Only present for categories that support reserves. |
| **\{Category} - Owed** | Total invoice amount issued but not yet paid. |
| **\{Category} - Paid** | Total amount that has been paid. |
| **\{Category} - Expected Incurred** | The total expected cost — paid + reserves for categories that support reserves, paid + owed otherwise |
For categories with sub-categories (line item breakdowns), an additional field is available per sub-category:
* **\{Sub-category} - Total**: The total amount (paid + owed) for that sub-category.
For categories that support reserves, three fields track the most recent user-set reserve estimate:
* **\{Category} - Last User Expected Incurred**: The dollar amount of the most recent manual reserve estimate.
* **\{Category} - Last User Expected Incurred Date**: The date the estimate was recorded.
* **\{Category} - Last User Expected Incurred User**: The user who recorded the estimate.
By default, financial summary fields reflect all transactions as of the export date. When exporting Events, you can enter an **Export Financials as of** date in Export Settings to limit financial values to transactions on or before a specific date. Deleted and voided payments are always excluded.
### Exporting data from Global Financials
Take the following steps to export Global Financials data:
1. Navigate to the **Financials** page from the left tab.
2. Apply any filters or select specific entries you would like to export.
3. Select **Export** at the top right of the table.
4. Choose your **export scope** (selected items, filter results, or all) and your **export format** (see [Transaction Export Formats](#transaction-export-formats) below), then confirm.
### Exporting from within an Event or Policy
Follow these steps to export financial data from within an Event or Policy:
1. Navigate to a specific [Event](/events/view-events/view-events) or [Policy](/policing/policy-management/viewing-a-policy), and select the **Financials** tab.
2. Apply any filters or select specific entries you would like to export.
3. Select **Export** at the top right of the table.
4. Choose your **export scope** (selected items, filter results, or all) and your **export format** (see [Transaction Export Formats](#transaction-export-formats) below), then confirm.
### Transaction Export Formats
The export dialog offers two formats. Choose the one that fits your reporting need.
#### Transactions
One row per transaction. This is the standard format for reconciliation, reporting, and most accounting workflows.
Each row contains the transaction header fields — type, status, invoice date, payee, amount — along with any linked payment and entity details.
#### Transaction Line Items
One row per line item on each transaction, with the Transaction ID included on every row so you can group back to the parent transaction. This format is suited for ledger-level analysis, account reconciliation, and auditing individual debit/credit entries.
**Columns exported:**
| Column | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Transaction Id** | Identifier of the parent transaction. |
| **Invoice Number** | Invoice number on the parent transaction, if assigned. |
| **Transaction Type** | Type of the parent transaction (e.g., Policy Invoice, Indemnity). |
| **Status** | Status of the parent transaction (e.g., Paid, Owed, Approved). |
| **Invoice Date** | Date the invoice was created. |
| **Payee Name** | Name of the payee on the parent transaction. |
| **Entity Type** | Type of the linked entity (e.g., event, policy). |
| **Entity Name** | Name of the linked entity. |
| **Entity Id** | Internal identifier (UUID) of the linked entity. |
| **Payout Id** | Stripe payout ID, if the transaction was settled via payout. |
| **Payment Id** | Stripe transaction ID, if linked to a payment. |
| **Line Item Category** | Category of the line item, derived from the line item's subcategory (e.g., Attorney Fees Expenses, Expert Fees Expenses, Deductible). |
| **Line Item Id** | Identifier of the individual line item. |
| **Amount** | Signed dollar amount — **positive for income, negative for expenses**. |
| **Description** | Description of the line item (e.g., "ALAE reserve", "broker commission"). |
**Signed amount convention**
Line item amounts use +/− signing to represent the direction of money flow:
* **Positive** — money coming in (e.g., a premium payment received).
* **Negative** — money going out (e.g., a commission paid, an indemnity disbursement).
The sign on a line item row reflects the ledger direction of that individual entry. It does not match the gross amount shown on the parent transaction row in a Transactions export, which always displays the absolute invoice amount.
**Example: one transaction, multiple line items**
A single Policy Invoice for \$1,200 might expand into the following line items in the Transaction Line Items export:
| Transaction Id | Transaction Type | Amount | Description |
| -------------- | ---------------- | -------- | ----------------- |
| txn-001 | Policy Invoice | \$950.00 | Net premium |
| txn-001 | Policy Invoice | \$190.00 | Surplus lines tax |
| txn-001 | Policy Invoice | \$60.00 | Policy fee |
The same transaction in a **Transactions** export appears as a single row with an amount of **\$1,200.00** — the rolled-up total of all three line items.
Use **Transaction Line Items** when you need the per-account breakdown. Use **Transactions** when you only need the top-level totals.
# Historical Data Imports: Guidelines and Templates
Source: https://docs.aiinsurance.io/platform/reporting-and-reports/historical-data-imports
Our **Historical Data Import** service makes it easy to backfill instances of AI Insurance. This service allows customers to quickly populate their AI Insurance system with historical data, eliminating the need to maintain records across multiple systems (e.g., before and after using AI Insurance).
## How to backfill your AI Insurance instances
Follow these steps to quickly and easily populate your AI Insurance instance with historical data.
### **Step 1: Submit your data**
*Timeline: 1 week*
Your Implementation Manager will provide you with a Submittal Confirmation document (which requires a signature) and a link to a shared Google Drive folder for uploading historical data. The submitted data does not need to follow a strict schema. However, some fields are required depending on the entities being imported. These entities and their required fields are documented below:
#### Insureds object
| **Required Fields** | **Requirement Notes** |
| ------------------- | ---------------------------------------------------- |
| Insured(s) Name | |
| Insured object Type | This is the object type it will have in AI Insurance |
#### Policies object
| **Required Fields** | **Requirement Notes** |
| ------------------------ | -------------------------------------------------------- |
| Policy Number | |
| Policy Start Date | |
| Policy End Date | |
| Policy Timezone | |
| Policy Type | |
| Retroactive Date | Required if applicable and specific to Lines of Coverage |
| Primary Insured | |
| Named Insureds List | Required if applicable |
| Additional Insureds List | Required if applicable |
| Lines of Coverage | |
| Coverage Line Limits | |
#### Events object
| **Required Fields** | **Requirement Notes** |
| ------------------- | -------------------------- |
| Event Type | Claim or Incident |
| Event Status | Closed or Open |
| Closed Date | If importing Closed Events |
| Coverage Type | Line of Coverage |
| Insured(s) Name | |
#### Financials (Payments and Invoices) object
Please send the check or ACH report from your accounting system that details the payments made.
#### Payees object
| **Required Fields** | **Requirement Notes** |
| ------------------- | -------------------------------------------- |
| Name | |
| Type | **Options**: Law Firm, Vendor, Expert, Other |
### **Step 2: Sign the Submittal Confirmation document and send it to your Implementation Manager.**
*Timeline: 1 week from submission.*
We use Artificial Intelligence to process your data and reformat it for import compatibility. Once the process is complete, your Implementation Manager will provide you with a copy of the data for review, along with a confirmation document that requires your signature.
### **Step 3: Review data and sign-off on the Confirmation Document**
### **Step 4: AI Insurance imports the data into your instance**
*Timeline: 3 weeks*
Once we receive the signed confirmation document, AI Insurance will import your data into your instance within five business days. After the import is complete, you will receive a notification, an Acceptance Document to sign, and your login credentials for AI Insurance (if they haven’t already been provided).
### **Step 5: Review data in the AI Insurance platform and sign-off the Acceptance Document**
*Timeline: 1 week*
## Review and validation of your imported data
We expect our users to review their data after it has been imported. Since our customers know their data best, it’s crucial that they move forward with AI Insurance with complete confidence, knowing their data is fully and accurately integrated into the system.
To validate your data:
* **Check each section of the app**: Click through all sections to ensure completeness. This step will also help you familiarize yourself with our User Interface and gain additional insight into how the app functions.
* **Use the Export feature**: Compare the exported data with your historical submissions. AI Insurance offers powerful export options throughout the app, so take advantage of them to assess the completeness of your import.
* **Contact your Implementation Manager**: If you have any questions or encounter any issues, your Implementation Manager is here to ensure your success. They will thoroughly investigate and resolve any concerns you might have.
By taking these steps, you can be confident that your data is ready for use with AI Insurance.
## Our commitment to data integrity
We believe that AI Insurance should be the single source of truth for your business data. We collaborate closely with your team to ensure you can rely on our tool with complete confidence. For this partnership to be successful, we require your signature on three key documents:
* Submittal Completion
* Re-configured Data Approval
* Data Acceptance
Through this close collaboration, we're confident that your data will be complete and ready for use once all documents are signed. We’re excited for you to fully leverage your data and explore everything the AI Insurance platform has to offer
## Timeline
To stay on track, it's important that your team meets the onboarding deadlines. As outlined in your contract, any delays caused by your team will incur a fee.
# Insured portal
Source: https://docs.aiinsurance.io/policing/insured-portal/insured-portal
The **Insured Portal** is designed specifically for the insured. It provides access to information about all the associated policies and submissions.
Insureds get links and access to their insured portal once a submission has been created for them.
The portal includes two tabs: **Policies** and **Submissions**.
# Cancel a Policy
Source: https://docs.aiinsurance.io/policing/policy-management/canceling-a-policy
## How to Cancel a Policy
Follow these steps to cancel a policy in the system:
### Step 1: Navigate to the Policy
1. Select the **Policies** tab from the sidebar
2. Find and select the policy you would like to cancel
### Step 2: Access Cancel Action
1. Click the **Actions** dropdown in the top right corner
2. Select **Cancel Policy** from the dropdown menu
### Step 3: Fill Out the Cancel Date Form
The system will open a "Cancel Date" form with the following steps:
#### Cancel Date Section
1. **Enter Cancel Date**
* Enter the date you would like to cancel this policy
* Use the date picker to select the cancellation date
2. **Select Cancellation Reason**
* Choose from the dropdown menu with the following options:
* **Missed payment**
* **Violation of policy agreement**
* **Went with another provider**
* **No longer needed**
* **Other**
### Step 4: Review Billing
This page displays the financial impact of the cancellation and allows you to choose how to track the billing.
1. **Review Payment Information**
* The "Payment" section shows the "Amount Due" and "Amount Paid to Date."
2. **Select Financial Tracking Option**
* Choose one of the following:
* **Create invoice in financials**: To generate a new invoice for this cancellation.
* **Do not track**: To prevent the system from creating a new invoice or affecting existing ones.
3. **Review Bill Details**
* The "Bill" section provides a detailed breakdown of the "Total Premium" and any "Example Fee," showing the "Old Value," "Change in Value," and "New Value."
### Step 5: Select Forms
After reviewing the billing details, proceed to the next step to select forms.
1. **Search for Forms**
* Use the search bar to find the specific form you want to add
* Type the form name or keywords to filter available forms
2. **Add Forms**
* Click the **plus sign** beneath the search bar to add the selected form
* The form will be added to your cancellation package
3. **Reorder Forms**
* Once you've added forms, you can reorder them in your preferred format
* Click **"Reorder Form"** to enter reorder mode
* Click the **arrow** that appears to move the selected form up or down
* Arrange the forms in the order you want them to appear in the final package
### Step 6: Review and Confirm
1. Review all cancellation details
2. Click **Confirm** to complete the policy cancellation
# Change Policy Billing Email
Source: https://docs.aiinsurance.io/policing/policy-management/changing-policy-billing-email
## How to Change Policy Billing Email
1. Select the policy you want to update from the Policies page.
2. Navigate to the **Financials** tab.
3. Click **Change Billing Email** to update the billing email address for the policy.
# Change Policy Numbers on Renewed or Expired Policies
Source: https://docs.aiinsurance.io/policing/policy-management/changing-policy-numbers
Sometimes you may need to change the policy number for policies that have already been renewed or have expired. This process requires special handling to ensure data integrity and proper policy tracking.
## How to Request Policy Number Changes
Since changing policy numbers on renewed or expired policies affects historical data and system integrity, this process requires support assistance.
### Contact Support
To request a policy number change:
Send an email to [**support@aiinsurance.io**](mailto:support@aiinsurance.io) with:
* **Subject**: "Policy Number Change Request"
* **Current Policy Number**: The existing policy number that needs to be changed
* **New Policy Number**: The requested new policy number
* **Policy Details**: Include policy status, effective dates, and primary insured
# Change Coverage Limits
Source: https://docs.aiinsurance.io/policing/policy-management/coverage/changing-coverage-limits
## Changing Coverage Limits
### How to Change Coverage Limits
1. On the policy page, click **"Action"** in the top right corner
2. Select **"Endorse Policy"**
3. Click the **edit icon** to edit the limits
4. Use the **dropdown box** for the presets where you can edit the limits
5. Click **"Save"** to apply your changes
### Changing Coverage Names
To change the name of a coverage or line of coverage, see [Changing Coverage Names](/platform/companies/company/changing-coverage-names).
### Requesting New Coverage Limit Presets
If you need to change the preset options available, you'll need to reach out to support:
#### Email Support
Send an email to [**support@aiinsurance.io**](mailto:support@aiinsurance.io) with:
* Subject: "New Coverage Limit Preset Request"
* Policy number and details
* Specific limit combinations needed
* Justification for the new preset options
# Coverage Smart Tags
Source: https://docs.aiinsurance.io/policing/policy-management/coverage/smart-tags
## Overview
Coverage Smart Tags are out-of-the-box smart tags available for all coverage types enabled on your instance. These tags allow you to display individual coverage details in your forms, giving you full control over how coverage information is presented to your clients.
Instead of using the default **Policy Coverage Details** table tag, which displays all coverage information in a standardized table format, you can use individual coverage smart tags to create custom layouts that match your specific requirements.
To learn more about smart tags, see [here](/platform/components/smart-tags/smart-tags).
## How Coverage Smart Tags Work
To see more details about how this function works, watch the video below.
Each coverage smart tag populates with the corresponding coverage-level value from your policy. These tags pull coverage-level values only—any exposure-specific endorsement values on the coverage are not included.
For example, if you have a Commercial Property coverage with a retention of `$100,000` and a per-claim limit of `$1,000,000`, the smart tags will display these coverage-level values, regardless of any insured-specific or exposure-specific values that may exist.
## Available Coverage Smart Tags
Coverage smart tags are automatically available for all coverage types in your instance. The tag name follows the pattern: **@Coverage Name Field Name**.
### Coverage Property Tags
These tags display the core coverage details:
* **Coverage Name Deductible / Coverage Name Retention**: Displays the deductible or retention amount for the coverage. The label (Deductible or Retention) matches your instance configuration. Some customers track this value as Retention and some as Deductible, so the smart tag label will align with your specific configuration.
Example: `@Commercial Property Retention` displays `$100,000`
* **Coverage Name Retroactive Date**: Displays the retroactive date for the coverage.
Example: `@Commercial Property Retroactive Date` displays `11/18/2025`
* **Coverage Name Prior/Pending Litigation Date**: Displays the prior/pending litigation date, if tracked for the coverage. Most customers do not choose to track this on the coverage.
* **Coverage Name Limit Name**: Displays the coverage-level limit value for each limit available on the coverage. A separate tag exists for each limit type (Per Claim, Aggregate, etc.).
Examples:
* `@Commercial Property Per Claim` displays `$1,000,000`
* `@Commercial Property Aggregate` displays `$2,000,000`
### Coverage Financial Tags
These tags display financial information specific to each line of coverage:
* **Coverage Name Premium**: Displays the amount of premium attributable to that line of coverage. In the Premium By Line of Coverage card, you can see that General Liability coverage is responsible for \$29,683.73 of premium, so the tag titled "General Liability Premium" would display that amount.
Example: `@General Liability Premium` displays `$29,683.73`
* **Coverage Name Premium Tax**: Displays the amount of tax attributable to the coverage premium value. See [How Is Coverage Tax Calculated](#how-is-coverage-tax-calculated) for more specific details on how this smart tag resolves its value. This value isn't displayed in the typical quote workflow.
* **Coverage Name Premium + Tax**: Displays the sum of the coverage premium and coverage tax. This tag determines coverage premium and coverage tax in the same way as the two tags listed above and simply returns the sum of those amounts. This value isn't displayed in the typical quote workflow.
## How Is Coverage Tax Calculated
The tax is determined by the rating engine associated with your instance. Some customers calculate this at the exposure-level, others track it at the overall policy-level. This tag handles both scenarios.
In some cases, premium is broken down by coverage but the tax amount is not. This tag is also able to handle this case by attributing to the coverage the same percentage of overall tax as the coverage has of overall premium.
Example: A policy has a total premium of `$100,000` of which General Liability is `$12,000` and overall tax is `$10,000`. In this case, General Liability is 12% of overall premium, so the `General Liability Premium Tax` tag would return 12% of the `$10,000` overall tax amount, which is `$1,200`.
# Delete a Policy
Source: https://docs.aiinsurance.io/policing/policy-management/deleting-a-policy
## Feature Summary — "Delete Policy" Action
When a user deletes a policy under Actions → Delete Policy, the system will:
* Delete the policy from active records
* Void all associated invoices automatically
However, the deleted policy and its voided invoices remain viewable in the Financials tab for recordkeeping purposes.
## How to Delete a Policy
Take the following steps to delete a policy:
1. Navigate to the **Policies** page by clicking the **Policies** tab on the sidebar.
2. On the **Policies** page, search through the list of the policies and select the policy you would like to delete.
3. In the specific policy page, navigate to the **Actions** dropdown on the top right of the page and select **Delete Policy** from the options. This action opens up a **Delete Policy** modal.
4. Confirm the policy deletion by clicking the **Delete** button.
# Endorse a Policy
Source: https://docs.aiinsurance.io/policing/policy-management/endorsing-policy/overview
Endorsing a policy means modifying or adding to the terms and conditions of an existing insurance policy. This guide walks you through the complete process of endorsing a policy step by step.
## Step 1: Navigate to Policies
1. Click the **Policies** tab in the sidebar to open the Policies page.
## Step 2: Find and Select the Policy
1. Use the search functionality or browse through the list to find the policy you want to endorse.
2. Click on the policy to open its details page.
## Step 3: Start the Endorsement Process
1. On the policy details page, locate the **Actions** dropdown in the top-right corner.
2. Click the **Actions** dropdown to view available options.
3. Select **Endorse Policy** from the dropdown menu.
This will open the **Endorse Policy Details** page, which is divided into six sections that you'll complete sequentially.
## Step 4: Endorse Policy Details
The first section allows you to update basic policy information.
1. Review and update policy information as needed:
* Start and end dates
* Policy type
* Timezone
* Broker information
* Other policy-level details
2. **Important**: Specify the **Effective Date for Changes**. The **Next** button will remain inactive until you enter this date.
3. Click **Next** to proceed to the next section once you've completed all required fields.
## Step 5: Edit Exposures
In this section, you can manage the exposures (insured parties) associated with the policy.
1. **Add Exposures**: Click the **Add Exposure** button to include new insured parties to the policy.
2. **Edit Exposure Details**: Click the **edit icon** next to an exposure to edit its details. This will open the **Edit Insured** page where you can:
* **Set Effective Date for Changes**: Enter the effective date for the changes (required field, indicated by \*). Note that these edits will only affect the specific policy being endorsed.
* **Rating Information**:
* **Risk Factor**: Enter the risk factor value (required field, indicated by \*)
* **Do Not Rate**: Check the "Do not rate this Insured" checkbox if you want to exclude this exposure from rating calculations
* **Exposure Information**: Update exposure details, relationships, and other exposure-specific attributes
* **Terminate or Resume Exposure Relationship**:
* Click the **pause icon** to terminate an exposure's relationship with the policy
* Click **resume** to restore the exposure's relationship with the policy
Once you've made your changes, click **Save** to confirm or **Cancel** to discard your changes.
3. Review all exposure changes to ensure accuracy.
4. Click **Next** to proceed.
## Step 6: Edit Coverages
This section allows you to manage coverage lines, limits, and policy aggregates.
### Policy Aggregates
1. **Manage Limits**: In the **Policy Aggregates** section, you can:
* View existing limits configured for the policy
* Click **Add a Limit** to create new policy-level limits
### Lines of Coverage
2. **Add Coverage Lines**:
* Click the **Add Coverage** button to include new coverage lines (e.g., General Liability, Commercial Property) to the policy
3. **Edit Coverage Details**: Click the **edit icon** next to a coverage line to open the **Edit Coverage** page. On this page, you can configure:
* **Line of Coverage**: Select or view the coverage type (e.g., General Liability, Commercial Property)
* **Preset**: Choose from preset coverage configurations (e.g., "$100K/$300K") if available
* **Defense Limits**: Select whether defense is "Inside" or "Outside" the limit using the radio buttons
* **Limits**:
* **Per Claim Limit**: Set the maximum amount per individual claim (e.g., \$100,000)
* **Aggregate Limit**: Set the total maximum amount for all claims (e.g., \$300,000)
* **Insured-Specific Limits**: Check "Use separate limits for specific insureds" to configure limits for specific exposures. Click **View/Edit** to manage these limits.
* **Deductibles**: Check "Add Deductible to this Line of Coverage" to add a deductible requirement
* **Retroactive Dates**:
* Set a retroactive date if applicable
* Optionally check "Use separate retroactive dates for specific insureds" to set different dates per exposure
* **Prior and Pending Litigation Dates**: Enter a prior or pending litigation date if required
Once you've made your changes, click **Save** to confirm or **Cancel** to discard your changes.
4. **Remove Coverage Lines**: Click the **delete icon** next to a coverage line to remove it from the policy
**Note**: To change coverage limits, see the [Changing Coverage Limits](/policing/policy-management/changing-coverage-limits) documentation.
6. Review all coverage changes to ensure accuracy.
7. Click **Next** to proceed.
## Step 7: Billing
The Billing page displays a summary of all financial changes resulting from the endorsement.
1. **Review Financial Changes**: The billing table shows:
* **Item Name**: The name of each financial item
* **Old Value**: The original amount before the endorsement
* **Change in Value**: The difference in amount (can be positive or negative)
* **New Value**: The updated amount after the endorsement
* **Item Type**: The category of each item
2. Click **Next** to proceed.
## Step 8: Edit Forms
Manage the forms attached to the policy during the endorsement.
1. **Add Forms**: Click **Add Form** to attach new forms to the policy.
2. **Remove Forms**: Select a form and click **Remove** to detach it from the policy.
3. Review the forms list to ensure all necessary forms are included.
4. Click **Next** to proceed.
## Step 9: Review and Confirm
The final section allows you to review all changes before confirming the endorsement.
1. **Review Changes**: Carefully review all modifications you've made across:
* Policy details
* Exposures
* Coverages
* Billing and financial changes
* Forms
2. **Confirm Endorsement**: When you're ready to finalize the endorsement:
* Click the **Confirm Endorsement** button.
* The **Confirm Endorsement** modal will appear.
3. **Enter Recipient Information**: In the modal:
* Input the primary recipient's email address.
* Optionally, add additional email addresses for other recipients who should receive notification of the endorsement.
4. Click **Confirm** to complete the endorsement process.
## What Happens Next?
After confirming the endorsement:
* The policy will be updated with all your changes.
* Email notifications will be sent to the specified recipients.
* The endorsement will be recorded in the policy's activity history.
* You can view the updated policy details in the Policies section.
***
By following these steps, you can successfully update an existing policy to reflect any required changes through the endorsement process.
# Managing Insured Ratings During Endorsements
Source: https://docs.aiinsurance.io/policing/policy-management/endorsing-policy/removing-insureds-from-rerating
When endorsing a policy, you have the ability to exclude specific insureds from the re-rating process and revert changes made to individual insureds using the Underwriting Workbench. This provides flexible management, individual control, error correction capabilities, improved accuracy, and workflow efficiency for your endorsement process.
## Overview
During policy endorsements, the system automatically re-rates all insureds whose premium may have changed. However, you can:
* **Exclude specific insureds** from the re-rating process using "Do Not Rate"
* **Review changes** made to individual insureds in the Underwriting Workbench
* **Revert rating** for specific insureds back to their previous rating before the endorsement
## Excluding Insureds from Re-rating
### Step 1: Start Policy Endorsement
1. Navigate to **Policies** in the sidebar
2. Find and select the policy you want to endorse
3. Click **"Endorse Policy"** from the Actions dropdown
> For detailed information about the complete endorsement process, see [Endorsing a Policy](https://docs.aiinsurance.io/policing/policy-management/endorsing-policy/overview).
### Step 2: Navigate to Edit Exposures
1. In the endorsement workflow, you'll see a left sidebar with steps
2. Click on **"Edit Exposures"** to access the insureds management section
3. This will open the "Edit Exposures" page where you can manage insureds
### Step 3: Use "Do Not Rate" Option
1. On the "Edit Exposures" page, you'll see a table listing all insureds
2. Click the **"Edit"** button (pencil icon) next to the insured you want to modify
3. In the edit modal, check the **"Do Not Rate"** option
4. This assigns a \$0 premium to this insured (available on new policy quotes or endorsements)
5. Save your changes and continue with the endorsement process
**Note**: The "Do Not Rate" option assigns a \$0 premium to the insured. This is different from "Revert Rating" which restores the previous rating.
## Reverting Rating Changes
The "Revert Rating" functionality allows you to restore an insured's rating to what it was before the endorsement. This is different from "Do Not Rate" - it actually reverts to the previous rating rather than assigning \$0.
### Accessing Revert Rating
You can access the revert functionality in two ways:
1. **Underwriting Workbench** (during endorsements)
2. **Coverages Step and Insured Breakdown** (without the workbench)
### Accessing the Underwriting Workbench
During the endorsement process, expand the Underwriting Workbench to access the revert rating functionality.
> For more information about the Underwriting Workbench, see [Underwriting Workbench](/platform/components/underwriting-workbench/underwriting-workbench).
### Reverting Rating for Specific Insureds
If you need to revert rating for a specific insured:
1. **Locate the Insured**: Find the insured in the Covered Risk Breakdown table
2. **Review the Change**: See the change amount (e.g., "-\$4,256")
3. **Click the Revert Rating Button**: Click the circular arrow icon next to the change amount
4. **View Original State**: The display will show the insured's original premium before the endorsement
# Export Policy
Source: https://docs.aiinsurance.io/policing/policy-management/exporting-policies/export-policy
## How to Export a Policy
Follow these steps to export a policy from the system:
Any filters applied on the Policies page will carry over to the export. Make sure to apply your desired filters before exporting.
### Step 1: Filter Policies
1. Select the **Policies** tab from the sidebar
2. Click the **Add Filters** button to open the filter menu
3. Select your desired filter criteria from the available options
4. Click **Add Filter** to apply your selected criteria
5. The filtered results will display only the policies matching your criteria
### Step 2: Access Export Options
1. Click the **Actions** dropdown in the top right corner
2. Select **Export Policies** from the dropdown menu
### Step 3: Configure Export Settings
1. Verify that the policies you want to export are selected (you can see "All 236 policies" or your filtered selection)
2. **Save as Preset (Optional)**:
1. Click the **Save as Preset** button to save your current field configuration
2. Enter a name for your preset in the popup dialog
3. Click **Save** to save the preset or **Cancel** to close without saving
3. **Add Fields to Export**: Click on any field tags in the "Add Fields to Export" section to include them in your export
4. **Reorder Fields**: Drag and drop the selected fields in the "Reorder Fields for Export" section to change the column order
5. Click **Export Policies** to generate and download your export
### Step 4: Download the Export
The export file will be automatically downloaded to your computer based on your browser's download settings once you click **Export Policies**.
## Exposure Rating Fields
This feature adds exposure rating fields to policy export. The exposure rating field values are populated with the values set on the primary insured.
In other words, it's as if all the primary insured fields became fields on the policy itself (during the export flow).
This means that:
* For **Policy export**, we use the primary insured field value for the given point in time of the export
* **Group fields** get concatenated into one cell
## Policy Amount Fields
Policy exports include several categories of amount-related fields. Understanding the differences between them is important for accurate reporting.
Rated amounts, billed amounts, and financial amounts can differ for the same policy. This is expected — each category serves a distinct purpose and reflects different amounts.
### Rated Amount Fields
These fields reflect amounts calculated by the rating engine at the time of rating:
| Field | Description |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Total Premium** | The total rated premium for the policy as calculated by the rating engine. |
| **Broker Commission** | The total rated broker commission amount, calculated as Total Premium × Broker Commission Percentage. |
| **\[Modification fields]** | Company-specific modification adjustments (credits/debits) applied during rating, such as schedule credits or experience modifications. These fields are configured per company in the rating engine and vary by company. |
| **\[Tax fields]** | Company-specific tax amounts applied during rating, such as state or surplus lines taxes. These fields are configured per company in the rating engine and vary by company. |
| **\[Fee fields]** | Company-specific fee amounts applied during rating, such as policy fees or inspection fees. These fields are configured per company in the rating engine and vary by company. |
### Billed Amount Fields
These fields reflect amounts generated by the quoting process — that is, amounts on invoices created when a quote is bound. They only include amounts that have been billed through the system.
| Field | Description |
| -------------- | ------------------------------------------------------------------------------------------------------------ |
| **Total Bill** | The total amount billed on the policy: rated premium plus all taxes and fees included on generated invoices. |
| **Total Paid** | The total amount paid against invoices generated by the quoting process. |
### Related Field
| Field | Description |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Broker Commission Percentage** | The broker commission rate as a percentage (e.g., 15%). This is a rate, not an amount — it is the percentage used to calculate the **Broker Commission** amount field. |
### Note: Rated vs. Billed vs. Financial Amounts
AI Insurance tracks policy amounts in three distinct ways:
* **Rated Amounts** (e.g., *Total Premium*, *Broker Commission*, modification/tax/fee fields): Amounts calculated by the rating engine per the policy terms. These reflect the intended premium and adjustments at the time of rating.
* **Billed Amounts** (e.g., *Total Bill*, *Total Paid*): Amounts that have been invoiced and collected through the quoting process. *Total Bill* is the sum of premium, taxes, and fees on generated invoices. *Total Paid* is the total collected against those invoices.
* **Financial Amounts** (e.g., *Premiums - Total*, available in [financial exports](/platform/reporting-and-reports/exporting-data#exporting-financials-data)): Transaction-based ledger totals from AI Insurance's financial system. These track actual financial activity and can differ from rated or billed amounts when users create or edit transactions outside of the quoting flow.
# Export Policy Bordereau
Source: https://docs.aiinsurance.io/policing/policy-management/exporting-policies/export-policy-bordereau
## What is a Policy Bordereau?
A policy bordereau is a comprehensive report that provides detailed information about multiple policies in a structured format. Unlike a standard policy export, a bordereau creates **one row for every change to the policy**, making it ideal for tracking policy modifications, endorsements, and historical changes over time.
## Difference Between Export Policy and Export Bordereau
* **Export Policy**: Exports one row per policy, showing the current state of each policy
* **Export Bordereau**: Exports one row for every change to the policy, providing a detailed history of all modifications, endorsements, and updates
Use Export Bordereau when you need to track policy changes over time or analyze policy modifications in detail.
## How to Export a Policy Bordereau
Follow these steps to export a policy bordereau:
Any filters applied on the Policies page will carry over to the export. Make sure to apply your desired filters before exporting.
### Step 1: Filter Policies
1. Select the **Policies** tab from the sidebar
2. Click the **Add Filters** button to open the filter menu
3. Select your desired filter criteria from the available options
4. Click **Add Filter** to apply your selected criteria
5. The filtered results will display only the policies matching your criteria
### Step 2: Access Export Options
1. Click the **Actions** dropdown in the top right corner
2. Select **Export Bordereau** from the dropdown menu
### Step 3: Configure Export Settings
1. Verify that the policies you want to export are selected
2. Export Bordereau between dates (Optional):
* Enter a **Period Start** date
* Enter a **Period End** date
3. Save as Preset (Optional):
1. Click the **Save as Preset** button to save your current field configuration
2. Enter a name for your preset in the popup dialog
3. Click **Save** to save the preset or **Cancel** to close without saving
4. **Add Fields to Export**: Click on any field tags in the "Add Fields to Export" section to include them in your export
5. **Reorder Fields**: Drag and drop the selected fields in the "Reorder Fields for Export" section to change the column order
6. Click **Export Bordereau** to generate and download your export
### Step 4: Download the Export
The bordereau file will be automatically downloaded to your computer based on your browser's download settings once you click **Export Bordereau**.
## Exposure Rating Fields
This feature adds exposure rating fields to policy bordereau export. The exposure rating field values are populated with the values set on the primary insured.
In other words, it's as if all the primary insured fields became fields on the policy itself (during the export flow).
This means that:
* For **Bordereau export**, we use the primary insured field value for the effective date range of the row
* **Group fields** get concatenated into one cell
For more details, see [exposure rating documentation](#).
# Generate a Certificate of Insurance
Source: https://docs.aiinsurance.io/policing/policy-management/generating-cois
A Certificate of Insurance (COI) is a document that proves insurance coverage. It provides evidence to third parties—such as clients, vendors, or landlords—that the policyholder has active coverage meeting specific requirements.
You can generate COIs for both Policies and Insureds on the platform.
## Steps to generate a COI for a Policy
To create a COI for a specific policy, follow these steps:
1. Choose the policy for which you want to generate the COI.
2. Navigate to the **Actions** dropdown in the top-right corner of the page and select **Generate COIs** from the dropdown menu. This will open the **Generate COI** modal.
5. In the modal, provide the necessary information:
* Select the insured parties for whom you want to generate the COI.
* (Optional) Add a date.
* Check the Add Additional Interest box if other parties need to receive the COI. Then, input the additional party’s name and email address.
6. Click the **Generate** button. The COI will be downloaded to your computer based on your browser's download settings.
## Steps to generate a COI for an Insured
To create a COI for a specific insured, follow these steps:
1. Click on the **Insureds** tab in the sidebar to navigate to the **Insureds** page.
2. Search the list of insureds and select the one for which you want to create a COI.
3. Click on the insured to open its details. Navigate to the **Actions** dropdown in the top-right corner of the page and select **Generate COIs** from the dropdown menu. This will open the **Generate COI** modal.
4. In the modal, provide the necessary information:
* Select the policy from the dropdown for which you want to generate the COI.
* (Optional) Add a date.
* Check the Add Additional Interest box if other parties need to receive the COI. Then, input the additional party’s name and email address.
5. Click the **Generate** button. The COI will be downloaded to your computer based on your browser's download settings.
# Create a Policy
Source: https://docs.aiinsurance.io/policing/policy-management/policy-issuance
Policies exist as their own entities within AI Insurance. They can be attached to multiple [Insureds](/policing/insured-management/creating-insureds) and/or [Events](/events/create-new-events). Further, we support a number of policy types, they are:
* Claims Made
* Claims Made - “Tail” (Reporting Endorsement)
* Claims Made - “Nose” Prior Acts
* Claims Paid
* Occurrence
* Slot Coverage - Claims Made
* Slot Coverage - “Tail” (Reporting Endorsement)
* Slot Coverage - Occurrence
To create a policy, navigate to the **Policies** page by clicking the **Policies** tab on the sidebar.
Click the **New Policy/Quote** button at the top right on the designated **Policies** page to create a policy.
Clicking the **New Policy** button will redirect you to the **Create a Quote** page, as a policy is a bound quote. For instructions on how to create and bind a quote, refer to the official documentation on [creating a Submission](/submissions-and-quotes/creating-a-new-submission/for-carriers).
# Policy Timeline
Source: https://docs.aiinsurance.io/policing/policy-management/policy-timeline
The Policy Timeline provide an overview of changes effective over the course of the policy.
The timeline shows changes made to the following:
* Coverages
* Policy Rating Information
* Insureds (added or removed during the course of the policy)
* Insured Rating Information
The start of the timeline is the start date of the policy, the end of the timeline is the end date, and the highlighted portion represents the time between the start of the policy and today. If the policy is not currently active there won't be any highlighted portion.
Each date with changes effective on that date will show as a dot on the policy timeline.
Selecting an effective date from the dropdown or clicking the corresponding dot on the timeline will show the policy details effective on that date and shows a short summary of the changes made on that date.
# Renew a Policy
Source: https://docs.aiinsurance.io/policing/policy-management/renewing-a-policy
When a policy is approaching expiration or has expired, you can renew it to create a new policy period. The renewal process follows the same workflow as creating a new policy.
## Step 1: Navigate to the Policy
1. Click the **Policies** tab in the sidebar to open the Policies page.
2. Find and select the policy you want to renew.
3. Click on the policy to open its details page.
## Step 2: Start the Renewal Process
1. On the policy details page, locate the **Actions** dropdown in the top-right corner.
2. Click the **Actions** dropdown to view available options.
3. Select **Renew Policy** from the dropdown menu.
## Step 3: Complete the Policy Creation Process
After clicking **Renew Policy**, you will be redirected to the policy creation workflow. Follow the same steps as creating a new policy:
> For detailed instructions on creating a policy, see [Create a Policy](/policing/policy-management/policy-issuance).
The renewal process will guide you through:
* Setting up policy details
* Adding or updating exposures
* Configuring coverages
* Reviewing billing information
* Attaching forms
* Final review and confirmation
Once you complete the policy creation workflow, the renewed policy will be created with a new policy period.
# Set Policy Numbers
Source: https://docs.aiinsurance.io/policing/policy-management/setting-policy-number
## How to Set Policy Numbers
To set policy numbers, you can do so during the quote binding process. When you bind a quote to a policy, you'll have the opportunity to set or modify the policy number.
### Where to Edit Policy Numbers
**See this page**: **[Binding a Quote to Policy](/submissions-and-quotes/binding-the-quote/binding-the-quote)**
This page shows you the complete process of binding a quote to a policy, including where and how to edit the policy number.
# View Policies
Source: https://docs.aiinsurance.io/policing/policy-management/viewing-a-policy
To view all the policies in your organization, navigate to the **Policies** page by clicking the **Policies** tab on the sidebar to open up its designated **Policies** page.
## Filter and sort policies
On this page, you will see all your policies, and you can search through them using the search bar at the top of the page. You can sort the policies by: **Alphanumeric increasing**, **Alphanumeric decreasing**, **Recently Modified**, **Time Until Renewal**, and **Time Since Start**.
Additionally, you can filter through the policies page by different filters, such as:
* **Policy Status**: This filter filters the list of policies by their current status; a policy can have one of the following statuses: **Active**, **Cancelled**, **Renewed**, **Expired**, **Not Started**, **Pending Signature**, **Pending Payment**, and **Pending Renewal.**
* **Policy Start Date**: This filter helps you find only the policies created **On**, **Before**, or **After** a stipulated date.
* **Policy End Date**: This filter helps you filter and get only the policies that ended **On**, **Before**, or **After** a stipulated date.
* **Primary Insured**: This filter helps you get only the policies that either **Match**, **Contain**, or **do not Contain** a specified insured.
* **Total Premium**: This filter helps you filter and get only the policies that either **Equals**, **Is Less Than**, or **Is More Than** a stipulated premium amount.
* **Underwriter Notes**: This filter helps you filter and get only the policies that either **Matches**, **Contains**, or **Does not Contain** a specified underwriter note.
## View a Policy
To view information on a specific policy, search through the list of policies and select to open the specific policy.
### Policy Status
Previously, policies that had not yet started and policies that had already expired were both displayed as "Inactive", which made it unclear why a policy was not active.
This feature removes the generic "Inactive" status and replaces it with two explicit, time-based statuses:
* **Not Started** – shown when a policy's start date is in the future relative to the current date in the policy's timezone
* **Expired** – shown when a policy's end date is in the past relative to the current date in the policy's timezone
Policy status is now calculated using a clear priority order to ensure the most accurate state is always displayed:
**Cancelled → Active → Renewed → Expired → Not Started**
This change provides clearer visibility into a policy's lifecycle and removes ambiguity around non-active policies.
Depending on the status of the policy, a specific policy page will have all or some of these page sections, and here is what the sections do:
* **Coverage**: This section gives an overview of the policy and its Line of coverage. It is split into two sections: **Policy Details** and **Line of Coverage sections**. The Policy Details section describes the policy, including information like **primary insured**, **policy period**, **policy type**, **time zone**, and the **total premium**.
The Line of coverage specifies what type of coverage is in the policy, the policy limit types, and the limit amount. To change coverage limits, see the [Changing Coverage Limits](/policing/policy-management/changing-coverage-limits) documentation.
* **Forms**: This section displays all the forms associated with the policy.
* **Insureds**: This section displays all the insureds covered by the policy.
* **Events**: This section displays all the events that the policy had to take care of or cover, including incidents or claims.
* **Financials**: This section shows all the transactions associated with this policy. This section is split into two: **Premium** and **Transactions**. In the Premium section you see the total amount of premium that has been paid on that policy, gross written premium, billing period, and the next scheduled invoice.
In the Transaction section, you can do the following:
* **Export transactions**: You can export the transactions on a policy by selecting the transactions you want to export and clicking the **Export** button. This action will open the **Export** modal. Select the items you want to export in this modal and click the **Finish Export** button.
* **Mark transactions**: You can mark transactions with the following statuses: **Approved**, **Paid**, or **Owed**. You can do this by selecting the transaction you want to mark, navigating to the **Mark As** dropdown at the top of the section, and selecting what status you would like to mark the transaction from the different options in the dropdown.
* **Files**: This section holds all the files associated with a policy. Refer to the official [Files documentation](/platform/components/files) to learn more about the Files feature.
* **Notes**: This section holds all the notes associated with a policy. Refer to the official [Notes documentation](/platform/components/notes) to learn more about the Notes feature.
* **Application**: This section holds the application information submitted in request to be covered by a policy
* **Activity**: This section holds information on all the activities on the policy. Refer to the official [Activity documentation](/platform/components/activity-feed) to learn more about the activity feed.
# Inspect Rating
Source: https://docs.aiinsurance.io/rating/inspect-rating
Understand exactly how your policy premium was calculated by drilling into each rating segment.
The Inspect Rating tool gives you full visibility into how AI Insurance calculates your policy premium. Instead of seeing a single total number, you can drill down through every level of the rating — from the policy total, to each insured, to each coverage, to each individual coverage period — and see exactly how the premium was determined at each step.
## Opening Inspect Rating
After rating a policy or quote, click the **Inspect Rate** button in the quote wizard. This opens the Inspect Rating modal, which displays a hierarchical breakdown of your premium.
## How the rating hierarchy works
AI Insurance breaks your policy premium into the smallest meaningful segments, calculates a premium for each segment, and then aggregates those up into larger totals. The Inspect Rating modal lets you explore this hierarchy from the top down:
1. **Policy Total** — The overall premium, taxes, and fees for the entire policy
2. **Insureds** — The premium contribution from each insured on the policy
3. **Coverages** — For each insured, the premium broken out by coverage type (e.g., General Liability, Professional Liability)
4. **Coverage Periods** — For each coverage, the premium for each time period within the policy term
At each level, the modal displays columns for **Premium**, **Taxes**, and **Fees**.
## Exploring the breakdown
Each row in the Inspect Rating modal represents a segment of your rating. Click the available links on any row to explore further:
### Show Insured / Coverage / Period Ratings
Expands the current row to reveal its child segments. For example, clicking **Show Insured Ratings** on the Policy Total row reveals each insured's premium contribution. Clicking **Show Coverage Ratings** on an insured reveals the coverage-level breakdown, and so on.
### Show Rating & Modifications
Expands the row to show the detailed calculation steps and premium components for that segment. Depending on the segment, you may see:
* **Base Premium** — The annualized premium before any adjustments
* **Rated Premium** — The premium after applying the rating engine calculation
* **Pro-rated Premium** — The premium adjusted for the actual number of days in the period
* **Custom Adjustments** — Premium adjusted for custom adjustments applied by the underwriter
* **Adjusted Premium** — The final premium after all modifications
* **Taxes and Fees** — Any applicable taxes or fees
When a segment uses a snapshotted (previously calculated) premium rather than re-rating, it will be labeled **(not re-rated)**.
The detailed view also shows the **steps** the rating engine took to arrive at the final premium. Common steps include:
| Step | Description |
| ------------------------ | ------------------------------------------------------------------------ |
| Snapshotted Premium | Uses the previously calculated annualized premium |
| Calculate Rating | Runs the rating engine spreadsheet to compute a new premium |
| Prorate Premium | Adjusts the annualized premium based on the number of days in the period |
| Aggregate Premiums | Sums up child segment premiums into a parent total |
| Apply Custom Adjustments | Applies any credits, debits, or discretionary adjustments |
### View Inputs
Opens a dialog showing the input values that were passed to the rating engine for that segment. This is useful for verifying that the correct data was used in the calculation — for example, confirming the number of beds, the insured's state, or any other rating factors.
### Download Rating
Downloads the actual rating engine spreadsheet used to calculate the premium for that segment. You can open this spreadsheet to inspect the full calculation logic, including base rates, modifier factors, and formulas.
The **Download Rating** button is available on policy-level and coverage-period segments. Even if a segment was not re-rated (using a snapshotted premium), you can still download the original rating spreadsheet to see how the premium was initially calculated.
## Understanding endorsements and period splits
When a policy is endorsed, the coverage term may be split into multiple periods at each endorsement effective date. Each period is rated independently based on the inputs that were in effect during that time.
For example, if an insured's rating data changes mid-term:
* **Period 1** (before the change) retains the original premium and may show as **(not re-rated)**
* **Period 2** (after the change) is rated with the updated inputs and shows the recalculated premium
The current period (based on the endorsement effective date) is underlined in the Inspect Rating modal so you can quickly identify which period corresponds to the active endorsement.
## Troubleshooting rating discrepancies
If the premium doesn't match your expectations, the Inspect Rating tool gives you several ways to investigate:
1. **Check the inputs** — Use **View Inputs** to confirm the correct rating data was passed to the engine
2. **Review the steps** — Use **Show Rating & Modifications** to see each calculation step and identify where the numbers diverge
3. **Download the spreadsheet** — Use **Download Rating** to open the full rating engine and manually verify the calculation
4. **Check for adjustments** — Look for custom adjustments at the insured or policy level that may be adding or subtracting from the base premium
If you identify a discrepancy, please reach out to the [AI Insurance support team](mailto:support@aiinsurance.io) with the details. Having visibility into these calculations means issues can be caught and resolved quickly.
# Bind a Quote to Policy
Source: https://docs.aiinsurance.io/submissions-and-quotes/binding-the-quote/binding-the-quote
This guide explains how to convert a finalized quote into a bound policy. The process involves navigating from a submission, reviewing quote details, entering policy information, selecting forms, and confirming the binding.
## 1. Locate the Submission
* On the left sidebar, select **Submissions**.
* Find and open the desired submission.
* Within the submission page, locate the **Quote** section.
* Click **View** on the quote you want to bind into a policy.
## 2. Start Binding
* Once inside the quote view, go to the **top-right corner**.
* Click **Actions** → **Bind into Policy** from the dropdown menu.
## 3. Policy Details Page
You will first be taken to the **Policy Details** page.
* Enter the **Policy Number** in the provided field.
* Click **Next** in the top-right corner to proceed.
## 4. Policy Forms Page
On the **Policy Forms** page:
* Select or search the form(s) you want to include in the policy.
* The selected form(s) will appear on the right-hand side.
* You can rename or reorder forms if needed.
* **Edit or download the documents** to view them before binding:
* Use the **Edit** option to modify form details or rename forms.
* Use the **download icon** (downward arrow) to download and review documents before finalizing the binding.
* Preview forms using the view icon in the Available Forms section.
* Once done, click **Next**.
## 5. Review and Confirm Page
Finally, you will arrive at the **Review and Confirm** page.
* Review all details carefully:
* Primary Insured
* Policy Dates
* Broker / Agency
* Policy Type
* Currency Settings
* Underwriting Workbench (premium, fees, taxes, total amount due)
* Ensure everything is accurate.
## 6. Bind a Quote to a Policy
When you click **Bind to Policy**, a confirmation pop-up will appear.
Here you must configure how policy forms and billing information are sent:
* **Broker and Primary Insured** → Sends the policy forms and bill to both the broker and the insured.
* **Broker Only** → Sends only to the broker.
* **Custom** → Allows you to define custom recipients.
* **Do Not Send** → No forms or billing are sent out automatically.
You will also need to:
* Confirm the **Broker Email** (displayed by default).
* Optionally check **Copy additional recipients for forms** to include other recipients.
Once everything is set, click **Bind to Policy** to finalize the binding.
# Create a Submission as a Carrier
Source: https://docs.aiinsurance.io/submissions-and-quotes/creating-a-new-submission/for-carriers
Carriers can start the Submission process on behalf of the insured or broker.
## How to Create a Submission as a Carrier
### Step 1: Navigate to Submissions
1. Navigate to the **Submissions** page by clicking the **Submissions** tab on the sidebar
### Step 2: Start New Submission
2. Select the **New Submission** button at the top right on the **Submissions** page
### Step 3: Complete Submission Process
Clicking this button opens a new page where you can input the application details. The submission process is divided into seven pages:
#### 3.1: Upload Files
* **Upload Files**: On this page, you may upload any related documents for the application, such as application forms, loss runs, and other related files. Once the files are uploaded, click the **Next** button to proceed.
#### 3.2: Quote Details
* **Quote Details**: This page specifies the quote information and the binding settings. The fields in this section are:
* **Primary insured**: Enter the name of the primary insured of the policy. Do the following if the insured does not exist on the platform:
* Enter the insured's name in the field and select **Create new insured \[name of the insured]** to open the **Create New Insured** page.
* Input the insured’s information.
* Select the **Create** button to save, and you will be redirected to the **Quote Details** page.
* **Policy Number**: Enter the policy number. If your company has auto-generation enabled for policy numbers, the number will be generated when the quote is bound. The placeholder will display *Auto-generated when bound*.
* **Policy Start Date**: Enter the date the insurance coverage begins.
* **Policy End Date**: Enter the date the insurance coverage ends.
* **Policy Type**: Select the category or kind of insurance issued from the dropdown options.
* **Time Zone**: Select the time zone relevant to the policy's operations or issuance.
* **Broker**: Input the broker who facilitated the insurance policy. Do the following if the broker does not exist on the platform:
* Enter the broker's name in the field and select **Create new Broker \[name of the broker]** to open the **Add Broker** modal.
* Fill out this modal with your Broker information.
* Select the **Add Broker** button to redirect you to the **Quote Details** page.
* **Submission Description (Optional)**: Add additional details or description for the submission.
* **Binding Settings**: You can configure binding settings using the following options:
* **Add binding conditions to quote**: Toggle this switch to enable binding conditions for the quote
* When enabled, you can add specific conditions that must be met before the quote can be bound
* Click **Add Binding Condition** to add multiple conditions as needed
* Each condition can be removed using the trash icon next to it
#### 3.3: Insureds
* **Insureds**: This section lists the insured individuals or entities. It is divided into three columns:
* **Insured’s Name**
* **Entity Type** (what is being insured)
* **Relationship to the Policy**
To add another insured, search through the **Add or Create Insured** search bar, select an existing insured from the list, specify the entity type and relationship to the policy, and click **Next** to proceed.
If the insured does not exist, enter the name of the Insured in the search bar and click the **Create new Insured \[name of the Insured]** selection.
This action redirects you to the **Create New Insured** page. On this page, input the insured information and click the **Create** button at the top right to redirect you to the Insureds page.
### Step 4: Coverages
* **Coverages**: This page defines what the quote covers. This page is split into three:
* **Premium and Fees**: This section displays the policy premium and lets you add additional fees. You must first add your **Lines of Coverage** to view the policy premium.
You can also make custom adjustments to the policy premium by clicking the **Show Policy-Level Rating Factors** link. Enter the name of the custom adjustment and the adjustment amount. Once added, the updated policy premium will be displayed immediately. These adjustments apply to the total policy premium.
Toggle the percentage button next to the search bar if the adjustment amount is fixed (not a percentage).
* **Policy Aggregates**: In this section, you add the limits to your policies. To add a limit, click the **Add a Limit** button and input the **Limit Type** and **Limit Amount**.
* **Lines of Coverages**: This section outlines the details of the coverage of the quote in the event of an incident. To add a line of coverage, click the Add Coverage button. This action will open a new page where you can select:
* The **line of coverage** and its **preset**.
* Whether the defense is covered **inside** or **outside** the limit.
* The limits for each limit type are set automatically based on the preset. . You can change the **Limit Types** by selecting from the dropdown.
* Set individual limits for each insured based on their risk profile.
* Add deductibles, and specify whether you want different deductibles for each insured listed on the **Insured** page.
* Define **retroactive dates**, which determine how far back coverage applies. You can also add different retroactive dates for each insured if needed.
Once you finish this section, click the **Add Coverage** button to redirect you back to the **Coverages** page. On the **Coverages** page, you should see the policy premiums and Fees.
### Step 5: Billing
**Billing:** The Billing page, available exclusively for Premium Billing users, displays the total amount due, including taxes and fees. To add a new item, you must provide its name, specify the amount type, and indicate the payment category. Additionally, you must select the payment period, choosing between a one-time annual payment or installments spread across quarterly or monthly payments.
You should also enter the recipient's email address and decide whether to send the bill automatically based on the selected payment period.
**Custom Billing (Beta):** Eligible accounts have access to an enhanced billing step with granular control over invoice schedules, send timing, and commission handling. See [Custom Billing](/financials/invoicing/custom-billing) for details.
### Step 6: Quote Forms
**Quote Forms:** In this section, you can select documents you've previously created for the applicant to review or sign before binding the quote. Typically, this involves specifying which forms should be included in the policy. For guidance on creating forms, refer to the [Smart Tags documentation](/platform/components/smart-tags).
To add a form, browse the **Available Forms** list and click the "+" button on the desired form. You can also rename or edit the form and include smart tags. To rename a form, input your preferred name in the field at the top.
If you want to add a smart tag, position your cursor where you’d like the tag to appear, then use the sidebar on the right to search for and select the appropriate tag. Once added, the information associated with the smart tag will automatically populate the form. For more details about smart tags, refer to the [Smart Tag documentation](/platform/components/smart-tags).
Click the **Next** button to lead you to the Review and Send page.
### Step 7: Review and Send
**Review and Send**: This is the final step where you can review all quote details and choose your next action.
#### Available Actions:
1. **Send Quote**: Send the quote to the broker and/or insured for review
2. **Create Policy**: Directly create a policy from the quote
3. **Save Quote**: Save the quote for later completion
4. **Exit**: Exit without saving changes
5. **Back**: Return to the previous step
#### Send Quote Process:
When you click **Send Quote**, a modal will open with the following options:
1. **Recipient Selection**: Choose who should receive the quote:
* Broker and Primary Insured\*\*
* Broker Only
* Custom
* Do Not Send
2. **Email Confirmation**: The modal will display "Confirm the recipients' emails below:" and show the email addresses based on your selection
3. **Additional Options**:
* Check "Copy additional recipients for forms" if you want to include additional recipients for any forms
* Review the email addresses before sending
4. **Send or Cancel**: Click **Send Quote** to send the quote or **Cancel** to close the modal without sending
The recipient(s) will receive an email with the quote details and can review and accept the quote through the platform.
To learn how to [Bind a Quote](/submissions-and-quotes/binding-the-quote), check out the official documentation
# Create a Submission with the Submission Parsing feature
Source: https://docs.aiinsurance.io/submissions-and-quotes/creating-a-new-submission/submission-parsing
Another way to add a Submission to the platform is the Submission Parsing feature. With Submission Parsing, you can forward a submission via email, and AI Insurance will automatically read and extract the information from the email to create a submission.
To use the Submission Parsing feature:
1. Navigate to the **Submissions** page by clicking the **Submissions** tab on the sidebar.
2. Click the **Inbox** tab on the Submissions page.
3. Select the **How to Apply** button to get the email address where you'll send your submission.
4. Copy the email address from the **How to Apply** modal.
5. Send your submission email to that address. A draft submission will appear in your inbox.
6. Select the draft submission, review it, and make any necessary edits.
Once you’ve reviewed the draft, you can choose to either create an official Submission, decline it, or delete the draft. To do this:
1. Select the newly created draft.
2. Navigate to the **Actions** tab and choose one of the following options: **New Quote**, **Create Submission**, **Decline Submission**, or **Delete Submission**.
# Export Submissions
Source: https://docs.aiinsurance.io/submissions-and-quotes/exporting-submissions
Refer to the [Exporting Data documentation](/platform/reporting-and-reports/exporting-data) for detailed instructions on exporting your Submissions and Quotes data.
# Overview
Source: https://docs.aiinsurance.io/submissions-and-quotes/overview
**Submissions** refer to creating and sending a request to an insurance company or underwriter to obtain coverage or a policy for a specific risk or set of risks. On the AI Insurance platform, insureds, brokers, and carriers can create a Submission.
**Quotes** estimate how much a policy will cost and what it will cover.
In simpler terms, when you apply for an insurance policy through the AI Insurance platform, you start by answering some questions and providing details about what you want to be insured. This process is called a **Submission**. Based on your details, AI Insurance evaluates the risk, determining how risky it is to insure you, how much to charge, and the coverage that can be offered.
After evaluating the Submission, AI Insurance automatically generates a **Quote** on behalf of the carrier. This is possible because of the [rating engine specifications](/getting-started/setting-up-ai-insurance/rating-engine/rating-engine) the carrier sent to AI Insurance during onboarding.
The quote represents the carrier’s offer, specifying the cost of the policy and what it covers. It is then sent to the broker or the insured, based on your preference.
Once the quote is reviewed, and if it’s accepted by the insured or broker, they or the carrier can bind it into a policy. Binding creates a legal contract that confirms the insured’s coverage and protection.
Refer to the [Bind a Quote documentation](/submissions-and-quotes/binding-the-quote) for more details on binding quotes into policies.
# View all Submissions and Quotes
Source: https://docs.aiinsurance.io/submissions-and-quotes/viewing-submissions/viewing-submissions
Navigate to the **Submissions** tab on the sidebar to open the **Submissions** page.
On this page, you will see all your submissions, and you can search through them by name using the search bar at the top of the page. You can sort the submissions by last updated, created at, and primary insured name.
Additionally, you can filter through the submissions page by submission status. The different submission statuses are:
* **In Progress**: The submission is still ongoing; the applicant has not yet completed their application or provided all necessary details.
* **Submitted**: The application has been fully submitted for processing.
* **Quote In Progress**: A quote is currently being prepared for submission.
* **Quote Complete**: A quote has been finalized but has not yet been sent to the applicant.
* **Quote Sent**: A quote has been sent to the applicant for review.
* **Quote Accepted**: The applicant has accepted the quote.
* **Converted**: The submission has been successfully converted into an active policy.
* **Declined**: The submission has been declined and will not proceed further.
If there are multiple quotes pertaining to a single policy, the submission status will reflect on the quote that is furthest along the process.
## View a submission
To view more details about a submission, click on the specific submission to open its page.
Depending on the submission’s status, the page will typically have two or three tabs:
* For statuses like *Quote Accepted*, *Quote in Progress*, or *Quote Sent*, the page will have two tabs: **Summary** and **Files**.
* For statuses like *In Progress*, *Submitted*, *Converted*, or *Declined*, the page will have three tabs: **Summary**, **Application**, and **Files**.
These tabs hold the following information:
* **Summary**: This tab holds an overview of the specific Submission, including its status, submission number, and quotes created on this submission.
* **Application**: This tab holds the application sent in for Submission, the answers to the questions
* **Files**: This tab holds all the files associated with a particular submission. For more about files, see the [Files documentation](/platform/companies/files).
### **Decline a Submission**
To decline a submission:
1. Click to open up the specific Submission you want to decline.
2. Navigate to the **Actions** dropdown at the top right, and select the **Decline Submissions** option from the options. This action opens up the **Decline Submission** modal.
3. Input your reason for declining the submission.
4. Select the **Decline Submission** button.
You cannot decline a Submission that has been converted to a policy.
## Create a Quote
A quote is created automatically at the end of the submission process. However, you can create additional quotes or a new quote for a Submission by doing the following:
1. Open the Submission you want to create a Quote for
2. Click the New Quote button to create a Quote in the Quotes section. This action redirects you to create a submission as a carrier application. Refer to the [Create a new Submission as a carrier](/submissions-and-quotes/creating-a-new-submission/for-carriers) to learn more about filling out this application.
## View a Quote
To view all quotes for a Submission, go to the designated Submission page. Click on the Submission you want to review. In the **Quote** section, you'll find all associated quotes along with their current status.
To view a particular Quote, click the **View** button on the Quote. This Action opens its designated Quote page. This page is split into four pages:
* **Coverage**: Specifies the line of coverage for the Quote, which is split into four sections: Quote Details, Binding Settings, Policy Aggregates, and Type of the Line of Coverage.
* **Insureds**: Holds information on the Insured covered in the Quote. Click on an Insured to see more information on that Insured.
* **Forms**: Holds all the forms associated with a Quote. You can only see these forms when a policy has been bound.
* **Financials**: Holds the financial overview information on the Quote, including the premium an insured is to pay, including fees, taxes, and custom adjustments. It also shows information on the premium payment period and the billing email.
## Copy, edit, and delete a Quote
Once you have created a Quote, you can copy, edit, or delete it.
**Copying a Quote**
To copy a specific Quote, open the Quote page and click on the **Actions** dropdown menu in the top-right corner. From the dropdown options, select **Copy Quote**.
This action will take you to the **Quote Details** page, where you can update the information for the new Quote copy. Refer to [Edit a Quote](/submissions-and-quotes/viewing-submissions) for details on editing a quote
### **Edit a Quote**
Depending on a Quote’s status, you can edit a Quote to modify information on the Quote. To edit a Quote, do the following:
1. Open the specific Quote you want to edit.
2. Navigate to the **Actions** dropdown at the top of the Quote page.
3. Click the **Actions** dropdown and select **Edit Quote**.
After making your changes to the Quote, you can:
* **Save the Quote:** Click the **Save Quote** button at the top of the page to save your changes.
* **Send the Quote:** To send the Quote, click the **Actions** button at the top right of the page and select **Send Quote** from the dropdown. This will open the **Send Quote** modal. In the modal:
* Specify the recipient of the Quote.
* If you select the **Broker and Primary Insured** option, you’ll need to provide the email address of the Primary Insured.
* To add additional recipients, check the **Copy additional recipient for forms** box and input the additional email addresses.
Once you’re finished, the recipients will receive an email with the Quote.
* **Create a Policy:**
After reviewing the Quote and obtaining agreement from all relevant parties (e.g., the broker and the insured), you can bind the Quote into a policy. To do so:
1. Click the **Create Policy** button at the top of the page.
2. This opens the **Create Policy** modal, where you’ll:
* Confirm the recipients of forms and bills related to the policy.
* If you select the **Broker and Primary Insured** option, provide the Primary Insured’s email address.
* To add additional recipients, check the **Copy additional recipient for forms** box, input their email addresses, and then click **Create Policy**.
You cannot edit a Quote already sent to a recipient or bound into a policy.
### **Delete a Quote**
To delete a Quote, Open the specific Quote and navigate to the **Actions** dropdown at the top of the Quote page. In this dropdown, select the **Delete Quote** option and click the **Confirm** button in the **Delete Quote** modal.