curl --request POST \
--url https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/{policyId}/transaction/reinstate \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"reinstatementDate": "2025-06-15"
}
'{
"policyId": "550e8400-e29b-41d4-a716-446655440001",
"policyVersion": 3,
"transactionId": "550e8400-e29b-41d4-a716-446655440050",
"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": 85000,
"taxes": 0,
"fees": 2000,
"total": 87000,
"pricingComponents": [
{
"label": "Policy Premium",
"classification": "policy-premium",
"qualifier": "",
"earningSchedule": "pro-rata",
"value": 85000
},
{
"label": "Reinstatement Fee",
"classification": "reinstatement-fee",
"qualifier": "",
"earningSchedule": "immediate",
"value": 2000
}
]
},
"fullTermBillingInfo": null,
"fullTermPolicyRatingResult": null,
"segments": [
{
"startDate": "2025-01-01",
"endDate": "2025-12-31",
"transactionType": "REINSTATE",
"data": {
"policyStatus": "active",
"annualPremium": 85000,
"fullTermPricingInfo": {
"premium": 85000,
"taxes": 0,
"fees": 2000,
"total": 87000,
"pricingComponents": [
{
"label": "Policy Premium",
"classification": "policy-premium",
"qualifier": "",
"earningSchedule": "pro-rata",
"value": 85000
},
{
"label": "Reinstatement Fee",
"classification": "reinstatement-fee",
"qualifier": "",
"earningSchedule": "immediate",
"value": 2000
}
]
}
}
}
]
}Reinstate Policy Transaction
Reinstates a previously cancelled policy as of a given date via a REINSTATE transaction. The policy must be cancelled at the reinstatement date.
reinstatementDate (= the transaction effective date) is sugar the server expands into
per-segment, segment-scoped deltas. policyStatus flips back to active from the
reinstatement date through end of term, and cancellationEffectiveOnDate is cleared
across the whole term — reinstatement removes the cancellation marker rather than recording
a parallel reinstatement marker. There is no reinstatement date field.
A reinstate may not leave a coverage gap. A reinstate that would leave a cancelled
window between two active periods (e.g. cancel Jun 15, reinstate Jul 1, leaving
Jun 15–Jun 30 cancelled) is rejected with a 400 — the domain models that as a new policy
term, not a reinstatement. A valid reinstate restores continuous coverage and fully clears
the cancellation, so the segments return to their pre-cancellation state (and merge).
A reinstate never reprices — it RESTORES
The server computes what the reinstated term’s pricing contract must be: the pre-cancel
version’s contract, verbatim. Every component comes back — premium, taxes, fees —
at the value and earningSchedule the policy carried before the cancellation, so
the reinstatement is the exact inverse of the cancel’s per-charge floor. Recognition follows:
each charge picks its schedule back up from the reinstatement date, and the earned curve
across cancel-then-reinstate is flat.
“Pre-cancel” is a VERSION, not a date — the version immediately before the CANCEL being undone. Since a reinstatement may not leave a coverage gap, its effective date is the cancellation date, so there is nothing to choose.
A bare { "reinstatementDate": ... } body is the normal request, and it always
succeeds. Omit fullTermPricingInfo and the restored contract is used.
If you DO send fullTermPricingInfo, it is validated against that restored contract
component by component, to the exact cent:
- every component of the pre-cancel contract must be present, at exactly its pre-cancel
value and with its pre-cancel
earningSchedule; - an UNRECOGNIZED
<classification, qualifier>pair is an addition — money the reinstatement itself creates, typically a reinstatement fee — and it MUST carryearningSchedule: "immediate", because it is recognized on the reinstatement date rather than scheduled over the restored term.
Companies that tax through InsCipher. Where the company’s InsCipher lifecycle tax
sourcing is enabled, the server asks InsCipher what the state re-charges on this
reinstatement and appends its answer to the restored 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-RI v4 (a state suffix where the charge is
split by state). A flat fee the state charged once and does not re-charge is netted to
nothing this way. A supplied fullTermPricingInfo must include them, at the derived
cents. If InsCipher cannot answer while tax money is at stake, the reinstatement is
refused (502 inscipher-tax-calculation-failed, or 422
inscipher-lifecycle-tax-unpriceable naming the gap).
Re-valuing, re-basing or dropping a restored component is rejected with a 400 naming it. To
reprice the restored term, book an endorsement at the same effective date after the
reinstatement: transactions sharing an effective date are applied in booking order (ascending
policyVersion), so reinstate-then-endorse restores the term and then reprices it
prospectively.
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 Billing Aggregate, the term’s billing obligations per line item. Omit it and the platform derives it, restoring the pre-cancel lines verbatim,payablelines included — or, when InsCipher adjustments changed the restored total, scaling thereceivablelines to it by largest remainder, as a cancellation does. State it explicitly to override that; either way a stated aggregate is checked against the receivable checksum and the per-line vocabulary rules.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 reinstatement
moves a billed policy’s pricing target, a conserving plan is required.
Required permission: policy.reinstate
curl --request POST \
--url https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/{policyId}/transaction/reinstate \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"reinstatementDate": "2025-06-15"
}
'{
"policyId": "550e8400-e29b-41d4-a716-446655440001",
"policyVersion": 3,
"transactionId": "550e8400-e29b-41d4-a716-446655440050",
"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": 85000,
"taxes": 0,
"fees": 2000,
"total": 87000,
"pricingComponents": [
{
"label": "Policy Premium",
"classification": "policy-premium",
"qualifier": "",
"earningSchedule": "pro-rata",
"value": 85000
},
{
"label": "Reinstatement Fee",
"classification": "reinstatement-fee",
"qualifier": "",
"earningSchedule": "immediate",
"value": 2000
}
]
},
"fullTermBillingInfo": null,
"fullTermPolicyRatingResult": null,
"segments": [
{
"startDate": "2025-01-01",
"endDate": "2025-12-31",
"transactionType": "REINSTATE",
"data": {
"policyStatus": "active",
"annualPremium": 85000,
"fullTermPricingInfo": {
"premium": 85000,
"taxes": 0,
"fees": 2000,
"total": 87000,
"pricingComponents": [
{
"label": "Policy Premium",
"classification": "policy-premium",
"qualifier": "",
"earningSchedule": "pro-rata",
"value": 85000
},
{
"label": "Reinstatement Fee",
"classification": "reinstatement-fee",
"qualifier": "",
"earningSchedule": "immediate",
"value": 2000
}
]
}
}
}
]
}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 reinstatement takes effect in ISO 8601 format. Must fall within the policy term, and the policy must be cancelled 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 restores the pre-cancel contract (recommended).
When supplied, it must be that restored contract plus additions: every component
of the pre-cancel version, present at exactly its pre-cancel value and
earningSchedule, plus any NEW <classification, qualifier> pairs
(reinstatement 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.
Optional whole-object overwrite of the policy-root Billing Aggregate — the term's billing obligations per line item. Structure is validated; it is not compared against the restored pricing contract.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
Response
Policy reinstated 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)
Plain-text primary-insured name, read from the policy's own
primaryInsuredName field — the source of truth for the primary insured.
Reported as of the END of
the term, so a policy whose insured changed mid-term returns the later name;
segments[] carries the per-segment history. Null only when the version
carries no policy data.
Id of the entity behind primaryInsuredName. Null when the policy's
configuration does not populate it.
The policy number, read from the policy's own policyNumber field — the
source of truth, invariant across the whole term. Null only when the version
carries no policy data.
Policy term start date as the structured date object, read from the policy's
own policyStartDate field — the source of truth, invariant across the whole
term. This is not startDate above: that is the ISO
span this version covers, which a cancellation makes shorter than the term.
Null only when the version carries no policy data.
Show child attributes
Show child attributes
Policy term end date as the structured date object, read from the policy's own
policyEndDate field — the source of truth, invariant across the whole term.
This is not endDate above: that is the ISO
span this version covers. Null only when the version carries no policy data.
Show child attributes
Show child attributes
The policy's full-term pricing contract, hoisted as a read-once convenience
(also duplicated in every segment): pricingComponents plus the four
server-computed, read-only rollups — premium, taxes and fees (each
the sum of the components whose classification reports into it) and
total (premium + taxes + fees). All four
are always present. The retired brokerCommission / programCommission
rollups are no longer computed; a version stored before their retirement
may still return the two keys until the per-tenant data sweeps.
Each newly written component carries
{label, value, classification, qualifier, earningSchedule} —
<classification, qualifier> is its identity, and label is cosmetic.
The legacy vocabulary is retired: a component stored before the
retirement may still echo the group / kind / earningBasis keys
until the per-tenant data sweeps remove them — treat those as historical
output, never as identity, and do not rely on their presence.
The policy's Billing Aggregate for the term, hoisted as a read-once convenience (also duplicated in every segment). Null when the policy states no billing obligations.
Show child attributes
Show child attributes
Derived canonical policy-level rating result for the full term, hoisted as a
read-once convenience (also duplicated in every segment). Element-level rating
output (crossSegmentRatingOutputs) stays inline at its host and is not hoisted.
Derived segments for this policy version. Each segment represents a maximal contiguous date range where policy state is identical. Adjacent segments with identical data are automatically merged.
Show child attributes
Show child attributes
