Getting Started

Snap makes screenshots instant. No signup, no API key, no credit card—just paste a URL and get an image.

Anonymous API (No Signup Required)

The fastest way to capture a screenshot. No authentication required—just pass a public URL and get back an image.

Simple GET Request

bash
curl "https://snap.i2dev.com/v1/screenshot?url=https%3A%2F%2Fexample.com"

Returns an image directly. Perfect for embeds, <img /> tags, and quick testing. If a capture fails, this endpoint still returns an uncached placeholder image describing the problem.

Successful captures are cache-first while their S3 object exists. To explicitly refresh a stored screenshot, add force=true; that request consumes one daily capture and returns Cache-Control: no-store.

Customizable Options

bash
curl "https://snap.i2dev.com/v1/screenshot?url=https%3A%2F%2Fexample.com&format=jpeg&width=1920&height=1080"

Available parameters:

  • url (required) — The page to screenshot
  • width — Viewport width (default: 1280)
  • height — Viewport height (default: 720)
  • formatpng or jpeg (default: jpeg; the authenticated API defaults to png)
  • fullPage — Capture the full scrollable page
  • waitUntil — Wait for load, domcontentloaded, or networkidle
  • waitForSelector — Wait for a CSS selector before capture
  • timezoneId and locale — Stabilize regional rendering
  • timeoutMs — Set the overall render timeout, up to the server maximum
  • force — Explicitly refresh an existing screenshot; consumes one daily capture and is never cached

Anonymous Limits

Anonymous requests are limited to 10 screenshots per day per IP, resetting at midnight UTC. To prevent rotating cloud or serverless egress from bypassing that limit, each network ASN also shares a high 10,000-attempt daily cost ceiling. This shared ceiling is intentionally much higher because a network can contain many unrelated users. Cache hits do not consume either daily quota but remain subject to the per-IP rate limit. For reliable server-side volume, higher limits, priority rendering, and additional features, authenticate with an API key.

Anonymous failures return HTTP 200 with a standard 1280x720 PNG or JPEG placeholder so image embeds remain renderable. Inspect X-Snap-Result, X-Snap-Error-Code, X-Snap-Error-Status, and X-Snap-Request-Id for machine-readable diagnostics. Error placeholders use Cache-Control: no-store.

Authenticated API

For production use, CI/CD integration, and higher rate limits, use the authenticated API.

bash
curl -X POST https://snap.i2dev.com/v1/screenshots \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "viewport": { "width": 1280, "height": 720 }
  }'

The response includes the screenshot URL and metadata:

json
{
  "jobId": "...",
  "request_id": "...",
  "imageUrl": "https://snap-i2dev-com.s3.amazonaws.com/...?X-Amz-...",
  "contentType": "image/png",
  "bytes": 12345,
  "durationMs": 987
}

Authentication

All authenticated API requests require an API key:

http
Authorization: Bearer YOUR_API_KEY

You can also use x-api-key if preferred:

http
x-api-key: YOUR_API_KEY

Error Codes

The authenticated API returns structured error responses with consistent HTTP statuses and codes:

CodeHTTP StatusDescription
invalid_url400URL is malformed or uses an unsupported protocol
unsafe_url400URL resolves to a private/internal IP address
invalid_render_option400Chromium rejected the supplied timezone or locale
unauthorized401Missing or invalid API key
rate_limited429Too many requests. Check Retry-After header
navigation_timeout504Page failed to load within timeout
render_blocked422Target site blocked automated rendering
automation_refused502Target site rejected the headless browser
upstream_unreachable502Target site could not be loaded

Authenticated API error responses include a request_id for debugging:

json
{
  "error": "URL resolves to a private IP address",
  "code": "unsafe_url",
  "request_id": "req_xyz789"
}