Docs
One endpoint: send invoice data as JSON, get a PDF back. Get an API key from your dashboard after signing up.
Quickstart
POST /api/v1/invoices with an Authorization: Bearer <your API key> header. By default the response body is the raw PDF. Pass ?format=url to instead get back { id, url } pointing at the hosted PDF.
curl https://getinvoicepdf.dev/api/v1/invoices \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"seller": { "name": "Acme Co" },
"buyer": { "name": "Jane Client" },
"lineItems": [{ "description": "Design work", "quantity": 4, "unitPrice": 100 }],
"taxRate": 8.5
}' --output invoice.pdfNode.js
const res = await fetch("https://getinvoicepdf.dev/api/v1/invoices", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
seller: { name: "Acme Co" },
buyer: { name: "Jane Client" },
lineItems: [{ description: "Design work", quantity: 4, unitPrice: 100 }],
taxRate: 8.5,
}),
});
const pdfBytes = Buffer.from(await res.arrayBuffer());Python
import requests
res = requests.post(
"https://getinvoicepdf.dev/api/v1/invoices",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"seller": {"name": "Acme Co"},
"buyer": {"name": "Jane Client"},
"lineItems": [{"description": "Design work", "quantity": 4, "unitPrice": 100}],
"taxRate": 8.5,
},
)
with open("invoice.pdf", "wb") as f:
f.write(res.content)Request schema
{
"template": "clean" | "classic", // optional, default "clean"
"invoiceNumber": "string", // optional
"date": "string", // optional, e.g. "2026-08-03"
"currency": "string", // optional, 3-letter code, default "USD"
"seller": {
"name": "string", // required
"address": "string", // optional
"email": "string" // optional
},
"buyer": {
"name": "string", // required
"address": "string", // optional
"email": "string" // optional
},
"lineItems": [ // required, at least 1
{ "description": "string", "quantity": 1, "unitPrice": 100 }
],
"taxRate": 0, // optional, percent, default 0
"notes": "string" // optional
}Errors
401— missing or invalid API key.400— invalid JSON body or a payload that fails schema validation (details in the response).