Generic document
Generic layout for any JSON: header from title/from/to, a details panel, then one section per key. Objects become key/value grids, arrays of objects become tables. Used automatically when no template is chosen and none matches.
document.pdf1 page

Rendered by the engine from the sample data below.
Render it
curl "https://api.quirepdf.dev/v1/render" \
-H "Authorization: Bearer $QUIRE_API_KEY" \
-H "Content-Type: application/json" \
-d @document.json -o document.pdfimport { Quire } from "quirepdf";
const pdf = await new Quire().render(data); // any JSON objectfrom quirepdf import Quire
Quire().render(data).save("document.pdf")npx quirepdf-cli templates document --sample > document.json
npx quirepdf-cli render document.jsonEdit the sample in the playground
How any JSON is laid out
title,subtitle,number,fromandtomake the header. With no title, a key likeorder_idbecomes the title.- Short text, numbers and yes/no values go in a details panel.
- Objects become labelled sections; arrays of objects become tables; lists become bullets.
- Set
currencyand fields likepriceortotalare shown as money. - Sections follow the order of your keys.
document.jsonShow sample data
{
"title": "Service report",
"subtitle": "Quarterly HVAC maintenance visit",
"number": "SR-2026-1187",
"date": "2 Oct 2026",
"accent": "#0b7285",
"currency": "$",
"from": {
"name": "Brightline Field Services",
"email": "ops@brightline.services"
},
"to": {
"name": "Priya Raman",
"company": "Harbourview Dental Clinic",
"address": [
"310 Pine Street",
"Seattle, WA 98101"
]
},
"technician": "Marcus Lee (ID 4471)",
"visit_duration_hours": 2.5,
"next_visit": "8 Jan 2027",
"warranty_covered": false,
"summary": "Routine quarterly maintenance on two rooftop units. Unit 2 showed reduced airflow caused by a clogged filter and a worn blower belt; both were replaced. All systems are operating within manufacturer specifications.",
"checklist": [
"Inspected and cleaned condenser coils",
"Replaced air filters on both units",
"Checked refrigerant pressure and temperature split",
"Tested thermostat calibration and safety cut-offs"
],
"readings": {
"unit_1": {
"supply_temp_f": 55.2,
"return_temp_f": 74.8,
"refrigerant_psi": 118
},
"unit_2": {
"supply_temp_f": 56.9,
"return_temp_f": 75.1,
"refrigerant_psi": 121
}
},
"parts_used": [
{
"part": "MERV 13 filter, 20×25×4",
"sku": "FLT-2025-13",
"qty": 4,
"unit_cost": 24.5,
"total": 98
},
{
"part": "Blower belt A-38",
"sku": "BLT-A38",
"qty": 1,
"unit_cost": 18.75,
"total": 18.75
},
{
"part": "Condensate drain tablets",
"sku": "CDT-50",
"qty": 1,
"unit_cost": 12,
"total": 12
}
],
"notes": "Recommend replacing Unit 1's contactor at the next visit; contacts show early pitting."
}