curl --request POST \
--url https://api.fanvue.com/v1/experiences/request-token \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Fanvue-API-Version: <x-fanvue-api-version>' \
--data '
{
"action": "publish",
"externalExperienceId": "<string>",
"title": "<string>",
"description": "<string>",
"appUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.fanvue.com/v1/experiences/request-token"
payload = {
"action": "publish",
"externalExperienceId": "<string>",
"title": "<string>",
"description": "<string>",
"appUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"X-Fanvue-API-Version": "<x-fanvue-api-version>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Fanvue-API-Version': '<x-fanvue-api-version>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
action: 'publish',
externalExperienceId: '<string>',
title: '<string>',
description: '<string>',
appUuid: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.fanvue.com/v1/experiences/request-token', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"token": "req_2f1c…"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"message": "<string>",
"nextVersion": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Mint a publish/unpublish request token
Mints a short-lived, opaque “request token” the app’s creator surface forwards to Fanvue to ask the creator to confirm a publish or unpublish.
The token is bound to the calling app (a token can only be minted for the app whose credentials make the call — otherwise 403) and to the acting creator, so it can only drive that creator’s native confirmation modal.
A publish request may narrow the access modes the creator is offered with allowedAccessModes; an incoherent constraint (empty, duplicated, or not containing proposedAccessMode) is rejected with 400 and a message naming the rule it broke.
curl --request POST \
--url https://api.fanvue.com/v1/experiences/request-token \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Fanvue-API-Version: <x-fanvue-api-version>' \
--data '
{
"action": "publish",
"externalExperienceId": "<string>",
"title": "<string>",
"description": "<string>",
"appUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.fanvue.com/v1/experiences/request-token"
payload = {
"action": "publish",
"externalExperienceId": "<string>",
"title": "<string>",
"description": "<string>",
"appUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"X-Fanvue-API-Version": "<x-fanvue-api-version>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Fanvue-API-Version': '<x-fanvue-api-version>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
action: 'publish',
externalExperienceId: '<string>',
title: '<string>',
description: '<string>',
appUuid: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.fanvue.com/v1/experiences/request-token', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"token": "req_2f1c…"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"message": "<string>",
"nextVersion": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}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
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
API version to use for the request
"2025-06-26"
Body
- Option 1
- Option 2
publish 1 - 255100500FREE, SUBSCRIPTION, PAID, HIDDEN EMBEDDED, EXTERNAL Public https URL of the experience cover image. Fanvue downloads and re-hosts it when the creator confirms the publish.
2048"https://example.com/covers/launch-your-page.jpg"
Restricts which access modes the creator may choose in the Fanvue confirmation modal. Must contain proposedAccessMode and hold no duplicates. Omit to offer all four modes.
1 - 4 elementsFREE, SUBSCRIPTION, PAID, HIDDEN ["FREE"]
Paid actions to offer inside this experience, for the creator to price when they confirm the publish. At most 10. suggestedPriceCents is a prefill only — the creator sets the amount that is charged, and may decline any action. Omit the field (or send an empty array) to propose none; an app cannot withdraw actions a creator has already priced.
10Show child attributes
Show child attributes
[
{
"externalActionId": "spin",
"title": "Spin the wheel",
"suggestedPriceCents": 500
}
]
What kind of experience this is. Prefills the creator's confirmation modal, where they can change it, and decides how the experience presents itself where it is embedded (for example the category tag on a chat card). Omit for the generic OTHER.
LIVE_STREAM, LIVE_AUDIO, VIDEO, AUDIO, GAME, CHALLENGE, QUIZ, EVENT, OTHER "GAME"
Response
The minted request token
The opaque request token to forward to the creator surface for confirmation.
"req_2f1c…"
Was this page helpful?