Webhook deliveries tools
MCP tools for Webhook deliveries: webhook_deliveries_get, webhook_deliveries_list, webhook_deliveries_redeliver.
webhook_deliveries_get: Get a webhook deliverywebhook_deliveries_list: List webhook deliverieswebhook_deliveries_redeliver: Redeliver a webhook
webhook_deliveries_get
Get a webhook delivery. Operation webhook_deliveries.get · Brand level · permission webhooks:read · risk tier read · since M4
Returns one webhook delivery with its attempts: when each was made, its outcome, the HTTP status your endpoint answered with and the start of the response body; and, while it is still being retried, nextAttemptAt.
Annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
id | ID (whd_…) | yes | – |
entity_id | ID (ent_…) | no | Optional: the brand's legal entity (ent_…); brand_id alone is enough. |
brand_id | ID (brd_…) | no | The brand to act on (brd_…), inside your API key's reach. Needed with an organization or entity key; a brand key acts on its own brand. |
- Brand: pass
brand_idwith an organization or entity key; a brand key acts on its own brand. - Read-only: changes nothing;
idempotency_keyis ignored.
Errors
resource_not_found: No delivery with this ID is visible to the request.permission_denied: You can't see this brand's webhooks.
Example
A delivery that succeeded on its second attempt
Arguments:
{
"id": "whd_01m4tx5nj8emwbyf7y9vcf47z2",
"brand_id": "brd_01jbx4m3v8e9t0s6k2c5n7q1wz"
}
Result output:
{
"id": "whd_01m4tx5nj8emwbyf7y9vcf47z2",
"object": "webhook_delivery",
"endpointId": "we_01m4tx5nj8emwbyf7y9vcf47z0",
"brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"livemode": false,
"eventId": "evt_01m4tx5nj8emwbyf7y9vcf47z4",
"eventType": "customer.created",
"trigger": "event",
"redeliveryOf": null,
"status": "succeeded",
"attempt": 2,
"maxAttempts": 15,
"nextAttemptAt": null,
"responseCode": 200,
"canceledReason": null,
"attempts": [
{
"attempt": 1,
"at": "2026-10-13T12:00:00.000Z",
"outcome": "http_error",
"responseCode": 503,
"responseExcerpt": "Service Unavailable",
"durationMs": 812,
"error": null
},
{
"attempt": 2,
"at": "2026-10-13T12:01:00.000Z",
"outcome": "succeeded",
"responseCode": 200,
"responseExcerpt": "ok",
"durationMs": 95,
"error": null
}
],
"createdAt": "2026-10-13T12:00:00.000Z",
"updatedAt": "2026-10-13T12:01:00.000Z"
}
webhook_deliveries_list
List webhook deliveries. Operation webhook_deliveries.list · Brand level · permission webhooks:read · risk tier read · since M4
Lists the brand's webhook deliveries in the request's mode, newest first: one per event and endpoint, plus
test deliveries and redeliveries, each with its attempts (status code and the start of the response body).
Filter by endpointId, eventId or status (pending, succeeded, failed, canceled).
Paginate with limit (1–100, default 10) and starting_after (the next_cursor of the previous page).
Annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
endpointId | ID (we_…) | no | Only deliveries to this endpoint. |
eventId | ID (evt_…) | no | Only deliveries of this event. |
status | one of pending, succeeded, failed, canceled | no | – |
limit | integer | no | (1–100) |
starting_after | ID (whd_…) | no | – |
entity_id | ID (ent_…) | no | Optional: the brand's legal entity (ent_…); brand_id alone is enough. |
brand_id | ID (brd_…) | no | The brand to act on (brd_…), inside your API key's reach. Needed with an organization or entity key; a brand key acts on its own brand. |
- Brand: pass
brand_idwith an organization or entity key; a brand key acts on its own brand. - Read-only: changes nothing;
idempotency_keyis ignored.
Errors
validation_failed: A filter or pagination value is malformed.permission_denied: You can't see this brand's webhooks.
Example
An endpoint's delivery log
Arguments:
{
"endpointId": "we_01m4tx5nj8emwbyf7y9vcf47z0",
"brand_id": "brd_01jbx4m3v8e9t0s6k2c5n7q1wz"
}
Result output:
{
"object": "list",
"data": [
{
"id": "whd_01m4tx5nj8emwbyf7y9vcf47z2",
"object": "webhook_delivery",
"endpointId": "we_01m4tx5nj8emwbyf7y9vcf47z0",
"brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"livemode": false,
"eventId": "evt_01m4tx5nj8emwbyf7y9vcf47z4",
"eventType": "customer.created",
"trigger": "event",
"redeliveryOf": null,
"status": "succeeded",
"attempt": 2,
"maxAttempts": 15,
"nextAttemptAt": null,
"responseCode": 200,
"canceledReason": null,
"attempts": [
{
"attempt": 1,
"at": "2026-10-13T12:00:00.000Z",
"outcome": "http_error",
"responseCode": 503,
"responseExcerpt": "Service Unavailable",
"durationMs": 812,
"error": null
},
{
"attempt": 2,
"at": "2026-10-13T12:01:00.000Z",
"outcome": "succeeded",
"responseCode": 200,
"responseExcerpt": "ok",
"durationMs": 95,
"error": null
}
],
"createdAt": "2026-10-13T12:00:00.000Z",
"updatedAt": "2026-10-13T12:01:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}
webhook_deliveries_redeliver
Redeliver a webhook. Operation webhook_deliveries.redeliver · Brand level · permission webhooks:write · risk tier write · since M4
Sends a finished delivery's event to its endpoint again, as a new delivery with trigger: "redeliver" and
redeliveryOf set: the same body and event id (deduplicate on it), signed anew. It is attempted once, right
after the call, also when the endpoint is disabled; read the outcome with webhook_deliveries.get.
Use it after fixing a receiver, for events whose retries ran out or that were canceled while the endpoint was disabled. A delivery that is still being retried can't be redelivered.
Annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: false · openWorldHint: true
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
id | ID (whd_…) | yes | – |
entity_id | ID (ent_…) | no | Optional: the brand's legal entity (ent_…); brand_id alone is enough. |
brand_id | ID (brd_…) | no | The brand to act on (brd_…), inside your API key's reach. Needed with an organization or entity key; a brand key acts on its own brand. |
idempotency_key | string | no | A unique string for this change. Retrying with the same key and arguments never acts twice. When left out, the server generates one and returns it in the result's idempotency_key. (1–255 characters) |
dry_run | boolean | no | true: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false) |
- Brand: pass
brand_idwith an organization or entity key; a brand key acts on its own brand. - Idempotency: the result returns the
idempotency_keyused, yours or one the server generated. Retry with it: a call with the same key and arguments never acts twice (keys are kept for 24 hours). - Dry run: supported.
dry_run: truechecks permissions and rules and computes the result, then rolls everything back.
Errors
webhook_delivery_in_progress: The delivery is still pending (being retried).resource_not_found: No delivery with this ID is visible to the request, or its endpoint was deleted.permission_denied: You can't redeliver this brand's webhooks.
Example
Redeliver a failed delivery
Arguments:
{
"id": "whd_01m4tx5nj8emwbyf7y9vcf47z2",
"brand_id": "brd_01jbx4m3v8e9t0s6k2c5n7q1wz",
"idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
Result output:
{
"id": "whd_01m4tx5nj8emwbyf7y9vcf47z3",
"object": "webhook_delivery",
"endpointId": "we_01m4tx5nj8emwbyf7y9vcf47z0",
"brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"livemode": false,
"eventId": "evt_01m4tx5nj8emwbyf7y9vcf47z4",
"eventType": "customer.created",
"trigger": "redeliver",
"redeliveryOf": "whd_01m4tx5nj8emwbyf7y9vcf47z2",
"status": "pending",
"attempt": 0,
"maxAttempts": 1,
"nextAttemptAt": "2026-10-14T10:30:00.000Z",
"responseCode": null,
"canceledReason": null,
"attempts": [],
"createdAt": "2026-10-14T10:30:00.000Z",
"updatedAt": "2026-10-14T10:30:00.000Z"
}