Cancel Policy Transaction
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, group,
kind and earningBasis, and drops to its own earned amount through the cancellation
date. A charge modelled as fully earned at inception (earningBasis: "fully-earned-at-inception" — 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 <group, label> pair
is its identity across policy versions, and the platform’s revenue recognition and invoice
binding both attribute money by it.
A bare { "cancellationDate": ... } body is the normal request, and it always
succeeds. Omit fullTermPricingInfo and the derived contract is used.
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
earningBasis; - an UNRECOGNIZED
<group, label>pair is an addition — money the cancellation itself creates, such as a short-rate penalty or a cancellation fee — and it MUST carryearningBasis: "fully-earned-at-inception", because it is recognized on the cancellation date rather than scheduled over coverage that is ending. An addition may be anykind(includingPremiumfor a short-rate penalty) and may be negative (a clawback).
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.
Two optional derived channels are whole-object overwrites of a policy-root full-term container — necessarily whole-term, so neither carries dates nor an element-level form:
fullTermPricingInfo— the full-term pricing contract, validated as described above.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. Optionally send invoicePlan, a fully explicit
keep/void/create plan. Nothing is defaulted or inferred. If cancellation
moves a billed policy’s pricing target, a conserving plan is required.
Required permission: policy:update
Authorizations
API key authentication. Send your raw API key as the Authorization header value with NO scheme prefix — Authorization: YOUR-API-KEY. Do NOT prefix it with Bearer or ApiKey, and do not use an X-API-Key header; those are not accepted.
Path Parameters
Company identifier
Policy identifier
Body
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.
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).
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 earningBasis, plus any NEW
<group, label> pairs (short-rate penalties, cancellation fees) carrying
earningBasis: "fully-earned-at-inception". Each component is
{label, group, kind, value[, earningBasis]}; the five rollups are computed by
the platform and any you send are ignored. Compared to the exact cent — there
is no tolerance.
Optional whole-object overwrite of the policy-root canonical rating result.
A fully explicit, detached policy-invoice batch. Existing invoices not named in voidInvoices are kept. The complete kept-plus-created set must conserve every bound component of the policy's current pricing contract.
Response
Policy cancelled successfully
Response returned by policy transaction endpoints. Contains the policy version produced by the transaction, including all derived segments.
Policy identifier
Sequential version number produced by this transaction
Identifier of the transaction that produced this version
Policy term start date (ISO 8601)
Policy term end date (ISO 8601)
When the transaction was created (ISO 8601)
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.
Plain-text primary-insured name, read from the policy's own
primaryInsuredName field — the source of truth for the primary insured.
Reported as of the END of
the term, so a policy whose insured changed mid-term returns the later name;
segments[] carries the per-segment history. Null only when the version
carries no policy data.
Id of the entity behind primaryInsuredName. Null when the policy's
configuration does not populate it.
The policy number, read from the policy's own policyNumber field — the
source of truth, invariant across the whole term. Null only when the version
carries no policy data.
Policy term start date as the structured date object, read from the policy's
own policyStartDate field — the source of truth, invariant across the whole
term. This is not startDate above: that is the ISO
span this version covers, which a cancellation makes shorter than the term.
Null only when the version carries no policy data.
Policy term end date as the structured date object, read from the policy's own
policyEndDate field — the source of truth, invariant across the whole term.
This is not endDate above: that is the ISO
span this version covers. Null only when the version carries no policy data.
The policy's full-term pricing contract, hoisted as a read-once convenience
(also duplicated in every segment): pricingComponents (each
{label, group, kind, value[, earningBasis]}) plus the five server-computed,
read-only rollups (premium, taxes, fees, brokerCommission,
programCommission — each the sum of its kind's components).
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.
