Ssnap Screenshot API
Capture screenshots and PDFs of any public web page with a single HTTP request.
Ssnap is a screenshot API. You send one HTTP request with a target url, and you get back a rendered image or PDF, either as raw bytes, as a signed link, or delivered to your own webhook. No browser to install, no Chromium in your container.
curl -G https://ssnap.cc/api/v1/screenshot \
-H "Authorization: Bearer $SSNAP_API_KEY" \
--data-urlencode "url=https://example.com" \
--output example.jpgWhat you get
- One endpoint.
GETorPOSTon/api/v1/screenshot, with the same parameters and responses on both verbs. - Four output formats.
jpeg,png,webpandpdf. - 131 device presets plus explicit viewport control, dark-mode emulation, full-page capture and CSS-selector element clipping.
- Post-capture styling. Background colour, borders and text watermarks, applied server-side.
- Sync or async. Get the bytes back in the response, or pass a
callback_urland receive a signed webhook when the render is done. - Result caching. Repeat captures inside a
cache_ttlwindow are served from the previous render and do not consume quota.
Quickstart
Key, first request, first image, in about two minutes.
Authentication
Bearer tokens, api_key parameters, key lifecycle.
Endpoint reference
The capture endpoint in full.
Capture parameters
Every capture parameter, with ranges and defaults.
Start from your language
Node.js
fetch, streaming to disk, backoff on 429.
Python
requests and httpx, batches with bounded concurrency.
PHP
Laravel Http, plain cURL, queued webhooks.
All snippets
Also cURL, Go and Ruby.
Start from the problem
Open Graph images
Render social cards from an HTML template.
Visual regression testing
Deterministic captures you can diff.
Invoice and report PDFs
Authenticated pages to paginated PDFs.
How a capture works
- Your key is resolved and throttled against your plan's per-minute allowance.
- The target url is validated: it must be a publicly routable
http(s)address. See URL restrictions. - If
cache_ttlis set and a matching earlier capture exists, that render is returned. - Otherwise your team's monthly quota is checked and a capture slot is reserved.
- Headless Chromium renders the page; the result is post-processed and stored.
- You receive the bytes, a signed url, or a webhook.
A failed capture releases its reserved slot, so broken renders are never billed against your quota. Every failure mode is listed in API error codes.
Support
Email [email protected]. Live platform status is at ssnap.cc/status, and About Ssnap covers how the service is built and how these docs are maintained.