curl --request POST \
--url https://go.aiinsurance.io/api/v1/companies/{companyId}/quotes/bind \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"quoteId": "550e8400-e29b-41d4-a716-446655440002",
"invoices": "saved"
}
'{
"policyId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"policyVersion": 123,
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"startDate": "2023-12-25",
"endDate": "2023-12-25",
"createdAt": "2023-11-07T05:31:56Z",
"primaryInsuredName": "<string>",
"primaryInsuredId": "<string>",
"policyNumber": "<string>",
"policyStartDate": {
"date": "2026-03-15",
"timezone": "America/New_York"
},
"policyEndDate": {
"date": "2026-03-15",
"timezone": "America/New_York"
},
"fullTermPricingInfo": {},
"fullTermBillingInfo": {
"lines": [
{
"invoiceType": "<string>",
"lineItem": "<string>",
"direction": "receivable",
"amount": 123
}
]
},
"fullTermPolicyRatingResult": {},
"segments": [
{
"startDate": "2023-12-25",
"endDate": "2023-12-25",
"data": {},
"transactionType": "NEW_BUSINESS"
}
]
}Bind Quote by Reference or by Value
Quote door by reference, value door by value
(Invoicing a policy). By reference,
the policy’s invoices come from the quote, which the bind’s invoices
names as on Bind Quote; by value,
they come from the request: the invoicePlan you send, or none.
Binds a policy transaction through your company’s configured Conversion
Rules, in one of two forms — discriminated by the presence of quoteId in
the body:
- By reference —
{ "quoteId": …, "invoices": … }: binds a persisted quote exactly likePOST …/quotes/{quoteId}/bind, andinvoicesworks the same:generatebuilds the invoices from the quote’s invoice settings,savedbinds the plan saved on the quote, and leaving it out binds none, refused while the quote holds a plan. It answers with the full policy-version result the transaction endpoints return instead of the bare{ policyId }. - By value —
{ "transactionType": …, "data": …, "invoicePlan": … }: the caller sends the whole change, so it sends theinvoicePlantoo, or none. Nothing is inferred. It binds an unpersisted Quote field bag — typically one returned byPOST …/quotes/generateand edited client-side. No Quote row is created or linked; the transaction lands directly on the policy plane.
What produces the policy writes. Your company’s
(QUOTE_TO_POLICY, transactionType) Conversion Rules are evaluated
server-side over { source: data, transaction }. NEW_BUSINESS and
RENEW bind the converted bag as the new policy payload; ENDORSE diffs
the converted destinations against the segment in force at
effectiveDate — a destination no rule writes is left untouched. CANCEL
and REINSTATE are lifecycle transactions: the platform derives their
pricing itself. With invoicing enabled they store
data.fullTermBillingInfo as sent (see Billing with invoicing
enabled below); otherwise a data payload changes nothing beyond the
framework rows.
Required policy fields come from the quote data. A policy field that
no rule writes and no policy calculation fills has no value after the
bind. A required policy field, such as policyNumber, therefore reaches
the policy one of two ways: the Quote data carries a value that a rule
copies, or your configuration calculates it at bind (for example, from a
policy-number sequence). Export your configuration to see which applies to
each field. When neither supplies a value, the bind returns
400 InvalidEntityShape naming the field (for example,
'policyNumber' is required but null). By value, include the value in
data under the Quote field the rule reads (data.policyNumber for a rule
that copies source.policyNumber). By reference, set it on the quote with
Update Entity
(PATCH …/entities/quote/{quoteId}) before you bind.
The server stores nothing between generate and bind. There is no draft
session, token, or receipt. expectedPolicyVersion — echo it from
generate’s sourcePolicy.policyVersion — is the ONLY precondition: when it
is stated and the source policy’s version has moved, the bind is refused
with 409 PolicyVersionConflict without performing the transaction.
Consequently a duplicated by-value NEW_BUSINESS bind mints a second
policy, exactly as a duplicated create-then-bind does today; deduplicate on
your side or bind new business by reference.
Per-type field rules (by value). policyId and effectiveDate are
required for every type except NEW_BUSINESS, which forbids them (its term
comes from the bag’s own policyStartDate / policyEndDate). endDate is
an ENDORSE-only optional window end. expectedPolicyVersion is forbidden
for NEW_BUSINESS (no source policy to name).
Checks. The quoteId form runs the same checks as
…/{quoteId}/bind. The by-value form keeps its existing transaction
validation and financial-integrity rules; it creates no Quote resource.
Invoices. By reference, invoices works exactly as on
…/{quoteId}/bind, with the same refusals, and the form takes no
invoicePlan: put a plan you wrote on the quote first with
Attach Quote Invoice Plan.
By value, invoicePlan is the plan the policy transactions take, which
Invoice plans describes; it
commits atomically with the policy version, and a change that moves the
billing an invoiced policy’s invoices add up to needs one. The by-value
form takes no invoices. Either form’s invoices require invoicing to be
enabled (otherwise 403 finv2-policy-invoicing-disabled).
Both forms use the company’s explicitly authored Conversion Rules.
Billing with invoicing enabled. Stores the quote’s or caller’s billing as stated,
without scaling, restoring or carrying billing from the policy. A billed term must
restate fullTermBillingInfo on ENDORSE, CANCEL and REINSTATE; omission or unstated
billing returns 400 finv2-policy-billing-required. A change that voids every active
invoice while any billing line still owes returns 400 finv2-policy-invoices-required.
New terms and unbilled policies may have no billing. An uninvoiced policy may bind
with billing and no invoices; existing invoices must still add up to it, as
Invoice plans explains.
Billing with invoicing disabled. The policy stores null billing. A
non-null fullTermBillingInfo in the by-value data, malformed or not, or
held by the quote bound by reference, is refused with
403 finv2-policy-invoicing-disabled, and nothing is saved: send null or
leave it out. Companies awaiting their billing migration keep their
existing derivation and carry behavior while invoicing is disabled.
Required permission: quote.bind
curl --request POST \
--url https://go.aiinsurance.io/api/v1/companies/{companyId}/quotes/bind \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"quoteId": "550e8400-e29b-41d4-a716-446655440002",
"invoices": "saved"
}
'{
"policyId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"policyVersion": 123,
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"startDate": "2023-12-25",
"endDate": "2023-12-25",
"createdAt": "2023-11-07T05:31:56Z",
"primaryInsuredName": "<string>",
"primaryInsuredId": "<string>",
"policyNumber": "<string>",
"policyStartDate": {
"date": "2026-03-15",
"timezone": "America/New_York"
},
"policyEndDate": {
"date": "2026-03-15",
"timezone": "America/New_York"
},
"fullTermPricingInfo": {},
"fullTermBillingInfo": {
"lines": [
{
"invoiceType": "<string>",
"lineItem": "<string>",
"direction": "receivable",
"amount": 123
}
]
},
"fullTermPolicyRatingResult": {},
"segments": [
{
"startDate": "2023-12-25",
"endDate": "2023-12-25",
"data": {},
"transactionType": "NEW_BUSINESS"
}
]
}Authorizations
API key authentication. Send your raw API key as the Authorization header value with NO scheme prefix — Authorization: YOUR-API-KEY. Do NOT prefix it with Bearer or ApiKey, and do not use an X-API-Key header; those are not accepted.
Path Parameters
Company identifier
Body
- Bind by reference
- Bind by value
The persisted quote to bind.
Which of the quote's invoices the bind applies: generate
builds them from the quote's invoice settings, saved
binds the plan saved on the quote. Omit it to bind none;
that is refused with 409 while the quote holds a plan.
generate, saved Response
The transaction was bound. Returns the full policy-version result — the same shape the five transaction endpoints return.
Response returned by policy transaction endpoints. Contains the policy version produced by the transaction, including all derived segments.
Policy identifier
Sequential version number produced by this transaction
Identifier of the transaction that produced this version
Policy term start date (ISO 8601)
Policy term end date (ISO 8601)
When the transaction was created (ISO 8601)
Plain-text primary-insured name, read from the policy's own
primaryInsuredName field — the source of truth for the primary insured.
Reported as of the END of
the term, so a policy whose insured changed mid-term returns the later name;
segments[] carries the per-segment history. Null only when the version
carries no policy data.
Id of the entity behind primaryInsuredName. Null when the policy's
configuration does not populate it.
The policy number, read from the policy's own policyNumber field — the
source of truth, invariant across the whole term. Null only when the version
carries no policy data.
Policy term start date as the structured date object, read from the policy's
own policyStartDate field — the source of truth, invariant across the whole
term. This is not startDate above: that is the ISO
span this version covers, which a cancellation makes shorter than the term.
Null only when the version carries no policy data.
Show child attributes
Show child attributes
Policy term end date as the structured date object, read from the policy's own
policyEndDate field — the source of truth, invariant across the whole term.
This is not endDate above: that is the ISO
span this version covers. Null only when the version carries no policy data.
Show child attributes
Show child attributes
The policy's full-term pricing contract, hoisted as a read-once convenience
(also duplicated in every segment): pricingComponents plus the four
server-computed, read-only rollups — premium, taxes and fees (each
the sum of the components whose classification reports into it) and
total (premium + taxes + fees). All four
are always present. The retired brokerCommission / programCommission
rollups are no longer computed; a version stored before their retirement
may still return the two keys until the per-tenant data sweeps.
Each newly written component carries
{label, value, classification, qualifier, earningSchedule} —
<classification, qualifier> is its identity, and label is cosmetic.
The legacy vocabulary is retired: a component stored before the
retirement may still echo the group / kind / earningBasis keys
until the per-tenant data sweeps remove them — treat those as historical
output, never as identity, and do not rely on their presence.
The policy's Billing Aggregate for the term, hoisted as a read-once convenience (also duplicated in every segment). Null when the policy states no billing obligations.
Show child attributes
Show child attributes
Derived canonical policy-level rating result for the full term, hoisted as a
read-once convenience (also duplicated in every segment). Element-level rating
output (crossSegmentRatingOutputs) stays inline at its host and is not hoisted.
Derived segments for this policy version. Each segment represents a maximal contiguous date range where policy state is identical. Adjacent segments with identical data are automatically merged.
Show child attributes
Show child attributes
