WebRouter
WebRouter is Nimbleway's open-source Python library that gives an agent one call shape for web search and page reading across many providers. Its Tavily provider takes an api_base_url, so setting it to SpecStream's Tavily address sends WebRouter's search and extract calls to SpecStream. Your agent code stays as it is; only the router's config changes.
What you need
- Python 3.11, 3.12 or 3.13, and WebRouter with its search and extract extras, which install Tavily's Python client:
pip install "webrouter[search,extract]". - A SpecStream account. New accounts get $10 of credit, no card. Create one.
- 1
1. Create an API key
In your SpecStream workspace, open Agents & API, choose API keys, then Create API key, and set a total limit. Copy the key from the next screen. SpecStream shows it once.
Keep it in an environment variable where your agent runs:
Terminal - 2
2. Point the Tavily provider at SpecStream
provider_configis where WebRouter takes credentials and client settings, keyed by provider name. The Tavily provider handsapi_base_urlto Tavily's own Python clients, for search and for extract alike. Set it to SpecStream's Tavily address and maketavilythe router's default provider:router.py - 3
3. Run it
Run
python router.py. It prints the title and address of each result, then the address and length of each page it read.response.providerreportstavily, the provider class WebRouter used, while the calls went toapi.specstream.ai.To see the calls, open the Search API screen of your workspace. Each search is listed with its query and price.
What WebRouter sends and gets back
WebRouter calls Tavily's Python client, and the client posts to the base address you set:
| WebRouter | SpecStream |
|---|---|
router.search(query, max_results=5) | POST /tavily/search with query and max_results |
response.results[] | results[].title, url and content, in Tavily's shape |
router.extract(urls, format="markdown") | POST /tavily/extract, up to 20 pages a call |
pages.documents[].content | results[].raw_content |
With auto and other providers
Under auto, WebRouter's default, a backend given an api_key in provider_config joins the chain beside the backends whose keys are in your environment, then the keyless ones. With tavily named as the default, as above, every search and extract goes to SpecStream. To send one call elsewhere, pass provider= on that call.
AsyncWebRouter takes the same arguments: open it with async with AsyncWebRouter("tavily", provider_config=config) as router: and await router.search(...) and router.extract(...).
Cost
Each search is one fast search through the Tavily address: a fifth of the default search's $5 per 1,000 searches of up to 10 results. A max_results above 10 costs more in the same proportion, and a search that returns no results costs nothing. WebRouter's Tavily search sends no include_answer, so it stays on the fast tier.
Each page extract reads is $0.80 per 1,000 pages, and a page with no text is not charged. Both come out of your balance, with no quote and no approval.
For scale, WebRouter's own price list, PRICING.md, checked October 7, 2026, puts a default Tavily search at one credit of $0.008 and a default Nimble search at $5.00 per 1,000.
New accounts start with $10 of credit, no card. Balance and billing has the details.
Remove
Delete the tavily entry from provider_config, or drop its api_base_url. To stop the key working everywhere, revoke it in Agents & API. The same Tavily address serves other tools: see Moving off Tavily. Other ways to build with SpecStream are in agent frameworks. Questions go to [email protected].
More
SpecStream for WebRouter covers what it does in WebRouter on one page. Every other tool has its guide in Connect your tools. You see the most a request can cost before it starts, and the matches are paid from your balance. Billing has the details. For help, email [email protected].