Receiving webhooks
Subscription ended
subscription.endedA subscription of a fan to a creator of the agency ended: the paid period is over and no renewal came. Fansquare waits for the renewal to fail before it announces the end, so the event can come hours after the end date of the period.
created_at is data.ended_at: the time Fansquare confirmed the end, not the end date of the period.
{
"id": "0199c7a2-5d4e-7b3a-9f1e-2c8d6b4a1e07",
"type": "subscription.ended",
"created_at": "2026-10-12T21:14:00.000Z",
"api_version": "2026-07-06",
"data": {
"account_id": "c851d9d6-b90b-4958-aed2-2fdaa2fe21a3",
"fan_id": "a6df8022-e509-4575-ad28-e29c2d1d42dc",
"fan_username": "alex_92",
"creator_id": "m81IhLxdhzDGYs54rNp2",
"ended_at": "2026-10-12T21:14:00.000Z"
}
}Delivery headers
Fansquare-SignaturestringrequiredSignature of the delivery:
v1=followed by the hexadecimal HMAC-SHA256 of{Fansquare-Signature-Timestamp}.{raw body}, keyed with the signing secret of the endpoint. Compute it over the raw body, before any JSON parsing, and compare in constant time.Fansquare-Signature-TimestampintegerrequiredUnix time, in seconds, at which this attempt was signed. Each attempt is signed again. Reject a delivery whose timestamp is more than 5 minutes away from your clock: it blocks replays of an intercepted delivery.
Fansquare-Event-TypestringrequiredEvent type, the
typeof the body.Fansquare-Event-IdstringrequiredEvent id, the
idof the body. The same across automatic retries and replays: deduplicate on it.format uuidFansquare-Delivery-IdstringrequiredId of this delivery of the event to this endpoint. The same across the automatic retries (10 seconds, 1 minute, then 5 minutes after a failed attempt), new on a replay. Any response other than a 2xx within 10 seconds, redirects included, is a failed attempt; after the last one the delivery is listed by GET /v1/webhooks/{endpoint_id}/failures.
format uuidUser-AgentstringrequiredAlways
Offmy-Webhooks/1.0.
Delivery body
idstringrequiredEvent id. The same for every endpoint that receives the event, and across automatic retries and replays: deduplicate on it. Also sent as the
Fansquare-Event-Idheader.format uuidtype"subscription.ended"requiredEvent type. Also sent as the
Fansquare-Event-Typeheader.created_atstringrequiredWhen the fact occurred (ISO 8601, UTC), not when this delivery was sent: a retry or a replay carries the original value. The description of each event says which instant it is.
format date-timeapi_versionstringrequiredVersion the payload is rendered in: the release date of the version pinned on the endpoint at its creation (the
api_versionof the endpoint), for example2026-07-06.dataobjectrequiredaccount_idstringrequiredMYM account id of the creator (
account.external_idin GET /v1/creators), as used by the /v1/accounts routes.fan_idstringrequiredMYM fan id.
fan_usernamestring | nullrequiredMYM username of the fan, or null when Fansquare does not know it yet.
creator_idstringrequiredFansquare id of the creator (see GET /v1/creators).
ended_atstringrequiredTime Fansquare confirmed the end of the subscription (ISO 8601, UTC), not the end date of the paid period. Also the
created_atof the event.format date-time
{
"id": "0199c7a2-5d4e-7b3a-9f1e-2c8d6b4a1e07",
"type": "subscription.ended",
"created_at": "2026-10-12T21:14:00.000Z",
"api_version": "2026-07-06",
"data": {
"account_id": "c851d9d6-b90b-4958-aed2-2fdaa2fe21a3",
"fan_id": "a6df8022-e509-4575-ad28-e29c2d1d42dc",
"fan_username": "alex_92",
"creator_id": "m81IhLxdhzDGYs54rNp2",
"ended_at": "2026-10-12T21:14:00.000Z"
}
}