POST your data to our API, get a pixel-perfect PDF back. Invoices, receipts, certificates, reports — ready-made templates, zero layout bugs.
Other PDF APIs spin up Chrome. We don't. Templates are fixed, rendering is deterministic, and your PDFs will look the same on the 1st request and the 100,000th.
Built on PDFKit, not Puppeteer. No headless browser, no memory leaks, no frozen instances. Pure Node.js — fast and stable.
Pre-built, battle-tested templates for invoices, receipts, certificates, reports and contracts. Your layout will never shift.
Median response time under 3 seconds. No cold starts, no queues. Your users get their PDF instantly.
One endpoint. POST JSON, get PDF. No SDKs to install, no complex auth flows. Works with any language or framework.
Copy-paste ready. Generate a receipt in under 10 lines of code.
curl -X POST https://api.docforge.dev/v1/generate \ -H "Authorization: Bearer df_sk_your_key" \ -H "Content-Type: application/json" \ -d '{ "template": "receipt", "data": { "order_id": "ORD-20248", "date": "2025-07-11", "customer": "Jane Smith", "items": [ { "name": "Widget A", "qty": 2, "price": 2500 }, { "name": "Widget B", "qty": 1, "price": 1200 } ], "total": 6200, "currency": "USD" } }'
const response = await fetch( "https://api.docforge.dev/v1/generate", { method: "POST", headers: { "Authorization": "Bearer df_sk_your_key", "Content-Type": "application/json", }, body: JSON.stringify({ template: "receipt", data: { order_id: "ORD-20248", customer: "Jane Smith", items: [ { name: "Widget A", qty: 2, price: 2500 }, { name: "Widget B", qty: 1, price: 1200 }, ], total: 6200, currency: "USD", }, }), } ); // response.body is a PDF stream const pdfBuffer = await response.arrayBuffer();
import requests resp = requests.post( "https://api.docforge.dev/v1/generate", headers={ "Authorization": "Bearer df_sk_your_key", "Content-Type": "application/json", }, json={ "template": "receipt", "data": { "order_id": "ORD-20248", "customer": "Jane Smith", "items": [ {"name": "Widget A", "qty": 2, "price": 2500}, {"name": "Widget B", "qty": 1, "price": 1200}, ], "total": 6200, "currency": "USD", }, }, ) with open("receipt.pdf", "wb") as f: f.write(resp.content)
require 'net/http' require 'json' uri = URI('https://api.docforge.dev/v1/generate') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri, { 'Authorization' => 'Bearer df_sk_your_key', 'Content-Type' => 'application/json', }) request.body = { template: 'receipt', data: { order_id: 'ORD-20248', customer: 'Jane Smith', items: [ { name: 'Widget A', qty: 2, price: 2500 }, { name: 'Widget B', qty: 1, price: 1200 }, ], total: 6200, currency: 'USD', }, }.to_json resp = http.request(request) File.write('receipt.pdf', resp.body)
No designing from scratch. Pick a template, send your data, done. More templates added monthly.
| Item | Qty | Price |
|---|---|---|
| Pro Plan | 1 | $49.99 |
| Support | 1 | $19.00 |
Start free. Scale when you're ready. No hidden fees, no surprises.
Need a custom plan? Contact us
We're the only PDF API that doesn't spin up a browser. That means faster responses, lower costs, and zero layout surprises.
| Feature | DocForge | DocRaptor | PDFShift | API2PDF |
|---|---|---|---|---|
| Chrome-free rendering | ✓ | ✗ | ✗ | ✗ |
| Built-in templates | 5+ included | ✗ | ✗ | ✗ |
| Invoice templates | ✓ | ✗ | ✗ | ✗ |
| Starting price | $19/mo | $15/mo | $9/mo | Pay-per-use |
| 99.9% uptime SLA | ✓ | ✓ | ✓ | ✓ |
| Deterministic output | ✓ | ✗ | ✗ | ✗ |
Get early access to DocForge. 50 free PDFs per month, no credit card required.