Compatible with other search APIs

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
Get an API key
What stays the same

Requests are answered in the original API’s format, so the client parses them as before.

1
Your SDK and calls

Official SDKs and clients such as Open WebUI and LangChain keep working with a new base URL.

2
The fields you read

Results come back in the original response shape. Fields with no equivalent are empty, never invented.

3
Errors you handle

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 diff
from 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.

APIPath
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.