Methodology

Ten steps. Same script, every provider.

Everything on this site trails back to one uniform run. Twenty real sites, one TLS-impersonating client, a concurrency ramp, SQLite-logged rows, and zero retries. If a number is not defensible against these steps, it does not ship.

Residential run · 2026-09-15 / 16 · 6 providers · ~2,400 requests each

The run

The residential protocol.

  1. 01

    Buy a real paid plan on every provider

    No free trials for the run. Every provider is on a paid plan so the pool, dashboards, and support behavior match what a paying customer actually sees. Cost per successful request is calculated from what I paid, not the marketing rate.

  2. 02

    Fix a 20-site probe set from a 61-site corpus

    Twenty real sites, tagged by bot-protection vendor (Akamai, Cloudflare, PerimeterX, unknown / none). No CDN proxies, no synthetic targets. The 61-site corpus is the wider inventory; 20 is what every provider gets tested against in a given uniform run.

  3. 03

    One transport client, every provider

    curl_cffi with Chrome TLS impersonation. Same fingerprint for every provider, so the network is the only variable. No headless browser, no Playwright: the aim is to measure what a residential IP + TLS handshake actually clears, not the browser tier.

  4. 04

    Ramp concurrency c1 / c4 / c8

    20 sessions per concurrency level per site. The ramp reveals per-site rate-limit thresholds the way a single level never can. Some providers (DataImpulse) also get c16 when the earlier levels stayed clean; most cap at c8.

  5. 05

    Log every request row to SQLite

    Per-request: outcome (success / block / timeout), latency, response bytes, egress IP, ASN, country. All aggregations (success rate, p50 / p95, timeout %) are computed from the row store. No spreadsheet math.

  6. 06

    Success definition: HTTP 200 with real HTML

    Not just a 200 status code: the body has to be real content, not a challenge page or an anti-bot interstitial. Block pages and JS challenges count as failure. If the reader could not read the page, the proxy did not deliver.

  7. 07

    Pool drain: 150 sequential egress checks

    A single-worker loop that fires 150 requests through the proxy and records every unique egress IP, ASN, country, and city. This is where rotation %, first-repeat position, and pool diversity come from.

  8. 08

    Geo probes on every country gateway

    50 requests per country gateway (au, ca, de, fr, gb, us, global) to measure gateway latency and egress-match %. Below 100% match means the geo tag is not fully respected, a real problem for location-sensitive scraping.

  9. 09

    No retries

    First response is the number. Retries would smooth over the timeouts and blocks that are the whole point of testing. If the proxy hangs on the first request, that hang gets counted.

  10. 10

    Publish reports and essays as a public git repo

    Every provider gets a JSON report (auto-rendered as the Residential Report tab) and a hand-written essay (the Review tab). Every change is a git commit; the commit message becomes the changelog entry. Nothing about the run is hidden or hand-editable after the fact.

What this does not cover yet

Honest gaps.

  • Mobile / ISP / dedicated-datacenter tiers: residential only for now. Each new tier ships as a new Report tab per provider when the data lands.
  • Sustained throughput: 5-minute steady runs at c10 are pending. The ramp catches per-site cliffs, not slow degradation.
  • Home-IP baseline lift: the same 20 sites from my home IP, so every provider's numbers can be expressed as a lift over the baseline. Pending Session-14.
  • SERP tools (Google / Bing / Yandex scrapers) and Web Scraping APIs: separate benchmarks, pending.

Each gap has a matching "coming soon" entry on the roadmap. Everything that lands becomes a git commit → changelog entry.