Quickstart — first PDF in 60 seconds
Render a real PDF without writing a single line of template code. No credit card.
✦ Speedrun: average new user reaches their first 200 OK in 47 seconds.
① Sign up — ~20s
Go to airpdf.app/auth/register-tenant, choose a workspace code (lowercase, e.g. acme), confirm by email.
You land on https://airpdf.app/<code>/app.
② Pick a starter template — ~10s
In the backoffice → Templates → ✦ Browse starters → click Use this template on Invoice (or any other).
We bootstrap a fully-working template with example variables. Editable later — but you don't need to touch it now.
Skip this step if you'd rather build from scratch —
+ New blankworks too. The starter just gives you a sane default in 1 click.
③ Generate a test API key — ~10s
Backoffice → API Keys → + New key → choose test environment → copy the airpdf_test_… token (shown once).
Test renders are free, unlimited, and never count against your quota — perfect for cutover.
④ Render your first PDF — ~10s
export airpdf_KEY=airpdf_test_...
export airpdf_TEMPLATE=invoice-xxxxxx # the slug shown after creation
curl -X POST https://airpdf.app/api/v1/render \
-H "Authorization: Bearer $airpdf_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "'"$airpdf_TEMPLATE"'",
"data": {
"customer": { "name": "Acme Inc.", "address": "123 Market St", "vat": "IT01234567890" },
"invoice": { "number": "2026-0042", "date": "2026-05-07" },
"items": [{ "label": "Pro plan", "qty": 1, "amount": 99 }],
"totals": { "amount": "$99.00" }
}
}' \
-o invoice.pdf
open invoice.pdf
Expected: 200 OK · application/pdf · ~5 KB · <500 ms. You're done.
What you just did
- Created a multi-tenant workspace.
- Bootstrapped a real template from a curated starter.
- Issued a test API key.
- Rendered a PDF via REST in production.
Total time: about one minute.
Same call, in your language
// Node.js
import Airpdf from "@airpdf/sdk";
import { writeFile } from "node:fs/promises";
const client = new Airpdf({ apiKey: process.env.AIRPDF_API_KEY! });
const result = await client.render({
template: "invoice-xxxxxx",
data: { customer: { name: "Acme Inc." }, items: [{ label: "Pro plan", amount: 99 }] },
});
if (result.kind === "binary") await writeFile("invoice.pdf", result.pdf);
# Python
from airpdf import Airpdf
import os
client = Airpdf(api_key=os.environ["AIRPDF_API_KEY"])
pdf = client.render(
template="invoice-xxxxxx",
data={"customer": {"name": "Acme Inc."}, "items": [{"label": "Pro plan", "amount": 99}]},
)
open("invoice.pdf", "wb").write(pdf)
Ruby · Go · Elixir · PHP · +8 more
Next steps
- 🎨 Customise your template — drag-drop editor, variables, JSON Schema
- 🔁 Async rendering + webhooks — for big reports, batch jobs
- ☁️ Bring your own S3 bucket — keep PDFs inside your perimeter
- 🔑 Promote test key → live — and start counting against quota
- 💰 Pricing — Free includes 50 PDFs / month forever
Stuck?
Email hello@airpdf.app — we reply same day. Or jump in our docs.
Welcome to Airpdf 🚀