Every search API.
One key, one JSON shape.
searchs.io sits in front of the search providers you would otherwise integrate one by one. It pools their keys, rests the ones that run out, falls back across providers and answers every call the same way.
- 1,000 free requests
- No upstream accounts
- No card
Try the live gateway
No key needed here · results are realOne call, whichever key answers
Query parameters or a JSON body, a Bearer token, and the same flat result list no matter which upstream served it.
curl "https://api.searchs.io/v1/search?q=cloudflare+workers&num=5" \
-H "Authorization: Bearer sk_live_..."
# → { "provider": "brave", "key_source": "platform", "results": [...] }const r = await fetch("https://api.searchs.io/v1/search", {
method: "POST",
headers: { "Authorization": "Bearer sk_live_...", "Content-Type": "application/json" },
body: JSON.stringify({ q: "cloudflare workers", num: 5, lang: "en" })
});
const { results, provider, key_source } = await r.json();import requests
r = requests.post("https://api.searchs.io/v1/search",
headers={"Authorization": "Bearer sk_live_..."},
json={"q": "cloudflare workers", "num": 5})
for hit in r.json()["results"]:
print(hit["position"], hit["title"], hit["url"])# Already calling Serper / Brave / Tavily / Jina directly? Keep your code.
# Change the base URL and the key; the gateway answers in that provider's own format.
curl -X POST https://api.searchs.io/compat/serper/search -H "X-API-KEY: sk_live_..." \
-H "content-type: application/json" -d '{"q":"cloudflare workers","num":5}'Every response carries provider (who answered) and key_source (platform or cache). Results are a flat list of position · title · url · domain · description · date, identical for every provider.
How it works
A scheduler in front of a key pool. You never see the pool; you see one healthy answer.
Platform credits, no upstream accounts
The platform's pooled keys plus a zero-cost scrape engine (Brave, Bing and DuckDuckGo merged) come with 1,000 one-time requests on the free plan. Nothing resets, nothing expires.
Pooling, cooldown, fallback
Keys rotate within each provider. One that reports quota exhausted rests 6 h, an invalid one 24 h, a rate-limited one 60 s. When a provider's keys are all cooling, the next provider takes over.
Drop-in compatibility
/compat/serper, /compat/brave, /compat/tavily and /compat/jina speak each upstream's wire format. Existing integrations switch by changing a URL.
Search, news, extract, social
/v1/search, /v1/news, /v1/extract (any URL to clean Markdown, or read=N in the same round trip) and /v1/social for Xiaohongshu, Douyin, Weibo, Bilibili, YouTube, X, Reddit and more.
Free edge cache
Identical queries are answered from Cloudflare's edge for 10 minutes and never spend credits. Bypass with cache=false when you need a fresh answer.
Visibility by API
/v1/providers shows each provider's order, weight and healthy keys; /v1/usage returns credits used and remaining, so routing and quota checks can be scripted.
Endpoints
Same key, same error shape, same headers on every one.
Pricing
Credits are one-time. They are spent only by requests the platform actually served; cache hits are free.
Free Start here
- 1,000 one-time requests on the platform pool and scrape engine
- 60 requests / minute per API key
- Full console, usage and request log
Self-host
- One Cloudflare Worker with D1 and KV
- Your own upstream keys in the pool
- Same console, same API