# searchs.io — One search API over every provider

> One endpoint in front of Serper, Brave, Tavily, Jina and a zero-cost scrape engine. searchs.io rotates pooled keys, cools down exhausted ones, falls back across providers and returns one JSON shape.

Serper · Brave · Tavily · Jina · scrape, one key

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

[Start free](https://searchs.io/app) [Read the docs](https://searchs.io/docs.md)

- 1,000 free requests
- No upstream accounts
- No card

### Try the live gateway

No key needed here · results are real

## One 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**

```
curl "https://api.searchs.io/v1/search?q=cloudflare+workers&num=5" \
  -H "Authorization: Bearer sk_live_..."
# → { "provider": "brave", "key_source": "platform", "results": [...] }
```

**JavaScript**

```
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();
```

**Python**

```
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"])
```

**Drop-in (upstream wire formats)**

```
# 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.

- [GET `/v1/search` web results](https://searchs.io/docs.md#search)
- [GET `/v1/news` dated, sourced](https://searchs.io/docs.md#news)
- [GET `/v1/suggest` completions](https://searchs.io/docs.md#suggest)
- [GET `/v1/social` 13 platforms](https://searchs.io/docs.md#social)
- [GET `/v1/extract` URL to Markdown](https://searchs.io/docs.md#extract)
- [POST `/compat/*` upstream formats](https://searchs.io/docs.md#compat)

## Pricing

Credits are one-time. They are spent only by requests the platform actually served; cache hits are free.

### Free Start here

$0

- 1,000 one-time requests on the platform pool and scrape engine
- 60 requests / minute per API key
- Full console, usage and request log

[Get an API key](https://searchs.io/app)

### Pro

50,000 credits

- 50,000 one-time credits
- Priority upstreams
- Top-ups on request

[Email us](mailto:hello@searchs.io)

### Self-host

Yours

- One Cloudflare Worker with D1 and KV
- Your own upstream keys in the pool
- Same console, same API

[Read how](https://searchs.io/docs.md#self-host)
