Keep your search code. Change the base URL.
Search1API answers the request and response formats of seven other search APIs. A project written for one of them keeps its SDK, its parameters and the code that reads the response; only the base URL and the API key change.
https://api.search1api.com/compat/searxng/{key}/compat/tavily/compat/exa/compat/firecrawl/compat/jina/r /compat/jina/s/compat/bing/v7.0/search/compat/brave/res/v1/web/search
Requests are answered in the original API’s format, so the client parses them as before.
Official SDKs and clients such as Open WebUI and LangChain keep working with a new base URL.
Results come back in the original response shape. Fields with no equivalent are empty, never invented.
Errors use the original API’s error format, with status codes such as 401, 402 and 429.
Compatible with
SearXNG / Tavily / Exa / Firecrawl / Jina / Bing v7 / Brave
Change two values
Use your Search1API key in place of the other service’s key, and point the client at the matching base URL.
Pass the base URL to the Tavily SDK. Open WebUI reads it from TAVILY_API_BASE_URL.
tavily-python — python difffrom tavily import TavilyClient-client = TavilyClient(api_key="tvly-YOUR_TAVILY_KEY")+client = TavilyClient(+ api_key="YOUR_SEARCH1API_KEY",+ api_base_url="https://api.search1api.com/compat/tavily",+)response = client.search("hono cloudflare workers", max_results=5)
Supported APIs
Each API is served under its own path on api.search1api.com, with the client’s usual authentication header.
| API | Path |
|---|---|
| SearXNG | /compat/searxng/{key}Search, news and images, with engine and category selectionKey goes in: The URL path |
| Tavily | /compat/tavilySearch, extractKey goes in: Authorization: Bearer |
| Exa | /compat/exaSearch, contentsKey goes in: x-api-key |
| Firecrawl | /compat/firecrawlScrape and search, v1 and v2Key goes in: Authorization: Bearer |
| Jina | /compat/jina/r, /compat/jina/sReader and searchKey goes in: Authorization: Bearer |
| Bing Web Search v7 | /compat/bing/v7.0/searchWeb, news and image searchKey goes in: Ocp-Apim-Subscription-Key |
| Brave Search | /compat/brave/res/v1/web/searchWeb, news and image searchKey goes in: X-Subscription-Token |
How it works
Translated into Search1API requests
Each request becomes the matching Search1API search, news or crawl request and is answered in the format the client expects.
Same key, credits and limits
Compatible requests cost what the native request costs and count toward the same rate limit. Reading a page’s full text costs 1 credit per page.
Unsupported options are ignored
A request with an option Search1API cannot apply still succeeds. Fields such as Tavily’s generated answer come back empty.
Compatible APIs cover search, news, image search and reading single pages. Generated answers, structured extraction, screenshots, site maps and asynchronous crawl jobs are not included.
Tested clients
Run unchanged against the compatible endpoints: tavily-python and @tavily/core; exa-py and exa-js; firecrawl-js and firecrawl-py’s AsyncFirecrawl and V1FirecrawlApp; LangChain’s SearXNG, Bing and Brave wrappers; and the requests Open WebUI sends for SearXNG, Jina and Bing.
Questions
Which key do I use?
Your Search1API API key, sent where the client already sends the other service’s key: a Bearer header for Tavily, Firecrawl and Jina, x-api-key for Exa, Ocp-Apim-Subscription-Key for Bing, X-Subscription-Token for Brave, and the URL path for SearXNG.
How are compatible requests billed?
Like the equivalent Search1API request: 1 credit per search, plus 1 credit for each page whose full text is read. The Exa SDKs and Jina search read result pages unless told not to, so a default 10-result search there costs up to 11 credits. Exa contents: false and Jina’s X-Respond-With: no-content turn that off.
Will results be identical to the original service?
No. Results come from Search1API’s engines, in the original API’s response format. Rankings, snippets and available fields differ; scores are derived from rank where a client expects one.
What happens to options Search1API does not support?
They are ignored and the request succeeds. Each docs page lists which options are translated and which response fields are empty.
Does it work with every client of these APIs?
It works with clients that let you change the base URL or endpoint. Clients with a hardcoded URL cannot be pointed elsewhere. firecrawl-py’s default sync client keeps only the host of the URL; its AsyncFirecrawl and V1FirecrawlApp clients work.
Can I keep my SearXNG API key out of the URL?
Not with SearXNG clients, which cannot send an auth header. Treat the URL as a secret, and create a separate key for it in the dashboard so you can revoke it on its own. Search1API masks the key in its own logs.
Explore more
Try it with your existing client
New accounts include 100 free credits. Create a key, change the base URL, and run the code you already have.