No Chrome · No Puppeteer · Just PDF

JSON + Template → PDF
in 3 seconds

POST your data to our API, get a pixel-perfect PDF back. Invoices, receipts, certificates, reports — ready-made templates, zero layout bugs.

Generate an invoice with one POST
curl -X POST https://api.docforge.dev/v1/generate \
  -H "Authorization: Bearer df_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "template": "invoice",
    "data": {
      "client": "Acme Corp",
      "amount": 4999,
      "items": [
        { "desc": "Pro Plan", "qty": 1, "price": 4999 }
      ]
    }
  }' # → returns PDF bytes (200 OK)

Built for developers who ship

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.

No Chrome, Ever

Built on PDFKit, not Puppeteer. No headless browser, no memory leaks, no frozen instances. Pure Node.js — fast and stable.

📐

Templates That Don't Break

Pre-built, battle-tested templates for invoices, receipts, certificates, reports and contracts. Your layout will never shift.

🚀

3-Second PDFs

Median response time under 3 seconds. No cold starts, no queues. Your users get their PDF instantly.

🔧

Simple REST API

One endpoint. POST JSON, get PDF. No SDKs to install, no complex auth flows. Works with any language or framework.

Two languages, one API call

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)

5 production-ready templates

No designing from scratch. Pick a template, send your data, done. More templates added monthly.

Invoice
DOC FORGE
INV-001
2025-07-11
ItemQtyPrice
Pro Plan1$49.99
Support1$19.00
Total: $68.99
Invoice Billing & payments
RECEIPT
Thank you for your purchase
Widget A ×2$50.00
Widget B ×1$12.00
TOTAL$62.00
Receipt Point of sale
Certificate of Completion
Jane Smith
has successfully completed
Advanced React Patterns
July 11, 2025
Certificate Courses & awards
Monthly Report
June 2025
Revenue
$42,500
Users
1,240
Growth
+12%
Report Analytics & data
Service Agreement
Signature
Date
___/___/____
Contract Legal & agreements

Simple, transparent pricing

Start free. Scale when you're ready. No hidden fees, no surprises.

Free
$0 / month
Perfect for side projects and prototyping.
  • 100 PDFs / month
  • All 5 templates
  • REST API access
  • Community support
  • Custom branding
  • Priority support
Get Started Free
Business
$29 / month
For high-volume production workloads.
  • Unlimited PDFs / month
  • All 5 templates
  • REST API access
  • Priority support (4h)
  • Custom branding
  • Webhook callbacks
Start Business

Need a custom plan? Contact us

Why developers switch to DocForge

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

Frequently asked questions

How is DocForge different from Puppeteer-based PDF APIs?
DocForge uses PDFKit (a pure Node.js PDF library) instead of headless Chrome. This means no browser processes to manage, no memory leaks, no CSS inconsistencies across renders, and much faster response times. Your template layout is deterministic — it will never shift or break.
What templates are available?
We currently offer 5 production-ready templates: Invoice, Receipt, Certificate, Monthly Report, and Service Contract. Each template supports custom colors, logos, and fonts. We add new templates monthly based on user requests.
Can I customize the templates with my brand?
Yes! On Pro and Scale plans, you can customize colors, upload your logo, and choose fonts. On the Free plan, templates use the default DocForge styling with a small "Generated by DocForge" watermark.
What happens if I exceed my monthly PDF limit?
We'll send you an email at 80% and 100% usage. After you hit the limit, additional requests return a 429 status. You can upgrade your plan at any time — the new limits take effect immediately. No overage charges, ever.
Is my data secure?
Absolutely. All API traffic is encrypted via TLS 1.3. Your data is processed in memory and never written to disk. We don't store your PDFs or JSON payloads after the response is sent. SOC 2 compliance is on our 2025 roadmap.

Ready to ditch headless Chrome?

Get early access to DocForge. 50 free PDFs per month, no credit card required.