openapi: 3.2.0
info:
title: 1Fort API Documentation insurance (v2) insurance (v2) API
description: '# 1Fort API
REST API for the 1Fort insurance platform. This document is the authoritative
map of the API surface; endpoints are grouped in the sidebar by **app** and
**version**, and large apps are split into per-resource sub-groups.
## Authentication
Almost every endpoint requires a **JWT access token**. Send it in the
`Authorization` header as either `Bearer <token>` or `JWT <token>`. Tokens may
also be presented as an HTTP-only cookie. Endpoints documented with no security
requirement are intentionally public (for example sign-in, OTP and storefront
endpoints).
## Multi-tenancy
Resources are scoped to a tenant. Nested routes carry the owning resource id in
the path (for example `/v2/broker/{business_pk}/applications`); a token is only
authorised for the businesses its user may access. Object-level permissions are
enforced per endpoint.
## Versioning
`v2` endpoints live under `/apis/v2/...` and are the current surface. `v1`
endpoints remain documented for compatibility. Endpoints marked **deprecated**
are scheduled for removal; prefer the documented replacement.
'
termsOfService: https://www.1fort.com/
license:
name: Privately owned
version: v1
servers:
- url: https://api.1fort.com/apis/
security:
- Bearer: []
tags:
- name: insurance (v2)
x-displayName: Insurance (v2)
description: '**Access:** requires a JWT access token.'
paths:
/v2/broker/insurance-coverage-types:
parameters: []
get:
operationId: v2_broker_insurance-coverage-types_list
description: List and retrieve CoverageType (reference data).
parameters:
- name: search
in: query
description: A search term.
required: false
schema:
type: string
- name: ordering
in: query
description: Which field to use when ordering the results.
required: false
schema:
type: string
- name: limit
in: query
description: Number of results to return per page.
required: false
schema:
type: integer
- name: offset
in: query
description: The initial index from which to return the results.
required: false
schema:
type: integer
responses:
'200':
description: ''
content:
application/json:
schema:
required:
- count
- results
type: object
properties:
count:
type: integer
next:
type:
- string
- 'null'
format: uri
previous:
type:
- string
- 'null'
format: uri
results:
type: array
items:
$ref: '#/components/schemas/CoverageType'
'403':
description: Authentication credentials were invalid, absent or insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'500':
description: Internal server error.
tags:
- insurance (v2)
summary: List Insurance coverage types
/v2/broker/insurance-coverage-types/{id}:
parameters:
- name: id
in: path
description: A UUID string identifying this Coverage Type.
required: true
schema:
type: string
format: uuid
get:
operationId: v2_broker_insurance-coverage-types_read
description: List and retrieve CoverageType (reference data).
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/CoverageType'
'403':
description: Authentication credentials were invalid, absent or insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'404':
description: Object does not exist or caller has insufficient permissions to access it.
content:
application/json:
schema:
$ref: '#/components/schemas/APIException'
'500':
description: Internal server error.
tags:
- insurance (v2)
summary: Retrieve Insurance coverage type
/v2/broker/{business_pk}/coverage-terms:
parameters:
- name: business_pk
in: path
required: true
schema:
type: string
get:
operationId: v2_broker_coverage-terms_list
summary: Read + Create coverage terms.
description: '- GET /coverage-terms/ — list for this business
- GET /coverage-terms/{id}/ — single with full nested tree
- POST /coverage-terms/ — create with nested lines/limits/deductibles/fees'
parameters:
- name: search
in: query
description: A search term.
required: false
schema:
type: string
- name: ordering
in: query
description: Which field to use when ordering the results.
required: false
schema:
type: string
- name: limit
in: query
description: Number of results to return per page.
required: false
schema:
type: integer
- name: offset
in: query
description: The initial index from which to return the results.
required: false
schema:
type: integer
responses:
'200':
description: ''
content:
application/json:
schema:
required:
- count
- results
type: object
properties:
count:
type: integer
next:
type:
- string
- 'null'
format: uri
previous:
type:
- string
- 'null'
format: uri
results:
type: array
items:
$ref: '#/components/schemas/CoverageTerm'
'403':
description: Authentication credentials were invalid, absent or insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'500':
description: Internal server error.
tags:
- insurance (v2)
post:
operationId: v2_broker_coverage-terms_create
summary: Read + Create coverage terms.
description: '- GET /coverage-terms/ — list for this business
- GET /coverage-terms/{id}/ — single with full nested tree
- POST /coverage-terms/ — create with nested lines/limits/deductibles/fees'
responses:
'201':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/CoverageTermWrite'
'400':
description: Invalid input.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
'403':
description: Authentication credentials were invalid, absent or insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'500':
description: Internal server error.
tags:
- insurance (v2)
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CoverageTermWrite'
required: true
/v2/broker/{business_pk}/coverage-terms/{id}:
parameters:
- name: business_pk
in: path
required: true
schema:
type: string
- name: id
in: path
description: A UUID string identifying this Coverage Term.
required: true
schema:
type: string
format: uuid
get:
operationId: v2_broker_coverage-terms_read
summary: Read + Create coverage terms.
description: '- GET /coverage-terms/ — list for this business
- GET /coverage-terms/{id}/ — single with full nested tree
- POST /coverage-terms/ — create with nested lines/limits/deductibles/fees'
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/CoverageTerm'
'403':
description: Authentication credentials were invalid, absent or insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'404':
description: Object does not exist or caller has insufficient permissions to access it.
content:
application/json:
schema:
$ref: '#/components/schemas/APIException'
'500':
description: Internal server error.
tags:
- insurance (v2)
components:
schemas:
CoverageSubLimit:
required:
- sub_limit_amount
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
limit_type:
title: Limit type
type: string
enum:
- sub_limit
- inner_limit
- other
sub_limit_amount:
title: Sub limit amount
description: Sub-limit amount
type: string
format: decimal
retention_amount:
title: Retention amount
description: Retention/deductible amount paired with this sub-limit
type:
- string
- 'null'
format: decimal
description:
title: Description
description: Description (e.g., 'Social Engineering', 'Computer Fraud')
type: string
maxLength: 200
limit:
title: Limit
type:
- string
- 'null'
format: uuid
CarrierList:
required:
- name
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
name:
title: Name
type: string
maxLength: 255
minLength: 1
logo:
title: Logo
type:
- string
- 'null'
readOnly: true
format: uri
am_best_rating:
title: Am best rating
description: AM Best financial strength rating (e.g., A++, A+, A, A-, B++, B+)
type:
- string
- 'null'
maxLength: 255
domains:
description: Comma-separated list of domain names (e.g., example.com, example.org)
type:
- array
- 'null'
items:
title: Domains
type: string
maxLength: 255
minLength: 1
CoverageDeductible:
required:
- deductible_type
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
deductible_type:
title: Deductible type
description: Type of deductible (e.g., per_claim, per_occurrence, aggregate, waiting_period)
type: string
enum:
- per_claim
- per_occurrence
- aggregate
- waiting_period
- retention
- other
amount:
title: Amount
description: Deductible amount in dollars (null if percentage-only)
type:
- string
- 'null'
format: decimal
description:
title: Description
description: Additional description for this deductible
type: string
maxLength: 200
is_percentage:
title: Is percentage
description: Whether this deductible is expressed as a percentage
type: boolean
percentage:
title: Percentage
description: Deductible percentage (e.g., 5.000 for 5%)
type:
- string
- 'null'
format: decimal
min_amount:
title: Min amount
description: Minimum dollar floor for percentage deductibles
type:
- string
- 'null'
format: decimal
max_amount:
title: Max amount
description: Maximum dollar cap for percentage deductibles
type:
- string
- 'null'
format: decimal
CoverageLimit:
required:
- limit_type
- amount
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
limit_type:
title: Limit type
description: Type of limit (e.g., per_occurrence, aggregate, csl, per_person)
type: string
enum:
- per_occurrence
- aggregate
- csl
- per_person
- per_accident
- each_occurrence
- products_completed_ops
- personal_advertising
- general_aggregate
- policy_limit
- other
amount:
title: Amount
description: Limit amount
type: string
format: decimal
description:
title: Description
description: Additional description for this limit
type: string
maxLength: 200
Wholesaler:
required:
- name
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
name:
title: Name
type: string
maxLength: 255
minLength: 1
logo:
title: Logo
type:
- string
- 'null'
readOnly: true
format: uri
is_active:
title: Is active
type: boolean
is_owned_by_1fort:
title: Is owned by 1fort
description: Indicates if this wholesaler is owned by 1Fort
type: boolean
domains:
description: Comma-separated list of domain names (e.g., example.com, example.org)
type:
- array
- 'null'
items:
title: Domains
type: string
maxLength: 255
minLength: 1
Coverage:
required:
- name
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
name:
title: Name
description: Coverage name (e.g., 'Cyber Liability', 'Commercial Auto')
type: string
maxLength: 200
minLength: 1
coverage_type:
$ref: '#/components/schemas/CoverageType'
policy_type:
title: Policy type
type: string
enum:
- admitted
- surplus_lines
carrier:
$ref: '#/components/schemas/CarrierList'
carrier_am_best_rating:
title: Carrier am best rating
description: Snapshot of carrier's AM Best rating at the time the coverage term was created
type: string
maxLength: 50
underwriter_name:
title: Underwriter name
type: string
maxLength: 200
underwriter_email:
title: Underwriter email
type: string
format: email
maxLength: 254
wholesaler:
$ref: '#/components/schemas/Wholesaler'
mga:
$ref: '#/components/schemas/Wholesaler'
premium:
title: Premium
description: Premium amount for this coverage
type:
- string
- 'null'
format: decimal
minimum_earned_premium:
title: Minimum earned premium
description: Minimum earned premium percentage (carrier-specific)
type:
- string
- 'null'
format: decimal
participation_percentage:
title: Participation percentage
description: Carrier's share of the risk as percentage (e.g., 23.900 for 23.9%)
type:
- string
- 'null'
format: decimal
commission_rate:
title: Commission rate
description: Commission rate as percentage (e.g., 15.00 for 15%)
type:
- string
- 'null'
format: decimal
is_excess:
title: Is excess
description: Whether this is excess/umbrella coverage
type: boolean
waiting_period_hours:
title: Waiting period hours
description: Waiting period in hours (e.g., 8.00 for 8-hour BI waiting period)
type:
- string
- 'null'
format: decimal
limits:
type: array
items:
$ref: '#/components/schemas/CoverageLimit'
readOnly: true
deductibles:
type: array
items:
$ref: '#/components/schemas/CoverageDeductible'
readOnly: true
fees:
type: array
items:
$ref: '#/components/schemas/CoverageFee'
readOnly: true
APIException:
title: Generic API Error
required:
- detail
type: object
properties:
detail:
description: Error details
type: string
CoverageTermWrite:
type: object
properties:
reference_number:
title: Reference number
type: string
maxLength: 100
business:
title: Business
type:
- integer
- 'null'
broker:
title: Broker
type:
- integer
- 'null'
source:
title: Source
description: Source of the coverage term (e.g., 'herald', 'email', 'manual')
type: string
maxLength: 50
coverages:
type: array
items:
$ref: '#/components/schemas/CoverageWrite'
fees:
type: array
items:
$ref: '#/components/schemas/CoverageFeeWrite'
sub_limits:
type: array
items:
$ref: '#/components/schemas/CoverageSubLimitWrite'
CoverageWrite:
required:
- name
- carrier_id
type: object
properties:
name:
title: Name
description: Coverage name (e.g., 'Cyber Liability', 'Commercial Auto')
type: string
maxLength: 200
minLength: 1
coverage_type_id:
title: Coverage type id
description: Coverage type UUID from search_coverage_types / match_coverage_types.
type:
- string
- 'null'
format: uuid
policy_type:
title: Policy type
type: string
enum:
- admitted
- surplus_lines
carrier_id:
title: Carrier id
description: Carrier UUID for this coverage line. Required on every coverage. Pass `null` only when the coverage genuinely has no carrier yet (e.g., a placeholder line in a draft). Must be a UUID resolved via carrier search/match, never a carrier name string.
type:
- string
- 'null'
format: uuid
carrier_am_best_rating:
title: Carrier am best rating
description: Snapshot of carrier's AM Best rating at the time the coverage term was created
type: string
maxLength: 50
underwriter_name:
title: Underwriter name
type: string
maxLength: 200
underwriter_email:
title: Underwriter email
type: string
format: email
maxLength: 254
wholesaler_id:
title: Wholesaler id
type:
- string
- 'null'
format: uuid
mga_id:
title: Mga id
type:
- string
- 'null'
format: uuid
premium:
title: Premium
description: Premium amount for this coverage
type:
- string
- 'null'
format: decimal
minimum_earned_premium:
title: Minimum earned premium
description: Minimum earned premium percentage (carrier-specific)
type:
- string
- 'null'
format: decimal
participation_percentage:
title: Participation percentage
description: Carrier's share of the risk as percentage (e.g., 23.900 for 23.9%)
type:
- string
- 'null'
format: decimal
commission_rate:
title: Commission rate
description: Commission rate as percentage (e.g., 15.00 for 15%)
type:
- string
- 'null'
format: decimal
is_excess:
title: Is excess
description: Whether this is excess/umbrella coverage
type: boolean
waiting_period_hours:
title: Waiting period hours
description: Waiting period in hours (e.g., 8.00 for 8-hour BI waiting period)
type:
- string
- 'null'
format: decimal
limits:
type: array
items:
$ref: '#/components/schemas/CoverageLimitWrite'
deductibles:
type: array
items:
$ref: '#/components/schemas/CoverageDeductibleWrite'
CoverageDeductibleWrite:
required:
- deductible_type
type: object
properties:
deductible_type:
title: Deductible type
description: Type of deductible (e.g., per_claim, per_occurrence, aggregate, waiting_period)
type: string
enum:
- per_claim
- per_occurrence
- aggregate
- waiting_period
- retention
- other
amount:
title: Amount
description: Deductible amount in dollars (null if percentage-only)
type:
- string
- 'null'
format: decimal
description:
title: Description
description: Additional description for this deductible
type: string
maxLength: 200
is_percentage:
title: Is percentage
description: Whether this deductible is expressed as a percentage
type: boolean
percentage:
title: Percentage
description: Deductible percentage (e.g., 5.000 for 5%)
type:
- string
- 'null'
format: decimal
min_amount:
title: Min amount
description: Minimum dollar floor for percentage deductibles
type:
- string
- 'null'
format: decimal
max_amount:
title: Max amount
description: Maximum dollar cap for percentage deductibles
type:
- string
- 'null'
format: decimal
CoverageFee:
required:
- fee_type
- amount
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
fee_type:
title: Fee type
type: string
enum:
- broker_fee
- policy_fee
- agency_fee
- surplus_lines_tax
- stamping_fee
- inspection_fee
- state_tax
- municipal_fee
- platform_fee
- surcharge
- discount
- credit
- other
amount:
title: Amount
description: Fee amount
type: string
format: decimal
description:
title: Description
description: Additional description for this fee
type: string
maxLength: 200
coverage:
title: Coverage
description: If set, fee is for this specific coverage; if null, fee is coverage-term-level
type:
- string
- 'null'
format: uuid
ValidationError:
title: Validation Error
type: object
properties:
non_field_errors:
description: List of validation errors not related to any field
type: array
items:
type: string
additionalProperties:
description: A list of error messages for each field that triggered a validation error
type: array
items:
type: string
CoverageExclusion:
required:
- name
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
name:
title: Name
description: Exclusion name (e.g., 'War and Cyber War Exclusion')
type: string
maxLength: 255
minLength: 1
description:
title: Description
description: Exclusion text or summary
type: string
coverage:
title: Coverage
description: If set, exclusion applies to this specific coverage
type:
- string
- 'null'
format: uuid
source_form:
title: Source form
description: Which form defines this exclusion (null for base policy exclusions)
type:
- string
- 'null'
format: uuid
CoverageTerm:
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
reference_number:
title: Reference number
type: string
maxLength: 100
source:
title: Source
description: Source of the coverage term (e.g., 'herald', 'email', 'manual')
type: string
maxLength: 50
coverages:
type: array
items:
$ref: '#/components/schemas/Coverage'
readOnly: true
fees:
type: array
items:
$ref: '#/components/schemas/CoverageFee'
readOnly: true
forms:
type: array
items:
$ref: '#/components/schemas/CoverageForm'
readOnly: true
exclusions:
type: array
items:
$ref: '#/components/schemas/CoverageExclusion'
readOnly: true
sub_limits:
type: array
items:
$ref: '#/components/schemas/CoverageSubLimit'
readOnly: true
created_at:
title: Created at
type: string
format: date-time
readOnly: true
CoverageType:
required:
- name
- code
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
name:
title: Name
type: string
maxLength: 255
minLength: 1
code:
title: Code
description: Short code (e.g., CYB, GL, PROP, AUTO, WC).
type: string
maxLength: 100
minLength: 1
is_active:
title: Is active
type: boolean
description:
title: Description
type: string
logo:
title: Logo
type:
- string
- 'null'
readOnly: true
format: uri
CoverageForm:
required:
- form_name
type: object
properties:
id:
title: Id
type: string
format: uuid
readOnly: true
form_number:
title: Form number
description: Form number (e.g., 'XSV 03 10 23', 'AB-CYB-121')
type: string
maxLength: 50
form_name:
title: Form name
description: Form name (e.g., 'War and State Cyber Exclusion')
type: string
maxLength: 255
minLength: 1
edition_date:
title: Edition date
description: Edition date as raw text from PDF (format varies)
type: string
maxLength: 20
category:
title: Category
type: string
enum:
- exclusion
- endorsement
- condition
- schedule
- regulatory
- other
description:
title: Description
description: Body text or notes about this form
type: string
order:
title: Order
type: integer
maximum: 32767
minimum: 0
coverage:
title: Coverage
description: If set, form applies to this specific coverage
type:
- string
- 'null'
format: uuid
CoverageFeeWrite:
required:
- fee_type
- amount
type: object
properties:
fee_type:
title: Fee type
type: string
enum:
- broker_fee
- policy_fee
- agency_fee
- surplus_lines_tax
- stamping_fee
- inspection_fee
- state_tax
- municipal_fee
- platform_fee
- surcharge
- discount
- credit
- other
amount:
title: Amount
description: Fee amount
type: string
format: decimal
description:
title: Description
description: Additional description for this fee
type: string
maxLength: 200
GenericError:
title: Generic API Error
required:
- detail
type: object
properties:
detail:
description: Error details
type: string
CoverageSubLimitWrite:
required:
- sub_limit_amount
type: object
properties:
limit_type:
title: Limit type
type: string
enum:
- sub_limit
- inner_limit
- other
sub_limit_amount:
title: Sub limit amount
description: Sub-limit amount
type: string
format: decimal
retention_amount:
title: Retention amount
description: Retention/deductible amount paired with this sub-limit
type:
- string
- 'null'
format: decimal
description:
title: Description
description: Description (e.g., 'Social Engineering', 'Computer Fraud')
type: string
maxLength: 200
CoverageLimitWrite:
required:
- limit_type
- amount
type: object
properties:
limit_type:
title: Limit type
description: Type of limit (e.g., per_occurrence, aggregate, csl, per_person)
type: string
enum:
- per_occurrence
- aggregate
- csl
- per_person
- per_accident
- each_occurrence
- products_completed_ops
- personal_advertising
- general_aggregate
- policy_limit
- other
amount:
title: Amount
description: Limit amount
type: string
format: decimal
description:
title: Description
description: Additional description for this limit
type: string
maxLength: 200
securitySchemes:
Bearer:
type: apiKey
name: Authorization
in: header
description: JWT access token. Send as `Bearer <token>` or `JWT <token>`.
ApiKey:
type: apiKey
name: Authorization
in: header
description: API key. Send as `Api-Key <key>`.
x-tagGroups:
- name: Agent runtime (v2)
tags:
- agent_runtime (v2)
- name: Analytics
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/1fort/refs/heads/main/openapi/1fort-insurance-v2-api-openapi.yml