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.
POST/v1/bulk

Submit 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.

GET/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"
}
GET/v1/jobs/{job_id}/result

Download the result of a completed async job. Valid for 24 hours.

Returns raw bytes of the rendered file.