Skip to main content
POST /v1/search runs ranked retrieval over canonical web documents. Every result includes a doc_id and canonical_url you can pass straight to /v1/document, plus provenance fields you can cite when you need auditability.
These examples use CAESAR_API_KEY; see authentication for key setup. Reranking is a modular second stage and never fails a request: if it is unavailable, results fall back to first-stage order with warning rerank_unavailable and ranking.ranker_version reports first_stage_order_v1.

Query and query variants

query is the only required field — the original user or agent question. search_queries optionally supplies your own rewrites as an array of strings: the first entry, when non-empty, replaces query as the candidate first-stage query, and the full list is given as context to the server-side query transform. If your agent already produced good rewrites, send them — you skip the server-side rewrite step.

max_results

max_results is an integer from 1 to 50, default 10. It is the complete result window — there is no cursor or offset pagination. The server fills the window itself by paging first-stage retrieval internally and deduplicating URLs, so asking for 50 returns the largest available result window; you never page manually. You may still receive fewer than max_results when sources run dry. That is not an error and does not set the envelope truncated flag — truncated refers only to response-shaping budget sheds.

Filters

Freshness policy

Source policy

Domain matching is host-suffix based: example.com matches example.com and any subdomain; a leading www. is ignored. When the policy removes results, the response carries warning source_policy_filtered with details.filtered_results counting what was dropped — so a thin result set is explainable rather than silent.

The ranking block

Successful responses include a ranking object describing how results were ordered:
Scores are response-local. A result score (an object like {"value": 0.87}, present only when the rerank stage scored that result) is comparable to other scores in the same response only — never across responses or ranker versions. Do not persist scores as absolute relevance.
Replayed searches may be served from cache; deterministic ordering, identical scores, and identical search_id values are not guaranteed across calls.

Analytics request field

client_model is accepted for analytics and tuning, but is not forwarded into retrieval. Sending it is harmless; expecting retrieval behavior from it is a bug.

A full request

Every implemented request field in one call (the response block is covered in response shaping):
cURL

The response

Trimmed to one result, at the default standard verbosity:
Notes on the envelope:
  • search_id identifies the ranked list and can be used with /v1/feedback. session_id echoes yours or is server-generated — see sessions.
  • Per-result provenance (capture_id, capture_time) appears only at response.verbosity: "full" — the default standard omits it. See response shaping.
  • Error responses use a shared envelope with stable machine codes — see errors. Full field schemas live in the API reference.