Webhooks
A subscription expired
Sent when a subscription ends naturally — its fixed term completed, or payment retries were exhausted. See data.expiration.reason. data is the full Subscription.
postWebhooksubscription.expired
Payload
Example payload
{
"id": "0197c41d-88ae-7b6f-a2d1-0f5e7c3b9a44",
"type": "subscription.expired",
"timestamp": "2026-08-18T00:00:05.147903266Z",
"sequence": 31,
"resourceType": "subscription",
"resourceId": "0197a02b-5cd1-7e94-bf62-8d31607ea4f5",
"data": {
"id": "0197a02b-5cd1-7e94-bf62-8d31607ea4f5",
"planId": "019801a3-4d5e-7f80-9a1b-2c3d4e5f6071",
"planName": "Pro Monthly",
"amount": {
"amount": "29.00",
"asset": "USD"
},
"customerProfileId": "acct_5107",
"email": "grace@example.com",
"notifyUrl": "https://merchant.example/confirmo/webhook",
"status": "EXPIRED",
"startDate": 1755475200,
"cycleNumber": 12,
"currentPeriod": {
"start": 1784332800,
"end": 1787011200
},
"endsAt": 1787011200,
"expiration": {
"at": 1787011200,
"reason": "TERM_REACHED"
},
"createdAt": 1755448930,
"updatedAt": 1787011205
}
}Response
Return any 2xx status to acknowledge receipt. Any other response (or a timeout) is treated as a delivery failure and retried.
Changes
Webhooks have no change history: a webhook is keyed by its event name rather than a path and method, so no recorded change can name it.