Search routing for AI
The web, routed
for your AI.
Connect to multiple search providers through one API.
Illustrative routes
Illustrative routes
Providers
Search providers, connected.
Choose a provider to see its supported search options.
Selected provider
Tavily
Open web search with domain, date, and full-text support.
| Provider | Domain | Date | Publisher | Full text | Similar | Index |
|---|---|---|---|---|---|---|
| Ozonelicensed | Licensed publisher corpus | |||||
| Exa | Embeddings, open web | |||||
| Tavily | LLM-tuned, open web | |||||
| Brave | Independent index | |||||
| Cloudflareinactive | No standalone search route | Model tool only | ||||
| Binginactive | No standalone search route | Pending API availability | ||||
→Publisher, article-type, and temporal filters: Ozone only. Unsupported filters return 400 unsupported_filter.
POST /v1/search
Explore a sample search
See the shape of a search result before connecting an agent. This page does not send a request.
Sample result · illustrative
01
Example search result
Results include a source URL and provider attribution, so your agent can trace where each result came from.
Illustrative data using a reserved example domain; no search result or provider match is claimed.
curl https://api.groundrouter.ai/v1/search \
-H "Authorization: Bearer $GROUNDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"offshore wind capacity","top_k":3}'
{
"results": [{
"rank": 1,
"domain": "example.com",
"title": "Example search result",
"provenance": {
"provider": "tavily",
"found_by": ["tavily"],
"licensed": false
}
}]
}
Integrations
Connect your agent
API access
Get an API key
Self-service access: coming soon
Coming soon
claude mcp add --transport http groundrouter \
https://api.groundrouter.ai/mcp \
--header "Authorization: Bearer $GROUNDROUTER_KEY"
{
"mcpServers": {
"groundrouter": {
"type": "http",
"url": "https://api.groundrouter.ai/mcp",
"headers": {
"Authorization": "Bearer $GROUNDROUTER_KEY"
}
}
}
}
import os
import httpx
KEY = os.environ["GROUNDROUTER_KEY"]
r = httpx.post(
"https://api.groundrouter.ai/v1/search",
headers={"Authorization": f"Bearer {KEY}"},
json={"query": "offshore wind capacity 2026", "top_k": 5},
).json()
for hit in r["results"]:
lic = "licensed" if hit["provenance"]["licensed"] else "web"
print(hit["rank"], hit["domain"], lic)
const res = await fetch("https://api.groundrouter.ai/v1/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GROUNDROUTER_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
query: "offshore wind capacity 2026",
top_k: 5,
filters: { recency: { mode: "rolling", days: 30 } },
}),
})
const { results } = await res.json()
# Tavily
- https://api.tavily.com/search
+ https://api.groundrouter.ai/compat/tavily/search
# Or Brave:
- https://api.search.brave.com/res/v1/web/search
+ https://api.groundrouter.ai/compat/brave/res/v1/web/search
Routing
Routing config
{
"routing": {
"policy": "single",
"provider": "tavily"
}
}
{
"routing": {
"policy": "fanout",
"providers": ["ozone", "exa", "tavily"],
"timeout_ms": 6000
},
"merge": { "strategy": "precedence" }
}