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.

SnapshotFlow vs ScreenshotOne — four deltas at a glance Diagram showing the four core feature deltas where SnapshotFlow and ScreenshotOne differ: MCP server, Docker self-host, built-in /diff endpoint, and free tier size. Four deltas where the products diverge Verified May 2026 against vendor pricing, docs, and changelog SnapshotFlow ScreenshotOne Remote MCP server Stdio + OAuth 2.0 (CIMD) YES NO Docker self-host docker-compose.yml + Redis YES NO /diff endpoint (pixelmatch) Single HTTP call with threshold YES DIY Free tier (screenshots / month) No credit card on either side 200 100
Figure 1. Four deltas at a glance — the rest of the article goes into each in detail, including where ScreenshotOne is ahead (SDKs, scrolling video, GPU rendering, native no-code apps).

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.
Summary: the two products overlap on the core capture surface; the decision hinges on three deltas — agent layer (MCP / WebMCP), self-host, and visual diff — plus what you give up on the ScreenshotOne side (SDKs, scrolling video, native no-code apps). The migration section shows how reversible the choice is.

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:

  1. 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 /agents landing but no Remote MCP server or WebMCP transport. SnapshotFlow ships both.
  2. 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 Dockerfile and docker-compose.yml that you can run in your VPC.
  3. Visual regression as a first-class endpoint. ScreenshotOne expects you to capture twice and diff yourself (or pay for Percy). SnapshotFlow ships a /diff endpoint backed by pixelmatch with 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

SnapshotFlowScreenshotOne
Hosted APIapi.snapshotflow.comapi.screenshotone.com [docs]
Self-host (Docker)✓ Docker Compose, OSS backend[pricing — hosted-only]
Free tier200 / month100 / 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]
SDKsHTTP REST + MCP tools (no language SDK yet)✓ C#, Python, Node.js, Ruby, PHP, Go, Java [SDK list]
No-code integrationsVia 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

FeatureSnapshotFlowScreenshotOne
Full page + viewport + element (selector)
PDF (A4 / A3 / Letter / Legal / Tabloid)✓ portrait + landscape, print_background
Output formatsPNG, JPEG, WebP, PDF, JSON, base64PNG, JPEG, WebP, PDF, JP2 (no JSON / no base64 by default)
HTML rendering (no URL)✓ inline html param
Image resize on captureimage_width, image_heightimage_width, image_height
Animated / scrolling MP4 / GIF / WebM— roadmapGrowth tier and above [changelog]
Batch in one callPOST /batch 1–10 URLs~ multiple async requests
Visual diff endpointGET /diff with pixelmatch threshold

Browser controls

FeatureSnapshotFlowScreenshotOne
Custom viewport (W / H / DPR)✓ 100–3840 × 100–2160, DPR 0.5–3
Mobile emulationviewport_mobile
Dark modedark_mode=truedark_mode=true
Reduced motionreduced_motionreduced_motion
Custom CSS / JS injectionstyles, scriptsstyles, scripts
Custom headers / cookies✓ JSON
Hide selectorshide_selectors (comma-separated)
Click before captureclickclick
Wait conditionswait_until, wait_for_selector, delay (0–10s)wait_until, wait_for_selector, delay
Element clippingclip_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

FeatureSnapshotFlowScreenshotOne
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 historyGET /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

FeatureSnapshotFlowScreenshotOne
Remote MCP server✓ Stdio MCP, OAuth 2.0 + CIMD client registration
MCP tools exposedscreenshot, 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

FeatureSnapshotFlowScreenshotOne
Self-hostDockerfile + docker-compose.yml + Redis
Storage backends (self-host)✓ local / S3 / GCS via STORAGE_TYPEn/a — hosted only
Auth methodsBearer JWT, X-Api-Key header, ?api_key= query, OAuth 2.0 (MCP)?access_key= query, signed requests
Quota headers on every responseX-Quota-Used / -Limit / -Remaining~ dashboard
Official language SDKs— (HTTP + MCP only)✓ 7 SDKs: C#, Python, Node.js, Ruby, PHP, Go, Java
No-code integrationsVia Zapier / Make / n8n HTTP module✓ native Zapier, Make, n8n, Clay
GPU rendering✓ Scale tier ($259/mo) [pricing]
Public status pagestatus.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.

TierScreenshotOne [source]SnapshotFlow (hosted)SnapshotFlow (self-host)
Free100 screenshots / month, all features200 screenshots / monthUnlimited on your own hardware
Entry paid$17 / mo — 2,000 screenshots, 40 req/min, $0.009 overageRolling outCompute cost only (VPS + Redis)
Growth$79 / mo — 10,000 screenshots, 80 req/min, $0.006 overage, scrolling + videosRolling out
Scale$259 / mo — 50,000 screenshots, 150 req/min, $0.004 overage, GPU rendering, priority supportRolling out
Self-host licenseOSS — 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.

Monthly cost by volume — ScreenshotOne hosted vs SnapshotFlow self-host Bar chart comparing monthly cost at 2,000, 10,000, 50,000 and 200,000 screenshots per month. ScreenshotOne values are taken from screenshotone.com/pricing. SnapshotFlow self-host values are an illustrative VPS cost — actual cost depends on your hardware. Monthly cost by volume (US$) ScreenshotOne pricing tiers (May 2026) vs an illustrative SnapshotFlow self-host VPS cost. ScreenshotOne hosted SnapshotFlow self-host $0 $80 $160 $260 $17 $8 2,000/mo Basic $79 $20 10,000/mo Growth $259 $60 50,000/mo Scale $259+ overage $140 200,000/mo Scale + overage SnapshotFlow self-host numbers are illustrative VPS costs (Hetzner CPX31 class + Redis), not a vendor invoice. Real cost depends on concurrency, region, and storage backend.
Figure 2. ScreenshotOne hosted tiers vs an illustrative SnapshotFlow self-host VPS cost at four volume points. Self-host crosses ScreenshotOne Basic in cost-effectiveness around 10k+ shots/month once you amortise the operations work.

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 wantScreenshotOneSnapshotFlow
Base URLapi.screenshotone.com/takeapi.snapshotflow.com/screenshot
Auth?access_key=…X-Api-Key: header or ?api_key=…
Full-page capturefull_page=truefull_page=true
Formatformat=webpformat=webp
Viewportviewport_width, viewport_heightviewport_width, viewport_height
Device scaledevice_scale_factordevice_scale_factor
GeolocationGrowth tier IP locationgeolocation_latitude, geolocation_longitude, geolocation_accuracy
Block ads / cookie bannersblock_ads, block_cookie_bannersblock_ads, block_cookie_banners, block_trackers
Wait conditionsdelay, wait_until, wait_for_selectordelay, wait_until, wait_for_selector
Hide elementshide_selectorshide_selectors
Click before captureclickclick
Custom CSS / JSstyles, scriptsstyles, scripts
Async + webhookasync=true, webhook_urlasync=true, webhook_url (HMAC signed, SSRF-validated)
Cachingon by defaultcache=true (default), free on hit
Response shapeimage by default, JSON via response_typeresponse_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-python or screenshotone-go as 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.