Templates
Design invoices, receipts, labels and certificates once in the dashboard, then create PDFs by sending JSON.
- Build or customise a template under Templates in the dashboard. The library has 32 starters: invoices, quotes, purchase orders, receipts, bills and statements, payslips and HR letters, shipping and address labels, QR codes, product and asset labels, badges and ID cards, event tickets and vouchers, menus, certificates, letters and envelopes.
- Each template has fields. A field's key is the JSON property you send, for example
invoice_numberorcustomer.name. - Render with
POST /templates/{template_id}/render. Each successful render is charged as one PDF, the same as/quickjob.
This endpoint renders a template that already exists in your account. It doesn't take a design in the request. Before you call it:
- In the dashboard, open Templates and pick a starter from the Template library, click New blank template, or click New HTML template (beta) to write the template in your own HTML.
- Adjust the design and fields, then Save.
- Copy the template's ID. It appears on the template's card in My templates (with a copy button), in Use via API, and in the editor's address bar (
/templates/<template_id>/edit).
Calling render with an ID that doesn't exist in your account returns 404 TEMPLATE_NOT_FOUND. Editing a saved template changes the output of later calls; the ID stays the same. Deleting it makes those calls fail.
Quick Example
Replace YOUR_TEMPLATE_ID with your template's ID and send values for its fields:
curl -X POST https://api.podpdf.com/templates/YOUR_TEMPLATE_ID/render \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"data": {
"invoice_number": "INV-1042",
"issue_date": "2026-09-13",
"customer": { "name": "Acme Ltd", "address": "1 Main St\nSpringfield" },
"items": [
{ "description": "Design work", "quantity": 10, "unit_price": 85 },
{ "description": "Hosting", "quantity": 1, "unit_price": 20 }
],
"tax_rate": 20
}
}' \
--output INV-1042.pdf
The totals, currency formatting, page numbers and table headers on every page all come from the template, so you only send the values.
Open a template and click Use via API. It shows the endpoint for that template and an example body with every field, in cURL, JavaScript and Python.
Authentication
Required. Send an API key or a dashboard ID token:
X-API-Key: your_api_key_here
Request
Endpoint
POST https://api.podpdf.com/templates/{template_id}/render
Body
| Field | Type | Required | Description |
|---|---|---|---|
data | object | Yes | Values for the template's fields. Nested keys such as customer.name are nested objects. List fields are arrays of objects. Extra keys are ignored. Up to 1 MB. |
store | boolean | No | true stores the PDF and returns a download link (valid for 1 hour) instead of the file |
filename | string | No | File name for the Content-Disposition header |
pdf_standard | string | No | Alpha. "pdf/ua-1" or "pdf/ua-2" for an accessible, tagged PDF, checked by veraPDF (result in X-PDF-Conformance). Starter templates pass both. See Accessible PDFs |
title, lang | string | No | Alpha. With pdf_standard: the document title and language. Default to the template's name and language |
Value formats
| Field type | Send | Example |
|---|---|---|
| Text, Multi-line text | string (numbers are accepted) | "Acme Ltd", "Line 1\nLine 2" |
| Number | number or numeric string | 12.5 |
| Money amount | number, in the template currency | 1234.56 → $1,234.56 or 1.234,56 € |
| Percentage | number, where 20 means 20% | 20 |
| Date | ISO date | "2026-09-13" |
| Image URL | public https:// URL (PNG or JPEG, up to 2 MB) or data:image/…;base64,… | "https://cdn.example.com/logo.png" |
| List | array of objects | [{ "description": "Design", "quantity": 2 }] |