Web Search Router
BetaThe Web Search Router puts one host and one key in front of multiple web search providers. Point a request at Elo instead of the provider, and Elo adds the provider key and the limits. If you already call one of these providers, moving over means changing the URL and the key - nothing else about your request changes.
Guarantees
Section titled “Guarantees”- No influence on results. Elo never reorders, filters, or reranks what the provider returns.
- Low added latency. Elo adds 150ms on average across all providers, measured from multiple geographies.
- Unmodified payload. The request body you send and the response body you get back are the same ones the provider sends and receives, byte for byte.
Base URL
Section titled “Base URL”https://api.withgrowl.com/v1Search
Section titled “Search”POST /search/{provider}
Replace the provider’s URL with the Elo path for it, send your Elo key instead of the provider’s, and leave the body as it is. The provider’s status code and body come back unchanged.
curl -X POST "https://api.withgrowl.com/v1/search/serper" \ -H "Authorization: Bearer elo_pub_..." \ -H "Content-Type: application/json" \ -d '{ "q": "travel to vietnam", "num": 5, "gl": "us" }'Create your publisher API key on the Integration page of the
Elo dashboard. Rotating it there revokes the previous key
immediately. Send it in Authorization: Bearer or in X-API-Key, whichever your code
already sets. Elo never sends it on; the provider gets Elo’s own key.
Providers
Section titled “Providers”Each provider has a request example, common fields, the response shape, and what to know when calling it through Elo. Its linked provider reference is the complete, current request and response schema.
| Provider | Elo path | Forwarded to |
|---|---|---|
| Tavily | POST /search/tavily | POST https://api.tavily.com/search |
| Serper | POST /search/serper | POST https://google.serper.dev/search |
| Serper Shopping | POST /search/serper/shopping | POST https://google.serper.dev/shopping |
| Exa | POST /search/exa | POST https://api.exa.ai/search |
| Parallel | POST /search/parallel | POST https://api.parallel.ai/v1/search |
| TinyFish | GET /search/tinyfish | GET https://api.search.tinyfish.ai |
| SearchAPI (Google) | GET /search/searchapi | GET https://www.searchapi.io/api/v1/search |
Don’t see your provider? Email us at support@elo.ad.
Attribution
Section titled “Attribution”The response carries the provider’s status, body and Content-Type, plus Retry-After
when the provider sent one. Elo adds two headers: Elo-Provider, the provider that
answered, and X-Request-ID, which identifies the call in Elo’s logs. Quote it when
reporting a problem.
Errors
Section titled “Errors”Any status not listed here is the provider’s own answer, returned unchanged. Elo’s
502, 503 and 504 have an empty body; the others carry a short JSON body saying
what was wrong.
| Status | Meaning |
|---|---|
401 | The publisher API key is missing or not valid. |
404 | No provider by that name. The body lists the providers. |
405 | The provider takes the other method. Allow names it. |
413 | The body is over 64 KiB. |
502 | The provider could not be reached, or its answer was over 4 MiB. |
503 | The provider is not enabled on Elo yet, refused Elo’s key, or the gateway is busy. Retry later. |
504 | The provider did not answer within 30 seconds. |