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/batchRequest 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
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | string[] | required | Array of URLs to capture (max depends on plan) |
width | integer | 1280 | Viewport width in pixels |
height | integer | 720 | Viewport height in pixels |
format | string | "png" | Output format: png, jpeg, webp |
quality | integer | 80 | JPEG/WebP quality (1–100) |
full_page | boolean | false | Capture full scrollable page |
retina | boolean | false | 2× device pixel ratio (HiDPI) |
viewport_landscape | boolean | false | Swap width/height for landscape orientation |
dark_mode | boolean | false | Enable dark mode (prefers-color-scheme: dark) |
block_ads | boolean | false | Block ad network requests |
block_cookie_banners | boolean | false | Hide GDPR/cookie consent banners |
block_chats | boolean | false | Hide live chat widgets |
block_trackers | boolean | false | Block analytics/tracking requests (GA, GTM, Hotjar, etc.) |
stealth | boolean | false | Stealth mode to bypass bot detection |
device | string | — | Device preset, e.g. "iPhone 14" |
delay | integer | 0 | Wait N ms after page load before capture. Max 10000 |
wait_for | string | — | CSS selector to wait for before capture |
wait_until | enum | "load" | Navigation condition: load, domcontentloaded, networkidle |
css | string | — | Custom CSS to inject before capture |
hide_selectors | string | — | Comma-separated CSS selectors to hide |
scroll_y | integer | — | Scroll to Y offset before capture |
proxy | string | — | Route through proxy: http://user:pass@host:port |
callback_url | string | — | Webhook 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: pending → processing → completed / 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.zipThe 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
| Plan | Max URLs per batch |
|---|---|
| Free | ✗ Not available |
| Starter | 10 |
| Growth | 50 |
| Business | 100 |
| Enterprise | 500 |