Receiving webhooks
Order refunded
order.refundedAn order already recorded by Fansquare switched to refunded on MYM. data has the shape of an item of GET /v1/orders, read after the refund was recorded. That shape has no status field: this event is the refund signal, GET /v1/orders does not flag refunded orders.
Refunds are detected by the incremental sync that MYM refund notifications trigger, which reads the most recent orders of the account again (about the last 300): a refund on an older order may go undetected, and is then not emitted. An order first recorded when it is already refunded only emits order.created. Historical imports never emit.
created_at is the time Fansquare recorded the refund. The date of the order stays in data.order_date.
{
"id": "0199c7a2-5d4e-7b3a-9f1e-2c8d6b4a1e07",
"type": "order.refunded",
"created_at": "2026-10-13T09:02:00.000Z",
"api_version": "2026-07-06",
"data": {
"id": "b387813a-7210-4db8-affc-a11197ea9002",
"external_id": "45e1ccbf-f63f-4198-aa97-f1998abff33d",
"order_date": "2026-10-12T21:14:00.000Z",
"order_type": "tip",
"gross_amount": 4900,
"net_amount": 3920,
"currency": "EUR",
"creator_id": "m81IhLxdhzDGYs54rNp2",
"fan_id": "a6df8022-e509-4575-ad28-e29c2d1d42dc",
"fan_username": "alex_92",
"attribution": {
"user_id": "ki9DZXxpgGz7KiDqHj88eCxHg56W",
"method": "message_link",
"attributed_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"order.refunded"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.dataobjectrequiredidstringrequiredFansquare order id. Path parameter for GET /v1/orders/{order_id}.
external_idstringrequiredMYM order id. Not usable as a path parameter.
order_datestringrequiredWhen the order was placed (ISO 8601).
format date-timeorder_typestringrequiredKind of sale. New MYM order types can appear: treat an unknown value as a generic sale.
Valuestipsubscriptionsubscription_renewalbookingpushmodfan_to_creatorcreator_to_fanprivate_mediaaffiliategross_amountinteger | nullrequiredGross revenue, integer cents, in
currency.net_amountinteger | nullrequiredNet revenue, integer cents, in
currency.currencystringrequiredCurrency of the amounts. Fansquare converts every order to EUR.
creator_idstringrequiredFansquare creator id (see GET /v1/creators).
fan_idstring | nullrequiredMYM fan id of the buyer. Usable as fan_id on the /v1/accounts routes.
fan_usernamestring | nullrequiredMYM username of the buyer, when known.
attributionobject | nullrequiredEmployee credited for this sale, as tracked by Fansquare. Read-only. null when unattributed.
user_idstringrequiredFansquare employee id the sale is credited to. May reference a former employee absent from GET /v1/employees.
methodstringrequiredHow the sale was credited:
message_link(the order pays for a message the employee sent),last_sender_auto(the last employee who wrote to the fan before the order),manual(set by hand in Fansquare).Valuesmessage_linklast_sender_automanualattributed_atstringrequiredWhen the sale was credited (ISO 8601).
format date-time
{
"id": "0199c7a2-5d4e-7b3a-9f1e-2c8d6b4a1e07",
"type": "order.refunded",
"created_at": "2026-10-13T09:02:00.000Z",
"api_version": "2026-07-06",
"data": {
"id": "b387813a-7210-4db8-affc-a11197ea9002",
"external_id": "45e1ccbf-f63f-4198-aa97-f1998abff33d",
"order_date": "2026-10-12T21:14:00.000Z",
"order_type": "tip",
"gross_amount": 4900,
"net_amount": 3920,
"currency": "EUR",
"creator_id": "m81IhLxdhzDGYs54rNp2",
"fan_id": "a6df8022-e509-4575-ad28-e29c2d1d42dc",
"fan_username": "alex_92",
"attribution": {
"user_id": "ki9DZXxpgGz7KiDqHj88eCxHg56W",
"method": "message_link",
"attributed_at": "2026-10-12T21:14:00.000Z"
}
}
}