Policy issued, claim assessed → the document that says so
Two documents a policyholder keeps, and both of them are arithmetic they will check.
Trigger → artefact
A policy is issued or renewed, or a claim assessment closesa policy schedule or a claim settlement statement, as PDF bytes
Insurance documents are read adversarially. A policyholder compares the premium on the schedule against what was debited, and a claimant compares what was paid against what they asked for — line by line, months later, sometimes in front of an ombudsman.
So neither of these documents accepts a total. You send sections, endorsements and claimed items; the schedule computes the premium build-up and the sums insured, and the settlement statement runs a fixed order of operations — claimed, less what is not covered, less depreciation, then co-pay, excess, salvage, sub-limit and the sum insured remaining. Send a total premium or an amount payable and the render is refused with the field named.
The settlement statement also states the outcome in words rather than leaving it to a number: settled in full, settled in part, nothing payable, or declined with the reason on the face of the document.
Built with the HTML API. Need a designed image or certificate instead? Use the Canvas API — same data, same free year.
Policy schedule — rendered by the template this page calls.
What ships in this category
The documents, and the part of each that is hard.
Policy schedule
Insured and risk details, coverage sections with sums insured and excesses, endorsements, key exclusions and the premium build-up down to the amount charged.
Hard part A premium build-up nobody can override — sections plus endorsements, loading, discount, tax and stamp duty.
template_id 62c4c610-5577-4285-9f7f-93052a4ff4e9
Claim settlement statement
Every claimed item with what was not covered and why, the deduction ladder in a fixed order, and the amount payable — or the reason the claim was declined.
Hard part Excess, co-pay and sub-limits applied in one fixed order, with the reason printed beside every reduction.
Run against the API before publishing: 200, application/pdf. Set repudiation_reason and the same call returns a declined-claim letter with the reason on its face and nothing payable.
The contract
Exactly what you send, exactly what you get.
These templates take named keys — no positional arguments, no layout to describe. Send a row array and the pagination follows it.
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
What you would ask next.
Our assessors already compute the payable amount. Can we just send it?
No, and that is deliberate. A settlement letter whose total disagrees with its own line items is the document that ends up at the ombudsman. Send the items and the rules — excess, co-pay, sub-limit — and the document derives the figure it prints. A caller-supplied amount_payable is a 400 with the field named.
A declined claim is a different letter for us.
It is the same template here. Fill repudiation_reason and the document prints DECLINED, the reason, nothing payable, no payment block, and the escalation route. One integration covers both, which is why the two can never drift apart.
Health, motor and property claims are not the same document.
The deduction ladder is, which is the hard part. Co-pay and sub-limits are health-shaped; depreciation and salvage are motor-shaped; both are fields, and the ones you leave out do not print. Where the wording genuinely differs, describe the change and the AI layer amends the template.
Regulator-mandated wording changes twice a year.
The template is yours and versioned — publish a new version, pin the old one for reproducing historical documents, and renders stay deterministic across the change.
Your system already knows when the document is owed.