List webhook events
GET/merchants/{merchantId}/webhook-eventsList webhook delivery records for the merchant, most recent first. Each record includes the event type, delivery status, attempt count, and the payload sent to your endpoint. Filter by subscription, type, and delivery status.
Headers
| Header | Description | Required |
|---|---|---|
| Authorization | Bearer token with your secret API key | yes |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchantId | string | yes |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | — | Rows per page, 1 to 100. Defaults to 50. Values outside the range are rejected rather than clamped. |
| starting_after | string | — | Cursor for forward pagination: an object id from a previous page. Returns results after it. Mutually exclusive with ending_before; sending both is a 400. |
| ending_before | string | — | Cursor for backward pagination: an object id from a previous page. Returns results before it. Mutually exclusive with starting_after; sending both is a 400. |
| subscription_id | string | — | |
| type | string | — | |
| delivered | enum: true | false | — |
Example Request
Request
const response = await fetch('https://checkout-api.exodus-int.com/merchants/<merchantId>/webhook-events?limit=50&starting_after=<starting_after>&ending_before=<ending_before>&subscription_id=<subscription_id>&type=<type>&delivered=true', {
method: 'GET',
headers: {
Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
},
});Responses
| Status | Description |
|---|---|
| 200 | A paginated list of webhook events. |
| 400 | Validation error |
| 401 | Missing or invalid authentication |
| 403 | API key lacks the required scope |
Response body
| Field | Type | Required | Description |
|---|---|---|---|
| object | enum: list | yes | |
| data | object[] | yes | |
| has_more | boolean | yes |
data
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | yes | |
| object | enum: event | yes | |
| type | string | yes | |
| delivered | boolean | yes | |
| attempts | number | yes | |
| last_error | string | null | yes | |
| subscription_id | string | null | yes | |
| subscription_checkout_id | string | null | yes | |
| checkout_id | string | null | yes | |
| payment_id | string | null | yes | |
| payload | object | null | — | |
| created_at | string | yes | |
| delivered_at | string | null | yes |
Example Response
{
"object": "list",
"data": [
{
"id": "evt_1234567890abcdef",
"object": "event",
"type": "payment.settled",
"delivered": true,
"attempts": 1,
"last_error": null,
"subscription_id": null,
"subscription_checkout_id": null,
"checkout_id": "chk_1234567890abcdef",
"payment_id": "tz4a98xxat96iws9zmbrgj3a",
"payload": {
"id": "evt_1234567890abcdef",
"object": "event",
"type": "payment.settled",
"created_at": "2024-01-15T12:30:00Z",
"data": {
"object": {
"id": "tz4a98xxat96iws9zmbrgj3a",
"object": "payment",
"status": "settled"
}
}
},
"created_at": "2024-01-15T12:30:00Z",
"delivered_at": "2024-01-15T12:30:01Z"
}
],
"has_more": false
}Error Response
Error (e.g. 400)
{
"error": {
"type": "validation_error",
"message": "starting_after and ending_before are mutually exclusive",
"param": "ending_before"
}
}