ScraperAPI vs ScrapingBee: saved benchmark observations
Both passed the same standard content checks on 30/36 attempts in this small snapshot. These results do not establish a universal winner.
Choosing an API? Start with the target and rendering mode below, then test your own authorized workload. Latency differences here describe sequential captures, not a controlled speed comparison.
Visit ScraperAPI · Visit ScrapingBee · All API benchmark vendors
Affiliate disclosure: the ScraperAPI link is an affiliate link; we may earn a commission at no extra cost to you. This does not change the observations or their presentation.
Standard requests: plain and JS kept distinct below
| Vendor | Content-validated / attempts | Failures | HTTP 200 | Median / P90 seconds |
|---|---|---|---|---|
| ScraperAPI | 30/36 (83.3%) | 6 | 30 | 6.08 / 55.97 |
| ScrapingBee | 30/36 (83.3%) | 6 | 30 | 1.60 / 5.28 |
Standard totals use the same target mix and all eligible attempts, including failures. The per-target table preserves plain (rendering off) and js (rendering on). No scrolling or button clicks were performed.
| Target | Mode | ScraperAPI valid / attempts; failures | Median / P90 s | ScrapingBee valid / attempts; failures | Median / P90 s |
|---|---|---|---|---|---|
| books | plain | 3/3 (100.0%); 0 failures | 4.31 / 6.24 | 3/3 (100.0%); 0 failures | 0.82 / 1.28 |
| books-page-2 | plain | 3/3 (100.0%); 0 failures | 1.98 / 3.42 | 3/3 (100.0%); 0 failures | 0.86 / 2.30 |
| course-antibot | js | 0/3 (0.0%); 3 failures | 55.97 / 56.31 | 0/3 (0.0%); 3 failures | 4.21 / 5.28 |
| course-cloudflare | js | 0/3 (0.0%); 3 failures | 56.05 / 56.31 | 0/3 (0.0%); 3 failures | 7.56 / 9.77 |
| course-ecommerce | plain | 3/3 (100.0%); 0 failures | 1.23 / 1.24 | 3/3 (100.0%); 0 failures | 1.22 / 1.38 |
| course-infinite | js | 3/3 (100.0%); 0 failures | 10.09 / 17.28 | 3/3 (100.0%); 0 failures | 2.24 / 3.42 |
| course-load-more | js | 3/3 (100.0%); 0 failures | 8.71 / 9.15 | 3/3 (100.0%); 0 failures | 1.94 / 2.10 |
| httpbin | plain | 3/3 (100.0%); 0 failures | 3.93 / 12.39 | 3/3 (100.0%); 0 failures | 0.68 / 2.60 |
| quotes | plain | 3/3 (100.0%); 0 failures | 5.83 / 8.14 | 3/3 (100.0%); 0 failures | 0.72 / 10.51 |
| quotes-js | js | 3/3 (100.0%); 0 failures | 8.12 / 20.52 | 3/3 (100.0%); 0 failures | 1.93 / 3.01 |
| quotes-page-2 | plain | 3/3 (100.0%); 0 failures | 5.60 / 5.92 | 3/3 (100.0%); 0 failures | 0.82 / 2.05 |
| wikipedia | plain | 3/3 (100.0%); 0 failures | 1.65 / 5.53 | 3/3 (100.0%); 0 failures | 0.38 / 0.60 |
Premium: availability limits the comparison
| Vendor | Eligible attempts | Validated / evaluable | Failures | Unavailable | HTTP 200 content failures | Median / P90 s |
|---|---|---|---|---|---|---|
| ScraperAPI | 4 | n/a (no evaluable attempts) | 0 | 4 | 0 | 0.32 / 0.38 |
| ScrapingBee | 2 | 0/2 (0.0%) | 2 | 0 | 2 | 56.25 / 75.33 |
ScraperAPI premium returned HTTP 403 and was recorded as unavailable on the trial plan; this does not measure paid premium performance. ScrapingBee premium returned HTTP 200 but failed the expected-text check on both challenge targets. HTTP 200 alone is not a content-validated success. Premium enables JS plus ScrapingBee stealth proxies or ScraperAPI ultra-premium proxies; these options are not identical products.
Premium latency includes eligible failures and unavailable responses, so it is not a usable-result speed comparison. The two older ScrapingBee premium timeouts used a 60-second limit rather than the current 150-second limit; they are retained in the download and explicitly excluded from comparable metrics. Their ScraperAPI records remain as unavailable attempts, not successes or evaluated failures.
Window, method and limits
Frozen evidence dated 2026-10-19. Common UTC window: 2026-10-18T00:00:00+00:00 inclusive to 2026-10-19T05:08:06.276135+00:00 exclusive, ending at the saved summary generation time. Recorded run dates: 2026-10-18 and 2026-10-19. Eligible capture ranges (UTC):
- ScraperAPI: 2026-10-18T19:01:41.675596+00:00 to 2026-10-19T05:05:43.565271+00:00.
- ScrapingBee: 2026-10-18T19:00:51.648669+00:00 to 2026-10-19T05:02:31.531620+00:00.
Match on target ID, exact URL and exact mode across both vendors, then retain every eligible attempt in that window regardless of outcome. This snapshot contains 94 input records; 78 eligible matched attempts remain after 14 other-vendor records and 2 legacy premium timeouts are excluded. Per-stratum denominators are shown above; unavailable attempts have no evaluable success rate. No observations means unavailable, never 0%.
Content-validated success requires HTTP 2xx plus the recorded expected visible-text match after ignoring script/style text. These checks are not proof of semantic correctness, complete extraction, or successful scrolling. Saved bodies are unavailable for revalidation; this analysis uses the saved validation flags and current saved target definitions. The download lists exact target URLs and expected strings.
Latency is client-observed elapsed seconds over all eligible matched attempts in each displayed stratum or mode group, including failures and unavailable responses. P90 uses nearest rank. Runs were sequential, with differing capture times and no randomization or synchronized pairs. The tiny samples, repeated targets, trial plans, vendor-internal retries and changing target conditions limit inference; there are no confidence or production reliability claims.
Cost per content-validated result: unknown for both vendors. No dated retail pricing and billed-mode assumptions support a comparable dollar calculation here. Reported trial credits are not a retail bill.
Use only on sites and data you are authorized to access, and comply with applicable terms. This benchmark uses purpose-built test pages plus the saved Wikipedia and httpbin targets described in the runner documentation.
Download dated evidence JSON with denominators, exclusions, provenance and input SHA-256 hashes, original saved observations, offline comparison script and target definitions. Reproduction instructions and source paths are in the local review note.