Enrichment
POST /v1/enrichment — deep per-member behavioral enrichment, on a trigger gate.
POST /v1/enrichment runs a deeper pass over a member’s accumulated behavior to
surface newly-discovered preferences and genre-affinity shifts, with a
passenger-visible narrative. It is gated: a deterministic trigger decides
whether the deep pass is warranted before any model call, so most requests are
cheap and only some do real work.
Session-scoped — requires the
X-Session-Id header. Enrichment is title-free by design: you identify the
member, not a content batch. Request body max 8 KiB.
When the trigger fires, applied is true and the pass returns real content:
discoveredPreferences[].confidenceandgenreShifts[].magnitudeare code-clamped to 0–1.reasoningNarrativeis passenger-visible model free text.
applied: false is a cost-free decline, not an error
When the trigger gate declines — the member is rate-limited, a pass is already
in flight, or a session cap is reached — the response is a 200 with
applied: false, no model call made, and empty content:
This is normal and costs nothing. Branch on applied: only merge results when
it is true; an applied: false simply means “not now.”
Enrichment never rewrites the member’s persona — the persona is immutable
for the session. The refinement rides this response (and the affinity signals
that scored serve and
suggestions already read), not a persona mutation. The
enrichment.ready SSE frame is not yet
published — read this HTTP response.
Errors
Standard envelope: 400 session.unresolved, 401 / 403,
422 request.validation, 500. Note a declined trigger is not an error —
it’s a 200 with applied: false.