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/screenshotBoth 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.
GETtakes parameters in the query string.POSTtakes 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.jpgurl 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
| Mode | Trigger | Status | Body |
|---|---|---|---|
| Binary | default | 200 | The image or PDF bytes |
| Signed url | response=url | 200 | { "url": …, "cached": … } |
| Queued | callback_url set | 202 | { "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
| Status | When |
|---|---|
200 | Capture succeeded (fresh or cached). |
202 | Capture queued for webhook delivery. |
401 | Missing or invalid API key. |
402 | The team has no active subscription. |
403 | The key is inactive or expired. |
422 | Validation failed, or the url or device was rejected. |
429 | Per-minute rate limit hit, or monthly quota exhausted. |
500 | The 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