Generate pixel-perfect PDFs from HTML in your Node.js or Express app with a single fetch call — no Puppeteer, no Chromium binary, no system dependencies.
No package to install. Just use the native fetch API available in Node 18+.
<span class="kw">const</span> html = <span class="str">`
<!DOCTYPE html>
<html>
<head><style>body { font-family: sans-serif; padding: 2rem; }</style></head>
<body>
<h1>Invoice #042</h1>
<p>Total: €1,500.00</p>
</body>
</html>
`</span>;
<span class="kw">const</span> res = <span class="kw">await</span> fetch(<span class="str">'https://api.renderlyapi.com/v1/pdf/from-html'</span>, {
method: <span class="str">'POST'</span>,
headers: {
<span class="str">'Authorization'</span>: <span class="str">'Bearer rly_live_YOUR_KEY'</span>,
<span class="str">'Content-Type'</span>: <span class="str">'application/json'</span>,
},
body: JSON.<span class="fn">stringify</span>({
html,
format: <span class="str">'A4'</span>, <span class="cm">// or 'Letter'</span>
marginTop: <span class="str">'20mm'</span>, <span class="cm">// optional margins</span>
landscape: <span class="kw">false</span>,
}),
});
<span class="kw">if</span> (!res.ok) <span class="kw">throw new</span> <span class="fn">Error</span>(<span class="str">`Renderly error: ${res.status}`</span>);
<span class="kw">const</span> pdfBuffer = Buffer.<span class="fn">from</span>(<span class="kw">await</span> res.<span class="fn">arrayBuffer</span>());
<span class="cm">// Stream to HTTP response:</span>
<span class="cm">// res.setHeader('Content-Type', 'application/pdf');</span>
<span class="cm">// res.send(pdfBuffer);</span>
<span class="cm">// Or save to disk:</span>
<span class="kw">import</span> fs <span class="kw">from</span> <span class="str">'fs'</span>;
fs.<span class="fn">writeFileSync</span>(<span class="str">'invoice.pdf'</span>, pdfBuffer);
console.<span class="fn">log</span>(<span class="str">'PDF saved!'</span>);app.<span class="fn">get</span>(<span class="str">'/invoice/:id/pdf'</span>, <span class="kw">async</span> (req, res) => {
<span class="kw">const</span> invoice = <span class="kw">await</span> <span class="fn">getInvoice</span>(req.params.id);
<span class="kw">const</span> html = <span class="fn">renderInvoiceHTML</span>(invoice);
<span class="kw">const</span> pdfRes = <span class="kw">await</span> fetch(<span class="str">'https://api.renderlyapi.com/v1/pdf/from-html'</span>, {
method: <span class="str">'POST'</span>,
headers: {
<span class="str">'Authorization'</span>: <span class="str">`Bearer ${process.env.RENDERLY_API_KEY}`</span>,
<span class="str">'Content-Type'</span>: <span class="str">'application/json'</span>,
},
body: JSON.<span class="fn">stringify</span>({ html, format: <span class="str">'A4'</span> }),
});
res.<span class="fn">setHeader</span>(<span class="str">'Content-Type'</span>, <span class="str">'application/pdf'</span>);
res.<span class="fn">setHeader</span>(<span class="str">'Content-Disposition'</span>, <span class="str">`attachment; filename="invoice-${invoice.id}.pdf"`</span>);
pdfRes.body.<span class="fn">pipe</span>(res);
});Sign up at renderlyapi.com — your API key is generated instantly. No credit card, 50 free PDFs/month included.
Store your key as an environment variable. Never hard-code it in source files.
POST your HTML string to /v1/pdf/from-html. You'll receive a binary PDF response in under 200ms.
Free account · API key in 60 seconds · No credit card
Get started free →