Compare web access APIs (web unblockers / scrape APIs) head-to-head against a fixed suite of 99
real-world, bot-protected URLs spanning 16 industries (Amazon, Walmart, Zillow, Cloudflare/PerimeterX-guarded
retail and travel sites, etc. — see Target sites for the full list). Each provider is sent
the same URLs; a request passes when the API returns a 2xx status and the response body contains
the page's expected text.
Read the full write-up: The Web Scraping Benchmark Problem.
Official run: August 11, 2026 (99 targets × 5 attempts × 15 providers = 7,425 requests;
raw data in official_results/benchmark-2026-08-11T22-44-25-322Z.json).
These numbers predate the current adapter configurations. Six adapters ran below the strongest proxy tier their API offers when this run was collected. ScrapingBee is the one to discount hardest: it was fetched from the default datacenter pool with no
premium_proxyorstealth_proxy, which is the weakest anti-bot posture of any provider in the table. The adapters have since been corrected; the table has not been re-collected. Treat the ranking as stale until a re-run replaces it.
| Rank | Provider | Success rate | Latency score | Passed |
|---|---|---|---|---|
| 1 | string | 97.0% | 9.98s | 480/495 |
| 2 | scrapfly | 82.0% | 18.35s | 406/495 |
| 3 | context_dev | 79.2% | 12.68s | 392/495 |
| 4 | firecrawl | 78.6% | 9.21s | 389/495 |
| 5 | bright | 78.0% | 26.14s | 386/495 |
| 6 | oxylabs | 76.8% | 14.67s | 380/495 |
| 7 | zyte | 72.7% | 14.85s | 360/495 |
| 8 | decodo | 70.7% | 22.63s | 350/495 |
| 9 | nimble | 66.3% | 18.41s | 328/495 |
| 10 | scraperapi | 64.2% | 13.65s | 318/495 |
| 11 | scrapingdog | 54.3% | 12.51s | 269/495 |
| 12 | browserbase | 42.2% | 14.19s | 209/495 |
| 13 | zenrows | 34.3% | 17.60s | 170/495 |
| 14 | scrapingant | 30.7% | 16.08s | 152/495 |
| 15 | scrapingbee | 29.7% | 16.97s | 147/495 |
Latency is an equal-weighted average across target URLs. For a provider that returns verified content,
the target score is the nearest-rank 75th percentile of its successful attempt latencies; failed attempts
do not contribute a fast response time. For a provider with no verified-content response for a target, the
score is the nearest-rank 75th percentile of the successful providers' target scores. If nobody succeeds
on a target, the score is the benchmark's 90-second timeout. Nearest-rank p75 uses
ceil(0.75 × n): one successful value uses that value, two use the slower value, and five use the fourth
value after sorting fastest to slowest.
The CLI's per-provider, per-target output labels the value included in the leaderboard as Resolved latency
and identifies whether it came from successful attempts, successful providers, or the timeout.
- Test suite (
src/tests.const.ts): each fixture is{ name, url, antibot?, industry?, containsText? }. See Target sites. - Providers (
src/providers/*.ts): one thin adapter per service that fetches a URL through that provider's API and returns{ body, statusCode }. - Runner (
src/runner.ts): runs every test × N attempts per provider with bounded concurrency, then aggregates success rate and latency. - A provider only runs when all of its API keys are present in
.env.
# 1. Install
npm install # or: bun install
# 2. Configure keys
cp .env.example .env # then fill in keys for the providers you want to test
# 3. Run
npm run benchmark # Node (tsx)
# or
bun run src/cli.ts # Bun
# Recalculate a report from stored results without sending provider requests
npm run analyze -- --in official_results/benchmark-2026-08-11T22-44-25-322Z.json --out results/recalculated-latency.txtA smoke test against a single provider and a single fixture:
npm run benchmark -- --providers scrapfly --tests amazon --attempts 1| Option | Description |
|---|---|
--providers <a,b> |
Only run these providers (default: all with keys set) |
--tests <a,b> |
Only run these fixtures by name (default: all) |
--attempts <n> |
Attempts per test (default: 5) |
--concurrency <n> |
Parallel requests per provider (default: 2) |
--provider-concurrency <n> |
Providers to benchmark at once (default: 15) |
--out <file> |
Results JSON path (default: results/benchmark-<timestamp>.json) |
--report-out <file> |
Rendered report path (default: results path with .txt) |
-h, --help |
Show help |
Each benchmark run writes the full structured results (every attempt) to JSON and its comparison leaderboard
plus per-provider, per-test breakdown to a companion text report. Use --report-out to choose another path.
Recalculate the current scoring from a stored benchmark JSON file without calling providers:
npm run analyze -- --in official_results/benchmark-2026-08-11T22-44-25-322Z.json --out results/recalculated-latency.txt| Option | Description |
|---|---|
--in, --input <file> |
Benchmark results JSON to analyze |
--out <file> |
Rendered report path (default: results/analysis-<timestamp>.txt) |
-h, --help |
Show help |
| Provider | Required .env var(s) |
|---|---|
| bright (Bright Data Web Unblocker) | BRIGHT_API_KEY + BRIGHT_ZONE |
| zyte | ZYTE_API_KEY |
| scrapfly | SCRAPFLY_API_KEY |
| scraperapi | SCRAPERAPI_API_KEY |
| scrapingant | SCRAPINGANT_API_KEY |
| scrapingbee | SCRAPINGBEE_API_KEY |
| scrapingdog | SCRAPINGDOG_API_KEY |
| zenrows | ZENROWS_API_KEY |
| oxylabs | OXYLABS_WEB_UNBLOCKER_CREDENTIALS (username:password) |
| firecrawl | FIRECRAWL_API_KEY |
| massive | MASSIVE_API_KEY |
| decodo | DECODO_API_KEY |
| nimble | NIMBLE_API_KEY |
| context_dev | CONTEXT_DEV_API_KEY |
| browserbase | BROWSERBASE_API_KEY |
| string | STRING_API_KEY |
import {
PROVIDERS,
makeExecutor,
runWebAccessBenchmarkSuite,
WEB_ACCESS_ALL_TESTS,
WEB_ACCESS_BENCHMARK_CONFIG,
} from "web-data-frontier-benchmark";
const scrapfly = PROVIDERS.find((p) => p.name === "scrapfly")!;
const result = await runWebAccessBenchmarkSuite(WEB_ACCESS_ALL_TESTS, makeExecutor(scrapfly), WEB_ACCESS_BENCHMARK_CONFIG, "scrapfly");
console.log(result.overallSuccessRate);Read CONTRIBUTING.md before opening a pull request. Maintainers approve provider configuration changes from external contributors only after verifying current affiliation with the affected provider's company, unless a repository maintainer explicitly takes responsibility for the change.
- Create
src/providers/<name>.tsexporting aProvider(name,envKeys,fetch). - Register it in the
PROVIDERSarray insrc/providers/index.ts. - Document its key in
.env.exampleand the table above.
- All requests carry a per-attempt timeout (default 90s). The runner enforces it with an
AbortController; adapters built on an SDK that takes no signal pass the same value as a client-side socket deadline instead. - Each provider is sent the strongest anti-bot configuration its public API offers: the best proxy pool
the vendor sells, plus any explicit stealth or bypass switch. JS rendering is a separate axis and is not
part of the bypass, so it stays off wherever the vendor allows both and every provider is compared on the
same artifact. ScrapingBee uses Auto Mode with
max_cost: 75, letting the vendor choose the proxy pool and rendering; ZenRows and Decodo render because their adapters predate this note. - Rendering is mostly not the bypass. Among the seven caller-selected providers — the ones whose adapter sets the flag, so we know what was requested — 12 of the 99 targets were passed by an unrendered provider alone, against 2 passed by a rendering provider alone. Requiring a majority of attempts makes it 15 against 4; requiring all five, 20 against 6. So rendering earns its place on a handful of targets and costs on most. Bot protection keys on IP reputation and TLS fingerprint before it looks at content, so a headless browser mostly buys cost, latency and one more thing to fingerprint — and latency is a scored column here. A more expensive tier is not automatically a stronger one. Providers that choose rendering server-side are excluded from this comparison; they cannot be sorted into either column without guessing.
- In the recorded run, providers fell into two groups, and the distinction matters when reading the numbers:
- Caller-selected tier. ScrapingBee, ScraperAPI, ScrapingAnt, Scrapingdog, ZenRows, Decodo and Scrapfly expose the proxy pool as a request parameter. Each adapter pinned the top pool, so every attempt started there rather than escalating into it after a block. ScrapingBee now uses Auto Mode and belongs to the server-side escalation group for future runs.
- Server-side escalation. Zyte, Nimble, Firecrawl, Bright Data, Oxylabs, Context.dev, Browserbase and String decide the bypass strategy themselves. The adapter asks for the strongest mode it can name and the vendor picks the rest, so the configuration is not fully observable from this repo. Because String is in the second group, its result reflects our own server-side routing and is not parameter-comparable with a pinned-tier provider. Read it as the service's default behaviour.
- See the per-file comments for the exact request shape and the credit cost it implies.
- Running the full suite across many providers makes real, billable API calls. Start with
--attempts 1and a small--testssubset. - Yeah much vibecoding (so catch the AI-isms) but we did read all of the code + verify :)
The suite is 99 domains, one target URL each, defined in src/tests.const.ts.
Every provider is sent this same list, in the order below. Site is the fixture name --tests
accepts. Industry is the fixture's industry field, an editorial grouping of the suite by the kind
of data behind the URL; every target carries exactly one. Anti-bot is the fixture's antibot field;
Not classified means the fixture carries no antibot value, not that the site is unprotected.
Vendor spread: Akamai Bot Manager 20, DataDome 20, Cloudflare 15, PerimeterX / HUMAN 9, In-house / custom 9, AWS WAF 7, Kasada 3, Fastly Bot Management 1, Imperva Incapsula 1, Temu (in-house) 1, Ticketmaster (in-house) 1, Not classified 12.
Industry spread: Retail & ecommerce 16, Fashion & luxury 11, Marketplaces & classifieds 10, Travel 9, News & finance 9, Social media 8, Real estate 7, Reviews & local 6, Jobs & hiring 5, Grocery & food 5, Tickets & events 4, Developer & research 3, Search engines 2, Gaming & betting 2, Health & pharmacy 1, Government 1.
| # | Site | Domain | Target URL | Industry | Anti-bot |
|---|---|---|---|---|---|
| 1 | allegro | allegro.pl | link | Marketplaces & classifieds | DataDome |
| 2 | Amazon | www.amazon.com | link | Retail & ecommerce | AWS WAF |
| 3 | canadagoose | www.canadagoose.com | link | Fashion & luxury | Kasada |
| 4 | indeed | www.indeed.com | link | Jobs & hiring | Cloudflare |
| 5 | lowes | www.lowes.com | link | Retail & ecommerce | Akamai Bot Manager |
| 6 | safeway | www.safeway.com | link | Grocery & food | Imperva Incapsula |
| 7 | walmart | www.walmart.com | link | Retail & ecommerce | PerimeterX / HUMAN |
| 8 | zillow | www.zillow.com | link | Real estate | PerimeterX / HUMAN |
| 9 | saksfifthavenue | www.saksfifthavenue.com | link | Fashion & luxury | DataDome |
| 10 | neimanmarcus | www.neimanmarcus.com | link | Fashion & luxury | DataDome |
| 11 | g2 | www.g2.com | link | Reviews & local | DataDome |
| 12 | aa | www.aa.com | link | Travel | Akamai Bot Manager |
| 13 | asda | www.asda.com | link | Grocery & food | Cloudflare |
| 14 | lululemon | shop.lululemon.com | link | Fashion & luxury | Akamai Bot Manager |
| 15 | hyatt | www.hyatt.com | link | Travel | Kasada |
| 16 | macys | www.macys.com | link | Fashion & luxury | Akamai Bot Manager |
| 17 | etsy | www.etsy.com | link | Marketplaces & classifieds | DataDome |
| 18 | yelp | www.yelp.com | link | Reviews & local | DataDome |
| 19 | zara | www.zara.com | link | Fashion & luxury | Akamai Bot Manager |
| 20 | louisvuitton | us.louisvuitton.com | link | Fashion & luxury | Akamai Bot Manager |
| 21 | autozone | www.autozone.com | link | Retail & ecommerce | DataDome |
| 22 | homedepot | www.homedepot.com | link | Retail & ecommerce | Akamai Bot Manager |
| 23 | ashleyfurniture | www.ashleyfurniture.com | link | Retail & ecommerce | PerimeterX / HUMAN |
| 24 | autotrader | www.autotrader.com | link | Marketplaces & classifieds | Akamai Bot Manager |
| 25 | booking.com | www.booking.com | link | Travel | AWS WAF |
| 26 | carters | www.carters.com | link | Fashion & luxury | PerimeterX / HUMAN |
| 27 | databricks | www.databricks.com | link | Jobs & hiring | Not classified |
| 28 | emag | www.emag.ro | link | Retail & ecommerce | AWS WAF |
| 29 | expedia | www.expedia.com | link | Travel | Akamai Bot Manager |
| 30 | glassdoor | www.glassdoor.com | link | Jobs & hiring | Cloudflare |
| 31 | marketwatch | www.marketwatch.com | link | News & finance | DataDome |
| 32 | barrons | www.barrons.com | link | News & finance | DataDome |
| 33 | monster | www.monster.com | link | Jobs & hiring | DataDome |
| 34 | mouser | www.mouser.com | link | Retail & ecommerce | Akamai Bot Manager |
| 35 | nytimes | www.nytimes.com | link | News & finance | DataDome |
| 36 | ralphlauren | www.ralphlauren.com | link | Fashion & luxury | PerimeterX / HUMAN |
| 37 | realtor | www.realtor.com | link | Real estate | AWS WAF |
| 38 | tripadvisor | www.tripadvisor.com | link | Travel | DataDome |
| 39 | wsj | www.wsj.com | link | News & finance | DataDome |
| 40 | bloomberg | www.bloomberg.com | link | News & finance | PerimeterX / HUMAN |
| 41 | reuters | www.reuters.com | link | News & finance | DataDome |
| 42 | alibaba | www.alibaba.com | link | Retail & ecommerce | Not classified |
| 43 | coupang | www.coupang.com | link | Retail & ecommerce | Akamai Bot Manager |
| 44 | ebay | www.ebay.com | link | Marketplaces & classifieds | Akamai Bot Manager |
| 45 | target | www.target.com | link | Retail & ecommerce | PerimeterX / HUMAN |
| 46 | nike | www.nike.com | link | Fashion & luxury | Akamai Bot Manager |
| 47 | stockx | stockx.com | link | Marketplaces & classifieds | Cloudflare |
| 48 | cargurus | www.cargurus.com | link | Marketplaces & classifieds | DataDome |
| 49 | cars.com | www.cars.com | link | Marketplaces & classifieds | Cloudflare |
| 50 | crunchbase | www.crunchbase.com | link | Reviews & local | Cloudflare |
| 51 | verizon | www.verizon.com | link | Retail & ecommerce | Akamai Bot Manager |
| 52 | att | www.att.com | link | Retail & ecommerce | Akamai Bot Manager |
| 53 | goodrx | www.goodrx.com | link | Health & pharmacy | PerimeterX / HUMAN |
| 54 | www.linkedin.com | link | Social media | In-house / custom | |
| 55 | X (Twitter) | x.com | link | Social media | In-house / custom |
| 56 | www.instagram.com | link | Social media | In-house / custom | |
| 57 | Ticketmaster | www.ticketmaster.com | link | Tickets & events | Ticketmaster (in-house) |
| 58 | Capterra | www.capterra.com | link | Reviews & local | Cloudflare |
| 59 | www.reddit.com | link | Social media | In-house / custom | |
| 60 | Google Search | www.google.com | link | Search engines | In-house / custom |
| 61 | YouTube | www.youtube.com | link | Social media | In-house / custom |
| 62 | TikTok | www.tiktok.com | link | Social media | In-house / custom |
| 63 | Airbnb | www.airbnb.com | link | Travel | DataDome |
| 64 | Best Buy | www.bestbuy.com | link | Retail & ecommerce | Akamai Bot Manager |
| 65 | Redfin | www.redfin.com | link | Real estate | AWS WAF |
| 66 | Foot Locker | www.footlocker.com | link | Fashion & luxury | Kasada |
| 67 | SeatGeek | seatgeek.com | link | Tickets & events | DataDome |
| 68 | www.facebook.com | link | Social media | In-house / custom | |
| 69 | GOAT | www.goat.com | link | Marketplaces & classifieds | Cloudflare |
| 70 | Yahoo Finance | finance.yahoo.com | link | News & finance | Not classified |
| 71 | DigiKey | www.digikey.com | link | Retail & ecommerce | Cloudflare |
| 72 | Rightmove | www.rightmove.co.uk | link | Real estate | Not classified |
| 73 | Instacart | www.instacart.com | link | Grocery & food | Not classified |
| 74 | www.pinterest.com | link | Social media | In-house / custom | |
| 75 | ZipRecruiter | www.ziprecruiter.com | link | Jobs & hiring | Cloudflare |
| 76 | Vinted | www.vinted.fr | link | Marketplaces & classifieds | DataDome |
| 77 | Idealista | www.idealista.com | link | Real estate | DataDome |
| 78 | Leboncoin | www.leboncoin.fr | link | Marketplaces & classifieds | DataDome |
| 79 | StubHub | www.stubhub.com | link | Tickets & events | AWS WAF |
| 80 | Skyscanner | www.skyscanner.net | link | Travel | PerimeterX / HUMAN |
| 81 | Congress.gov | www.congress.gov | link | Government | Cloudflare |
| 82 | TradingView | www.tradingview.com | link | News & finance | Not classified |
| 83 | CoinMarketCap | coinmarketcap.com | link | News & finance | Not classified |
| 84 | Apartments.com | www.apartments.com | link | Real estate | Akamai Bot Manager |
| 85 | Zoopla | www.zoopla.co.uk | link | Real estate | Cloudflare |
| 86 | Trustpilot | www.trustpilot.com | link | Reviews & local | AWS WAF |
| 87 | Yellow Pages | www.yellowpages.com | link | Reviews & local | Cloudflare |
| 88 | Kayak | www.kayak.com | link | Travel | Not classified |
| 89 | Allmenus | www.allmenus.com | link | Grocery & food | Not classified |
| 90 | temu | www.temu.com | link | Retail & ecommerce | Temu (in-house) |
| 91 | delta | www.delta.com | link | Travel | Akamai Bot Manager |
| 92 | kroger | www.kroger.com | link | Grocery & food | Akamai Bot Manager |
| 93 | axs | www.axs.com | link | Tickets & events | Cloudflare |
| 94 | roblox | www.roblox.com | link | Gaming & betting | Fastly Bot Management |
| 95 | draftkings | sportsbook.draftkings.com | link | Gaming & betting | Akamai Bot Manager |
| 96 | bing | www.bing.com | link | Search engines | Not classified |
| 97 | github | github.com | link | Developer & research | Not classified |
| 98 | stackoverflow | stackoverflow.com | link | Developer & research | Cloudflare |
| 99 | arxiv | arxiv.org | link | Developer & research | Not classified |