Screenshot API

Screenshot API for Developers

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.

Everything a screenshot API should do

One endpoint, every option you'll actually need.

📄

Full-Page Capture

Capture the entire scrollable page, not just the viewport. Add full_page=true — no extra setup.

📱

Device Emulation

Render as iPhone 14, Pixel 7, iPad, or desktop. Accurate viewport, user-agent, touch events, and DPI.

🌙

Dark Mode

Capture pages in dark mode with dark_mode=true. Uses the prefers-color-scheme: dark media query.

Batch Processing

POST a list of URLs and screenshot all of them in parallel. Results include base64 images and per-URL status.

📑

PDF Generation

Convert any URL to a PDF. Supports A4, Letter, landscape, custom margins, and background color printing.

🔍

Metadata Extraction

Get OG tags, title, description, favicon, and canonical URL alongside your screenshot — one call, one browser session.

Simple REST API. Works from anywhere.

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,..."

Simple, transparent pricing

Start free. Scale when you need to.

Free

$0
/ month, forever
  • 100 API calls/month
  • PNG, JPEG, WebP
  • Full-page capture
  • Dark mode & devices
  • Metadata extraction
Get free key

Pro

$29
/ month
  • 5,000 calls/month
  • Everything in Starter
  • Batch processing (25)
  • 20 monitors
  • 30-day history
Upgrade to Pro

Business

$99
/ month
  • 25,000 calls/month
  • Everything in Pro
  • Batch processing (50)
  • 100 monitors
  • 90-day history
  • 5 concurrent requests
Upgrade to Business

Frequently asked questions

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.