Suggestions
POST /v1/suggestions — score a batch of titles for one member.
POST /v1/suggestions takes a batch of titles you’re about to show a member and
scores them against that member’s bound persona and affinity — a fast-tier
“why this, for you” pass over content you already have on screen.
Session-scoped — requires the
X-Session-Id header. Body (max 64 KiB):
deltaandboostScore(0–100) are code-clamped composites — the model supplies a raw signal, deterministic code computes the final numbers.whyForYouandbehavioralInsightare passenger-visible model free text.moodInferenceis optional and may benull.
Age-gating: an empty result is honest, not an error
Before any model call, the requested titleIds are filtered against the member’s
age tier. This has an important consequence:
A fully-gated request returns an honest empty result, not a 4xx. If none
of the titles you sent are allowed for this member’s tier (e.g. a Child
member and all-mature titles, or an unbound member whose tier is Unknown),
the platform makes no model call and returns a 200 with empty fields:
(moodInference is null here, and null fields are omitted from responses
— so the key is simply absent, not sent as null.)
Do not treat this as a failure — it is the fail-closed design, and it costs
nothing. If you expected results, check that the member is
bound with the right age and that the titleIds suit
their tier.
Titles the visible catalog has no rating for (never seen, or outside your namespace) are treated as unknown-rating and excluded for non-adult tiers — so a legitimate client should only send ids it surfaced through an already-gated catalog view.
Today the result rides this HTTP response only — the
suggestions.updated SSE frame is not yet
published. Read the response directly.
Errors
Standard envelope: 400 session.unresolved, 401 / 403,
422 request.validation (blank seatId, empty titleIds, or more than 20),
500.