Search API
Web search via Exa with your Concurred API key
Search the web with your Concurred API key. Results come from Exa, which is built for AI-style natural-language queries.
POST /api/v1/search
When should I use this?
Use /api/v1/search when you want a plain list of search results that you'll handle yourself — to show as cards on a page, save to a database, or feed into your own prompt.
If instead you want an AI model to do the searching for you and give you an answer, use the Chat API's battle or fight modes — the models will search the web on their own when they need to.
Request
| Field | Type | Required | Description |
|---|---|---|---|
query | string | Yes | The search query. Max 1000 chars. |
num_results | integer | No | How many results to return (1–25, default 10). |
type | string | No | "neural" (default, semantic), "keyword" (lexical, cheaper), or "auto". |
include_summary | boolean | No | Include Exa's synthesized summary per result. Default true. |
recency | string | No | Filter by publication recency. Format: "7d", "1m", "1y", etc. |
Response
| Field | Description |
|---|---|
results[].url | Canonical URL of the result. |
results[].title | Page title. |
results[].snippet | Short text excerpt (up to 500 chars). |
results[].score | Relevance score, 0–1. |
results[].published_date | ISO date if Exa could detect one. |
auto_prompt | Exa's rewritten version of your query (what it actually searched). |
cost_usd | Per-request cost from Exa, surfaced for debugging. |
Authentication
Same as the rest of the v1 gateway — Bearer token or X-API-Key:
Code examples
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | BAD_REQUEST | Missing or invalid query. |
| 401 | UNAUTHORIZED / INVALID_API_KEY | Missing or bad API key. |
| 429 | RATE_LIMIT_EXCEEDED | Either Concurred's or Exa's rate limit. Retry after a few seconds. |
| 500 | INTERNAL_ERROR | EXA_API_KEY not configured on the deployment. |
| 503 | SERVICE_UNAVAILABLE | Exa returned a non-2xx. |