Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE
transaction: change coverages, limits, insureds or other field values from a
date, and restate the premium and billing when the price moves. Use it when
you already hold the change; to endorse through a quote, generate the draft
with Generate Quote from Policy (Stateless) (generateQuote) and
transactionType: ENDORSE. A cancelled policy takes no endorsement until
Reinstate Policy Transaction (reinstatePolicyTransaction) brings it back.
Value door (Invoicing a policy). The
policy’s invoices change only as the request says: the invoicePlan you
send voids the invoices it names and creates new ones, committed with the
policy version, and without one every invoice stays as it is.
Applies an ENDORSE transaction to an existing policy. An endorsement carries one
or more of five channels. The engine recomputes segments after applying every
channel — adjacent segments with identical data are automatically merged — and the
response includes the full resulting segment set.
A cancelled policy takes no endorsement. Cancel and reinstate only switch a
policy off and on; every other change is an endorsement. A policy whose latest
version carries a cancellation, whether it has taken effect or is still to come,
is refused with 409 PolicyCancelled until it is reinstated. To change a policy
and cancel it, endorse it and then cancel it; to reinstate it with changes,
reinstate it and then endorse it.
An endorsement does not switch a policy off or on.policy.policyStatus and
policy.cancellationEffectiveOnDate are owned by the platform: only
Cancel Policy Transaction
and Reinstate Policy Transaction
change them. A delta that would change either one, directly or inside a whole-policy
Overwrite, is refused with 400 SystemOwnedPolicyValue, and nothing is saved. A delta
that restates the value the policy holds is accepted and dropped, so a whole policy
object read and sent back still endorses; a whole-policy Overwrite that leaves them
out keeps them.
A delta under a calculated field is not applied. The configuration
calculates such a field (Get Policy Configuration marks it readOnly and
x-calculated), so the endorsement drops the delta and still succeeds. The
response lists each one in ignoredDeltas, with derivedFrom, the Policy
fields the calculation reads: write those instead. A property schedule built
from the policy’s exposures, for example, changes when you add an exposure to
policy.exposures.
Input channel:
deltas — changes to policy field data. Each carries its own
startDate / endDate within the policy term, a path, an action
(Add / Remove / Overwrite), and a value.
Amending the term. Shortening a term is a deltas write to the ROOT
policy.policyEndDate (or policy.policyStartDate) stating the whole term as
its window. There is no separate policy-info channel — the retired fullTermDeltas
container channel was removed once the root fields became the single writable
source.
Whole-term policy fields. Four ROOT paths hold values that are invariant across
the policy term — policy.policyNumber, policy.policyStartDate,
policy.policyEndDate and policy.previousPolicy. A delta on deltas that touches
one of them (at any depth, and including an ancestor path such as a whole-policy
Overwrite) must state the whole term as its window (startDate = the policy start,
endDate = the policy end) or the write is rejected.
A term bound may not move outward, through either input channel and at any path
depth: moving policyEndDate later or policyStartDate earlier is rejected
(TermLengtheningNotSupported), because no endorsement path can create the extra days.
Date values. A deltas value written to a Date field — at any depth, including a
Date nested inside a custom object or an embedded exposure — must be the canonical
{ date: "YYYY-MM-DD", timezone } object (the Fmv1Date schema) with both members
stated. Delta values are stored exactly as sent, so this channel never converts: the
retired { day, month, year, timezone } spelling is refused (400, InvalidDelta),
and so is a write to a single member of a Date (policy.policyEndDate.year) — a Date
is written whole.
Derived channels (additive on either input channel):
fullTermPricingInfo — whole-object overwrite of the policy-root pricing
contract. Supply pricingComponents (each
{label, value, classification[, qualifier, earningSchedule]} — every component
must name a live classification from your company’s classification registry);
the four rollups (premium, taxes, fees, total) are computed by the
platform from the components — any caller-supplied rollup value is ignored and
recomputed.
fullTermBillingInfo — whole-object overwrite of the policy-root Billing
Aggregate: { lines: [{ invoiceType, lineItem, direction, amount }] }, the
term’s billing obligations free of invoices, with no rollup and no classification.
An endorsement that moves the price must restate these lines: a stated
aggregate’s receivable lines must sum to
fullTermPricingInfo.total, so moving the price without restating them is refused.
fullTermPolicyRatingResult — whole-object overwrite of the policy-root canonical
rating result (the twin of fullTermPricingInfo).
crossSegmentRatingOutputs — element-level rating output, [{ path, value }]. Each
path terminates at a crossSegmentRatingOutputs container on a list element (or the
policy); value is the whole rating-output object for that host. There is no action
(always an Overwrite) and no dates — the server derives each write’s range from the
host’s presence across segments, so it applies cleanly to part-term hosts.
At least one channel is required. Any of deltas,
fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult or
crossSegmentRatingOutputs satisfies it, so an endorsement that restates
only the Billing Aggregate is a legal transaction on its own.
Path syntax — predicate addressing. Index into a list by a predicate on any field:
policy.exposures[id = '<uuid>'].bedCount,
policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']. The predicate must
resolve to exactly one element wherever it is applied (throws on zero or multiple
matches) — this uniqueness rule is the cross-segment identity guarantee.
Policy invoices.invoicePlan is an
invoice plan: nothing in it is
defaulted or inferred. Once active invoices exist, a change that moves the
billing they add up to must carry a plan, so kept and new invoices add up
to the new billing; without one it is refused with
422 finv2-policy-restates-invoices. The version and invoices commit
atomically.
Billing. Stores the caller’s billing as stated, without
scaling, restoring or carrying billing from the policy: billing you leave out stores
none. To keep a billed policy’s billing, state fullTermBillingInfo again, changed or
unchanged. Kept and new invoices must still add up to the billing, as
Invoice plans explains.
The policy’s layer. A policy sits at a layer of its
pricing stack, read from its pricing, its
billing and its active invoices. An endorsement keeps the
policy at its layer unless pricingStackLayerChange names the move it makes:
leaving out fullTermBillingInfo on a billed policy drops its billing, a move from
billing to pricing;
stating billing on a policy that has none moves it from pricing to billing;
an invoicePlan that voids every active invoice moves the policy down from
invoicing, and one that gives it its first invoices moves it up to invoicing.
A plan that voids every active invoice and creates none needs no billing, so one
endorsement can take an invoiced policy to pricing with
pricingStackLayerChange: {"from": "invoicing", "to": "pricing"}.
A move the request does not name, or a named move it does not make, returns
422 policy-pricing-stack-layer-change and saves nothing; its message names the actual move
and the exact pricingStackLayerChange that would name it. Billing that owes nothing sits at
both billing and invoicing, so a change between those two needs no pricingStackLayerChange.
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.
Headers
Idempotency-Key
string
A unique key of 1 to 255 printable ASCII characters for retrying this write. Within 30 days of the successful attempt's admission, reuse with the same request returns the original transaction; retries do not extend that window. After 30 days the same key runs as a new write, even if the request differs.
Required string length: 1 - 255
Path Parameters
companyId
string<uuid>
required
Company identifier
policyId
string<uuid>
required
Policy identifier
Body
application/json
effectiveDate
string<date>
required
The effective date of the endorsement in ISO 8601 format. It must fall
within the policy term.
transactionTimestamp
string<date-time>
When the business decision was made. Defaults to the current time if omitted.
Set explicitly for imports (e.g., aligning to a bordereau booking date).
displayAuthor
string
Optional user-visible author label (trimmed; must be non-empty). When set, the transaction is displayed as filed by this label (e.g. "Data Import") instead of the acting user; audit attribution (createdBy) stays server-set.
Maximum string length: 255
deltas
object[]
Policy-data deltas. Each delta specifies a date range (startDate /
endDate) within the policy term, a predicate path, an action
(Add / Remove / Overwrite), and the new value. Paths must not contain any
reserved full-term container (fullTermPricingInfo,
fullTermBillingInfo, fullTermPolicyRatingResult,
crossSegmentRatingOutputs) — those have
their own channel. A delta on one of the four whole-term ROOT paths
(policy.policyNumber, policy.policyStartDate, policy.policyEndDate,
policy.previousPolicy) must span the whole term. A delta that would change
policy.policyStatus or policy.cancellationEffectiveOnDate is refused with
400 SystemOwnedPolicyValue: cancel and reinstate through their own
transactions.
Show child attributes
fullTermPricingInfo
object
Optional whole-object overwrite of the policy-root full-term pricing
contract. Supply pricingComponents (each
{label, value, classification[, qualifier, earningSchedule]};
label a string, value a plain number, classification a key naming
a LIVE entry in your company's classification registry — required on
every component, for every company; qualifier defaults to "" and
earningSchedule — pro-rata or immediate — defaults to
pro-rata). The four rollups (premium, taxes, fees, total)
are computed by the platform from the components' classifications;
caller-supplied rollup values are ignored and recomputed. Additive on
either input channel. The full component contract and its refusals
(400, InvalidFieldModelV1Data on this endpoint) are spelled out on
the New Business Transaction endpoint.
The retired legacy fields (group/kind/earningBasis) are ignored
and discarded on input — never validated, never stored on a newly
written component — so a stored component that still echoes them can be
posted back unchanged.
fullTermBillingInfo
object
Optional whole-object overwrite of the policy-root Billing Aggregate —
the term's billing obligations per line item, free of invoices. Additive
on either input channel. Leaving it out stores no
billing, so a billed policy's billing is dropped unless you state it again;
dropping it is a layer move that needs pricingStackLayerChange. Its receivable total
must match fullTermPricingInfo.total.
Show child attributes
fullTermPolicyRatingResult
object
Optional whole-object overwrite of the policy-root canonical rating result.
The twin of fullTermPricingInfo; additive on either input channel.
crossSegmentRatingOutputs
object[]
Optional element-level rating output. Each entry overwrites the
crossSegmentRatingOutputs container at its host; the server derives the write
range from the host's presence across segments (write where the host-selector
resolves to exactly one element, skip where zero, throw on many or if it never
resolves). Additive; ENDORSE only.
Show child attributes
invoicePlan
object
A fully explicit, detached policy-invoice batch. Existing invoices not named in voidInvoices are kept. The complete kept-plus-created set must conserve each line item of the policy's stated billing. A line item a kept invoice carries but billing omits conserves at 0: a create may credit it on the same line with a negative amount. A plan never names a move between layers of the pricing stack: a policy transaction or bind by value names its own beside the plan in pricingStackLayerChange, and a quote's plan binds at the quote's intended layer. Invoice plans explains each field, the rule and every refusal.
Show child attributes
pricingStackLayerChange
object
The move between layers of the pricing stack this endorsement makes,
when it makes one. Leave it out to keep the policy at its layer.
Show child attributes
Response
Endorsement applied successfully
Response returned by policy transaction endpoints. Contains the policy version
produced by the transaction, including all derived segments.
policyId
string<uuid>
required
Policy identifier
policyVersion
integer
required
Sequential version number produced by this transaction
transactionId
string<uuid>
required
Identifier of the transaction that produced this version
startDate
string<date>
required
Policy term start date (ISO 8601)
endDate
string<date>
required
Policy term end date (ISO 8601)
createdAt
string<date-time>
required
When the transaction was created (ISO 8601)
primaryInsuredName
string | null
required
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.
primaryInsuredId
string | null
required
Id of the entity behind primaryInsuredName. Null when the policy's
configuration does not populate it.
policyNumber
string | null
required
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.
policyStartDate
object | null
required
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 notstartDate 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
policyEndDate
object | null
required
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 notendDate above: that is the ISO
span this version covers. Null only when the version carries no policy data.
Show child attributes
fullTermPricingInfo
object | null
required
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.
fullTermBillingInfo
object | null
required
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
fullTermPolicyRatingResult
object | null
required
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.
segments
object[]
required
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
ignoredDeltas
object[]
Present when the endorsement dropped deltas under a calculated or system-managed Policy field. Each names the delta's path and, for a calculated field, derivedFrom: the Policy fields to write instead. A replay with the same Idempotency-Key returns the saved version without it.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"AI Insurance","colors":{"primary":"#714CC5","light":"#D3BFFF","dark":"#A887F3"},"logo":{"light":"https://mintcdn.com/ai-insurance-fmv1/HtPQvD-FDA5nbM7L/logo/dark.jpg?fit=max\u0026auto=format\u0026n=HtPQvD-FDA5nbM7L\u0026q=85\u0026s=14ace86d6e87c6eab47960c514760266","dark":"https://mintcdn.com/ai-insurance-fmv1/HtPQvD-FDA5nbM7L/logo/dark.jpg?fit=max\u0026auto=format\u0026n=HtPQvD-FDA5nbM7L\u0026q=85\u0026s=14ace86d6e87c6eab47960c514760266","href":"https://go.aiinsurance.io"},"favicon":"https://mintcdn.com/ai-insurance-fmv1/HtPQvD-FDA5nbM7L/logo/dark.jpg?fit=max\u0026auto=format\u0026n=HtPQvD-FDA5nbM7L\u0026q=85\u0026s=14ace86d6e87c6eab47960c514760266","navbar":{"links":[{"href":"mailto:support@aiinsurance.io","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://go.aiinsurance.io"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/a-i-insurance-inc"}},"seo":{"metatags":{"canonical":"https://docs.go.aiinsurance.io"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ai-insurance-fmv1","hasAudioNarration":false,"actualSubdomain":"ai-insurance-fmv1","customDomains":["docs.go.aiinsurance.io"],"gitSource":{"type":"github","owner":"ai-insurance","repo":"docs-mirror","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":"","_id":"6af4b096ee8edba08e00c669"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af7498e75f3e5c02082a680","clientVersion":"0.0.4131","searchFilterCounts":[{"language":"default","tag":"API","count":244},{"language":"default","tag":"Financials","count":94},{"language":"default","tag":"App","count":35},{"language":"default","tag":"Policy Transactions","count":34},{"language":"default","tag":"Company Files","count":28},{"language":"default","tag":"Entities","count":25},{"language":"default","tag":"Record Emails","count":23},{"language":"default","tag":"Configuration","count":23},{"language":"default","tag":"Forms","count":18},{"language":"default","tag":"Guides","count":18}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/field-model-policy-transactions/endorse-policy-transaction","slug":"/api-reference/field-model-policy-transactions/endorse-policy-transaction","pageMetadata":{"title":"Endorse Policy Transaction","description":"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE\ntransaction: change coverages, limits, insureds or other field values from a\ndate, and restate the premium and billing when the price moves. Use it when\nyou already hold the change; to endorse through a quote, generate the draft\nwith Generate Quote from Policy (Stateless) (`generateQuote`) and\n`transactionType: ENDORSE`. A cancelled policy takes no endorsement until\nReinstate Policy Transaction (`reinstatePolicyTransaction`) brings it back.\n\n**Value door** ([Invoicing a policy](/api-reference/invoicing/overview)). The\npolicy's invoices change only as the request says: the `invoicePlan` you\nsend voids the invoices it names and creates new ones, committed with the\npolicy version, and without one every invoice stays as it is.\n\nApplies an ENDORSE transaction to an existing policy. An endorsement carries one\nor more of **five channels**. The engine recomputes segments after applying every\nchannel — adjacent segments with identical data are automatically merged — and the\nresponse includes the full resulting segment set.\n\n**A cancelled policy takes no endorsement.** Cancel and reinstate only switch a\npolicy off and on; every other change is an endorsement. A policy whose latest\nversion carries a cancellation, whether it has taken effect or is still to come,\nis refused with `409 PolicyCancelled` until it is reinstated. To change a policy\nand cancel it, endorse it and then cancel it; to reinstate it with changes,\nreinstate it and then endorse it.\n\n**An endorsement does not switch a policy off or on.** `policy.policyStatus` and\n`policy.cancellationEffectiveOnDate` are owned by the platform: only\n[Cancel Policy Transaction](/api-reference/field-model-policy-transactions/cancel-policy-transaction)\nand [Reinstate Policy Transaction](/api-reference/field-model-policy-transactions/reinstate-policy-transaction)\nchange them. A delta that would change either one, directly or inside a whole-`policy`\nOverwrite, is refused with `400 SystemOwnedPolicyValue`, and nothing is saved. A delta\nthat restates the value the policy holds is accepted and dropped, so a whole policy\nobject read and sent back still endorses; a whole-`policy` Overwrite that leaves them\nout keeps them.\n\n**A delta under a calculated field is not applied.** The configuration\ncalculates such a field (Get Policy Configuration marks it `readOnly` and\n`x-calculated`), so the endorsement drops the delta and still succeeds. The\nresponse lists each one in `ignoredDeltas`, with `derivedFrom`, the Policy\nfields the calculation reads: write those instead. A property schedule built\nfrom the policy's exposures, for example, changes when you add an exposure to\n`policy.exposures`.\n\n**Input channel:**\n\n- **`deltas`** — changes to policy field data. Each carries its own\n `startDate` / `endDate` within the policy term, a `path`, an `action`\n (Add / Remove / Overwrite), and a `value`.\n\n**Amending the term.** Shortening a term is a `deltas` write to the ROOT\n`policy.policyEndDate` (or `policy.policyStartDate`) stating the **whole term** as\nits window. There is no separate policy-info channel — the retired `fullTermDeltas`\ncontainer channel was removed once the root fields became the single writable\nsource.\n\n**Whole-term policy fields.** Four ROOT paths hold values that are invariant across\nthe policy term — `policy.policyNumber`, `policy.policyStartDate`,\n`policy.policyEndDate` and `policy.previousPolicy`. A delta on `deltas` that touches\none of them (at any depth, and including an ancestor path such as a whole-`policy`\nOverwrite) must state the **whole term** as its window (`startDate` = the policy start,\n`endDate` = the policy end) or the write is rejected.\n\n**A term bound may not move outward**, through either input channel and at any path\ndepth: moving `policyEndDate` later or `policyStartDate` earlier is rejected\n(`TermLengtheningNotSupported`), because no endorsement path can create the extra days.\n\n**Date values.** A `deltas` value written to a `Date` field — at any depth, including a\nDate nested inside a custom object or an embedded exposure — must be the canonical\n`{ date: \"YYYY-MM-DD\", timezone }` object (the `Fmv1Date` schema) with **both** members\nstated. Delta values are stored exactly as sent, so this channel never converts: the\nretired `{ day, month, year, timezone }` spelling is refused (`400`, `InvalidDelta`),\nand so is a write to a single member of a Date (`policy.policyEndDate.year`) — a Date\nis written whole.\n\n**Derived channels (additive on either input channel):**\n\n- **`fullTermPricingInfo`** — whole-object overwrite of the policy-root pricing\n contract. Supply `pricingComponents` (each\n `{label, value, classification[, qualifier, earningSchedule]}` — every component\n must name a live `classification` from your company's classification registry);\n the four rollups (`premium`, `taxes`, `fees`, `total`) are computed by the\n platform from the components — any caller-supplied rollup value is ignored and\n recomputed.\n- **`fullTermBillingInfo`** — whole-object overwrite of the policy-root Billing\n Aggregate: `{ lines: [{ invoiceType, lineItem, direction, amount }] }`, the\n term's billing obligations free of invoices, with no rollup and no classification.\n An endorsement that moves the price must restate these lines: a stated\n aggregate's `receivable` lines must sum to\n `fullTermPricingInfo.total`, so moving the price without restating them is refused.\n- **`fullTermPolicyRatingResult`** — whole-object overwrite of the policy-root canonical\n rating result (the twin of `fullTermPricingInfo`).\n- **`crossSegmentRatingOutputs`** — element-level rating output, `[{ path, value }]`. Each\n `path` terminates at a `crossSegmentRatingOutputs` container on a list element (or the\n policy); `value` is the whole rating-output object for that host. There is no action\n (always an Overwrite) and no dates — the server derives each write's range from the\n host's presence across segments, so it applies cleanly to part-term hosts.\n\nAt least one channel is required. Any of `deltas`,\n`fullTermPricingInfo`, `fullTermBillingInfo`, `fullTermPolicyRatingResult` or\n`crossSegmentRatingOutputs` satisfies it, so an endorsement that restates\nonly the Billing Aggregate is a legal transaction on its own.\n\n**Path syntax — predicate addressing.** Index into a list by a predicate on any field:\n`policy.exposures[id = '\u003cuuid>'].bedCount`,\n`policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']`. The predicate must\nresolve to **exactly one** element wherever it is applied (throws on zero or multiple\nmatches) — this uniqueness rule is the cross-segment identity guarantee.\n\n**Policy invoices.** `invoicePlan` is an\n[invoice plan](/api-reference/invoicing/invoice-plans): nothing in it is\ndefaulted or inferred. Once active invoices exist, a change that moves the\nbilling they add up to must carry a plan, so kept and new invoices add up\nto the new billing; without one it is refused with\n`422 finv2-policy-restates-invoices`. The version and invoices commit\natomically.\n\n**Billing.** Stores the caller's billing as stated, without\nscaling, restoring or carrying billing from the policy: billing you leave out stores\nnone. To keep a billed policy's billing, state `fullTermBillingInfo` again, changed or\nunchanged. Kept and new invoices must still add up to the billing, as\n[Invoice plans](/api-reference/invoicing/invoice-plans) explains.\n\n**The policy's layer.** A policy sits at a layer of its\n[pricing stack](/api-reference/invoicing/pricing-stack), read from its pricing, its\nbilling and its active invoices. An endorsement keeps the\npolicy at its layer unless `pricingStackLayerChange` names the move it makes:\n\n- leaving out `fullTermBillingInfo` on a billed policy drops its billing, a move from\n `billing` to `pricing`;\n- stating billing on a policy that has none moves it from `pricing` to `billing`;\n- an `invoicePlan` that voids every active invoice moves the policy down from\n `invoicing`, and one that gives it its first invoices moves it up to `invoicing`.\n A plan that voids every active invoice and creates none needs no billing, so one\n endorsement can take an invoiced policy to `pricing` with\n `pricingStackLayerChange: {\"from\": \"invoicing\", \"to\": \"pricing\"}`.\n\nA move the request does not name, or a named move it does not make, returns\n`422 policy-pricing-stack-layer-change` and saves nothing; its message names the actual move\nand the exact `pricingStackLayerChange` that would name it. Billing that owes nothing sits at\nboth `billing` and `invoicing`, so a change between those two needs no `pricingStackLayerChange`.\n\n**Required permission:** `policy.endorse`\n","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/transaction/endorse","href":"/api-reference/field-model-policy-transactions/endorse-policy-transaction","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n a: \"a\",\n code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE\\ntransaction: change coverages, limits, insureds or other field values from a\\ndate, and restate the premium and billing when the price moves. Use it when\\nyou already hold the change; to endorse through a quote, generate the draft\\nwith Generate Quote from Policy (Stateless) (\", _jsx(_components.code, {\n children: \"generateQuote\"\n }), \") and\\n\", _jsx(_components.code, {\n children: \"transactionType: ENDORSE\"\n }), \". A cancelled policy takes no endorsement until\\nReinstate Policy Transaction (\", _jsx(_components.code, {\n children: \"reinstatePolicyTransaction\"\n }), \") brings it back.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Value door\"\n }), \" (\", _jsx(_components.a, {\n href: \"/api-reference/invoicing/overview\",\n children: \"Invoicing a policy\"\n }), \"). The\\npolicy’s invoices change only as the request says: the \", _jsx(_components.code, {\n children: \"invoicePlan\"\n }), \" you\\nsend voids the invoices it names and creates new ones, committed with the\\npolicy version, and without one every invoice stays as it is.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Applies an ENDORSE transaction to an existing policy. An endorsement carries one\\nor more of \", _jsx(_components.strong, {\n children: \"five channels\"\n }), \". The engine recomputes segments after applying every\\nchannel — adjacent segments with identical data are automatically merged — and the\\nresponse includes the full resulting segment set.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"A cancelled policy takes no endorsement.\"\n }), \" Cancel and reinstate only switch a\\npolicy off and on; every other change is an endorsement. A policy whose latest\\nversion carries a cancellation, whether it has taken effect or is still to come,\\nis refused with \", _jsx(_components.code, {\n children: \"409 PolicyCancelled\"\n }), \" until it is reinstated. To change a policy\\nand cancel it, endorse it and then cancel it; to reinstate it with changes,\\nreinstate it and then endorse it.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"An endorsement does not switch a policy off or on.\"\n }), \" \", _jsx(_components.code, {\n children: \"policy.policyStatus\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"policy.cancellationEffectiveOnDate\"\n }), \" are owned by the platform: only\\n\", _jsx(_components.a, {\n href: \"/api-reference/field-model-policy-transactions/cancel-policy-transaction\",\n children: \"Cancel Policy Transaction\"\n }), \"\\nand \", _jsx(_components.a, {\n href: \"/api-reference/field-model-policy-transactions/reinstate-policy-transaction\",\n children: \"Reinstate Policy Transaction\"\n }), \"\\nchange them. A delta that would change either one, directly or inside a whole-\", _jsx(_components.code, {\n children: \"policy\"\n }), \"\\nOverwrite, is refused with \", _jsx(_components.code, {\n children: \"400 SystemOwnedPolicyValue\"\n }), \", and nothing is saved. A delta\\nthat restates the value the policy holds is accepted and dropped, so a whole policy\\nobject read and sent back still endorses; a whole-\", _jsx(_components.code, {\n children: \"policy\"\n }), \" Overwrite that leaves them\\nout keeps them.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"A delta under a calculated field is not applied.\"\n }), \" The configuration\\ncalculates such a field (Get Policy Configuration marks it \", _jsx(_components.code, {\n children: \"readOnly\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"x-calculated\"\n }), \"), so the endorsement drops the delta and still succeeds. The\\nresponse lists each one in \", _jsx(_components.code, {\n children: \"ignoredDeltas\"\n }), \", with \", _jsx(_components.code, {\n children: \"derivedFrom\"\n }), \", the Policy\\nfields the calculation reads: write those instead. A property schedule built\\nfrom the policy’s exposures, for example, changes when you add an exposure to\\n\", _jsx(_components.code, {\n children: \"policy.exposures\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Input channel:\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"deltas\"\n })\n }), \" — changes to policy field data. Each carries its own\\n\", _jsx(_components.code, {\n children: \"startDate\"\n }), \" / \", _jsx(_components.code, {\n children: \"endDate\"\n }), \" within the policy term, a \", _jsx(_components.code, {\n children: \"path\"\n }), \", an \", _jsx(_components.code, {\n children: \"action\"\n }), \"\\n(Add / Remove / Overwrite), and a \", _jsx(_components.code, {\n children: \"value\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Amending the term.\"\n }), \" Shortening a term is a \", _jsx(_components.code, {\n children: \"deltas\"\n }), \" write to the ROOT\\n\", _jsx(_components.code, {\n children: \"policy.policyEndDate\"\n }), \" (or \", _jsx(_components.code, {\n children: \"policy.policyStartDate\"\n }), \") stating the \", _jsx(_components.strong, {\n children: \"whole term\"\n }), \" as\\nits window. There is no separate policy-info channel — the retired \", _jsx(_components.code, {\n children: \"fullTermDeltas\"\n }), \"\\ncontainer channel was removed once the root fields became the single writable\\nsource.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Whole-term policy fields.\"\n }), \" Four ROOT paths hold values that are invariant across\\nthe policy term — \", _jsx(_components.code, {\n children: \"policy.policyNumber\"\n }), \", \", _jsx(_components.code, {\n children: \"policy.policyStartDate\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"policy.policyEndDate\"\n }), \" and \", _jsx(_components.code, {\n children: \"policy.previousPolicy\"\n }), \". A delta on \", _jsx(_components.code, {\n children: \"deltas\"\n }), \" that touches\\none of them (at any depth, and including an ancestor path such as a whole-\", _jsx(_components.code, {\n children: \"policy\"\n }), \"\\nOverwrite) must state the \", _jsx(_components.strong, {\n children: \"whole term\"\n }), \" as its window (\", _jsx(_components.code, {\n children: \"startDate\"\n }), \" = the policy start,\\n\", _jsx(_components.code, {\n children: \"endDate\"\n }), \" = the policy end) or the write is rejected.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"A term bound may not move outward\"\n }), \", through either input channel and at any path\\ndepth: moving \", _jsx(_components.code, {\n children: \"policyEndDate\"\n }), \" later or \", _jsx(_components.code, {\n children: \"policyStartDate\"\n }), \" earlier is rejected\\n(\", _jsx(_components.code, {\n children: \"TermLengtheningNotSupported\"\n }), \"), because no endorsement path can create the extra days.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Date values.\"\n }), \" A \", _jsx(_components.code, {\n children: \"deltas\"\n }), \" value written to a \", _jsx(_components.code, {\n children: \"Date\"\n }), \" field — at any depth, including a\\nDate nested inside a custom object or an embedded exposure — must be the canonical\\n\", _jsx(_components.code, {\n children: \"{ date: \\\"YYYY-MM-DD\\\", timezone }\"\n }), \" object (the \", _jsx(_components.code, {\n children: \"Fmv1Date\"\n }), \" schema) with \", _jsx(_components.strong, {\n children: \"both\"\n }), \" members\\nstated. Delta values are stored exactly as sent, so this channel never converts: the\\nretired \", _jsx(_components.code, {\n children: \"{ day, month, year, timezone }\"\n }), \" spelling is refused (\", _jsx(_components.code, {\n children: \"400\"\n }), \", \", _jsx(_components.code, {\n children: \"InvalidDelta\"\n }), \"),\\nand so is a write to a single member of a Date (\", _jsx(_components.code, {\n children: \"policy.policyEndDate.year\"\n }), \") — a Date\\nis written whole.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Derived channels (additive on either input channel):\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n })\n }), \" — whole-object overwrite of the policy-root pricing\\ncontract. Supply \", _jsx(_components.code, {\n children: \"pricingComponents\"\n }), \" (each\\n\", _jsx(_components.code, {\n children: \"{label, value, classification[, qualifier, earningSchedule]}\"\n }), \" — every component\\nmust name a live \", _jsx(_components.code, {\n children: \"classification\"\n }), \" from your company’s classification registry);\\nthe four rollups (\", _jsx(_components.code, {\n children: \"premium\"\n }), \", \", _jsx(_components.code, {\n children: \"taxes\"\n }), \", \", _jsx(_components.code, {\n children: \"fees\"\n }), \", \", _jsx(_components.code, {\n children: \"total\"\n }), \") are computed by the\\nplatform from the components — any caller-supplied rollup value is ignored and\\nrecomputed.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"fullTermBillingInfo\"\n })\n }), \" — whole-object overwrite of the policy-root Billing\\nAggregate: \", _jsx(_components.code, {\n children: \"{ lines: [{ invoiceType, lineItem, direction, amount }] }\"\n }), \", the\\nterm’s billing obligations free of invoices, with no rollup and no classification.\\nAn endorsement that moves the price must restate these lines: a stated\\naggregate’s \", _jsx(_components.code, {\n children: \"receivable\"\n }), \" lines must sum to\\n\", _jsx(_components.code, {\n children: \"fullTermPricingInfo.total\"\n }), \", so moving the price without restating them is refused.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"fullTermPolicyRatingResult\"\n })\n }), \" — whole-object overwrite of the policy-root canonical\\nrating result (the twin of \", _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"crossSegmentRatingOutputs\"\n })\n }), \" — element-level rating output, \", _jsx(_components.code, {\n children: \"[{ path, value }]\"\n }), \". Each\\n\", _jsx(_components.code, {\n children: \"path\"\n }), \" terminates at a \", _jsx(_components.code, {\n children: \"crossSegmentRatingOutputs\"\n }), \" container on a list element (or the\\npolicy); \", _jsx(_components.code, {\n children: \"value\"\n }), \" is the whole rating-output object for that host. There is no action\\n(always an Overwrite) and no dates — the server derives each write’s range from the\\nhost’s presence across segments, so it applies cleanly to part-term hosts.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"At least one channel is required. Any of \", _jsx(_components.code, {\n children: \"deltas\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n }), \", \", _jsx(_components.code, {\n children: \"fullTermBillingInfo\"\n }), \", \", _jsx(_components.code, {\n children: \"fullTermPolicyRatingResult\"\n }), \" or\\n\", _jsx(_components.code, {\n children: \"crossSegmentRatingOutputs\"\n }), \" satisfies it, so an endorsement that restates\\nonly the Billing Aggregate is a legal transaction on its own.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Path syntax — predicate addressing.\"\n }), \" Index into a list by a predicate on any field:\\n\", _jsx(_components.code, {\n children: \"policy.exposures[id = '\u003cuuid>'].bedCount\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']\"\n }), \". The predicate must\\nresolve to \", _jsx(_components.strong, {\n children: \"exactly one\"\n }), \" element wherever it is applied (throws on zero or multiple\\nmatches) — this uniqueness rule is the cross-segment identity guarantee.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Policy invoices.\"\n }), \" \", _jsx(_components.code, {\n children: \"invoicePlan\"\n }), \" is an\\n\", _jsx(_components.a, {\n href: \"/api-reference/invoicing/invoice-plans\",\n children: \"invoice plan\"\n }), \": nothing in it is\\ndefaulted or inferred. Once active invoices exist, a change that moves the\\nbilling they add up to must carry a plan, so kept and new invoices add up\\nto the new billing; without one it is refused with\\n\", _jsx(_components.code, {\n children: \"422 finv2-policy-restates-invoices\"\n }), \". The version and invoices commit\\natomically.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Billing.\"\n }), \" Stores the caller’s billing as stated, without\\nscaling, restoring or carrying billing from the policy: billing you leave out stores\\nnone. To keep a billed policy’s billing, state \", _jsx(_components.code, {\n children: \"fullTermBillingInfo\"\n }), \" again, changed or\\nunchanged. Kept and new invoices must still add up to the billing, as\\n\", _jsx(_components.a, {\n href: \"/api-reference/invoicing/invoice-plans\",\n children: \"Invoice plans\"\n }), \" explains.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"The policy’s layer.\"\n }), \" A policy sits at a layer of its\\n\", _jsx(_components.a, {\n href: \"/api-reference/invoicing/pricing-stack\",\n children: \"pricing stack\"\n }), \", read from its pricing, its\\nbilling and its active invoices. An endorsement keeps the\\npolicy at its layer unless \", _jsx(_components.code, {\n children: \"pricingStackLayerChange\"\n }), \" names the move it makes:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"leaving out \", _jsx(_components.code, {\n children: \"fullTermBillingInfo\"\n }), \" on a billed policy drops its billing, a move from\\n\", _jsx(_components.code, {\n children: \"billing\"\n }), \" to \", _jsx(_components.code, {\n children: \"pricing\"\n }), \";\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"stating billing on a policy that has none moves it from \", _jsx(_components.code, {\n children: \"pricing\"\n }), \" to \", _jsx(_components.code, {\n children: \"billing\"\n }), \";\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"an \", _jsx(_components.code, {\n children: \"invoicePlan\"\n }), \" that voids every active invoice moves the policy down from\\n\", _jsx(_components.code, {\n children: \"invoicing\"\n }), \", and one that gives it its first invoices moves it up to \", _jsx(_components.code, {\n children: \"invoicing\"\n }), \".\\nA plan that voids every active invoice and creates none needs no billing, so one\\nendorsement can take an invoiced policy to \", _jsx(_components.code, {\n children: \"pricing\"\n }), \" with\\n\", _jsx(_components.code, {\n children: \"pricingStackLayerChange: {\\\"from\\\": \\\"invoicing\\\", \\\"to\\\": \\\"pricing\\\"}\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A move the request does not name, or a named move it does not make, returns\\n\", _jsx(_components.code, {\n children: \"422 policy-pricing-stack-layer-change\"\n }), \" and saves nothing; its message names the actual move\\nand the exact \", _jsx(_components.code, {\n children: \"pricingStackLayerChange\"\n }), \" that would name it. Billing that owes nothing sits at\\nboth \", _jsx(_components.code, {\n children: \"billing\"\n }), \" and \", _jsx(_components.code, {\n children: \"invoicing\"\n }), \", so a change between those two needs no \", _jsx(_components.code, {\n children: \"pricingStackLayerChange\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Required permission:\"\n }), \" \", _jsx(_components.code, {\n children: \"policy.endorse\"\n })]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Endorse Policy Transaction","description":"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE\ntransaction: change coverages, limits, insureds or other field values from a\ndate, and restate the premium and billing when the price moves. Use it when\nyou already hold the change; to endorse through a quote, generate the draft\nwith Generate Quote from Policy (Stateless) (`generateQuote`) and\n`transactionType: ENDORSE`. A cancelled policy takes no endorsement until\nReinstate Policy Transaction (`reinstatePolicyTransaction`) brings it back.\n\n**Value door** ([Invoicing a policy](/api-reference/invoicing/overview)). The\npolicy's invoices change only as the request says: the `invoicePlan` you\nsend voids the invoices it names and creates new ones, committed with the\npolicy version, and without one every invoice stays as it is.\n\nApplies an ENDORSE transaction to an existing policy. An endorsement carries one\nor more of **five channels**. The engine recomputes segments after applying every\nchannel — adjacent segments with identical data are automatically merged — and the\nresponse includes the full resulting segment set.\n\n**A cancelled policy takes no endorsement.** Cancel and reinstate only switch a\npolicy off and on; every other change is an endorsement. A policy whose latest\nversion carries a cancellation, whether it has taken effect or is still to come,\nis refused with `409 PolicyCancelled` until it is reinstated. To change a policy\nand cancel it, endorse it and then cancel it; to reinstate it with changes,\nreinstate it and then endorse it.\n\n**An endorsement does not switch a policy off or on.** `policy.policyStatus` and\n`policy.cancellationEffectiveOnDate` are owned by the platform: only\n[Cancel Policy Transaction](/api-reference/field-model-policy-transactions/cancel-policy-transaction)\nand [Reinstate Policy Transaction](/api-reference/field-model-policy-transactions/reinstate-policy-transaction)\nchange them. A delta that would change either one, directly or inside a whole-`policy`\nOverwrite, is refused with `400 SystemOwnedPolicyValue`, and nothing is saved. A delta\nthat restates the value the policy holds is accepted and dropped, so a whole policy\nobject read and sent back still endorses; a whole-`policy` Overwrite that leaves them\nout keeps them.\n\n**A delta under a calculated field is not applied.** The configuration\ncalculates such a field (Get Policy Configuration marks it `readOnly` and\n`x-calculated`), so the endorsement drops the delta and still succeeds. The\nresponse lists each one in `ignoredDeltas`, with `derivedFrom`, the Policy\nfields the calculation reads: write those instead. A property schedule built\nfrom the policy's exposures, for example, changes when you add an exposure to\n`policy.exposures`.\n\n**Input channel:**\n\n- **`deltas`** — changes to policy field data. Each carries its own\n `startDate` / `endDate` within the policy term, a `path`, an `action`\n (Add / Remove / Overwrite), and a `value`.\n\n**Amending the term.** Shortening a term is a `deltas` write to the ROOT\n`policy.policyEndDate` (or `policy.policyStartDate`) stating the **whole term** as\nits window. There is no separate policy-info channel — the retired `fullTermDeltas`\ncontainer channel was removed once the root fields became the single writable\nsource.\n\n**Whole-term policy fields.** Four ROOT paths hold values that are invariant across\nthe policy term — `policy.policyNumber`, `policy.policyStartDate`,\n`policy.policyEndDate` and `policy.previousPolicy`. A delta on `deltas` that touches\none of them (at any depth, and including an ancestor path such as a whole-`policy`\nOverwrite) must state the **whole term** as its window (`startDate` = the policy start,\n`endDate` = the policy end) or the write is rejected.\n\n**A term bound may not move outward**, through either input channel and at any path\ndepth: moving `policyEndDate` later or `policyStartDate` earlier is rejected\n(`TermLengtheningNotSupported`), because no endorsement path can create the extra days.\n\n**Date values.** A `deltas` value written to a `Date` field — at any depth, including a\nDate nested inside a custom object or an embedded exposure — must be the canonical\n`{ date: \"YYYY-MM-DD\", timezone }` object (the `Fmv1Date` schema) with **both** members\nstated. Delta values are stored exactly as sent, so this channel never converts: the\nretired `{ day, month, year, timezone }` spelling is refused (`400`, `InvalidDelta`),\nand so is a write to a single member of a Date (`policy.policyEndDate.year`) — a Date\nis written whole.\n\n**Derived channels (additive on either input channel):**\n\n- **`fullTermPricingInfo`** — whole-object overwrite of the policy-root pricing\n contract. Supply `pricingComponents` (each\n `{label, value, classification[, qualifier, earningSchedule]}` — every component\n must name a live `classification` from your company's classification registry);\n the four rollups (`premium`, `taxes`, `fees`, `total`) are computed by the\n platform from the components — any caller-supplied rollup value is ignored and\n recomputed.\n- **`fullTermBillingInfo`** — whole-object overwrite of the policy-root Billing\n Aggregate: `{ lines: [{ invoiceType, lineItem, direction, amount }] }`, the\n term's billing obligations free of invoices, with no rollup and no classification.\n An endorsement that moves the price must restate these lines: a stated\n aggregate's `receivable` lines must sum to\n `fullTermPricingInfo.total`, so moving the price without restating them is refused.\n- **`fullTermPolicyRatingResult`** — whole-object overwrite of the policy-root canonical\n rating result (the twin of `fullTermPricingInfo`).\n- **`crossSegmentRatingOutputs`** — element-level rating output, `[{ path, value }]`. Each\n `path` terminates at a `crossSegmentRatingOutputs` container on a list element (or the\n policy); `value` is the whole rating-output object for that host. There is no action\n (always an Overwrite) and no dates — the server derives each write's range from the\n host's presence across segments, so it applies cleanly to part-term hosts.\n\nAt least one channel is required. Any of `deltas`,\n`fullTermPricingInfo`, `fullTermBillingInfo`, `fullTermPolicyRatingResult` or\n`crossSegmentRatingOutputs` satisfies it, so an endorsement that restates\nonly the Billing Aggregate is a legal transaction on its own.\n\n**Path syntax — predicate addressing.** Index into a list by a predicate on any field:\n`policy.exposures[id = '\u003cuuid>'].bedCount`,\n`policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']`. The predicate must\nresolve to **exactly one** element wherever it is applied (throws on zero or multiple\nmatches) — this uniqueness rule is the cross-segment identity guarantee.\n\n**Policy invoices.** `invoicePlan` is an\n[invoice plan](/api-reference/invoicing/invoice-plans): nothing in it is\ndefaulted or inferred. Once active invoices exist, a change that moves the\nbilling they add up to must carry a plan, so kept and new invoices add up\nto the new billing; without one it is refused with\n`422 finv2-policy-restates-invoices`. The version and invoices commit\natomically.\n\n**Billing.** Stores the caller's billing as stated, without\nscaling, restoring or carrying billing from the policy: billing you leave out stores\nnone. To keep a billed policy's billing, state `fullTermBillingInfo` again, changed or\nunchanged. Kept and new invoices must still add up to the billing, as\n[Invoice plans](/api-reference/invoicing/invoice-plans) explains.\n\n**The policy's layer.** A policy sits at a layer of its\n[pricing stack](/api-reference/invoicing/pricing-stack), read from its pricing, its\nbilling and its active invoices. An endorsement keeps the\npolicy at its layer unless `pricingStackLayerChange` names the move it makes:\n\n- leaving out `fullTermBillingInfo` on a billed policy drops its billing, a move from\n `billing` to `pricing`;\n- stating billing on a policy that has none moves it from `pricing` to `billing`;\n- an `invoicePlan` that voids every active invoice moves the policy down from\n `invoicing`, and one that gives it its first invoices moves it up to `invoicing`.\n A plan that voids every active invoice and creates none needs no billing, so one\n endorsement can take an invoiced policy to `pricing` with\n `pricingStackLayerChange: {\"from\": \"invoicing\", \"to\": \"pricing\"}`.\n\nA move the request does not name, or a named move it does not make, returns\n`422 policy-pricing-stack-layer-change` and saves nothing; its message names the actual move\nand the exact `pricingStackLayerChange` that would name it. Billing that owes nothing sits at\nboth `billing` and `invoicing`, so a change between those two needs no `pricingStackLayerChange`.\n\n**Required permission:** `policy.endorse`\n","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/transaction/endorse","href":"/api-reference/field-model-policy-transactions/endorse-policy-transaction","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"endorsePolicyTransaction","summary":"Endorse Policy Transaction","description":"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE\ntransaction: change coverages, limits, insureds or other field values from a\ndate, and restate the premium and billing when the price moves. Use it when\nyou already hold the change; to endorse through a quote, generate the draft\nwith Generate Quote from Policy (Stateless) (`generateQuote`) and\n`transactionType: ENDORSE`. A cancelled policy takes no endorsement until\nReinstate Policy Transaction (`reinstatePolicyTransaction`) brings it back.\n\n**Value door** ([Invoicing a policy](/api-reference/invoicing/overview)). The\npolicy's invoices change only as the request says: the `invoicePlan` you\nsend voids the invoices it names and creates new ones, committed with the\npolicy version, and without one every invoice stays as it is.\n\nApplies an ENDORSE transaction to an existing policy. An endorsement carries one\nor more of **five channels**. The engine recomputes segments after applying every\nchannel — adjacent segments with identical data are automatically merged — and the\nresponse includes the full resulting segment set.\n\n**A cancelled policy takes no endorsement.** Cancel and reinstate only switch a\npolicy off and on; every other change is an endorsement. A policy whose latest\nversion carries a cancellation, whether it has taken effect or is still to come,\nis refused with `409 PolicyCancelled` until it is reinstated. To change a policy\nand cancel it, endorse it and then cancel it; to reinstate it with changes,\nreinstate it and then endorse it.\n\n**An endorsement does not switch a policy off or on.** `policy.policyStatus` and\n`policy.cancellationEffectiveOnDate` are owned by the platform: only\n[Cancel Policy Transaction](/api-reference/field-model-policy-transactions/cancel-policy-transaction)\nand [Reinstate Policy Transaction](/api-reference/field-model-policy-transactions/reinstate-policy-transaction)\nchange them. A delta that would change either one, directly or inside a whole-`policy`\nOverwrite, is refused with `400 SystemOwnedPolicyValue`, and nothing is saved. A delta\nthat restates the value the policy holds is accepted and dropped, so a whole policy\nobject read and sent back still endorses; a whole-`policy` Overwrite that leaves them\nout keeps them.\n\n**A delta under a calculated field is not applied.** The configuration\ncalculates such a field (Get Policy Configuration marks it `readOnly` and\n`x-calculated`), so the endorsement drops the delta and still succeeds. The\nresponse lists each one in `ignoredDeltas`, with `derivedFrom`, the Policy\nfields the calculation reads: write those instead. A property schedule built\nfrom the policy's exposures, for example, changes when you add an exposure to\n`policy.exposures`.\n\n**Input channel:**\n\n- **`deltas`** — changes to policy field data. Each carries its own\n `startDate` / `endDate` within the policy term, a `path`, an `action`\n (Add / Remove / Overwrite), and a `value`.\n\n**Amending the term.** Shortening a term is a `deltas` write to the ROOT\n`policy.policyEndDate` (or `policy.policyStartDate`) stating the **whole term** as\nits window. There is no separate policy-info channel — the retired `fullTermDeltas`\ncontainer channel was removed once the root fields became the single writable\nsource.\n\n**Whole-term policy fields.** Four ROOT paths hold values that are invariant across\nthe policy term — `policy.policyNumber`, `policy.policyStartDate`,\n`policy.policyEndDate` and `policy.previousPolicy`. A delta on `deltas` that touches\none of them (at any depth, and including an ancestor path such as a whole-`policy`\nOverwrite) must state the **whole term** as its window (`startDate` = the policy start,\n`endDate` = the policy end) or the write is rejected.\n\n**A term bound may not move outward**, through either input channel and at any path\ndepth: moving `policyEndDate` later or `policyStartDate` earlier is rejected\n(`TermLengtheningNotSupported`), because no endorsement path can create the extra days.\n\n**Date values.** A `deltas` value written to a `Date` field — at any depth, including a\nDate nested inside a custom object or an embedded exposure — must be the canonical\n`{ date: \"YYYY-MM-DD\", timezone }` object (the `Fmv1Date` schema) with **both** members\nstated. Delta values are stored exactly as sent, so this channel never converts: the\nretired `{ day, month, year, timezone }` spelling is refused (`400`, `InvalidDelta`),\nand so is a write to a single member of a Date (`policy.policyEndDate.year`) — a Date\nis written whole.\n\n**Derived channels (additive on either input channel):**\n\n- **`fullTermPricingInfo`** — whole-object overwrite of the policy-root pricing\n contract. Supply `pricingComponents` (each\n `{label, value, classification[, qualifier, earningSchedule]}` — every component\n must name a live `classification` from your company's classification registry);\n the four rollups (`premium`, `taxes`, `fees`, `total`) are computed by the\n platform from the components — any caller-supplied rollup value is ignored and\n recomputed.\n- **`fullTermBillingInfo`** — whole-object overwrite of the policy-root Billing\n Aggregate: `{ lines: [{ invoiceType, lineItem, direction, amount }] }`, the\n term's billing obligations free of invoices, with no rollup and no classification.\n An endorsement that moves the price must restate these lines: a stated\n aggregate's `receivable` lines must sum to\n `fullTermPricingInfo.total`, so moving the price without restating them is refused.\n- **`fullTermPolicyRatingResult`** — whole-object overwrite of the policy-root canonical\n rating result (the twin of `fullTermPricingInfo`).\n- **`crossSegmentRatingOutputs`** — element-level rating output, `[{ path, value }]`. Each\n `path` terminates at a `crossSegmentRatingOutputs` container on a list element (or the\n policy); `value` is the whole rating-output object for that host. There is no action\n (always an Overwrite) and no dates — the server derives each write's range from the\n host's presence across segments, so it applies cleanly to part-term hosts.\n\nAt least one channel is required. Any of `deltas`,\n`fullTermPricingInfo`, `fullTermBillingInfo`, `fullTermPolicyRatingResult` or\n`crossSegmentRatingOutputs` satisfies it, so an endorsement that restates\nonly the Billing Aggregate is a legal transaction on its own.\n\n**Path syntax — predicate addressing.** Index into a list by a predicate on any field:\n`policy.exposures[id = '\u003cuuid>'].bedCount`,\n`policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']`. The predicate must\nresolve to **exactly one** element wherever it is applied (throws on zero or multiple\nmatches) — this uniqueness rule is the cross-segment identity guarantee.\n\n**Policy invoices.** `invoicePlan` is an\n[invoice plan](/api-reference/invoicing/invoice-plans): nothing in it is\ndefaulted or inferred. Once active invoices exist, a change that moves the\nbilling they add up to must carry a plan, so kept and new invoices add up\nto the new billing; without one it is refused with\n`422 finv2-policy-restates-invoices`. The version and invoices commit\natomically.\n\n**Billing.** Stores the caller's billing as stated, without\nscaling, restoring or carrying billing from the policy: billing you leave out stores\nnone. To keep a billed policy's billing, state `fullTermBillingInfo` again, changed or\nunchanged. Kept and new invoices must still add up to the billing, as\n[Invoice plans](/api-reference/invoicing/invoice-plans) explains.\n\n**The policy's layer.** A policy sits at a layer of its\n[pricing stack](/api-reference/invoicing/pricing-stack), read from its pricing, its\nbilling and its active invoices. An endorsement keeps the\npolicy at its layer unless `pricingStackLayerChange` names the move it makes:\n\n- leaving out `fullTermBillingInfo` on a billed policy drops its billing, a move from\n `billing` to `pricing`;\n- stating billing on a policy that has none moves it from `pricing` to `billing`;\n- an `invoicePlan` that voids every active invoice moves the policy down from\n `invoicing`, and one that gives it its first invoices moves it up to `invoicing`.\n A plan that voids every active invoice and creates none needs no billing, so one\n endorsement can take an invoiced policy to `pricing` with\n `pricingStackLayerChange: {\"from\": \"invoicing\", \"to\": \"pricing\"}`.\n\nA move the request does not name, or a named move it does not make, returns\n`422 policy-pricing-stack-layer-change` and saves nothing; its message names the actual move\nand the exact `pricingStackLayerChange` that would name it. Billing that owes nothing sits at\nboth `billing` and `invoicing`, so a change between those two needs no `pricingStackLayerChange`.\n\n**Required permission:** `policy.endorse`\n","tags":["Field Model Policy Transactions"],"parameters":["9d2fa722-4096-43b2-b89b-44adb5a43986","7c02167d-743d-4774-a2d5-480f8691562a","492d38ae-0817-41b3-8c7d-a6565bb7fa82"],"requestBody":"1aac54be-4048-4246-94ac-651af6dfabe5","responses":{"201":"179a61fe-56ba-41d9-acb1-e16cf5846a7d","400":"11c5f72e-51c0-4ca9-aaaa-5fc32693a37a","401":"962a40ba-9e4e-4ce5-aca1-a3eac1fa4f8f","403":"a7beda41-9cf7-48ed-844e-91ba5de89c00","404":"866e2252-47b1-4631-8b9f-bb95defbd0ee","409":"5236beb2-b12e-408c-8f49-759588dbc3a7","422":"f8fc6cb7-e169-4f71-b2c2-f3e50a3c46e6","500":"1bfdd691-f36c-4ebc-ae2e-e7744fc7e6ef"},"method":"post","type":"path","servers":["b4993f5b-e21e-4dbd-8ace-9c59b5197d8e"],"security":["35370c79-340a-4ed7-a68a-8c786f4a2235"],"path":"/api/v1/companies/{companyId}/policies/{policyId}/transaction/endorse","baseUrlOptions":["https://go.aiinsurance.io"],"title":"Endorse Policy Transaction","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"9d2fa722-4096-43b2-b89b-44adb5a43986":{"name":"companyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","isRequired":true,"description":"Company identifier","uniqueKey":"","typeLabel":"string\u003cuuid>"},"description":"Company identifier"},"7c02167d-743d-4774-a2d5-480f8691562a":{"name":"Idempotency-Key","in":"header","required":false,"description":"A unique key of 1 to 255 printable ASCII characters for retrying this write. Within 30 days of the successful attempt's admission, reuse with the same request returns the original transaction; retries do not extend that window. After 30 days the same key runs as a new write, even if the request differs.","schema":{"type":"string","minLength":1,"maxLength":255,"isRequired":false,"description":"A unique key of 1 to 255 printable ASCII characters for retrying this write. Within 30 days of the successful attempt's admission, reuse with the same request returns the original transaction; retries do not extend that window. After 30 days the same key runs as a new write, even if the request differs.","uniqueKey":"","typeLabel":"string"}},"492d38ae-0817-41b3-8c7d-a6565bb7fa82":{"name":"policyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","isRequired":true,"description":"Policy identifier","uniqueKey":"","typeLabel":"string\u003cuuid>"},"description":"Policy identifier"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["effectiveDate"],"properties":{"effectiveDate":{"type":"string","format":"date","description":"The effective date of the endorsement in ISO 8601 format. It must fall\nwithin the policy term.\n","isRequired":true,"uniqueKey":"effectiveDate","typeLabel":"string\u003cdate>"},"transactionTimestamp":{"type":"string","format":"date-time","description":"When the business decision was made. Defaults to the current time if omitted.\nSet explicitly for imports (e.g., aligning to a bordereau booking date).\n","uniqueKey":"transactionTimestamp","typeLabel":"string\u003cdate-time>"},"displayAuthor":{"type":"string","maxLength":255,"description":"Optional user-visible author label (trimmed; must be non-empty). When set, the transaction is displayed as filed by this label (e.g. \"Data Import\") instead of the acting user; audit attribution (`createdBy`) stays server-set.","uniqueKey":"displayAuthor","typeLabel":"string"},"deltas":{"type":"array","description":"Policy-data deltas. Each delta specifies a date range (`startDate` /\n`endDate`) within the policy term, a predicate path, an action\n(Add / Remove / Overwrite), and the new value. Paths must not contain any\nreserved full-term container (`fullTermPricingInfo`,\n`fullTermBillingInfo`, `fullTermPolicyRatingResult`,\n`crossSegmentRatingOutputs`) — those have\ntheir own channel. A delta on one of the four whole-term ROOT paths\n(`policy.policyNumber`, `policy.policyStartDate`, `policy.policyEndDate`,\n`policy.previousPolicy`) must span the whole term. A delta that would change\n`policy.policyStatus` or `policy.cancellationEffectiveOnDate` is refused with\n`400 SystemOwnedPolicyValue`: cancel and reinstate through their own\ntransactions.\n","items":{"type":"object","required":["startDate","endDate","path","action","value"],"properties":{"startDate":{"type":"string","format":"date","description":"Start of the date range this delta applies to. Must be `\u003c=` endDate.","isRequired":true,"uniqueKey":"deltas.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","format":"date","description":"End of the date range this delta applies to.","isRequired":true,"uniqueKey":"deltas.items.[INDEX].endDate","typeLabel":"string\u003cdate>"},"path":{"type":"string","description":"Predicate path into the policy data (e.g. `policy.annualPremium`,\n`policy.exposures`, `policy.exposures[id = '\u003cuuid>'].bedCount`). Must not\ncontain a reserved full-term container.\n","isRequired":true,"uniqueKey":"deltas.items.[INDEX].path","typeLabel":"string"},"action":{"type":"string","enum":["Add","Remove","Overwrite"],"description":"Delta action. `Overwrite` overwrites the value at the path. `Add` appends\nto a collection with set semantics (objects matched by `id`, primitives by\nequality; no-op if already present). `Remove` removes matching values from a\ncollection; no-op if not present.\n","isRequired":true,"uniqueKey":"deltas.items.[INDEX].action","typeLabel":"enum\u003cstring>"},"value":{"description":"The new value to set at the path. Type depends on the field. A `Date`\nfield takes only the canonical `{ date: \"YYYY-MM-DD\", timezone }` object,\nboth members stated.\n","isRequired":true,"uniqueKey":"deltas.items.[INDEX].value","typeLabel":"any"}},"uniqueKey":"deltas.items.[INDEX]","typeLabel":"object"},"uniqueKey":"deltas","typeLabel":"object[]"},"fullTermPricingInfo":{"type":"object","description":"Optional whole-object overwrite of the policy-root full-term pricing\ncontract. Supply `pricingComponents` (each\n`{label, value, classification[, qualifier, earningSchedule]}`;\n`label` a string, `value` a plain number, `classification` a key naming\na LIVE entry in your company's classification registry — required on\nevery component, for every company; `qualifier` defaults to `\"\"` and\n`earningSchedule` — `pro-rata` or `immediate` — defaults to\n`pro-rata`). The four rollups (`premium`, `taxes`, `fees`, `total`)\nare computed by the platform from the components' classifications;\ncaller-supplied rollup values are ignored and recomputed. Additive on\neither input channel. The full component contract and its refusals\n(`400`, `InvalidFieldModelV1Data` on this endpoint) are spelled out on\nthe **New Business Transaction** endpoint.\n\nThe retired legacy fields (`group`/`kind`/`earningBasis`) are ignored\nand discarded on input — never validated, never stored on a newly\nwritten component — so a stored component that still echoes them can be\nposted back unchanged.\n","additionalProperties":true,"uniqueKey":"fullTermPricingInfo","typeLabel":"object"},"fullTermBillingInfo":{"type":"object","description":"Optional whole-object overwrite of the policy-root Billing Aggregate —\nthe term's billing obligations per line item, free of invoices. Additive\non either input channel. Leaving it out stores no\nbilling, so a billed policy's billing is dropped unless you state it again;\ndropping it is a layer move that needs `pricingStackLayerChange`. Its receivable total\nmust match `fullTermPricingInfo.total`.\n","properties":{"lines":{"oneOf":[{"type":"array","description":"The term's billing lines, each `{invoiceType, lineItem, direction,\namount}`. Nullable: a policy with no billing configuration still prices\nand earns, so an absent aggregate is an ordinary state rather than a\ndefect.\n","items":{"type":"object","description":"One line of a policy's term-level **Billing Aggregate** — the element type of\n`fullTermBillingInfo.lines`.\n\nA billing line is deliberately a NAME, a DIRECTION and a SIGNED AMOUNT, and\nnothing else. It carries no pricing `classification` and feeds no rollup,\nexactly as a pricing component carries no invoice type and no line item: the\npricing and billing vocabularies are disjoint.\n\nThe line's identity is the pair `\u003cinvoiceType, lineItem>`, unique within one\n`fullTermBillingInfo` container — two lines sharing that pair are rejected\nwith a `400`.\n","required":["invoiceType","lineItem","direction","amount"],"properties":{"invoiceType":{"type":"string","minLength":1,"description":"The kind of invoice the obligation belongs to, e.g. `\"Policy Invoice\"` or\n`\"Commission Invoice\"`. Free text (not a closed enum), and must be\nnon-empty.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.lines.oneOf.0.items.[INDEX].invoiceType","typeLabel":"string"},"lineItem":{"type":"string","minLength":1,"description":"The line item within that invoice type, e.g. `\"Premium Installment\"` or\n`\"Producer Commission\"`. Free text (not a closed enum), and must be\nnon-empty.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.lines.oneOf.0.items.[INDEX].lineItem","typeLabel":"string"},"direction":{"type":"string","enum":["receivable","payable"],"description":"Which way the money moves. `receivable` is owed TO us (premium, taxes,\nfees); `payable` is owed BY us (commission). The direction comes from the\nline item type's own configuration, so the value you send is a **checked\nassertion** rather than an input: a mismatch is refused. That is what lets a\npayable commission line sit in the same aggregate as the receivables and\nself-exclude from the receivable checksum.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.lines.oneOf.0.items.[INDEX].direction","typeLabel":"enum\u003cstring>"},"amount":{"type":"number","description":"The line's amount as a plain number in USD. It is **signed** and must be\nfinite: a price refund is a negative receivable.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.lines.oneOf.0.items.[INDEX].amount","typeLabel":"number"}},"additionalProperties":true,"uniqueKey":"fullTermBillingInfo.lines.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"fullTermBillingInfo.lines.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"The term's billing lines, each `{invoiceType, lineItem, direction,\namount}`. Nullable: a policy with no billing configuration still prices\nand earns, so an absent aggregate is an ordinary state rather than a\ndefect.\n","items":{"type":"object","description":"One line of a policy's term-level **Billing Aggregate** — the element type of\n`fullTermBillingInfo.lines`.\n\nA billing line is deliberately a NAME, a DIRECTION and a SIGNED AMOUNT, and\nnothing else. It carries no pricing `classification` and feeds no rollup,\nexactly as a pricing component carries no invoice type and no line item: the\npricing and billing vocabularies are disjoint.\n\nThe line's identity is the pair `\u003cinvoiceType, lineItem>`, unique within one\n`fullTermBillingInfo` container — two lines sharing that pair are rejected\nwith a `400`.\n","required":["invoiceType","lineItem","direction","amount"],"properties":{"invoiceType":{"type":"string","minLength":1,"description":"The kind of invoice the obligation belongs to, e.g. `\"Policy Invoice\"` or\n`\"Commission Invoice\"`. Free text (not a closed enum), and must be\nnon-empty.\n"},"lineItem":{"type":"string","minLength":1,"description":"The line item within that invoice type, e.g. `\"Premium Installment\"` or\n`\"Producer Commission\"`. Free text (not a closed enum), and must be\nnon-empty.\n"},"direction":{"type":"string","enum":["receivable","payable"],"description":"Which way the money moves. `receivable` is owed TO us (premium, taxes,\nfees); `payable` is owed BY us (commission). The direction comes from the\nline item type's own configuration, so the value you send is a **checked\nassertion** rather than an input: a mismatch is refused. That is what lets a\npayable commission line sit in the same aggregate as the receivables and\nself-exclude from the receivable checksum.\n"},"amount":{"type":"number","description":"The line's amount as a plain number in USD. It is **signed** and must be\nfinite: a price refund is a negative receivable.\n"}},"additionalProperties":true},"uniqueKey":"fullTermBillingInfo.lines.oneOf.1","typeLabel":"null"}],"uniqueKey":"fullTermBillingInfo.lines","typeLabel":"object[] | null"}},"additionalProperties":true,"uniqueKey":"fullTermBillingInfo","typeLabel":"object"},"fullTermPolicyRatingResult":{"type":"object","description":"Optional whole-object overwrite of the policy-root canonical rating result.\nThe twin of `fullTermPricingInfo`; additive on either input channel.\n","additionalProperties":true,"uniqueKey":"fullTermPolicyRatingResult","typeLabel":"object"},"crossSegmentRatingOutputs":{"type":"array","description":"Optional element-level rating output. Each entry overwrites the\n`crossSegmentRatingOutputs` container at its host; the server derives the write\nrange from the host's presence across segments (write where the host-selector\nresolves to exactly one element, skip where zero, throw on many or if it never\nresolves). Additive; ENDORSE only.\n","items":{"type":"object","required":["path","value"],"properties":{"path":{"type":"string","description":"Predicate path terminating at a `crossSegmentRatingOutputs` container on a\nlist element or the policy (e.g.\n`policy.exposures[id = '\u003cuuid>'].crossSegmentRatingOutputs`,\n`policy.crossSegmentRatingOutputs`).\n","isRequired":true,"uniqueKey":"crossSegmentRatingOutputs.items.[INDEX].path","typeLabel":"string"},"value":{"type":"object","description":"The whole rating-output object for that host.","additionalProperties":true,"isRequired":true,"uniqueKey":"crossSegmentRatingOutputs.items.[INDEX].value","typeLabel":"object"}},"uniqueKey":"crossSegmentRatingOutputs.items.[INDEX]","typeLabel":"object"},"uniqueKey":"crossSegmentRatingOutputs","typeLabel":"object[]"},"invoicePlan":{"type":"object","additionalProperties":false,"required":["incurredDate","voidInvoices","creates"],"properties":{"incurredDate":{"type":"string","format":"date","description":"Explicit recognition date for non-scheduled creates. It is never inferred from a transaction effective date or the server clock.","isRequired":true,"uniqueKey":"invoicePlan.incurredDate","typeLabel":"string\u003cdate>"},"voidInvoices":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["invoiceId","headJournalId"],"properties":{"invoiceId":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"invoicePlan.voidInvoices.items.[INDEX].invoiceId","typeLabel":"string\u003cuuid>"},"headJournalId":{"type":"string","format":"uuid","description":"The invoice watermark read while composing the plan. A stale watermark rejects the whole batch with 409.","isRequired":true,"uniqueKey":"invoicePlan.voidInvoices.items.[INDEX].headJournalId","typeLabel":"string\u003cuuid>"}},"uniqueKey":"invoicePlan.voidInvoices.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"invoicePlan.voidInvoices","typeLabel":"object[]"},"creates":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["group","lineItems"],"properties":{"group":{"type":"string","minLength":1,"description":"The policy invoice type's name: a live type that allows each of the invoice's lines, such as the `invoiceType` the policy's `fullTermBillingInfo` names for them.","isRequired":true,"uniqueKey":"invoicePlan.creates.items.[INDEX].group","typeLabel":"string"},"lineItems":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["label","amountCents"],"properties":{"label":{"type":"string","minLength":1,"description":"Line-item name on this invoice type: a line item the policy's stated billing names or one an existing kept invoice carries.","isRequired":true,"uniqueKey":"invoicePlan.creates.items.[INDEX].lineItems.items.[INDEX].label","typeLabel":"string"},"amountCents":{"type":"integer","description":"Signed integer cents in the configured line-item type's own frame. A negative amount reverses the line: a credit on the same line.","isRequired":true,"uniqueKey":"invoicePlan.creates.items.[INDEX].lineItems.items.[INDEX].amountCents","typeLabel":"integer"},"memo":{"type":"string","uniqueKey":"invoicePlan.creates.items.[INDEX].lineItems.items.[INDEX].memo","typeLabel":"string"}},"uniqueKey":"invoicePlan.creates.items.[INDEX].lineItems.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"invoicePlan.creates.items.[INDEX].lineItems","typeLabel":"object[]"},"dueDate":{"type":"string","format":"date","uniqueKey":"invoicePlan.creates.items.[INDEX].dueDate","typeLabel":"string\u003cdate>"},"scheduledDate":{"type":"string","format":"date","description":"The invoice's send date. When present, the invoice is recognized and sent on this date, and the invoice read shows it as the invoice's `incurredDate`. Until it arrives the installment is not yet sent; the invoice read reports it as `owed`. Give every create one: a create without it is recognized on the plan's `incurredDate` and counts as already sent, so a later change's default endorsement handling (`void` `scheduled`) keeps it rather than replacing it.","uniqueKey":"invoicePlan.creates.items.[INDEX].scheduledDate","typeLabel":"string\u003cdate>"},"payeeId":{"type":"string","format":"uuid","description":"The Person, Organization or Exposure of your company the invoice is issued to, of a kind its invoice type accepts. Required in practice, although the schema marks it optional: a create without one is refused with `422 finv2-policy-create-payee-invalid`. The batch checks payees after its watermark and conservation checks, so such a plan may get another refusal first.","uniqueKey":"invoicePlan.creates.items.[INDEX].payeeId","typeLabel":"string\u003cuuid>"},"invoiceNumber":{"oneOf":[{"type":"string","description":"The invoice's Invoice Number, the number printed on it by its sender. Omitted means the invoice's own `transactionId`, the default for an invoice your company sends; a value sets it instead, so a policy invoice brought over from another system can carry that system's number; `null` or blank means none. Trimmed, then at most 255 characters; longer returns `400`. Not unique. The batch creates posted invoices; their Invoice Number remains editable through Update Invoice.","uniqueKey":"invoicePlan.creates.items.[INDEX].invoiceNumber.oneOf.0","typeLabel":"string"},{"type":"null","description":"The invoice's Invoice Number, the number printed on it by its sender. Omitted means the invoice's own `transactionId`, the default for an invoice your company sends; a value sets it instead, so a policy invoice brought over from another system can carry that system's number; `null` or blank means none. Trimmed, then at most 255 characters; longer returns `400`. Not unique. The batch creates posted invoices; their Invoice Number remains editable through Update Invoice.","uniqueKey":"invoicePlan.creates.items.[INDEX].invoiceNumber.oneOf.1","typeLabel":"null"}],"uniqueKey":"invoicePlan.creates.items.[INDEX].invoiceNumber","typeLabel":"string | null"},"memo":{"type":"string","uniqueKey":"invoicePlan.creates.items.[INDEX].memo","typeLabel":"string"}},"uniqueKey":"invoicePlan.creates.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"invoicePlan.creates","typeLabel":"object[]"}},"description":"A fully explicit, detached policy-invoice batch. Existing invoices not named in voidInvoices are kept. The complete kept-plus-created set must conserve each line item of the policy's stated billing. A line item a kept invoice carries but billing omits conserves at 0: a create may credit it on the same line with a negative amount. A plan never names a move between layers of the pricing stack: a policy transaction or bind by value names its own beside the plan in `pricingStackLayerChange`, and a quote's plan binds at the quote's intended layer. [Invoice plans](/api-reference/invoicing/invoice-plans) explains each field, the rule and every refusal.","uniqueKey":"invoicePlan","typeLabel":"object"},"pricingStackLayerChange":{"type":"object","description":"The move between layers of the pricing stack this endorsement makes,\nwhen it makes one. Leave it out to keep the policy at its layer.\n","required":["from","to"],"properties":{"from":{"type":"string","description":"The layer the policy sits at before the change.","enum":["base","pricing","billing","invoicing"],"isRequired":true,"uniqueKey":"pricingStackLayerChange.from","typeLabel":"enum\u003cstring>"},"to":{"type":"string","description":"The layer the policy sits at after the change.","enum":["base","pricing","billing","invoicing"],"isRequired":true,"uniqueKey":"pricingStackLayerChange.to","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"pricingStackLayerChange","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"midTermPremiumChange":{"title":"midTermPremiumChange","description":"Three channels at once: a per-segment `deltas` write, a restated\npricing contract, and the restated Billing Aggregate. The two\nfull-term channels are whole-object overwrites applied across the\nentire term.\n","value":{"effectiveDate":"2025-04-01","deltas":[{"startDate":"2025-04-01","endDate":"2025-12-31","path":"policy.annualPremium","action":"Overwrite","value":102000}],"fullTermPricingInfo":{"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","value":102000},{"label":"Policy Fee","classification":"policy-fee","value":500}]},"fullTermBillingInfo":{"lines":[{"invoiceType":"Policy Invoice","lineItem":"Premium Installment","direction":"receivable","amount":102500}]}}},"addExposure":{"title":"addExposure","value":{"effectiveDate":"2025-06-01","deltas":[{"startDate":"2025-06-01","endDate":"2025-12-31","path":"policy.exposures","action":"Add","value":{"id":"550e8400-e29b-41d4-a716-446655440020","exposureType":"MedicalFacility","bedCount":80}}],"fullTermPricingInfo":{"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","value":120000},{"label":"Policy Fee","classification":"policy-fee","value":500}]}}},"shortenTerm":{"title":"shortenTerm","description":"The term bound is a ROOT field, so the delta must state the whole term as\nits window.\n","value":{"effectiveDate":"2025-01-01","deltas":[{"startDate":"2025-01-01","endDate":"2025-12-31","path":"policy.policyEndDate","action":"Overwrite","value":{"date":"2025-09-30","timezone":"America/New_York"}}]}},"elementRatingOutput":{"title":"elementRatingOutput","value":{"effectiveDate":"2025-06-01","deltas":[{"startDate":"2025-06-01","endDate":"2025-12-31","path":"policy.exposures[id = '550e8400-e29b-41d4-a716-446655440010'].bedCount","action":"Overwrite","value":110}],"crossSegmentRatingOutputs":[{"path":"policy.exposures[id = '550e8400-e29b-41d4-a716-446655440010'].crossSegmentRatingOutputs","value":{"annualPremium":96000,"dailyProratedPremium":263}}]}},"withTimestamp":{"title":"withTimestamp","value":{"effectiveDate":"2025-04-01","transactionTimestamp":"2025-03-28T14:30:00Z","deltas":[{"startDate":"2025-04-01","endDate":"2025-12-31","path":"policy.customPolicyText","action":"Overwrite","value":"updated value"}]}},"dropBilling":{"title":"dropBilling","description":"The policy sits at the billing layer: pricing and billing, and no active\ninvoices. The endorsement leaves `fullTermBillingInfo` out, which drops the\nbilling, so it names the move to the pricing layer.\n","value":{"effectiveDate":"2025-06-01","deltas":[{"startDate":"2025-06-01","endDate":"2025-12-31","path":"policy.customPolicyText","action":"Overwrite","value":"billing removed"}],"pricingStackLayerChange":{"from":"billing","to":"pricing"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"179a61fe-56ba-41d9-acb1-e16cf5846a7d":{"description":"Endorsement applied successfully","content":{"application/json":{"schema":{"type":"object","description":"Response returned by policy transaction endpoints. Contains the policy version\nproduced by the transaction, including all derived segments.\n","required":["policyId","policyVersion","transactionId","startDate","endDate","createdAt","primaryInsuredName","primaryInsuredId","policyNumber","policyStartDate","policyEndDate","fullTermPricingInfo","fullTermBillingInfo","fullTermPolicyRatingResult","segments"],"properties":{"policyId":{"type":"string","format":"uuid","description":"Policy identifier","isRequired":true,"uniqueKey":"policyId","typeLabel":"string\u003cuuid>"},"policyVersion":{"type":"integer","description":"Sequential version number produced by this transaction","isRequired":true,"uniqueKey":"policyVersion","typeLabel":"integer"},"transactionId":{"type":"string","format":"uuid","description":"Identifier of the transaction that produced this version","isRequired":true,"uniqueKey":"transactionId","typeLabel":"string\u003cuuid>"},"startDate":{"type":"string","format":"date","description":"Policy term start date (ISO 8601)","isRequired":true,"uniqueKey":"startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","format":"date","description":"Policy term end date (ISO 8601)","isRequired":true,"uniqueKey":"endDate","typeLabel":"string\u003cdate>"},"createdAt":{"type":"string","format":"date-time","description":"When the transaction was created (ISO 8601)","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"},"primaryInsuredName":{"oneOf":[{"type":"string","description":"Plain-text primary-insured name, read from the policy's own\n`primaryInsuredName` field — the source of truth for the primary insured.\nReported as of the END of\nthe term, so a policy whose insured changed mid-term returns the later name;\n`segments[]` carries the per-segment history. Null only when the version\ncarries no policy data.\n","isRequired":true,"uniqueKey":"primaryInsuredName.oneOf.0","typeLabel":"string"},{"type":"null","description":"Plain-text primary-insured name, read from the policy's own\n`primaryInsuredName` field — the source of truth for the primary insured.\nReported as of the END of\nthe term, so a policy whose insured changed mid-term returns the later name;\n`segments[]` carries the per-segment history. Null only when the version\ncarries no policy data.\n","isRequired":true,"uniqueKey":"primaryInsuredName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"primaryInsuredName","typeLabel":"string | null"},"primaryInsuredId":{"oneOf":[{"type":"string","description":"Id of the entity behind `primaryInsuredName`. Null when the policy's\nconfiguration does not populate it.\n","isRequired":true,"uniqueKey":"primaryInsuredId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Id of the entity behind `primaryInsuredName`. Null when the policy's\nconfiguration does not populate it.\n","isRequired":true,"uniqueKey":"primaryInsuredId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"primaryInsuredId","typeLabel":"string | null"},"policyNumber":{"oneOf":[{"type":"string","description":"The policy number, read from the policy's own `policyNumber` field — the\nsource of truth, invariant across the whole term. Null only when the version\ncarries no policy data.\n","isRequired":true,"uniqueKey":"policyNumber.oneOf.0","typeLabel":"string"},{"type":"null","description":"The policy number, read from the policy's own `policyNumber` field — the\nsource of truth, invariant across the whole term. Null only when the version\ncarries no policy data.\n","isRequired":true,"uniqueKey":"policyNumber.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"policyNumber","typeLabel":"string | null"},"policyStartDate":{"oneOf":[{"type":"object","description":"Policy term start date as the structured date object, read from the policy's\nown `policyStartDate` field — the source of truth, invariant across the whole\nterm. This is **not** `startDate` above: that is the ISO\nspan this version covers, which a cancellation makes shorter than the term.\nNull only when the version carries no policy data.\n","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"The calendar day as `YYYY-MM-DD`, zero-padded.","example":"2026-03-15","isRequired":true,"uniqueKey":"policyStartDate.oneOf.0.date","typeLabel":"string\u003cdate>"},"timezone":{"type":"string","description":"IANA time zone identifier the day is anchored in (e.g. \"America/New_York\",\n\"UTC\"). Optional on a write (defaults to `America/New_York`); always\npresent in a response.\n","example":"America/New_York","uniqueKey":"policyStartDate.oneOf.0.timezone","typeLabel":"string"},"importedAsUnknownTimezone":{"type":"boolean","description":"The date was imported without a known source timezone and carries a fallback zone. Optional; no default is added to existing dates.","example":true,"uniqueKey":"policyStartDate.oneOf.0.importedAsUnknownTimezone","typeLabel":"boolean"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"policyStartDate.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"policyStartDate.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"policyStartDate","typeLabel":"object | null"},"policyEndDate":{"oneOf":[{"type":"object","description":"Policy term end date as the structured date object, read from the policy's own\n`policyEndDate` field — the source of truth, invariant across the whole term.\nThis is **not** `endDate` above: that is the ISO\nspan this version covers. Null only when the version carries no policy data.\n","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"The calendar day as `YYYY-MM-DD`, zero-padded.","example":"2026-03-15","isRequired":true,"uniqueKey":"policyEndDate.oneOf.0.date","typeLabel":"string\u003cdate>"},"timezone":{"type":"string","description":"IANA time zone identifier the day is anchored in (e.g. \"America/New_York\",\n\"UTC\"). Optional on a write (defaults to `America/New_York`); always\npresent in a response.\n","example":"America/New_York","uniqueKey":"policyEndDate.oneOf.0.timezone","typeLabel":"string"},"importedAsUnknownTimezone":{"type":"boolean","description":"The date was imported without a known source timezone and carries a fallback zone. Optional; no default is added to existing dates.","example":true,"uniqueKey":"policyEndDate.oneOf.0.importedAsUnknownTimezone","typeLabel":"boolean"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"policyEndDate.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"policyEndDate.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"policyEndDate","typeLabel":"object | null"},"fullTermPricingInfo":{"oneOf":[{"type":"object","description":"The policy's full-term pricing contract, hoisted as a read-once convenience\n(also duplicated in every segment): `pricingComponents` plus the four\nserver-computed, read-only rollups — `premium`, `taxes` and `fees` (each\nthe sum of the components whose `classification` reports into it) and\n`total` (`premium + taxes + fees`). All four\nare always present. The retired `brokerCommission` / `programCommission`\nrollups are no longer computed; a version stored before their retirement\nmay still return the two keys until the per-tenant data sweeps.\n\nEach newly written component carries\n`{label, value, classification, qualifier, earningSchedule}` —\n`\u003cclassification, qualifier>` is its identity, and `label` is cosmetic.\nThe legacy vocabulary is retired: a component stored before the\nretirement may still echo the `group` / `kind` / `earningBasis` keys\nuntil the per-tenant data sweeps remove them — treat those as historical\noutput, never as identity, and do not rely on their presence.\n","additionalProperties":true,"isRequired":true,"uniqueKey":"fullTermPricingInfo.oneOf.0","typeLabel":"object"},{"type":"null","description":"The policy's full-term pricing contract, hoisted as a read-once convenience\n(also duplicated in every segment): `pricingComponents` plus the four\nserver-computed, read-only rollups — `premium`, `taxes` and `fees` (each\nthe sum of the components whose `classification` reports into it) and\n`total` (`premium + taxes + fees`). All four\nare always present. The retired `brokerCommission` / `programCommission`\nrollups are no longer computed; a version stored before their retirement\nmay still return the two keys until the per-tenant data sweeps.\n\nEach newly written component carries\n`{label, value, classification, qualifier, earningSchedule}` —\n`\u003cclassification, qualifier>` is its identity, and `label` is cosmetic.\nThe legacy vocabulary is retired: a component stored before the\nretirement may still echo the `group` / `kind` / `earningBasis` keys\nuntil the per-tenant data sweeps remove them — treat those as historical\noutput, never as identity, and do not rely on their presence.\n","additionalProperties":true,"isRequired":true,"uniqueKey":"fullTermPricingInfo.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"fullTermPricingInfo","typeLabel":"object | null"},"fullTermBillingInfo":{"oneOf":[{"type":"object","description":"The policy's Billing Aggregate for the term, hoisted as a read-once\nconvenience (also duplicated in every segment). Null when the policy states\nno billing obligations.\n","properties":{"lines":{"oneOf":[{"type":"array","description":"The term's billing lines, each `{invoiceType, lineItem, direction,\namount}`. Nullable: a policy with no billing configuration still prices\nand earns, so an absent aggregate is an ordinary state rather than a\ndefect.\n","items":{"type":"object","description":"One line of a policy's term-level **Billing Aggregate** — the element type of\n`fullTermBillingInfo.lines`.\n\nA billing line is deliberately a NAME, a DIRECTION and a SIGNED AMOUNT, and\nnothing else. It carries no pricing `classification` and feeds no rollup,\nexactly as a pricing component carries no invoice type and no line item: the\npricing and billing vocabularies are disjoint.\n\nThe line's identity is the pair `\u003cinvoiceType, lineItem>`, unique within one\n`fullTermBillingInfo` container — two lines sharing that pair are rejected\nwith a `400`.\n","required":["invoiceType","lineItem","direction","amount"],"properties":{"invoiceType":{"type":"string","minLength":1,"description":"The kind of invoice the obligation belongs to, e.g. `\"Policy Invoice\"` or\n`\"Commission Invoice\"`. Free text (not a closed enum), and must be\nnon-empty.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.0.items.[INDEX].invoiceType","typeLabel":"string"},"lineItem":{"type":"string","minLength":1,"description":"The line item within that invoice type, e.g. `\"Premium Installment\"` or\n`\"Producer Commission\"`. Free text (not a closed enum), and must be\nnon-empty.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.0.items.[INDEX].lineItem","typeLabel":"string"},"direction":{"type":"string","enum":["receivable","payable"],"description":"Which way the money moves. `receivable` is owed TO us (premium, taxes,\nfees); `payable` is owed BY us (commission). The direction comes from the\nline item type's own configuration, so the value you send is a **checked\nassertion** rather than an input: a mismatch is refused. That is what lets a\npayable commission line sit in the same aggregate as the receivables and\nself-exclude from the receivable checksum.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.0.items.[INDEX].direction","typeLabel":"enum\u003cstring>"},"amount":{"type":"number","description":"The line's amount as a plain number in USD. It is **signed** and must be\nfinite: a price refund is a negative receivable.\n","isRequired":true,"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.0.items.[INDEX].amount","typeLabel":"number"}},"additionalProperties":true,"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"The term's billing lines, each `{invoiceType, lineItem, direction,\namount}`. Nullable: a policy with no billing configuration still prices\nand earns, so an absent aggregate is an ordinary state rather than a\ndefect.\n","items":{"type":"object","description":"One line of a policy's term-level **Billing Aggregate** — the element type of\n`fullTermBillingInfo.lines`.\n\nA billing line is deliberately a NAME, a DIRECTION and a SIGNED AMOUNT, and\nnothing else. It carries no pricing `classification` and feeds no rollup,\nexactly as a pricing component carries no invoice type and no line item: the\npricing and billing vocabularies are disjoint.\n\nThe line's identity is the pair `\u003cinvoiceType, lineItem>`, unique within one\n`fullTermBillingInfo` container — two lines sharing that pair are rejected\nwith a `400`.\n","required":["invoiceType","lineItem","direction","amount"],"properties":{"invoiceType":{"type":"string","minLength":1,"description":"The kind of invoice the obligation belongs to, e.g. `\"Policy Invoice\"` or\n`\"Commission Invoice\"`. Free text (not a closed enum), and must be\nnon-empty.\n"},"lineItem":{"type":"string","minLength":1,"description":"The line item within that invoice type, e.g. `\"Premium Installment\"` or\n`\"Producer Commission\"`. Free text (not a closed enum), and must be\nnon-empty.\n"},"direction":{"type":"string","enum":["receivable","payable"],"description":"Which way the money moves. `receivable` is owed TO us (premium, taxes,\nfees); `payable` is owed BY us (commission). The direction comes from the\nline item type's own configuration, so the value you send is a **checked\nassertion** rather than an input: a mismatch is refused. That is what lets a\npayable commission line sit in the same aggregate as the receivables and\nself-exclude from the receivable checksum.\n"},"amount":{"type":"number","description":"The line's amount as a plain number in USD. It is **signed** and must be\nfinite: a price refund is a negative receivable.\n"}},"additionalProperties":true},"uniqueKey":"fullTermBillingInfo.oneOf.0.lines.oneOf.1","typeLabel":"null"}],"uniqueKey":"fullTermBillingInfo.oneOf.0.lines","typeLabel":"object[] | null"}},"additionalProperties":true,"isRequired":true,"uniqueKey":"fullTermBillingInfo.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"fullTermBillingInfo.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"fullTermBillingInfo","typeLabel":"object | null"},"fullTermPolicyRatingResult":{"oneOf":[{"type":"object","description":"Derived canonical policy-level rating result for the full term, hoisted as a\nread-once convenience (also duplicated in every segment). Element-level rating\noutput (`crossSegmentRatingOutputs`) stays inline at its host and is not hoisted.\n","additionalProperties":true,"isRequired":true,"uniqueKey":"fullTermPolicyRatingResult.oneOf.0","typeLabel":"object"},{"type":"null","description":"Derived canonical policy-level rating result for the full term, hoisted as a\nread-once convenience (also duplicated in every segment). Element-level rating\noutput (`crossSegmentRatingOutputs`) stays inline at its host and is not hoisted.\n","additionalProperties":true,"isRequired":true,"uniqueKey":"fullTermPolicyRatingResult.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"fullTermPolicyRatingResult","typeLabel":"object | null"},"segments":{"type":"array","description":"Derived segments for this policy version. Each segment represents a maximal contiguous\ndate range where policy state is identical. Adjacent segments with identical data are\nautomatically merged.\n","items":{"type":"object","description":"A derived policy segment representing a date range where policy state is identical.\nContains the full policy data (policy-level fields and nested exposures) for this period.\n","required":["startDate","endDate","data","transactionType"],"properties":{"startDate":{"type":"string","format":"date","description":"Segment start date (ISO 8601)","isRequired":true,"uniqueKey":"segments.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","format":"date","description":"Segment end date (ISO 8601)","isRequired":true,"uniqueKey":"segments.items.[INDEX].endDate","typeLabel":"string\u003cdate>"},"data":{"type":"object","description":"Policy state for this segment: the policy-level fields and their nested\nexposure containers, at the top level of this object.\n\nBefore 2026-08-05 this member was named `fieldModelV1Data` and wrapped the\nsame fields in an extra `policy` key. Read `data.policyNumber` where you\nread `fieldModelV1Data.policy.policyNumber`.\n","additionalProperties":true,"isRequired":true,"uniqueKey":"segments.items.[INDEX].data","typeLabel":"object"},"transactionType":{"oneOf":[{"type":"string","enum":["NEW_BUSINESS","ENDORSE","CANCEL","REINSTATE","RENEW"],"description":"The policy transaction that wrote this segment. Every transaction rewrites\nthe full segment set at its own policy version, so this is the version's\ntransaction type: the segments of a renewed term read `RENEW`, and an\nendorsement's version reads `ENDORSE` while the versions beneath it keep\nthe type that wrote them.\n\n`null` means UNKNOWN — the segment was written before this member existed.\nDo not read a null as new business.\n","isRequired":true,"uniqueKey":"segments.items.[INDEX].transactionType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["NEW_BUSINESS","ENDORSE","CANCEL","REINSTATE","RENEW"],"description":"The policy transaction that wrote this segment. Every transaction rewrites\nthe full segment set at its own policy version, so this is the version's\ntransaction type: the segments of a renewed term read `RENEW`, and an\nendorsement's version reads `ENDORSE` while the versions beneath it keep\nthe type that wrote them.\n\n`null` means UNKNOWN — the segment was written before this member existed.\nDo not read a null as new business.\n","isRequired":true,"uniqueKey":"segments.items.[INDEX].transactionType.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"segments.items.[INDEX].transactionType","typeLabel":"enum\u003cstring> | null"}},"uniqueKey":"segments.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"segments","typeLabel":"object[]"},"ignoredDeltas":{"type":"array","description":"Present when the endorsement dropped deltas under a calculated or system-managed Policy field. Each names the delta's `path` and, for a calculated field, `derivedFrom`: the Policy fields to write instead. A replay with the same `Idempotency-Key` returns the saved version without it.","items":{"type":"object","required":["path"],"properties":{"path":{"type":"string","isRequired":true,"uniqueKey":"ignoredDeltas.items.[INDEX].path","typeLabel":"string"},"derivedFrom":{"type":"array","items":{"type":"string","uniqueKey":"ignoredDeltas.items.[INDEX].derivedFrom.items.[INDEX]","typeLabel":"string"},"uniqueKey":"ignoredDeltas.items.[INDEX].derivedFrom","typeLabel":"string[]"}},"uniqueKey":"ignoredDeltas.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ignoredDeltas","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"success":{"title":"success","value":{"policyId":"550e8400-e29b-41d4-a716-446655440001","policyVersion":2,"transactionId":"550e8400-e29b-41d4-a716-446655440030","startDate":"2025-01-01","endDate":"2025-12-31","createdAt":"2025-04-01T10:30:00.000Z","primaryInsuredName":"Mercy General Hospital","primaryInsuredId":"550e8400-e29b-41d4-a716-446655440010","policyNumber":"POL-2025-0001","policyStartDate":{"date":"2025-01-01","timezone":"America/New_York"},"policyEndDate":{"date":"2025-12-31","timezone":"America/New_York"},"fullTermPricingInfo":{"premium":102000,"taxes":0,"fees":500,"total":102500,"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","qualifier":"","earningSchedule":"pro-rata","value":102000},{"label":"Policy Fee","classification":"policy-fee","qualifier":"","earningSchedule":"pro-rata","value":500}]},"fullTermBillingInfo":null,"fullTermPolicyRatingResult":null,"segments":[{"startDate":"2025-01-01","endDate":"2025-03-31","transactionType":"ENDORSE","data":{"policyStatus":"active","annualPremium":85000,"fullTermPricingInfo":{"premium":102000,"taxes":0,"fees":500,"total":102500,"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","qualifier":"","earningSchedule":"pro-rata","value":102000},{"label":"Policy Fee","classification":"policy-fee","qualifier":"","earningSchedule":"pro-rata","value":500}]}}},{"startDate":"2025-04-01","endDate":"2025-12-31","transactionType":"ENDORSE","data":{"policyStatus":"active","annualPremium":102000,"fullTermPricingInfo":{"premium":102000,"taxes":0,"fees":500,"total":102500,"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","qualifier":"","earningSchedule":"pro-rata","value":102000},{"label":"Policy Fee","classification":"policy-fee","qualifier":"","earningSchedule":"pro-rata","value":500}]}}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"11c5f72e-51c0-4ca9-aaaa-5fc32693a37a":{"description":"Validation error An invalid Idempotency-Key returns `INVALID_IDEMPOTENCY_KEY`.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"noChannel":{"title":"noChannel","value":{"error":{"code":"InvalidRequest","message":"At least one channel is required (deltas, fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult, or crossSegmentRatingOutputs)"}}},"statusDelta":{"title":"statusDelta","value":{"error":{"code":"SystemOwnedPolicyValue","message":"An endorsement cannot change policyStatus: it is system-owned, and only the Cancel and Reinstate transactions switch a policy off and on. Leave it out of the deltas, or restate the value the policy holds; to cancel or reinstate the policy, use the Cancel or Reinstate transaction."}}},"termLengthening":{"title":"termLengthening","value":{"error":{"code":"TermLengtheningNotSupported","message":"Cannot lengthen the policy term: policy.policyEndDate moves the term end from 2025-12-31 to 2026-03-31, which claims days no endorsement can create (empty-day generation is new-business-only). Shortening the term is allowed — send it as a whole-term root write on `deltas`. A real term extension is tracked in #5844."}}},"effectiveDateOutsideTerm":{"title":"effectiveDateOutsideTerm","value":{"error":{"code":"InvalidRequest","message":"Transaction effectiveDate (2026-03-01) must be within policy period [2025-01-01, 2025-12-31]"}}},"timestampNotMonotonic":{"title":"timestampNotMonotonic","value":{"error":{"code":"InvalidRequest","message":"transactionTimestamp (2025-03-28T14:30:00Z) is earlier than the latest existing transaction on this policy (2025-04-01T10:30:00.000Z)"}}},"noExistingVersion":{"title":"noExistingVersion","value":{"error":{"code":"InvalidRequest","message":"Policy has no existing version — NEW_BUSINESS must be created first"}}},"deltaOutsidePolicyPeriod":{"title":"deltaOutsidePolicyPeriod","value":{"error":{"code":"InvalidDelta","message":"Delta date range [2026-06-01, 2026-12-31] falls outside policy period [2025-01-01, 2025-12-31]"}}},"deltaStartAfterEnd":{"title":"deltaStartAfterEnd","value":{"error":{"code":"InvalidDelta","message":"Delta startDate (2025-12-31) must be \u003c= endDate (2025-01-01)"}}},"deltaStartNotEffectiveDate":{"title":"deltaStartNotEffectiveDate","value":{"error":{"code":"InvalidDelta","message":"Per-segment delta startDate (2025-05-01) for path \"policy.annualPremium\" must equal transaction effectiveDate (2025-04-01)"}}},"duplicatePath":{"title":"duplicatePath","value":{"error":{"code":"InvalidDelta","message":"Two deltas in this transaction share the path \"policy.annualPremium\" — within-transaction conflicts cannot be resolved by insertion order"}}},"pathPrefixConflict":{"title":"pathPrefixConflict","value":{"error":{"code":"InvalidDelta","message":"Delta paths \"policy.exposures\" and \"policy.exposures[id = '550e8400-e29b-41d4-a716-446655440010'].bedCount\" overlap — a delta cannot target both an object and one of its descendants in the same transaction"}}},"fullTermPathInDeltas":{"title":"fullTermPathInDeltas","value":{"error":{"code":"InvalidDelta","message":"Invalid deltas path \"policy.fullTermPricingInfo.premium\" — full-term container paths cannot be written by a caller. The pricing and rating-result containers have their own endorse channels"}}},"legacyDateShape":{"title":"legacyDateShape","value":{"error":{"code":"InvalidDelta","message":"Endorse deltas must carry Date values as { date: \"YYYY-MM-DD\", timezone: IANA zone }; the retired { day, month, year, timezone } spelling is not accepted on this channel and is never converted. 1 Date value refused: deltas[0].value","details":[{"field":"deltas[0].value","code":"INVALID_CANONICAL_VALUE","reason":"non-canonical-value","expected":"{ date: \"YYYY-MM-DD\", timezone: IANA zone }","message":"Date value at \"deltas[0].value\" is the retired { day, month, year, timezone } shape; write { date: \"YYYY-MM-DD\", timezone: IANA zone }."}]}}},"dateMemberPath":{"title":"dateMemberPath","value":{"error":{"code":"InvalidDelta","message":"Delta path \"policy.policyEndDate.year\" addresses a member of the Date field \"policy.policyEndDate\". A Date is written whole — Overwrite \"policy.policyEndDate\" with { date: \"YYYY-MM-DD\", timezone: IANA zone } — never member by member; those members exist only in the retired { day, month, year, timezone } shape."}}},"wholeTermWindowRequired":{"title":"wholeTermWindowRequired","value":{"error":{"code":"InvalidDelta","message":"Delta path \"policy.policyEndDate\" is invariant across the policy term, so its window must be the whole term [2025-01-01, 2025-12-31] — got [2025-04-01, 2025-12-31]"}}},"ambiguousPredicate":{"title":"ambiguousPredicate","value":{"error":{"code":"InvalidDelta","message":"Predicate exposures[exposureType = 'MedicalFacility'] matched 2 elements — it must resolve to exactly one"}}},"predicateMatchesNoElement":{"title":"predicateMatchesNoElement","value":{"error":{"code":"InvalidDelta","message":"No element in 'exposures' matches id = '550e8400-e29b-41d4-a716-446655440099'"}}},"pricingStackLayerChangeSameLayer":{"title":"pricingStackLayerChangeSameLayer","value":{"error":{"code":"VALIDATION_ERROR","message":"pricingStackLayerChange.to: pricingStackLayerChange names the same layer as from and to. Name two different layers, or leave pricingStackLayerChange out to keep the policy at its layer.","userMessages":["pricingStackLayerChange names the same layer as from and to. Name two different layers, or leave pricingStackLayerChange out to keep the policy at its layer."],"details":[{"field":"pricingStackLayerChange.to","message":"pricingStackLayerChange names the same layer as from and to. Name two different layers, or leave pricingStackLayerChange out to keep the policy at its layer."}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"962a40ba-9e4e-4ce5-aca1-a3eac1fa4f8f":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"missingApiKey":{"title":"missingApiKey","value":{"error":{"code":"AuthenticationError","message":"API key authentication required","userMessages":["API key authentication required"]}}},"invalidApiKey":{"title":"invalidApiKey","value":{"error":{"code":"AuthenticationError","message":"Invalid API key","userMessages":["Invalid API key"]}}}},"exampleType":"examples"}},"exampleType":"examples"},"a7beda41-9cf7-48ed-844e-91ba5de89c00":{"description":"Forbidden. The API key lacks the transaction's permission. Nothing is saved.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"insufficientPermissions":{"title":"insufficientPermissions","value":{"error":{"code":"AuthorizationError","message":"User is not authorized to perform the requested action","userMessages":["User is not authorized to perform the requested action"]}}},"companyMismatch":{"title":"companyMismatch","value":{"error":{"code":"AuthorizationError","message":"API key is not scoped to the requested company","userMessages":["API key is not scoped to the requested company"]}}}},"exampleType":"examples"}},"exampleType":"examples"},"866e2252-47b1-4631-8b9f-bb95defbd0ee":{"description":"Policy or an invoice referenced by invoicePlan not found","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"policyNotFound":{"title":"policyNotFound","value":{"error":{"code":"NOT_FOUND","message":"Policy 550e8400-e29b-41d4-a716-446655440099 not found"}}}},"exampleType":"examples"}},"exampleType":"examples"},"5236beb2-b12e-408c-8f49-759588dbc3a7":{"description":"The endorsement conflicts with the policy's state; no policy version or invoice action was committed. `PolicyCancelled`: the policy's latest version carries a cancellation, in effect or still to come, and a cancelled policy takes no endorsement until it is reinstated. Reinstate it with [Reinstate Policy Transaction](/api-reference/field-model-policy-transactions/reinstate-policy-transaction), then endorse it. `finv2-invoice-head-conflict`: a void watermark in `invoicePlan` is stale.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"policyCancelled":{"title":"policyCancelled","value":{"error":{"code":"PolicyCancelled","message":"Policy P-1001 is cancelled from 2025-09-01, so it cannot be endorsed. Reinstate it first, then endorse it.","userMessages":["Policy P-1001 is cancelled from 2025-09-01, so it cannot be endorsed. Reinstate it first, then endorse it."]}}}},"exampleType":"examples"}},"exampleType":"examples"},"f8fc6cb7-e169-4f71-b2c2-f3e50a3c46e6":{"description":"invoicePlan failed policy-invoice binding, conservation, payment-lock, or restating preconditions, or the change failed the continuity check (`policy-pricing-stack-layer-change`: it moves the policy between layers of the pricing stack without naming the move in `pricingStackLayerChange`, or names a move it does not make); no policy version or invoice action was committed. Reusing an Idempotency-Key with a different request returns `IDEMPOTENCY_KEY_REUSED`.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"unnamedPricingStackLayerChange":{"title":"unnamedPricingStackLayerChange","value":{"error":{"code":"policy-pricing-stack-layer-change","message":"This change moves policy 550e8400-e29b-41d4-a716-446655440000 from the billing layer (pricing and billing, no active invoices) to the pricing layer (pricing, no billing), and a change that moves a policy between layers must name the move. To make it, send pricingStackLayerChange: {\"from\":\"billing\",\"to\":\"pricing\"} with the request; to keep policy 550e8400-e29b-41d4-a716-446655440000 at the billing layer, change the request so it does not move.","userMessages":["This change moves policy 550e8400-e29b-41d4-a716-446655440000 from the billing layer (pricing and billing, no active invoices) to the pricing layer (pricing, no billing), and a change that moves a policy between layers must name the move. To make it, send pricingStackLayerChange: {\"from\":\"billing\",\"to\":\"pricing\"} with the request; to keep policy 550e8400-e29b-41d4-a716-446655440000 at the billing layer, change the request so it does not move."]}}},"namedMoveNotMade":{"title":"namedMoveNotMade","value":{"error":{"code":"policy-pricing-stack-layer-change","message":"This change names pricingStackLayerChange: {\"from\":\"billing\",\"to\":\"pricing\"}, but it keeps policy 550e8400-e29b-41d4-a716-446655440000 at the billing layer (pricing and billing, no active invoices). Send it without pricingStackLayerChange, or change it so it makes the move it names.","userMessages":["This change names pricingStackLayerChange: {\"from\":\"billing\",\"to\":\"pricing\"}, but it keeps policy 550e8400-e29b-41d4-a716-446655440000 at the billing layer (pricing and billing, no active invoices). Send it without pricingStackLayerChange, or change it so it makes the move it names."]}}},"invoicesKeptWhileInvoicingDisabled":{"title":"invoicesKeptWhileInvoicingDisabled","value":{"error":{"code":"finv2-policy-restates-invoices","message":"Policy invoicing is not enabled for this company, so a change to policy 550e8400-e29b-41d4-a716-446655440000 stores no billing, and its 2 active invoices must be voided first. Void them with POST /api/v1/companies/550e8400-e29b-41d4-a716-446655440001/financials/policies/550e8400-e29b-41d4-a716-446655440000/invoices/batch, sending voidInvoices (each invoiceId with its headJournalId from GET /api/v1/companies/550e8400-e29b-41d4-a716-446655440001/financials/invoices?linkedPolicy=550e8400-e29b-41d4-a716-446655440000) and no creates; remove an invoice's payments first with Remove Payment. Then send the change again.","userMessages":["Policy invoicing is not enabled for this company, so a change to policy 550e8400-e29b-41d4-a716-446655440000 stores no billing, and its 2 active invoices must be voided first. Void them with POST /api/v1/companies/550e8400-e29b-41d4-a716-446655440001/financials/policies/550e8400-e29b-41d4-a716-446655440000/invoices/batch, sending voidInvoices (each invoiceId with its headJournalId from GET /api/v1/companies/550e8400-e29b-41d4-a716-446655440001/financials/invoices?linkedPolicy=550e8400-e29b-41d4-a716-446655440000) and no creates; remove an invoice's payments first with Remove Payment. Then send the change again."]}}}},"exampleType":"examples"}},"exampleType":"examples"},"1bfdd691-f36c-4ebc-ae2e-e7744fc7e6ef":{"description":"Internal Server Error - Unexpected error occurred","content":{"application/json":{"schema":{"type":"object","description":"Standard error response for all external API endpoints","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"submissionId: Required field is missing","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"userMessages":{"type":"array","description":"Clean, verbatim-displayable messages — one entry per failure, free of error-code tags, field paths, and internal noise. Suitable for showing to end users as-is.","items":{"type":"string","uniqueKey":"error.userMessages.items.[INDEX]","typeLabel":"string"},"example":["Exposures of type 'company' require an address"],"uniqueKey":"error.userMessages","typeLabel":"string[]"},"details":{"type":"array","description":"Additional details for validation errors (field-level errors)","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that caused the error","example":"submissionId","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable problem code for this individual validation failure","example":"BLANK_LIST_ELEMENT","uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"reason":{"type":"string","description":"Stable reason the value violates its canonical contract","example":"blank-list-element","uniqueKey":"error.details.items.[INDEX].reason","typeLabel":"string"},"expected":{"type":"string","description":"The expected canonical value contract","example":"nonblank trimmed string","uniqueKey":"error.details.items.[INDEX].expected","typeLabel":"string"},"message":{"type":"string","description":"Description of the field error","example":"Required field is missing","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"internalError":{"title":"internalError","value":{"error":{"code":"UncaughtActionError","message":"Uncaught error occurred in \u003cactionName>","userMessages":["An unexpected error occurred. Please try again later."]}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"35370c79-340a-4ed7-a68a-8c786f4a2235":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"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.","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"b4993f5b-e21e-4dbd-8ace-9c59b5197d8e":{"url":"https://go.aiinsurance.io","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"Authorization","description":"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.","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"Authorization","type":"string","description":"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.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"Authorization"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"openapi/generated-external-api.yaml"},"subdomain":"ai-insurance-fmv1","siteName":"AI Insurance","title":"Endorse Policy Transaction - AI Insurance","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T17:32:13.593Z","originalFileLocation":"api-reference/field-model-policy-transactions/endorse-policy-transaction.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE transaction: change coverages, limits, insureds or other field values from a date, and restate the premium and billing when the price moves. Use it when you already hold the change; to endorse through a quote, generate the draft with Generate Quote from Policy (Stateless) (generateQuote) and transactionType: ENDORSE. A cancelled policy takes no endorsement until Reinstate Policy Transaction (reinstatePolicyTransaction) brings it back. Value door (Invoicing a policy). The policy\u0026#x27;s invoices change only as the request says: the invoicePlan you send voids the invoices it names and creates new ones, committed with the policy version, and without one every invoice stays as it is. Applies an ENDORSE transaction to an existing policy. An endorsement carries one or more of five channels. The engine recomputes segments after applying every channel — adjacent segments with identical data are automatically merged — and the response includes the full resulting segment set. A cancelled policy takes no endorsement. Cancel and reinstate only switch a policy off and on; every other change is an endorsement. A policy whose latest version carries a cancellation, whether it has taken effect or is still to come, is refused with 409 PolicyCancelled until it is reinstated. To change a policy and cancel it, endorse it and then cancel it; to reinstate it with changes, reinstate it and then endorse it. An endorsement does not switch a policy off or on. policy.policyStatus and policy.cancellationEffectiveOnDate are owned by the platform: only Cancel Policy Transaction and Reinstate Policy Transaction change them. A delta that would change either one, directly or inside a whole-policy Overwrite, is refused with 400 SystemOwnedPolicyValue, and nothing is saved. A delta that restates the value the policy holds is accepted and dropped, so a whole policy object read and sent back still endorses; a whole-policy Overwrite that leaves them out keeps them. A delta under a calculated field is not applied. The configuration calculates such a field (Get Policy Configuration marks it readOnly and x-calculated), so the endorsement drops the delta and still succeeds. The response lists each one in ignoredDeltas, with derivedFrom, the Policy fields the calculation reads: write those instead. A property schedule built from the policy\u0026#x27;s exposures, for example, changes when you add an exposure to policy.exposures. Input channel: - deltas — changes to policy field data. Each carries its own startDate / endDate within the policy term, a path, an action (Add / Remove / Overwrite), and a value. Amending the term. Shortening a term is a deltas write to the ROOT policy.policyEndDate (or policy.policyStartDate) stating the whole term as its window. There is no separate policy-info channel — the retired fullTermDeltas container channel was removed once the root fields became the single writable source. Whole-term policy fields. Four ROOT paths hold values that are invariant across the policy term — policy.policyNumber, policy.policyStartDate, policy.policyEndDate and policy.previousPolicy. A delta on deltas that touches one of them (at any depth, and including an ancestor path such as a whole-policy Overwrite) must state the whole term as its window (startDate = the policy start, endDate = the policy end) or the write is rejected. A term bound may not move outward, through either input channel and at any path depth: moving policyEndDate later or policyStartDate earlier is rejected (TermLengtheningNotSupported), because no endorsement path can create the extra days. Date values. A deltas value written to a Date field — at any depth, including a Date nested inside a custom object or an embedded exposure — must be the canonical { date: \u0026quot;YYYY-MM-DD\u0026quot;, timezone } object (the Fmv1Date schema) with both members stated. Delta values are stored exactly as sent, so this channel never converts: the retired { day, month, year, timezone } spelling is refused (400, InvalidDelta), and so is a write to a single member of a Date (policy.policyEndDate.year) — a Date is written whole. Derived channels (additive on either input channel): - fullTermPricingInfo — whole-object overwrite of the policy-root pricing contract. Supply pricingComponents (each {label, value, classification[, qualifier, earningSchedule]} — every component must name a live classification from your company\u0026#x27;s classification registry); the four rollups (premium, taxes, fees, total) are computed by the platform from the components — any caller-supplied rollup value is ignored and recomputed. - fullTermBillingInfo — whole-object overwrite of the policy-root Billing Aggregate: { lines: [{ invoiceType, lineItem, direction, amount }] }, the term\u0026#x27;s billing obligations free of invoices, with no rollup and no classification. An endorsement that moves the price must restate these lines: a stated aggregate\u0026#x27;s receivable lines must sum to fullTermPricingInfo.total, so moving the price without restating them is refused. - fullTermPolicyRatingResult — whole-object overwrite of the policy-root canonical rating result (the twin of fullTermPricingInfo). - crossSegmentRatingOutputs — element-level rating output, [{ path, value }]. Each path terminates at a crossSegmentRatingOutputs container on a list element (or the policy); value is the whole rating-output object for that host. There is no action (always an Overwrite) and no dates — the server derives each write\u0026#x27;s range from the host\u0026#x27;s presence across segments, so it applies cleanly to part-term hosts. At least one channel is required. Any of deltas, fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult or crossSegmentRatingOutputs satisfies it, so an endorsement that restates only the Billing Aggregate is a legal transaction on its own. Path syntax — predicate addressing. Index into a list by a predicate on any field: policy.exposures[id = \u0026#x27;\u0026#x27;].bedCount, policy.coverages[coverageType = \u0026#x27;GL\u0026#x27;].limits[name = \u0026#x27;occurrence\u0026#x27;]. The predicate must resolve to exactly one element wherever it is applied (throws on zero or multiple matches) — this uniqueness rule is the cross-segment identity guarantee. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. Once active invoices exist, a change that moves the billing they add up to must carry a plan, so kept and new invoices add up to the new billing; without one it is refused with 422 finv2-policy-restates-invoices. The version and invoices commit atomically. Billing. Stores the caller\u0026#x27;s billing as stated, without scaling, restoring or carrying billing from the policy: billing you leave out stores none. To keep a billed policy\u0026#x27;s billing, state fullTermBillingInfo again, changed or unchanged. Kept and new invoices must still add up to the billing, as Invoice plans explains. The policy\u0026#x27;s layer. A policy sits at a layer of its pricing stack, read from its pricing, its billing and its active invoices. An endorsement keeps the policy at its layer unless pricingStackLayerChange names the move it makes: - leaving out fullTermBillingInfo on a billed policy drops its billing, a move from billing to pricing; - stating billing on a policy that has none moves it from pricing to billing; - an invoicePlan that voids every active invoice moves the policy down from invoicing, and one that gives it its first invoices moves it up to invoicing. A plan that voids every active invoice and creates none needs no billing, so one endorsement can take an invoiced policy to pricing with pricingStackLayerChange: {\u0026quot;from\u0026quot;: \u0026quot;invoicing\u0026quot;, \u0026quot;to\u0026quot;: \u0026quot;pricing\u0026quot;}. A move the request does not name, or a named move it does not make, returns 422 policy-pricing-stack-layer-change and saves nothing; its message names the actual move and the exact pricingStackLayerChange that would name it. Billing that owes nothing sits at both billing and invoicing, so a change between those two needs no pricingStackLayerChange. Required permission: policy.endorse\">\u003cmeta data-mint-head name=\"application-name\" content=\"AI Insurance\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Endorse Policy Transaction - AI Insurance\">\u003cmeta data-mint-head property=\"og:description\" content=\"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE transaction: change coverages, limits, insureds or other field values from a date, and restate the premium and billing when the price moves. Use it when you already hold the change; to endorse through a quote, generate the draft with Generate Quote from Policy (Stateless) (generateQuote) and transactionType: ENDORSE. A cancelled policy takes no endorsement until Reinstate Policy Transaction (reinstatePolicyTransaction) brings it back. Value door (Invoicing a policy). The policy\u0026#x27;s invoices change only as the request says: the invoicePlan you send voids the invoices it names and creates new ones, committed with the policy version, and without one every invoice stays as it is. Applies an ENDORSE transaction to an existing policy. An endorsement carries one or more of five channels. The engine recomputes segments after applying every channel — adjacent segments with identical data are automatically merged — and the response includes the full resulting segment set. A cancelled policy takes no endorsement. Cancel and reinstate only switch a policy off and on; every other change is an endorsement. A policy whose latest version carries a cancellation, whether it has taken effect or is still to come, is refused with 409 PolicyCancelled until it is reinstated. To change a policy and cancel it, endorse it and then cancel it; to reinstate it with changes, reinstate it and then endorse it. An endorsement does not switch a policy off or on. policy.policyStatus and policy.cancellationEffectiveOnDate are owned by the platform: only Cancel Policy Transaction and Reinstate Policy Transaction change them. A delta that would change either one, directly or inside a whole-policy Overwrite, is refused with 400 SystemOwnedPolicyValue, and nothing is saved. A delta that restates the value the policy holds is accepted and dropped, so a whole policy object read and sent back still endorses; a whole-policy Overwrite that leaves them out keeps them. A delta under a calculated field is not applied. The configuration calculates such a field (Get Policy Configuration marks it readOnly and x-calculated), so the endorsement drops the delta and still succeeds. The response lists each one in ignoredDeltas, with derivedFrom, the Policy fields the calculation reads: write those instead. A property schedule built from the policy\u0026#x27;s exposures, for example, changes when you add an exposure to policy.exposures. Input channel: - deltas — changes to policy field data. Each carries its own startDate / endDate within the policy term, a path, an action (Add / Remove / Overwrite), and a value. Amending the term. Shortening a term is a deltas write to the ROOT policy.policyEndDate (or policy.policyStartDate) stating the whole term as its window. There is no separate policy-info channel — the retired fullTermDeltas container channel was removed once the root fields became the single writable source. Whole-term policy fields. Four ROOT paths hold values that are invariant across the policy term — policy.policyNumber, policy.policyStartDate, policy.policyEndDate and policy.previousPolicy. A delta on deltas that touches one of them (at any depth, and including an ancestor path such as a whole-policy Overwrite) must state the whole term as its window (startDate = the policy start, endDate = the policy end) or the write is rejected. A term bound may not move outward, through either input channel and at any path depth: moving policyEndDate later or policyStartDate earlier is rejected (TermLengtheningNotSupported), because no endorsement path can create the extra days. Date values. A deltas value written to a Date field — at any depth, including a Date nested inside a custom object or an embedded exposure — must be the canonical { date: \u0026quot;YYYY-MM-DD\u0026quot;, timezone } object (the Fmv1Date schema) with both members stated. Delta values are stored exactly as sent, so this channel never converts: the retired { day, month, year, timezone } spelling is refused (400, InvalidDelta), and so is a write to a single member of a Date (policy.policyEndDate.year) — a Date is written whole. Derived channels (additive on either input channel): - fullTermPricingInfo — whole-object overwrite of the policy-root pricing contract. Supply pricingComponents (each {label, value, classification[, qualifier, earningSchedule]} — every component must name a live classification from your company\u0026#x27;s classification registry); the four rollups (premium, taxes, fees, total) are computed by the platform from the components — any caller-supplied rollup value is ignored and recomputed. - fullTermBillingInfo — whole-object overwrite of the policy-root Billing Aggregate: { lines: [{ invoiceType, lineItem, direction, amount }] }, the term\u0026#x27;s billing obligations free of invoices, with no rollup and no classification. An endorsement that moves the price must restate these lines: a stated aggregate\u0026#x27;s receivable lines must sum to fullTermPricingInfo.total, so moving the price without restating them is refused. - fullTermPolicyRatingResult — whole-object overwrite of the policy-root canonical rating result (the twin of fullTermPricingInfo). - crossSegmentRatingOutputs — element-level rating output, [{ path, value }]. Each path terminates at a crossSegmentRatingOutputs container on a list element (or the policy); value is the whole rating-output object for that host. There is no action (always an Overwrite) and no dates — the server derives each write\u0026#x27;s range from the host\u0026#x27;s presence across segments, so it applies cleanly to part-term hosts. At least one channel is required. Any of deltas, fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult or crossSegmentRatingOutputs satisfies it, so an endorsement that restates only the Billing Aggregate is a legal transaction on its own. Path syntax — predicate addressing. Index into a list by a predicate on any field: policy.exposures[id = \u0026#x27;\u0026#x27;].bedCount, policy.coverages[coverageType = \u0026#x27;GL\u0026#x27;].limits[name = \u0026#x27;occurrence\u0026#x27;]. The predicate must resolve to exactly one element wherever it is applied (throws on zero or multiple matches) — this uniqueness rule is the cross-segment identity guarantee. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. Once active invoices exist, a change that moves the billing they add up to must carry a plan, so kept and new invoices add up to the new billing; without one it is refused with 422 finv2-policy-restates-invoices. The version and invoices commit atomically. Billing. Stores the caller\u0026#x27;s billing as stated, without scaling, restoring or carrying billing from the policy: billing you leave out stores none. To keep a billed policy\u0026#x27;s billing, state fullTermBillingInfo again, changed or unchanged. Kept and new invoices must still add up to the billing, as Invoice plans explains. The policy\u0026#x27;s layer. A policy sits at a layer of its pricing stack, read from its pricing, its billing and its active invoices. An endorsement keeps the policy at its layer unless pricingStackLayerChange names the move it makes: - leaving out fullTermBillingInfo on a billed policy drops its billing, a move from billing to pricing; - stating billing on a policy that has none moves it from pricing to billing; - an invoicePlan that voids every active invoice moves the policy down from invoicing, and one that gives it its first invoices moves it up to invoicing. A plan that voids every active invoice and creates none needs no billing, so one endorsement can take an invoiced policy to pricing with pricingStackLayerChange: {\u0026quot;from\u0026quot;: \u0026quot;invoicing\u0026quot;, \u0026quot;to\u0026quot;: \u0026quot;pricing\u0026quot;}. A move the request does not name, or a named move it does not make, returns 422 policy-pricing-stack-layer-change and saves nothing; its message names the actual move and the exact pricingStackLayerChange that would name it. Billing that owes nothing sits at both billing and invoicing, so a change between those two needs no pricingStackLayerChange. Required permission: policy.endorse\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"AI Insurance\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ai-insurance-fmv1.mintlify.site/_mintlify/api/og/v2?division=Transactions\u0026amp;title=Endorse+Policy+Transaction\u0026amp;description=Makes+a+mid-term+change+to+a+bound+policy+%28an+endorsement%29+as+an+ENDORSE%0Atransaction%3A+change+coverages%2C+limits%2C+insureds+or+other+field+values+from+a%0Adate%2C+and+\u0026amp;theme=0995c531691aeb9df7f9b066\u0026amp;signature=131d1d58f290a3aa0d4c63a15786f88180e5d1b5bf975513d30adb77367fdee8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Endorse Policy Transaction - AI Insurance\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE transaction: change coverages, limits, insureds or other field values from a date, and restate the premium and billing when the price moves. Use it when you already hold the change; to endorse through a quote, generate the draft with Generate Quote from Policy (Stateless) (generateQuote) and transactionType: ENDORSE. A cancelled policy takes no endorsement until Reinstate Policy Transaction (reinstatePolicyTransaction) brings it back. Value door (Invoicing a policy). The policy\u0026#x27;s invoices change only as the request says: the invoicePlan you send voids the invoices it names and creates new ones, committed with the policy version, and without one every invoice stays as it is. Applies an ENDORSE transaction to an existing policy. An endorsement carries one or more of five channels. The engine recomputes segments after applying every channel — adjacent segments with identical data are automatically merged — and the response includes the full resulting segment set. A cancelled policy takes no endorsement. Cancel and reinstate only switch a policy off and on; every other change is an endorsement. A policy whose latest version carries a cancellation, whether it has taken effect or is still to come, is refused with 409 PolicyCancelled until it is reinstated. To change a policy and cancel it, endorse it and then cancel it; to reinstate it with changes, reinstate it and then endorse it. An endorsement does not switch a policy off or on. policy.policyStatus and policy.cancellationEffectiveOnDate are owned by the platform: only Cancel Policy Transaction and Reinstate Policy Transaction change them. A delta that would change either one, directly or inside a whole-policy Overwrite, is refused with 400 SystemOwnedPolicyValue, and nothing is saved. A delta that restates the value the policy holds is accepted and dropped, so a whole policy object read and sent back still endorses; a whole-policy Overwrite that leaves them out keeps them. A delta under a calculated field is not applied. The configuration calculates such a field (Get Policy Configuration marks it readOnly and x-calculated), so the endorsement drops the delta and still succeeds. The response lists each one in ignoredDeltas, with derivedFrom, the Policy fields the calculation reads: write those instead. A property schedule built from the policy\u0026#x27;s exposures, for example, changes when you add an exposure to policy.exposures. Input channel: - deltas — changes to policy field data. Each carries its own startDate / endDate within the policy term, a path, an action (Add / Remove / Overwrite), and a value. Amending the term. Shortening a term is a deltas write to the ROOT policy.policyEndDate (or policy.policyStartDate) stating the whole term as its window. There is no separate policy-info channel — the retired fullTermDeltas container channel was removed once the root fields became the single writable source. Whole-term policy fields. Four ROOT paths hold values that are invariant across the policy term — policy.policyNumber, policy.policyStartDate, policy.policyEndDate and policy.previousPolicy. A delta on deltas that touches one of them (at any depth, and including an ancestor path such as a whole-policy Overwrite) must state the whole term as its window (startDate = the policy start, endDate = the policy end) or the write is rejected. A term bound may not move outward, through either input channel and at any path depth: moving policyEndDate later or policyStartDate earlier is rejected (TermLengtheningNotSupported), because no endorsement path can create the extra days. Date values. A deltas value written to a Date field — at any depth, including a Date nested inside a custom object or an embedded exposure — must be the canonical { date: \u0026quot;YYYY-MM-DD\u0026quot;, timezone } object (the Fmv1Date schema) with both members stated. Delta values are stored exactly as sent, so this channel never converts: the retired { day, month, year, timezone } spelling is refused (400, InvalidDelta), and so is a write to a single member of a Date (policy.policyEndDate.year) — a Date is written whole. Derived channels (additive on either input channel): - fullTermPricingInfo — whole-object overwrite of the policy-root pricing contract. Supply pricingComponents (each {label, value, classification[, qualifier, earningSchedule]} — every component must name a live classification from your company\u0026#x27;s classification registry); the four rollups (premium, taxes, fees, total) are computed by the platform from the components — any caller-supplied rollup value is ignored and recomputed. - fullTermBillingInfo — whole-object overwrite of the policy-root Billing Aggregate: { lines: [{ invoiceType, lineItem, direction, amount }] }, the term\u0026#x27;s billing obligations free of invoices, with no rollup and no classification. An endorsement that moves the price must restate these lines: a stated aggregate\u0026#x27;s receivable lines must sum to fullTermPricingInfo.total, so moving the price without restating them is refused. - fullTermPolicyRatingResult — whole-object overwrite of the policy-root canonical rating result (the twin of fullTermPricingInfo). - crossSegmentRatingOutputs — element-level rating output, [{ path, value }]. Each path terminates at a crossSegmentRatingOutputs container on a list element (or the policy); value is the whole rating-output object for that host. There is no action (always an Overwrite) and no dates — the server derives each write\u0026#x27;s range from the host\u0026#x27;s presence across segments, so it applies cleanly to part-term hosts. At least one channel is required. Any of deltas, fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult or crossSegmentRatingOutputs satisfies it, so an endorsement that restates only the Billing Aggregate is a legal transaction on its own. Path syntax — predicate addressing. Index into a list by a predicate on any field: policy.exposures[id = \u0026#x27;\u0026#x27;].bedCount, policy.coverages[coverageType = \u0026#x27;GL\u0026#x27;].limits[name = \u0026#x27;occurrence\u0026#x27;]. The predicate must resolve to exactly one element wherever it is applied (throws on zero or multiple matches) — this uniqueness rule is the cross-segment identity guarantee. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. Once active invoices exist, a change that moves the billing they add up to must carry a plan, so kept and new invoices add up to the new billing; without one it is refused with 422 finv2-policy-restates-invoices. The version and invoices commit atomically. Billing. Stores the caller\u0026#x27;s billing as stated, without scaling, restoring or carrying billing from the policy: billing you leave out stores none. To keep a billed policy\u0026#x27;s billing, state fullTermBillingInfo again, changed or unchanged. Kept and new invoices must still add up to the billing, as Invoice plans explains. The policy\u0026#x27;s layer. A policy sits at a layer of its pricing stack, read from its pricing, its billing and its active invoices. An endorsement keeps the policy at its layer unless pricingStackLayerChange names the move it makes: - leaving out fullTermBillingInfo on a billed policy drops its billing, a move from billing to pricing; - stating billing on a policy that has none moves it from pricing to billing; - an invoicePlan that voids every active invoice moves the policy down from invoicing, and one that gives it its first invoices moves it up to invoicing. A plan that voids every active invoice and creates none needs no billing, so one endorsement can take an invoiced policy to pricing with pricingStackLayerChange: {\u0026quot;from\u0026quot;: \u0026quot;invoicing\u0026quot;, \u0026quot;to\u0026quot;: \u0026quot;pricing\u0026quot;}. A move the request does not name, or a named move it does not make, returns 422 policy-pricing-stack-layer-change and saves nothing; its message names the actual move and the exact pricingStackLayerChange that would name it. Billing that owes nothing sits at both billing and invoicing, so a change between those two needs no pricingStackLayerChange. Required permission: policy.endorse\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ai-insurance-fmv1.mintlify.site/_mintlify/api/og/v2?division=Transactions\u0026amp;title=Endorse+Policy+Transaction\u0026amp;description=Makes+a+mid-term+change+to+a+bound+policy+%28an+endorsement%29+as+an+ENDORSE%0Atransaction%3A+change+coverages%2C+limits%2C+insureds+or+other+field+values+from+a%0Adate%2C+and+\u0026amp;theme=0995c531691aeb9df7f9b066\u0026amp;signature=131d1d58f290a3aa0d4c63a15786f88180e5d1b5bf975513d30adb77367fdee8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/ai-insurance-fmv1/OV-zcpS7BkiQB75q/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"AI Insurance\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#714CC5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/field-model-policy-transactions/endorse-policy-transaction.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.go.aiinsurance.io/#organization\",\"name\":\"AI Insurance\",\"url\":\"https://docs.go.aiinsurance.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ai-insurance-fmv1/HtPQvD-FDA5nbM7L/logo/dark.jpg?fit=max\u0026auto=format\u0026n=HtPQvD-FDA5nbM7L\u0026q=85\u0026s=14ace86d6e87c6eab47960c514760266\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.go.aiinsurance.io#website\",\"name\":\"AI Insurance\",\"url\":\"https://docs.go.aiinsurance.io\",\"publisher\":{\"@id\":\"https://docs.go.aiinsurance.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction#webpage\",\"url\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction\",\"name\":\"Endorse Policy Transaction\",\"description\":\"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE transaction: change coverages, limits, insureds or other field values from a date, and restate the premium and billing when the price moves. Use it when you already hold the change; to endorse through a quote, generate the draft with Generate Quote from Policy (Stateless) (generateQuote) and transactionType: ENDORSE. A cancelled policy takes no endorsement until Reinstate Policy Transaction (reinstatePolicyTransaction) brings it back. Value door (Invoicing a policy). The policy's invoices change only as the request says: the invoicePlan you send voids the invoices it names and creates new ones, committed with the policy version, and without one every invoice stays as it is. Applies an ENDORSE transaction to an existing policy. An endorsement carries one or more of five channels. The engine recomputes segments after applying every channel — adjacent segments with identical data are automatically merged — and the response includes the full resulting segment set. A cancelled policy takes no endorsement. Cancel and reinstate only switch a policy off and on; every other change is an endorsement. A policy whose latest version carries a cancellation, whether it has taken effect or is still to come, is refused with 409 PolicyCancelled until it is reinstated. To change a policy and cancel it, endorse it and then cancel it; to reinstate it with changes, reinstate it and then endorse it. An endorsement does not switch a policy off or on. policy.policyStatus and policy.cancellationEffectiveOnDate are owned by the platform: only Cancel Policy Transaction and Reinstate Policy Transaction change them. A delta that would change either one, directly or inside a whole-policy Overwrite, is refused with 400 SystemOwnedPolicyValue, and nothing is saved. A delta that restates the value the policy holds is accepted and dropped, so a whole policy object read and sent back still endorses; a whole-policy Overwrite that leaves them out keeps them. A delta under a calculated field is not applied. The configuration calculates such a field (Get Policy Configuration marks it readOnly and x-calculated), so the endorsement drops the delta and still succeeds. The response lists each one in ignoredDeltas, with derivedFrom, the Policy fields the calculation reads: write those instead. A property schedule built from the policy's exposures, for example, changes when you add an exposure to policy.exposures. Input channel: - deltas — changes to policy field data. Each carries its own startDate / endDate within the policy term, a path, an action (Add / Remove / Overwrite), and a value. Amending the term. Shortening a term is a deltas write to the ROOT policy.policyEndDate (or policy.policyStartDate) stating the whole term as its window. There is no separate policy-info channel — the retired fullTermDeltas container channel was removed once the root fields became the single writable source. Whole-term policy fields. Four ROOT paths hold values that are invariant across the policy term — policy.policyNumber, policy.policyStartDate, policy.policyEndDate and policy.previousPolicy. A delta on deltas that touches one of them (at any depth, and including an ancestor path such as a whole-policy Overwrite) must state the whole term as its window (startDate = the policy start, endDate = the policy end) or the write is rejected. A term bound may not move outward, through either input channel and at any path depth: moving policyEndDate later or policyStartDate earlier is rejected (TermLengtheningNotSupported), because no endorsement path can create the extra days. Date values. A deltas value written to a Date field — at any depth, including a Date nested inside a custom object or an embedded exposure — must be the canonical { date: \\\"YYYY-MM-DD\\\", timezone } object (the Fmv1Date schema) with both members stated. Delta values are stored exactly as sent, so this channel never converts: the retired { day, month, year, timezone } spelling is refused (400, InvalidDelta), and so is a write to a single member of a Date (policy.policyEndDate.year) — a Date is written whole. Derived channels (additive on either input channel): - fullTermPricingInfo — whole-object overwrite of the policy-root pricing contract. Supply pricingComponents (each {label, value, classification[, qualifier, earningSchedule]} — every component must name a live classification from your company's classification registry); the four rollups (premium, taxes, fees, total) are computed by the platform from the components — any caller-supplied rollup value is ignored and recomputed. - fullTermBillingInfo — whole-object overwrite of the policy-root Billing Aggregate: { lines: [{ invoiceType, lineItem, direction, amount }] }, the term's billing obligations free of invoices, with no rollup and no classification. An endorsement that moves the price must restate these lines: a stated aggregate's receivable lines must sum to fullTermPricingInfo.total, so moving the price without restating them is refused. - fullTermPolicyRatingResult — whole-object overwrite of the policy-root canonical rating result (the twin of fullTermPricingInfo). - crossSegmentRatingOutputs — element-level rating output, [{ path, value }]. Each path terminates at a crossSegmentRatingOutputs container on a list element (or the policy); value is the whole rating-output object for that host. There is no action (always an Overwrite) and no dates — the server derives each write's range from the host's presence across segments, so it applies cleanly to part-term hosts. At least one channel is required. Any of deltas, fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult or crossSegmentRatingOutputs satisfies it, so an endorsement that restates only the Billing Aggregate is a legal transaction on its own. Path syntax — predicate addressing. Index into a list by a predicate on any field: policy.exposures[id = ''].bedCount, policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']. The predicate must resolve to exactly one element wherever it is applied (throws on zero or multiple matches) — this uniqueness rule is the cross-segment identity guarantee. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. Once active invoices exist, a change that moves the billing they add up to must carry a plan, so kept and new invoices add up to the new billing; without one it is refused with 422 finv2-policy-restates-invoices. The version and invoices commit atomically. Billing. Stores the caller's billing as stated, without scaling, restoring or carrying billing from the policy: billing you leave out stores none. To keep a billed policy's billing, state fullTermBillingInfo again, changed or unchanged. Kept and new invoices must still add up to the billing, as Invoice plans explains. The policy's layer. A policy sits at a layer of its pricing stack, read from its pricing, its billing and its active invoices. An endorsement keeps the policy at its layer unless pricingStackLayerChange names the move it makes: - leaving out fullTermBillingInfo on a billed policy drops its billing, a move from billing to pricing; - stating billing on a policy that has none moves it from pricing to billing; - an invoicePlan that voids every active invoice moves the policy down from invoicing, and one that gives it its first invoices moves it up to invoicing. A plan that voids every active invoice and creates none needs no billing, so one endorsement can take an invoiced policy to pricing with pricingStackLayerChange: {\\\"from\\\": \\\"invoicing\\\", \\\"to\\\": \\\"pricing\\\"}. A move the request does not name, or a named move it does not make, returns 422 policy-pricing-stack-layer-change and saves nothing; its message names the actual move and the exact pricingStackLayerChange that would name it. Billing that owes nothing sits at both billing and invoicing, so a change between those two needs no pricingStackLayerChange. Required permission: policy.endorse\",\"dateModified\":\"2026-11-13T17:32:13.593Z\",\"isPartOf\":{\"@id\":\"https://docs.go.aiinsurance.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Policy Transactions\",\"item\":\"https://docs.go.aiinsurance.io/api-reference/policies/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transactions\",\"item\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/new-business-transaction\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Endorse Policy Transaction\",\"item\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction#apireference\",\"headline\":\"Endorse Policy Transaction\",\"name\":\"Endorse Policy Transaction\",\"description\":\"Makes a mid-term change to a bound policy (an endorsement) as an ENDORSE transaction: change coverages, limits, insureds or other field values from a date, and restate the premium and billing when the price moves. Use it when you already hold the change; to endorse through a quote, generate the draft with Generate Quote from Policy (Stateless) (generateQuote) and transactionType: ENDORSE. A cancelled policy takes no endorsement until Reinstate Policy Transaction (reinstatePolicyTransaction) brings it back. Value door (Invoicing a policy). The policy's invoices change only as the request says: the invoicePlan you send voids the invoices it names and creates new ones, committed with the policy version, and without one every invoice stays as it is. Applies an ENDORSE transaction to an existing policy. An endorsement carries one or more of five channels. The engine recomputes segments after applying every channel — adjacent segments with identical data are automatically merged — and the response includes the full resulting segment set. A cancelled policy takes no endorsement. Cancel and reinstate only switch a policy off and on; every other change is an endorsement. A policy whose latest version carries a cancellation, whether it has taken effect or is still to come, is refused with 409 PolicyCancelled until it is reinstated. To change a policy and cancel it, endorse it and then cancel it; to reinstate it with changes, reinstate it and then endorse it. An endorsement does not switch a policy off or on. policy.policyStatus and policy.cancellationEffectiveOnDate are owned by the platform: only Cancel Policy Transaction and Reinstate Policy Transaction change them. A delta that would change either one, directly or inside a whole-policy Overwrite, is refused with 400 SystemOwnedPolicyValue, and nothing is saved. A delta that restates the value the policy holds is accepted and dropped, so a whole policy object read and sent back still endorses; a whole-policy Overwrite that leaves them out keeps them. A delta under a calculated field is not applied. The configuration calculates such a field (Get Policy Configuration marks it readOnly and x-calculated), so the endorsement drops the delta and still succeeds. The response lists each one in ignoredDeltas, with derivedFrom, the Policy fields the calculation reads: write those instead. A property schedule built from the policy's exposures, for example, changes when you add an exposure to policy.exposures. Input channel: - deltas — changes to policy field data. Each carries its own startDate / endDate within the policy term, a path, an action (Add / Remove / Overwrite), and a value. Amending the term. Shortening a term is a deltas write to the ROOT policy.policyEndDate (or policy.policyStartDate) stating the whole term as its window. There is no separate policy-info channel — the retired fullTermDeltas container channel was removed once the root fields became the single writable source. Whole-term policy fields. Four ROOT paths hold values that are invariant across the policy term — policy.policyNumber, policy.policyStartDate, policy.policyEndDate and policy.previousPolicy. A delta on deltas that touches one of them (at any depth, and including an ancestor path such as a whole-policy Overwrite) must state the whole term as its window (startDate = the policy start, endDate = the policy end) or the write is rejected. A term bound may not move outward, through either input channel and at any path depth: moving policyEndDate later or policyStartDate earlier is rejected (TermLengtheningNotSupported), because no endorsement path can create the extra days. Date values. A deltas value written to a Date field — at any depth, including a Date nested inside a custom object or an embedded exposure — must be the canonical { date: \\\"YYYY-MM-DD\\\", timezone } object (the Fmv1Date schema) with both members stated. Delta values are stored exactly as sent, so this channel never converts: the retired { day, month, year, timezone } spelling is refused (400, InvalidDelta), and so is a write to a single member of a Date (policy.policyEndDate.year) — a Date is written whole. Derived channels (additive on either input channel): - fullTermPricingInfo — whole-object overwrite of the policy-root pricing contract. Supply pricingComponents (each {label, value, classification[, qualifier, earningSchedule]} — every component must name a live classification from your company's classification registry); the four rollups (premium, taxes, fees, total) are computed by the platform from the components — any caller-supplied rollup value is ignored and recomputed. - fullTermBillingInfo — whole-object overwrite of the policy-root Billing Aggregate: { lines: [{ invoiceType, lineItem, direction, amount }] }, the term's billing obligations free of invoices, with no rollup and no classification. An endorsement that moves the price must restate these lines: a stated aggregate's receivable lines must sum to fullTermPricingInfo.total, so moving the price without restating them is refused. - fullTermPolicyRatingResult — whole-object overwrite of the policy-root canonical rating result (the twin of fullTermPricingInfo). - crossSegmentRatingOutputs — element-level rating output, [{ path, value }]. Each path terminates at a crossSegmentRatingOutputs container on a list element (or the policy); value is the whole rating-output object for that host. There is no action (always an Overwrite) and no dates — the server derives each write's range from the host's presence across segments, so it applies cleanly to part-term hosts. At least one channel is required. Any of deltas, fullTermPricingInfo, fullTermBillingInfo, fullTermPolicyRatingResult or crossSegmentRatingOutputs satisfies it, so an endorsement that restates only the Billing Aggregate is a legal transaction on its own. Path syntax — predicate addressing. Index into a list by a predicate on any field: policy.exposures[id = ''].bedCount, policy.coverages[coverageType = 'GL'].limits[name = 'occurrence']. The predicate must resolve to exactly one element wherever it is applied (throws on zero or multiple matches) — this uniqueness rule is the cross-segment identity guarantee. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. Once active invoices exist, a change that moves the billing they add up to must carry a plan, so kept and new invoices add up to the new billing; without one it is refused with 422 finv2-policy-restates-invoices. The version and invoices commit atomically. Billing. Stores the caller's billing as stated, without scaling, restoring or carrying billing from the policy: billing you leave out stores none. To keep a billed policy's billing, state fullTermBillingInfo again, changed or unchanged. Kept and new invoices must still add up to the billing, as Invoice plans explains. The policy's layer. A policy sits at a layer of its pricing stack, read from its pricing, its billing and its active invoices. An endorsement keeps the policy at its layer unless pricingStackLayerChange names the move it makes: - leaving out fullTermBillingInfo on a billed policy drops its billing, a move from billing to pricing; - stating billing on a policy that has none moves it from pricing to billing; - an invoicePlan that voids every active invoice moves the policy down from invoicing, and one that gives it its first invoices moves it up to invoicing. A plan that voids every active invoice and creates none needs no billing, so one endorsement can take an invoiced policy to pricing with pricingStackLayerChange: {\\\"from\\\": \\\"invoicing\\\", \\\"to\\\": \\\"pricing\\\"}. A move the request does not name, or a named move it does not make, returns 422 policy-pricing-stack-layer-change and saves nothing; its message names the actual move and the exact pricingStackLayerChange that would name it. Billing that owes nothing sits at both billing and invoicing, so a change between those two needs no pricingStackLayerChange. Required permission: policy.endorse\",\"url\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction\",\"mainEntityOfPage\":{\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/endorse-policy-transaction#webpage\"},\"dateModified\":\"2026-11-13T17:32:13.593Z\",\"publisher\":{\"@id\":\"https://docs.go.aiinsurance.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.go.aiinsurance.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"AI Insurance\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"AI Insurance\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/field-model-policy-transactions/endorse-policy-transaction.md","siteName":"AI Insurance","nav":{"global":null,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":"/homepage"}]},{"tab":"App","pages":[{"title":"App","href":"/app/getting-started/overview"}]},{"tab":"Entities","pages":[{"title":"Entities","href":"/entities/overview"}]},{"tab":"Markets","pages":[{"title":"Markets","href":"/markets/overview"}]},{"tab":"Financials","pages":[{"title":"Financials","href":"/financials/overview"}]},{"tab":"API","groups":[{"group":"Getting Started","pages":[{"title":"Overview","href":"/api-reference/overview"},{"title":"Roadmap","href":"/api-reference/roadmap"},{"title":"Generating API Keys","href":"/api-reference/authentication"},{"title":"MCP Connector (Beta)","href":"/api-reference/mcp-connector"}]},{"group":"User","pages":[{"title":"Get my profile","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/me","href":"/api-reference/user/get-my-profile"},{"title":"List my accessible companies","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/me/companies","href":"/api-reference/user/list-my-accessible-companies"}]},{"group":"Companies","pages":[{"title":"Companies","href":"/api-reference/companies/overview"},{"title":"Get Company Metadata","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}","href":"/api-reference/companies/get-company-metadata"},{"title":"List Company Members","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/members","href":"/api-reference/companies/list-company-members"},{"title":"Get Company Lifecycle","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/lifecycle","href":"/api-reference/companies/get-company-lifecycle"},{"title":"Reset Sandbox","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/reset","href":"/api-reference/companies/reset-sandbox"},{"title":"Get Company Email Branding","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/email-branding","href":"/api-reference/companies/get-company-email-branding"},{"title":"Set Company Email Branding","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/email-branding","href":"/api-reference/companies/set-company-email-branding"}]},{"group":"Entities","pages":[{"title":"Overview","href":"/api-reference/entities/overview"},{"title":"List Entity Types","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entity-types","href":"/api-reference/entities/list-entity-types"},{"title":"Get Page Layout","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/pages/{pageKey}/layout","href":"/api-reference/entities/get-page-layout"},{"title":"Get Entity Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/configuration","href":"/api-reference/entities/get-entity-configuration"},{"title":"Create Entity","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}","href":"/api-reference/entities/create-entity"},{"title":"Create Entity Batch","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/batch","href":"/api-reference/entities/create-entity-batch"},{"title":"List Entities","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}","href":"/api-reference/entities/list-entities"},{"title":"Start Entity Export Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/export-runs","href":"/api-reference/entities/start-entity-export-run"},{"title":"Get Entity Export Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/export-runs/{runId}","href":"/api-reference/entities/get-entity-export-run"},{"title":"Download Entity Export Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/export-runs/{runId}/download","href":"/api-reference/entities/download-entity-export-run"},{"title":"List Export Presets For Member","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/export-presets","href":"/api-reference/entities/list-export-presets-for-member"},{"title":"Create Export Preset For Member","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/export-presets","href":"/api-reference/entities/create-export-preset-for-member"},{"title":"Replace Export Preset For Member","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/export-presets/{presetId}","href":"/api-reference/entities/replace-export-preset-for-member"},{"title":"Delete Export Preset For Member","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/export-presets/{presetId}","href":"/api-reference/entities/delete-export-preset-for-member"},{"title":"Get Entity","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/{entityId}","href":"/api-reference/entities/get-entity"},{"title":"Update Entity","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/entities/{entityType}/{entityId}","href":"/api-reference/entities/update-entity"},{"title":"Delete Entity","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/entities/{entityType}/{entityId}","href":"/api-reference/entities/delete-entity"}]},{"group":"Submission and Quote Lifecycle","pages":[{"title":"Rate, Quote, Bind","href":"/api-reference/rate-quote-bind"},{"title":"Close Submission","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/submissions/{submissionId}/close","href":"/api-reference/submission-and-quote-lifecycle/close-submission"},{"title":"Reopen Submission","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/submissions/{submissionId}/reopen","href":"/api-reference/submission-and-quote-lifecycle/reopen-submission"},{"title":"Cancel Quote","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/{quoteId}/cancel","href":"/api-reference/submission-and-quote-lifecycle/cancel-quote"}]},{"group":"Event Lifecycle","pages":[{"title":"Overview","href":"/api-reference/event-lifecycle/overview"},{"title":"Close Event","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/events/{eventId}/close","href":"/api-reference/event-lifecycle/close-event"},{"title":"Re-open Event","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/events/{eventId}/reopen","href":"/api-reference/event-lifecycle/re-open-event"},{"title":"Replace Event Open/Close History","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/events/{eventId}/open-close-history","href":"/api-reference/event-lifecycle/replace-event-openclose-history"}]},{"group":"Record Emails","pages":[{"title":"Overview","href":"/api-reference/record-emails/overview"},{"title":"List Record Email Conversations","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-conversations","href":"/api-reference/record-emails/list-record-email-conversations"},{"title":"Get Record Email Conversation","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-conversations/{threadId}","href":"/api-reference/record-emails/get-record-email-conversation"},{"title":"Remove Record Email Conversation","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-conversations/{threadId}/remove","href":"/api-reference/record-emails/remove-record-email-conversation"},{"title":"Link Earlier Record Emails","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-people/{personId}/link-earlier","href":"/api-reference/record-emails/link-earlier-record-emails"},{"title":"Unlink Record Person Emails","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-people/{personId}/unlink","href":"/api-reference/record-emails/unlink-record-person-emails"},{"title":"List Record Email Link Events","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-link-events","href":"/api-reference/record-emails/list-record-email-link-events"},{"title":"List Record Sendable Email Templates","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/sendable-email-templates","href":"/api-reference/record-emails/list-record-sendable-email-templates"},{"title":"Preview Record Email","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/emails/preview","href":"/api-reference/record-emails/preview-record-email"},{"title":"Send Record Email","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/emails","href":"/api-reference/record-emails/send-record-email"},{"title":"Retry Record Email Delivery","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/email-deliveries/{deliveryId}/retry","href":"/api-reference/record-emails/retry-record-email-delivery"},{"title":"List Record Packet Emails","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/packet-emails","href":"/api-reference/record-emails/list-record-packet-emails"},{"title":"List Policy Email Conversations","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/email-conversations","href":"/api-reference/record-emails/list-policy-email-conversations"},{"title":"Get Policy Email Conversation","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/email-conversations/{threadId}","href":"/api-reference/record-emails/get-policy-email-conversation"},{"title":"Remove Policy Email Conversation","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/email-conversations/{threadId}/remove","href":"/api-reference/record-emails/remove-policy-email-conversation"},{"title":"Link Earlier Policy Emails","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/email-people/{personId}/link-earlier","href":"/api-reference/record-emails/link-earlier-policy-emails"},{"title":"Unlink Policy Person Emails","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/email-people/{personId}/unlink","href":"/api-reference/record-emails/unlink-policy-person-emails"},{"title":"List Policy Email Link Events","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/email-link-events","href":"/api-reference/record-emails/list-policy-email-link-events"},{"title":"List Policy Sendable Email Templates","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/sendable-email-templates","href":"/api-reference/record-emails/list-policy-sendable-email-templates"},{"title":"Preview Policy Email","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/emails/preview","href":"/api-reference/record-emails/preview-policy-email"},{"title":"Send Policy Email","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/emails","href":"/api-reference/record-emails/send-policy-email"},{"title":"Retry Policy Email Delivery","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/email-deliveries/{deliveryId}/retry","href":"/api-reference/record-emails/retry-policy-email-delivery"},{"title":"List Policy Packet Emails","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/packet-emails","href":"/api-reference/record-emails/list-policy-packet-emails"}]},{"group":"OFAC Screening","pages":[{"title":"Overview","href":"/api-reference/ofac-screening/overview"},{"title":"Screen Exposure For OFAC","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/ofac/screen","href":"/api-reference/ofac-screening/screen-exposure-for-ofac"}]},{"group":"Policy Transactions","pages":[{"title":"Overview","href":"/api-reference/policies/overview"},{"title":"Concepts","href":"/api-reference/policies/concepts"},{"title":"Effective Dates \u0026 the Policy Timeline","href":"/api-reference/policies/effective-dates"},{"title":"Lifecycle Walkthrough","href":"/api-reference/policies/lifecycle-walkthrough"},{"group":"Configuration","pages":[{"title":"Get Policy Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/configuration","href":"/api-reference/field-model-policy-configuration/get-policy-configuration"}]},{"group":"Reset","pages":[{"title":"Delete All Policies","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/deleteAll","href":"/api-reference/policies/delete-all-policies"}]},{"group":"Transactions","pages":[{"title":"New Business Transaction","description":"Creates a bound policy directly from its complete data as a NEW_BUSINESS\ntransaction, covering `policyStartDate` to `policyEndDate` with the premium,\nbilling and invoice plan you send. Use it to load policies bound elsewhere\nor to book a policy without a quote. To bind a saved quote, use Bind Quote\n(`bindQuote`); for the next term of an existing policy, use Renew Policy\nTransaction (`renewPolicyTransaction`). Call Get Policy Configuration\n(`getPolicyV1Configuration`) first for the field keys that `data` takes.\n\n**Value door** ([Invoicing a policy](/api-reference/invoicing/overview)). The new\npolicy's invoices come from the request: the `invoicePlan` you send\ncommits with the policy, and without one the policy has no invoices.\n\nCreates a new policy via a NEW_BUSINESS transaction. This is the entry point for the\ntransaction-based policy lifecycle. The transaction produces a single segment covering\nthe full policy term.\n\nThe request body is the complete initial policy state in `data` — the policy-level fields\nat the top level of that object. Any embedded exposure fields your company configuration\ndefines (e.g. `primaryInsured` / `additionalExposures` in the default configuration) ride\nalong as ordinary configured fields, validated per-field against the Exposure\nconfiguration. The primary insured is derived from those exposures; you do not send it.\n\n**Term bounds come solely from the policy's own root fields.** `policyStartDate` and\n`policyEndDate` are read from `data.policyStartDate` and `data.policyEndDate` — there are\nno top-level date parameters. The transaction's effective date is the policy start date.\n\n**Policy invoices.** `invoicePlan` is an\n[invoice plan](/api-reference/invoicing/invoice-plans): nothing in it is\ndefaulted or inferred, and it is validated and committed atomically with\nthe policy.\n\n**Billing needs pricing.** The new policy's own pricing,\nbilling and invoices set its layer of the\n[pricing stack](/api-reference/invoicing/pricing-stack), and some layer must\naccept them: a `data.fullTermBillingInfo` without `data.fullTermPricingInfo`\nfits none and returns `422 policy-pricing-stack-layer-inconsistent`, and\nnothing is saved. State the pricing (an empty `pricingComponents` list prices\nthe term at zero), or leave the billing out.\n\n**Required permission:** `policy.new-business`\n","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/transaction/new-business","href":"/api-reference/field-model-policy-transactions/new-business-transaction"},{"title":"Endorse Policy Transaction","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/transaction/endorse","href":"/api-reference/field-model-policy-transactions/endorse-policy-transaction"},{"title":"Cancel Policy Transaction","description":"Cancels a bound policy from a date as a CANCEL transaction, for any reason,\nincluding non-payment: the request takes a date, not a reason. The server\nworks out the cancelled term's premium itself: each pro rata charge drops to\nwhat it earned through the cancellation date, so a cancellation on the start\ndate is a flat cancellation, and fully earned fees stay. Add a short-rate\npenalty or cancellation fee if you charge one; undo the cancellation with\nReinstate Policy Transaction (`reinstatePolicyTransaction`).\n\n**Value door** ([Invoicing a policy](/api-reference/invoicing/overview)). The\npolicy's invoices change only as the request says: the `invoicePlan` you\nsend voids the invoices it names and creates new ones, committed with the\npolicy version, and without one every invoice stays as it is.\n\nCancels a policy as of a given date via a CANCEL transaction. The policy must be\nactive at the cancellation date.\n\n`cancellationDate` (= the transaction effective date) is sugar the server expands into\nper-segment, segment-scoped deltas on framework-required fields. `policyStatus` flips to\n`cancelled` from the cancellation date through end of term (splitting the segment at the\nboundary), and a single `cancellationEffectiveOnDate` is recorded uniformly across the\nwhole term — the same value on both sides of the boundary. `policyStatus` alone marks\nwhich side a segment is on. There is no `policyEarlyTerminationDate` and no status-enum\nmachinery.\n\n## A cancel never reprices — the pricing contract is DERIVED\n\nThe server computes what the cancelled term's pricing contract must be, per charge. Every\npricing component the policy already carries stays present, keeps its `label`,\n`classification`, `qualifier` and `earningSchedule`, and drops to **its own earned amount**\nthrough the cancellation date. A charge modelled as immediately earned (`earningSchedule:\n\"immediate\"` — a non-refundable policy fee) therefore keeps its whole\nvalue and is untouched by the cancellation; a pro-rata charge keeps the part the term has\nrun through. Nothing is relabelled and nothing is merged: a charge's\n`\u003cclassification, qualifier>` pair is its identity across policy versions, and the\nplatform's revenue recognition and invoice binding both attribute money by it.\n\nOmit `fullTermPricingInfo` and the derived pricing contract is used.\nBilling is never derived: state it, or the cancellation\nstores none.\n\nIf you DO send `fullTermPricingInfo`, it is validated against that derived contract\n**component by component, to the exact cent**:\n\n- every component the policy already carries must be present, at exactly the derived value\n and with the derived `earningSchedule`;\n- an UNRECOGNIZED `\u003cclassification, qualifier>` pair is an **addition** — money the\n cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it\n MUST carry `earningSchedule: \"immediate\"`, because it is recognized on the cancellation\n date rather than scheduled over coverage that is ending. An addition may name any live\n classification (including a premium one, for a short-rate penalty) and may be negative\n (a clawback).\n\n**Companies that tax through InsCipher.** Where the company's InsCipher cancel/reinstate tax\nsourcing is enabled, the server asks InsCipher what the state actually refunds on this\ncancellation and appends its answer to the derived contract as additions of its own —\none immediate component per corrected tax, under that tax's classification with a\nreserved qualifier of the form `inscipher-PC v3` (`FC` for a cancellation effective on\nthe policy's first day; a state suffix where the charge is split by state). Their values\nmake the written total move by exactly what the state returns; the floors are untouched.\nA supplied `fullTermPricingInfo` must include them, at the derived cents, like every other\nderived component — which is one more reason to omit the container. If InsCipher cannot\nanswer while tax money is at stake, the cancellation is refused (`502`\n`inscipher-tax-calculation-failed`, or `422` `inscipher-cancel-reinstate-tax-unpriceable`\nnaming the gap) rather than booked on the floors alone.\n\nRe-valuing, re-basing or dropping an existing component is rejected with a `400` naming it.\nTo CHANGE what the policy is priced at, book an **endorsement at the same effective date**\nand then cancel: transactions sharing an effective date are applied in booking order\n(ascending `policyVersion`), so the endorsement's figures are what the cancellation floors\nagainst. The same composition works after a reinstatement — reinstate, then endorse — to\nreprice the restored term going forward.\n\nThree optional **derived channels** are whole-object overwrites of a policy-root full-term\ncontainer — necessarily whole-term, so none carries dates nor an element-level form:\n\n- **`fullTermPricingInfo`** — the full-term pricing contract, validated as described above.\n- **`fullTermBillingInfo`** — the term's billing obligations per line item.\n The caller states this value, and leaving it out stores none.\n Stated billing must pass the receivable checksum and vocabulary checks.\n- **`fullTermPolicyRatingResult`** — the canonical policy-level rating result. Unvalidated\n and unconstrained: it is the rater's own output, not the money the platform books.\n\n**Policy invoices.** `invoicePlan` is an\n[invoice plan](/api-reference/invoicing/invoice-plans): nothing in it is\ndefaulted or inferred. If cancellation moves the billing an invoiced\npolicy's invoices add up to, a plan is required; without one it is refused\nwith `422 finv2-policy-restates-invoices`. A plan may credit a line the new\nbilling drops, such as a paid tax on a flat cancellation\n([Credits](/api-reference/invoicing/invoice-plans#credits)).\n\n**Billing.** Stores the caller's billing as stated, without\nscaling, restoring or carrying billing from the policy: billing you leave out stores\nnone. To keep a billed policy's billing, state `fullTermBillingInfo`, at what the\ncancelled term owes. Kept and new invoices must still add up to the billing, as\n[Invoice plans](/api-reference/invoicing/invoice-plans) explains.\n\n**The policy's layer.** A policy sits at a layer of its\n[pricing stack](/api-reference/invoicing/pricing-stack), read from its pricing, its\nbilling and its active invoices. A cancellation keeps the\npolicy at its layer unless `pricingStackLayerChange` names the move it makes. Leaving out\n`fullTermBillingInfo` on a billed policy drops its billing, a move from `billing` to\n`pricing`. An `invoicePlan` that voids every active invoice moves the policy down\nfrom `invoicing`; one that voids every active invoice and creates none needs no\nbilling, so a cancellation that leaves billing out and voids every unpaid invoice\nnames `pricingStackLayerChange: {\"from\": \"invoicing\", \"to\": \"pricing\"}`. A move the request does\nnot name, or a named move it does not make, returns `422 policy-pricing-stack-layer-change`\nand saves nothing; its message names the actual move and the exact `pricingStackLayerChange`\nthat would name it. Billing that owes nothing sits at both `billing` and `invoicing`.\n\n**Required permission:** `policy.cancel`\n","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/transaction/cancel","href":"/api-reference/field-model-policy-transactions/cancel-policy-transaction"},{"title":"Reinstate Policy Transaction","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/transaction/reinstate","href":"/api-reference/field-model-policy-transactions/reinstate-policy-transaction"},{"title":"Renew Policy Transaction","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/transaction/renew","href":"/api-reference/field-model-policy-transactions/renew-policy-transaction"},{"title":"Generate Quote from Policy (Stateless)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/generate","href":"/api-reference/field-model-policies/generate-quote-from-policy-stateless"},{"title":"Bind Quote","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/{quoteId}/bind","href":"/api-reference/field-model-policy-transactions/bind-quote"},{"title":"Bind Quote by Reference or by Value","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/bind","href":"/api-reference/field-model-policy-transactions/bind-quote-by-reference-or-by-value"},{"title":"Delete Policy Transaction","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/policies/{policyId}/transactions/{transactionId}","href":"/api-reference/field-model-policy-transactions/delete-policy-transaction"},{"title":"Get Policy Version","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/versions/{version}","href":"/api-reference/field-model-policy-transactions/get-policy-version"},{"title":"List Single Policy Versions","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/versions","href":"/api-reference/field-model-policy-transactions/list-single-policy-versions"},{"title":"List Policy Transactions","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/transactions","href":"/api-reference/field-model-policy-transactions/list-policy-transactions"},{"title":"Get Policy Transaction","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/transactions/{transactionId}","href":"/api-reference/field-model-policy-transactions/get-policy-transaction"},{"title":"Update Transaction Display Author","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/policies/{policyId}/transactions/{transactionId}","href":"/api-reference/field-model-policy-transactions/update-transaction-display-author"}]},{"group":"Contacts","pages":[{"title":"List Policy Contacts","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/contacts","href":"/api-reference/field-model-policy-transactions/list-policy-contacts"},{"title":"Add Policy Contact","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/{policyId}/contacts","href":"/api-reference/field-model-policy-transactions/add-policy-contact"},{"title":"Remove Policy Contact","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/policies/{policyId}/contacts/{personId}","href":"/api-reference/field-model-policy-transactions/remove-policy-contact"}]},{"group":"Bordereau","pages":[{"title":"List Bordereau Rows","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/bordereau","href":"/api-reference/field-model-bordereau/list-bordereau-rows"},{"title":"Start Bordereau Export Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/bordereau/export-runs","href":"/api-reference/field-model-bordereau/start-bordereau-export-run"},{"title":"Get Bordereau Export Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/bordereau/export-runs/{runId}","href":"/api-reference/field-model-bordereau/get-bordereau-export-run"},{"title":"Download Bordereau Export Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/bordereau/export-runs/{runId}/download","href":"/api-reference/field-model-bordereau/download-bordereau-export-run"},{"title":"Send Bordereau Export Run to Google Drive","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/bordereau/export-runs/{runId}/drive","href":"/api-reference/field-model-bordereau/send-bordereau-export-run-to-google-drive"}]},{"group":"Listing Policies","pages":[{"title":"List Policies","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/list","href":"/api-reference/field-model-policy-transactions/list-policies"},{"title":"List Policy Versions","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/versions","href":"/api-reference/field-model-policy-transactions/list-policy-versions"}]},{"group":"Validation","pages":[{"title":"Check Bind Conditions","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/quotes/{quoteId}/bind-conditions","href":"/api-reference/field-model-policy-validation/check-bind-conditions"},{"title":"Validate Policy","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/{policyId}/validate","href":"/api-reference/field-model-policy-validation/validate-policy"},{"title":"Validate Policies (Batch)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/policies/validate","href":"/api-reference/field-model-policy-validation/validate-policies-batch"},{"title":"Repair Policies","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/policies/repair","href":"/api-reference/field-model-policy-transactions/repair-policies"}]}]},{"group":"Policy Invoicing","pages":[{"title":"Invoicing a policy","href":"/api-reference/invoicing/overview"},{"title":"Invoice plans","href":"/api-reference/invoicing/invoice-plans"},{"title":"Quote Invoicing Overview","sidebarTitle":"Quote Invoicing Overview","href":"/api-reference/invoicing/quote-invoicing"},{"group":"Quote Invoicing","pages":[{"title":"Get Quote Invoicing","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/quotes/{quoteId}/invoicing","href":"/api-reference/policy-invoicing/get-quote-invoicing"},{"title":"Replace Quote Invoice Settings","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/quotes/{quoteId}/invoicing/settings","href":"/api-reference/policy-invoicing/replace-quote-invoice-settings"},{"title":"Generate Quote Invoices","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/{quoteId}/invoicing/generate","href":"/api-reference/policy-invoicing/generate-quote-invoices"},{"title":"Attach Quote Invoice Plan","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/quotes/{quoteId}/invoicing/plan","href":"/api-reference/policy-invoicing/attach-quote-invoice-plan"},{"title":"Clear Quote Invoice Plan","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/quotes/{quoteId}/invoicing/plan","href":"/api-reference/policy-invoicing/clear-quote-invoice-plan"}]},{"group":"Pricing Stack","pages":[{"title":"The pricing stack","href":"/api-reference/invoicing/pricing-stack"},{"title":"Get Quote Pricing Stack Intended Layer","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/quotes/{quoteId}/pricing-stack-intended-layer","href":"/api-reference/policy-invoicing/get-quote-pricing-stack-intended-layer"},{"title":"Set Quote Pricing Stack Intended Layer","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/quotes/{quoteId}/pricing-stack-intended-layer","href":"/api-reference/policy-invoicing/set-quote-pricing-stack-intended-layer"},{"title":"Clear Quote Rating","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/quotes/{quoteId}/rating","href":"/api-reference/policy-invoicing/clear-quote-rating"}]},{"title":"Update Policy Invoices","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/policies/{policyId}/invoices/batch","href":"/api-reference/financials/update-policy-invoices"}]},{"group":"Financials","pages":[{"title":"Overview","href":"/api-reference/financials/overview"},{"group":"Invoices","pages":[{"title":"List Invoices","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/invoices","href":"/api-reference/financials/list-invoices"},{"title":"Create Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices","href":"/api-reference/financials/create-invoice"},{"title":"Get Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/invoices/{invoiceId}","href":"/api-reference/financials/get-invoice"},{"title":"Update Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/invoices/{invoiceId}","href":"/api-reference/financials/update-invoice"},{"title":"Delete Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/financials/invoices/{invoiceId}","href":"/api-reference/financials/delete-invoice"},{"title":"Re-link Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/relink","href":"/api-reference/financials/re-link-invoice"}]},{"group":"Invoice Lifecycle","pages":[{"title":"Approve Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/approve","href":"/api-reference/financials/approve-invoice"},{"title":"Unapprove Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/unapprove","href":"/api-reference/financials/unapprove-invoice"},{"title":"Finalize Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/finalize","href":"/api-reference/financials/finalize-invoice"},{"title":"Void Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/void","href":"/api-reference/financials/void-invoice"},{"title":"Restore Invoice","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/restore","href":"/api-reference/financials/restore-invoice"}]},{"group":"Bill Review","pages":[{"title":"Start Invoice Bill Review","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/bill-review","href":"/api-reference/financials/start-invoice-bill-review"},{"title":"Get Invoice Bill Review","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/bill-review","href":"/api-reference/financials/get-invoice-bill-review"}]},{"group":"Payments","pages":[{"title":"Record Payment","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/payments","href":"/api-reference/financials/record-payment"},{"title":"Remove Payment","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/payments/{paymentId}","href":"/api-reference/financials/remove-payment"}]},{"group":"Payees","pages":[{"title":"Change Invoice Payee","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/invoices/{invoiceId}/payee","href":"/api-reference/financials/change-invoice-payee"},{"title":"Merge Payee","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/payees/{payeeId}/merge","href":"/api-reference/financials/merge-payee"}]},{"group":"Reserves","pages":[{"title":"Set Reserves","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/events/{eventId}/reserves/{categoryId}","href":"/api-reference/financials/set-reserves"},{"title":"Reset Reserve History","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/events/{eventId}/reserves/{categoryId}/history-reset","href":"/api-reference/financials/reset-reserve-history"},{"title":"List Reserve Updates","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/events/{eventId}/reserve-updates","href":"/api-reference/financials/list-reserve-updates"},{"title":"List Company Reserve Updates","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/reserve-updates","href":"/api-reference/financials/list-company-reserve-updates"}]},{"group":"Balances","pages":[{"title":"Get Balances","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/balances","href":"/api-reference/financials/get-balances"},{"title":"Get Entity Balances","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/entities/{entityType}/{entityId}/balances","href":"/api-reference/financials/get-entity-balances"}]},{"group":"Configuration","pages":[{"title":"Export Financials Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/export","href":"/api-reference/financials/export-financials-configuration"},{"title":"Import Financials Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/import","href":"/api-reference/financials/import-financials-configuration"},{"title":"List Transaction Categories","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/config/categories","href":"/api-reference/financials/list-transaction-categories"},{"title":"Set Transaction Category Money-Out Approval","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/config/categories/{categoryId}/money-out-approval","href":"/api-reference/financials/set-transaction-category-money-out-approval"},{"title":"List Policy Invoice Types","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/config/policy-invoice-types","href":"/api-reference/financials/list-policy-invoice-types"},{"title":"Create Policy Invoice Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-invoice-types","href":"/api-reference/financials/create-policy-invoice-type"},{"title":"List Policy Line Item Types","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/config/policy-line-item-types","href":"/api-reference/financials/list-policy-line-item-types"},{"title":"Create Policy Line Item Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-line-item-types","href":"/api-reference/financials/create-policy-line-item-type"},{"title":"Rename Policy Invoice Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}","href":"/api-reference/financials/rename-policy-invoice-type"},{"title":"Delete Policy Invoice Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}","href":"/api-reference/financials/delete-policy-invoice-type"},{"title":"Deprecate Policy Invoice Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}/deprecate","href":"/api-reference/financials/deprecate-policy-invoice-type"},{"title":"Reactivate Policy Invoice Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}/reactivate","href":"/api-reference/financials/reactivate-policy-invoice-type"},{"title":"Rename Policy Line Item Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/financials/config/policy-line-item-types/{lineItemTypeId}","href":"/api-reference/financials/rename-policy-line-item-type"},{"title":"Delete Policy Line Item Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/financials/config/policy-line-item-types/{lineItemTypeId}","href":"/api-reference/financials/delete-policy-line-item-type"},{"title":"Deprecate Policy Line Item Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-line-item-types/{lineItemTypeId}/deprecate","href":"/api-reference/financials/deprecate-policy-line-item-type"},{"title":"Reactivate Policy Line Item Type","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-line-item-types/{lineItemTypeId}/reactivate","href":"/api-reference/financials/reactivate-policy-line-item-type"},{"title":"Set Policy Invoice Type Direction","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}/expected-direction","href":"/api-reference/financials/set-policy-invoice-type-direction"},{"title":"Set Policy Invoice Type Payee Defaults","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}/payee-defaults","href":"/api-reference/financials/set-policy-invoice-type-payee-defaults"},{"title":"Set Policy Invoice Type Presets","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}/presets","href":"/api-reference/financials/set-policy-invoice-type-presets"},{"title":"Set Policy Invoice Type Money-Out Approval","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/financials/config/policy-invoice-types/{categoryId}/money-out-approval","href":"/api-reference/financials/set-policy-invoice-type-money-out-approval"},{"title":"Set Policy Line Item Associations","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/config/policy-line-item-types/associations","href":"/api-reference/financials/set-policy-line-item-associations"},{"title":"Reset Approval Config","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/financials/config/approvals","href":"/api-reference/financials/reset-approval-config"}]},{"group":"Maintenance","pages":[{"title":"Import Event Financials","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/events/{eventId}/import","href":"/api-reference/financials/import-event-financials"},{"title":"Check Financials Read-State Consistency","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/financials/validation/check","href":"/api-reference/financials/check-financials-read-state-consistency"},{"title":"Rebuild Financials Read-State","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/validation/sync","href":"/api-reference/financials/rebuild-financials-read-state"},{"title":"Delete All Financial Data","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/financials/deleteAll","href":"/api-reference/financials/delete-all-financial-data"}]}]},{"group":"Rating","pages":[{"title":"Overview","href":"/api-reference/rating/overview"},{"title":"Rate Quote (Read-Only)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/rate","href":"/api-reference/field-model-rating/rate-quote-read-only"},{"title":"Rate Saved Quote by Id","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/quotes/{quoteId}/rate","href":"/api-reference/field-model-rating/rate-saved-quote-by-id"}]},{"group":"Notes","pages":[{"title":"Overview","href":"/api-reference/notes/overview"},{"title":"List Notes","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/notes","href":"/api-reference/field-model-notes/list-notes"},{"title":"Create Note","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/notes","href":"/api-reference/field-model-notes/create-note"},{"title":"Get Note","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/notes/{noteId}","href":"/api-reference/field-model-notes/get-note"},{"title":"Update Note","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/notes/{noteId}","href":"/api-reference/field-model-notes/update-note"},{"title":"Delete Note","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/notes/{noteId}","href":"/api-reference/field-model-notes/delete-note"}]},{"group":"Tasks","pages":[{"title":"Overview","href":"/api-reference/tasks/overview"},{"title":"List Tasks","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/tasks","href":"/api-reference/tasks/list-tasks"},{"title":"Get Task","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/tasks/{taskId}","href":"/api-reference/tasks/get-task"},{"title":"Create Task","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/tasks","href":"/api-reference/tasks/create-task"},{"title":"Update Task","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/tasks/{taskId}","href":"/api-reference/tasks/update-task"},{"title":"Delete Task","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/tasks/{taskId}","href":"/api-reference/tasks/delete-task"}]},{"group":"Imports","hidden":true,"pages":[{"title":"Overview","href":"/api-reference/imports/overview"},{"title":"Import Rows","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/imports/rows","href":"/api-reference/imports/import-rows"},{"title":"Queue Import Job","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/imports/jobs","href":"/api-reference/imports/queue-import-job"},{"title":"Get Import Job","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/imports/jobs/{jobId}","href":"/api-reference/imports/get-import-job"},{"title":"Import Entity","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/imports","href":"/api-reference/imports/import-entity"},{"title":"Retry Import","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/imports/retry","href":"/api-reference/imports/retry-import"},{"title":"List Import Rows","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/imports/rows","href":"/api-reference/imports/list-import-rows"},{"title":"Get Import Row","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/imports/rows/{importRowId}","href":"/api-reference/imports/get-import-row"},{"title":"List Import Attempts","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/imports/attempts","href":"/api-reference/imports/list-import-attempts"},{"title":"Get Import Attempt","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/imports/attempts/{importAttemptId}","href":"/api-reference/imports/get-import-attempt"},{"title":"Replace Record Legacy Activity","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/entities/{entityType}/{entityId}/legacy-activity","href":"/api-reference/imports/replace-record-legacy-activity"}]},{"group":"Configuration Management","pages":[{"title":"Overview","href":"/api-reference/configuration/overview"},{"title":"Conversion Rules","href":"/api-reference/configuration/conversion-rules"},{"title":"Author JEXL expressions","href":"/api-reference/configuration/jexl-authoring"},{"title":"JEXL reference","href":"/api-reference/configuration/jexl-reference"},{"group":"Inspect","pages":[{"title":"Export Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/export","href":"/api-reference/fmv1-configuration/export-configuration"},{"title":"Describe Configuration (run-down)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/describe","href":"/api-reference/fmv1-configuration/describe-configuration-run-down"},{"title":"Describe Configuration Entity (fields of one entity or custom object)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/describe/{entityOrObjectKey}","href":"/api-reference/fmv1-configuration/describe-configuration-entity-fields-of-one-entity-or-custom-object"},{"title":"Get Configuration Metadata","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/metadata","href":"/api-reference/fmv1-configuration/get-configuration-metadata"},{"title":"Get Configuration JSON Schema","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/schema","href":"/api-reference/fmv1-configuration/get-configuration-json-schema"}]},{"group":"Validate \u0026 Compare","pages":[{"title":"Validate Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/validate","href":"/api-reference/fmv1-configuration/validate-configuration"},{"title":"Compare Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/compare","href":"/api-reference/fmv1-configuration/compare-configuration"},{"title":"Start Data Validation Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/data-validation-runs","href":"/api-reference/fmv1-configuration/start-data-validation-run"},{"title":"Get Data Validation Run","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/configuration/data-validation-runs/{runId}","href":"/api-reference/fmv1-configuration/get-data-validation-run"},{"title":"List Data Validation Run Findings","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/configuration/data-validation-runs/{runId}/findings","href":"/api-reference/fmv1-configuration/list-data-validation-run-findings"}]},{"group":"Apply Changes","pages":[{"title":"Import Configuration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/import","href":"/api-reference/fmv1-configuration/import-configuration"},{"title":"Patch Configuration (typed changes)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/configuration/patch","href":"/api-reference/fmv1-configuration/patch-configuration-typed-changes"}]}]},{"group":"Company Files","pages":[{"title":"Overview","href":"/api-reference/company-files/overview"},{"title":"List File Categories","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files/categories","href":"/api-reference/company-files/list-file-categories"},{"group":"Uploads","pages":[{"title":"Create Upload Intent","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files","href":"/api-reference/company-files/create-upload-intent"},{"title":"Finalize Upload","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/{fileId}/finalize","href":"/api-reference/company-files/finalize-upload"}]},{"group":"Migrations","pages":[{"title":"Prepare File Migration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/migrations/prepare","href":"/api-reference/company-files/prepare-file-migration"},{"title":"Get File Migration State","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/migrations/state","href":"/api-reference/company-files/get-file-migration-state"},{"title":"Refresh File Migration Upload","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/migrations/refresh","href":"/api-reference/company-files/refresh-file-migration-upload"},{"title":"Finalize File Migration","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/migrations/finalize","href":"/api-reference/company-files/finalize-file-migration"},{"title":"Reconcile File Migration Metadata","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/migrations/reconcile","href":"/api-reference/company-files/reconcile-file-migration-metadata"}]},{"group":"Files","pages":[{"title":"List Files","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files","href":"/api-reference/company-files/list-files"},{"title":"Get File Metadata","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files/{fileId}","href":"/api-reference/company-files/get-file-metadata"},{"title":"Rename, Move, or Categorize File","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/files/{fileId}","href":"/api-reference/company-files/rename-move-or-categorize-file"},{"title":"Bulk Move Files","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/bulk-move","href":"/api-reference/company-files/bulk-move-files"},{"title":"Delete File","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/files/{fileId}","href":"/api-reference/company-files/delete-file"}]},{"group":"Downloads","pages":[{"title":"Get Download URL","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files/{fileId}/download-url","href":"/api-reference/company-files/get-download-url"},{"title":"Batch Download URLs","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/download-urls","href":"/api-reference/company-files/batch-download-urls"}]},{"group":"Versions","pages":[{"title":"List File Versions","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files/{fileId}/versions","href":"/api-reference/company-files/list-file-versions"},{"title":"Create Re-upload Intent","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/{fileId}/versions","href":"/api-reference/company-files/create-re-upload-intent"},{"title":"Restore File Version","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/{fileId}/versions/{versionId}/restore","href":"/api-reference/company-files/restore-file-version"}]},{"group":"Placements","pages":[{"title":"List File Placements","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files/{fileId}/placements","href":"/api-reference/company-files/list-file-placements"},{"title":"Add File Placement (Share to Another Entity)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/{fileId}/placements","href":"/api-reference/company-files/add-file-placement-share-to-another-entity"},{"title":"Update File Placement (Move / Categorize per Entity)","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/files/{fileId}/placements/{placementId}","href":"/api-reference/company-files/update-file-placement-move-categorize-per-entity"},{"title":"Remove File Placement","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/files/{fileId}/placements/{placementId}","href":"/api-reference/company-files/remove-file-placement"}]},{"group":"Folders","pages":[{"title":"Create Folder","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/folders","href":"/api-reference/company-files/create-folder"},{"title":"Get Folder Tree","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/folders","href":"/api-reference/company-files/get-folder-tree"},{"title":"List Folder Contents","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/folders/{folderId}","href":"/api-reference/company-files/list-folder-contents"},{"title":"Rename, Move or Categorize Folder","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/folders/{folderId}","href":"/api-reference/company-files/rename-move-or-categorize-folder"},{"title":"Delete Folder","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/folders/{folderId}","href":"/api-reference/company-files/delete-folder"}]}]},{"group":"Forms","pages":[{"title":"Overview","href":"/api-reference/forms/overview"},{"title":"List Forms","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms","href":"/api-reference/forms/list-forms"},{"title":"Download Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms/{number}","href":"/api-reference/forms/download-form"},{"title":"Rename Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml patch /api/v1/companies/{companyId}/forms/{number}","href":"/api-reference/forms/rename-form"},{"title":"Delete Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml delete /api/v1/companies/{companyId}/forms/{number}","href":"/api-reference/forms/delete-form"},{"group":"Templates","pages":[{"title":"Upload Form Template","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/template","href":"/api-reference/forms/upload-form-template"},{"title":"Replace Form Template","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/forms/template/{number}","href":"/api-reference/forms/replace-form-template"},{"title":"Touch Form Template","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/template/{number}/touch","href":"/api-reference/forms/touch-form-template"},{"title":"Audit Form Template Smart Tags","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms/template/{number}/smart-tag-audit","href":"/api-reference/forms/audit-form-template-smart-tags"}]},{"group":"Static Forms","pages":[{"title":"Upload Static Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/static","href":"/api-reference/forms/upload-static-form"},{"title":"Replace Static Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml put /api/v1/companies/{companyId}/forms/static/{number}","href":"/api-reference/forms/replace-static-form"}]},{"group":"Generated Forms","pages":[{"title":"List Generated Forms","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms/generated","href":"/api-reference/forms/list-generated-forms"},{"title":"Upload Event Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/generated","href":"/api-reference/forms/upload-event-form"},{"title":"Touch Generated Form","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/generated/{id}/touch","href":"/api-reference/forms/touch-generated-form"},{"title":"Audit Generated Form Smart Tags","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms/generated/{id}/smart-tag-audit","href":"/api-reference/forms/audit-generated-form-smart-tags"}]},{"group":"Packets","pages":[{"title":"List Form Packets","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms/packets","href":"/api-reference/forms/list-form-packets"},{"title":"Import Historical Form Packet","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/packets/import","href":"/api-reference/forms/import-historical-form-packet"},{"title":"Get Form Packet Download URL","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/forms/packets/{packetId}/download-url","href":"/api-reference/forms/get-form-packet-download-url"}]}]},{"group":"Document Generation","pages":[{"title":"Overview","href":"/api-reference/documents/overview"}]},{"group":"Submission Parsing","pages":[{"title":"Overview","href":"/api-reference/parsing/overview"},{"title":"Trigger Parse","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/trigger-parse","href":"/api-reference/submission-parsing/trigger-parse"},{"title":"List Parse Runs","deprecated":null,"version":null,"openapi":"/openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/files/parse-runs","href":"/api-reference/submission-parsing/list-parse-runs"}]},{"group":"Reference","pages":[{"title":"Structured Field Values","href":"/api-reference/field-values/overview"},{"title":"Data Models","href":"/api-reference/data-models"},{"title":"API Changelog","href":"/api-reference/changelog"}]}]}]},"basePath":"","title":"Endorse Policy Transaction - AI Insurance","buildId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","deploymentId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DPDWPCdE.js","utils-DyjUHyLo.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BWYE1cdS.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-COAzxpEw.js","snippetPresets-DNiD_S52.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-CjwVt80x.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ByHQMk7z.js","shallow-CaZuw1AO.js","getApiPlaygroundDisplay-DPVPOknm.js","CodeSnippet-B31CH-Mp.js","CodeSnippets-BxTYZWz6.js","Page-DDHbuAIY.js","getPastedJson-DhoAwiNO.js","icon-Dhq8z75J.js","MethodPill-DLXmKOwr.js","DuplicateIcon-jzdVwyRU.js","createIcon-eD0b3klN.js","DynamicMarkdown-BfddVCX7.js","SectionHeading-2pSCIo17.js","axios-vUo_bRtp.js","Markdown-DsWjhwJ4.js","clsx-B2t_mZQG.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CUljsAY7.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Cf70306N.js"]}