Exa vs Tavily vs Firecrawl for AI Agents: Which Web API — and When to Chain Them (2026)
Exa finds pages by meaning, Tavily packs search and extract for agents, and Firecrawl scrapes known sites. Pick one, or chain them, on one SandBase key.

Firecrawl vs Exa vs Tavily starts from the job. Exa discovers pages by meaning, then offers contents or a cited answer. On this catalog, Tavily is search, extract, and map. Firecrawl scrapes, crawls, maps, and batches, and it also searches. Chain them when the agent must find pages and then read a site the snippets do not cover. One SandBase key reaches all three. Dated numbers stay on the monthly test. SerpAPI and Google Custom Search stay on the five-tool comparison, updated 6 November 2026. This page reruns neither, and it names no universal best.
Key takeaway
- Match the starting input. A question with no URL is discovery. A URL or a docs domain is ingestion. Search is not scrape.
- One vendor is enough when that vendor’s next call already returns the page text you will hand the model.
- Chain only when discovery and deep ingestion are two different jobs. A second logo is not a strategy.
- On 2026-11-08, eligible data APIs shared 100 free calls per organization per UTC day. Several of these endpoints sit outside that allowance and bill from the first successful call.
- No call was sent for this page. No latency, no rank, and no search volume.
They do not do the same job
“Web access” is not one SKU. Search returns candidates. Scrape and crawl return the page. A snippet that looks finished in a demo is how an agent cites a title and misses the paragraph underneath.
| Starting input | Primary job | Default on this catalog |
|---|---|---|
| A question, no URL yet | Find pages | Exa Search, or Tavily Search |
| A cited answer you will still check | Grounded answer, separate from search | Exa Answer |
| A known URL, ordinary page text | Extract or scrape that URL | Tavily Extract, or Firecrawl Scrape |
| A known site, many pages, or a batch of URLs | Map, crawl, or batch scrape | Firecrawl Map, Crawl, or Batch Scrape. Tavily Map discovers URLs and does not return full pages |
| The search engine’s own result page | Classic SERP | Not these three. Use the five-tool guide |
Crawlfolio checked vendor list prices on 31 October 2026 and skipped a quality rank: Tavily and Exa find pages, Firecrawl reads pages you name. That page’s credit math is not SandBase billing. Prices below are SandBase cards.
Exa: semantic discovery, plus contents and answer
Exa’s search reference, read on 2026-11-08, says search can also extract contents from the results. On SandBase that is three POSTs. The Exa catalog lists search, contents, and answer, and it tells you to verify Answer’s sources before you trust the generated response.
SandBase Exa catalog — Search, Contents, and Answer endpoints on one key for semantic discovery.
POST /v1/api/exa/search takes a natural-language query, with optional highlights, summaries, or full text. The Exa Search card sample body uses query, type, numResults, and contents.highlights, and it reads the result from outputs[0].data. This page did not send it. Filters on Search do not carry into Answer. POST /v1/api/exa/contents is the separate URL-list call. POST /v1/api/exa/answer is a cited answer. It does not excuse skipping the pages it cites.
Tavily’s comparison calls Exa capable for semantic or specialized discovery, then names Tavily the strongest overall choice in that set. That ranking is Tavily’s. It is not a result from this page.
Tavily: the research toolkit the catalog actually lists
That same post says Tavily’s own platform combines Search, Extract, Crawl, Map, and Research. The SandBase Tavily page on 2026-11-08 lists three endpoints. Crawl and Research are not on it. A SandBase key does not include a Tavily product the catalog does not show.
SandBase Tavily catalog — Search, Extract, and Map as an agent research toolkit on the same balance.
POST /v1/api/tavily/search returns ranked results, with depth, topic, and domain controls, plus an optional generated answer. POST /v1/api/tavily/extract is text from URLs you already hold. The page says the calls stay separate: no automatic result picking, and no RAG pipeline. POST /v1/api/tavily/map discovers URLs and, on the card, does not extract full pages. A rendered site, a crawl, or a batch is a different tool.
Firecrawl: scrape and crawl, with search as one of five
Firecrawl’s introduction calls it a context API that searches, scrapes, and returns Markdown or structured data. The SandBase Firecrawl page lists scrape, crawl, map, batch scrape, and search. Search finds candidates. Crawl is a separate multi-page task. The known-URL Markdown walkthrough stays on the selection guide.
SandBase Firecrawl catalog — Search, Scrape, Map, Crawl, and Batch Scrape for known-page and site ingestion.
Scrape is one page, and the card describes JavaScript rendering. Map returns URLs. Crawl and batch scrape are asynchronous. Paths are in the table below. Tavily’s comparison says to pick Firecrawl when you ingest or monitor a specific site. Search is on the catalog. It is not the reason to open Firecrawl if you already have the URL.
Pick one vendor, or chain on purpose
A chain is two jobs. It is not three logos on a slide.
One provider is enough when
- Exa, when there is no URL yet and highlights, inline text, or Contents is the text you will keep. Not a docs-site crawl.
- Tavily, when Search plus Extract covers the URLs, or Map is only a URL list.
- Firecrawl, when the URL or domain is already known. Search first is a detour.
- Any one vendor, when you want a single schema. Measured versions of Exa search plus contents, Tavily search plus extract, and Firecrawl search plus scrape are on the research-agent benchmark. The accuracy table stays there.
Chain when the second job is real
- Finding URLs and reading the site are different steps. Exa or Tavily shortlists. Firecrawl scrape or crawl takes the rendered page, the site, or the batch.
- Highlights are not the document. Stop at search, and the model writes the missing section.
- The question fits Exa, and the docs domain it finds fits Firecrawl. Exa Contents is enough for an ordinary page. It is not a site crawl.
- Do not buy the same page twice. Search that already returned the text, plus a scrape of that URL, is one call too many.
Four recipes, with no invented latency
Orders of calls only. Nothing here was executed, and there is no timing.
POST /v1/api/exa/search, keep the URLs you will read, thenPOST /v1/api/firecrawl/scrape. If the shortlist is a docs site, usePOST /v1/api/firecrawl/crawlinstead. Crawl is async, and the card prices it per page.POST /v1/api/tavily/search, thenPOST /v1/api/tavily/extracton the URLs you keep. Same vendor. The calls stay separate.POST /v1/api/exa/searchwith highlights, thenPOST /v1/api/exa/contentsfor full text. Contents is outside the daily free allowance.POST /v1/api/firecrawl/search, thenPOST /v1/api/firecrawl/scrape. Search is outside the free allowance. Scrape is inside it. One vendor can still bill from the first call.
An assistant that also calls X or YouTube is the personal-agent walkthrough. The loop and the brief belong there, and in a later research-brief tutorial. Not here.
What the SandBase catalog showed on 2026-11-08
The homepage says “One API Key. Build and run AI agents,” plus free agents and sandboxes, and 100 free calls daily on eligible data APIs. “2,000+ models and APIs across 100+ platforms” is the site’s wording, not a count this page made. No call was sent.
The API index files Exa and Tavily under search, and Firecrawl under web scraping. Vendor lists show paths. Endpoint cards show prices. The three lists loaded that day printed no dollar amount. The cards did.
Endpoint map
| Call | Job, from the card’s description |
|---|---|
POST /v1/api/exa/search | Neural search. Optional highlights, summaries, or full text. |
POST /v1/api/exa/contents | Page contents for a list of URLs. |
POST /v1/api/exa/answer | Cited answer. Verify the sources. |
POST /v1/api/tavily/search | Agent-oriented search. Optional generated answer. |
POST /v1/api/tavily/extract | Text from URLs you pass in. |
POST /v1/api/tavily/map | Site URL discovery, not full-page text. |
POST /v1/api/firecrawl/search | Query in. Titles, descriptions, and URLs out. |
POST /v1/api/firecrawl/scrape | One page. The card describes JavaScript rendering. |
POST /v1/api/firecrawl/map | URLs across a site. |
POST /v1/api/firecrawl/crawl | Async site crawl. Poll for markdown. |
POST /v1/api/firecrawl/batch/scrape | Async batch of URLs. |
The Exa Search card reads the payload from outputs[0].data. Open the schema before assuming a field. No response is copied here.
Inspect the price before you loop
Pricing puts models, APIs, and runtimes on one balance: pay per call, no subscription, every charge in Activities. Every plan includes up to 35% off selected models (the card price is the price), 100 free calls a day shared by eligible data APIs and reset at 00:00 UTC, Discovery at $0, sandboxes at $0 for now, and failed calls at $0. Start is $0. Build is metered (“Pay per call. No subscription.”). Scale is custom. Fair-use caps apply to the sandbox line, and a price change is announced first.
Eligible cards showed “First 100 calls per day free (shared per organization),” shared across eligible SandBase APIs, then the card price. Cards without that badge bill from the first successful call. A failed call is not charged on either kind of card.
| Endpoint card | Visible price on 2026-11-08 | Inside the shared 100 |
|---|---|---|
| Exa Search | $0.0105 per call | Yes |
| Exa Contents | $0.0045 per call | No |
| Exa Answer | $0.0075 per call | Yes |
| Tavily Search | $0.012 per call | Yes |
| Tavily Extract | $0.012 per call | Yes |
| Tavily Map | $0.012 per call | No |
| Firecrawl Search | $0.015 per call | No |
| Firecrawl Scrape | $0.0075 per call | Yes |
| Firecrawl Map | $0.0075 per call | Yes |
| Firecrawl Crawl | From $0.0075 per call | No |
| Firecrawl Batch Scrape | From $0.0075 per call | No |
Crawl and batch are not a flat $0.0075. The visible label is “From $0.0075 per call.” The same day’s catalog payload set crawl’s price_formula to Math.max(1.0, Math.max((output.completed ?? 0) * 1.0, len(output.data ?? []) * 1.0)) * 0.0075, and batch scrape’s to Math.max(1.0, len(params.urls ?? []) * 1.0) * 0.0075. The crawl card says one sample bills at about $0.0075. More pages cost more. Read the card before a site loop.
exa/contents and firecrawl/search are still outside the daily free calls, as an earlier research-agent post said. So are Tavily Map, Firecrawl Crawl, and Firecrawl Batch Scrape. Two eligible calls in one chain draw two calls from the same 100, not a fresh 100 each. Model tokens are outside it. The meters share a balance on per-call pricing.
One key, next to models and a sandbox
The catalog does not crown a winner. One key, a schema and a price you can read first, and the same balance as model calls. The sandbox does not bill create, run, or stop for now. Fair-use caps may apply. Models and APIs bill. A model-only gateway does not choose this layer: see when a gateway is not enough. The account that holds the key, the data APIs, and the sandbox is the one-key stack.
Open-web scrape is not a social platform
Douyin, Xiaohongshu, Weibo, TikTok, and X are not a Firecrawl URL. Social data APIs is the split between platform APIs, scraping, and official OAuth. Exa, Tavily, and Firecrawl stay on the open web.
When a classic SERP tool is still the layer
SerpAPI and Google Custom Search still fit the engine’s own result page. They are a weak default for semantic discovery or a docs-site markdown crawl. That matrix, including the URL-to-Markdown section left alone here, is the five-tool comparison. Brave stays in the monthly test.
Which SandBase page to open
| You need | Open |
|---|---|
| SerpAPI, Google Custom Search, and the known-URL Markdown walkthrough | Five-tool comparison, 30 July 2026, updated 6 November 2026 |
| Dated accuracy, latency, and cost | November 2026 monthly test. On 2026-11-08, best-ai-search-apis-agent-workflows-2026 returned 301 to that URL |
| Measured search-plus-fetch setups | Research-agent benchmark |
| A worked assistant that also calls X and YouTube | Personal research assistant |
| Models, data APIs, and a sandbox on one key | One-key agent stack |
| Where the shared 100 sits in a budget | Per-call pricing |
| A model gateway that still does not fetch the web | Beyond OpenRouter |
| Platform social data, not an open-web scrape | Social data APIs |
This page is the job, the chain, and the catalog.
FAQ
For AI agents, should I use Exa, Tavily, or Firecrawl?
Match the job. Exa for a fuzzy question: semantic discovery, optional highlights or full text, a contents call, or a cited answer you still check. Tavily for search, extract, and map. Firecrawl when the URL or site is known and you need scrape, crawl, map, or batch. None of the three is a best web search API for AI agents without that qualifier.
When should an agent chain Exa or Tavily with Firecrawl?
When discovery and deep ingestion are two steps. Search with Exa or Tavily, then scrape or crawl with Firecrawl for a fuller page, rendered content, a site, or a batch the search payload skipped. Ordinary pages stay on one vendor: Exa search then contents, Tavily search then extract, or Firecrawl search then scrape. Add a second provider only for a real second job.
How does SandBase change the Exa vs Tavily vs Firecrawl decision?
It does not pick the winner. On 2026-11-08 one key and one balance reached all three catalogs. Read the schema and the price before you call. Eligible data APIs share 100 free calls per organization per UTC day. The table names who sits outside it, including Exa Contents and Firecrawl Search. Model calls bill separately. Re-open the cards later. Test numbers live on the monthly page and the research-agent benchmark. SerpAPI and Google Custom Search live on the five-tool guide.
What to do after you pick
Create a key from the SandBase login. Open the Exa, Tavily, and Firecrawl catalog pages, then the specific endpoint card. Read the price and whether the free-call badge is on that card. Run one search path and one scrape or extract path. In Activities, look for two lines, not one blended charge. If the second call did not change what the model could cite, delete it from the chain. The price table was read from those cards on 2026-11-08.