LangChain search tools
Keep the class, change one argument.
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.
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_KEYParallelWebSearchTool 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, Tavily Extract, Exa, Jina Search, Bing Web Search v7, Perplexity, Parallel and Firecrawl.
For SearxSearchWrapper and a first LangChain agent with web search, read web search in LangChain.
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 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 reads up to 20 pages or documents a call at $0.80 per 1,000 pages. Deep Search 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 SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
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
Something we didn't answer? Talk to a human
How do I set api_base_url in langchain-tavily?
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?
TavilySearch itself, so the tool and the agent stay.How do I change the Exa base URL in LangChain?
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?
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?
TavilyExtract or FirecrawlLoader costs $0.0008, and the first $10 of credit covers 2,000 searches.Does FirecrawlLoader crawl and map on SpecStream?
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.pyraw.githubusercontent.com/tavily-ai/langchain-tavily/main/langchain_tavily/_utilities.py, read Nov 10, 2026
- langchain-tavily tavily_search.pyraw.githubusercontent.com/tavily-ai/langchain-tavily/main/langchain_tavily/tavily_search.py, read Nov 10, 2026
- langchain-tavily tavily_extract.pyraw.githubusercontent.com/tavily-ai/langchain-tavily/main/langchain_tavily/tavily_extract.py, read Nov 10, 2026
- langchain-exa retrievers.pyraw.githubusercontent.com/langchain-ai/langchain/master/libs/partners/exa/langchain_exa/retrievers.py, read Nov 10, 2026
- langchain-exa _utilities.pyraw.githubusercontent.com/langchain-ai/langchain/master/libs/partners/exa/langchain_exa/_utilities.py, read Nov 10, 2026
- langchain-community jina_search.pyraw.githubusercontent.com/langchain-ai/langchain-community/main/libs/community/langchain_community/utilities/jina_search.py, read Nov 10, 2026
- langchain-community JinaSearch toolraw.githubusercontent.com/langchain-ai/langchain-community/main/libs/community/langchain_community/tools/jina_search/tool.py, read Nov 10, 2026
- langchain-community bing_search.pyraw.githubusercontent.com/langchain-ai/langchain-community/main/libs/community/langchain_community/utilities/bing_search.py, read Nov 10, 2026
- langchain-perplexity _utils.pyraw.githubusercontent.com/langchain-ai/langchain/master/libs/partners/perplexity/langchain_perplexity/_utils.py, read Nov 10, 2026
- langchain-parallel search_tool.pyraw.githubusercontent.com/parallel-web/langchain-parallel/main/langchain_parallel/search_tool.py, read Nov 10, 2026
- langchain-firecrawl document_loaders.pyraw.githubusercontent.com/firecrawl/langchain-firecrawl/main/langchain_firecrawl/document_loaders.py, read Nov 10, 2026
- Bing Search API retirementlearn.microsoft.com/en-us/lifecycle/announcements/bing-search-api-retirement, read Nov 10, 2026
- Tavily API creditsdocs.tavily.com/documentation/api-credits.md, read Nov 10, 2026
- Tavily pricingtavily.com/pricing, read Nov 10, 2026
- Exa pricingexa.ai/docs/admin/pricing.md, read Nov 10, 2026
- Perplexity Search APIdocs.perplexity.ai/docs/search/overview.md, read Nov 10, 2026
- Parallel pricingdocs.parallel.ai/getting-started/pricing.md, read Nov 10, 2026
- Parallel rate limitsdocs.parallel.ai/getting-started/rate-limits.md, read Nov 10, 2026
- Firecrawl pricingfirecrawl.dev/pricing, read Nov 10, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
- SpecStream pricingspecstream.ai/pricing, read Nov 10, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026




