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
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);
Built on real Chromium. Production-grade from day one.
Real Chromium rendering with connection pooling. Most screenshots complete under 2 seconds.
PNG, JPEG with quality control, or PDF. Set width, height, scale factor, and JPEG compression.
Emulate prefers-color-scheme: dark with a single parameter. Perfect for OG image generation.
Capture the entire scrollable page, not just the viewport. Great for archiving and testing.
Target any element via CSS selector. Screenshot a chart, a pricing table, or a hero image.
SSRF protection, private IP blocking, rate limiting per key. Your usage is isolated and metered.
RESTful, stateless, predictable. Works with any HTTP client.
# 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"
Capture a screenshot of any public URL. Returns binary image data with metadata headers.
| Parameter | Type | Default | Description |
|---|---|---|---|
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 |
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 }
Every screenshot response includes these tracking headers:
| Header | Description |
|---|---|
X-Usage-Remaining | Screenshots remaining this billing month |
X-Response-Time | Render time in milliseconds |
X-Screenshot-Width | Actual rendered viewport width |
X-Screenshot-Height | Actual rendered viewport height |
Paste your API key and capture any URL right now.
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.
No contracts. Cancel any time. Same API across all tiers.
For side projects & evaluation
For growing apps & teams
For production workloads
Need more than 50K/month? Contact us for custom volume pricing.
Everything you'd want to know before integrating.
delay parameter (up to 10,000ms) to wait for lazy-loaded content before capture.
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.
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.