{"ok":true,"version":"agent-workflow-triggers.v1","generatedAt":"2026-05-30T06:51:54.051Z","surface":{"id":"workflow-triggers","artistId":"laurel","safeForAgent":true,"browserAutomationRequired":false,"deliveryRuntimeReady":true,"manualTestDeliveryReady":true,"subscriptionRegistryReady":true,"relatedIssues":[608,800,807,986,1112,1113,1114,1124,1125,1126,1127,1128,1223,1523,1531,1537]},"currentStatus":{"contract":"manifest-ready","subscriptionRegistry":"ready","delivery":"member-idea-runtime-ready-other-families-disabled","summary":"This surface defines the signed webhook trigger catalog, deterministic sample payloads, an authenticated subscription registry, manual signed test delivery, and automatic runtime fan-out for member.idea.submitted. Other trigger families remain manual-test-only or manifest-ready until future slices."},"whenToUse":{"webhookTriggers":"Use triggers when an authorized external agent should react to a Fanful event without polling, such as live readiness changing or checkout completing.","mcpPolling":"Use MCP reads when an agent is answering an on-demand question, needs the latest state before a confirmed write, or lacks a durable event subscription.","firstRule":"A trigger payload is a prompt to read the current manifest before acting; it is not permission to mutate Fanful state."},"deliveryContract":{"endpointStatus":"member-idea-runtime-ready-other-families-disabled","subscriptionEndpoint":{"href":"https://docs.fanful.net/api/agent/workflow-triggers/subscriptions","method":"POST","auth":"scoped-agent-grant","description":"Register signed webhook destinations, send authenticated manual test deliveries, and receive member.idea.submitted runtime deliveries."},"subscriptionRegistry":{"contract":"agent-workflow-trigger-subscriptions.v1","issue":"#1523","status":"ready","deliveryEnabled":true,"manualTestDeliveryEnabled":true,"runtimeDeliveryEnabled":true,"runtimeDeliveryEnabledFamilies":["member.idea.submitted"],"methods":["GET","POST","PATCH","DELETE"],"supportedActions":["create_subscription","send_test_delivery","pause_subscription","resume_subscription","delete via DELETE"],"requiredScopes":["agent:workflow-triggers:subscribe","platform:ops:read"],"redactionPolicy":"Subscription reads return endpoint host/path previews and signing-secret configuration status, never raw signing secret material."},"manualTestDelivery":{"contract":"agent-workflow-trigger-deliveries.v1","issue":"#1531","status":"ready","action":"send_test_delivery","endpoint":"https://docs.fanful.net/api/agent/workflow-triggers/subscriptions","description":"Authenticated operators or scoped creator agents can send one signed, redacted manual test payload to an active subscription and inspect the redacted audit row.","automaticRuntimeFanoutEnabled":true},"runtimeDelivery":{"contract":"agent-workflow-trigger-deliveries.v1","issue":"#1537","status":"member-idea-ready","enabledTriggerFamilies":["member.idea.submitted"],"disabledTriggerFamilies":["live.room.readiness.changed","listener.support-checkout.completed","community.message.escalated","creator.catalog.drift.detected"],"automaticRetryScheduled":false,"description":"Fanful sends first-attempt signed runtime webhooks for visible member.idea.submitted events to active matching subscriptions. Other families stay disabled for runtime delivery in this slice."},"signature":{"algorithm":"hmac-sha256","canonicalString":"deliveryId.timestamp.rawBodySha256","headers":["x-fanful-event-id","x-fanful-trigger-id","x-fanful-delivery-id","x-fanful-timestamp","x-fanful-signature"],"secretPolicy":"Webhook secrets stay server-to-server. They are never accepted as MCP tool input and should not appear in model-visible logs."},"retries":{"policy":"Manual-test and member.idea.submitted runtime attempts persist retry metadata; automatic retry scheduling is planned.","idempotency":"Consumers must treat event id plus delivery id as stable retry keys. Fanful rejects duplicate delivery idempotency keys per subscription.","ordering":"Do not assume global ordering. Consumers should read the linked Fanful manifest for current state before acting."}},"eventEnvelope":{"requiredFields":["id","type","version","occurredAt","artist","community","target","state","links","correlation","redactions"],"correlationFields":["idempotencyKey","auditCorrelationId"],"redactionPolicy":"Payloads should carry public ids, redacted references, and manifest links. Raw listener ids, Better Auth ids, Stripe ids, media URLs, invite tokens, and provider secrets stay out of payloads."},"triggerFamilies":[{"id":"live.room.readiness.changed","title":"Live room readiness changed","domain":"live","audience":["fan","creator"],"status":"manifest-ready","summary":"Non-destructive trigger contract for agents that need to react when a live room becomes joinable, blocked, cancelled, or ended without polling live-readiness on every turn.","sourceManifest":{"href":"https://docs.fanful.net/api/agent/live-readiness","method":"GET","auth":"guest","description":"Read the current listener-safe live-room, embedded-room, and Listen Along readiness state."},"suggestedScopes":["public:read","listener:listen-along:read","creator:<artistId>:live:read"],"payloadContract":"agent-workflow-trigger.live-room-readiness.v1","deliveryStatus":"Live event create, schedule, stream, and status changes now record signed, redacted trigger status on the live-event audit row. Subscriber registry and manual test delivery are available; automatic runtime fan-out remains disabled.","redactedFields":["raw listener ids","Better Auth user ids","private invite tokens","media provider tokens","stream keys","raw media URLs"],"followUpIssues":[800,807,1112,1113,1126],"samplePayload":{"id":"evt_agent_live_readiness_0001","type":"live.room.readiness.changed","version":"agent-workflow-trigger.live-room-readiness.v1","occurredAt":"2026-05-16T00:00:00.000Z","artist":{"id":"laurel","displayName":"Laurel Harned"},"community":{"id":"community_laurel_public","mode":"fan"},"target":{"type":"live-event","id":"laurel-studio-room","summary":"Laurel Studio Room became joinable for signed-in fans."},"state":{"previous":"scheduled","current":"joinable","blockers":[],"nextActions":["Open the live room","Notify subscribed fans"]},"links":{"currentManifest":"https://docs.fanful.net/api/agent/live-readiness?eventId=laurel-studio-room","actionContracts":"https://docs.fanful.net/api/agent/action-contracts?audience=creator&domain=live"},"correlation":{"idempotencyKey":"agent-trigger-live-readiness-laurel-studio-room-2026-05-16T000000Z","auditCorrelationId":"agent-trigger-audit-live-readiness-0001"},"redactions":["media provider tokens","stream keys","private invite tokens","raw listener ids"]}},{"id":"listener.support-checkout.completed","title":"Support checkout completed","domain":"commerce","audience":["listener","creator"],"status":"manifest-ready","summary":"Signed trigger record for notifying an authorized agent that a support-only checkout intent reached a terminal paid state without exposing Stripe Checkout ids in model-visible output.","sourceManifest":{"href":"https://docs.fanful.net/api/agent/listener-experience","method":"GET","auth":"scoped-agent-grant","description":"Read redacted listener support checkout status through the existing listener-experience manifest."},"suggestedScopes":["listener:checkout:preview","listener:checkout:start","creator:<artistId>:read"],"payloadContract":"agent-workflow-trigger.support-checkout.v1","deliveryStatus":"Paid support checkout reconciliation now records a signed, redacted trigger payload on the checkout intent. Subscriber registry and manual test delivery are available; automatic runtime fan-out remains disabled.","redactedFields":["Stripe Checkout Session ids","Stripe PaymentIntent ids","Stripe customer ids","raw listener ids","Better Auth user ids","grant ids","agent bearer tokens","checkout URLs"],"followUpIssues":[986,1069,1112,1113,1124],"samplePayload":{"id":"evt_agent_support_checkout_0001","type":"listener.support-checkout.completed","version":"agent-workflow-trigger.support-checkout.v1","occurredAt":"2026-05-16T00:05:00.000Z","artist":{"id":"laurel","displayName":"Laurel Harned"},"community":{"id":"community_laurel_public","mode":"fan"},"target":{"type":"support-checkout","reference":"support-deadbeef","summary":"Support donation completed."},"state":{"previous":"checkout_started","current":"paid","terminal":true,"nextActions":["Read the current purchase-link status before acting","Read action contracts before any follow-up write"]},"checkout":{"amountCents":2500,"currency":"usd","supportContext":"general-support","liveEvent":null,"rawIdentifiersRedacted":true},"links":{"currentManifest":"https://docs.fanful.net/api/agent/listener-experience?purchaseStatusReference=support-deadbeef","actionContracts":"https://docs.fanful.net/api/agent/action-contracts?audience=listener&domain=commerce","workflowTriggers":"https://docs.fanful.net/api/agent/workflow-triggers?family=listener.support-checkout.completed"},"correlation":{"idempotencyKey":"agent-trigger-support-checkout-deadbeef-paid","auditCorrelationId":"agent-trigger-audit-support-deadbeef"},"redactions":["Stripe ids","raw listener ids","payment identifiers","checkout URLs"]}},{"id":"member.idea.submitted","title":"Member idea submitted","domain":"ideas","audience":["fan","creator"],"status":"manifest-ready","summary":"Signed trigger record for agents that summarize new visible member ideas, detect duplicates, or prepare creator review queues without exposing hidden review notes to public clients.","sourceManifest":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"GET","auth":"guest","description":"Read visible idea-board state and authorized admin-redacted review fields."},"suggestedScopes":["listener:ideas:read","creator:<artistId>:read"],"payloadContract":"agent-workflow-trigger.member-idea.v1","deliveryStatus":"Visible member idea submissions now fan out signed, redacted runtime webhooks to active subscriptions. Other trigger families remain manual-test-only or manifest-ready until future slices.","redactedFields":["raw user ids","voter ids","reviewer ids","hidden ideas","private admin notes"],"followUpIssues":[602,1108,1112,1125,1537],"samplePayload":{"id":"evt_agent_member_idea_0001","type":"member.idea.submitted","version":"agent-workflow-trigger.member-idea.v1","occurredAt":"2026-05-16T00:10:00.000Z","artist":{"id":"laurel","displayName":"Laurel Harned"},"community":{"id":"community_laurel_public","mode":"fan"},"target":{"type":"member-idea","publicId":"idea-live-setlist-vote","title":"Vote on the next live setlist","summary":"New visible idea submitted for creator review."},"state":{"visibility":"visible","reviewStatus":"under_review","featured":false,"voteCount":0,"nextActions":["Read the current idea-board manifest before acting","Prepare creator review summaries only; do not auto-post, hide, feature, or change status without confirmation"]},"idea":{"bodyPreview":"Let members vote on two or three pieces before the next live room.","displayName":"Member","createdAt":"2026-05-16T00:10:00.000Z","updatedAt":"2026-05-16T00:10:00.000Z","reviewedAt":null,"rawIdentifiersRedacted":true},"links":{"currentManifest":"https://docs.fanful.net/api/agent/idea-board","actionContracts":"https://docs.fanful.net/api/agent/action-contracts?audience=creator&domain=ideas","workflowTriggers":"https://docs.fanful.net/api/agent/workflow-triggers?family=member.idea.submitted"},"correlation":{"idempotencyKey":"agent-trigger-member-idea-live-setlist-vote-submitted","auditCorrelationId":"agent-trigger-audit-member-idea-live-setlist-vote"},"redactions":["raw user ids","voter ids","reviewer ids","hidden ideas","private admin notes"]}},{"id":"community.message.escalated","title":"Community message escalated","domain":"community","audience":["creator","operator"],"status":"manifest-ready","summary":"Signed trigger record for moderation or creator-speech assistants that need to prepare a review without auto-posting or speaking on behalf of the creator.","sourceManifest":{"href":"https://docs.fanful.net/api/agent/community-chat","method":"GET","auth":"artist-admin-or-approved-automation","description":"Read community channels, safe message windows, and admin moderation descriptors."},"suggestedScopes":["creator:<artistId>:community:moderate","creator:<artistId>:community:speak"],"payloadContract":"agent-workflow-trigger.community-escalation.v1","deliveryStatus":"Community moderation changes now record signed, redacted trigger status on the community-chat audit row. Subscriber registry and manual test delivery are available; automatic runtime fan-out remains disabled.","redactedFields":["raw message body","hidden message body","raw user ids","Better Auth user ids","moderation notes","admin tokens","agent bearer tokens"],"followUpIssues":[573,616,629,1112,1127],"samplePayload":{"id":"evt_agent_community_escalation_0001","type":"community.message.escalated","version":"agent-workflow-trigger.community-escalation.v1","occurredAt":"2026-05-16T00:15:00.000Z","artist":{"id":"laurel","displayName":"Laurel Harned"},"community":{"id":"community_laurel_public","mode":"fan"},"target":{"type":"community-message","id":"community-message-review-0001","channelId":"laurel-community-general","publicChannel":"general","channelName":"General","summary":"Message needs creator or moderator review."},"state":{"previousStatus":"visible","currentStatus":"flagged","severity":"review","reviewOnly":true,"autoReplyAllowed":false,"publicActionAllowed":false,"nextActions":["Read the current community-chat manifest before acting","Prepare a creator/operator review summary only","Do not auto-reply, hide, delete, restore, or speak for the creator without explicit confirmation"]},"message":{"authorKind":"listener","authorDisplayName":"Member","bodyRedacted":true,"rawIdentifiersRedacted":true},"moderation":{"action":"message_moderate","reasonPresent":true,"performedByRole":"artist_admin","rawModerationNotesRedacted":true},"links":{"currentManifest":"https://docs.fanful.net/api/agent/community-chat?channelId=laurel-community-general","actionContracts":"https://docs.fanful.net/api/agent/action-contracts?audience=creator&domain=community","workflowTriggers":"https://docs.fanful.net/api/agent/workflow-triggers?family=community.message.escalated"},"correlation":{"idempotencyKey":"agent-trigger-community-escalation-community-message-review-0001-2026-05-16T001500Z","auditCorrelationId":"agent-trigger-audit-community-escalation-0001"},"redactions":["raw message body","hidden message body","raw user ids","moderation notes","admin tokens"]}},{"id":"creator.catalog.drift.detected","title":"Creator catalog drift detected","domain":"platform","audience":["creator","operator"],"status":"manifest-ready","summary":"Signed, redacted trigger record for surfacing drift between Fanful app-state catalog references and provider/catalog snapshots such as Stripe without performing write-back.","sourceManifest":{"href":"https://docs.fanful.net/api/agent/sync-jobs","method":"GET","auth":"artist-admin-or-approved-automation","description":"Read cursor-based sync job status, checkpoint health, and redacted catalog drift reports."},"suggestedScopes":["creator:<artistId>:commerce:preview","platform:ops:read"],"payloadContract":"agent-workflow-trigger.catalog-drift.v1","deliveryStatus":"Sync checkpoints that detect reviewable catalog drift can now produce deterministic signed trigger records. Subscriber registry and manual test delivery are available; automatic runtime fan-out remains disabled.","redactedFields":["provider credentials","raw Stripe Price ids","raw Stripe Product ids","payment identifiers","private catalog database ids","raw provider snapshot rows"],"followUpIssues":[799,1052,1114,1128],"samplePayload":{"id":"evt_agent_catalog_drift_lesson_offering_intro_guitar_lesson_sync_digest_catalog_app_references_0001","type":"creator.catalog.drift.detected","version":"agent-workflow-trigger.catalog-drift.v1","occurredAt":"2026-05-16T00:20:00.000Z","artist":{"id":"laurel","displayName":"Laurel Harned"},"community":{"id":"community_laurel_public","mode":"publisher"},"target":{"type":"lesson-offering","publicId":"intro-guitar-lesson","title":"Intro guitar lesson","modelVisibleReference":"catalog-ref:lesson-offering:intro-guitar-lesson","summary":"Fanful lesson offering differs from latest catalog snapshot."},"state":{"driftKind":"price-reference-missing","currentStatus":"needs-review","writeBackAllowed":false,"reviewRequired":true,"nextActions":["Read the current sync-job manifest before acting.","Read the creator-commerce manifest to compare current Fanful app references.","Summarize the drift for a creator/operator; do not create, remap, or write back Stripe/provider objects without a confirmed action contract."]},"checkpoint":{"syncJobId":"sync-job-stripe-catalog-app-references-0001","sourceProvider":"stripe-catalog-readiness","cursor":"catalog-ref:membership-tier:studio-circle:2026-05-16T07:10:00.000Z","highWatermark":"2026-05-16T07:10:00.000Z","digest":"sync-digest-catalog-app-references-0001","recordsProcessed":3,"duplicateRecordsSkipped":1,"driftFindings":1,"rawIdentifiersRedacted":true},"catalog":{"appReference":"catalog-ref:lesson-offering:intro-guitar-lesson","providerReferenceRedacted":true,"paymentIdentifiersRedacted":true,"credentialsRedacted":true},"links":{"currentManifest":"https://docs.fanful.net/api/agent/sync-jobs?jobId=sync-job-stripe-catalog-app-references-0001&checkpointDigest=sync-digest-catalog-app-references-0001","creatorCommerce":"https://docs.fanful.net/api/agent/creator-commerce?catalogReference=catalog-ref%3Alesson-offering%3Aintro-guitar-lesson","actionContracts":"https://docs.fanful.net/api/agent/action-contracts?audience=creator&domain=commerce","workflowTriggers":"https://docs.fanful.net/api/agent/workflow-triggers?family=creator.catalog.drift.detected"},"correlation":{"idempotencyKey":"agent-trigger-catalog-drift-lesson_offering_intro_guitar_lesson_sync_digest_catalog_app_references_0001","auditCorrelationId":"agent-trigger-audit-catalog-drift-lesson_offering_intro_guitar_lesson_sync_digest_catalog_app_references_0001"},"redactions":["provider credentials","raw Stripe Price ids","raw Stripe Product ids","payment identifiers","private catalog database ids","raw provider snapshot rows","agent authorization credentials"]}}],"agentClientGuidance":["Verify the signature before parsing or storing a trigger payload.","Use event id plus delivery id for retry idempotency.","Read the linked Fanful manifest before taking action because trigger payloads are intentionally compact and redacted.","Never perform public, destructive, billing-impacting, moderation, checkout, or creator-speech writes unless the current action-contract manifest marks the operation ready and the write envelope is confirmed."]}