Wait for a chart or font to finish before capturing a PDF
Conditions to satisfy before the PDF is taken. All of them apply, in order.
| Field | options.waitFor |
| Type | object: selector, networkIdle, delayMs |
| Default | none |
Fields
| Field | Type | What it does |
|---|---|---|
selector | string, up to 500 characters | Wait until this CSS selector is attached to the DOM. |
networkIdle | true | false | Wait until there have been no network connections for 500 ms. |
delayMs | integer, 0 to 30000 | Fixed pause after the other wait conditions are satisfied. |
What it is for
Conditions to satisfy before the PDF is taken — a CSS selector, network idle, a fixed delay. All of them apply, in that order.
The trap
networkIdle never settles on a page with a long-poll, a websocket or an analytics beacon, and the render dies at timeoutMs instead. Prefer selector: have your chart library set a data attribute when it has drawn, and wait for that. It is faster and it cannot hang.
Example
curl -X POST https://api.pdfcraft.dev/v1/render \
-H "Authorization: Bearer $PDFCRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"html": "<h1>hello</h1>",
"options": {
"waitFor": {
"selector": "#chart-ready",
"networkIdle": false,
"delayMs": 0
}
}
}' \
--output out.pdfEvery option
format— Paper size. Ignored if the page CSS declares its own @page size.landscape— Rotate the paper to landscape orientation.margin— Page margins. Any side may be omitted; omitted sides default to 0.scale— Rendering scale factor.printBackground— Print background colours and images. Off by default in browsers; on by default here.pageRanges— Subset of pages to keep, e.g. "1-5" or "1,4,7-9". Empty means all pages.headerHtml— HTML for the running header. Supports Chromium print classes: date, title, url, pageNumber, totalPages. Needs a top margin to be visible.footerHtml— HTML for the running footer. Same classes as headerHtml; needs a bottom margin.waitFor— Conditions to satisfy before the PDF is taken. All of them apply, in order.emulateMedia— Which CSS media type the page sees.timeoutMs— Hard ceiling on the whole render. Exceeding it returns 408 render_timeout.
Try any of these in the playground without writing a line of code, or read the full reference.