Keyword: screenshotone alternative · Published May 26, 2026
SnapshotFlow vs ScreenshotOne: A 2026 Alternative Comparison
A side-by-side look at SnapshotFlow and ScreenshotOne for teams evaluating a ScreenshotOne alternative in 2026. Each table cell is cross-checked against the vendor's public pricing, docs, and changelog, with inline citations where the claim is non-obvious. The article also includes a parameter-by-parameter migration guide and a "when to stay on ScreenshotOne" section so the decision works in both directions.
TL;DR — who fits what
- Pick SnapshotFlow if you need any of: AI agents that call screenshots as a tool (MCP / WebMCP), data-residency or air-gapped self-host, a built-in visual-regression endpoint, or a free tier larger than 100/month.
- Stay on ScreenshotOne if you depend on its 7-language SDKs (C#, Python, Node.js, Ruby, PHP, Go, Java), its no-code catalogue (Zapier, Make, n8n, Airtable, Bubble, Clay), scrolling-video screenshots today, or its mature brand & status page.
- The middle ground: SnapshotFlow already covers ScreenshotOne's core capture surface (full page, PDF, multi-format, async + webhook, caching, ad / cookie blocking, geo). The deltas are at the edges — agent layer, self-host, diff — and that's where the migration decision lives.
Why this comparison exists
ScreenshotOne is the most established hosted Screenshot API: a 7-language SDK, Zapier / Make / n8n / Airtable / Bubble / Clay integrations, and one of the deepest programmatic-SEO blogs in the niche. It works, it's well documented, it's reliable.
But three product gaps come up repeatedly in 2026:
- Agent-readiness. Engineering teams building with Claude, Cursor, Goose, or in-house agents want screenshots as a native MCP tool — not a manual HTTP call wrapped in a function. ScreenshotOne has an
/agentslanding but no Remote MCP server or WebMCP transport. SnapshotFlow ships both. - Self-host. Compliance, healthcare, gov, and internal-only apps cannot send URLs to a third-party. ScreenshotOne is hosted-only. SnapshotFlow's backend ships a
Dockerfileanddocker-compose.ymlthat you can run in your VPC. - Visual regression as a first-class endpoint. ScreenshotOne expects you to capture twice and diff yourself (or pay for Percy). SnapshotFlow ships a
/diffendpoint backed bypixelmatchwith a tunable threshold, so visual-regression CI is one HTTP call.
This article is the side-by-side for those three deltas — plus the parts where ScreenshotOne is genuinely ahead, so the decision is informed in both directions.
At a glance
| SnapshotFlow | ScreenshotOne | |
|---|---|---|
| Hosted API | ✓ api.snapshotflow.com | ✓ api.screenshotone.com [docs] |
| Self-host (Docker) | ✓ Docker Compose, OSS backend | — [pricing — hosted-only] |
| Free tier | 200 / month | 100 / month [pricing] |
| Paid entry | (roadmap — billing being rolled out) | $17/mo · 2,000 screenshots [pricing] |
| Remote MCP server | ✓ Stdio + OAuth 2.0 (CIMD) | ~ /agents landing, no MCP server [/agents page] |
WebMCP (navigator.modelContext) | ✓ Roadmap-tracked, partial today | — |
| Visual diff | ✓ /diff endpoint (pixelmatch) | — Bring your own pixelmatch / Percy [docs — no /diff] |
| Batch API | ✓ /batch — up to 10 URLs in parallel | ~ via async + multiple requests |
| Full-page, PDF, PNG / JPEG / WebP | ✓ | ✓ [params] |
| Async + signed webhook | ✓ HMAC signature, SSRF + TLS validation | ✓ [docs — webhooks] |
| Caching | ✓ Cache hits are free of quota | ✓ Cache hits don't count [pricing FAQ] |
| Geolocation | ✓ lat / lng / accuracy params | ~ "Choose IP location" on Growth+ tier [pricing — tier feature] |
| Ad / cookie banner / tracker blocking | ✓ Ghostery lists | ✓ |
| Scrolling / animated screenshots | — Roadmap | ✓ on Growth tier [changelog] |
| SDKs | HTTP REST + MCP tools (no language SDK yet) | ✓ C#, Python, Node.js, Ruby, PHP, Go, Java [SDK list] |
| No-code integrations | Via HTTP module in Zapier / Make / n8n | ✓ Native Zapier, Make, n8n, Clay |
Sources: SnapshotFlow backend repo (src/routes/, src/mcp-server/, Dockerfile, docker-compose.yml, migrations 0005/0006); screenshotone.com/pricing; screenshotone.com/agents; screenshotone.com/changelog. Verified May 2026.
Feature matrix
Capture & output
| Feature | SnapshotFlow | ScreenshotOne |
|---|---|---|
Full page + viewport + element (selector) | ✓ | ✓ |
| PDF (A4 / A3 / Letter / Legal / Tabloid) | ✓ portrait + landscape, print_background | ✓ |
| Output formats | PNG, JPEG, WebP, PDF, JSON, base64 | PNG, JPEG, WebP, PDF, JP2 (no JSON / no base64 by default) |
| HTML rendering (no URL) | ✓ inline html param | ✓ |
| Image resize on capture | ✓ image_width, image_height | ✓ image_width, image_height |
| Animated / scrolling MP4 / GIF / WebM | — roadmap | ✓ Growth tier and above [changelog] |
| Batch in one call | ✓ POST /batch 1–10 URLs | ~ multiple async requests |
| Visual diff endpoint | ✓ GET /diff with pixelmatch threshold | — |
Browser controls
| Feature | SnapshotFlow | ScreenshotOne |
|---|---|---|
| Custom viewport (W / H / DPR) | ✓ 100–3840 × 100–2160, DPR 0.5–3 | ✓ |
| Mobile emulation | ✓ viewport_mobile | ✓ |
| Dark mode | ✓ dark_mode=true | ✓ dark_mode=true |
| Reduced motion | ✓ reduced_motion | ✓ reduced_motion |
| Custom CSS / JS injection | ✓ styles, scripts | ✓ styles, scripts |
| Custom headers / cookies | ✓ JSON | ✓ |
| Hide selectors | ✓ hide_selectors (comma-separated) | ✓ |
| Click before capture | ✓ click | ✓ click |
| Wait conditions | ✓ wait_until, wait_for_selector, delay (0–10s) | ✓ wait_until, wait_for_selector, delay |
| Element clipping | ✓ clip_x, clip_y, clip_width, clip_height | ✓ |
| Timezone & user-agent | ✓ | ✓ |
| Ad / tracker / cookie banner blocking | ✓ Ghostery lists | ✓ on all tiers |
| Stealth mode | ~ partial — no dedicated stealth profile | ✓ on all tiers |
Delivery & automation
| Feature | SnapshotFlow | ScreenshotOne |
|---|---|---|
| Async + webhook | ✓ HMAC-signed, SSRF + TLS validation | ✓ signed webhooks |
| S3 / GCS / R2 upload | ~ STORAGE_TYPE in self-host (S3 / GCS / local) | ✓ "Upload to S3" feature |
| Caching | ✓ cache hits free of quota | ✓ cached renders don't count |
| Signed share-links | — | ✓ all tiers |
| Screenshot history | ✓ GET /screenshots paginated, max 50/200 per page | ~ via dashboard only |
| Content extraction (md / html / text) | ✓ extract_content=true | ~ via separate Markdown API |
| Page metadata (title, OG, favicon, status) | ✓ metadata=true | ~ partial |
Agent / AI layer
| Feature | SnapshotFlow | ScreenshotOne |
|---|---|---|
| Remote MCP server | ✓ Stdio MCP, OAuth 2.0 + CIMD client registration | — |
| MCP tools exposed | ✓ screenshot, batch_screenshot, visual_diff | — |
WebMCP (navigator.modelContext) | ~ partial / roadmap | — |
| "Screenshots for AI Agents" landing | ✓ in main site | ✓ /agents |
| AI Vision endpoint (URL + prompt → JSON) | — roadmap | — |
Infrastructure & DX
| Feature | SnapshotFlow | ScreenshotOne |
|---|---|---|
| Self-host | ✓ Dockerfile + docker-compose.yml + Redis | — |
| Storage backends (self-host) | ✓ local / S3 / GCS via STORAGE_TYPE | n/a — hosted only |
| Auth methods | Bearer JWT, X-Api-Key header, ?api_key= query, OAuth 2.0 (MCP) | ?access_key= query, signed requests |
| Quota headers on every response | ✓ X-Quota-Used / -Limit / -Remaining | ~ dashboard |
| Official language SDKs | — (HTTP + MCP only) | ✓ 7 SDKs: C#, Python, Node.js, Ruby, PHP, Go, Java |
| No-code integrations | Via Zapier / Make / n8n HTTP module | ✓ native Zapier, Make, n8n, Clay |
| GPU rendering | — | ✓ Scale tier ($259/mo) [pricing] |
| Public status page | — | ✓ status.screenshotone.com |
Pricing, side by side
ScreenshotOne uses a clean per-tier model. SnapshotFlow's hosted billing is rolling out — today the free tier is the entry point, and self-host removes the per-screenshot cost entirely for teams that want to bring their own Chromium.
| Tier | ScreenshotOne [source] | SnapshotFlow (hosted) | SnapshotFlow (self-host) |
|---|---|---|---|
| Free | 100 screenshots / month, all features | 200 screenshots / month | Unlimited on your own hardware |
| Entry paid | $17 / mo — 2,000 screenshots, 40 req/min, $0.009 overage | Rolling out | Compute cost only (VPS + Redis) |
| Growth | $79 / mo — 10,000 screenshots, 80 req/min, $0.006 overage, scrolling + videos | Rolling out | — |
| Scale | $259 / mo — 50,000 screenshots, 150 req/min, $0.004 overage, GPU rendering, priority support | Rolling out | — |
| Self-host license | — | — | OSS — no license fee |
For a breakdown of how per-screenshot, per-second, and self-host costs compare across the industry, read Screenshot API Pricing Explained.
ScreenshotOne pricing verified at screenshotone.com/pricing on May 26, 2026. SnapshotFlow self-host figures reference public VPS list prices and assume our cost model.
Code: same task, both APIs
"Capture example.com as a full-page WebP, block ads and cookie banners, deliver async to a webhook." Both APIs handle this in one call.
ScreenshotOne
curl -G "https://api.screenshotone.com/take" \ --data-urlencode "access_key=$SCREENSHOTONE_KEY" \ --data-urlencode "url=https://example.com" \ --data-urlencode "full_page=true" \ --data-urlencode "format=webp" \ --data-urlencode "block_ads=true" \ --data-urlencode "block_cookie_banners=true" \ --data-urlencode "async=true" \ --data-urlencode "webhook_url=https://yourapp.com/hook"
SnapshotFlow
curl -G "https://api.snapshotflow.com/screenshot" \ -H "X-Api-Key: $SNAPSHOTFLOW_KEY" \ --data-urlencode "url=https://example.com" \ --data-urlencode "full_page=true" \ --data-urlencode "format=webp" \ --data-urlencode "block_ads=true" \ --data-urlencode "block_cookie_banners=true" \ --data-urlencode "async=true" \ --data-urlencode "webhook_url=https://yourapp.com/hook"
Differences in this example: ScreenshotOne authenticates via ?access_key= on the query string, SnapshotFlow uses the X-Api-Key header (also accepts ?api_key=). Endpoint names differ (/take vs /screenshot). Everything else is identical.
On SnapshotFlow you also get quota headers on every response — X-Quota-Used, X-Quota-Limit, X-Quota-Remaining — which makes client-side budgeting trivial without polling a dashboard endpoint.
MCP & AI agents
ScreenshotOne markets a "Screenshots for AI Agents" page (screenshotone.com/agents, verified May 2026) that frames the regular HTTP API as agent-friendly. As of the same date there is no public Remote MCP server endpoint, no WebMCP transport, and no published MCP tool registry in the changelog or docs.
SnapshotFlow ships an actual MCP server in the backend (src/mcp-server/). Three tools are registered:
screenshot— single-URL capture with the full option surface.batch_screenshot— 1–10 URLs in parallel.visual_diff— pixel-level before / after with tunable threshold.
Client registration uses OAuth 2.0 with Client Identifier Metadata Document (CIMD), so a Claude Desktop, Cursor, or Goose agent can sign in once and call screenshot natively. Example from a Claude config:
{
"mcpServers": {
"snapshotflow": {
"command": "npx",
"args": ["-y", "@snapshotflow/mcp", "--remote", "https://api.snapshotflow.com"]
}
}
}
For a deeper dive on calling screenshot APIs from agents — including the upcoming WebMCP browser-side transport — see Best Screenshot APIs in 2026.
Self-host with Docker
ScreenshotOne is hosted-only — the pricing and docs list no self-host or VPC deployment option as of May 2026. If you operate under HIPAA, SOC 2 Type II, GDPR data-residency, or in an air-gapped network, your only path there is a vendor agreement plus a proxy. SnapshotFlow's backend can run inside your VPC.
The repo ships a Dockerfile (Node 24 slim + Chromium from apt) and a docker-compose.yml with Redis and 1 GB /dev/shm for Chrome:
git clone https://github.com/snapshotflow/snapshotflow-backend cd snapshotflow-backend docker compose up -d # API at http://localhost:3000 curl "http://localhost:3000/screenshot?url=https://example.com" --output local.png
Configuration is via environment variables: AUTH_ENABLED (toggle API-key requirement for internal use), STORAGE_TYPE (local / s3 / gcs), REDIS_URL, plus concurrency caps. The container exposes the same HTTP surface as the hosted API, so client code does not change — only the base URL.
Visual diff built-in
Visual regression is the single biggest workflow gap with hosted-only Screenshot APIs. The ScreenshotOne docs list no /diff or visual-regression endpoint, so the standard flow is: capture twice, store both images, run pixelmatch in your CI (or pay for Percy / Chromatic), then upload the diff. That's three round-trips and one library dependency.
SnapshotFlow exposes GET /diff directly:
curl -G "https://api.snapshotflow.com/diff" \ -H "X-Api-Key: $SNAPSHOTFLOW_KEY" \ --data-urlencode "before=https://staging.example.com/pricing" \ --data-urlencode "after=https://example.com/pricing" \ --data-urlencode "threshold=0.1" \ --output diff.png
The response is a PNG with pixel deltas highlighted, plus a JSON header with the mismatch percentage. Drop the call into a GitHub Action and fail the build above your threshold — no extra library, no second service.
Migration: ScreenshotOne → SnapshotFlow
Migration is mostly a base-URL and auth-header change. The two APIs use the same idiomatic option names for the common surface. Below is a parameter-by-parameter mapping for the most-used options.
| What you want | ScreenshotOne | SnapshotFlow |
|---|---|---|
| Base URL | api.screenshotone.com/take | api.snapshotflow.com/screenshot |
| Auth | ?access_key=… | X-Api-Key: header or ?api_key=… |
| Full-page capture | full_page=true | full_page=true |
| Format | format=webp | format=webp |
| Viewport | viewport_width, viewport_height | viewport_width, viewport_height |
| Device scale | device_scale_factor | device_scale_factor |
| Geolocation | Growth tier IP location | geolocation_latitude, geolocation_longitude, geolocation_accuracy |
| Block ads / cookie banners | block_ads, block_cookie_banners | block_ads, block_cookie_banners, block_trackers |
| Wait conditions | delay, wait_until, wait_for_selector | delay, wait_until, wait_for_selector |
| Hide elements | hide_selectors | hide_selectors |
| Click before capture | click | click |
| Custom CSS / JS | styles, scripts | styles, scripts |
| Async + webhook | async=true, webhook_url | async=true, webhook_url (HMAC signed, SSRF-validated) |
| Caching | on by default | cache=true (default), free on hit |
| Response shape | image by default, JSON via response_type | response_type = image / json / base64 |
A minimal one-line code migration in Node.js:
// Before — ScreenshotOne
const url = `https://api.screenshotone.com/take?access_key=${KEY}&url=${encodeURIComponent(target)}&full_page=true&format=webp`;
const img = await fetch(url).then(r => r.arrayBuffer());
// After — SnapshotFlow
const url = `https://api.snapshotflow.com/screenshot?url=${encodeURIComponent(target)}&full_page=true&format=webp`;
const img = await fetch(url, { headers: { 'X-Api-Key': KEY } }).then(r => r.arrayBuffer());
If you depend on ScreenshotOne SDKs (Python, Node, PHP, Ruby, Go, Java, C#) the migration is a thin wrapper around fetch / requests — there is no first-party SDK on SnapshotFlow today, but the HTTP surface is straightforward enough that a 30-line wrapper covers 95% of usage.
When to stay on ScreenshotOne
Concrete reasons to stay on ScreenshotOne in 2026:
- You need scrolling videos right now. ScreenshotOne ships MP4 / WebM on the Growth tier (changelog). SnapshotFlow has this on the roadmap but not in production.
- You rely on the 7-language SDKs. If your team treats
screenshotone-pythonorscreenshotone-goas a managed dependency (SDK index), switching to raw HTTP is friction. SDKs are a roadmap item for SnapshotFlow. - Your no-code stack is built on the native Zapier / Make / Clay apps. SnapshotFlow works via the HTTP module in those tools, but native cards take five clicks instead of a config dialog.
- You need GPU rendering for WebGL-heavy pages. ScreenshotOne offers GPU rendering on the Scale tier (pricing). SnapshotFlow uses standard Chromium today.
- You depend on a third-party status page. ScreenshotOne publishes status.screenshotone.com; SnapshotFlow's public status page is not yet live.
If none of the above apply and at least one of the three deltas matters to your roadmap — agent integration, self-host, or built-in visual diff — SnapshotFlow becomes the more direct fit. If those deltas don't apply, ScreenshotOne is a reasonable choice to stay on.
FAQ
Is SnapshotFlow a real alternative to ScreenshotOne?
Yes. SnapshotFlow covers ScreenshotOne's core capture surface (full page, PDF, multi-format output, async + webhook, caching, ad / cookie blocking, geolocation) and adds three things ScreenshotOne does not ship: a Remote MCP server with screenshot, batch_screenshot, and visual_diff tools, a built-in /diff endpoint backed by pixelmatch, and a Docker Compose self-host.
How does SnapshotFlow pricing compare to ScreenshotOne?
ScreenshotOne starts at $17/month for 2,000 screenshots (Basic) and goes to $79 for 10,000 (Growth) and $259 for 50,000 (Scale). SnapshotFlow's free tier is 200 screenshots per month — double ScreenshotOne's 100 — and self-host removes the per-screenshot cost entirely for teams that want to bring their own Chromium.
Can I self-host SnapshotFlow?
Yes. The backend repository ships a Dockerfile and docker-compose.yml with Redis and 1 GB /dev/shm for Chrome. Configuration is via environment variables: AUTH_ENABLED, STORAGE_TYPE (local / s3 / gcs), REDIS_URL, and concurrency caps.
Does SnapshotFlow have visual regression / diff built in?
Yes. GET /diff returns a pixel-level diff image with a tunable threshold (0 to 1) using pixelmatch. ScreenshotOne expects you to capture two screenshots and run pixelmatch (or a paid tool such as Percy) yourself.
How do I migrate from ScreenshotOne to SnapshotFlow?
Change the base URL from api.screenshotone.com/take to api.snapshotflow.com/screenshot, swap ?access_key= for the X-Api-Key header (or ?api_key=), and leave most option names as-is. See the migration table in this article for the parameter map.
Does ScreenshotOne have a Remote MCP server today?
As of May 2026 ScreenshotOne publishes a /agents landing page but no public Remote MCP server, no MCP tool registry, and no WebMCP transport. SnapshotFlow ships an MCP server with three tools and OAuth 2.0 client registration.
Try SnapshotFlow if the deltas apply
The hosted free tier is 200 screenshots per month with no credit card. Self-host is available for teams that need to keep data inside their network. If your use case doesn't touch the agent / self-host / diff deltas above, ScreenshotOne's $17 Basic tier is a fine starting point too — both APIs interoperate with the same option names, so switching later is a base-URL swap.