Capture any webpage as PNG, JPEG, or WebP with a single HTTP call. Full-page, dark mode, device emulation, batch, PDF — no Puppeteer babysitting required.
Get free API key →100 calls/month free. No credit card.
One endpoint, every option you'll actually need.
Capture the entire scrollable page, not just the viewport. Add full_page=true — no extra setup.
Render as iPhone 14, Pixel 7, iPad, or desktop. Accurate viewport, user-agent, touch events, and DPI.
Capture pages in dark mode with dark_mode=true. Uses the prefers-color-scheme: dark media query.
POST a list of URLs and screenshot all of them in parallel. Results include base64 images and per-URL status.
Convert any URL to a PDF. Supports A4, Letter, landscape, custom margins, and background color printing.
Get OG tags, title, description, favicon, and canonical URL alongside your screenshot — one call, one browser session.
One HTTP request. No SDKs required (though we have those too).
curl
# Basic screenshot — returns PNG binary curl "https://snapapi.tech/v1/screenshot?url=https://github.com" \ -H "x-api-key: YOUR_KEY" \ -o screenshot.png # Full-page, dark mode, iPhone 14 emulation curl "https://snapapi.tech/v1/screenshot?url=https://github.com&full_page=true&dark_mode=true&device=iphone14" \ -H "x-api-key: YOUR_KEY" \ -o iphone-dark.png # URL to PDF curl "https://snapapi.tech/v1/pdf?url=https://github.com&format=A4" \ -H "x-api-key: YOUR_KEY" \ -o page.pdf
Node.js
const fs = require('fs'); async function screenshot(url, output) { const res = await fetch( `https://snapapi.tech/v1/screenshot?url=${encodeURIComponent(url)}&full_page=true`, { headers: { 'x-api-key': process.env.SNAPAPI_KEY } } ); if (!res.ok) throw new Error(await res.text()); fs.writeFileSync(output, Buffer.from(await res.arrayBuffer())); console.log(`Saved: ${output}`); } screenshot('https://github.com', 'github.png'); // Batch — screenshot multiple URLs in parallel const res = await fetch('https://snapapi.tech/v1/batch', { method: 'POST', headers: { 'x-api-key': process.env.SNAPAPI_KEY, 'Content-Type': 'application/json' }, body: JSON.stringify({ urls: ['https://stripe.com', 'https://vercel.com'], endpoint: 'screenshot' }) }); const { results } = await res.json(); // results[i].screenshot = "data:image/png;base64,..."
Start free. Scale when you need to.
The answers to the questions we actually get asked.
How do I take a screenshot with the API?
Make a GET request to https://snapapi.tech/v1/screenshot?url=YOUR_URL with your API key in the x-api-key header. The response is a PNG binary. Optionally add full_page=true, dark_mode=true, device=iphone14, or format=jpeg as query parameters. That's it — no SDK, no setup.
Does it handle JavaScript-rendered pages?
Yes. Every request spins up a real Chromium browser (via Puppeteer), loads the page fully including all JavaScript, CSS, and lazy-loaded images, then captures the screenshot. You see exactly what a real user would see — not the raw HTML source.
What image formats are supported?
PNG (default), JPEG, and WebP. Add format=jpeg&quality=80 for smaller file sizes. PNG is lossless and recommended for text-heavy pages. All formats are returned as binary in the response body.
How fast is it?
Most screenshots return in 1–3 seconds. The server keeps a persistent warm browser instance, so there is no cold-start penalty per request. A 30-minute intelligent cache means repeat requests for the same URL are near-instant. The hard timeout is 45 seconds for unusually slow pages.
Can I self-host SnapAPI?
Yes. SnapAPI is open-source (Node.js + Puppeteer). Clone the repo, run npm install && node server.js, and you have a local instance with no rate limits. The hosted API is for teams who don't want to manage browser infrastructure themselves.