Async jobs & bulk
Kick off long renders without blocking. Every async request returns a job_id you can poll, then download once complete.
Async mode
Add "async_mode": true to any render request to get back a job ID instead of waiting for the result. Useful for bulk jobs or when you need to avoid timeouts.
1 — Submit the job
POST /v1/screenshot
{
"url": "https://example.com",
"format": "png",
"async_mode": true
}
→ 202 Accepted
{ "job_id": "abc123...", "status": "queued" }2 — Poll for status
GET /v1/jobs/{job_id}
→ 200 OK
{
"job_id": "abc123...",
"status": "completed", // queued | processing | completed | failed
"result_url": "/v1/jobs/abc123.../result",
"expires_at": "2026-04-01T00:00:00Z"
}3 — Download the result
GET /v1/jobs/{job_id}/result
→ 200 OK (raw PNG / JPEG / PDF bytes)
Content-Type: image/png
Results are available for 24 hours after completion./v1/bulkSubmit up to 20 screenshot or PDF jobs in a single request. All jobs are always async — each returns a job_id you can poll individually. Credits are debited per job; remaining jobs are marked failed if credits run out mid-batch.
Request
POST /v1/bulk
{
"jobs": [
{
"type": "screenshot",
"url": "https://example.com",
"format": "png",
"viewport": { "width": 1280, "height": 720 }
},
{
"type": "screenshot",
"url": "https://another.com",
"format": "jpeg",
"full_page": true
},
{
"type": "pdf",
"url": "https://report.com",
"format": "A4",
"print_background": true
}
]
}Response — 202 Accepted
{
"submitted": 3,
"failed": 0,
"credits_used": 3,
"credits_remaining": 97,
"jobs": [
{ "index": 0, "job_id": "abc111...", "status": "queued", "poll_url": "/v1/jobs/abc111..." },
{ "index": 1, "job_id": "abc222...", "status": "queued", "poll_url": "/v1/jobs/abc222..." },
{ "index": 2, "job_id": "abc333...", "status": "queued", "poll_url": "/v1/jobs/abc333..." }
]
}
// If credits run out mid-batch, remaining entries will have:
{ "index": 3, "error_code": "CREDITS_EXHAUSTED", "error_message": "No credits remaining. Please upgrade your plan." }Each job_id can be polled via GET /v1/jobs/{job_id} and downloaded via GET /v1/jobs/{job_id}/result.
/v1/jobs/{job_id}Poll the status of an async render job.
{
"job_id": "...",
"status": "completed",
"result_url": "/v1/jobs/.../result",
"expires_at": "2026-03-25T10:00:00Z"
}/v1/jobs/{job_id}/resultDownload the result of a completed async job. Valid for 24 hours.
Returns raw bytes of the rendered file.