<!-- twin of https://specstream.ai/web-search/langchain-tavily -->
# LangChain search tools: keep the class, change one argument

Compared on Nov 10, 2026. The page: https://specstream.ai/web-search/langchain-tavily

Eight LangChain search and loader classes, in six packages, take a base address. Each one below ran through its own package code on production on November 10, 2026, with only the address and the key changed.

For `TavilySearch`, pass `api_base_url="https://api.specstream.ai/tavily"` and your SpecStream key as `tavily_api_key`. The tool sends Tavily's call, and SpecStream answers in Tavily's own JSON.

SpecStream scores 97.9 F-score on all 1,000 SimpleQA Verified questions and costs $5 per 1,000 searches, with no daily limit. A page read costs $0.0008. A new account gets $10 of credit, no card.

[Get an API key](https://specstream.ai/signup?src=alternatives-web-search-langchain-tavily&utm_source=alternatives-md&utm_campaign=web-search-langchain-tavily&returnTo=%2Fworkspace%2Fagents%3Ftab%3Dkeys) New accounts get $10 of credit, no card. It covers 2,000 searches.

## Each LangChain class, the argument that takes the address, and the SpecStream value, run on production on Nov 10, 2026

| | The argument | SpecStream address | Where the key goes |
|---|---|---|---|
| `langchain-tavily` 0.2.18, `TavilySearch` | `api_base_url` | `https://api.specstream.ai/tavily` | `tavily_api_key` or `TAVILY_API_KEY` |
| `langchain-tavily` 0.2.18, `TavilyExtract` | `api_base_url` | `https://api.specstream.ai/tavily` | `tavily_api_key` or `TAVILY_API_KEY` |
| `langchain-exa` 1.1.0, `ExaSearchRetriever` | `exa_base_url` | `https://api.specstream.ai/exa` | `exa_api_key` or `EXA_API_KEY` |
| `langchain-community` 0.4.2, `JinaSearch` | `base_url` on its `JinaSearchAPIWrapper` | `https://api.specstream.ai/jina-search?q=` | `api_key` or `JINA_API_KEY` |
| `langchain-community`, `BingSearchAPIWrapper` | `bing_search_url`, or `BING_SEARCH_URL` in the environment | `https://api.specstream.ai/v7.0/search` | `bing_subscription_key` or `BING_SUBSCRIPTION_KEY` |
| `langchain-perplexity` 1.4.2, `PerplexitySearchRetriever` | `PERPLEXITY_BASE_URL` in the environment | `https://api.specstream.ai/perplexity` | `PPLX_API_KEY` or `PERPLEXITY_API_KEY` |
| `langchain-parallel` 0.5.0, `ParallelWebSearchTool` | `base_url`, or `PARALLEL_BASE_URL` in the environment | `https://api.specstream.ai/parallel` | `api_key` or `PARALLEL_API_KEY` |
| `langchain-firecrawl` 0.1.0, `FirecrawlLoader` | `api_url` | `https://api.specstream.ai/firecrawl` | `api_key` or `FIRECRAWL_API_KEY` |

## Why LangChain developers point their search tools at SpecStream

### TavilySearch, before and after

`langchain-tavily` sends every call to `self.api_base_url or TAVILY_API_URL`, and `TavilySearch` builds its wrapper with `api_base_url` when you pass it. The tool, its arguments and the agent that calls it stay as they are. Before and after:

```
from langchain_tavily import TavilySearch

# reads TAVILY_API_KEY and calls https://api.tavily.com
search = TavilySearch(max_results=5)
search.invoke({"query": "open source vector databases"})
```

```
import os
from langchain_tavily import TavilySearch

search = TavilySearch(
    max_results=5,
    tavily_api_key=os.environ["SPECSTREAM_API_KEY"],
    api_base_url="https://api.specstream.ai/tavily",
)
search.invoke({"query": "open source vector databases"})
```

`TavilyExtract` takes the same `api_base_url`. Its pages come back in Tavily's extract format, at $0.0008 a page.

### Every class, one argument

`ExaSearchRetriever` hands `exa_base_url` to the Exa client as `base_url`:

```
import os
from langchain_exa import ExaSearchRetriever

# before: ExaSearchRetriever(k=5)
retriever = ExaSearchRetriever(
    k=5,
    exa_api_key=os.environ["SPECSTREAM_API_KEY"],
    exa_base_url="https://api.specstream.ai/exa",
)
```

`JinaSearch` reads its address from the `base_url` of its `JinaSearchAPIWrapper`, which adds the query straight after the address with no separator. So the value ends in `?q=`:

```
import os
from langchain_community.tools import JinaSearch
from langchain_community.utilities import JinaSearchAPIWrapper

# before: JinaSearch(), calling https://s.jina.ai/
tool = JinaSearch(search_wrapper=JinaSearchAPIWrapper(
    api_key=os.environ["SPECSTREAM_API_KEY"],
    base_url="https://api.specstream.ai/jina-search?q=",
))
```

`BingSearchAPIWrapper` defaults to Microsoft's Bing Web Search API, retired on August 11, 2025. Give it `bing_search_url`, or set `BING_SEARCH_URL`:

```
import os
from langchain_community.utilities import BingSearchAPIWrapper

# before: BingSearchAPIWrapper(), calling https://api.bing.microsoft.com/v7.0/search
bing = BingSearchAPIWrapper(
    bing_subscription_key=os.environ["SPECSTREAM_API_KEY"],
    bing_search_url="https://api.specstream.ai/v7.0/search",
)
```

`PerplexitySearchRetriever` has no address argument. It builds the Perplexity client, which reads `PERPLEXITY_BASE_URL`:

```
# before: only PPLX_API_KEY was set
export PERPLEXITY_BASE_URL=https://api.specstream.ai/perplexity
export PPLX_API_KEY=$SPECSTREAM_API_KEY
```

`ParallelWebSearchTool` takes `base_url`, whose default is `https://api.parallel.ai`:

```
import os
from langchain_parallel import ParallelWebSearchTool

# before: ParallelWebSearchTool()
tool = ParallelWebSearchTool(
    api_key=os.environ["SPECSTREAM_API_KEY"],
    base_url="https://api.specstream.ai/parallel",
)
```

`FirecrawlLoader` passes `api_url` to the Firecrawl client. Its `scrape`, `crawl` and `map` modes all ran on SpecStream:

```
import os
from langchain_firecrawl import FirecrawlLoader

# before: FirecrawlLoader(url=..., mode="scrape"), calling https://api.firecrawl.dev
loader = FirecrawlLoader(
    url="https://example.com",
    mode="scrape",
    api_key=os.environ["SPECSTREAM_API_KEY"],
    api_url="https://api.specstream.ai/firecrawl",
)
docs = loader.load()
```

### What each address answers

Each address answers in that API's own request and reply form. Every parameter and field is in its guide: [Tavily](https://specstream.ai/migrate/tavily?utm_source=alternatives&utm_campaign=web-search-langchain-tavily), [Tavily Extract](https://specstream.ai/migrate/tavily-extract?utm_source=alternatives&utm_campaign=web-search-langchain-tavily), [Exa](https://specstream.ai/migrate/exa?utm_source=alternatives&utm_campaign=web-search-langchain-tavily), [Jina Search](https://specstream.ai/migrate/jina-search?utm_source=alternatives&utm_campaign=web-search-langchain-tavily), [Bing Web Search v7](https://specstream.ai/migrate/bing-web-search-v7?utm_source=alternatives&utm_campaign=web-search-langchain-tavily), [Perplexity](https://specstream.ai/migrate/perplexity?utm_source=alternatives&utm_campaign=web-search-langchain-tavily), [Parallel](https://specstream.ai/migrate/parallel?utm_source=alternatives&utm_campaign=web-search-langchain-tavily) and [Firecrawl](https://specstream.ai/migrate/firecrawl?utm_source=alternatives&utm_campaign=web-search-langchain-tavily).

For `SearxSearchWrapper` and a first LangChain agent with web search, read [web search in LangChain](https://specstream.ai/web-search/langchain?utm_source=alternatives&utm_campaign=web-search-langchain-tavily).

The Tavily call underneath `TavilySearch`, from plain Python:

```
import os, requests

reply = requests.post(
    "https://api.specstream.ai/tavily/search",
    headers={"Authorization": f"Bearer {os.environ['SPECSTREAM_API_KEY']}"},
    json={"query": "open source vector databases", "max_results": 5},
).json()

for result in reply["results"]:
    print(result["title"], result["url"], result["score"])
```

### $5 per 1,000 searches, with no daily limit

A search of up to 10 results costs $0.005 on every address above, and each started block of 10 more adds $0.006. A page from `TavilyExtract` or a `FirecrawlLoader` scrape costs $0.0008, and a page with no text is not charged. There is no monthly plan and no daily limit. A busy call gets a `429` with `Retry-After` and charges nothing.

### The most accurate web search API, in about one second

On SimpleQA Verified the SpecStream Search API scores 97.9 F-score on all 1,000 official questions, 978 of them correct. On WideSearch it scores 64.0 item F1 and 43.4 row F1 on all 200 official tasks. The Extract API scores 0.908 F1 on WCXB. Every score and its method is on the [benchmarks](https://specstream.ai/benchmarks?utm_source=alternatives&utm_campaign=web-search-langchain-tavily) page.

A search call on these addresses runs the fast search. Measured on production on November 9, 2026, its median was 0.82 s at 1 search a second and 1.07 s at 20 a second, the 95th percentile stayed between 1.09 and 1.73 s, and it answered 718 of 720. There is no limit per key and no daily limit.

### You decide what is kept, on each key

Create the key with `zero_retention` and a search made with it keeps no request text and no answer after the reply. `spend_cap_cents` is the most the key can spend, so an agent in a loop stops at the cap you set.

```
curl -X POST https://api.specstream.ai/v1/account/keys \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "langchain", "scopes": ["account:read", "finds:spend"], "spend_cap_cents": 500000, "zero_retention": true}'
```

### Search, pages and rows on one key

One SpecStream key serves all eight classes. The [Extract API](https://specstream.ai/extract-api?utm_source=alternatives&utm_campaign=web-search-langchain-tavily) reads up to 20 pages or documents a call at $0.80 per 1,000 pages. [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=web-search-langchain-tavily) returns every match for a request in plain words as structured rows, at 5¢, 15¢ or $1 a row, with a source URL on every value. The most a run can cost is approved before it starts.

## What the providers behind these classes cost

### Tavily

Billed in credits: $0.008 a credit on pay as you go, 1 credit a basic search and 2 an advanced one. On a monthly plan, requests stop when the month's credits run out. SpecStream answers the same `TavilySearch` at $0.005 a search, and credit you buy never expires.

### Exa

$7 per 1,000 requests on `auto` and `fast`, $4 on `lite`, and the base price covers the first 10 results. SpecStream answers `ExaSearchRetriever` at $5 per 1,000 searches of up to 10 results.

### Perplexity Search API

$5.00 per 1,000 successful requests. SpecStream costs the same $5 per 1,000 behind `PERPLEXITY_BASE_URL` and scores 97.9 F-score on all 1,000 SimpleQA Verified questions.

### Parallel Search

$1 to $5 per 1,000 requests with 10 results each, and a limit of 600 searches a minute. SpecStream answers `ParallelWebSearchTool` with no limit per key and no daily limit.

### Firecrawl

Sold by monthly plan: Hobby is $19 a month for 5,000 credits, and a search costs 2 credits per 10 results. SpecStream answers `FirecrawlLoader` with no plan: $0.0008 a scraped page and $0.005 a search.

## How to move a LangChain search tool to SpecStream

1. Create a key under Agents & API in the SpecStream workspace. A new account gets $10 of credit, no card, which covers 2,000 searches.

2. Check the key with the call `TavilySearch` sends. A `200` with `results` means the tool gets the same.

```
curl -X POST https://api.specstream.ai/tavily/search \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"query": "test", "max_results": 3}'
```

3. Add the class's argument from the table, with the SpecStream key where the class takes its key:

```
import os
from langchain_tavily import TavilySearch

search = TavilySearch(
    max_results=5,
    tavily_api_key=os.environ["SPECSTREAM_API_KEY"],
    api_base_url="https://api.specstream.ai/tavily",
)
search.invoke({"query": "open source vector databases"})
```

4. Run the chain or agent as before. Each call shows in your SpecStream request log with its price.

## Frequently asked questions

### How do I set api_base_url in langchain-tavily?

Pass it to the constructor: `TavilySearch(api_base_url="https://api.specstream.ai/tavily")`, and the same on `TavilyExtract`. Both ran with that argument in `langchain-tavily` 0.2.18 on production on November 10, 2026.

### What is the best langchain-tavily alternative?

SpecStream, at $0.005 a search with no daily limit and 97.9 F-score on all 1,000 SimpleQA Verified questions. It answers `TavilySearch` itself, so the tool and the agent stay.

### How do I change the Exa base URL in LangChain?

Set `exa_base_url` on `ExaSearchRetriever` in `langchain-exa` 1.1.0. The value `https://api.specstream.ai/exa` with a SpecStream key in `exa_api_key` searches at $5 per 1,000.

### Which LangChain search tools take a custom endpoint?

Eight classes in six packages: `TavilySearch`, `TavilyExtract`, `ExaSearchRetriever`, `JinaSearch`, `BingSearchAPIWrapper`, `PerplexitySearchRetriever`, `ParallelWebSearchTool` and `FirecrawlLoader`. Each argument is in the table above.

### Why does the JinaSearch base_url end in ?q=?

`JinaSearchAPIWrapper` builds its request as `base_url + query`, with no separator. With `?q=` at the end, the query lands in `q`.

### How much does a LangChain search cost on SpecStream?

$0.005 a search of up to 10 results, on every class above. A page from `TavilyExtract` or `FirecrawlLoader` costs $0.0008, and the first $10 of credit covers 2,000 searches.

### Does FirecrawlLoader crawl and map on SpecStream?

Yes. Its `scrape`, `crawl` and `map` modes ran through `langchain-firecrawl` 0.1.0 on production on November 10, 2026, with `api_url` set to SpecStream.

## Sources

SpecStream wrote this page. Each argument comes from the package's source on GitHub, and each provider's figure from that company's own page.

- [langchain-tavily _utilities.py](https://raw.githubusercontent.com/tavily-ai/langchain-tavily/main/langchain_tavily/_utilities.py), read Nov 10, 2026
- [langchain-tavily tavily_search.py](https://raw.githubusercontent.com/tavily-ai/langchain-tavily/main/langchain_tavily/tavily_search.py), read Nov 10, 2026
- [langchain-tavily tavily_extract.py](https://raw.githubusercontent.com/tavily-ai/langchain-tavily/main/langchain_tavily/tavily_extract.py), read Nov 10, 2026
- [langchain-exa retrievers.py](https://raw.githubusercontent.com/langchain-ai/langchain/master/libs/partners/exa/langchain_exa/retrievers.py), read Nov 10, 2026
- [langchain-exa _utilities.py](https://raw.githubusercontent.com/langchain-ai/langchain/master/libs/partners/exa/langchain_exa/_utilities.py), read Nov 10, 2026
- [langchain-community jina_search.py](https://raw.githubusercontent.com/langchain-ai/langchain-community/main/libs/community/langchain_community/utilities/jina_search.py), read Nov 10, 2026
- [langchain-community JinaSearch tool](https://raw.githubusercontent.com/langchain-ai/langchain-community/main/libs/community/langchain_community/tools/jina_search/tool.py), read Nov 10, 2026
- [langchain-community bing_search.py](https://raw.githubusercontent.com/langchain-ai/langchain-community/main/libs/community/langchain_community/utilities/bing_search.py), read Nov 10, 2026
- [langchain-perplexity _utils.py](https://raw.githubusercontent.com/langchain-ai/langchain/master/libs/partners/perplexity/langchain_perplexity/_utils.py), read Nov 10, 2026
- [langchain-parallel search_tool.py](https://raw.githubusercontent.com/parallel-web/langchain-parallel/main/langchain_parallel/search_tool.py), read Nov 10, 2026
- [langchain-firecrawl document_loaders.py](https://raw.githubusercontent.com/firecrawl/langchain-firecrawl/main/langchain_firecrawl/document_loaders.py), read Nov 10, 2026
- [Bing Search API retirement](https://learn.microsoft.com/en-us/lifecycle/announcements/bing-search-api-retirement), read Nov 10, 2026
- [Tavily API credits](https://docs.tavily.com/documentation/api-credits.md), read Nov 10, 2026
- [Tavily pricing](https://tavily.com/pricing), read Nov 10, 2026
- [Exa pricing](https://exa.ai/docs/admin/pricing.md), read Nov 10, 2026
- [Perplexity Search API](https://docs.perplexity.ai/docs/search/overview.md), read Nov 10, 2026
- [Parallel pricing](https://docs.parallel.ai/getting-started/pricing.md), read Nov 10, 2026
- [Parallel rate limits](https://docs.parallel.ai/getting-started/rate-limits.md), read Nov 10, 2026
- [Firecrawl pricing](https://www.firecrawl.dev/pricing), read Nov 10, 2026
- [SpecStream benchmarks](https://specstream.ai/benchmarks), read Nov 10, 2026
- [SpecStream pricing](https://specstream.ai/pricing), read Nov 10, 2026
- [SpecStream for agents](https://specstream.ai/agents.md), read Nov 10, 2026
