Website Screenshot API

Capture any URL as a high-fidelity screenshot with a single API call. Real Chromium rendering, multiple output formats, and developer-friendly parameters.

How It Works

SnapAPI renders screenshots using a real Chromium browser instance. Every request spins up a headless Chrome session, navigates to your target URL, waits for the page to fully render (including JavaScript, CSS, and web fonts), then captures the viewport as an image.

The API is a single REST endpoint that accepts query parameters for URL, format, dimensions, and rendering options. Authentication is via a Bearer token in the Authorization header. The response is the raw binary image data with appropriate content-type headers.

curl -H "Authorization: Bearer snap_your_key" \
  "https://apisnap.dev/api/screenshot?url=https://example.com&format=png&width=1280&height=800" \
  -o screenshot.png

Average response time is under 2 seconds for most pages. The API handles JavaScript-heavy SPAs, CSS animations, custom fonts, and responsive layouts just like a real browser would.

Output Formats

SnapAPI supports three output formats to match your use case:

  • PNG (default) — Lossless quality, ideal for UI screenshots, visual testing, and archival. Larger file sizes but pixel-perfect reproduction.
  • JPEG — Lossy compression with adjustable quality (1-100). Best for thumbnails, social media previews, and bandwidth-sensitive applications.
  • PDF — Full-page document capture. Perfect for generating printable reports, invoices, and documentation from web pages.

Set the format via the format query parameter. For JPEG, use the quality parameter to control compression (default: 80).

Start Capturing Screenshots Today

100 free screenshots per month. No credit card required. API key delivered instantly.

Get Started Free

Rendering Options

Fine-tune your screenshots with these parameters:

  • width / height — Viewport dimensions (320-3840px). Default: 1280x800.
  • full_page — Capture the entire scrollable page, not just the viewport.
  • dark_mode — Emulate prefers-color-scheme: dark for sites with dark mode support.
  • delay — Wait 0-10,000ms after page load before capture. Essential for lazy-loaded content and JavaScript animations.
  • selector — Target a specific CSS element instead of the full page. Screenshot just a chart, hero section, or product card.
  • deviceScaleFactor — Render at 2x or 3x for retina/HiDPI output.

All parameters are optional. The defaults produce a standard desktop viewport screenshot in PNG format.

Security & SSRF Protection

SnapAPI blocks all private IP ranges to prevent Server-Side Request Forgery (SSRF) attacks. The following address ranges are rejected:

  • 127.0.0.0/8 (localhost)
  • 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 (private networks)
  • 169.254.0.0/16 (link-local / cloud metadata)

Only publicly routable URLs are accepted. This prevents users from accessing internal services, cloud metadata endpoints, or admin panels through the screenshot API.

Pricing & Free Tier

SnapAPI offers a generous free tier for evaluation and low-volume projects:

  • Free — 100 screenshots/month. No credit card required. Full API access.
  • Starter ($9/mo) — 5,000 screenshots/month. Priority rendering.
  • Pro ($29/mo) — 25,000 screenshots/month. Priority support + rendering.

All tiers include the same API features. Upgrade or downgrade anytime from your dashboard. Usage resets on the 1st of each month.

Frequently Asked Questions

SnapAPI uses real Chromium via Puppeteer. Full JavaScript execution, CSS rendering, web fonts, and animations - exactly what a user sees in Chrome.
Average response time is 1.5-2 seconds for typical pages. Complex SPAs or pages with heavy media may take 3-5 seconds. Use the delay parameter for lazy-loaded content.
Currently SnapAPI captures publicly accessible URLs only. Authenticated page support (cookies/tokens) is on the Pro roadmap.
The API returns a 429 Too Many Requests response. Your quota resets on the 1st of each month. Upgrade your plan anytime to restore access immediately.
No per-second rate limit. You can fire as many concurrent requests as you want within your monthly quota.