Exa alternative · technical teardown
Exa alternative: Exa-compatible search API at $1.00 per 1,000 searches
ContextFetch is an Exa-compatible web search API for AI agents: exa_py and exa-js keep working after you point their base URL at https://api.contextfetch.dev. ContextFetch charges $1.00 per 1,000 searches with page Markdown, highlights and a query-pruned context included. Exa lists $7.00 per 1,000 auto or fast searches ($4.00 for Instant) plus $1.00 per 1,000 pages for each content type (checked 2026-10-16). Exa offers more endpoints and runs its own search index; ContextFetch is a cheaper, narrower drop-in for agents that need results as LLM-ready text.
100,000 searches, text for 10 pages each
Exa$1,700.00
ContextFetch$100.00
List prices as of 2026-10-16. 25 searches a day free with no key.
Compare
How the list prices compare
Search APIs for AI agents by list price per 1,000 searches, with what each one includes.
| Provider | Price per 1k searches | Page Markdown included | Pruned context | Keyless MCP |
|---|---|---|---|---|
| ContextFetch | $1.00 ($0.75 on the $150 pack) | Yes, on request (contents), no extra charge | Yes: cross-encoder prunedContext + highlights | Yes: 25 searches/day per IP via npx |
| Exa | $7.00 auto/fast, $4.00 instant (up to 10 results) | Extra: $1.00 per 1,000 pages per content type | Highlights, $1.00 per 1,000 pages | Yes: hosted, rate-limited |
| Tavily | $8.00 basic, $16.00 advanced (pay-as-you-go) | Optional raw_content | Relevance-ranked content snippets | No: API key or OAuth sign-in |
| Firecrawl | $1.20 (Scale, billed yearly) to $7.60 (Hobby, billed monthly); 2 credits per 10 results | Extra: +1 credit per scraped page | Highlight format, +4 credits per page | Yes: hosted, daily limits |
| Serper | $1.00 ($50 pack) down to $0.30 at volume; credits expire after 6 months | No: Google SERP JSON and snippets | No | No official server (community servers need a key) |
Compatibility
Exa API compatibility
What ContextFetch supports when your code was written for Exa.
| Exa feature | ContextFetch |
|---|---|
| POST /search: query, numResults, includeDomains, excludeDomains, startPublishedDate | Supported. numResults up to 25. camelCase and snake_case both accepted. |
| contents.text, contents.highlights | Supported. text is clean Markdown with tables preserved; highlightScores are 0–1. |
| contents.pruned_context | ContextFetch extension: returns prunedContext, the query-relevant chunks in original order. |
| type: auto, neural, keyword, fast | Accepted; every type runs the same recall, rerank and prune pipeline. |
| type: deep variants | Accepted but run as a normal search. No multi-step reasoning. |
| POST /contents (ids or urls) | Supported, up to 10 URLs per call, 1 credit per URL. |
| POST /findSimilar | Supported: scrapes the URL, extracts topic terms and searches outside its domain. |
| contents.summary, category, includeText, excludeText, endPublishedDate, livecrawl, subpages | Not supported. |
| /answer, /research, Agent, Websets, Monitors | Not supported. |
| Auth: x-api-key header | Supported, as is Authorization: Bearer. |
Trade-offs
Honest trade-offs
Where Exa is stronger
- Exa runs its own search index; ContextFetch recalls through metasearch plus a smaller index it grows from traffic.
- Many more endpoints: /answer with citations, /research, Agent runs, Websets and Monitors.
- More content and filter options: AI summaries, categories, text filters, end dates, livecrawl and subpages.
- Result quality and latency against Exa have not been measured by ContextFetch. Run benchmarks/run_benchmark.py with your own EXA_API_KEY to compare on your queries.
Where ContextFetch is different
- $1.00 per 1,000 searches ($0.75 on the $150 pack), 86% below Exa's auto/fast list price and 75% below Instant.
- Page Markdown, highlights and pruned context are part of the search credit, not billed per page.
- Token accounting on the Reader endpoint: X-Token-Savings, X-Raw-Tokens and X-Output-Tokens headers.
- Prepaid credits that never expire; no subscription. Keyless tier of 25 searches per day (Exa's hosted MCP also has a rate-limited keyless mode).
Cost
Cost at 100,000 searches a month
| Workload | Exa list price | ContextFetch |
|---|---|---|
| 100,000 searches, no page text | $700.00 | $100.00 |
| 100,000 searches, text for 10 pages each | $1,700.00 | $100.00 |
Exa: $7.00 per 1,000 auto/fast searches (up to 10 results) plus $1.00 per 1,000 pages per content type. ContextFetch: 1 credit per search at the $15 pack rate, Markdown included for the pages it fetches. Prices as of 2026-10-16; sources under the comparison table.
Migrate
Migrate in one line
Responses keep Exa's shape: requestId, results[].{id, url, title, score, publishedDate, text, highlights, highlightScores} and costDollars.total. SDK result objects drop the extra prunedContext field; read it from the raw HTTP response.
from exa_py import Exa exa = Exa(api_key="EXA_API_KEY")from exa_py import Exa exa = Exa(api_key="YOUR_API_KEY", base_url="https://api.contextfetch.dev")# pip install exa-pyfrom exa_py import Exa exa = Exa(api_key="YOUR_API_KEY", base_url="https://api.contextfetch.dev") res = exa.search( "vector database benchmarks 2026", num_results=5, contents={"text": True, "highlights": True},)for r in res.results: print(r.url, r.highlights)// npm i exa-jsimport Exa from "exa-js"; const exa = new Exa("YOUR_API_KEY", "https://api.contextfetch.dev"); const res = await exa.search("vector database benchmarks 2026", { numResults: 5, contents: { text: true, highlights: true },});for (const r of res.results) console.log(r.url, r.highlights);# Exa-shaped search with Markdown and pruned contextcurl -s https://api.contextfetch.dev/v1/search \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query":"vector database benchmarks 2026","numResults":5,"contents":{"text":true,"pruned_context":true}}' # Any URL as Markdown, pruned to a questioncurl -si "https://api.contextfetch.dev/r/https://docs.python.org/3/library/asyncio-task.html?q=task+groups"Questions
Is ContextFetch a drop-in replacement for Exa?
For search, contents and findSimilar, yes: set base_url (Python) or the second Exa constructor argument (TypeScript) to https://api.contextfetch.dev and keep your code. Exa's answer, research, Agent, Websets, Monitors and summary features are not available on ContextFetch.
How much cheaper is ContextFetch than Exa?
At list prices checked on 2026-10-16, Exa charges $7.00 per 1,000 auto or fast searches, $4.00 per 1,000 Instant searches and $1.00 per 1,000 pages for each content type. ContextFetch charges $1.00 per 1,000 searches ($0.75 on the $150 pack) with Markdown included, which is 86% less than auto/fast and 75% less than Instant for search alone.
Does ContextFetch return the same JSON as Exa?
Yes for the supported fields: requestId, results with id, url, title, score, publishedDate, text, highlights and highlightScores, and costDollars.total. ContextFetch adds prunedContext when requested, and a notice field on keyless requests.
Can I try ContextFetch without an API key?
Yes. Send no key, or the key "keyless", for 25 free searches per day per IP. For agents, run: claude mcp add contextfetch -- npx -y @contextfetch/mcp
Is ContextFetch's search quality the same as Exa's?
It has not been measured. ContextFetch's pipeline is metasearch recall plus its own index, reranked by a cross-encoder; Exa runs its own index. ContextFetch publishes only locally measured numbers, and its benchmark script compares against Exa only when you supply your own EXA_API_KEY.
Is ContextFetch affiliated with Exa?
No. ContextFetch is an independent product that implements a compatible API. Exa is a trademark of its owner.
Exa, Tavily, Firecrawl and Serper are trademarks of their respective owners. ContextFetch is an independent product and is not affiliated with, endorsed by or sponsored by any of them.
Switch from Exa with one argument
Start with no key: 25 free searches a day. Credits never expire.