POST /v1/retrieve.
200 application/json
What it is
Exo has two engines behind one route. Brain path, the org’s trained ExoBrain answering from learned weights (in practice, a model that has seen this graph and settled on a region of it). Hybrid path, vector plus keyword search over stored content, fused by reciprocal rank (in practice, ordinary retrieval, run when the brain cannot serve). You never choose. The route picks, then tells you what it picked. That last part is the design decision worth the page: a memory API that quietly degrades is worse than one that fails, because you cannot tell a thin answer from a wrong one. Sopath names the engine, degraded is the one boolean to branch on, and degradationReason says why.
Where it comes from
Two things in that diagram surprise people. A stale brain still answers: staleness is reported, not routed around, because a slightly out-of-date brain is still the best answer available. Andcold_start overrides the other reasons: if the hybrid fallback ran and found nothing at all, the reason you get back is cold_start regardless of why you were on the fallback in the first place.
Fields
The four states you can actually see
path: "hybrid" with degraded: false cannot happen. Every hybrid response is degraded by definition.
no_brain and brain_stale are different problems
no_brain is a setup gap: nobody has trained this org’s brain. The fix is POST /v1/brain/train, once.
brain_stale is a maintenance signal: a brain exists and the graph has moved. It is raised two ways. The brain itself reports divergence when node and edge counts drift far enough, which sends you to the hybrid path. Separately, every mutation through the public API stamps the brain dirty, which keeps you on the brain path but sets degraded: true. That second mechanism exists because editing a node’s text or tombstoning it never changes a count, so a count check alone would call a stale brain healthy.
cold_start is neither. It says the search found nothing, so check that the subject has content and that their import jobs have finished before you look at the brain at all.
How to use it
Branch ondegraded once, and let degradationReason decide what you tell the user.
cognition first. On a new org every retrieval is hybrid, so the degraded path is the one your code will exercise before any other.
Details worth knowing
Whether a degraded answer is a worse answer
Whether a degraded answer is a worse answer
Usually thinner rather than wrong. Hybrid retrieval still ranks the right content; what it cannot give you is the reasoning trace, the focal set, or the brain’s own confidence. If your product only shows sources, a degraded response may be indistinguishable to the user. If it shows confidence or explains itself,
degraded is the field that should change the wording.What still works on the hybrid path
What still works on the hybrid path
sources with full provenance, contradictions, usage, traceId, latencyMs, expand=sources.content and streaming. Only cognition is withheld, because the hybrid path has no reasoning state to report and inventing one would be the exact dishonesty these fields exist to prevent.How to clear brain_stale
How to clear brain_stale
Retrain with
POST /v1/brain/train. Training is asynchronous and one train per org may be in flight, so a second call while one is running returns 409 conflict. The serve path picks the new brain up on its own once training finishes; you do not restart anything.Why cold_start can appear on an org that has plenty of content
Why cold_start can appear on an org that has plenty of content
Because it is per call, not per org. It fires when this particular query matched nothing for the effective subject. A wrong
X-Exo-Subject, a subject who has genuinely ingested nothing, or an import that is still running all produce it. Check GET /v1/jobs before assuming the query was bad.Limits
- The route decides. There is no parameter that forces the brain path or forbids it.
degradationReasonis typed as a plain string. The three values above are what ships today; keep a default branch.- A
brain_staleresponse does not say how stale.cognition.driftRateis the closest thing to a magnitude, and it only covers the region this query touched. pathdescribes the engine, not quality. It is not a confidence score, and it should not be shown to end users as one.
Next
Cognition
The block that is present on one path and null on the other.
ExoBrain
What the per-org model is, and what training it costs you.