webhookUrl. The first delivery attempt is always synchronous and immediate.2xx range (200-299).| Attempt | Delay After Previous Failure |
|---|---|
| 1 | Immediate (first attempt) |
| 2 | 1 minute |
| 3 | 5 minutes |
| 4 | 15 minutes |
| 5 | 1 hour |
| 6 | 4 hours |
| 7 | 12 hours |
5xx errors (server errors)429 (rate limited)2xx (success - delivery complete)4xx errors (except 429) - these indicate client-side issues that won't be resolved by retrying400, 401, 403, 404){
"id": "evt_abc123...",
"type": "payment_link.payment_status_changed",
"createdAt": "2024-01-15T10:30:00.000Z",
"data": {
// Event-specific payload
}
}| Event Type | Description |
|---|---|
payment_link.created | Payment link was created |
payment_link.status_changed | Link status changed (ACTIVE, INACTIVE, EXPIRED) |
payment_link.payment_status_changed | Payment status changed (NOT_STARTED, PENDING, COMPLETED) |
2xx response as fast as possible (ideally < 1 second). Process the webhook payload asynchronously if needed.id field to deduplicate:| Scenario | Status Code | SX Behavior |
|---|---|---|
| Success | 200-299 | Delivery marked as complete |
| Invalid signature | 401 | No retry (permanent failure) |
| Invalid payload | 400 | No retry (permanent failure) |
| Endpoint busy | 429 | Retry scheduled |
| Server error | 500 | Retry scheduled |
| Endpoint down | Timeout | Retry scheduled |
webhookUrl with HTTPS to ensure webhook payloads are encrypted in transit.x-sxpay-signature header.GET /payment-links/{id} as a source of truth to verify the current statedevelopers@sxdigitalpay.comwebhookUrl is correct - Check the URL in your payment link creation requestid field.payment_status_changed before created). Use GET /payment-links/{id} as the source of truth, or sort events by createdAt before processing.2xx quickly to acknowledge receipt