Menu
Docs/Batch Screenshots

Batch Screenshots

Capture screenshots of multiple URLs in a single API call. The job runs asynchronously — you get a job ID immediately and download a ZIP archive when it's done.

Batch screenshots require Starter plan or above. Plan limits: Starter 10 URLs, Growth 50, Business 100, Enterprise 500.

Endpoint

POST/v1/batch

Request body

{
  "urls": [
    "https://example.com",
    "https://stripe.com",
    "https://vercel.com"
  ],
  "format": "png",
  "width": 1280,
  "height": 720,
  "full_page": false,
  "callback_url": "https://your-server.com/webhook"
}

Parameters

ParameterTypeDefaultDescription
urlsstring[]requiredArray of URLs to capture (max depends on plan)
widthinteger1280Viewport width in pixels
heightinteger720Viewport height in pixels
formatstring"png"Output format: png, jpeg, webp
qualityinteger80JPEG/WebP quality (1–100)
full_pagebooleanfalseCapture full scrollable page
retinabooleanfalse2× device pixel ratio (HiDPI)
viewport_landscapebooleanfalseSwap width/height for landscape orientation
dark_modebooleanfalseEnable dark mode (prefers-color-scheme: dark)
block_adsbooleanfalseBlock ad network requests
block_cookie_bannersbooleanfalseHide GDPR/cookie consent banners
block_chatsbooleanfalseHide live chat widgets
block_trackersbooleanfalseBlock analytics/tracking requests (GA, GTM, Hotjar, etc.)
stealthbooleanfalseStealth mode to bypass bot detection
devicestringDevice preset, e.g. "iPhone 14"
delayinteger0Wait N ms after page load before capture. Max 10000
wait_forstringCSS selector to wait for before capture
wait_untilenum"load"Navigation condition: load, domcontentloaded, networkidle
cssstringCustom CSS to inject before capture
hide_selectorsstringComma-separated CSS selectors to hide
scroll_yintegerScroll to Y offset before capture
proxystringRoute through proxy: http://user:pass@host:port
callback_urlstringWebhook URL called when job completes

Response (202 Accepted)

{
  "job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending",
  "total_urls": 3,
  "poll_url": "/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "download_url": "/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6/download",
  "expires_at": "2026-04-01T12:00:00Z"
}

Poll for status

curl https://api.snapsharp.dev/v1/jobs/JOB_ID \
  -H "Authorization: Bearer sk_live_..."
{
  "id": "3fa85f64...",
  "type": "batch",
  "status": "processing",
  "progress": {
    "total": 3,
    "completed": 2,
    "failed": 0,
    "percentage": 67
  }
}

Status values: pendingprocessingcompleted / partial / failed

Download ZIP

Once status is "completed" or "partial":

curl https://api.snapsharp.dev/v1/jobs/JOB_ID/download \
  -H "Authorization: Bearer sk_live_..." \
  -o screenshots.zip

The ZIP contains one file per URL named 001_example.com.png, 002_stripe.com.png, etc.

Results expire 24 hours after the job completes. Download promptly.

Node.js example

import SnapSharp from '@snapsharp/sdk';

const client = new SnapSharp({ apiKey: 'sk_live_...' });

// Start batch job
const job = await client.batch([
  'https://example.com',
  'https://stripe.com',
  'https://vercel.com',
], { format: 'png', full_page: false });

// Poll until complete
let status = job;
while (status.status === 'pending' || status.status === 'processing') {
  await new Promise((r) => setTimeout(r, 2000));
  status = await client.getJob(job.job_id);
}

// Download ZIP
const zip = await client.downloadJob(job.job_id);

Plan limits

PlanMax URLs per batch
Free✗ Not available
Starter10
Growth50
Business100
Enterprise500