Send JSON or upload files. Get production-ready PDFs back in milliseconds. Batch generation, file uploads, zero data retention. No infrastructure to manage.
| Item | Amount |
|---|---|
| API Integration | $3,000 |
| Consulting | $1,500 |
No SDKs. No Puppeteer. No wkhtmltopdf. Just a clean REST API that does one thing perfectly.
Write HTML & CSS. Use Jinja2 placeholders for dynamic data. Or pick a ready-made starter template.
POST JSON or upload .html, .css, and .json files directly. Need 100 PDFs? Send an array and we batch-generate them all.
Receive a production-quality PDF in the response. Serve it, email it, store it. Round-trip in milliseconds.
We handle the rendering infrastructure so you can focus on your product.
Warm Chromium pools standing by. No cold starts. Your PDF renders the instant your request arrives. 5x faster than the industry average.
Full CSS3: Flexbox, Grid, custom fonts, media queries. If it renders in Chrome, it renders in your PDF.
Save templates via the API. Invoices, receipts, reports, contracts. Store once, render forever.
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.
Python, Node, Go, Ruby, PHP, Java, cURL, Zapier. If your stack speaks HTTP, PDForge works.
10 PDFs a day or 10 million. Our infrastructure scales automatically so you never think about capacity.
Production-ready templates. Fully customizable with your own HTML & CSS.
Line items, tax, totals, branding. The template every SaaS needs.
Most PopularClean transaction receipts for e-commerce and subscription billing.
E-commerceData summaries, charts, and tables. Built for analytics dashboards.
AnalyticsCopy, 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.
Free tier included. No credit card. No setup. Your data is never stored.