curl --request GET \
--url https://api.fanvue.com/v1/experiences/{experienceUuid}/action-purchases \
--header 'Authorization: Bearer <token>' \
--header 'X-Fanvue-API-Version: <x-fanvue-api-version>'import requests
url = "https://api.fanvue.com/v1/experiences/{experienceUuid}/action-purchases"
headers = {
"X-Fanvue-API-Version": "<x-fanvue-api-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Fanvue-API-Version': '<x-fanvue-api-version>',
Authorization: 'Bearer <token>'
}
};
fetch('https://api.fanvue.com/v1/experiences/{experienceUuid}/action-purchases', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"purchaseReference": "expact_5c9a1f0e-9f3f-4c2a-8f31-1d0f6a2b7c44",
"experienceUuid": "00000000-0000-4000-8000-000000000010",
"externalActionId": "spin",
"clientReferenceId": "round-42",
"buyerUuid": "00000000-0000-4000-8000-000000000003",
"amount": 700,
"currency": "USD",
"status": "succeeded",
"invoiceNumber": "FVE-20260904-1234",
"createdAt": "2026-09-04T10:00:00.000Z",
"paidAt": "2026-09-04T10:00:02.000Z"
},
{
"purchaseReference": "expact_9b1e2d43-6d81-4f0a-9a77-2b4c8e5f1a03",
"experienceUuid": "00000000-0000-4000-8000-000000000010",
"externalActionId": "reveal",
"clientReferenceId": null,
"buyerUuid": "00000000-0000-4000-8000-000000000004",
"amount": 250,
"currency": "USD",
"status": "refunded",
"invoiceNumber": "FVE-20260904-1235",
"createdAt": "2026-09-04T09:58:00.000Z",
"paidAt": "2026-09-04T09:58:03.000Z"
}
],
"nextCursor": null
}{
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"nextVersion": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}List action purchases for one of your experiences
Returns the action purchases fans have made in one of your experiences, newest first, so you can reconcile against the webhooks you received.
Fulfil on the webhook, never on the bridge result. Grant the action when you receive app.experience.action.payment.succeeded, keyed on purchase_reference so a redelivery grants nothing twice. The purchaseResult message your iframe receives from Fanvue is UX only — it tells your surface to stop showing a spinner, and it is never proof that money moved. This read is the reconciliation path: poll it when you think you missed a webhook, or to confirm one you are unsure about.
Owner app only: the experience must belong to the app whose credentials make the call, otherwise 403. Purchases belonging to another app are never returned, and a foreign experience uuid is refused before anything about it is read — this is not a way to enumerate experiences, creators or fans.
Every attempt is listed, not only the settled ones, so a pending that never landed and a refunded purchase are both visible. amount is in minor units (cents), frozen at the purchase attempt. Paging is keyset: pass the nextCursor from a prior response, and a purchase created while you page never shifts a row onto or off a later page.
curl --request GET \
--url https://api.fanvue.com/v1/experiences/{experienceUuid}/action-purchases \
--header 'Authorization: Bearer <token>' \
--header 'X-Fanvue-API-Version: <x-fanvue-api-version>'import requests
url = "https://api.fanvue.com/v1/experiences/{experienceUuid}/action-purchases"
headers = {
"X-Fanvue-API-Version": "<x-fanvue-api-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Fanvue-API-Version': '<x-fanvue-api-version>',
Authorization: 'Bearer <token>'
}
};
fetch('https://api.fanvue.com/v1/experiences/{experienceUuid}/action-purchases', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"purchaseReference": "expact_5c9a1f0e-9f3f-4c2a-8f31-1d0f6a2b7c44",
"experienceUuid": "00000000-0000-4000-8000-000000000010",
"externalActionId": "spin",
"clientReferenceId": "round-42",
"buyerUuid": "00000000-0000-4000-8000-000000000003",
"amount": 700,
"currency": "USD",
"status": "succeeded",
"invoiceNumber": "FVE-20260904-1234",
"createdAt": "2026-09-04T10:00:00.000Z",
"paidAt": "2026-09-04T10:00:02.000Z"
},
{
"purchaseReference": "expact_9b1e2d43-6d81-4f0a-9a77-2b4c8e5f1a03",
"experienceUuid": "00000000-0000-4000-8000-000000000010",
"externalActionId": "reveal",
"clientReferenceId": null,
"buyerUuid": "00000000-0000-4000-8000-000000000004",
"amount": 250,
"currency": "USD",
"status": "refunded",
"invoiceNumber": "FVE-20260904-1235",
"createdAt": "2026-09-04T09:58:00.000Z",
"paidAt": "2026-09-04T09:58:03.000Z"
}
],
"nextCursor": null
}{
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"nextVersion": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}read:experience— Exchange a fan’s experience token for the resolved experience and the fan’s identity, so an embedded fan-facing experience can render the right content.
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"
Path Parameters
"00000000-0000-4000-8000-000000000010"
Query Parameters
Number of results to return (default 50, max 100).
x <= 100Opaque cursor for the next page, from a prior response.
Was this page helpful?