@ironfang/renderwolf
v0.1.0
Published
Renderwolf API client: screenshots, PDFs, QR codes, template images, clips and site previews from a URL or HTML.
Maintainers
Readme
@ironfang/renderwolf
The official client for the Renderwolf API: screenshots, PDFs, QR codes, template images, clips and site previews from a URL or from HTML you send. Zero dependencies; Node 20 and later.
npm install @ironfang/renderwolfimport { Renderwolf } from '@ironfang/renderwolf';
const rw = new Renderwolf({ apiKey: process.env.IRONFANG_API_KEY! });
const shot = await rw.screenshot({ url: 'https://example.com', full_page: true });
await shot.saveTo('page.png');
console.log(shot.credits, shot.renderMs, shot.requestId);Every render returns the bytes plus what the API reports about them: content type, credits charged (zero on a cache hit), render time and the request id to quote to support.
Durable jobs
const job = await rw.jobs.submit(
{ kind: 'pdf', request: { html: invoiceHtml, paper_format: 'a4' } },
{ idempotencyKey: `invoice-${invoice.id}` },
);
const done = await rw.jobs.wait(job.id);
if (done.status === 'succeeded') {
const pdf = await rw.jobs.result(job.id);
await pdf.saveTo(`invoice-${invoice.id}.pdf`);
}Verifying a webhook
Run the check over the raw request body, before parsing it.
import { verifyWebhook } from '@ironfang/renderwolf';
const ok = await verifyWebhook({
secret: process.env.RENDERWOLF_WEBHOOK_SECRET!,
timestamp: req.headers['renderwolf-timestamp'],
signature: req.headers['renderwolf-signature'],
payload: rawBody,
});Errors
Failures throw RenderwolfError with status, the API's code
(quota_exhausted, render_failed, ...) and requestId. Synchronous renders
are never retried by the client: a render that timed out may already have
been charged, and retrying it blind doubles the bill.
Keys
Keep the key on a server. For anything a browser or an email needs to fetch
directly, mint a signed URL with rw.sign(...) instead.
