Screenshots as a Service

Screenshot
any URL
via one API call

Render pixel-perfect screenshots of any website in real Chromium. PNG, JPEG, or PDF. Full-page, dark mode, element targeting — all via a dead-simple REST API.

100 screenshots free — no credit card required

bash — SnapAPI
# Capture a screenshot $ curl -o shot.png \ "https://apisnap.dev/api/screenshot?url=github.com&api_key=snap_xxx" # Full-page PDF, dark mode $ curl -o page.pdf \ "https://apisnap.dev/api/screenshot?url=stripe.com &format=pdf&full_page=true &dark_mode=true&api_key=snap_xxx"
HTTP/2 200   Content-Type: image/png
X-Response-Time: 1842ms   X-Usage-Remaining: 97
1.8s
avg response time
99.9%
uptime SLA
3
output formats
10M+
screenshots captured

Works with your stack

One endpoint. Any language. Ship in minutes.

# Basic screenshot → PNG curl -H "Authorization: Bearer YOUR_KEY" \ "https://apisnap.dev/api/screenshot?url=example.com" \ -o screenshot.png # Retina, full-page, dark mode → PDF curl -H "Authorization: Bearer YOUR_KEY" \ "https://apisnap.dev/api/screenshot?url=example.com &format=pdf&full_page=true&dark_mode=true&scale=2" \ -o fullpage.pdf
// npm install node-fetch (or use built-in fetch in Node 18+) const apiKey = 'YOUR_KEY'; const targetUrl = 'https://example.com'; const response = await fetch( `https://apisnap.dev/api/screenshot?url=${encodeURIComponent(targetUrl)}`, { headers: { 'Authorization': `Bearer ${apiKey}` } } ); if (!response.ok) throw new Error(await response.text()); const buffer = Buffer.from(await response.arrayBuffer()); fs.writeFileSync('screenshot.png', buffer); console.log('Saved screenshot.png');
import requests api_key = "YOUR_KEY" target = "https://example.com" r = requests.get( "https://apisnap.dev/api/screenshot", params={"url": target, "format": "png", "scale": 2}, headers={"Authorization": f"Bearer {api_key}"}, ) r.raise_for_status() with open("screenshot.png", "wb") as f: f.write(r.content) print(f"Done. Remaining: {r.headers['X-Usage-Remaining']}")
<?php $apiKey = 'YOUR_KEY'; $targetUrl = 'https://example.com'; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => "https://apisnap.dev/api/screenshot?url=" . urlencode($targetUrl), CURLOPT_HTTPHEADER => ["Authorization: Bearer $apiKey"], CURLOPT_RETURNTRANSFER => true, ]); $png = curl_exec($ch); curl_close($ch); file_put_contents('screenshot.png', $png);
Response → image/png
https://example.com
200 OK Content-Type: image/png 1.8s

Everything you need, nothing you don't

Built on real Chromium. Production-grade from day one.

Blazing Fast

Real Chromium rendering with connection pooling. Most screenshots complete under 2 seconds.

< 2s avg • p99 < 6s
🖼

3 Output Formats

PNG, JPEG with quality control, or PDF. Set width, height, scale factor, and JPEG compression.

PNG • JPEG • PDF
🌓

Dark Mode Capture

Emulate prefers-color-scheme: dark with a single parameter. Perfect for OG image generation.

dark_mode=true
📐

Full-Page Screenshots

Capture the entire scrollable page, not just the viewport. Great for archiving and testing.

full_page=true
🎯

Element Targeting

Target any element via CSS selector. Screenshot a chart, a pricing table, or a hero image.

selector=.hero
🔒

Secure by Default

SSRF protection, private IP blocking, rate limiting per key. Your usage is isolated and metered.

SSRF-safe • rate-limited

One endpoint. All the power.

RESTful, stateless, predictable. Works with any HTTP client.

Authentication
# Preferred: Bearer header curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://apisnap.dev/api/screenshot?url=example.com" # Also accepted: query parameter curl "https://apisnap.dev/api/screenshot?url=example.com&api_key=YOUR_KEY"
GET /api/screenshot

Capture a screenshot of any public URL. Returns binary image data with metadata headers.

ParameterTypeDefaultDescription
url string required Target URL to screenshot
format string png png, jpeg, or pdf
width integer 1280 Viewport width in px (320–3840)
height integer 800 Viewport height in px (200–2160)
full_page boolean false Capture entire scrollable page
quality integer 80 JPEG quality 1–100
delay integer 0 Wait ms after page load (0–10000)
dark_mode boolean false Emulate dark color scheme
scale number 1 Device pixel ratio (1–3). Use 2 for retina.
selector string CSS selector — screenshot a specific element
POST /api/register

Create a free API key. No credit card required.

curl -X POST "https://apisnap.dev/api/register" \ -H "Content-Type: application/json" \ -d '{"email":"you@example.com"}' # Response { "apiKey": "snap_abc123...", "plan": "free", "limit": 100 }
HDR Response Headers

Every screenshot response includes these tracking headers:

HeaderDescription
X-Usage-RemainingScreenshots remaining this billing month
X-Response-TimeRender time in milliseconds
X-Screenshot-WidthActual rendered viewport width
X-Screenshot-HeightActual rendered viewport height

See it in action

Paste your API key and capture any URL right now.

No account needed for the demo

Get a free API key below (100 screenshots/month). The demo runs a live API call against your chosen URL and returns the actual PNG.

Response headers you'll receive

X-Usage-Remaining Credits left this month
X-Response-Time Render duration (ms)
X-Screenshot-Width Rendered viewport px
Content-Type image/png • image/jpeg • application/pdf

Start free. Scale when ready.

No contracts. Cancel any time. Same API across all tiers.

Hobby

Free

For side projects & evaluation

$0
per month, forever
  • 100 screenshots / month
  • PNG, JPEG, PDF formats
  • Full API access
  • Dark mode & full-page
  • Community support
Get Started Free
Pro

Pro

For production workloads

$29
per month, billed monthly
  • 50,000 screenshots / month
  • PNG, JPEG, PDF formats
  • Full API access
  • Priority rendering queue
  • Element selectors & scale
  • Priority email support
Subscribe →

Need more than 50K/month? Contact us for custom volume pricing.

Frequently asked questions

Everything you'd want to know before integrating.

SnapAPI uses a real Chromium instance (via Puppeteer) for every screenshot. This means full JavaScript execution, CSS rendering, web fonts, animations — exactly what a user would see in Chrome.
Average response time is under 2 seconds for most pages. Complex SPAs or pages with heavy media may take 3–5 seconds. Use the delay parameter (up to 10,000ms) to wait for lazy-loaded content before capture.
Currently the API captures publicly accessible URLs only. Session-based authentication (cookies, tokens) is on the roadmap for Pro plans. In the meantime, you can point the API at staging environments with public access.
Yes. Private IP ranges (192.168.x.x, 10.x.x.x, 172.16–31.x.x, localhost, 169.254.x.x) are blocked to prevent SSRF attacks. Only publicly routable URLs are allowed. Internal URLs and metadata endpoints are automatically rejected.
Once your monthly quota is reached, the API returns a 429 Too Many Requests response with a JSON body explaining the limit. Your quota resets on the 1st of each month. Upgrade your plan at any time to restore access immediately.

Start capturing
screenshots today

100 free screenshots per month. No credit card required. API key in your inbox in seconds.

By signing up you agree to our terms. We don't spam.

Real Chromium — not a headless hack
🔒 SSRF-protected — private IPs blocked
📈 99.9% uptime — monitored 24/7
🚀 Ships fast — 1-line integration