Webhooks
Purchase Received
purchase.receivedFires 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
| Field | Type | Description |
|---|---|---|
purchase.id | string | Unique ID of the purchase. |
purchase.amountCents | integer | Amount paid in USD cents (before fees). |
purchase.kind | 'post' | 'message' | Whether the unlock was a feed post or DM. |
purchase.source.id | string | ID of the post or message that was unlocked. |
purchase.source.massMessageId | string | null | If the message was sent via a mass-message broadcast, the broadcast ID. |
purchaser.id | string | ID of the fan who paid. |
purchaser.handle | string | Public handle of the fan. |
purchasedAt | string (ISO 8601) | Timestamp of the purchase. |