Now in public beta

One API call. Perfect PDFs.

Send JSON or upload files. Get production-ready PDFs back in milliseconds. Batch generation, file uploads, zero data retention. No infrastructure to manage.

Start Building Free Read the Docs
pdforge-demo.py
Your Code
import requests response = requests.post( "https://api.pdforge.dev/render/invoice", json={ "data": { "company": "Acme Corp", "client": "Jane Smith", "amount": 4500.00, "items": [ {"name": "API Integration", "price": 3000}, {"name": "Consulting", "price": 1500} ] } } ) # Save the PDF with open("invoice.pdf", "wb") as f: f.write(response.content)
Output PDF
INVOICE
Acme Corp
acme@corp.com
Invoice: INV-042
Date: Mar 15, 2026
To: Jane Smith
ItemAmount
API Integration$3,000
Consulting$1,500
$4,500.00
Generated in 180ms
~200ms
Average response time
99.99%
Uptime SLA
12+
Page formats supported
3 lines
To get started

Build a template.
Ship in minutes.

No SDKs. No Puppeteer. No wkhtmltopdf. Just a clean REST API that does one thing perfectly.

Design your template

Write HTML & CSS. Use Jinja2 placeholders for dynamic data. Or pick a ready-made starter template.

Send your data

POST JSON or upload .html, .css, and .json files directly. Need 100 PDFs? Send an array and we batch-generate them all.

Get your PDF

Receive a production-quality PDF in the response. Serve it, email it, store it. Round-trip in milliseconds.

Built for developers
who hate complexity.

We handle the rendering infrastructure so you can focus on your product.

~200ms average response

Warm Chromium pools standing by. No cold starts. Your PDF renders the instant your request arrives. 5x faster than the industry average.

Pixel-perfect CSS

Full CSS3: Flexbox, Grid, custom fonts, media queries. If it renders in Chrome, it renders in your PDF.

Template library

Save templates via the API. Invoices, receipts, reports, contracts. Store once, render forever.

We never store your data

Your HTML, CSS, JSON, and the generated PDF exist only in memory for the duration of the request. Once the response is sent, everything is discarded. No logs, no copies, no persistence.

Works with everything

Python, Node, Go, Ruby, PHP, Java, cURL, Zapier. If your stack speaks HTTP, PDForge works.

Auto-scaling infrastructure

10 PDFs a day or 10 million. Our infrastructure scales automatically so you never think about capacity.

Start from a template.
Customize everything.

Production-ready templates. Fully customizable with your own HTML & CSS.

Invoice

Line items, tax, totals, branding. The template every SaaS needs.

Most Popular

Receipt

Clean transaction receipts for e-commerce and subscription billing.

E-commerce

Report

Data summaries, charts, and tables. Built for analytics dashboards.

Analytics

Your first PDF in 30 seconds.

Copy, paste, run. Works in every language you already use.

import requests

pdf = requests.post("https://api.pdforge.dev/render/invoice",
    headers={"Authorization": "Bearer pk_live_..."},
    json={
        "data": {
            "company":  "Acme Corp",
            "client":   "Jane Smith",
            "items":    [{"name": "Consulting", "qty": 10, "price": 150}]
        }
    }
)

with open("invoice.pdf", "wb") as f:
    f.write(pdf.content)

# That's it. invoice.pdf is ready.
const res = await fetch("https://api.pdforge.dev/render/invoice", {
  method: "POST",
  headers: {
    "Content-Type":  "application/json",
    "Authorization": "Bearer pk_live_...",
  },
  body: JSON.stringify({
    data: {
      company: "Acme Corp",
      client:  "Jane Smith",
      items:   [{ name: "Consulting", qty: 10, price: 150 }],
    },
  }),
});

const buf = Buffer.from(await res.arrayBuffer());
fs.writeFileSync("invoice.pdf", buf);

// That's it. invoice.pdf is ready.
curl -X POST https://api.pdforge.dev/render/invoice \
  -H "Authorization: Bearer pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "company": "Acme Corp",
      "client":  "Jane Smith",
      "items":   [{"name": "Consulting", "qty": 10, "price": 150}]
    }
  }' \
  -o invoice.pdf

# That's it. invoice.pdf is ready.
body, _ := json.Marshal(map[string]any{
    "data": map[string]any{
        "company": "Acme Corp",
        "client":  "Jane Smith",
        "items": []map[string]any{
            {"name": "Consulting", "qty": 10, "price": 150},
        },
    },
})

req, _ := http.NewRequest("POST",
    "https://api.pdforge.dev/render/invoice",
    bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer pk_live_...")
req.Header.Set("Content-Type", "application/json")

resp, _ := http.DefaultClient.Do(req)
pdf, _ := io.ReadAll(resp.Body)
os.WriteFile("invoice.pdf", pdf, 0644)

// That's it. invoice.pdf is ready.

Start generating PDFs.
Right now.

Free tier included. No credit card. No setup. Your data is never stored.

100 free PDFs/month included.