session_id. If you do not send one, the server generates a fresh UUID for that request and returns it:
How to send it
The body wins. If both a body
session_id and an X-Session-ID header are present, the body value is used. Set the header once in your HTTP client as a convenient default; override per request in the body when you need to.
400 validation_error — message session_id must be a UUID for the body field, X-Session-ID must be a UUID for the header.
What sessions are — and are not
Sessions provide continuity for ranking, telemetry, and abuse controls, and they give feedback its task context: asearch followed by a document read followed by feedback under one session_id reads as a single multi-step task.
What a session is not:
- Not server-side state. Sessions are not persisted as entities, and a supplied
session_idis never checked for “existence” — continuity is entirely caller-driven. Any valid UUID works. - Not authentication. A
session_idgrants nothing. Auth is the Bearer key — see Authentication. - Not a rate-limit key. Rate limits are keyed by API key; the session has no effect.
client_model
client_model is an optional string identifying the calling model (for example my-agent-model), used for analytics and tuning. It appears in two places:
If you want model attribution to count, set it on feedback via
agent_context. The hosted MCP server sets client_model: "mcp" on searches it makes on your behalf. There is no header form of client_model.
X-Caesar-Client
First-party clients send an X-Caesar-Client: client/version header: cli/0.2.0, python-sdk/0.2.0, ts-sdk/0.2.0. It is an attribution convention, not a protocol — the server does not parse, validate, or store it today, and it changes no behavior. If you build an integration, sending yourtool/1.2.3 is encouraged:
session_id, there is no body equivalent and no precedence rule to think about.