{"ok":true,"version":"agent-live-readiness.v1","generatedAt":"2026-05-30T06:52:20.716Z","surface":{"id":"live-readiness","artistId":"laurel","safeForAgent":true,"browserAutomationRequired":false,"relatedIssues":[448,505,507,528,560,608,609,801,807]},"principal":{"role":"guest","signedIn":false,"displayName":"Guest listener","userId":null,"email":null,"emailVerified":null,"adminRole":null,"capabilities":{"readPublicReadiness":true,"readSignedInJoinability":false,"readPrivateReadiness":false,"readListenAlongState":false,"createListenAlongInvite":false,"joinListenAlongInvite":false}},"filters":{"eventId":null,"roomId":null,"includeEnded":false},"readiness":{"summary":{"state":"no-active-experience","primaryExperienceId":null,"joinableCount":0,"actionNeededCount":0,"scheduledCount":0,"endedCount":0,"nextAction":"No live room, webinar, or room access is currently available."},"experiences":[],"listenAlong":{"id":"listen-along","kind":"listen-along","summary":{"state":"sign-in-required","activeSessionCount":0,"nextAction":"Sign in to create or join a Listen Along invite."},"sessions":[],"endpoints":{"create":{"href":"https://docs.fanful.net/api/listen-along/sessions","method":"POST","auth":"signed-in-listener","description":"Create a Listen Along invite."},"join":{"href":"https://docs.fanful.net/api/listen-along/join","method":"POST","auth":"signed-in-listener","description":"Join a Listen Along invite with a caller-provided token."},"state":{"href":"https://docs.fanful.net/api/listen-along/state","method":"GET","auth":"signed-in-listener","description":"Read one Listen Along session state.","query":["sessionId"]},"leave":{"href":"https://docs.fanful.net/api/listen-along/leave","method":"POST","auth":"signed-in-listener","description":"Leave a Listen Along session."},"revoke":{"href":"https://docs.fanful.net/api/listen-along/sessions","method":"PATCH","auth":"signed-in-listener","description":"Revoke a hosted Listen Along invite."}},"redactedFields":["inviteToken","inviteTokenHash","hostUserId"]}},"workflowTriggers":{"liveRoomReadinessChanged":{"type":"live.room.readiness.changed","version":"agent-workflow-trigger.live-room-readiness.v1","status":"manifest-ready","delivery":"not-enabled","summary":"Live event create, schedule, stream, and status changes record deterministic signed trigger status for authorized agents. The subscription registry and manual test delivery are ready, but automatic runtime fan-out remains disabled.","recentReadinessChanges":[],"idempotency":"Event id, delivery id, and idempotency key are deterministic from the live event id and audit timestamp, so duplicate delivery retries collapse to the same keys.","boundaries":["Guest/listener clients only see trigger status for live events already visible in the live-readiness manifest.","Trigger payloads redact stream URLs, stream keys, media provider tokens, private invite tokens, and raw listener ids.","Triggers may prepare summaries or review queues, but public messages, go-live, end, cancel, or stage/media actions still require confirmed action contracts."]}},"linkedSurfaces":[{"id":"listener-experience","status":"ready","manifest":{"href":"https://docs.fanful.net/api/agent/listener-experience","method":"GET","auth":"optional-session","description":"Read the broader listener/fan agent manifest."},"mcpResource":"fanful://agent/listener-experience/manifest"},{"id":"live-controls","status":"ready","manifest":{"href":"https://docs.fanful.net/api/agent/live-controls","method":"GET","auth":"optional-session","description":"Read creator/admin live controls and go-live readiness."},"mcpResource":"fanful://agent/live-controls/manifest"},{"id":"embedded-rooms","status":"ready","manifest":{"href":"https://docs.fanful.net/api/agent/embedded-rooms","method":"GET","auth":"artist-admin-or-approved-automation","description":"Read admin embedded-room summaries and roster contracts."},"mcpResource":"fanful://agent/embedded-rooms/manifest"},{"id":"community-chat","status":"ready","manifest":{"href":"https://docs.fanful.net/api/agent/community-chat","method":"GET","auth":"optional-session","description":"Read event-linked community channel state."},"mcpResource":"fanful://agent/community-chat/manifest"}],"operations":[{"id":"fan.live-readiness.read","toolName":"fan_live_readiness_read","status":"ready","enabled":true,"summary":"Read whether the current caller can join Laurel live rooms, embedded webinar rooms, and Listen Along sessions, with blockers and next actions.","endpoint":{"href":"https://docs.fanful.net/api/agent/live-readiness","method":"GET","auth":"optional-session","description":"Read listener-safe live, room, webinar, and Listen Along readiness.","query":["eventId","roomId","includeEnded"]},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"attribution":"Read-only readiness. Signed-in joinability uses the caller's first-party session and redacts raw listener, room, media, and invite identifiers."},"input":{"eventId":{"type":"string","required":false,"description":"Optional live event id. Private draft/cancelled events require admin or automation access."},"roomId":{"type":"string","required":false,"description":"Optional embedded room id. Invite-only private rooms redact details unless the caller is authorized."},"includeEnded":{"type":"boolean","required":false,"description":"Include recent ended public experiences so agents can explain that the room is over."}},"boundaries":["Does not expose stream URLs, RealtimeKit room ids, participant tokens, invite tokens, raw user ids, or private attendee lists.","This route is read-only. Scheduling, go-live, moderation, and roster writes stay in the live-controls and embedded-room admin manifests."]},{"id":"fan.live-chat.messages.post","toolName":"fan_live_chat_messages_post","status":"contract-only","enabled":false,"summary":"Post a live-room or embedded-room chat message as the listener after confirmation and attribution are explicit.","endpoint":null,"confirmation":{"required":true,"kind":"public-message","reason":"Live chat and room messages are public or semi-public fan speech."},"audit":{"required":true,"currentRecord":"live_chat_messages/embedded_room_messages","attribution":"Future agent writes must carry the signed-in listener identity plus agent client metadata."},"input":{},"boundaries":["Use this manifest to decide readiness only; do not automate hidden web UI to post messages.","Creator-speech automation belongs to the community-chat automation surface, not fan readiness."]},{"id":"fan.listen-along.manage","toolName":"fan_listen_along_manage","status":"ready","enabled":false,"summary":"Create, join, read, leave, or revoke a signed-in listener's Listen Along session through existing endpoints.","endpoint":null,"confirmation":{"required":false,"kind":"listen-along","reason":null},"audit":{"required":false,"currentRecord":"listen_along_sessions/listen_along_participants","attribution":"Listen Along session changes are attributed to the signed-in listener session."},"input":{"action":{"type":"enum","required":true,"values":["create","join","state","leave","revoke"]},"sessionId":{"type":"string","required":false},"inviteToken":{"type":"string","required":false,"description":"Caller-provided token only. The readiness manifest never exposes private invite tokens."}},"boundaries":["Invite tokens and session ids are short-lived handles; do not copy raw invite tokens into long-lived model-visible notes.","Agents should only join or revoke a shared listening session after the listener asks."]}],"policy":{"writeConfirmation":"This manifest is read-only. Public messages, Listen Along joins/revokes, room media-token creation, and paid access changes must use their first-party endpoints and confirmation rules.","secretHandling":"Do not expose stream URLs, RealtimeKit identifiers, participant tokens, invite tokens, raw user ids, attendee emails, media config JSON, or payment identifiers in model-visible output.","privacy":"Private draft/cancelled live events and invite-only rooms return redacted unauthorized readiness unless the caller is an approved admin or automation."},"serverGaps":[{"id":"production-realtimekit-credentials","relatedIssue":650,"status":"blocked","note":"Cloudflare RealtimeKit production credentials are still required before realtime embedded-room media can move from readiness warnings to ready playback."},{"id":"agent-write-envelope","relatedIssue":608,"status":"planned","note":"Listener chat writes, room media joins, and Listen Along mutations should share the cross-surface confirmation and attribution envelope before becoming broad MCP tools."}],"redactedFields":["listenerId","betterAuthUserId","attendeeEmail","inviteToken","inviteTokenHash","streamUrl","streamCustomerCode","streamPlaybackUrl","mediaRoomId","mediaConfigJson","participantToken","stripeCheckoutSessionId","purchase.id"]}