Receiving webhooks
Order created
order.createdA new order was recorded for a creator of the agency. data has the shape of an item of GET /v1/orders.
Orders reach Fansquare through an incremental sync that MYM payment notifications trigger, usually seconds after the purchase. Only this sync emits order events: historical imports (the backfill that runs when an account is connected, or any later re-import) never do, so connecting a creator does not replay her past orders. Each order is announced once.
created_at is the date the order was placed (data.order_date), not the time Fansquare recorded it. data.attribution is the attribution known when the event was emitted: an attribution computed or changed later (the periodic attribution pass, a manual attribution in Fansquare) emits nothing, read it back from GET /v1/orders/{order_id}.
{
"id": "0199c7a2-5d4e-7b3a-9f1e-2c8d6b4a1e07",
"type": "order.created",
"created_at": "2026-10-12T21:14: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.created"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.created",
"created_at": "2026-10-12T21:14: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"
}
}
}