Comparison
API2PDF alternative: PDFPipe
API2PDF is a well established pay-as-you-go API that renders HTML, URLs, and Office files into PDFs using headless Chrome, wkhtmltopdf, and LibreOffice. If you want flat, predictable pricing, a genuine free tier, and rendering that waits for fonts and images before it snapshots the page, PDFPipe is a focused alternative worth a look. Here is an honest side by side.
What API2PDF does well
API2PDF has been around for years and supports several engines under one account: headless Chrome for HTML and URLs, wkhtmltopdf for legacy templates, LibreOffice for Word and Excel conversion, plus image and merge helpers. Its pay-as-you-go model means you only pay for what you render, which suits spiky or low volume workloads. If you need Office document conversion or a single vendor for many output formats, API2PDF covers more surface area than PDFPipe does today.
Where PDFPipe focuses
PDFPipe does one thing: turn HTML into clean, reliable PDFs. The renderer waits for web fonts and images to finish loading before it captures the page, so you do not get half painted layouts or fallback fonts. Errors come back as honest JSON with a real status code instead of a 200 wrapping a broken document. Outbound requests run inside an SSRF sandbox, so user supplied HTML cannot reach internal metadata endpoints or your private network.
Side by side
| Feature | API2PDF | PDFPipe |
|---|---|---|
| Pricing model | Pay as you go per render | Flat monthly tiers, predictable |
| Free tier | Trial credit | Standing free tier, no card |
| Waits for fonts and images | Configurable delay | Automatic, on by default |
| Error handling | JSON success flag in body | Real HTTP codes, honest JSON |
| SSRF sandboxing | Not documented | Built in, blocks internal hosts |
| MCP server for agents | No | Yes, native MCP endpoint |
| Office and URL conversion | Yes, multiple engines | HTML to PDF focused |
| Response format | URL or base64 in JSON | Raw application/pdf bytes |
Calling PDFPipe
One endpoint, POST /v1/pdf, takes a JSON body and returns the raw PDF bytes directly. There is no success flag to inspect and no second request to fetch a hosted file. You stream the response straight to disk or to your user.
curl -X POST https://api.pdfpipe.xyz/v1/pdf \
-H "Authorization: Bearer pp_live_your_key" \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Invoice 0042</h1>", "options": {"format": "A4"}}' \
--output invoice.pdfThe same call from Node maps cleanly onto fetch. Because the body is raw PDF, you read it as an array buffer and write it out. A non 2xx status carries a JSON error you can branch on.
const res = await fetch("https://api.pdfpipe.xyz/v1/pdf", {
method: "POST",
headers: {
"Authorization": "Bearer pp_live_your_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
html: "<h1>Invoice 0042</h1>",
options: { format: "A4" },
}),
});
if (!res.ok) {
const err = await res.json();
throw new Error(err.message);
}
const pdf = Buffer.from(await res.arrayBuffer());
await require("fs/promises").writeFile("invoice.pdf", pdf);Built for agents
PDFPipe ships an MCP server, so an LLM agent can render a PDF as a tool call without you writing glue code. The agent passes HTML, gets back a document, and the SSRF sandbox keeps untrusted model output from reaching hosts it should not touch. If you are building automated reporting or document workflows on top of language models, that native MCP support removes a layer of plumbing that a generic pay-as-you-go API leaves to you.
Which to pick
Choose API2PDF if you need Office document conversion, multiple rendering engines, or strict per render billing for very low volume. Choose PDFPipe if your job is HTML to PDF, you want costs you can forecast, you care about rendering that waits for assets and fails honestly, and you want SSRF protection and an MCP server without extra setup. Both are solid; the right answer depends on your surface area and how predictable you need the bill to be.
Try a real render in the live playground, then read the full reference in the docs.
See pricing →