Compose a session prompt
Compose the identity-conditioned system prompt for a coding or chat session.
expiresAt says how long the result stays fresh enough to cache.
Composed for the effective subject: the API key owner by default, or the subject named by the X-Exo-Subject header.
Authorization
This route requires theread scope.
A missing or invalid credential returns 401 authentication_error. A valid credential without the scope returns 403 permission_denied, and the problem body names the exact scope required.
Headers
These are request conventions the contract does not declare as parameters, so they do not appear in the schema tables below.Success responses
Errors
application/problem+json body carrying a stable code, a requestId, and a suggestedAction where Exo has one. See Errors.
Notes
- The pack is built to be injected, not parsed. Put
systemPromptinto your own model’s system message and you get a model that reasons and sounds like the subject. - Respect
expiresAt. It is how long the pack stays fresh enough to cache. Refetch after abasin.shiftedevent rather than on a timer if you subscribe to events. userVoiceHintcan be absent. The voice profile is withheld until the subject has produced enough writing to measure.
Authorizations
An Exo API key (exo_...) sent as the X-Exo-API-Key header.
Body
Response
The composed system prompt with voice hint, recent org context and cache expiry.
Everything an agent needs to answer as this subject, composed on demand.
This is the object that turns a stored knowledge graph into a working session: a system prompt built from the subject's identity and current manifold basin, a voice hint drawn from how they actually write, and a short digest of what the rest of the org has been doing. An agent that injects the pack at session start reasons from the subject's own history instead of from a blank slate.
expiresAt is a freshness bound, not a hard deadline: the pack stays
usable past it, but the identity underneath may have moved, so recompose.
userVoiceHint is null until the subject has written enough for a voice
profile to exist, and orgRecentContext is empty on a single-member org or
a quiet window.
Usage block on condition responses (spec D13), camelCase on the wire.
The compose builders are pure SQL reads (no LLM call today), so the token
fields are null; readUnits meters one unit per compose call. If a
future builder version starts spending LLM tokens, it reports them here.