Brave Search API migration
Change the host and keep Brave's JSON.
Since November 9, 2026 SpecStream answers the Brave Search API call on Brave's own path, /res/v1/web/search, in Brave's JSON. Brave charges $5 per 1,000 requests; SpecStream charges $5 per 1,000 searches of up to 10 results.
Change https://api.search.brave.com to https://api.specstream.ai and put a SpecStream key in X-Subscription-Token. A call of up to 10 results costs $0.005, and a call with no count returns 10.
It is the most accurate web search API in the world: 97.9 F-score on all 1,000 SimpleQA Verified questions and 64.0 item F1 on all 200 WideSearch tasks, on the benchmarks page.
New accounts get $10 of credit, no card. It covers 2,000 searches.
Brave Search API to SpecStream, parameter by parameter and field by field
| SpecStream (`/res/v1/web/search`) | Brave Search API | |
|---|---|---|
| Address | https://api.specstream.ai/res/v1/web/search, by GET with the query string or by POST with a JSON body | https://api.search.brave.com/res/v1/web/search |
| Key | Your SpecStream key in X-Subscription-Token, as a Bearer token, or as the HTTP Basic password. No key gets a 401 | Your Brave key in the X-Subscription-Token header |
| `q` | Read as the search. Operators written inside q, such as site:, shape it | The query. Brave's search operators are included directly within it |
| `count` | Read, 1 to 20, default 20. Up to 10 results cost $0.005 and run the fast search; 11 to 20 cost $0.011 | Maximum number of results per page, max 20, default 20. A request can return fewer than count |
| `offset` | Read, 0 to 9, in pages of count, as on Brave. A page past the last result gets a 400 | Starting position for results, 0 based, max 9 |
| `freshness` | Read: pd, pw, pm, py, or a range written YYYY-MM-DDtoYYYY-MM-DD, applied as a date filter on the search | pd, pw, pm, py, or a date range |
| `country`, `search_lang`, `ui_lang`, `safesearch`, `spellcheck`, `text_decorations`, `result_filter`, `goggles` | Accepted with no error and not used to shape the search. country comes back in query.country | Request parameters of the Web Search API |
| `extra_snippets` and `summary` | Accepted and not used. Each result carries one description, and the reply has no summarizer key | extra_snippets returns up to 5 additional excerpts per search result |
| The reply | type: search, query with original and more_results_available, mixed, and web.results[], plus specstream with the request ID and the price of the call | type: search, query, mixed and web.results[] |
| Each result | title, url, description, profile, meta_url, type, subtype, is_source_local and is_source_both. page_age and age only when the result carries a date, which most do not | title, url, description, meta_url, profile and page_age |
| Price | $5 per 1,000 searches of up to 10 results, paid from a balance. Credit you buy never expires, and a call stopped by a 429 charges nothing | $5 per 1,000 requests on the Search plan, with $5 in free credits every month. Each API call counts as one request |
| Rate | Up to 8,800 searches a minute on one account. A call over that gets a 429 with Retry-After | 50 queries per second on the Search plan |
What changes and what stays when you move from Brave
The whole migration is the host and the key
Your code keeps Brave's path, its header name, its parameters and its parser. The host changes, and the key in the header.
# Before
curl "https://api.search.brave.com/res/v1/web/search?q=open+source+vector+databases&count=10" \
-H "X-Subscription-Token: $BRAVE_API_KEY"
# After
curl "https://api.specstream.ai/res/v1/web/search?q=open+source+vector+databases&count=10" \
-H "X-Subscription-Token: $SPECSTREAM_API_KEY"The reply has Brave's shape: web.results[] with title, url and description, which is what LangChain's Brave wrapper and Open WebUI read. A client that keeps count unset, as Dify and langchain-community do, gets 10 results and pays $0.005 a call.
What the reply leaves out
The route returns web results only. Each result has one description, so a call with extra_snippets gets no extra_snippets array, and summary adds no summarizer key. page_age and age appear only on results that carry a date, and most do not, so read them as optional.
A refusal keeps Brave's error shape: type: ErrorResponse with error.id, status, code and detail. A missing key is a 401, an empty balance a 402, and a busy minute a 429 with Retry-After that charges nothing.
$5 per 1,000, with no monthly plan
Brave's Search plan costs $5 per 1,000 requests with $5 in free credits every month. SpecStream charges $5 per 1,000 searches of up to 10 results and $0.011 for 11 to 20. New accounts start with $10 of credit, no card, which covers 2,000 searches, and every rate is on the pricing page.
The most accurate web search API in the world
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.
About one second a search, measured under load
Every drop-in route runs the fast search unless the call asks for page text or results past the first ten. On November 9, 2026 production took 1 to 20 fast searches a second and answered 718 of 720: the median was 0.82 s at 1 search a second and 1.07 s at 20 a second, and the 95th percentile stayed between 1.09 and 1.73 s. One account takes up to 8,800 searches a minute; a call over that gets a 429 with Retry-After and is not charged.
You decide what is kept, on each key
Create a key with zero_retention and a search made with it keeps no request text and no answer after the reply: it is not in the history, its answer is not reused for another call, and its log lines carry neither. spend_cap_cents is the most the key can spend.
curl -X POST https://api.specstream.ai/v1/account/keys \
-H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
-d '{"name": "production", "scopes": ["account:read", "finds:spend"], "spend_cap_cents": 500000, "zero_retention": true}'Search, pages and rows on one key
The same key calls GET /v1/web-search, which returns up to 100 results for one search and an answer with the page it was read from. It reads up to 20 pages or documents a call with the Extract API at $0.80 per 1,000 pages, and a page with no text is not charged. 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, and the most a run can cost is approved before it starts.
Other options when you leave the Brave Search API
Serper
Google results resold as JSON, in credit packs from 50k credits at $1.00 per 1,000, and the credits are valid for 6 months. SpecStream reads the whole live web, answers Serper's own call at https://api.specstream.ai/serper, and the credit you buy never expires.
Tavily
A search API billed in credits: $0.008 a credit on pay as you go, with 1,000 free credits a month, and requests stop when the monthly credits run out. SpecStream answers Tavily's call at https://api.specstream.ai/tavily and spends from a balance at $5 per 1,000 searches.
Exa
A search API from $4 per 1,000 requests on lite and $7 per 1,000 on auto and fast. SpecStream answers Exa's call at https://api.specstream.ai/exa at $5 per 1,000 searches, with 97.9 F-score on all 1,000 SimpleQA Verified questions.
Firecrawl
Search and scrape billed in credits by monthly plan: a search takes 2 credits, and the Standard plan is $99 a month for 100,000 credits. SpecStream has no plan to buy first: a search takes $0.005 from your balance and a page read $0.0008.
SerpApi
Search engine result pages as JSON, sold by monthly plan: Starter is $25 a month for 1,000 searches. On SpecStream $25 pays for 5,000 searches, on Brave's path and in Brave's JSON.
How SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
How to move from the Brave Search API
1. Create a key under Agents & API in the workspace. A new account gets $10 of credit, no card, which covers 2,000 searches.
2. Set the host to https://api.specstream.ai where your code has https://api.search.brave.com, and send the SpecStream key in X-Subscription-Token. In Python:
import os
import requests
BASE = "https://api.specstream.ai" # was https://api.search.brave.com
reply = requests.get(
f"{BASE}/res/v1/web/search",
params={"q": "open source vector databases", "count": 10},
headers={"X-Subscription-Token": os.environ["SPECSTREAM_API_KEY"]},
).json()
for result in reply["web"]["results"]:
print(result["title"], result["url"], result["description"])In JavaScript:
const BASE = "https://api.specstream.ai"; // was https://api.search.brave.com
const params = new URLSearchParams({ q: "open source vector databases", count: "10" });
const reply = await fetch(`${BASE}/res/v1/web/search?${params}`, {
headers: { "X-Subscription-Token": process.env.SPECSTREAM_API_KEY },
}).then((response) => response.json());
for (const result of reply.web.results) {
console.log(result.title, result.url, result.description);
}3. Leave count, offset and freshness as they are. A call of up to 10 results costs $0.005 and runs the fast search.
4. Treat page_age and extra_snippets as optional in your parser. Each reply carries specstream.price_usd, the price of that call.
Frequently asked questions
Something we didn't answer? Talk to a human
What is the best Brave Search API alternative?
https://api.specstream.ai/res/v1/web/search in Brave's JSON and scores 97.9 F-score on all 1,000 SimpleQA Verified questions.How do I migrate from the Brave Search API?
https://api.search.brave.com with https://api.specstream.ai and send a SpecStream key in X-Subscription-Token. The path, the parameters and web.results[] stay as they are.Is there a free Brave Search API alternative?
How much does the Brave Search API cost?
Which Brave parameters does SpecStream read?
q, count (1 to 20), offset (0 to 9) and freshness. country, search_lang, safesearch, extra_snippets and the rest are accepted with no error and do not change the search.Does the reply include `page_age` and extra snippets?
page_age comes back only on results that carry a date, and most do not. The reply has one description per result and no extra_snippets array.What does a call with no `count` cost?
count is unset, and a call of up to 10 results is one search. count=20 costs $0.011.Sources
SpecStream wrote this page. The route's behavior is read from its code; each rival figure comes from that company's own page.
- Brave Search APIbrave.com/search/api/, read Nov 9, 2026
- Brave Web Search API documentationapi-dashboard.search.brave.com/app/documentation/web-search/get-started, read Nov 9, 2026
- Brave Search API on AWS Marketplaceaws.amazon.com/marketplace/pp/prodview-qjlabherxghtq, read Nov 9, 2026
- Serperserper.dev/, read Nov 9, 2026
- Tavily pricingtavily.com/pricing, read Nov 9, 2026
- Exa pricingexa.ai/docs/admin/pricing.md, read Nov 9, 2026
- Firecrawl pricingfirecrawl.dev/pricing, read Nov 9, 2026
- SerpApi pricingserpapi.com/pricing, read Nov 9, 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




