Webhooks

Purchase Received

purchase.received

Fires when a fan purchases a PPV post or message. Subscription renewals are reported separately under subscriber.new.

When it fires

Pair with mass-message sends to attribute revenue to specific broadcasts via the source field.

Payload

Wrapped in the standard webhook envelope (event, data, timestamp):

json · example delivery
1{
2 "event": "purchase.received",
3 "data": {
4 "purchase": {
5 "id": "pur_8a2c",
6 "amountCents": 1200,
7 "kind": "message",
8 "source": {
9 "id": "msg_010",
10 "massMessageId": "mm_9a3c1b04"
11 }
12 },
13 "purchaser": {
14 "id": "usr_fan123",
15 "handle": "fan123"
16 },
17 "purchasedAt": "2026-04-28T20:14:08Z"
18 },
19 "timestamp": "2026-04-28T20:14:09Z"
20}

data fields

FieldTypeDescription
purchase.idstringUnique ID of the purchase.
purchase.amountCentsintegerAmount paid in USD cents (before fees).
purchase.kind'post' | 'message'Whether the unlock was a feed post or DM.
purchase.source.idstringID of the post or message that was unlocked.
purchase.source.massMessageIdstring | nullIf the message was sent via a mass-message broadcast, the broadcast ID.
purchaser.idstringID of the fan who paid.
purchaser.handlestringPublic handle of the fan.
purchasedAtstring (ISO 8601)Timestamp of the purchase.