Cancels a bound policy from a date as a CANCEL transaction, for any reason,
including non-payment: the request takes a date, not a reason. The server
works out the cancelled term’s premium itself: each pro rata charge drops to
what it earned through the cancellation date, so a cancellation on the start
date is a flat cancellation, and fully earned fees stay. Add a short-rate
penalty or cancellation fee if you charge one; undo the cancellation with
Reinstate Policy Transaction (reinstatePolicyTransaction).
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.
Cancels a policy as of a given date via a CANCEL transaction. The policy must be
active at the cancellation date.
cancellationDate (= the transaction effective date) is sugar the server expands into
per-segment, segment-scoped deltas on framework-required fields. policyStatus flips to
cancelled from the cancellation date through end of term (splitting the segment at the
boundary), and a single cancellationEffectiveOnDate is recorded uniformly across the
whole term — the same value on both sides of the boundary. policyStatus alone marks
which side a segment is on. There is no policyEarlyTerminationDate and no status-enum
machinery.
A cancel never reprices — the pricing contract is DERIVED
The server computes what the cancelled term’s pricing contract must be, per charge. Every
pricing component the policy already carries stays present, keeps its label,
classification, qualifier and earningSchedule, and drops to its own earned amount
through the cancellation date. A charge modelled as immediately earned (earningSchedule: "immediate" — a non-refundable policy fee) therefore keeps its whole
value and is untouched by the cancellation; a pro-rata charge keeps the part the term has
run through. Nothing is relabelled and nothing is merged: a charge’s
<classification, qualifier> pair is its identity across policy versions, and the
platform’s revenue recognition and invoice binding both attribute money by it.
Omit fullTermPricingInfo and the derived pricing contract is used.
Billing is never derived: state it, or the cancellation
stores none.
If you DO send fullTermPricingInfo, it is validated against that derived contract
component by component, to the exact cent:
every component the policy already carries must be present, at exactly the derived value
and with the derived earningSchedule;
an UNRECOGNIZED <classification, qualifier> pair is an addition — money the
cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it
MUST carry earningSchedule: "immediate", because it is recognized on the cancellation
date rather than scheduled over coverage that is ending. An addition may name any live
classification (including a premium one, for a short-rate penalty) and may be negative
(a clawback).
Companies that tax through InsCipher. Where the company’s InsCipher cancel/reinstate tax
sourcing is enabled, the server asks InsCipher what the state actually refunds on this
cancellation and appends its answer to the derived contract as additions of its own —
one immediate component per corrected tax, under that tax’s classification with a
reserved qualifier of the form inscipher-PC v3 (FC for a cancellation effective on
the policy’s first day; a state suffix where the charge is split by state). Their values
make the written total move by exactly what the state returns; the floors are untouched.
A supplied fullTermPricingInfo must include them, at the derived cents, like every other
derived component — which is one more reason to omit the container. If InsCipher cannot
answer while tax money is at stake, the cancellation is refused (502inscipher-tax-calculation-failed, or 422inscipher-cancel-reinstate-tax-unpriceable
naming the gap) rather than booked on the floors alone.
Re-valuing, re-basing or dropping an existing component is rejected with a 400 naming it.
To CHANGE what the policy is priced at, book an endorsement at the same effective date
and then cancel: transactions sharing an effective date are applied in booking order
(ascending policyVersion), so the endorsement’s figures are what the cancellation floors
against. The same composition works after a reinstatement — reinstate, then endorse — to
reprice the restored term going forward.
Three optional derived channels are whole-object overwrites of a policy-root full-term
container — necessarily whole-term, so none carries dates nor an element-level form:
fullTermPricingInfo — the full-term pricing contract, validated as described above.
fullTermBillingInfo — the term’s billing obligations per line item.
The caller states this value, and leaving it out stores none.
Stated billing must pass the receivable checksum and vocabulary checks.
fullTermPolicyRatingResult — the canonical policy-level rating result. Unvalidated
and unconstrained: it is the rater’s own output, not the money the platform books.
Policy invoices.invoicePlan is an
invoice plan: nothing in it is
defaulted or inferred. If cancellation moves the billing an invoiced
policy’s invoices add up to, a plan is required; without one it is refused
with 422 finv2-policy-restates-invoices. A plan may credit a line the new
billing drops, such as a paid tax on a flat cancellation
(Credits).
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, at what the
cancelled term owes. 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. A cancellation 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. An invoicePlan that voids every active invoice moves the policy down
from invoicing; one that voids every active invoice and creates none needs no
billing, so a cancellation that leaves billing out and voids every unpaid invoice
names 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.
API key authentication. Send your raw API key as the Authorization header value with NO scheme prefix — Authorization: YOUR-API-KEY. Do NOT prefix it with Bearer or ApiKey, and do not use an X-API-Key header; those are not accepted.
Path Parameters
companyId
string<uuid>
required
Company identifier
policyId
string<uuid>
required
Policy identifier
Body
application/json
cancellationDate
string<date>
required
The date the cancellation takes effect in ISO 8601 format. Must fall
within the policy term, and the policy must be active at this date.
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).
fullTermPricingInfo
object
OPTIONAL — omit it and the server derives the whole contract (recommended).
When supplied, it must be the derived contract plus additions: every component
the policy already carries, present at exactly its earned amount through the
cancellation date and with its existing earningSchedule, plus any NEW
<classification, qualifier> pairs (short-rate penalties, cancellation fees)
carrying earningSchedule: "immediate". Each component is
{label, value, classification[, qualifier, earningSchedule]} as documented
on the New Business Transaction endpoint — classification must name a
LIVE entry in your company's classification registry, on every component, for
every company (refusals are 400, InvalidFieldModelV1Data here). The four
rollups (premium, taxes, fees, total) are computed by the platform and
any you send are ignored. Compared to the exact cent — there is no tolerance.
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. Omitting the container avoids the question entirely.
fullTermBillingInfo
object
Optional whole-object overwrite of the policy-root Billing Aggregate — the
term's billing obligations per line item. Leaving
it out stores no billing, so a billed policy's billing is dropped unless you
state it; dropping it is a layer move that needs pricingStackLayerChange. Its
receivable total must match the pricing contract.
Show child attributes
fullTermPolicyRatingResult
object
Optional whole-object overwrite of the policy-root canonical rating result.
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 cancellation makes,
when it makes one. Leave it out to keep the policy at its layer.
Show child attributes
Response
Policy cancelled 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
{"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/cancel-policy-transaction","slug":"/api-reference/field-model-policy-transactions/cancel-policy-transaction","pageMetadata":{"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","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 h2: \"h2\",\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: [\"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 (\", _jsx(_components.code, {\n children: \"reinstatePolicyTransaction\"\n }), \").\"]\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\", _jsx(_components.p, {\n children: \"Cancels a policy as of a given date via a CANCEL transaction. The policy must be\\nactive at the cancellation date.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"cancellationDate\"\n }), \" (= the transaction effective date) is sugar the server expands into\\nper-segment, segment-scoped deltas on framework-required fields. \", _jsx(_components.code, {\n children: \"policyStatus\"\n }), \" flips to\\n\", _jsx(_components.code, {\n children: \"cancelled\"\n }), \" from the cancellation date through end of term (splitting the segment at the\\nboundary), and a single \", _jsx(_components.code, {\n children: \"cancellationEffectiveOnDate\"\n }), \" is recorded uniformly across the\\nwhole term — the same value on both sides of the boundary. \", _jsx(_components.code, {\n children: \"policyStatus\"\n }), \" alone marks\\nwhich side a segment is on. There is no \", _jsx(_components.code, {\n children: \"policyEarlyTerminationDate\"\n }), \" and no status-enum\\nmachinery.\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"A cancel never reprices — the pricing contract is DERIVED\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The server computes what the cancelled term’s pricing contract must be, per charge. Every\\npricing component the policy already carries stays present, keeps its \", _jsx(_components.code, {\n children: \"label\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"classification\"\n }), \", \", _jsx(_components.code, {\n children: \"qualifier\"\n }), \" and \", _jsx(_components.code, {\n children: \"earningSchedule\"\n }), \", and drops to \", _jsx(_components.strong, {\n children: \"its own earned amount\"\n }), \"\\nthrough the cancellation date. A charge modelled as immediately earned (\", _jsx(_components.code, {\n children: \"earningSchedule: \\\"immediate\\\"\"\n }), \" — 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\", _jsx(_components.code, {\n children: \"\u003cclassification, qualifier>\"\n }), \" pair is its identity across policy versions, and the\\nplatform’s revenue recognition and invoice binding both attribute money by it.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Omit \", _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n }), \" and the derived pricing contract is used.\\nBilling is never derived: state it, or the cancellation\\nstores none.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If you DO send \", _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n }), \", it is validated against that derived contract\\n\", _jsx(_components.strong, {\n children: \"component by component, to the exact cent\"\n }), \":\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"every component the policy already carries must be present, at exactly the derived value\\nand with the derived \", _jsx(_components.code, {\n children: \"earningSchedule\"\n }), \";\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"an UNRECOGNIZED \", _jsx(_components.code, {\n children: \"\u003cclassification, qualifier>\"\n }), \" pair is an \", _jsx(_components.strong, {\n children: \"addition\"\n }), \" — money the\\ncancellation itself creates, such as a short-rate penalty or a cancellation fee — and it\\nMUST carry \", _jsx(_components.code, {\n children: \"earningSchedule: \\\"immediate\\\"\"\n }), \", because it is recognized on the cancellation\\ndate rather than scheduled over coverage that is ending. An addition may name any live\\nclassification (including a premium one, for a short-rate penalty) and may be negative\\n(a clawback).\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Companies that tax through InsCipher.\"\n }), \" 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 \", _jsx(_components.code, {\n children: \"inscipher-PC v3\"\n }), \" (\", _jsx(_components.code, {\n children: \"FC\"\n }), \" 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 \", _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n }), \" 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 (\", _jsx(_components.code, {\n children: \"502\"\n }), \"\\n\", _jsx(_components.code, {\n children: \"inscipher-tax-calculation-failed\"\n }), \", or \", _jsx(_components.code, {\n children: \"422\"\n }), \" \", _jsx(_components.code, {\n children: \"inscipher-cancel-reinstate-tax-unpriceable\"\n }), \"\\nnaming the gap) rather than booked on the floors alone.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Re-valuing, re-basing or dropping an existing component is rejected with a \", _jsx(_components.code, {\n children: \"400\"\n }), \" naming it.\\nTo CHANGE what the policy is priced at, book an \", _jsx(_components.strong, {\n children: \"endorsement at the same effective date\"\n }), \"\\nand then cancel: transactions sharing an effective date are applied in booking order\\n(ascending \", _jsx(_components.code, {\n children: \"policyVersion\"\n }), \"), 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 }), \"\\n\", _jsxs(_components.p, {\n children: [\"Three optional \", _jsx(_components.strong, {\n children: \"derived channels\"\n }), \" 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\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"fullTermPricingInfo\"\n })\n }), \" — the full-term pricing contract, validated as described above.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"fullTermBillingInfo\"\n })\n }), \" — the term’s billing obligations per line item.\\nThe caller states this value, and leaving it out stores none.\\nStated billing must pass the receivable checksum and vocabulary checks.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"fullTermPolicyRatingResult\"\n })\n }), \" — the canonical policy-level rating result. Unvalidated\\nand unconstrained: it is the rater’s own output, not the money the platform books.\"]\n }), \"\\n\"]\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. If cancellation moves the billing an invoiced\\npolicy’s invoices add up to, a plan is required; without one it is refused\\nwith \", _jsx(_components.code, {\n children: \"422 finv2-policy-restates-invoices\"\n }), \". A plan may credit a line the new\\nbilling drops, such as a paid tax on a flat cancellation\\n(\", _jsx(_components.a, {\n href: \"/api-reference/invoicing/invoice-plans#credits\",\n children: \"Credits\"\n }), \").\"]\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 }), \", at what the\\ncancelled term owes. 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. A cancellation keeps the\\npolicy at its layer unless \", _jsx(_components.code, {\n children: \"pricingStackLayerChange\"\n }), \" names the move it makes. Leaving out\\n\", _jsx(_components.code, {\n children: \"fullTermBillingInfo\"\n }), \" on a billed policy drops its billing, a move from \", _jsx(_components.code, {\n children: \"billing\"\n }), \" to\\n\", _jsx(_components.code, {\n children: \"pricing\"\n }), \". An \", _jsx(_components.code, {\n children: \"invoicePlan\"\n }), \" that voids every active invoice moves the policy down\\nfrom \", _jsx(_components.code, {\n children: \"invoicing\"\n }), \"; 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 \", _jsx(_components.code, {\n children: \"pricingStackLayerChange: {\\\"from\\\": \\\"invoicing\\\", \\\"to\\\": \\\"pricing\\\"}\"\n }), \". A move the request does\\nnot name, or a named move it does not make, returns \", _jsx(_components.code, {\n children: \"422 policy-pricing-stack-layer-change\"\n }), \"\\nand saves nothing; its message names the actual move and the exact \", _jsx(_components.code, {\n children: \"pricingStackLayerChange\"\n }), \"\\nthat would name it. Billing that owes nothing sits at both \", _jsx(_components.code, {\n children: \"billing\"\n }), \" and \", _jsx(_components.code, {\n children: \"invoicing\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Required permission:\"\n }), \" \", _jsx(_components.code, {\n children: \"policy.cancel\"\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":"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","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"cancelPolicyTransaction","summary":"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","tags":["Field Model Policy Transactions"],"parameters":["9b33abea-f872-4229-a5da-32c03645014b","6dd8a357-c274-4246-b92b-37c9357aa23a"],"requestBody":"d2408c7e-4dbd-49a4-8a34-3fc0ff1f41aa","responses":{"201":"a8a96777-9345-4e23-9490-eb82c9da2434","400":"7dc258f6-7e2e-4218-a345-c11c14288812","401":"0e9c28e4-656d-4da6-ab65-6724d772f968","403":"b3e0db8a-df2b-429b-9103-77987c1a54f1","404":"019c31e2-136f-4a30-9219-32ddd472298f","409":"5d1b4a95-8f02-409d-afe8-741ddb1fa500","422":"8c8652e3-a2aa-4ca9-9ebe-1ee061f3333d","500":"2966d24c-ad1d-47db-9214-b209fec269ba"},"method":"post","type":"path","servers":["b4993f5b-e21e-4dbd-8ace-9c59b5197d8e"],"security":["35370c79-340a-4ed7-a68a-8c786f4a2235"],"path":"/api/v1/companies/{companyId}/policies/{policyId}/transaction/cancel","baseUrlOptions":["https://go.aiinsurance.io"],"title":"Cancel Policy Transaction","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"9b33abea-f872-4229-a5da-32c03645014b":{"name":"companyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","isRequired":true,"description":"Company identifier","uniqueKey":"","typeLabel":"string\u003cuuid>"},"description":"Company identifier"},"6dd8a357-c274-4246-b92b-37c9357aa23a":{"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":["cancellationDate"],"properties":{"cancellationDate":{"type":"string","format":"date","description":"The date the cancellation takes effect in ISO 8601 format. Must fall\nwithin the policy term, and the policy must be active at this date.\n","isRequired":true,"uniqueKey":"cancellationDate","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>"},"fullTermPricingInfo":{"type":"object","description":"OPTIONAL — omit it and the server derives the whole contract (recommended).\n\nWhen supplied, it must be the derived contract plus additions: every component\nthe policy already carries, present at exactly its earned amount through the\ncancellation date and with its existing `earningSchedule`, plus any NEW\n`\u003cclassification, qualifier>` pairs (short-rate penalties, cancellation fees)\ncarrying `earningSchedule: \"immediate\"`. Each component is\n`{label, value, classification[, qualifier, earningSchedule]}` as documented\non the **New Business Transaction** endpoint — `classification` must name a\nLIVE entry in your company's classification registry, on every component, for\nevery company (refusals are `400`, `InvalidFieldModelV1Data` here). The four\nrollups (`premium`, `taxes`, `fees`, `total`) are computed by the platform and\nany you send are ignored. Compared to the exact cent — there is no tolerance.\n\nThe retired legacy fields (`group`/`kind`/`earningBasis`) are ignored and\ndiscarded on input — never validated, never stored on a newly written\ncomponent — so a stored component that still echoes them can be posted back\nunchanged. Omitting the container avoids the question entirely.\n","additionalProperties":true,"uniqueKey":"fullTermPricingInfo","typeLabel":"object"},"fullTermBillingInfo":{"type":"object","description":"Optional whole-object overwrite of the policy-root Billing Aggregate — the\nterm's billing obligations per line item. Leaving\nit out stores no billing, so a billed policy's billing is dropped unless you\nstate it; dropping it is a layer move that needs `pricingStackLayerChange`. Its\nreceivable total must match the pricing contract.\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.\n","additionalProperties":true,"uniqueKey":"fullTermPolicyRatingResult","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 cancellation 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":{"simpleCancellation":{"title":"simpleCancellation","value":{"cancellationDate":"2025-06-15"}},"cancellationWithFee":{"title":"cancellationWithFee","description":"The existing `Policy Premium` component is stated at its earned amount through\nJun 15 (the server's figure — omit the whole container if you don't want to\ncompute it), and `Cancellation Fee` is a NEW key, so it must declare\n`earningSchedule: \"immediate\"`.\n","value":{"cancellationDate":"2025-06-15","fullTermPricingInfo":{"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","value":38493.15},{"label":"Cancellation Fee","classification":"cancellation-fee","earningSchedule":"immediate","value":500}]}}},"cancellationWithTimestamp":{"title":"cancellationWithTimestamp","value":{"cancellationDate":"2025-06-15","transactionTimestamp":"2025-06-14T16:00:00Z"}},"cancelAndStopInvoicing":{"title":"cancelAndStopInvoicing","description":"The policy sits at the invoicing layer with two unpaid invoices. The\ncancellation leaves `fullTermBillingInfo` out and voids both invoices,\ncreating none, so the policy ends with pricing only, and it names that\nmove.\n","value":{"cancellationDate":"2025-06-15","invoicePlan":{"incurredDate":"2025-06-15","voidInvoices":[{"invoiceId":"550e8400-e29b-41d4-a716-446655440701","headJournalId":"550e8400-e29b-41d4-a716-446655440901"},{"invoiceId":"550e8400-e29b-41d4-a716-446655440702","headJournalId":"550e8400-e29b-41d4-a716-446655440902"}],"creates":[]},"pricingStackLayerChange":{"from":"invoicing","to":"pricing"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"a8a96777-9345-4e23-9490-eb82c9da2434":{"description":"Policy cancelled 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[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"success":{"title":"success","value":{"policyId":"550e8400-e29b-41d4-a716-446655440001","policyVersion":2,"transactionId":"550e8400-e29b-41d4-a716-446655440040","startDate":"2025-01-01","endDate":"2025-12-31","createdAt":"2025-06-15T10:30:00.000Z","primaryInsuredName":"Mercy General Hospital","primaryInsuredId":"550e8400-e29b-41d4-a716-446655440010","policyNumber":"POL-2025-000123","policyStartDate":{"date":"2025-01-01","timezone":"America/New_York"},"policyEndDate":{"date":"2025-12-31","timezone":"America/New_York"},"fullTermPricingInfo":{"premium":42500,"taxes":0,"fees":500,"total":43000,"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","qualifier":"","earningSchedule":"pro-rata","value":42500},{"label":"Cancellation Fee","classification":"cancellation-fee","qualifier":"","earningSchedule":"immediate","value":500}]},"fullTermBillingInfo":null,"fullTermPolicyRatingResult":null,"segments":[{"startDate":"2025-01-01","endDate":"2025-06-14","transactionType":"CANCEL","data":{"policyStatus":"active","cancellationEffectiveOnDate":{"date":"2025-06-15","timezone":"America/New_York"},"annualPremium":85000,"fullTermPricingInfo":{"premium":42500,"taxes":0,"fees":500,"total":43000,"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","qualifier":"","earningSchedule":"pro-rata","value":42500},{"label":"Cancellation Fee","classification":"cancellation-fee","qualifier":"","earningSchedule":"immediate","value":500}]}}},{"startDate":"2025-06-15","endDate":"2025-12-31","transactionType":"CANCEL","data":{"policyStatus":"cancelled","cancellationEffectiveOnDate":{"date":"2025-06-15","timezone":"America/New_York"},"annualPremium":85000,"fullTermPricingInfo":{"premium":42500,"taxes":0,"fees":500,"total":43000,"pricingComponents":[{"label":"Policy Premium","classification":"policy-premium","qualifier":"","earningSchedule":"pro-rata","value":42500},{"label":"Cancellation Fee","classification":"cancellation-fee","qualifier":"","earningSchedule":"immediate","value":500}]}}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"7dc258f6-7e2e-4218-a345-c11c14288812":{"description":"Validation error","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":{"noExistingVersion":{"title":"noExistingVersion","value":{"error":{"code":"InvalidRequest","message":"Policy has no existing version — NEW_BUSINESS must be created first"}}},"dateOutsidePolicyPeriod":{"title":"dateOutsidePolicyPeriod","value":{"error":{"code":"InvalidRequest","message":"Cancellation date 2026-03-01 falls outside policy period [2025-01-01, 2025-12-31]"}}},"policyNotActive":{"title":"policyNotActive","value":{"error":{"code":"InvalidRequest","message":"Policy must be active at cancellation date 2025-09-01 — current status is \"cancelled\""}}},"timestampNotMonotonic":{"title":"timestampNotMonotonic","value":{"error":{"code":"InvalidRequest","message":"transactionTimestamp (2025-05-01T10:00:00Z) is earlier than the latest existing transaction on this policy (2025-06-14T16:00:00Z)"}}},"componentValueMismatch":{"title":"componentValueMismatch","value":{"error":{"code":"InvalidRequest","message":"Cancel transaction states 50000.00 for the pricing component \u003cclassification 'policy-premium', label 'Policy Premium'>, but the server derives 38493.15 — the cancel floors each existing charge at what it has earned. To change an existing charge, book an ENDORSE at the SAME effective date: transactions sharing an effective date are ordered by policy version (booking order), so endorse-then-cancel floors off the corrected figures and reinstate-then-endorse reprices the restored term prospectively."}}},"componentMissing":{"title":"componentMissing","value":{"error":{"code":"InvalidRequest","message":"Cancel transaction is missing the existing pricing component \u003cclassification 'surplus-lines-tax', qualifier 'NY', label 'Surplus Lines Tax (NY)'>. Every key the policy already carries must stay present at its server-derived value — the cancel floors each existing charge at what it has earned. Removing a charge is an ENDORSE, not a cancel/reinstate transaction."}}},"additionNotImmediate":{"title":"additionNotImmediate","value":{"error":{"code":"InvalidRequest","message":"Cancel transaction adds the pricing component \u003cclassification 'cancellation-fee', label 'Cancellation Fee'> without earningSchedule 'immediate'. A charge a cancel/reinstate transaction creates is recognized on its effective date; a pro-rata addition would schedule coverage the transaction is not selling. Absent, null and 'pro-rata' all mean pro-rata, so an addition must state the immediate schedule explicitly."}}}},"exampleType":"examples"}},"exampleType":"examples"},"0e9c28e4-656d-4da6-ab65-6724d772f968":{"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"},"b3e0db8a-df2b-429b-9103-77987c1a54f1":{"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"},"019c31e2-136f-4a30-9219-32ddd472298f":{"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"},"5d1b4a95-8f02-409d-afe8-741ddb1fa500":{"description":"A void watermark in invoicePlan is stale; no policy version or invoice action was committed.","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":{"Example":{"title":"Example","value":{"error":{"code":"VALIDATION_ERROR","message":"submissionId: Required field is missing","userMessages":["Exposures of type 'company' require an address"],"details":[{"field":"submissionId","code":"BLANK_LIST_ELEMENT","reason":"blank-list-element","expected":"nonblank trimmed string","message":"Required field is missing"}]}}}},"exampleType":"generated"}},"exampleType":"generated"},"8c8652e3-a2aa-4ca9-9ebe-1ee061f3333d":{"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.","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."]}}}},"exampleType":"examples"}},"exampleType":"examples"},"2966d24c-ad1d-47db-9214-b209fec269ba":{"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":"Cancel Policy Transaction - AI Insurance","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T17:32:13.606Z","originalFileLocation":"api-reference/field-model-policy-transactions/cancel-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=\"Cancels a bound policy from a date as a CANCEL transaction, for any reason, including non-payment: the request takes a date, not a reason. The server works out the cancelled term\u0026#x27;s premium itself: each pro rata charge drops to what it earned through the cancellation date, so a cancellation on the start date is a flat cancellation, and fully earned fees stay. Add a short-rate penalty or cancellation fee if you charge one; undo the cancellation with Reinstate Policy Transaction (reinstatePolicyTransaction). 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. Cancels a policy as of a given date via a CANCEL transaction. The policy must be active at the cancellation date. cancellationDate (= the transaction effective date) is sugar the server expands into per-segment, segment-scoped deltas on framework-required fields. policyStatus flips to cancelled from the cancellation date through end of term (splitting the segment at the boundary), and a single cancellationEffectiveOnDate is recorded uniformly across the whole term — the same value on both sides of the boundary. policyStatus alone marks which side a segment is on. There is no policyEarlyTerminationDate and no status-enum machinery. ## A cancel never reprices — the pricing contract is DERIVED The server computes what the cancelled term\u0026#x27;s pricing contract must be, per charge. Every pricing component the policy already carries stays present, keeps its label, classification, qualifier and earningSchedule, and drops to its own earned amount through the cancellation date. A charge modelled as immediately earned (earningSchedule: \u0026quot;immediate\u0026quot; — a non-refundable policy fee) therefore keeps its whole value and is untouched by the cancellation; a pro-rata charge keeps the part the term has run through. Nothing is relabelled and nothing is merged: a charge\u0026#x27;s pair is its identity across policy versions, and the platform\u0026#x27;s revenue recognition and invoice binding both attribute money by it. Omit fullTermPricingInfo and the derived pricing contract is used. Billing is never derived: state it, or the cancellation stores none. If you DO send fullTermPricingInfo, it is validated against that derived contract component by component, to the exact cent: - every component the policy already carries must be present, at exactly the derived value and with the derived earningSchedule; - an UNRECOGNIZED pair is an addition — money the cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it MUST carry earningSchedule: \u0026quot;immediate\u0026quot;, because it is recognized on the cancellation date rather than scheduled over coverage that is ending. An addition may name any live classification (including a premium one, for a short-rate penalty) and may be negative (a clawback). Companies that tax through InsCipher. Where the company\u0026#x27;s InsCipher cancel/reinstate tax sourcing is enabled, the server asks InsCipher what the state actually refunds on this cancellation and appends its answer to the derived contract as additions of its own — one immediate component per corrected tax, under that tax\u0026#x27;s classification with a reserved qualifier of the form inscipher-PC v3 (FC for a cancellation effective on the policy\u0026#x27;s first day; a state suffix where the charge is split by state). Their values make the written total move by exactly what the state returns; the floors are untouched. A supplied fullTermPricingInfo must include them, at the derived cents, like every other derived component — which is one more reason to omit the container. If InsCipher cannot answer while tax money is at stake, the cancellation is refused (502 inscipher-tax-calculation-failed, or 422 inscipher-cancel-reinstate-tax-unpriceable naming the gap) rather than booked on the floors alone. Re-valuing, re-basing or dropping an existing component is rejected with a 400 naming it. To CHANGE what the policy is priced at, book an endorsement at the same effective date and then cancel: transactions sharing an effective date are applied in booking order (ascending policyVersion), so the endorsement\u0026#x27;s figures are what the cancellation floors against. The same composition works after a reinstatement — reinstate, then endorse — to reprice the restored term going forward. Three optional derived channels are whole-object overwrites of a policy-root full-term container — necessarily whole-term, so none carries dates nor an element-level form: - fullTermPricingInfo — the full-term pricing contract, validated as described above. - fullTermBillingInfo — the term\u0026#x27;s billing obligations per line item. The caller states this value, and leaving it out stores none. Stated billing must pass the receivable checksum and vocabulary checks. - fullTermPolicyRatingResult — the canonical policy-level rating result. Unvalidated and unconstrained: it is the rater\u0026#x27;s own output, not the money the platform books. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. If cancellation moves the billing an invoiced policy\u0026#x27;s invoices add up to, a plan is required; without one it is refused with 422 finv2-policy-restates-invoices. A plan may credit a line the new billing drops, such as a paid tax on a flat cancellation (Credits). 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, at what the cancelled term owes. 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. A cancellation 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. An invoicePlan that voids every active invoice moves the policy down from invoicing; one that voids every active invoice and creates none needs no billing, so a cancellation that leaves billing out and voids every unpaid invoice names 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. Required permission: policy.cancel\">\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=\"Cancel Policy Transaction - AI Insurance\">\u003cmeta data-mint-head property=\"og:description\" content=\"Cancels a bound policy from a date as a CANCEL transaction, for any reason, including non-payment: the request takes a date, not a reason. The server works out the cancelled term\u0026#x27;s premium itself: each pro rata charge drops to what it earned through the cancellation date, so a cancellation on the start date is a flat cancellation, and fully earned fees stay. Add a short-rate penalty or cancellation fee if you charge one; undo the cancellation with Reinstate Policy Transaction (reinstatePolicyTransaction). 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. Cancels a policy as of a given date via a CANCEL transaction. The policy must be active at the cancellation date. cancellationDate (= the transaction effective date) is sugar the server expands into per-segment, segment-scoped deltas on framework-required fields. policyStatus flips to cancelled from the cancellation date through end of term (splitting the segment at the boundary), and a single cancellationEffectiveOnDate is recorded uniformly across the whole term — the same value on both sides of the boundary. policyStatus alone marks which side a segment is on. There is no policyEarlyTerminationDate and no status-enum machinery. ## A cancel never reprices — the pricing contract is DERIVED The server computes what the cancelled term\u0026#x27;s pricing contract must be, per charge. Every pricing component the policy already carries stays present, keeps its label, classification, qualifier and earningSchedule, and drops to its own earned amount through the cancellation date. A charge modelled as immediately earned (earningSchedule: \u0026quot;immediate\u0026quot; — a non-refundable policy fee) therefore keeps its whole value and is untouched by the cancellation; a pro-rata charge keeps the part the term has run through. Nothing is relabelled and nothing is merged: a charge\u0026#x27;s pair is its identity across policy versions, and the platform\u0026#x27;s revenue recognition and invoice binding both attribute money by it. Omit fullTermPricingInfo and the derived pricing contract is used. Billing is never derived: state it, or the cancellation stores none. If you DO send fullTermPricingInfo, it is validated against that derived contract component by component, to the exact cent: - every component the policy already carries must be present, at exactly the derived value and with the derived earningSchedule; - an UNRECOGNIZED pair is an addition — money the cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it MUST carry earningSchedule: \u0026quot;immediate\u0026quot;, because it is recognized on the cancellation date rather than scheduled over coverage that is ending. An addition may name any live classification (including a premium one, for a short-rate penalty) and may be negative (a clawback). Companies that tax through InsCipher. Where the company\u0026#x27;s InsCipher cancel/reinstate tax sourcing is enabled, the server asks InsCipher what the state actually refunds on this cancellation and appends its answer to the derived contract as additions of its own — one immediate component per corrected tax, under that tax\u0026#x27;s classification with a reserved qualifier of the form inscipher-PC v3 (FC for a cancellation effective on the policy\u0026#x27;s first day; a state suffix where the charge is split by state). Their values make the written total move by exactly what the state returns; the floors are untouched. A supplied fullTermPricingInfo must include them, at the derived cents, like every other derived component — which is one more reason to omit the container. If InsCipher cannot answer while tax money is at stake, the cancellation is refused (502 inscipher-tax-calculation-failed, or 422 inscipher-cancel-reinstate-tax-unpriceable naming the gap) rather than booked on the floors alone. Re-valuing, re-basing or dropping an existing component is rejected with a 400 naming it. To CHANGE what the policy is priced at, book an endorsement at the same effective date and then cancel: transactions sharing an effective date are applied in booking order (ascending policyVersion), so the endorsement\u0026#x27;s figures are what the cancellation floors against. The same composition works after a reinstatement — reinstate, then endorse — to reprice the restored term going forward. Three optional derived channels are whole-object overwrites of a policy-root full-term container — necessarily whole-term, so none carries dates nor an element-level form: - fullTermPricingInfo — the full-term pricing contract, validated as described above. - fullTermBillingInfo — the term\u0026#x27;s billing obligations per line item. The caller states this value, and leaving it out stores none. Stated billing must pass the receivable checksum and vocabulary checks. - fullTermPolicyRatingResult — the canonical policy-level rating result. Unvalidated and unconstrained: it is the rater\u0026#x27;s own output, not the money the platform books. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. If cancellation moves the billing an invoiced policy\u0026#x27;s invoices add up to, a plan is required; without one it is refused with 422 finv2-policy-restates-invoices. A plan may credit a line the new billing drops, such as a paid tax on a flat cancellation (Credits). 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, at what the cancelled term owes. 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. A cancellation 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. An invoicePlan that voids every active invoice moves the policy down from invoicing; one that voids every active invoice and creates none needs no billing, so a cancellation that leaves billing out and voids every unpaid invoice names 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. Required permission: policy.cancel\">\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/cancel-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=Cancel+Policy+Transaction\u0026amp;description=Cancels+a+bound+policy+from+a+date+as+a+CANCEL+transaction%2C+for+any+reason%2C%0Aincluding+non-payment%3A+the+request+takes+a+date%2C+not+a+reason.+The+server%0Aworks+out+\u0026amp;theme=0995c531691aeb9df7f9b066\u0026amp;signature=80fd09121143dbbfdeff1bca53ec2d42636e3c88cb2f41c587dc436b24b8a574\">\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=\"Cancel Policy Transaction - AI Insurance\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Cancels a bound policy from a date as a CANCEL transaction, for any reason, including non-payment: the request takes a date, not a reason. The server works out the cancelled term\u0026#x27;s premium itself: each pro rata charge drops to what it earned through the cancellation date, so a cancellation on the start date is a flat cancellation, and fully earned fees stay. Add a short-rate penalty or cancellation fee if you charge one; undo the cancellation with Reinstate Policy Transaction (reinstatePolicyTransaction). 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. Cancels a policy as of a given date via a CANCEL transaction. The policy must be active at the cancellation date. cancellationDate (= the transaction effective date) is sugar the server expands into per-segment, segment-scoped deltas on framework-required fields. policyStatus flips to cancelled from the cancellation date through end of term (splitting the segment at the boundary), and a single cancellationEffectiveOnDate is recorded uniformly across the whole term — the same value on both sides of the boundary. policyStatus alone marks which side a segment is on. There is no policyEarlyTerminationDate and no status-enum machinery. ## A cancel never reprices — the pricing contract is DERIVED The server computes what the cancelled term\u0026#x27;s pricing contract must be, per charge. Every pricing component the policy already carries stays present, keeps its label, classification, qualifier and earningSchedule, and drops to its own earned amount through the cancellation date. A charge modelled as immediately earned (earningSchedule: \u0026quot;immediate\u0026quot; — a non-refundable policy fee) therefore keeps its whole value and is untouched by the cancellation; a pro-rata charge keeps the part the term has run through. Nothing is relabelled and nothing is merged: a charge\u0026#x27;s pair is its identity across policy versions, and the platform\u0026#x27;s revenue recognition and invoice binding both attribute money by it. Omit fullTermPricingInfo and the derived pricing contract is used. Billing is never derived: state it, or the cancellation stores none. If you DO send fullTermPricingInfo, it is validated against that derived contract component by component, to the exact cent: - every component the policy already carries must be present, at exactly the derived value and with the derived earningSchedule; - an UNRECOGNIZED pair is an addition — money the cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it MUST carry earningSchedule: \u0026quot;immediate\u0026quot;, because it is recognized on the cancellation date rather than scheduled over coverage that is ending. An addition may name any live classification (including a premium one, for a short-rate penalty) and may be negative (a clawback). Companies that tax through InsCipher. Where the company\u0026#x27;s InsCipher cancel/reinstate tax sourcing is enabled, the server asks InsCipher what the state actually refunds on this cancellation and appends its answer to the derived contract as additions of its own — one immediate component per corrected tax, under that tax\u0026#x27;s classification with a reserved qualifier of the form inscipher-PC v3 (FC for a cancellation effective on the policy\u0026#x27;s first day; a state suffix where the charge is split by state). Their values make the written total move by exactly what the state returns; the floors are untouched. A supplied fullTermPricingInfo must include them, at the derived cents, like every other derived component — which is one more reason to omit the container. If InsCipher cannot answer while tax money is at stake, the cancellation is refused (502 inscipher-tax-calculation-failed, or 422 inscipher-cancel-reinstate-tax-unpriceable naming the gap) rather than booked on the floors alone. Re-valuing, re-basing or dropping an existing component is rejected with a 400 naming it. To CHANGE what the policy is priced at, book an endorsement at the same effective date and then cancel: transactions sharing an effective date are applied in booking order (ascending policyVersion), so the endorsement\u0026#x27;s figures are what the cancellation floors against. The same composition works after a reinstatement — reinstate, then endorse — to reprice the restored term going forward. Three optional derived channels are whole-object overwrites of a policy-root full-term container — necessarily whole-term, so none carries dates nor an element-level form: - fullTermPricingInfo — the full-term pricing contract, validated as described above. - fullTermBillingInfo — the term\u0026#x27;s billing obligations per line item. The caller states this value, and leaving it out stores none. Stated billing must pass the receivable checksum and vocabulary checks. - fullTermPolicyRatingResult — the canonical policy-level rating result. Unvalidated and unconstrained: it is the rater\u0026#x27;s own output, not the money the platform books. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. If cancellation moves the billing an invoiced policy\u0026#x27;s invoices add up to, a plan is required; without one it is refused with 422 finv2-policy-restates-invoices. A plan may credit a line the new billing drops, such as a paid tax on a flat cancellation (Credits). 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, at what the cancelled term owes. 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. A cancellation 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. An invoicePlan that voids every active invoice moves the policy down from invoicing; one that voids every active invoice and creates none needs no billing, so a cancellation that leaves billing out and voids every unpaid invoice names 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. Required permission: policy.cancel\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ai-insurance-fmv1.mintlify.site/_mintlify/api/og/v2?division=Transactions\u0026amp;title=Cancel+Policy+Transaction\u0026amp;description=Cancels+a+bound+policy+from+a+date+as+a+CANCEL+transaction%2C+for+any+reason%2C%0Aincluding+non-payment%3A+the+request+takes+a+date%2C+not+a+reason.+The+server%0Aworks+out+\u0026amp;theme=0995c531691aeb9df7f9b066\u0026amp;signature=80fd09121143dbbfdeff1bca53ec2d42636e3c88cb2f41c587dc436b24b8a574\">\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/cancel-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/cancel-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/cancel-policy-transaction#webpage\",\"url\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction\",\"name\":\"Cancel Policy Transaction\",\"description\":\"Cancels a bound policy from a date as a CANCEL transaction, for any reason, including non-payment: the request takes a date, not a reason. The server works out the cancelled term's premium itself: each pro rata charge drops to what it earned through the cancellation date, so a cancellation on the start date is a flat cancellation, and fully earned fees stay. Add a short-rate penalty or cancellation fee if you charge one; undo the cancellation with Reinstate Policy Transaction (reinstatePolicyTransaction). 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. Cancels a policy as of a given date via a CANCEL transaction. The policy must be active at the cancellation date. cancellationDate (= the transaction effective date) is sugar the server expands into per-segment, segment-scoped deltas on framework-required fields. policyStatus flips to cancelled from the cancellation date through end of term (splitting the segment at the boundary), and a single cancellationEffectiveOnDate is recorded uniformly across the whole term — the same value on both sides of the boundary. policyStatus alone marks which side a segment is on. There is no policyEarlyTerminationDate and no status-enum machinery. ## A cancel never reprices — the pricing contract is DERIVED The server computes what the cancelled term's pricing contract must be, per charge. Every pricing component the policy already carries stays present, keeps its label, classification, qualifier and earningSchedule, and drops to its own earned amount through the cancellation date. A charge modelled as immediately earned (earningSchedule: \\\"immediate\\\" — a non-refundable policy fee) therefore keeps its whole value and is untouched by the cancellation; a pro-rata charge keeps the part the term has run through. Nothing is relabelled and nothing is merged: a charge's pair is its identity across policy versions, and the platform's revenue recognition and invoice binding both attribute money by it. Omit fullTermPricingInfo and the derived pricing contract is used. Billing is never derived: state it, or the cancellation stores none. If you DO send fullTermPricingInfo, it is validated against that derived contract component by component, to the exact cent: - every component the policy already carries must be present, at exactly the derived value and with the derived earningSchedule; - an UNRECOGNIZED pair is an addition — money the cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it MUST carry earningSchedule: \\\"immediate\\\", because it is recognized on the cancellation date rather than scheduled over coverage that is ending. An addition may name any live classification (including a premium one, for a short-rate penalty) and may be negative (a clawback). Companies that tax through InsCipher. Where the company's InsCipher cancel/reinstate tax sourcing is enabled, the server asks InsCipher what the state actually refunds on this cancellation and appends its answer to the derived contract as additions of its own — one immediate component per corrected tax, under that tax's classification with a reserved qualifier of the form inscipher-PC v3 (FC for a cancellation effective on the policy's first day; a state suffix where the charge is split by state). Their values make the written total move by exactly what the state returns; the floors are untouched. A supplied fullTermPricingInfo must include them, at the derived cents, like every other derived component — which is one more reason to omit the container. If InsCipher cannot answer while tax money is at stake, the cancellation is refused (502 inscipher-tax-calculation-failed, or 422 inscipher-cancel-reinstate-tax-unpriceable naming the gap) rather than booked on the floors alone. Re-valuing, re-basing or dropping an existing component is rejected with a 400 naming it. To CHANGE what the policy is priced at, book an endorsement at the same effective date and then cancel: transactions sharing an effective date are applied in booking order (ascending policyVersion), so the endorsement's figures are what the cancellation floors against. The same composition works after a reinstatement — reinstate, then endorse — to reprice the restored term going forward. Three optional derived channels are whole-object overwrites of a policy-root full-term container — necessarily whole-term, so none carries dates nor an element-level form: - fullTermPricingInfo — the full-term pricing contract, validated as described above. - fullTermBillingInfo — the term's billing obligations per line item. The caller states this value, and leaving it out stores none. Stated billing must pass the receivable checksum and vocabulary checks. - fullTermPolicyRatingResult — the canonical policy-level rating result. Unvalidated and unconstrained: it is the rater's own output, not the money the platform books. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. If cancellation moves the billing an invoiced policy's invoices add up to, a plan is required; without one it is refused with 422 finv2-policy-restates-invoices. A plan may credit a line the new billing drops, such as a paid tax on a flat cancellation (Credits). 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, at what the cancelled term owes. 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. A cancellation 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. An invoicePlan that voids every active invoice moves the policy down from invoicing; one that voids every active invoice and creates none needs no billing, so a cancellation that leaves billing out and voids every unpaid invoice names 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. Required permission: policy.cancel\",\"dateModified\":\"2026-11-13T17:32:13.606Z\",\"isPartOf\":{\"@id\":\"https://docs.go.aiinsurance.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-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\":\"Cancel Policy Transaction\",\"item\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction#apireference\",\"headline\":\"Cancel Policy Transaction\",\"name\":\"Cancel Policy Transaction\",\"description\":\"Cancels a bound policy from a date as a CANCEL transaction, for any reason, including non-payment: the request takes a date, not a reason. The server works out the cancelled term's premium itself: each pro rata charge drops to what it earned through the cancellation date, so a cancellation on the start date is a flat cancellation, and fully earned fees stay. Add a short-rate penalty or cancellation fee if you charge one; undo the cancellation with Reinstate Policy Transaction (reinstatePolicyTransaction). 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. Cancels a policy as of a given date via a CANCEL transaction. The policy must be active at the cancellation date. cancellationDate (= the transaction effective date) is sugar the server expands into per-segment, segment-scoped deltas on framework-required fields. policyStatus flips to cancelled from the cancellation date through end of term (splitting the segment at the boundary), and a single cancellationEffectiveOnDate is recorded uniformly across the whole term — the same value on both sides of the boundary. policyStatus alone marks which side a segment is on. There is no policyEarlyTerminationDate and no status-enum machinery. ## A cancel never reprices — the pricing contract is DERIVED The server computes what the cancelled term's pricing contract must be, per charge. Every pricing component the policy already carries stays present, keeps its label, classification, qualifier and earningSchedule, and drops to its own earned amount through the cancellation date. A charge modelled as immediately earned (earningSchedule: \\\"immediate\\\" — a non-refundable policy fee) therefore keeps its whole value and is untouched by the cancellation; a pro-rata charge keeps the part the term has run through. Nothing is relabelled and nothing is merged: a charge's pair is its identity across policy versions, and the platform's revenue recognition and invoice binding both attribute money by it. Omit fullTermPricingInfo and the derived pricing contract is used. Billing is never derived: state it, or the cancellation stores none. If you DO send fullTermPricingInfo, it is validated against that derived contract component by component, to the exact cent: - every component the policy already carries must be present, at exactly the derived value and with the derived earningSchedule; - an UNRECOGNIZED pair is an addition — money the cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it MUST carry earningSchedule: \\\"immediate\\\", because it is recognized on the cancellation date rather than scheduled over coverage that is ending. An addition may name any live classification (including a premium one, for a short-rate penalty) and may be negative (a clawback). Companies that tax through InsCipher. Where the company's InsCipher cancel/reinstate tax sourcing is enabled, the server asks InsCipher what the state actually refunds on this cancellation and appends its answer to the derived contract as additions of its own — one immediate component per corrected tax, under that tax's classification with a reserved qualifier of the form inscipher-PC v3 (FC for a cancellation effective on the policy's first day; a state suffix where the charge is split by state). Their values make the written total move by exactly what the state returns; the floors are untouched. A supplied fullTermPricingInfo must include them, at the derived cents, like every other derived component — which is one more reason to omit the container. If InsCipher cannot answer while tax money is at stake, the cancellation is refused (502 inscipher-tax-calculation-failed, or 422 inscipher-cancel-reinstate-tax-unpriceable naming the gap) rather than booked on the floors alone. Re-valuing, re-basing or dropping an existing component is rejected with a 400 naming it. To CHANGE what the policy is priced at, book an endorsement at the same effective date and then cancel: transactions sharing an effective date are applied in booking order (ascending policyVersion), so the endorsement's figures are what the cancellation floors against. The same composition works after a reinstatement — reinstate, then endorse — to reprice the restored term going forward. Three optional derived channels are whole-object overwrites of a policy-root full-term container — necessarily whole-term, so none carries dates nor an element-level form: - fullTermPricingInfo — the full-term pricing contract, validated as described above. - fullTermBillingInfo — the term's billing obligations per line item. The caller states this value, and leaving it out stores none. Stated billing must pass the receivable checksum and vocabulary checks. - fullTermPolicyRatingResult — the canonical policy-level rating result. Unvalidated and unconstrained: it is the rater's own output, not the money the platform books. Policy invoices. invoicePlan is an invoice plan: nothing in it is defaulted or inferred. If cancellation moves the billing an invoiced policy's invoices add up to, a plan is required; without one it is refused with 422 finv2-policy-restates-invoices. A plan may credit a line the new billing drops, such as a paid tax on a flat cancellation (Credits). 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, at what the cancelled term owes. 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. A cancellation 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. An invoicePlan that voids every active invoice moves the policy down from invoicing; one that voids every active invoice and creates none needs no billing, so a cancellation that leaves billing out and voids every unpaid invoice names 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. Required permission: policy.cancel\",\"url\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction\",\"mainEntityOfPage\":{\"@id\":\"https://docs.go.aiinsurance.io/api-reference/field-model-policy-transactions/cancel-policy-transaction#webpage\"},\"dateModified\":\"2026-11-13T17:32:13.606Z\",\"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/cancel-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","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","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"},{"title":"Cancel Policy Transaction","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","description":"Reinstates a cancelled policy as a REINSTATE transaction, back in force from\nthe cancellation date with no gap in coverage. The server restores the\npremium, taxes and fees the policy carried before the cancellation, and you\nmay add a reinstatement fee. To change the policy as well, reinstate it and\nthen endorse it with Endorse Policy Transaction\n(`endorsePolicyTransaction`).\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\nReinstates a previously cancelled policy as of a given date via a REINSTATE transaction.\nThe policy must be cancelled at the reinstatement date.\n\n`reinstatementDate` (= the transaction effective date) is sugar the server expands into\nper-segment, segment-scoped deltas. `policyStatus` flips back to `active` from the\nreinstatement date through end of term, and `cancellationEffectiveOnDate` is **cleared**\nacross the whole term — reinstatement removes the cancellation marker rather than recording\na parallel reinstatement marker. There is no reinstatement date field.\n\n**A reinstate may not leave a coverage gap.** A reinstate that would leave a cancelled\nwindow between two active periods (e.g. cancel Jun 15, reinstate Jul 1, leaving\nJun 15–Jun 30 cancelled) is rejected with a `400` — the domain models that as a new policy\nterm, not a reinstatement. A valid reinstate restores continuous coverage and fully clears\nthe cancellation, so the segments return to their pre-cancellation state (and merge).\n\n## A reinstate never reprices — it RESTORES\n\nThe server computes what the reinstated term's pricing contract must be: the **pre-cancel\nversion's contract, verbatim**. Every component comes back — premium, taxes, fees —\nat the value and `earningSchedule` the policy carried before the cancellation, so\nthe reinstatement is the exact inverse of the cancel's per-charge floor. Recognition follows:\neach charge picks its schedule back up from the reinstatement date, and the earned curve\nacross cancel-then-reinstate is flat.\n\n\"Pre-cancel\" is a VERSION, not a date — the version immediately before the CANCEL being\nundone. Since a reinstatement may not leave a coverage gap, its effective date is the\ncancellation date, so there is nothing to choose.\n\nOmit `fullTermPricingInfo` and the restored pricing contract is used.\nBilling is never restored: state it, or the reinstatement\nstores none.\n\nIf you DO send `fullTermPricingInfo`, it is validated against that restored contract\n**component by component, to the exact cent**:\n\n- every component of the pre-cancel contract must be present, at exactly its pre-cancel\n value and with its pre-cancel `earningSchedule`;\n- an UNRECOGNIZED `\u003cclassification, qualifier>` pair is an **addition** — money the\n reinstatement itself creates, typically a reinstatement fee — and it MUST carry\n `earningSchedule: \"immediate\"`, because it is recognized on the reinstatement\n date rather than scheduled over the restored term.\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 re-charges on this\nreinstatement and appends its answer to the restored 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-RI v4` (a state suffix where the charge is\nsplit by state). A flat fee the state charged once and does not re-charge is netted to\nnothing this way. A supplied `fullTermPricingInfo` must include them, at the derived\ncents. If InsCipher cannot answer while tax money is at stake, the reinstatement is\nrefused (`502` `inscipher-tax-calculation-failed`, or `422`\n`inscipher-cancel-reinstate-tax-unpriceable` naming the gap).\n\nRe-valuing, re-basing or dropping a restored component is rejected with a `400` naming it. To\nreprice the restored term, book an **endorsement at the same effective date** after the\nreinstatement: transactions sharing an effective date are applied in booking order (ascending\n`policyVersion`), so reinstate-then-endorse restores the term and then reprices it\nprospectively.\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 reinstatement 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\nrestored 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 reinstatement keeps the\npolicy at its layer unless `pricingStackLayerChange` names the move it makes. Stating billing on\na policy that has none, such as one whose cancellation dropped its billing, moves it\nfrom `pricing` to `billing`, and an `invoicePlan` that gives it its first invoices\nmoves it up to `invoicing`. Leaving out `fullTermBillingInfo` on a billed policy\ndrops its billing, a move from `billing` to `pricing`. A move the request does not\nname, or a named move it does not make, returns `422 policy-pricing-stack-layer-change` and\nsaves nothing; its message names the actual move and the exact `pricingStackLayerChange` that\nwould name it. Billing that owes nothing sits at both `billing` and `invoicing`.\n\n**Required permission:** `policy.reinstate`\n","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":"Cancel 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"]}