
Account statement
Opening balance, every transaction in the period, a running balance, and an ageing summary at the close.
Hard part A running balance that carries across page breaks.
template_id 3c12452c-d790-4a81-abf0-a8882888f79a
Period closes → a statement per account
Trigger → artefact
The billing period or settlement window closesa paginated statement per account, balances carried correctly
Multi-page finance documents are where hand-rolled PDF generation dies. The header has to repeat, the column widths must not drift, the running balance has to carry to the next page, and the closing total has to appear once — at the end, not on every page.
These templates do that during the render. You send transactions and an opening balance; the document paginates itself, repeats what should repeat, and computes what should be computed. We generate them at two pages and at nine with the same call.
Built with the HTML API. Need a designed image or certificate instead? Use the Canvas API — same data, same free year.

What ships in this category

Opening balance, every transaction in the period, a running balance, and an ageing summary at the close.
Hard part A running balance that carries across page breaks.
template_id 3c12452c-d790-4a81-abf0-a8882888f79a

Marketplace remittance: gross sales, commission, fees, refunds and adjustments down to the amount credited.
Hard part Fee and adjustment blocks that reconcile to the credited total.
template_id 0a81a089-9392-4095-867d-2a3a47656cf6

The amortisation schedule a borrower keeps: every instalment split into principal and interest, what has been paid, and the principal still outstanding at the close of the period.
Hard part A 36-row schedule that breaks across pages with the header repeating and the balance column still stacking.
template_id fb10237a-74b2-4e43-b1fc-989264ba469c
The whole integration
# one call per account, when the period closes
curl https://api.pixldocs.com/v1/render \
-H "Authorization: Bearer $PIXLDOCS_KEY" \
-H "Content-Type: application/json" \
-d '{
"template_id": "3c12452c-d790-4a81-abf0-a8882888f79a",
"format": "pdf",
"data": {
"account_name": "Northwind Traders",
"period_start": "2026-07-01",
"period_end": "2026-07-31",
"opening_balance": 128400,
"transactions": [
{ "date": "2026-07-04", "reference": "INV-2026-0417", "description": "Annual licence", "charge": 56640 }
]
}
}' --output statement.pdfRun against the API before publishing: 200, application/pdf. Add transactions and the document grows pages on its own — nothing in the call changes.
The contract
These templates take named keys — no positional arguments, no layout to describe. Send a row array and the pagination follows it.
3c12452c-d790-4a81-abf0-a8882888f79aFields · 22
Rows · transactions[]
date · reference · description · charge · credit
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
Rows · open_items[]
invoice · invoice_date · due_date · days_overdue · amount
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
0a81a089-9392-4095-867d-2a3a47656cf6Fields · 27
Rows · transactions[]
date · reference · description · kind · gross · commission · payment_fee · tax_withheld
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
Rows · adjustments[]
date · reference · description · amount
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
fb10237a-74b2-4e43-b1fc-989264ba469cFields · 27
Rows · instalments[]
no · due_date · instalment · principal · interest · balance · status
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
Rows · charges[]
date · description · amount
Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.
It paginates the same way; the cost is pages, not calls. We have generated these at two and at nine pages. Fifty we have not measured, so we will not claim a number for it.
The arithmetic is done from the rows you send, so it agrees with your data by construction. What we cannot do is invent a row you did not send — a missing field fails the render loudly instead of printing a blank.
We return the bytes and a URL; delivery is yours. That is a deliberate line — we are the output layer, not your mail sender.
Free to start · No credit card required