GetInvoicePDF

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.pdf

Node.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).