01Weekly web scraping benchmarkTRACE (Transparent Real-world Assessment of Content Extraction)
How reliably can web scrapers read a page?
Every Friday we send a new fresh sample of about 2,500 web pages to context.dev, Exa, Firecrawl, and Keenable. We publish how often each one gets through, how fast it answers, whether it returns the right page, what it costs, and why it fails.
Key findings · Nov 7, 2026 sample
- context.dev accessed the most pages, 94.4%. It led Firecrawl by 1.6 points across 2,527 shared pages, a statistically significant gap.
- context.dev leads in news. Keenable leads in jobs. The top two are statistically tied in 7 categories.
- Exa answers fastest at the median, 1.17 s. context.dev has the shortest slow tail: 95% of its requests finish within 10.8 s.
- 53 pages defeated every provider. Most came from jobs, Wikipedia links, and research pages.
- pages, each sent to all four providers
- 2,527
- categories, weighted equally
- 9
- samples scored since Nov 4
- 4
02Leaderboard
Pages accessed
What counts as accessed
How to read the ranges
context.dev runs this benchmark and is one of the providers tested. See the methodology for scoring rules and limitations.
03Head-to-head
Same pages, paired
Missed it →context.devFirecrawlKeenableExa
Pair verdicts
- context.dev vs Firecrawl103 to 58context.dev ahead
- context.dev vs Keenable117 to 57context.dev ahead
- context.dev vs Exa311 to 55context.dev ahead
- Firecrawl vs Keenable125 to 110Tied
- Firecrawl vs Exa297 to 86Firecrawl ahead
- Keenable vs Exa280 to 84Keenable ahead
A pair is called only when an exact McNemar test on the pages the two disagree on passes at the 95% level. Requests rejected by our own account limits are left out of both sides.
04Categories
Results by category
In the table, black marks the highest rate in each row. “No provider” counts sample pages that all four failed. A verdict compares the top two providers in that category with a paired test on the same pages; “Tied” means the gap is within the noise. Categories hold up to 300 pages each.
05Latency
How long a page takes
Requests that hit the deadline
How we measure
06Quality
From response to useful page
- Returned content
- The provider answered with text before the deadline.
- Page accessed
- The text is real page data, not a block or error screen.
- Right page
- It is the requested document, not a homepage or a different item.
- Substantive
- It holds the page's main content, not just a title or navigation.
Right-page and substantive-content grades are not available for this sample yet, so the chart stops at the stages that are graded.
| Provider | Right page | Substantive | Ended on another page | Median length | Length vs. other providers |
|---|---|---|---|---|---|
| context.dev | — | — | 9.5% | 7,773 chars | 1.16× |
| Firecrawl | — | — | 10.2% | 12,482 chars | 1.69× |
| Keenable | — | — | 9.6% | 5,059 chars | 1.00× |
| Exa | — | — | 0.0% | 4,872 chars | 1.00× |
“Ended on another page” compares the final URL with the requested one, ignoring the scheme, “www.”, query strings, and trailing slashes. Length compares each provider with the median length across providers that returned the same page. context.dev and Firecrawl request main content only while Exa returns full text, so length is a signal, not a score.
07Cost
What a page costs
Each provider's published monthly price for roughly 100,000 pages, billed monthly. Volume discounts, annual billing, and free tiers change the result. Prices checked Nov 5, 2026. context.dev and Keenable say they do not bill failed requests, so their cost per accessed page equals their request price. * Exa and Firecrawl do not say, so we assume failed requests are billed. Keenable's first 100,000 requests each month are free.
08Failures
Why pages fail
Bars show the share of all scored pages each provider failed to access. Hover a segment for the count. Provider-reported failures and missed deadlines count as failures, even when the provider did not return an error code. Wrong documents and thin pages count as accessed and appear under Quality.
09History
Sample results over time
November 4, 2026 – November 7, 2026 4 sampled days
Showing the latest completed sample by default. Hover to preview a day; click, touch or use the arrow keys to keep it selected. Gaps are not estimated.
November 7, 2026 UTC
Page access · 2,527 pages
- context.dev
- 94.4%
- Exa
- 84.9%
- Firecrawl
- 92.9%
- Keenable
- 92.3%
Reading the sample history
Same evidence, new rules
10Sample & sources
Where the pages come from
- Discover. During weekly collection we poll due publisher feeds, job boards, SEC and Federal Register listings, and sitemaps for new URLs. Wikipedia edits from the previous UTC day are checked before each sample for new external links.
- Sample. Every Friday at 00:15 UTC we draw up to 300 previously unseen pages per category, with at most 125 from one organization and 375 from one website.
- Freeze. The sample is locked and sent to all four providers with caching turned off for every one.
- Grade. A blind judge reads each response. Every URL, verdict, and timing is published in the page-level data.
| Category | Sources | Examples |
|---|---|---|
| News | 29 | BBC, NPR, Al Jazeera, CNBC |
| Commerce | 6 | Allbirds, Bombas, Gymshark, Vuori |
| Jobs | 23 | Stripe, Anthropic, Spotify, Cloudflare |
| Finance | 20 | SEC filings, Federal Reserve |
| Research | 17 | arXiv, PLOS, Nature, eLife |
| Legal & government | 37 | Federal Register, UK legislation, FTC |
| Software & docs | 31 | VS Code, Rust, Kubernetes, PostgreSQL |
| Community | 34 | Hacker News, Stack Overflow, Bluesky |
| Other | 1 | New external links on English Wikipedia |
Source examples by category
These feeds, APIs, and sitemaps supply the URLs for the weekly sample. We follow those links and test whether each provider can recover content from the destination page. We assign each page the category of the source that supplied it. Pages are new to the benchmark, but may have been published earlier.
- News
- Publisher articles · BBC feed ↗
- Commerce
- Product pages · Allbirds sitemap ↗
- Jobs
- Individual job postings · Stripe job API ↗
- Finance
- Company filings and financial releases · Apple SEC filings ↗
- Research
- Papers and scholarly articles · Nature feed ↗
- Legal & government
- Rules, notices and official records · Federal Register API ↗
- Software & docs
- Release notes and documentation · VS Code releases API ↗
- Community
- Discussion threads and social posts · Stack Overflow API ↗
These are configured discovery sources, not a guarantee that every source contributes to every sample.
11Methodology
How the benchmark works
How scores are calculated
A page counts as accessed when actual page data or file content loaded. A partial preview, populated listing, publication landing page, or raw file can pass. Blocks, mandatory login screens, main-page errors, and empty shells fail when they contain no page data. Relevance, document identity, completeness, and extraction quality are not part of the access score; they are reported separately under Quality. We calculate the percentage of accessed pages within each category, then average those percentages, so every category has the same influence regardless of its page count. Failed requests, unresolved judgments, and pending results remain in the denominator and lower the score. Requests rejected by our own account limits (HTTP 401, 402, or 429, or exhausted credits) are excluded from that provider's score and listed separately; they are not retried, so no provider gets a second attempt at a page.
The ± range is a 95% confidence interval for the category-weighted score. Rankings use an exact McNemar test on the pages two providers disagree on; providers that do not differ at the 95% level share a place.
For the current selection, 9 provider results remain unresolved and 0 are pending. These results count against the score until access is confirmed.
The judge, and how we audit it
TypeSafe's Jev 1.13.0 model grades up to 12,000 characters taken from the beginning, middle, and end of each response. For the access score it sees only that text and whether it was sampled, never the provider name or the requested URL. Unclear evidence and judge failures stay unresolved rather than being guessed. Document and content grades for the Quality section use a separate judge call that also sees the requested URL, title, and category, still without the provider name.
Each week we hand-check a random sample of judged pages. Reviewers see the requested URL and the same evidence as the judge, but not the provider or the judge's verdict. No audit has been published for this scoring rule yet; agreement will appear here once it has.
Fresh content and cache checks
Every request asks for a fresh fetch, and every response is checked for the provider's own record of where the content came from. A response that a provider marks as served from cache is left out of the scores and latency instead of being counted as a success.
| Provider | Fresh-content setting | Response field checked |
|---|---|---|
| context.dev | maxAgeMs: 0 | cache_metadata.status, cache_metadata.age_ms |
| Exa | maxAgeHours: 0 | statuses[].source |
| Firecrawl | maxAge: 0, storeInCache: false | metadata.cacheState |
| Keenable | live=true | usage.sku must be fetch.live |
Request settings for each provider
Each provider's API is different, so these are the closest equivalent settings. Any change to them is logged in the repository with the date it took effect.
| Provider | Endpoint | Fresh content | Content | Deadline |
|---|---|---|---|---|
| context.dev | /v1/web/scrape | maxAgeMs: 0 | Main content only | 27 s |
| Exa | /contents | maxAgeHours: 0 | Full text | 27 s |
| Firecrawl | /v2/scrape | maxAge: 0, storeInCache: false | Main content only | 27 s |
| Keenable | /v1/fetch | live=true | Default | 30 s cutoff (no setting) |
All outputs are limited to 250,000 characters.
Deadlines, timeouts, and rate limits
Each request has a 30-second hard cutoff on our side. context.dev, Exa, and Firecrawl are also asked to give up at 27 seconds. Providers report a missed deadline in different ways: an HTTP 408, an empty failure, or our cutoff. All of them count as timeouts.
Scheduled collection starts every Friday at 00:15 UTC, and workers continue through the queued sample. Limits are 4,000 requests per provider per UTC day, plus a separate grading budget. HTTP 401, 402, and 429 responses pause the affected provider across workers. Results reflect our own account plans, and requests those limits reject are excluded from scores. Interrupted requests are not automatically repeated, which avoids giving a provider extra attempts at the same page.
Reruns, duplicate days, and retention
Every sampled day has exactly one run.
Grading evidence (the excerpts the judge reads) is compressed and kept for 30 days so samples can be regraded and audited. Page-level records are kept for 180 days, and run summaries are kept permanently. Raw responses are not published.
Weekly collection and Wikipedia discovery
The selected run collected 2,527 of 2,700 targeted pages. In the unfiltered view, a missing category withholds the overall score.
Wikipedia discovery runs once before the weekly sample is created, using up to 1,200 non-bot article edits spread across the previous UTC day. We compare the old and new revision text. Only new external URLs that have not been tested before are eligible. The weekly sample includes up to 300 of these pages in the Other category, without inferring their subject from the citing article. This is a sample of edits, not every link added to Wikipedia. If discovery fails, the other sources can still form the weekly sample, and Wikipedia is checked again during the next weekly collection.
This group receives the same weight as each other category when present; missing Wikipedia pages do not suppress the eight-category score.
Known limitations
The sample is drawn from sources we chose; it is not a random sample of the web. The judge can make mistakes, which is why its agreement with human reviewers is published. Provider rate limits, request budgets, and the number of available pages can reduce a sample. Latency is measured from one region with caching turned off, which is slower than many real workloads.
184 of 198 sources last fetched successfully. Last collector update: 2026-11-07 02:30 UTC.
12Data & API
Check our work
- Filtered results for this view
- Every page-level record for 2026-11-07NDJSON
- Run summaries with intervalsJSON
- Judge prompts and request settingsGitHub ↗
- Full source codeMIT license ↗
- Plain-text summary for AI assistantsllms.txt
curl -s https://trace.context.dev/api/report \ | jq '.latest.providers[] | {id, rate, ci, p50, p95}'13FAQ
Common questions
Which web scraping API has the highest success rate?
In the Nov 7, 2026 sample, context.dev accessed 94.4% of 2,527 pages, followed by Firecrawl at 92.9%, Keenable at 92.3%, Exa at 84.9%. Its lead over the next provider is statistically significant.
Which web scraping API is fastest?
Exa had the fastest median response, 1.17 seconds. context.dev had the shortest slow tail: 95% of its requests finished within 10.8 seconds. Times are measured with caching turned off.
Does the benchmark use cached pages?
No. Every request asks for a fresh fetch, and we check each response for the provider's own cache marker. Responses served from cache are left out of the scores and latency.
How often is the benchmark updated?
A new sample of about 2,500 never-tested pages is drawn every Friday at 00:15 UTC and sent to all four providers. Its scores fill in as collection progresses.
What does a success mean?
Each sample states its scoring rule. Under page access, a page succeeds when actual page data loaded rather than a block, login screen, error, or empty shell. Under useful content, the response must also contain substantive content from the requested page, a stricter test, so compare scores only between samples that use the same rule.
Can I reproduce the results?
Yes. Every page-level record is downloadable, and the collector, judge prompt, and request settings are open source.
14Citation
Cite the benchmark
Our approach is inspired by NEEDLE: A Live Open-Source Search Benchmark for AI Agents (2026), by Andrey Styskin, Matthias Petri, and Ilya Gusev. Its fresh-query methodology and transparent comparisons informed this benchmark, which evaluates scraping rather than search.
@misc{trace2026, author = {Bakour, Yahia and Ryaboy, Michael}, title = {{TRACE}: A Live Open-Source Scrape Benchmark for {AI} Agents}, year = {2026}, url = {https://github.com/context-dot-dev/trace-benchmark}, note = {Contact: yahia@context.dev,michael@context.dev}}
