Turn your HTML pages into print-ready PDFs
Invoices, reports, certificates and receipts: design them as web pages with the tools you already use, then render them to PDF in a real Chromium browser with one API call.
- A4, Letter, A3, Legal
- Your print CSS is respected
- Failed renders are free
Render a URL to PDF
Set format to pdf on the screenshot endpoint. Use waitForSelector so charts and fonts finish loading first.
- Up to 5 URLs per request
pdfPageFormat: A4, A3, Letter or Legal- Signed
fileUrlfor each PDF, kept 7 days
curl https://siftwright.com/v1/screenshot \
-H "Authorization: Bearer $SIFTWRIGHT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/invoice/1042", "format": "pdf", "pdfPageFormat": "A4"}'import os, requests
r = requests.post(
"https://siftwright.com/v1/screenshot",
headers={"Authorization": f"Bearer {os.environ['SIFTWRIGHT_API_KEY']}"},
json={
"urls": ["https://example.com/report/q3", "https://example.com/report/q4"],
"format": "pdf",
"pdfPageFormat": "Letter",
"waitForSelector": "#report-ready",
},
timeout=300,
)
r.raise_for_status()
for doc in r.json()["results"]:
print(doc["url"], doc["status"], doc.get("fileUrl"))const res = await fetch("https://siftwright.com/v1/screenshot", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SIFTWRIGHT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/invoice/1042", format: "pdf", pdfPageFormat: "A4" }),
});
const { results, billed } = await res.json();
console.log(billed, "PDF(s) billed;", results[0].fileUrl);{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=siftwright/youtube-transcript-extractor,siftwright/pageframe-screenshots,siftwright/google-news-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}What you get back
The response shape for a PDF (IDs shortened).
[
{
"url": "https://example.com/invoice/1042",
"status": "ok",
"format": "pdf",
"fileUrl": "https://api.apify.com/v2/key-value-stores/…/records/capture-….pdf?signature=…",
"sizeBytes": 48211,
"durationMs": 912
}
]What people build with it
Invoices and receipts
Render billing documents from your own templates on demand or in nightly batches.
Reports and dashboards
Export a dashboard view to a PDF your customers can forward.
Certificates and tickets
Generate personalised documents from a template page.
Archiving
Save articles, policies or order pages as dated PDFs.
Contracts and proposals
Keep one HTML source of truth and output PDFs for signature.
Print-ready docs
Use CSS paged media rules like @page and page breaks.
Pricing
Each PDF counts as one result, the same as a screenshot. Pages that time out or return an error are free.
| Option | Price |
|---|---|
| Starter plan | $29/mo for 10,000 results ($2.90/1k) |
| Pro plan | $99/mo for 50,000 results ($1.98/1k) |
| Business plan | $299/mo for 250,000 results ($1.20/1k) |
| Enterprise plan | $999/mo for 1,500,000 results ($0.67/1k) |
| Pay-per-event on Apify | $1.50 per 1,000 captures, no subscription |
Honest note: URL in, not an HTML string
Some HTML-to-PDF services accept a raw HTML string in the request body. Ours renders a URL. For private documents such as invoices, the reliable pattern is:
- Render your template to HTML in your app and serve it at an unguessable, short-lived URL (for example a signed object-storage link, or a route that checks a one-time token).
- Call
/v1/screenshotwith"format": "pdf"and that URL. - Download the PDF from
fileUrland store it where it belongs.
This keeps your templates in your own stack, lets you preview them in a browser, and means the PDF matches exactly what the browser shows. The full walk-through is in HTML to PDF at scale.
Frequently asked questions
Does it support @page and page-break CSS?
Yes. Pages render in Chromium's print mode, so @page size and margin rules, break-before, break-inside: avoid and print media queries all apply.
Can I set headers, footers or margins via the API?
Not as API options today. Put them in your print CSS or template instead, which is also easier to preview.
Will web fonts and charts render?
Yes, they load like in a normal browser. Add waitForSelector for an element your page adds when rendering is complete, or a short delaySec.
Is my document stored?
The PDF is kept for 7 days so you can download it, then deleted. We don't read or use your documents.
How many PDFs can I render?
Up to 5 per request, and as many requests as your plan and the 60 requests/minute rate limit allow.
Ship PDFs without running a browser fleet
Plans from $29/month with 10,000 successful results. Failed requests never count. Cancel anytime from the billing portal.