Skip to main content
Ssnap Docs
API Reference

Screenshot API endpoint

GET or POST /api/v1/screenshot, the single endpoint of the Ssnap API.

GET  https://ssnap.cc/api/v1/screenshot
POST https://ssnap.cc/api/v1/screenshot

Both verbs hit the same action and accept the same parameters. GET keeps simple integrations to a single url; POST keeps long parameters (CSS selectors, watermark text) out of url length limits and access logs.

  • GET takes parameters in the query string.
  • POST takes parameters as a JSON body (Content-Type: application/json) or as form fields.

Authentication is required on every call. See Authentication.

Minimal request

curl -G https://ssnap.cc/api/v1/screenshot \
  -H "Authorization: Bearer $SSNAP_API_KEY" \
  --data-urlencode "url=https://example.com" \
  --output shot.jpg

url is the only required parameter. Everything else falls back to a default: jpeg, quality 80, light theme, the configured default device preset, viewport-sized (not full page), no delay.

Full request

curl -X POST https://ssnap.cc/api/v1/screenshot \
  -H "Authorization: Bearer $SSNAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/pricing",
    "format": "png",
    "theme": "dark",
    "width": 1440,
    "height": 900,
    "full_page": true,
    "network_idle": true,
    "delay": 500,
    "border_width": 12,
    "border_color": "#111111",
    "watermark_text": "© Example",
    "watermark_size": 24,
    "watermark_color": "#ffffff",
    "watermark_x": 30,
    "watermark_y": 30,
    "cache_ttl": 3600,
    "response": "url"
  }'

Response modes

ModeTriggerStatusBody
Binarydefault200The image or PDF bytes
Signed urlresponse=url200{ "url": …, "cached": … }
Queuedcallback_url set202{ "status": "queued", "message": … }

callback_url wins over response: when it is present the capture is always queued and delivered to your webhook. Details in API response formats and Async callbacks.

Status codes

StatusWhen
200Capture succeeded (fresh or cached).
202Capture queued for webhook delivery.
401Missing or invalid API key.
402The team has no active subscription.
403The key is inactive or expired.
422Validation failed, or the url or device was rejected.
429Per-minute rate limit hit, or monthly quota exhausted.
500The render itself failed.

Every non-2xx body carries a stable code. See API error codes.

Rate limit headers

Responses carry the current throttle state:

X-RateLimit-Limit: 300
X-RateLimit-Remaining: 297
X-RateLimit-Reset: 1758196800
Retry-After: 41

See Rate limits and quotas.

Next