Which scraper returns useful content?

The same pages. Different scrapers. A comparison of how much content comes back, how long it takes, and where each provider works best.

Updating daily. Last completed run: Sep 30, 2026, 6:18 AM UTC. Next scheduled: Oct 1, 2026, 12:15 AM UTC. Inspect runs

Which scrapers deliver?

Target: 3,000 URLs in one daily independent run. The same frozen set goes to every provider; shortages remain visible.

How often does each scraper return the page’s main content? These URLs come from public feeds and registries.

Latest completed daily run.

3000 unique URLs · 90 domains · 8 page types · 12000 recorded page tests. Collected Sep 30, 2026 (UTC).

ProviderUsefulTime
85.6%2568 / 3000 pages3.19s
84.9%2546 / 3000 pages2 unresolved · up to 84.9%2.02s
79.3%2378 / 3000 pages1 unresolved · up to 79.3%1.28s
66.3%1990 / 3000 pages1 unresolved · up to 66.4%0.78s

Useful = pages with matching, substantive content / all selected page tests. Partial content can qualify. Time = median request duration. Scoring details

Confirmed useful content

Share of all page tests, including unresolved · higher is better

85.6%
Context
84.9%
Firecrawl
79.3%
Exa
66.3%
Keenable

Unresolved results

Share of all page tests · lower is better

0.0%
Context
0.0%
Exa
0.0%
Keenable
0.1%
Firecrawl

Different pages, different results

An average hides the hard parts. Compare useful-content rates across page types to find the fit for your workload.

Page typeContextExaKeenableFirecrawl
Commerce96%91%61%97%
News97%80%89%85%
Community86%85%18%77%
Jobs100%100%99%99%
Legal & government43%41%47%63%
Software & docs79%82%80%78%
Finance98%98%90%97%
Research86%57%48%83%

Same selected page set as above. Each cell is the share of page tests with useful content.

What does one scraper miss?

Two providers can have the same score and recover different pages. These pairs show where their coverage overlaps.

Contextvs.Exa
Both
2297
Context only
270
Exa only
81
Neither
351

1 unresolved · 3000 matched page tests

Contextvs.Keenable
Both
1945
Context only
622
Keenable only
45
Neither
387

1 unresolved · 3000 matched page tests

Contextvs.Firecrawl
Both
2414
Context only
152
Firecrawl only
132
Neither
300

2 unresolved · 3000 matched page tests

Exavs.Keenable
Both
1904
Exa only
474
Keenable only
86
Neither
534

2 unresolved · 3000 matched page tests

Exavs.Firecrawl
Both
2242
Exa only
134
Firecrawl only
303
Neither
318

3 unresolved · 3000 matched page tests

Keenablevs.Firecrawl
Both
1901
Keenable only
87
Firecrawl only
644
Neither
365

3 unresolved · 3000 matched page tests

Who returns the best output?

Compare the fresh responses directly. Jev compares anonymous outputs for useful detail, coverage and cleanliness. Identical text ties automatically. Extra length alone does not win.

314 comparable pages · 186 with only one useful response · 244 with none · 2256 unresolved · 0 pending

ProviderBest or tiedShareOnly useful
Context1of 314 compared0.3%58
Firecrawl80of 314 compared25.5%93
Exa152of 314 compared48.4%24
Keenable82of 314 compared26.1%11

Best among the observed outputs, not verified ground truth. Ties count for each winning provider. Pages with missing, uncertain, cached or non-contemporaneous evidence do not enter this comparison. The useful-content score above still includes every selected page.

Latency & cost

Timing starts when the API request begins and ends after the complete response arrives. It includes provider failures, excludes judging and account/configuration errors, and uses the same 30-second deadline. P95 is unstable for small samples.

Median latency

Seconds, all timed requests · lower is better

0.78s
Keenable
1.28s
Exa
2.02s
Firecrawl
3.19s
Context

Tail latency

95th percentile, seconds · lower is better

5.30s
Keenable
5.62s
Exa
8.41s
Firecrawl
14.55s
Context

Report pricing

The price of 1,000 fresh, base-rate pages on a named plan. Like NEEDLE, the default is the largest published self-service tier. Change a plan to compare its rate.

Context
Firecrawl
Provider & selected planBase / 1k pagesProjected / 1k useful
ContextScale · monthly$0.499$0.583
FirecrawlScale · monthly$0.749UnknownNeeds resolved results and useful pages
ExaPay as you go$1.000UnknownNeeds resolved results and useful pages
KeenableLive fetchUnknownUnknown

Subscription rates assume the full included allowance is used. Annual rates use the exact yearly payment ÷ 12, not rounded advertised monthly prices. Rates are rounded to $0.001. Projected useful-page cost = base rate ÷ useful-content rate, assuming one billable base page per attempt; it is not a measured charge.

Changing pricing does not change the measured results or imply they were collected on that plan. Free allowances, promotions and negotiated quotes are excluded. Keenable’s live-fetch price is unverified. Checked September 30, 2026. Plans, budgets & billing evidence · Download prices

A fresh supply of pages

Public feeds, sitemaps and registries supply the independent sample. NEEDLE supplies changing queries, which Context Search turns into a separate stream of URLs. Both are deduplicated before collection.

100 of 107 source endpoints succeeded at their latest poll. Failed sources remain in the registry and are retried on their next scheduled poll.

CategoryInventoryFirst seen, 24hDomains
Commerce7,3047,3045
Community86786720
Finance4734732
Jobs1,6941,6944
Legal & government48248213
News1,0401,04025
Research1,4001,4005
Software & docs92492419

“First seen” means new to this collector, not necessarily newly published. The first poll includes existing inventory. Category and domain counts do not establish scraping difficulty. Shortfalls are retained, without substituting easier categories.

Frequently asked questions

Appendix

Fresh retrieval

Every selected page is requested fresh, with one attempt and the same 30-second deadline. “Unreported” means the provider did not supply usable cache evidence. A reported cache hit remains unresolved, not a fresh-content success. Firecrawl also receives storeInCache=false.

ProviderRequest settingFreshUnreported
ContextmaxAgeMs = 03000/3000 requests verified29440 cache hits56
FirecrawlmaxAge = 03000/3000 requests verified00 cache hits3000
ExamaxAgeHours = 03000/3000 requests verified28190 cache hits181
Keenablelive = true3000/3000 requests verified00 cache hits3000

Unresolved results

Context: All selected results resolved.

Firecrawl: 1 judge error; 1 content unresolved

Exa: 1 content unresolved

Keenable: 1 judge error

Pricing methodology

NEEDLE’s pricing catalog stores a price, plan and check date for each engine and describes its comparison as the biggest self-serve tier, excluding enterprise quotes. Trace uses that convention for scraping, with the same billing period across subscriptions. Search prices are not scraping prices. The plan and billing selections in Report pricing also apply below.

Budget for 3,000 pages a day

93,000 billable base pages in a 31-day month, per provider, on your selected plans. Estimates, not invoices. This includes unused capacity and whole top-up blocks; it differs from the full-allowance unit rate above.

Provider & planMonthly spendBlended / 1k pages
ContextScale$499.00$5.366
FirecrawlScale$749.00$8.054
ExaPay as you go$93.00$1.000
KeenableLive fetchUnknownUnknown

Annual fees are amortized across 12 months; included credits still renew monthly. Assumes no opening balance, rollover, free credits or promotional discounts, and top-ups enabled. Failure billing and special URL charges can change the invoice. Excludes search, judging, hosting, taxes and extra formats. A plan’s throughput limits may prevent a five-minute run.

Reported usage

ProviderUSD subtotalCredits subtotalReported / 1k useful
ContextUnknown0/3000 pages reported2,9443000/3000 pages reportedUnknown
FirecrawlUnknown0/3000 pages reported2,9502950/3000 pages reported · partialUnknown
Exa$2.8193000/3000 pages reportedUnknown0/3000 pages reportedUnknown
KeenableUnknown0/3000 pages reportedUnknown0/3000 pages reportedUnknown

API receipts for the selected page set, not the account invoice. Missing receipts stay unknown, including timed-out requests that may still be billed. Credits are provider-specific; they are not converted to dollars at a hypothetical plan rate. Reported cost per useful page requires USD receipts for every selected page and fully resolved judgments. Subscription fees absent from receipts and operational costs are excluded.

Published plans

Included-credit rates and overage rates are different. The first assumes full use of the subscription; the second applies only after that allowance runs out. Free tiers are bounded allowances, not sustainable zero-cost tariffs.

Context

Markdown scrape · maxAgeMs=0 · 1 base credit/page · Official pricing · Billing rules · Checked 2026-09-30

Plan & commitmentCredits / moBase / 1k pagesExtra / 1k credits
Free$0.00/mo1 concurrent1,000Limited free tierUnavailable
Developer$19.00/mo10 concurrent7,500$2.533$2.20$2.20 per 1,000-credit block
Pro$99.00/mo100 concurrent125,000$0.792$1.80$1.80 per 1,000-credit block
Growth$299.00/mo250 concurrent500,000$0.598$1.40$1.40 per 1,000-credit block
Scale$499.00/mo500 concurrent1,000,000$0.499$1.00$1.00 per 1,000-credit block
EnterpriseCustom quote—UnknownUnknown

Current new-subscription prices. Annual billing saves two months on the base subscription. Overage is purchased in 1,000-credit blocks; auto top-up must be enabled. Most failures are unbilled, but 404 responses are billed. Browser actions and extra output formats cost more. Existing accounts may retain older rates and limits.

Firecrawl

Markdown scrape · maxAge=0 · parsers=[] · 1 base credit/page · Official pricing · Billing rules · Checked 2026-09-30

Plan & commitmentCredits / moBase / 1k pagesExtra / 1k credits
Free$0.00/mo2 concurrent · 10 req/min1,000Limited free tierUnavailable
Hobby$19.00/mo5 concurrent · 100 req/min5,000$3.800$5.00$5.00 per 1,000-credit block
Standard$99.00/mo25 concurrent · 500 req/min100,000$0.990$2.50$5.00 per 2,000-credit block
Growth$399.00/mo50 concurrent · 5,000 req/min500,000$0.798$2.00$5.00 per 2,500-credit block
Scale$749.00/mo100 concurrent · 10,000 req/min1,000,000$0.749$1.00$5.00 per 5,000-credit block
EnterpriseCustom quote—UnknownUnknown

Annual commitments use the exact published totals, not rounded monthly labels. Allowances renew monthly; Scale has one month of rollover. Extra credits come in $5 blocks and require pay-as-you-go to be enabled. Returned 403/404 pages still cost a credit; a scrape with no result is uncharged. Enhanced proxy escalation has no surcharge. PDF parsing is disabled in this benchmark. X/Twitter URLs have separate billing. Extra formats and PDF parsing can cost more. Concurrency is concurrent browsers; request rate limits also apply.

Exa

/contents · text only · maxAgeHours=0 · Official pricing · Checked 2026-09-30

Plan & commitmentCredits / moBase / 1k pagesExtra / 1k credits
Pay as you goNo subscription—$1.000Same rate
EnterpriseCustom quote—UnknownUnknown

Text content is $1 per 1,000 pages, with no subscription minimum. Each additional content type is billed separately. Published $10 monthly free credits and the onboarding bonus depend on account eligibility and shared usage; they are not deducted from this gross comparison. Enterprise discounts are custom. These are Contents prices, not Search prices.

Keenable

/fetch · live=true · fetch.live SKU · Official pricing · Checked 2026-09-30

Plan & commitmentCredits / moBase / 1k pagesExtra / 1k credits
Live fetchCustom quote—UnknownUnknown

The docs advertise a shared monthly allowance of 100,000 requests, but live fetch has a distinct SKU and organization-specific credit pricing. A public USD tariff for this mode is not established. Search-tier prices and the ordinary-fetch allowance cannot establish its live-fetch cost. This collector has no verified HTTP billing receipt; an account-specific live-fetch tariff is needed.

Methodology & data

Fresh pages. Inspired by NEEDLE, Trace collects URLs from changing public sources instead of relying on a fixed test set. Independent pages cover news, commerce, jobs, finance, research, government, software, and community sites.

Same task. Every reader receives the same selected URL with a 30-second deadline and a 250,000-character text limit. Their returned text, errors, and timings are saved. Each provider receives its fresh-fetch setting: maxAgeMs=0, maxAgeHours=0, maxAge=0, or live=true. Provider-reported cache evidence is tracked separately; origin freshness is not independently verified.

Content checks. The judge checks page identity and substantive content. The v3 protocol first checks a 12,000-character sample. If it finds no useful match, overlapping chunks cover the remaining returned text. A negative requires a completed full-text review; judge errors and ambiguous content remain unresolved. Earlier protocol results remain in the downloads and are excluded from v3 comparisons. If every unresolved result were useful, the score would rise by that count divided by the number of tests.

Scoring. A model grades the returned text without seeing the provider’s name. Factual accuracy has not been independently verified. Unresolved results stay in the denominator; timings include failed requests. The collected mix of sites affects the ranking. New runs compare fresh provider outputs directly without rendering a reference browser. Pairwise Jev preferences identify the best observed output, including ties. No useful output means unknown recoverability, not an impossible page. A comparison requires resolved content judgments for every provider, fresh-fetch requests, no reported cache hits and request starts within 120 seconds. Conflicting preferences remain unresolved. Providers with missing observations remain in the denominator. Entire batches invalidated by a collector fault are excluded for every provider, with reasons and raw results retained in the downloads.

Output comparison. Each useful output contributes up to 12,000 characters from the beginning, middle and end. Pairwise choices below 0.75 model confidence remain unresolved; this threshold is provisional. A winner must beat or tie every other useful output. This measures sampled preference, not factual accuracy or complete-page recall. Identical text ties without a model call; a sole useful response is reported separately.

Reproducibility. Each run freezes its URLs, provider set, configuration and code hashes before requests begin. Raw API responses and comparison receipts are retained privately. Historical browser captures remain in the archive. The public manifests and result hashes let others audit the selection and rerun the same URLs. Live pages can change.

Operated by Context, one of the providers being compared. Protocol · GitHub (private) · Download all data

Run receipts

Individual results

Individual results load when you reach this section.

Citation

If you use Trace in your work, please cite:

@misc{trace2026,
  author = {Ryaboy, Michael and Bakour, Yahia},
  title  = {{Trace}: A Live Scraping Benchmark},
  year   = {2026},
  url    = {https://trace.2.28.61.111.sslip.io/},
  note   = {Contact: michael@context.dev, yahia@context.dev. Source repository currently private. Inspired by NEEDLE.}
}

By Michael Ryaboy and Yahia Bakour at Context. Contact michael@context.dev or yahia@context.dev. GitHub repository (private; access required).

Inspiration

Trace 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. Trace evaluates scraping; NEEDLE evaluates search.