Web Search API
Search the live web through a single endpoint. Two modes — shorter (Serper / Google) and detailed (Exa / neural). Flat ₹1 per search.
Overview
One endpoint. By default we serve Serper web search (fast, current, citation-backed results); you can also pick shorter or detailed modes, or set an explicit provider. We route for you, charge a flat ₹1 per search, and return a normalised response shape.
Endpoint: POST /v1/search
Auth: Authorization: Bearer cm_your_key — the key must have the search permission (or *).
Cost: 1 credit (= ₹1) per successful search, regardless of mode or number of results. Failed upstream calls are not charged.
- 1
Your app
Send a + to
- 2
CallMissed gateway
Check the permission and pick the provider for the mode
- 3
Search provider
Default Serper web search · override with
- 4
Your app
Receive a normalized result list and get charged ₹1 only on success
Basic Usage
import httpx
r = httpx.post(
"https://api.callmissed.com/v1/search",
headers={"Authorization": "Bearer cm_your_key"},
json={
"query": "latest Indian AI startups raising funding",
"mode": "shorter", # or "detailed" / "auto"
"num_results": 10,
},
timeout=15,
)
print(r.json()["results"][:3])Modes
mode | Underlying | Best for | p50 latency |
|---|---|---|---|
shorter | Serper web search | fast, current, citation-backed results | ~1–2s |
detailed | Exa search | richer answers with cited sources | ~1–3s |
auto | tenant default → platform default (Serper) | let CallMissed pick | depends |
By default all modes use Serper web search. You can override with provider: "serper" | "exa" | "firecrawl" | "linkup" directly; when both mode and provider are set, provider wins. exa/serper/firecrawl/linkup are all available and act as automatic fallbacks for resilience — if one provider errors, the request transparently retries another so you always get a result. All providers return the same normalised shape and the same flat ₹1 per search.
Operators can set the tenant default from Settings → Web search default.
Request Body
| Field | Type | Default | Notes |
|---|---|---|---|
query | string | (required) | 1–2000 chars |
mode | string | "auto" | auto / shorter / detailed |
provider | string | — | Optional raw override: serper / exa / firecrawl / linkup. Wins over mode |
num_results | int | 10 | 1–50 |
search_type | string | mode default | Exa: auto/fast/instant/deep-lite/deep. Serper: search/news/images |
include_domains | string[] | — | detailed mode only |
exclude_domains | string[] | — | detailed mode only |
start_published_date | YYYY-MM-DD | — | detailed mode only |
end_published_date | YYYY-MM-DD | — | detailed mode only |
include_content | bool | false | detailed mode only — fetch page text + highlights |
gl | string | — | shorter mode only — country ISO (e.g. in, us) |
hl | string | — | shorter mode only — language ISO |
tbs | string | — | shorter mode only — time filter, e.g. qdr:d (past day) |
Response Shape
Responses are normalised across providers — same keys regardless of which backend ran the query.
{
"query": "latest Indian AI startups raising funding",
"mode": "shorter",
"provider": "serper",
"results": [
{
"title": "Acme AI raises $...",
"url": "https://example.com/article",
"snippet": "Acme AI announced a funding round led by...",
"content": "Full text if include_content=true, else null",
"published_date": "2026-04-10T00:00:00.000Z",
"score": 0.92,
"source": "example.com"
}
],
"answer": "Optional grounded answer (provider-dependent)",
"images": null,
"credits_used": 1,
"balance": 495.0,
"request_id": "search-a3f8c1d2e0b9",
"latency_ms": 920
}Pricing & Credits
- Flat rate: 1 credit per successful search. 1 credit = ₹1.
- Failed requests (upstream 5xx, rate limits, etc.) are not charged.
- The charge is visible immediately in the
credits_used+balancefields on the response, and in your credit history in the dashboard. - Per-key budget caps and the tenant monthly budget cap both apply — hitting either returns HTTP 402
insufficient_credits.
Permissions
API keys must have search (or *) in their service permissions. Edit a key in your dashboard (↳ Profile → API Keys → Edit) and tick the Search chip.
You can also restrict which search providers a single key may call by editing Allowed web-search providers on the same edit panel. A key restricted to serper can still use the endpoint, but calls with mode: "detailed" (or provider: "exa") will return HTTP 403 search_provider_not_allowed before any upstream request is made.
Errors
Error envelope matches the rest of /v1:
{ "error": { "message": "...", "type": "...", "code": "..." } }| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request_error | Missing or malformed body |
| 401 | invalid_api_key | Bad or revoked key |
| 402 | insufficient_credits | Balance < 1 credit or monthly budget exhausted |
| 403 | permission_denied | Key lacks search permission |
| 403 | search_provider_not_allowed | Key's Allowed search providers excludes the requested provider |
| 429 | rate_limit_exceeded | Per-key RPM exceeded |
| 503 | provider_error | Upstream search provider unavailable |