{"ok":true,"version":"agent-creator-commerce.v1","generatedAt":"2026-05-30T06:50:59.045Z","surface":{"id":"creator-commerce","artistId":"laurel","safeForAgent":true,"browserAutomationRequired":false,"relatedIssues":[530,534,608,609,612,671,798,799,925,926,945,1052,1053,1057,1083,1413,1490,1493,1509,1548,1550,1622,1681,1684,1692,1794,1795]},"principal":{"source":"guest","role":"guest","signedIn":false,"displayName":"Guest listener","userId":null,"email":null,"adminRole":null,"capabilities":{"readPublicCommerce":true,"readCreatorCommerce":false,"previewLessonPriceChange":false,"updateLessonOffering":false,"updateShopProduct":false,"manageEntitlements":false}},"communityMode":{"version":"fanful-community-mode.v1","contractDoc":"docs/platform/fanful-community-mode-contract.md","relatedIssues":[560,1075,1078],"source":"agent-creator-commerce","selectedCommunity":{"id":"laurel","slug":"laurel-harned","name":"Laurel Harned","role":"first-default-community","isDefault":true,"artistSite":"https://docs.fanful.net/","rawDatabaseIdsRedacted":true},"activeMode":"fan","availableModes":[{"id":"fan","status":"available","summary":"Listen, watch, chat, support, buy, and participate as a fan of the selected community.","requiredAuthorization":"Public or signed-in listener context for private fan state."},{"id":"publisher","status":"authorization-required","summary":"Administer creator/community commerce, live rooms, messaging, moderation, and settings.","requiredAuthorization":"Server-confirmed creator/admin authorization for selectedCommunity.id.","blockedUnless":"Do not expose or execute publisher actions until the backend resolves creator/admin authorization for this selected community."}],"modeSwitching":{"oneAccount":true,"requiresSignOut":false,"preservesPlayerSession":true,"preservesListenerIdentity":true,"authorizationBoundary":"Switching into publisher mode never grants authority by itself; each creator/admin action must still pass server-side scope and role checks for the selected community."},"agentInstructions":["Display selectedCommunity.name and activeMode before proposing community-scoped actions.","Offer fan actions by default; offer publisher actions only when publisher mode is available or when asking the human to authorize it.","Do not assume Laurel-only global context when future communities are added; carry selectedCommunity.id through proposals and confirmations."],"redactedFields":["community.databaseId","artist.internalId","admin.grantId","agentBearerToken"]},"artistFanFeatures":{"version":"artist-fan-feature-settings.v1","artistId":"laurel","sourceContract":{"file":"src/lib/fan-navigation.ts","settingsFunction":"getArtistFanFeatureSettings","navigationContract":"fanNavigationContract","navigationBuilder":"buildFanNavigationItems"},"settings":{"listening":true,"liveStreams":true,"communityChat":false,"dates":true,"media":true,"press":true,"support":true,"memberships":true,"ideas":true,"roadmap":true,"lessons":false,"shop":true},"capabilities":[{"id":"listening","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.listeningRoom or recordingLibrary","runtimeAvailability":"static-config","disabledReason":null},{"id":"liveStreams","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.liveRoom","runtimeAvailability":"static-config","disabledReason":null},{"id":"communityChat","enabled":false,"currentSource":"community_chat_settings.enabled plus at least one active community_chat_channels row","runtimeAvailability":"runtime-d1","disabledReason":"Community chat is disabled in D1 or no active community channel is visible."},{"id":"dates","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.performanceDates","runtimeAvailability":"static-config","disabledReason":null},{"id":"media","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.mediaGallery","runtimeAvailability":"static-config","disabledReason":null},{"id":"press","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.epkBooking","runtimeAvailability":"static-config","disabledReason":null},{"id":"support","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.support","runtimeAvailability":"static-config","disabledReason":null},{"id":"memberships","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.memberships","runtimeAvailability":"static-config","disabledReason":null},{"id":"ideas","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.ideaBoard","runtimeAvailability":"static-config","disabledReason":null},{"id":"roadmap","enabled":true,"currentSource":"laurelSiteConfig.enabledFeatures.roadmap","runtimeAvailability":"static-config","disabledReason":null},{"id":"lessons","enabled":false,"currentSource":"active lesson offerings with future open lesson_availability_windows rows","runtimeAvailability":"runtime-d1","disabledReason":"Lessons are disabled because there is no active offering with future open availability."},{"id":"shop","enabled":true,"currentSource":"feature_flags.shop plus at least one active, in-stock public store_items row","runtimeAvailability":"runtime-d1","disabledReason":null}],"navigation":[{"id":"listen","label":"Listen","href":"/listen","requiredAny":["listening"],"status":"available","enabled":true,"enabledBy":["listening"],"disabledReason":null},{"id":"live","label":"Live","href":"/live","requiredAny":["liveStreams","communityChat"],"status":"available","enabled":true,"enabledBy":["liveStreams"],"disabledReason":null},{"id":"press","label":"Press","href":"/press","requiredAny":["press"],"status":"available","enabled":true,"enabledBy":["press"],"disabledReason":null},{"id":"media","label":"Media","href":"/media","requiredAny":["media"],"status":"available","enabled":true,"enabledBy":["media"],"disabledReason":null},{"id":"dates","label":"Dates","href":"/dates","requiredAny":["dates"],"status":"available","enabled":true,"enabledBy":["dates"],"disabledReason":null},{"id":"support","label":"Support","href":"/support","requiredAny":["support","memberships"],"status":"available","enabled":true,"enabledBy":["support","memberships"],"disabledReason":null},{"id":"ideas","label":"Ideas","href":"/ideas","requiredAny":["ideas"],"status":"available","enabled":true,"enabledBy":["ideas"],"disabledReason":null},{"id":"roadmap","label":"Roadmap","href":"https://fanful.net/roadmap","requiredAny":["roadmap"],"status":"available","enabled":true,"enabledBy":["roadmap"],"disabledReason":null},{"id":"lessons","label":"Lessons","href":"/lessons","requiredAny":["lessons"],"status":"unavailable","enabled":false,"enabledBy":[],"disabledReason":"Unavailable because none of lessons are enabled for this artist."},{"id":"shop","label":"Shop","href":"/shop","requiredAny":["shop"],"status":"available","enabled":true,"enabledBy":["shop"],"disabledReason":null}],"liveTabRule":{"navigationItemId":"live","label":"Live","requiredAny":["liveStreams","communityChat"],"rule":"available-when-any-required-capability-is-enabled"}},"commerce":{"public":{"lessons":{"offerings":[{"id":"online-guitar-lesson","slug":"online-guitar-lesson","title":"Online classical guitar lesson","description":"A one-on-one online classical guitar lesson with Laurel. Admin availability controls when this appears publicly.","durationMinutes":45,"priceCents":7500,"currency":"usd","active":true,"availabilityCount":0,"nextAvailabilityAt":null}]},"shop":{"enabled":true,"products":[{"id":"open-guitar-demos-download","slug":"open-guitar-demos-download","title":"Open Guitar Demos Download","description":"A digital download bundle for Laurel's open classical guitar demo recordings.","kind":"download","priceCents":900,"active":true,"inventoryTracked":false,"inventoryCount":null,"inStock":true,"sortOrder":10},{"id":"zoom-lesson","slug":"zoom-lesson","title":"Zoom Lesson","description":"One 45-minute online classical guitar lesson.","kind":"lesson","priceCents":7500,"active":true,"inventoryTracked":false,"inventoryCount":null,"inStock":true,"sortOrder":20},{"id":"signed-cd","slug":"signed-cd","title":"Signed CD","description":"Physical signed copy of a future release.","kind":"physical","priceCents":2500,"active":true,"inventoryTracked":true,"inventoryCount":25,"inStock":true,"sortOrder":30}]},"memberships":{"tiers":[{"id":"supporter","name":"Supporter","description":"Monthly support for recordings, practice notes, and member updates.","monthlyAmountCents":500,"currency":"usd","formattedPrice":"$5.00/mo","active":true,"sortOrder":10,"hasStripePrice":true,"updatedAt":"2026-05-07T09:40:19.000Z","benefits":["Member-only tracks and updates","Behind-the-scenes practice notes","Supporter credit on future release pages"],"checkoutKind":"membership"},{"id":"patron","name":"Patron","description":"A deeper tier for early ticket access, patron credits, and supporter-only releases.","monthlyAmountCents":1200,"currency":"usd","formattedPrice":"$12.00/mo","active":true,"sortOrder":20,"hasStripePrice":true,"updatedAt":"2026-05-07T09:40:19.000Z","benefits":["Everything in Supporter","Early ticket access when dates open","Patron credit on recordings and videos","Patron access to paid-track experiments"],"checkoutKind":"membership"},{"id":"circle","name":"Laurel Circle","description":"Top-level monthly backing for release credits, priority booking, and private updates.","monthlyAmountCents":2500,"currency":"usd","formattedPrice":"$25.00/mo","active":true,"sortOrder":30,"hasStripePrice":true,"updatedAt":"2026-05-07T09:40:19.000Z","benefits":["Everything in Patron","Priority lesson and house-concert booking","Private seasonal studio updates"],"checkoutKind":"membership"}],"publicRoutes":{"compare":"https://docs.fanful.net/tiers","checkout":"https://docs.fanful.net/support#memberships"}}},"adminLessonCreditLedger":{"status":"auth-required","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"GET","auth":"artist-admin-or-approved-automation","description":"Read commerce.adminLessonCreditLedger.ledger from the agent-safe creator commerce manifest."},"ledger":null,"blocker":{"id":"creator-admin-authorization-required","reason":"Lesson credit ledger health is available only to scoped creator/admin agents or approved automation; guest and listener calls receive no partial ledger data.","acceptedAuth":["artist-admin-or-approved-automation"],"acceptedScopes":["creator:laurel:read","creator:laurel:commerce:preview"]},"redactedFields":["lesson_credit_ledger_events.id","userId","studentEmail","bookingId","purchaseId","policyId","idempotencyKey","reason","metadataJson","stripeCheckoutSessionId","stripePaymentIntentId"],"relatedIssues":[530,858,1417,1784,1794,1795]},"creator":null},"servicePricingPolicy":{"version":"creator-service-price-policy.v1","capability":"creator.service-price-policy.preview","operationId":"creator.service-price-policy.preview","safeForAgent":true,"requiredScopes":["creator:laurel:commerce:preview"],"auth":{"source":"guest","role":"guest","canPreview":false,"grant":null},"status":"auth-required","dryRun":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Preview creator service price/policy impact without mutating Fanful, Stripe, checkout, or public pages."},"supportedActions":["preview_lesson_offering_price_change"],"writesState":false},"confirmedWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_lesson_offering_price_change with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_lesson_offering_price_change"],"writesState":true,"supportedMutation":"lesson_offerings.price_cents","contractId":"creator.commerce.preview-and-update","toolName":"fanful_creator_service_price_policy_update"},"confirmedPolicySettingsWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_lesson_policy_settings_update with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_lesson_policy_settings_update"],"writesState":true,"supportedMutation":"lesson_policy_settings","contractId":"creator.commerce.lesson-policy-update","toolName":"fanful_creator_lesson_policy_update","status":"auth-required"},"confirmedAvailabilityWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_lesson_availability_update with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_lesson_availability_update"],"writesState":true,"supportedMutation":"lesson_availability_windows.offering_id + starts_at + ends_at + timezone + status + capacity","contractId":"creator.commerce.lesson-availability-update","toolName":"fanful_creator_lesson_availability_update","status":"auth-required","blockedMutations":["lesson_bookings.status","lesson_bookings.availability_window_id","lesson_bookings.starts_at","lesson_credit_ledger_events","stripe_checkout_sessions","meeting_url","notes"]},"confirmedShopProductCreateWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_shop_product_create with agent-write-envelope.v1 confirmation, idempotency, catalog stale-state, and audit checks."},"supportedActions":["confirm_shop_product_create"],"writesState":true,"supportedMutation":"store_items insert: title + description + kind + price_cents + active + show_in_shop + inventory fields + fulfillment/display metadata + sort_order","contractId":"creator.commerce.shop-product-create","toolName":"fanful_creator_shop_product_create","status":"auth-required","blockedMutations":["stripePriceId","externalUrl","downloadFileUrl","checkoutSessions","orderFulfillment","refunds","credits"]},"confirmedShopProductVisibilityWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_shop_product_visibility_update with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_shop_product_visibility_update"],"writesState":true,"supportedMutation":"store_items.active + store_items.show_in_shop","contractId":"creator.commerce.shop-product-visibility-update","toolName":"fanful_creator_shop_product_visibility_update","status":"auth-required","blockedMutations":["priceCents","stripePriceId","externalUrl","downloadFileUrl","orderFulfillment","refunds"]},"confirmedShopProductDetailsWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_shop_product_details_update with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_shop_product_details_update"],"writesState":true,"supportedMutation":"store_items.title + description + slug + inventory_tracked + inventory_count + fulfillment_note + download_file_name + download_release_notes + sort_order","contractId":"creator.commerce.shop-product-details-update","toolName":"fanful_creator_shop_product_details_update","status":"auth-required","blockedMutations":["priceCents","stripePriceId","externalUrl","downloadFileUrl","kind","id","checkoutSessions","orderFulfillment","refunds"]},"confirmedShopProductStripePriceSelectWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_shop_product_stripe_price_select with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_shop_product_stripe_price_select"],"writesState":true,"supportedMutation":"store_items.stripe_price_id","contractId":"creator.commerce.shop-product-stripe-price-select","toolName":"fanful_creator_shop_product_stripe_price_select","status":"auth-required","blockedMutations":["priceCents","externalUrl","downloadFileUrl","kind","id","checkoutSessions","orderFulfillment","refunds"]},"confirmedShopProductStripePriceCreateWrite":{"endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Execute confirm_shop_product_stripe_price_create with agent-write-envelope.v1 confirmation, idempotency, stale-state, and audit checks."},"supportedActions":["confirm_shop_product_stripe_price_create"],"writesState":true,"supportedMutation":"store_items.price_cents + store_items.stripe_price_id","contractId":"creator.commerce.shop-product-stripe-price-create","toolName":"fanful_creator_shop_product_stripe_price_create","status":"auth-required","blockedMutations":["title","description","inventoryTracked","inventoryCount","fulfillmentNote","downloadFileUrl","externalUrl","kind","id","checkoutSessions","orderFulfillment","refunds"]},"supportedTargets":{"lessonOfferings":[{"type":"lesson_offering","id":"online-guitar-lesson","title":"Online classical guitar lesson","active":true,"priceCents":7500,"currency":"usd","durationMinutes":45,"previewReady":false,"policyReadiness":{"durationMinutes":"readable","meetingProvider":"creator-only","meetingLocation":"redacted","bookingInstructions":"redacted","cancellationTerms":"settings-not-configured"}}],"shopProducts":[{"type":"shop_product","id":"open-guitar-demos-download","title":"Open Guitar Demos Download","active":true,"showInShop":true,"priceCents":900,"kind":"download","updatedAt":null,"previewReady":false,"visibilityWriteReady":false,"stripePriceWriteReady":false,"policyReadiness":{"inventory":"readable","fulfillment":"contract-only","downloadFile":"redacted","refundTerms":"not-modeled"}},{"type":"shop_product","id":"zoom-lesson","title":"Zoom Lesson","active":true,"showInShop":true,"priceCents":7500,"kind":"lesson","updatedAt":null,"previewReady":false,"visibilityWriteReady":false,"stripePriceWriteReady":false,"policyReadiness":{"inventory":"readable","fulfillment":"contract-only","downloadFile":"redacted","refundTerms":"not-modeled"}},{"type":"shop_product","id":"signed-cd","title":"Signed CD","active":true,"showInShop":true,"priceCents":2500,"kind":"physical","updatedAt":null,"previewReady":false,"visibilityWriteReady":false,"stripePriceWriteReady":false,"policyReadiness":{"inventory":"readable","fulfillment":"contract-only","downloadFile":"redacted","refundTerms":"not-modeled"}}],"lessonPolicySettings":[],"lessonAvailabilityWindows":[]},"confirmedWrites":{"status":"auth-required","shippedFoundationIssues":[786,809,818,819,945,1057,1083,1346,1413,1548,1550,1681,1684,1692],"requiredBeforeExecutable":["fresh price preview with observed updated_at","fresh lesson policy settings read with observed updated_at or observed policy id set","fresh lesson availability read with observed updated_at or observed availability id set","fresh shop product read with observed updated_at for visibility, details, or Stripe Price writes","fresh shop product catalog read with observed product ids for product creation","agent-write-envelope.v1 execute payload","artist confirmation text","agent client attribution","idempotency key","audit correlation id"],"relatedIssues":[530,534,612,671,799,945,1057,1083,1413,1548,1550,1681,1684,1692],"blockedMutations":[{"field":"stripePriceId","issue":1057,"reason":"Use the dedicated confirmed Stripe Price selection wrapper for existing mappings or the replacement Price creation wrapper for new lesson Stripe Prices."},{"field":"lessonBundles","issue":530,"reason":"Lesson bundles are not first-class writable creator service fields yet."},{"field":"subscriptionCredits","issue":530,"reason":"Subscription credits need the shared entitlement/credit model before agent writes."},{"field":"cancellationTerms","issue":1413,"reason":"Use confirm_lesson_policy_settings_update for cancellation/reschedule/no-show/skip-week settings. Refund execution and booking cancellation workflows remain blocked in #530."}]}},"stripeCatalog":{"version":"creator-stripe-catalog-readiness.v1","status":"auth-required","endpoint":null,"surfaces":["web-admin","agent-manifest","ios-artist-admin","android-artist-admin"],"relatedIssues":[1052,1053,1057,1083,925,926,534],"appReferenceCounts":{"total":0,"withStripePrice":0,"lessonOfferings":0,"shopProducts":0,"membershipTiers":0},"stripeApi":{"secretConfigured":true,"rawStripeIdsRedacted":true,"readThroughAdminEndpoint":false},"writeStatus":{"createPrice":"blocked","selectExistingPrice":"blocked","updateProductMetadata":"blocked","updateEntitlementMetadata":"blocked","reason":"Artist-admin or approved automation credentials are required before selecting or creating creator-commerce Stripe Price mappings."},"blockers":[{"id":"tier-entitlement-metadata","relatedIssue":534,"reason":"Tier entitlement metadata is still being modeled as a shared platform primitive."}],"redactedFields":["STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET","stripe.checkoutSessionId","stripe.paymentIntentId","stripe.customerId","stripe.subscriptionId","stripe.price.id","stripe.product.id"]},"operations":[{"id":"creator.commerce.read","toolName":"creator_commerce_read","status":"ready","enabled":true,"summary":"Read public lesson/coaching offers and public shop products, with admin-only creator state when authorized.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Read the agent-safe creator commerce and coaching manifest."},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"attribution":"Public reads are unaudited; admin reads are gated by the submitted admin or automation credential."},"input":{},"boundaries":["Guest reads only include public offer/product state.","Admin reads redact meeting URLs, Stripe price ids, download URLs, payment identifiers, and student contact details."]},{"id":"creator.publisher-referrals.read","toolName":"creator_publisher_referrals_read","status":"ready","enabled":false,"summary":"Read the authorized publisher referral program terms, primary share code, aggregate claim counts, pending reward liability, and redacted recent claim status.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"GET","auth":"artist-admin-or-approved-automation","description":"Read commerce.creator.publisherReferrals from the agent-safe creator commerce manifest."},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"attribution":"Publisher referral reads are included in the authorized creator-commerce manifest. The server-side reward fulfillment contract exists, but agent reward-credit writes remain unavailable until a confirmed Stripe credit surface is authorized."},"input":{},"boundaries":["Only authorized publisher/admin callers receive the referral summary; guest and listener reads keep commerce.creator null.","Recent claims omit referred emails and Stripe checkout session ids from model-visible output.","Referral reward credits, discount settlement, and payout bookkeeping remain blocked for agents; #1492 defines the server-side fulfillment contract and refund reconciliation."]},{"id":"creator.lesson-credit-ledger.read","toolName":"fanful_creator_lesson_credit_ledger_read","status":"ready","enabled":false,"summary":"Read the authorized admin lesson-credit ledger health contract with aggregate totals, event-type breakdowns, recent redacted event markers, and blocked write identifiers.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"GET","auth":"artist-admin-or-approved-automation","description":"Read commerce.adminLessonCreditLedger from the agent-safe creator commerce manifest."},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"attribution":"Lesson credit ledger reads are included in the authorized creator-commerce manifest. Credit spending, refund, renewal, skip-week, cancellation, and tier-benefit writes remain unavailable."},"input":{},"boundaries":["Guest and listener reads receive an explicit authorization blocker and no partial ledger data.","Model-visible events include boolean marker fields only; raw student emails, user ids, booking ids, purchase ids, policy ids, idempotency keys, reasons, metadata, and Stripe payment identifiers remain redacted.","This readback never grants, consumes, restores, refunds, renews, cancels, reschedules, or attaches lesson credits."]},{"id":"creator.lesson-price.preview","toolName":"creator_lesson_price_preview","status":"ready","enabled":false,"summary":"Preview a coaching/lesson price change without writing to D1, Stripe, checkout, or public pages.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Preview one lesson offering price change. This does not mutate state."},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"attribution":"Preview calls are non-mutating. Any later write must carry the admin or automation identity and write an audit row."},"input":{"action":{"type":"literal","value":"preview_lesson_offering_price_change","required":true},"offeringId":{"type":"string","required":true,"maxLength":160},"newPriceCents":{"type":"integer","required":true,"min":0,"max":200000},"reason":{"type":"string","required":false,"maxLength":800}},"boundaries":["The preview intentionally cannot update lesson_offerings.","The response includes the confirmation and audit requirements for a future write."]},{"id":"creator.service-price-policy.preview","toolName":"creator_service_price_policy_preview","status":"ready","enabled":false,"summary":"Preview a creator service price or policy change plan without writing to app tables, Stripe, checkout, or public pages.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Preview a creator service price/policy change. The current executable slice supports lesson offering price dry-runs."},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"attribution":"Preview calls are non-mutating. Any later price or policy write must carry human principal, agent client, confirmation, idempotency, and audit metadata."},"input":{"action":{"type":"literal","value":"preview_lesson_offering_price_change","required":true},"offeringId":{"type":"string","required":true,"maxLength":160},"newPriceCents":{"type":"integer","required":true,"min":0,"max":200000},"reason":{"type":"string","required":false,"maxLength":800},"policyFields":{"type":"array","required":false,"values":["durationMinutes","meetingProvider","meetingLocation","bookingInstructions","cancellationTerms"],"description":"Policy fields are reported for readiness only in this slice; policy writes are blocked until a first-class policy model and confirmed write route land."}},"boundaries":["The preview intentionally cannot update lesson_offerings, store_items, Stripe Prices, checkout behavior, booking instructions, cancellation terms, or public pages.","The response names affected surfaces, Stripe impact, state guard, idempotency requirement, confirmation copy, and audit plan for a future write."]},{"id":"creator.service-price-policy.confirmed-update","toolName":"fanful_creator_service_price_policy_update","status":"ready","enabled":false,"summary":"Execute a confirmed lesson/coaching price change after a fresh preview, exact confirmation, idempotency, stale-state, and audit checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed creator service price write. This updates only lesson_offerings.price_cents and never mutates Stripe directly."},"confirmation":{"required":true,"kind":"price-change","reason":"Changing a creator service price alters public web/native/agent catalog state and future booking checkout expectations."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted offering summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_lesson_offering_price_change","required":true},"offeringId":{"type":"string","required":true,"maxLength":160},"newPriceCents":{"type":"integer","required":true,"min":0,"max":200000},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The lesson_offerings.updated_at value returned by the latest preview."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale preview state and duplicate idempotency keys before mutating lesson_offerings.","Stripe Price, lesson bundle, subscription credit, cancellation/refund, booking instruction, and meeting-location writes stay blocked."]},{"id":"creator.lesson-policy.settings-update","toolName":"fanful_creator_lesson_policy_update","status":"ready","enabled":false,"summary":"Create or update one lesson policy settings row after exact confirmation, stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson policy settings write. This updates lesson_policy_settings only."},"confirmation":{"required":true,"kind":"commerce-policy","reason":"Lesson policy settings affect how web, native apps, and agents describe cancellation, reschedule, no-show, skip-week, and credit-expiration rules."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted lesson policy settings with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_lesson_policy_settings_update","required":true},"policyId":{"type":"string","required":true,"maxLength":120},"scope":{"type":"enum","required":true,"values":["artist_default","offering_override"]},"offeringId":{"type":"string|null","required":false,"maxLength":160,"description":"Required for offering_override scope and omitted/null for artist_default scope."},"cancellationCutoffHours":{"type":"integer","required":true,"min":0,"max":720},"rescheduleCutoffHours":{"type":"integer","required":true,"min":0,"max":720},"refundPolicy":{"type":"enum","required":true,"values":["manual_review","full_before_cutoff","partial_before_cutoff","none"]},"noShowPolicy":{"type":"enum","required":true,"values":["manual_review","forfeit_credit","restore_credit"]},"skipWeekPolicy":{"type":"enum","required":true,"values":["manual_review","allow_with_cutoff","disabled"]},"creditExpirationDays":{"type":"integer|null","required":false,"min":1,"max":3650},"carryOverLimit":{"type":"integer|null","required":false,"min":0,"max":120},"notes":{"type":"string|null","required":false,"maxLength":1000},"active":{"type":"boolean","required":true},"observedUpdatedAt":{"type":"string|null","required":false,"format":"date-time","description":"Required when updating an existing policy row; null for create."},"observedPolicyIds":{"type":"string[]","required":false,"maxItems":100,"description":"Required when creating a new policy row; use ids from the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale policy rows, duplicate idempotency keys, no-op updates, invalid offering overrides, and stale policy id catalogs before mutating.","This wrapper writes policy settings only; it does not cancel bookings, reopen availability, issue refunds, grant or consume credits, create bundles, or mutate Stripe."]},{"id":"creator.lesson-availability.update","toolName":"fanful_creator_lesson_availability_update","status":"ready","enabled":false,"summary":"Create or update one future lesson availability window after exact confirmation, stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson availability write. This updates lesson_availability_windows scheduling fields only."},"confirmation":{"required":true,"kind":"commerce-policy","reason":"Lesson availability controls when fans can book lessons across web, native apps, and agent surfaces."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted availability summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_lesson_availability_update","required":true},"availabilityId":{"type":"string","required":true,"maxLength":160},"offeringId":{"type":"string","required":true,"maxLength":160},"startsAt":{"type":"string","required":true,"format":"date-time"},"endsAt":{"type":"string","required":true,"format":"date-time"},"timezone":{"type":"string","required":true,"maxLength":80},"status":{"type":"enum","required":true,"values":["open","cancelled"]},"capacity":{"type":"integer","required":true,"min":1,"max":12},"observedUpdatedAt":{"type":"string|null","required":false,"format":"date-time","description":"Required when updating an existing availability row; null for create."},"observedAvailabilityIds":{"type":"string[]","required":false,"maxItems":160,"description":"Required when creating a new availability row; use ids from the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale availability rows, stale availability catalogs, duplicate idempotency keys, no-op updates, past windows, held/booked slot mutations, and unsafe extra booking-side-effect fields before mutating.","This wrapper writes only offering, start/end time, timezone, open/cancelled status, and capacity; it preserves meeting URLs and private notes, and never updates bookings, credits, refunds, or Stripe."]},{"id":"creator.lesson-stripe-price.select","toolName":"fanful_creator_lesson_stripe_price_select","status":"ready","enabled":false,"summary":"Select or clear one already-known Stripe Price mapping for a lesson/coaching offering after exact confirmation and audit checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson Stripe Price mapping write. This updates only lesson_offerings.stripe_price_id and never creates Stripe objects."},"confirmation":{"required":true,"kind":"stripe-price","reason":"Selecting a Stripe Price changes future checkout behavior for this lesson/coaching offering across web, native apps, and agents."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted Stripe Price mapping summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_lesson_offering_stripe_price_select","required":true},"offeringId":{"type":"string","required":true,"maxLength":160},"selectedStripePriceId":{"type":"string|null","required":true,"maxLength":180,"description":"Use null to clear the mapping, or a Stripe Price id already present in Laurel app-state Stripe catalog references."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The lesson_offerings.updated_at value returned by the latest creator-commerce or Stripe catalog read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale state, duplicate idempotency keys, no-op writes, and unknown Stripe Price ids before mutating lesson_offerings.","Selected Stripe Price ids must already appear in Laurel app-state Stripe catalog references; when Stripe credentials are configured, they must also appear in the live relevant Stripe catalog read.","This wrapper never creates Stripe Prices, changes price_cents, updates shop products, updates tiers, or writes entitlement metadata."]},{"id":"creator.lesson-stripe-price.create","toolName":"fanful_creator_lesson_stripe_price_create","status":"ready","enabled":false,"summary":"Create a replacement immutable Stripe Price for one lesson/coaching offering and select it after exact confirmation and audit checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson Stripe Price creation wrapper. This updates only lesson_offerings.price_cents and lesson_offerings.stripe_price_id."},"confirmation":{"required":true,"kind":"stripe-price","reason":"Creating and selecting a Stripe Price changes public lesson price display and future checkout behavior across web, native apps, and agents."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted price and Stripe Price mapping summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_lesson_offering_stripe_price_create","required":true},"offeringId":{"type":"string","required":true,"maxLength":160},"newPriceCents":{"type":"integer","required":true,"min":1,"max":200000},"currency":{"type":"string","required":false,"description":"Defaults to the existing lesson offering currency; this slice rejects cross-currency changes."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The lesson_offerings.updated_at value returned by the latest creator-commerce or Stripe catalog read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale state, duplicate idempotency keys, no-op prices, missing Stripe credentials, and missing product context before mutating app state.","The existing lesson Stripe Price mapping supplies the Stripe Product context for the replacement Price.","This wrapper does not update shop products, membership tiers, entitlement metadata, lesson bundles, credits, cancellation policy, or refund policy."]},{"id":"creator.membership-stripe-price.select","toolName":"fanful_creator_membership_stripe_price_select","status":"ready","enabled":false,"summary":"Select or clear one already-known Stripe Price mapping for a membership tier after exact confirmation and audit checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier Stripe Price mapping write. This updates only membership_tiers.stripe_price_id and never creates Stripe objects."},"confirmation":{"required":true,"kind":"stripe-price","reason":"Selecting a Stripe Price changes future membership checkout behavior for this tier across web, native apps, and agents."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted membership tier Stripe Price mapping summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_membership_tier_stripe_price_select","required":true},"tierId":{"type":"string","required":true,"maxLength":80},"selectedStripePriceId":{"type":"string|null","required":true,"maxLength":180,"description":"Use null to clear the mapping, or a Stripe Price id already present in Laurel app-state Stripe catalog references."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The membership_tiers.updated_at value returned by the latest creator-commerce or Stripe catalog read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale state, duplicate idempotency keys, no-op writes, and unknown Stripe Price ids before mutating membership_tiers.","Selected Stripe Price ids must already appear in Laurel app-state Stripe catalog references; when Stripe credentials are configured, they must also appear in the live relevant Stripe catalog read.","This wrapper never creates Stripe Prices, changes monthly_amount_cents, updates tier lifecycle, or writes entitlement metadata."]},{"id":"creator.membership-stripe-price.create","toolName":"fanful_creator_membership_stripe_price_create","status":"ready","enabled":false,"summary":"Create a replacement immutable recurring Stripe Price for one membership tier and select it after exact confirmation and audit checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier Stripe Price creation wrapper. This updates only membership_tiers.monthly_amount_cents and membership_tiers.stripe_price_id."},"confirmation":{"required":true,"kind":"stripe-price","reason":"Creating and selecting a Stripe Price changes membership price display and future checkout behavior across web, native apps, and agents."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted membership tier Stripe Price summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_membership_tier_stripe_price_create","required":true},"tierId":{"type":"string","required":true,"maxLength":80},"newMonthlyAmountCents":{"type":"integer","required":true,"min":1,"max":200000},"currency":{"type":"string","required":false,"description":"Defaults to the existing membership tier currency; this slice rejects cross-currency changes."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The membership_tiers.updated_at value returned by the latest creator-commerce or Stripe catalog read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale state, duplicate idempotency keys, no-op prices, missing Stripe credentials, and missing product context before mutating app state.","The existing membership tier Stripe Price mapping supplies the Stripe Product context for the replacement recurring Price.","This wrapper does not update lesson offerings, shop products, entitlement metadata, tier lifecycle, cancellation policy, or refund policy."]},{"id":"creator.membership-tier.create","toolName":"fanful_creator_membership_tier_create","status":"ready","enabled":false,"summary":"Create one inactive membership tier with public profile, monthly amount, sort order, and benefits after exact confirmation and catalog stale-state checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier creation wrapper. This inserts membership_tiers and membership_tier_benefits only; new tiers start inactive until Stripe Price mapping and restore are confirmed separately."},"confirmation":{"required":true,"kind":"entitlement","reason":"Tier creation changes the creator catalog consumed by web, iOS, Android, and agent surfaces, even when the new tier is initially inactive."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records the new redacted membership tier profile/benefit summary with the admin or automation identity, agent client, idempotency key, audit correlation id, and observed catalog ids."},"input":{"action":{"type":"literal","value":"confirm_membership_tier_create","required":true},"tierId":{"type":"string","required":true,"maxLength":80},"name":{"type":"string","required":true,"minLength":2,"maxLength":80},"description":{"type":"string","required":true,"minLength":12,"maxLength":320},"monthlyAmountCents":{"type":"integer","required":true,"min":1,"max":200000},"currency":{"type":"string","required":false,"description":"Defaults to usd; this slice rejects cross-currency tier creation."},"active":{"type":"literal","value":false,"required":true,"description":"Newly created tiers start inactive until Stripe Price mapping and restore are confirmed separately."},"sortOrder":{"type":"integer","required":true,"min":0,"max":1000},"benefits":{"type":"string[]","required":true,"minItems":1,"maxItems":12,"maxItemLength":160},"observedTierIds":{"type":"string[]","required":true,"minItems":1,"maxItems":100,"description":"All membership tier ids returned by the latest creator-commerce catalog read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale catalog ids, duplicate tier ids, duplicate idempotency keys, duplicate benefit labels, non-USD currency, and active-at-create requests before mutating.","Created tiers are inactive and therefore hidden from new fan-facing joins until a scoped Stripe Price mapping and restore are confirmed separately.","This wrapper never creates Stripe Prices, selects stripe_price_id, grants memberships, changes checkout policy, or writes protected-surface entitlement metadata."]},{"id":"creator.membership-tier.update","toolName":"fanful_creator_membership_tier_update","status":"ready","enabled":false,"summary":"Update one membership tier's public profile and benefit copy after exact confirmation and stale-state checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier profile and benefit copy write. This updates membership_tiers profile fields and membership_tier_benefits only."},"confirmation":{"required":true,"kind":"entitlement","reason":"Tier names, descriptions, sort order, and benefits are visible across web, iOS, Android, and agent surfaces."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted membership tier profile/benefit summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_membership_tier_update","required":true},"tierId":{"type":"string","required":true,"maxLength":80},"name":{"type":"string","required":true,"minLength":2,"maxLength":80},"description":{"type":"string","required":true,"minLength":12,"maxLength":320},"sortOrder":{"type":"integer","required":true,"min":0,"max":1000},"benefits":{"type":"string[]","required":true,"minItems":1,"maxItems":12,"maxItemLength":160},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The membership_tiers.updated_at value returned by the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale state, duplicate idempotency keys, duplicate benefit labels, and no-op updates before mutating.","This wrapper never creates Stripe Prices, changes monthly_amount_cents, changes stripe_price_id, or writes protected-surface entitlement metadata."]},{"id":"creator.membership-tier.archive-state","toolName":"fanful_creator_membership_tier_archive_state","status":"ready","enabled":false,"summary":"Archive or restore one membership tier after exact confirmation, preserving existing member entitlement history.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier archive/restore write. This updates membership_tiers.active only."},"confirmation":{"required":true,"kind":"entitlement","reason":"Archiving removes a tier from new fan-facing joins across web, iOS, Android, and agents; restoring makes it available again."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted membership tier active-state summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_membership_tier_archive | confirm_membership_tier_restore","required":true},"tierId":{"type":"string","required":true,"maxLength":80},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The membership_tiers.updated_at value returned by the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale state, duplicate idempotency keys, no-op archive/restore requests, and archiving the last active public tier.","Archiving affects new joins and public tier lists; active memberships keep their existing entitlement history through membership rows.","This wrapper never cancels subscriptions, refunds payments, changes Stripe Prices, or writes protected-surface entitlement metadata."]},{"id":"creator.entitlement-metadata.update","toolName":"fanful_creator_entitlement_metadata_update","status":"ready","enabled":false,"summary":"Update one protected community channel's membership-tier access metadata after exact confirmation and stale-state checks.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed protected-surface entitlement metadata write. This updates community channel tier access metadata only."},"confirmation":{"required":true,"kind":"entitlement","reason":"Community channel access metadata controls which signed-in members can read, write, receive socket tokens, and join notifications for a protected surface."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next community channel access summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_community_channel_entitlement_metadata_update","required":true},"channelId":{"type":"string","required":true,"maxLength":180},"access":{"type":"object","required":true,"fields":{"mode":{"type":"enum","required":true,"values":["all-logged-in-listeners","membership-tiers"]},"tierIds":{"type":"string[]","required":false,"valuesSource":"commerce.creator.memberships.lifecycle.activeTierIds","maxItems":24,"description":"When mode is membership-tiers, use active membership tier ids from the latest creator commerce read. An empty or omitted list means any active Laurel membership."}}},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The community_chat_channels.updated_at value returned by the latest community-chat read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects default #general changes, stale state, duplicate idempotency keys, no-op metadata, and unsupported entitlement-group rules before mutating.","This wrapper updates only community_chat_channels access metadata; it never creates tiers, changes prices, grants credits, changes paid-room access, or revokes memberships."]},{"id":"creator.shop-product.create","toolName":"fanful_creator_shop_product_create","status":"ready","enabled":false,"summary":"Create one shop product after exact confirmation, catalog stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product creation write. This inserts one safe store_items row only."},"confirmation":{"required":true,"kind":"commerce-policy","reason":"Shop product creation can add a public catalog item, price, inventory promise, and checkout target across web, native apps, and agent surfaces."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records the redacted created product summary with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_shop_product_create","required":true},"productId":{"type":"string","required":false,"maxLength":120,"description":"Safe product id. If omitted, Fanful derives it from title and rejects titles that cannot slugify."},"title":{"type":"string","required":true,"maxLength":180},"description":{"type":"string","required":false,"nullable":true,"maxLength":1200},"kind":{"type":"enum","required":true,"values":["lesson","download","physical"]},"priceCents":{"type":"integer","required":true,"min":50,"max":200000},"currency":{"type":"string","required":false,"description":"Current store_items products are treated as usd."},"active":{"type":"boolean","required":true},"showInShop":{"type":"boolean","required":true},"inventoryTracked":{"type":"boolean","required":true},"inventoryCount":{"type":"integer","required":false,"nullable":true,"min":0,"max":100000},"fulfillmentNote":{"type":"string","required":false,"nullable":true,"maxLength":1000},"downloadFileName":{"type":"string","required":false,"nullable":true,"maxLength":240},"downloadReleaseNotes":{"type":"string","required":false,"nullable":true,"maxLength":1200},"sortOrder":{"type":"integer","required":false,"min":0,"max":10000},"observedProductIds":{"type":"array","required":true,"itemType":"string","description":"The store_items ids returned by the latest creator-commerce shop read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects duplicate ids, duplicate generated slugs, stale product catalogs, duplicate idempotency keys, non-download download metadata, showInShop=true with active=false, and unsafe extra fields before mutating.","This wrapper inserts one store_items row with safe catalog metadata only; it never sets raw download file URLs, external fulfillment URLs, Stripe Price ids, checkout sessions, purchase rows, order fulfillment, refunds, or credits."]},{"id":"creator.shop-product.visibility-update","toolName":"fanful_creator_shop_product_visibility_update","status":"ready","enabled":false,"summary":"Update one shop product's public availability flags after exact confirmation, stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product visibility write. This updates store_items.active and store_items.show_in_shop only."},"confirmation":{"required":true,"kind":"commerce-policy","reason":"Shop product visibility changes what fans can see and start checkout for across web, native apps, and agent surfaces."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted product visibility summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_shop_product_visibility_update","required":true},"productId":{"type":"string","required":true,"maxLength":120},"active":{"type":"boolean","required":true,"description":"Whether the product is active for public purchase eligibility."},"showInShop":{"type":"boolean","required":true,"description":"Whether the active product appears in the public shop catalog."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The store_items.updated_at value returned by the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale product state, duplicate idempotency keys, no-op visibility changes, non-shop product kinds, and extra unsafe payload fields before mutating.","This wrapper updates only store_items.active and store_items.show_in_shop; price, inventory, Stripe mapping, fulfillment, external URL, download URL, and product copy changes remain blocked."]},{"id":"creator.shop-product.details-update","toolName":"fanful_creator_shop_product_details_update","status":"ready","enabled":false,"summary":"Update one existing shop product's copy, inventory, fulfillment note, download display metadata, or sort order after exact confirmation, stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product details write. This updates safe store_items metadata only."},"confirmation":{"required":true,"kind":"commerce-policy","reason":"Shop product details affect the public catalog, checkout expectations, inventory availability, and fulfillment promises."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted product details with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_shop_product_details_update","required":true},"productId":{"type":"string","required":true,"maxLength":120},"title":{"type":"string","required":false,"maxLength":180},"description":{"type":"string","required":false,"nullable":true,"maxLength":1200},"inventoryTracked":{"type":"boolean","required":false},"inventoryCount":{"type":"integer","required":false,"nullable":true,"min":0,"max":100000},"fulfillmentNote":{"type":"string","required":false,"nullable":true,"maxLength":1000},"downloadFileName":{"type":"string","required":false,"nullable":true,"maxLength":240},"downloadReleaseNotes":{"type":"string","required":false,"nullable":true,"maxLength":1200},"sortOrder":{"type":"integer","required":false,"min":0,"max":10000},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The store_items.updated_at value returned by the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale product state, duplicate idempotency keys, no-op detail changes, unsupported product kinds, duplicate title slugs, non-download download metadata, and unsafe extra fields before mutating.","This wrapper never changes price, Stripe Price mapping, raw download file URLs, external fulfillment URLs, product kind, product id, checkout sessions, purchase rows, order fulfillment, or refunds."]},{"id":"creator.shop-product.stripe-price-select","toolName":"fanful_creator_shop_product_stripe_price_select","status":"ready","enabled":false,"summary":"Select or clear an already-known Stripe Price mapping for one existing shop product after exact confirmation, stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product Stripe Price selection wrapper. This updates store_items.stripe_price_id only."},"confirmation":{"required":true,"kind":"price-change","reason":"Shop product Stripe Price mappings control the checkout Price used when fans buy an existing product."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted product Stripe Price mapping summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_shop_product_stripe_price_select","required":true},"productId":{"type":"string","required":true,"maxLength":120},"selectedStripePriceId":{"type":"string","required":true,"nullable":true,"description":"Raw Stripe Price id from the authenticated admin Stripe catalog, or null to clear an existing mapping."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The store_items.updated_at value returned by the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale product state, duplicate idempotency keys, no-op selections, unsupported product kinds, unknown Price ids, and amount/currency mismatches before mutating.","This wrapper updates only store_items.stripe_price_id; it never creates Stripe Prices, changes product price/copy/inventory/fulfillment, creates checkout sessions, fulfills orders, or issues refunds."]},{"id":"creator.shop-product.stripe-price-create","toolName":"fanful_creator_shop_product_stripe_price_create","status":"ready","enabled":false,"summary":"Create one replacement immutable Stripe Price for one existing shop product, then select it after exact confirmation, stale-state checks, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product Stripe Price creation wrapper. This updates store_items.price_cents and store_items.stripe_price_id only."},"confirmation":{"required":true,"kind":"price-change","reason":"Shop product price changes alter public catalog pricing and checkout behavior for future purchases."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","attribution":"Records previous and next redacted product price/Stripe Price summaries with the admin or automation identity, agent client, idempotency key, and audit correlation id."},"input":{"action":{"type":"literal","value":"confirm_shop_product_stripe_price_create","required":true},"productId":{"type":"string","required":true,"maxLength":120},"newPriceCents":{"type":"integer","required":true,"min":1,"max":200000},"currency":{"type":"string","required":false,"description":"Existing shop product currency; current store_items products are treated as usd."},"observedUpdatedAt":{"type":"string","required":true,"format":"date-time","description":"The store_items.updated_at value returned by the latest creator-commerce read."},"envelope":{"type":"agent-write-envelope.v1","required":true}},"boundaries":["The wrapper rejects stale product state, duplicate idempotency keys, no-op prices, unsupported product kinds, missing Stripe credentials, missing existing Price product context, and cross-currency changes before mutating app state.","This wrapper updates only store_items.price_cents and store_items.stripe_price_id; it never changes copy, inventory, fulfillment, raw download URLs, external URLs, product kind/id, checkout sessions, orders, refunds, or credits."]},{"id":"creator.lesson-offering.update","toolName":"creator_lesson_offering_update","status":"contract-only","enabled":false,"summary":"Create or update lesson/coaching offers through a future confirmation-gated agent write.","endpoint":{"href":"https://docs.fanful.net/api/admin/lessons","method":"POST","auth":"artist-admin-or-approved-automation","description":"Existing admin route for lesson offerings; not yet exposed as a broad agent write."},"confirmation":{"required":true,"kind":"price-change","reason":"Offer changes can alter public pricing, booking policy, Stripe checkout expectations, and fan trust."},"audit":{"required":true,"currentRecord":"lesson_offerings","attribution":"A dedicated creator-commerce audit row is still required before agent writes become ready."},"input":{"action":{"type":"literal","value":"upsert_offering","required":true},"id":{"type":"string","required":false},"title":{"type":"string","required":true},"durationMinutes":{"type":"integer","required":true},"priceCents":{"type":"integer","required":true},"active":{"type":"boolean","required":true}},"boundaries":["Do not create public offers, change prices, or deactivate offers from an agent until confirmation and audit are implemented.","Stripe Price creation/update is not automatic; pre-created Stripe price ids require a separate billing decision."]},{"id":"creator.shop-product.update","toolName":"creator_shop_product_update","status":"contract-only","enabled":false,"summary":"Create or broadly update merch/download products through a future audited agent write; visibility-only updates use creator.shop-product.visibility-update.","endpoint":{"href":"https://docs.fanful.net/api/admin/shop","method":"POST","auth":"artist-admin-or-approved-automation","description":"Existing admin route for shop products; not yet exposed as a broad agent write."},"confirmation":{"required":true,"kind":"commerce-policy","reason":"Product changes can affect prices, inventory, fulfillment promises, and public availability."},"audit":{"required":true,"currentRecord":"store_items","attribution":"A dedicated creator-commerce audit row is still required before agent writes become ready."},"input":{"id":{"type":"string","required":false},"title":{"type":"string","required":true},"kind":{"type":"enum","required":true,"values":["lesson","download","physical"]},"priceCents":{"type":"integer","required":true},"active":{"type":"boolean","required":true},"showInShop":{"type":"boolean","required":true}},"boundaries":["Use fanful_creator_shop_product_create for safe product creation, fanful_creator_shop_product_visibility_update for active/showInShop only, fanful_creator_shop_product_details_update for safe existing-product copy/inventory/fulfillment/display metadata/sort order, and fanful_creator_shop_product_stripe_price_select/create for compatible one-time Stripe Price mapping or replacement Price creation. Raw download URLs, external URLs, checkout, fulfillment execution, orders, and refunds remain separately blocked.","Download file URLs and Stripe identifiers stay redacted from model-visible responses."]},{"id":"creator.entitlements.manage","toolName":"creator_entitlements_manage","status":"contract-only","enabled":false,"summary":"Manage tiers, credits, cancellations, and entitlement policy after the shared entitlement contract is explicit.","endpoint":null,"confirmation":{"required":true,"kind":"entitlement","reason":"Entitlement changes can grant, revoke, or alter paid fan access across web, native apps, and agents."},"audit":{"required":true,"currentRecord":null,"attribution":"Needs a shared entitlement policy/audit contract before agent execution."},"input":{},"boundaries":["Do not revoke purchases, credits, or memberships through this surface yet.","Cross-surface parity with web, iOS, Android, and agents should be documented before the first entitlement write."]}],"policy":{"writeConfirmation":"Require explicit artist confirmation before changing lesson prices, lesson availability windows, publishing/deactivating offers, altering inventory, changing cancellation policy, granting credits, or revoking entitlements.","audit":"Confirmed lesson price, lesson availability, lesson policy settings, shop product create/visibility/details, and shop product Stripe Price writes record actor, client, artist scope, before/after summary, reason, confirmation metadata, idempotency, audit correlation, and created_at. Broader billing-impacting writes need their own dedicated audit semantics before becoming ready.","secretHandling":"Do not expose raw Stripe identifiers, checkout sessions, payment intents, download file URLs, student contact details, meeting URLs, private notes, or admin tokens in model-visible logs."},"serverGaps":[{"id":"creator-commerce.audit-log","relatedIssue":671,"status":"ready-for-price-policy-availability-and-shop-product-writes","note":"Confirmed lesson price, lesson availability, lesson policy settings, shop product create/visibility/details, and shop product Stripe Price writes record creator_commerce_agent_actions plus agent_write_idempotency_keys. Broader billing, credit, refund, and entitlement writes still need their own audit semantics."},{"id":"creator-commerce.lesson-availability","relatedIssue":1550,"status":"ready-scheduling-write","note":"Authorized creator-commerce writes can create or update future open/cancelled lesson availability windows through the shared confirmed envelope. Held/booked slot changes, booking state changes, meeting URLs, private notes, refunds, credits, and Stripe mutation remain blocked."},{"id":"creator-commerce.shop-product-visibility","relatedIssue":1548,"status":"ready-visibility-write","note":"Authorized creator-commerce writes can toggle store_items.active and store_items.show_in_shop for editable shop products through the shared confirmed envelope."},{"id":"creator-commerce.shop-product-details","relatedIssue":1681,"status":"ready-details-write","note":"Authorized creator-commerce writes can update safe product copy, inventory counts, fulfillment note, download display metadata, and sort order through the shared confirmed envelope. Raw download URL, external URL, product kind/id, order fulfillment, and refunds remain blocked until separately scoped."},{"id":"creator-commerce.shop-product-stripe-price","relatedIssue":1684,"status":"ready-price-write","note":"Authorized creator-commerce writes can select/clear an existing compatible shop product Stripe Price or create one replacement one-time Price for an existing shop product through the shared confirmed envelope."},{"id":"creator-commerce.stripe-price-policy","relatedIssue":1052,"status":"auth-required","note":"The shared Stripe catalog/readiness contract is linked for artist-admin callers. Existing lesson, membership-tier, and shop product Stripe Price select/clear writes plus replacement Price creation are executable when authorized; broader product/tier metadata writes remain blocked."},{"id":"creator-commerce.entitlement-contract","relatedIssue":534,"status":"planned","note":"Membership tiers, lesson credits, cancellations, and entitlement revocation need one shared contract before agent writes ship."},{"id":"creator-commerce.admin-entitlements","relatedIssue":740,"status":"ready-read","note":"Authorized creator-commerce reads expose Laurel's current Fanful plan, public platform fee, support level, and quota usage. Plan/entitlement writes remain contract-only."},{"id":"creator-commerce.lesson-credit-ledger-readback","relatedIssue":1795,"relatedIssues":[530,858,1417,1784,1794,1795],"status":"auth-required","note":"Lesson credit ledger readback is available only after scoped creator/admin authorization; guest and listener reads receive an explicit blocker without a ledger version or partial ledger data."},{"id":"creator-commerce.service-policy-model","relatedIssue":1413,"status":"partial","note":"Lesson price preview, confirmed price writes, and confirmed lesson policy settings writes are executable. Refund execution, credit ledgers, bundles, and atomic cancellation/reschedule workflows remain blocked under #530."},{"id":"creator-commerce.publisher-referrals","relatedIssue":1509,"relatedIssues":[1490,1492,1493,1509],"status":"ready-read","note":"Authorized creator-commerce reads expose referral offer terms, the publisher share link, aggregate counts, pending reward liability, and redacted recent claim status. #1492 defines the server-side reward fulfillment contract; agent reward-credit writes remain blocked."},{"id":"creator-commerce.payment-routing-readiness","relatedIssue":798,"status":"ready-read","note":"Authorized creator-commerce reads expose the current metadata-only payment-routing status. Stripe Connect connected-account onboarding, transfer routing, and application-fee capture remain future work."}]}