Screenshot API for agents and apps

Send a URL.
Get a screenshot.

Hosted Chromium. PNG, PDF, and visual diffs. MCP for Claude, Cursor, and Copilot. About 100x fewer tokens than dumping HTML into the model.

  • Claude
  • Cursor
  • GitHub Copilot
  • ChatGPT
  • Codex
  • Antigravity

Built for agents

MCP first. About 100x fewer tokens.

Dumping HTML burns the context window. extract_text or a screenshot keeps the thread. OAuth at https://api.snapshotflow.com/mcp.

  • Claude
  • Cursor
  • GitHub Copilot
  • ChatGPT
  • Codex
  • Antigravity
{
  "mcpServers": {
    "snapshotflow": {
      "url": "https://api.snapshotflow.com/mcp"
    }
  }
}

How it works

URL to file in three steps

  1. 1

    Send a URL

    Any live page. No HTML upload. No browser on your machine.

  2. 2

    One API request

    Hosted Chromium loads it with 40+ capture parameters.

  3. 3

    PNG, PDF, or diff

    Get the file, a webhook, or a visual overlay for CI.

One request

curl "https://api.snapshotflow.com/screenshot?url=https://github.com" \
  -H "X-Api-Key: $SNAPSHOTFLOW_KEY" \
  --output github.png
PNG

github.png

Result
GitHub homepage captured at 1280 by 800

Capabilities

Everything you'd build on
headless Chrome. Already built.

Visual regression

Catch UI bugs before your users do

OG images

Every shared link gets a rich preview

PDF export

Any web page to PDF

Page cleanup

Screenshots without the popups

Change monitoring

Know the moment a page changes

Website thumbnails

Live link previews inside your app

Who it is for

A concrete result for each team

Visual diffs

QA and engineering

Fail the build when pixels moved.

Thumbnails

SaaS products

Live link previews inside your app.

OG images

Marketing and SEO

Rich previews from the live page.

MCP

AI agents

About 100x fewer tokens than dumping HTML.

Why not Playwright

SnapshotFlow instead of self-hosted Playwright

SnapshotFlow

  • One HTTP call
  • 40+ params built in
  • MCP for agents
  • Queue and webhooks

Self-hosted Playwright

  • Chrome on every runner
  • A script per job
  • No shared agent setup
  • Timeouts and leaks

Security and reliability

Isolated Chrome. Signed callbacks. OAuth for agents.

Isolated Chromium

One capture. One Chrome.

API keys and MCP OAuth

REST key. Agent OAuth.

Signed webhooks

Signed. Timed. SSRF-checked.

Self-host when you must

Chrome, Redis, storage on your boxes.

Pricing

Start free. Scale on the same API.

Basic

$17 per month

The essentials to start rendering screenshots today.

  • 2,000 screenshots
  • 40 requests per minute
  • $0.009 per extra
  • Pay only for successful requests
  • Block ads and cookie banners
  • PNG, WebP, JPEG, and PDF
  • MCP and REST
  • Full page captures
  • Caching
  • Webhooks
Try for free

Scale

$259 per month

Prioritized support and infrastructure for your company.

  • 50,000 screenshots
  • 150 requests per minute
  • $0.004 per extra
  • Pay only for successful requests
  • Block ads and cookie banners
  • PNG, WebP, JPEG, and PDF
  • MCP and REST
  • Full page captures
  • Caching
  • Webhooks
  • Visual diffs
  • Signed webhooks
Try for free

Integrations

MCP first. Then Node, Java, HTTP.

Choose an integration
{
  "mcpServers": {
    "snapshotflow": {
      "url": "https://api.snapshotflow.com/mcp"
    }
  }
}
import { SnapshotFlow } from "snapshotflow";

const client = new SnapshotFlow({
  apiKey: process.env.SNAPSHOTFLOW_API_KEY,
});
const shot = await client.take({
  url: "https://example.com",
  fullPage: true,
  width: 1440,
});
await shot.save("example.png");
SnapshotFlow client = SnapshotFlow.builder()
    .apiKey(System.getenv("SNAPSHOTFLOW_API_KEY"))
    .build();

ScreenshotResult shot = client.take(
    TakeOptions.url("https://example.com")
        .fullPage(true)
        .width(1440));

shot.save(Path.of("example.png"));
const params = new URLSearchParams({
  url: "https://example.com",
  full_page: "true",
  width: "1280",
});

const res = await fetch(
  `https://api.snapshotflow.com/screenshot?${params}`,
  { headers: { "X-Api-Key": YOUR_API_KEY } }
);

const blob = await res.blob();
curl "https://api.snapshotflow.com/screenshot?url=https://example.com" \
  -H "X-Api-Key: $SNAPSHOTFLOW_KEY" \
  --output screenshot.png

Parameters

40+ parameters. Pick a recipe.

Clean capture

  • block_ads
  • block_cookie_banners
Open in playground

PDF export

  • format=pdf
  • full_page
Open in playground

OG image

  • width
  • height
Open in playground

Feedback

What teams say after they ship

5.0 out of 5

We dropped Playwright from CI for URL diffs. One request, no Chrome on the runner.

Priya N.

QA lead, ecommerce

5.0 out of 5

Forty-plus params meant we could kill cookie banners and ads without maintaining a script.

Marcus L.

Staff engineer, payments

5.0 out of 5

OG images from live pages. No template farm, no extra render service.

Elena V.

Frontend lead, SaaS

5.0 out of 5

The Node SDK is a thin wrapper. Same capture as cURL, typed for the team.

Jonah K.

Founding engineer

From the blog

Screenshot guides for every stack

All screenshot guides →

FAQ

Questions from the first visit

How do I take a website screenshot via API?

Send the page URL to SnapshotFlow with your API key. Hosted Chromium loads the live page and returns a PNG, JPEG, WebP, PDF, or visual diff. You do not run a browser cluster.

Can AI agents use SnapshotFlow?

Yes. Connect Claude, Cursor, Copilot, ChatGPT, and other MCP clients to https://api.snapshotflow.com/mcp. OAuth signs the agent in. Tools cover screenshot, batch, visual diff, and extract_text.

Why is this cheaper for LLM tokens than fetching the HTML?

A content-heavy page is tens of thousands of tokens of markup. A sized screenshot, or extract_text markdown, is about 100x cheaper context for the same page. That is the usual agent path.

Why not self-host Playwright?

You skip Chrome on CI, patching browsers, and flaky local timeouts. SnapshotFlow is one request with ads, cookies, wait, PDF, and diff already built. Self-host the Docker stack if data must stay on your hardware.

Is there a free screenshot API tier?

Every account includes 300 free screenshots for the lifetime of the account. No credit card to start. Hosted usage continues on the same API. Docker self-host removes the per-shot cap.

How many screenshot parameters does the API support?

The /screenshot endpoint exposes 40+ parameters. Pick a recipe on the homepage or open the playground. The full list is in the docs.

Free to start

300 free screenshots

No credit card. MCP or REST. One API key.

PNG

github.png

Yours in one request