Tavily-Style Search API — Free to Self-Host (2026)
Tavily-style search API, free to self-host on Docker. AGPL-3.0 OSS. Compatibility matrix, migration adapter, and a hosted plan when you don't run servers.
Choose fastCRW when you want Tavily-style search you can self-host on Docker for $0, with a documented migration adapter and a hosted plan as a fallback.
TL;DR — pick your path before reading the matrix
This page serves three readers. If you're:
- Hunting a hosted Tavily alternative, jump to the hosted plan section. Tavily's free Researcher tier (1,000 credits/month) and PAYG ($0.008/credit) are the obvious paid options to compare against.
- Looking for OSS or self-hosted, skip to free to self-host. fastCRW is AGPL-3.0; SearXNG, OrioSearch, agent-search, and Vane are the other live OSS projects worth knowing about.
- Already happy with Tavily, the where Tavily is still the right call section is honest about that. We don't want you to switch if your workload doesn't justify it.
fastCRW Cloud (hosted, paid) and fastCRW (OSS) (AGPL-3.0, free to self-host) are different products. Above the fold this page is mostly about the OSS one — the part that's free.
At-a-glance comparison
| Decision area | fastCRW (OSS) | fastCRW Cloud | Tavily |
|---|---|---|---|
| Pricing | $0 + your server | Hosted plan | Free Researcher tier (1,000 cr/mo); PAYG $0.008/credit |
| License | AGPL-3.0 | Proprietary (managed) | Proprietary |
| Hosting | Self-host on Docker | Managed | Cloud-only |
| Search endpoint | /v1/search (Tavily-style) | /v1/search (Tavily-style) | /search |
| Synthesized answer | No | Yes (managed LLM, paid plans) | Yes (include_answer) |
| Domain filtering | No | No | Yes (include_domains/exclude_domains) |
| Batch extract | No (single URL) | No (single URL) | Yes (up to 20 URLs) |
| MCP server | crw_search/crw_scrape/crw_crawl/crw_map | Same | tavily-search/tavily-extract |
| Migration adapter | Python shim included | Same | n/a |
The honest framing: Tavily ships features fastCRW doesn't (domain filters, batched extract, agentic /research). fastCRW Cloud now matches Tavily's LLM-synthesized answers (managed LLM on paid plans; FREE has no LLM features); the self-host OSS build stays answer-less. fastCRW ships things Tavily doesn't (free self-hosting, MCP across crawl/map, AGPL source code). Pick the side that matches your constraint.
Free to self-host: the durable argument
The strongest reason to evaluate fastCRW is that you can run it for $0 beyond your own server. The compose stack:
git clone https://github.com/us/crw && cd crw
cp .env.example .env
docker compose up --build
# fastCRW + hardened SearXNG sidecar + Redis on :8080
What you get for $0:
- A Tavily-style
/v1/searchendpoint with optional Bearer auth. /v1/scrape,/v1/crawl,/v1/mapwith the same bearer-token model.- An MCP server (
crw-mcp) wired for Claude Desktop, Cursor, and Windsurf. - A SearXNG sidecar configured with read-only rootfs, dropped Linux capabilities,
no-new-privileges, memory and PID limits, and a pinned image tag. The hardening config is in the repo; you can audit it.
What you don't get:
- An external service that absorbs upstream rate limits. The SearXNG sidecar is at the mercy of Google/Bing/etc. At scale, wire in a Brave Search API key (or move to hosted).
- A managed uptime SLA. Self-hosted means you own the pager.
Read the self-hosting hardening notes →
Compatibility matrix
The single load-bearing claim on this page is Tavily-style — same concepts, different param names. Below is the abridged matrix; the full row-by-row version lives in COMPATIBILITY.md.
Search request
| Surface | Tavily | fastCRW | Compatible? |
|---|---|---|---|
| Path | POST /search | POST /v1/search | adapter required |
| Auth | Authorization: Bearer tvly-<key> | Authorization: Bearer <key> (optional self-host) | similar shape |
| Result count | max_results (default 5, max 20) | limit (default 5, max 20) | rename only |
| Time filter | time_range (day/week/month/year) | tbs (qdr:d/qdr:w/qdr:m/qdr:y) | semantic match |
| Topic | topic (general/news/finance) | `sources: ["web" | "news" |
| Search depth | search_depth (basic/advanced/fast/ultra-fast) | none | gap |
| Domain filter | include_domains, exclude_domains | none | gap |
| Country | country (195+ codes) | none | gap |
| Answer mode | include_answer | Cloud: managed LLM (paid plans); self-host: none | Cloud match; self-host gap |
| Raw content | include_raw_content | scrapeOptions.formats | shape differs |
Search response
| Field (Tavily) | Field (fastCRW) | Match? |
|---|---|---|
query (echoed) | not echoed | gap |
answer | Cloud: present when answer: true (managed LLM, paid plans); self-host: n/a | Cloud match; self-host gap |
results[].title | data[].title | ✅ |
results[].url | data[].url | ✅ |
results[].content | data[].description | renamed |
results[].score | data[].score | scale differs (treat as ordinal) |
results[].raw_content | data[].markdown (when scrapeOptions set) | shape differs |
Other endpoints
| Endpoint | Tavily | fastCRW |
|---|---|---|
| Extract | /extract (batched, ≤20 URLs) | /v1/scrape (single URL) |
| Crawl | /crawl | /v1/crawl (different param names) |
| Map | /map | /v1/map |
| Research | /research (async + SSE) | not available |
| MCP tools | tavily-search, tavily-extract | crw_search, crw_scrape, crw_crawl, crw_map, crw_check_crawl_status |
The forbidden phrase on this page is drop-in replacement. The honest phrase is Tavily-style with adapter. The next section ships the adapter.
Migration in 5 minutes — Python adapter shim
If you have existing code calling Tavily, this shim lets a Tavily-shape call hit fastCRW. Drop it in, swap your client, you're migrated.
import requests
class CrwTavilyShim:
"""Adapt Tavily-style calls to fastCRW /v1/search.
Caveats vs real Tavily:
- This OSS-targeted shim does not request `answer` synthesis
(returns "" if include_answer is set). fastCRW Cloud DOES support
managed LLM answers (paid plans) via `answer: true`.
- No `include_domains` / `exclude_domains` / `country` filtering.
- `topic="finance"` is not supported.
- `score` is SearXNG-derived; treat as ordinal not absolute.
- `raw_content` requires scrapeOptions; this shim wires it through.
"""
def __init__(self, base_url: str, api_key: str | None = None):
self.base_url = base_url.rstrip("/")
self.headers = {"Content-Type": "application/json"}
if api_key:
self.headers["Authorization"] = f"Bearer {api_key}"
def search(
self,
query: str,
*,
max_results: int = 5,
topic: str = "general",
time_range: str | None = None,
include_raw_content: bool | str = False,
**_unsupported,
) -> dict:
sources = {"general": ["web"], "news": ["news"]}.get(topic, ["web"])
body = {"query": query, "limit": max_results, "sources": sources}
if time_range:
tbs_map = {"day": "qdr:d", "week": "qdr:w", "month": "qdr:m", "year": "qdr:y"}
body["tbs"] = tbs_map.get(time_range, time_range)
if include_raw_content:
body["scrapeOptions"] = {"formats": ["markdown"], "onlyMainContent": True}
r = requests.post(f"{self.base_url}/v1/search", json=body, headers=self.headers)
r.raise_for_status()
data = r.json()["data"]
web = data["web"] if isinstance(data, dict) and "web" in data else data
return {
"query": query,
"answer": "", # this shim omits answers; fastCRW Cloud supports managed LLM answers (paid plans) via answer:true
"results": [
{
"title": item["title"],
"url": item["url"],
"content": item.get("description", ""),
"score": item.get("score"),
"raw_content": item.get("markdown"),
}
for item in web
],
}
# Usage:
# client = CrwTavilyShim("http://localhost:8080", api_key=None) # self-hosted, no auth
# client = CrwTavilyShim("https://api.fastcrw.com", api_key=os.environ["FASTCRW_KEY"])
# results = client.search("agentic search benchmarks", max_results=10, topic="news")
The shim is intentionally small — under 50 lines — so you can audit and adapt it. The full version with retry, backoff, and async support lives in the docs/search reference.
Pricing math at scale
| Volume | Tavily PAYG | Tavily Researcher (free) | fastCRW (OSS, your server) | fastCRW Cloud |
|---|---|---|---|---|
| 1,000 req/mo | $8 | covered (1,000 credits free) | ~$5 server cost (Hetzner CX22) | included in entry plan |
| 10,000 req/mo | $80 | not covered | same server | hosted plan |
| 100,000 req/mo | $800 | not covered | ~$15 server (CX42) + ops | hosted plan |
| 1,000,000 req/mo | $8,000 | not covered | ~$60 server cluster + ops | enterprise |
Two honest caveats:
- "$0 to self-host" is software cost. Server time, monitoring, and your hours are real costs.
- At low volumes, Tavily's free Researcher tier is unbeatable. We don't try to beat it; we beat the upgrade math at 5K–10K+ requests.
License notice (AGPL-3.0)
fastCRW is licensed under AGPL-3.0. The full license text is at gnu.org/licenses/agpl-3.0.html. AGPL has specific requirements for network-deployed modifications to the licensed software — calling the API from your application is not a modification. Consult your own legal counsel for your specific deployment; we deliberately do not author license interpretation in this page.
If your organization has a hard rule against AGPL-licensed dependencies, fastCRW Cloud is the obvious path — the cloud build is a separate offering with separate terms.
Vendor consolidation note (Nebius acquisition, Feb 2026)
Nebius announced its agreement to acquire Tavily on 2026-02-10: $275M cash + up to $125M earnouts. The official Nebius release confirms Tavily continues operating under its own brand, with founder Rotem Weiss joining Nebius. The deal had not closed publicly as of May 2026.
What this means for buyers:
- Today, nothing has changed for Tavily users. Pricing, API surface, and roadmap all match pre-acquisition state.
- The risk on the table is vendor consolidation — Tavily becomes a feature of Nebius's AI cloud, not an independent service.
- If your procurement process treats consolidation as risk, the OSS fallback is exactly the question this page is built to answer.
This is not "Tavily is dying." Tavily reports ~1M developers and 3M monthly SDK downloads; the founding team is staying on. The angle is supply-chain optionality, not FUD.
Where Tavily is still the right call
If your workload looks like:
- a single-API search-and-extract product, no broader scrape/crawl/map needs,
- you want LLM-synthesized answers AND insist on self-hosting (the OSS build has no
answersynthesis; fastCRW Cloud does, managed LLM on paid plans), - you depend on
include_domains/exclude_domainsfiltering orcountrytargeting, - you batch-extract dozens of URLs at a time,
- or you want Tavily's
/researchagentic endpoint,
then Tavily ships features fastCRW does not, and the right move is to stay on Tavily. The Researcher tier is a real free option at low volume, MCP support is official, and the product focus is narrow on AI search.
We are not anti-Tavily. We're saying: if your needs are broader (scrape + crawl + map + self-host), or if your procurement bias is toward open source you can run yourself, fastCRW is the better-shaped tool.
Hosted plan: when you don't want to run servers
Some teams want Tavily-style endpoints, OSS-grade transparency, and a credit card instead of a Docker compose file. fastCRW Cloud is the same API surface as the OSS build, run by us, with usage-based pricing competitive with Tavily PAYG at the 10K–100K req/mo range. See the pricing page →
Recommended evaluation flow
- Read the compatibility matrix above. Confirm none of the gaps are deal-breakers (no domain filters, no batch extract, no
/research;answersynthesis is Cloud-only — managed LLM on paid plans — and absent from the self-host build). - Spin up the OSS stack locally:
docker compose up. Hit/v1/searchwith curl. Make sure the response shape works for your code. - Drop in the migration adapter. Swap
TavilyClientforCrwTavilyShimin one staging service. - Decide hosted vs self-host based on volume. Below ~5K req/mo, Tavily Researcher's fastCRW pricing beats both. 5K–100K, the OSS self-host or fastCRW Cloud both make sense depending on your ops appetite. Above 100K, talk to us.
- If you want to compare against more OSS options, read open-source Tavily alternatives (covers OrioSearch, agent-search, SearXNG-direct) and self-hosted search APIs (the broader category, devops-focused).
You can also compare against adjacent paid APIs: fastCRW vs Firecrawl, fastCRW vs SerpAPI, and Tavily vs Serper for the head-to-head between the two paid search APIs.
Three calls to action
- Deploy OSS —
git clone github.com/us/crw && docker compose up. Quickstart → - View docs — endpoint reference, error codes, MCP tool schema. Search docs →
- Start hosted plan — managed, no Docker. Pricing →
Continue exploring
More from Alternatives
Exa Alternative in 2026 — fastCRW [Scrape + Search, Single Binary, Public Benchmark]
Looking for an Exa alternative that does scrape and search in one stack? fastCRW is a small single binary with a reproducible one-command benchmark, and exposes a Firecrawl-compatible web scraping API with built-in MCP.
Oxylabs Alternative in 2026 — fastCRW [Developer-First, AGPL Self-Host]
Looking for an Oxylabs alternative built for AI-agent developers? fastCRW is a Firecrawl-compatible web scraping API that runs local-first from a small single binary, ships with AGPL-3.0 self-host plus built-in MCP, and publishes a one-command public benchmark.
Firecrawl vs Tavily in 2026 — Scraper or Search API? (with fastCRW Benchmarks)
Firecrawl scrapes pages; Tavily returns ranked answers. Pick by intent. fastCRW does both from one Firecrawl-compatible API in a single small binary. Full benchmark inside.
Related hubs
