Skip to content
TRACE

LiveNew sample every day at 00:15 UTCLast completed

01Daily web scraping benchmark

How reliably can web scrapers read a page?

Every day 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 6, 2026 sample

  1. context.dev returned useful content from the most pages, 87.0%. It led Keenable by 2.9 points across 2,527 shared pages, a statistically significant gap.
  2. context.dev leads in news. The top two are statistically tied in 8 categories.
  3. Exa answers fastest at the median, 1.20 s. context.dev has the shortest slow tail: 95% of its requests finish within 8.91 s.
  4. 223 pages defeated every provider. Most came from legal and government, jobs, and Wikipedia links pages.
pages, each sent to all four providers
2,527
categories, weighted equally
9
daily samples scored since Nov 4
3

02Leaderboard

Pages with useful content

The score summarizes how often each provider returned meaningful content from the requested pages. Every provider is tested on the same selected pages.

Showing all daily sources and categories.

Sample 2026-11-06 UTC · 2,527 pages

What counts as useful

A page counts as useful when the response contains substantive content that matches the requested page. An automated judge decides from the returned text and never sees which provider sent it.

How to read the ranges

The ± value is a 95% confidence interval. Two providers get separate places only when a paired test on the pages they disagree on passes at the 95% level; otherwise they share a place. 2 requests rejected by our own account limits are excluded and listed in the table.

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

Every provider gets the identical sample, so we can count the pages one got and another missed. On this selection, every pair shows a clear winner.
Got the page ↓
Missed it →
context.devKeenableFirecrawlExa
context.dev—148160285
Keenable71—170246
Firecrawl35122—258
Exa73111171—

Pair verdicts

  • context.dev vs Keenable148 to 71context.dev ahead
  • context.dev vs Firecrawl160 to 35context.dev ahead
  • context.dev vs Exa285 to 73context.dev ahead
  • Keenable vs Firecrawl170 to 122Keenable ahead
  • Keenable vs Exa246 to 111Keenable ahead
  • Firecrawl vs Exa258 to 171Firecrawl 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

context.dev leads in news. The top two are statistically tied in 8 categories.
NewsCommerceJobsFinanceResearchLegalDocsCommunityOthercontext.dev, News: 92.0% (300 pages)context.dev, Commerce: 99.3% (300 pages)context.dev, Jobs: 84.7% (300 pages)context.dev, Finance: 99.7% (300 pages)context.dev, Research: 84.0% (300 pages)context.dev, Legal & government: 73.7% (300 pages)context.dev, Software & docs: 89.8% (127 pages)context.dev, Community: 84.0% (300 pages)context.dev, Other: 76.0% (300 pages)Exa, News: 82.0% (300 pages)Exa, Commerce: 79.7% (300 pages)Exa, Jobs: 81.3% (300 pages)Exa, Finance: 99.0% (300 pages)Exa, Research: 72.3% (300 pages)Exa, Legal & government: 55.7% (300 pages)Exa, Software & docs: 88.2% (127 pages)Exa, Community: 84.7% (300 pages)Exa, Other: 68.7% (300 pages)Firecrawl, News: 77.9% (299 pages)Firecrawl, Commerce: 99.0% (300 pages)Firecrawl, Jobs: 85.3% (300 pages)Firecrawl, Finance: 99.3% (299 pages)Firecrawl, Research: 80.3% (300 pages)Firecrawl, Legal & government: 64.0% (300 pages)Firecrawl, Software & docs: 89.0% (127 pages)Firecrawl, Community: 78.0% (300 pages)Firecrawl, Other: 68.0% (300 pages)Keenable, News: 81.0% (300 pages)Keenable, Commerce: 91.0% (300 pages)Keenable, Jobs: 85.0% (300 pages)Keenable, Finance: 99.7% (300 pages)Keenable, Research: 76.0% (300 pages)Keenable, Legal & government: 77.0% (300 pages)Keenable, Software & docs: 89.8% (127 pages)Keenable, Community: 83.0% (300 pages)Keenable, Other: 75.0% (300 pages)0%25%50%75%100%

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

Exa answers fastest at the median, 1.20 s. context.dev has the shortest slow tail: 95% of its requests finish within 8.91 s.
context.dev1.75 s5.68 s8.91 s26.1 s
Keenable1.27 s11.7 s16.8 s30.0 s
Firecrawl1.59 s7.50 s11.1 s25.8 s
Exa1.20 s7.62 s18.1 s27.1 s

Requests that hit the deadline

context.dev 0.0%Exa 0.0%Firecrawl 0.9%Keenable 1.4%context.dev, Exa, and Firecrawl are asked to give up at 27 seconds; Keenable offers no deadline setting, so our 30-second cutoff applies. Any failure at the deadline counts as a timeout, whatever error the provider returns.

How we measure

Time runs from sending the request to receiving the full response, measured from Vercel's US East region. Caching is turned off for every provider, and any response a provider marks as cached is excluded. Requests rejected by our own account limits are left out.

06Quality

From response to useful page

Getting through is only the first step. A page can still be the wrong document, or a title with no real content. Each line follows one provider from response to useful page.
100%9590858075Returned contentRight pageSubstantivecontext.dev, Returned content: 96.4%context.dev, Right page: 93.6%context.dev, Substantive: 86.8%86.8% context.devKeenable, Returned content: 93.3%Keenable, Right page: 91.2%Keenable, Substantive: 83.8%83.8% KeenableFirecrawl, Returned content: 94.4%Firecrawl, Right page: 90.5%Firecrawl, Substantive: 81.9%81.9% FirecrawlExa, Returned content: 85.4%Exa, Right page: 83.8%Exa, Substantive: 78.4%78.4% Exa
Returned content
The provider answered with text before the deadline.
Page accessed
The text is real page data, not a block or error screen (earlier samples need a page-access regrade).
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.
Quality signals
ProviderRight pageSubstantiveEnded on another pageMedian lengthLength vs. other providers
context.dev93.6%86.8%—8,205 chars1.20×
Keenable91.2%83.8%—5,429 chars1.00×
Firecrawl90.5%81.9%—11,897 chars1.65×
Exa83.8%78.4%—5,252 chars1.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

A cheap request is not cheap if it fails. We divide each published price by the access rate to get the cost of 1,000 pages that actually load.
context.devPro · $99 for 125,000 pages$0.7987.0%$0.79
FirecrawlStandard · $99 for 100,000 pages$0.9982.3%$1.20*
ExaContents · $1 per 1,000 pages$1.0079.1%$1.26*
KeenablePay as you go · $4 per 1,000 requests after 100,000 free each month$4.0084.2%$4.00

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

context.dev fails least. Each bar shows the share of pages a provider missed, split by the first reason we recorded.
TimeoutHTTP errorNo content returnedUnresolved
context.dev13.2%
Keenable16.2%
Firecrawl18.1%
Exa21.2%

Bars show the share of all scored pages each provider failed to return useful content for. 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. Thin pages and wrong documents count as failures under this scoring rule.

09History

Daily results over time

Daily results from Nov 4, 2026 onward. context.dev ranked first in 3 of 3 scored samples.

November 4, 2026 – November 6, 2026 3 sampled days

0%25%50%75%100%2026-11-04: context.dev 87.7%2026-11-05: context.dev 87.1%2026-11-06: context.dev 87.0%2026-11-04: Exa 77.2%2026-11-05: Exa 78.7%2026-11-06: Exa 79.1%2026-11-04: Firecrawl 83.9%2026-11-05: Firecrawl 79.4%2026-11-06: Firecrawl 82.3%2026-11-04: Keenable 84.6%2026-11-05: Keenable 84.4%2026-11-06: Keenable 84.2%Nov 4Nov 5Nov 6
Score availableSample without score×No sample

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 6, 2026 UTC

Useful content · 2,527 pages

context.dev
87.0%
Exa
79.1%
Firecrawl
82.3%
Keenable
84.2%

Reading the daily history

Source and category filters apply to every daily result, including its page count and provider scores. Gaps mark missing scores or dates with no matching pages; they are not estimated. Source-filtered history requires complete retained page records, and category-only history uses saved daily summaries. A dash means no score is available.

Same evidence, new rules

When a sample is regraded from its stored evidence under a newer scoring rule, both grades are kept so they can be compared on identical pages. The original grades are never overwritten.

10Sample & sources

Where the pages come from

Each day we collect new pages from 197 public feeds, registries, and sitemaps, plus links freshly added to English Wikipedia. No page is ever tested twice.
  1. Discover. On each source's schedule we poll publisher feeds, job boards, SEC and Federal Register listings, and sitemaps for new URLs. Wikipedia edits from the previous UTC day are checked once a day for new external links.
  2. Sample. 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.
  3. Freeze. The sample is locked and sent to all four providers with caching turned off for every one.
  4. Grade. A blind judge reads each response. Every URL, verdict, and timing is published in the page-level data.
Discovery sources by category
CategorySourcesExamples
News29BBC, NPR, Al Jazeera, CNBC
Commerce6Allbirds, Bombas, Gymshark, Vuori
Jobs23Stripe, Anthropic, Spotify, Cloudflare
Finance20SEC filings, Federal Reserve
Research17arXiv, PLOS, Nature, eLife
Legal & government37Federal Register, UK legislation, FTC
Software & docs31VS Code, Rust, Kubernetes, PostgreSQL
Community34Hacker News, Stack Overflow, Bluesky
Other1New external links on English Wikipedia
Browse all 198 sources ↗
Daily source examples by category

These feeds, APIs, and sitemaps supply the URLs for the daily 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 daily sample.

11Methodology

How the benchmark works

Every rule that affects a score is written down here. Each topic opens for the full detail, and all of it stays on the page for readers, search engines, and AI assistants.
How scores are calculated

A page counts as useful when the response contains substantive content that matches the requested page. We calculate the percentage of useful 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, 248 provider results remain unresolved and 0 are pending. These results count against the score until useful content 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 useful-content score it checks for substantive content matching the requested page, without seeing the provider name. 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.

How each provider's cache status is checked
ProviderFresh-content settingResponse field checked
context.devmaxAgeMs: 0cache_metadata.status, cache_metadata.age_ms
ExamaxAgeHours: 0statuses[].source
FirecrawlmaxAge: 0, storeInCache: falsemetadata.cacheState
Keenablelive=trueusage.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.

Request settings
ProviderEndpointFresh contentContentDeadline
context.dev/v1/web/scrapemaxAgeMs: 0Main content only27 s
Exa/contentsmaxAgeHours: 0Full text27 s
Firecrawl/v2/scrapemaxAge: 0, storeInCache: falseMain content only27 s
Keenable/v1/fetchlive=trueDefault30 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 checks every fifteen minutes, 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 daily summaries are kept permanently. Raw responses are not published.

Daily collection and Wikipedia discovery

The selected daily run collected 2,527 of 2,700 targeted pages. In the unfiltered daily-only view, a missing category withholds the overall score.

Wikipedia discovery runs once before the daily 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 daily 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 daily sample, and Wikipedia is checked again the next day.

This group receives the same weight as each other category when present; missing Wikipedia pages do not suppress the eight-category daily 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 daily sample. Latency is measured from one region with caching turned off, which is slower than many real workloads.

186 of 198 sources last fetched successfully. Last collector update: 2026-11-06 18:00 UTC.

12Data & API

Check our work

Every number on this page comes from public records you can download. Each record has the URL, provider, timing, HTTP status, judge verdict, and a hash of the returned text.
  • Filtered results for this view
  • Every page-level record for 2026-11-06NDJSON
  • Daily summaries with intervalsJSON
  • Judge prompts and request settingsGitHub ↗
  • Full source codeMIT license ↗
  • Plain-text summary for AI assistantsllms.txt
report.sh
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 6, 2026 sample, context.dev returned useful content from 87.0% of 2,527 pages, followed by Keenable at 84.2%, Firecrawl at 82.3%, Exa at 79.1%. Its lead over the next provider is statistically significant.

Which web scraping API is fastest?

Exa had the fastest median response, 1.20 seconds. context.dev had the shortest slow tail: 95% of its requests finished within 8.91 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 day at 00:15 UTC and sent to all four providers. Its scores fill in over the same UTC day.

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

If you use TRACE in your work, please cite:

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.

trace.bib
@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}}