Skip to main content
POST
Publish an experience for this creator
Required scope
  • write:experience — Request that the creator publish or unpublish a fan-facing experience. The app mints a request token; the creator confirms and Fanvue performs the change.

Authorizations

Authorization
string
header
required

OAuth 2.0 access token, presented as a JWT bearer token in the Authorization header. Obtain a token via the authorization-code flow; the scopes granted to the token determine which operations it may call.

Headers

X-Fanvue-API-Version
string
default:2025-06-26
required

API version to use for the request

Example:

"2025-06-26"

Body

application/json
appUuid
string<uuid>
required

Your app's UUID.

externalExperienceId
string
required

Your own stable id for the experience. Publishing the same id again for the same creator updates the existing experience.

Required string length: 1 - 255
Example:

"course-photography-101"

title
string
required
Required string length: 1 - 100
Example:

"Photography 101"

description
string
required
Maximum string length: 500
Example:

"Six lessons, shot on film."

accessMode
enum<string>
required

FREE, SUBSCRIPTION (the creator's subscribers), PAID (needs priceCents) or HIDDEN (share-link only).

Available options:
FREE,
SUBSCRIPTION,
PAID,
HIDDEN
imageUrl
string<uri> | null

Public https URL of the cover image. Fanvue downloads and re-hosts it; one that cannot be fetched is dropped and the experience keeps no cover.

Maximum string length: 2048
Example:

"https://example.com/covers/photography-101.jpg"

deliveryMode
enum<string>

EMBEDDED (default) renders your fan_experience surface on Fanvue; EXTERNAL opens externalUrl.

Available options:
EMBEDDED,
EXTERNAL
externalUrl
string<uri> | null

Where an EXTERNAL experience opens. Must be https (checked here). The platform additionally refuses Fanvue, localhost, IP and dev-tunnel hosts; such a URL answers 400 with a message naming the field.

Maximum string length: 2048
Example:

"https://example.com/experiences/photography-101"

hidden
boolean

Keep the experience off the creator's profile. Implied by HIDDEN.

priceCents
integer

Price in USD cents, between 300 and 50000.

Required range: 300 <= x <= 50000
Example:

1500

priceRecurring
boolean

With priceCents: bill monthly as an app subscription instead of a one-off unlock.

experienceType
enum<string>

What kind of experience this is. Decides how it presents itself where it is embedded (for example the category tag on a chat card). Omit for the generic OTHER.

Available options:
LIVE_STREAM,
LIVE_AUDIO,
VIDEO,
AUDIO,
GAME,
CHALLENGE,
QUIZ,
EVENT,
OTHER
Example:

"GAME"

actions
object[]

Paid actions to sell inside the experience, each with its price. At most 10. Omit to leave the experience's actions untouched; an empty array withdraws every action you declared.

Maximum array length: 10
acknowledgePaidImpact
boolean

Set to true on a retry to accept the paid impact a previous attempt answered 409 with. Send the 409's impact alongside as acknowledgedImpact.

Example:

true

acknowledgedImpact
object

The impact the previous 409 reported, echoed back verbatim.

Response

The experience as published, with the type and price Fanvue recorded

experience
object
required