Webhooks endpoints

Webhook endpoints, their signing secrets and the delivery log. Every operation with parameters, body, responses, errors and examples.

View this page as Markdown

Webhook endpoints, their signing secrets and the delivery log.

Base URL https://app.processcart.com/api/v1. Every operation below is also in the OpenAPI document and the interactive reference.

Operation Method and path Scope
List webhooks GET /v1/webhooks Scope webhooks:manage
Create a webhook POST /v1/webhooks Scope webhooks:manage
Get a webhook GET /v1/webhooks/{id} Scope webhooks:manage
Update a webhook PATCH /v1/webhooks/{id} Scope webhooks:manage
Delete a webhook DELETE /v1/webhooks/{id} Scope webhooks:manage
Enable a webhook POST /v1/webhooks/{id}/enable Scope webhooks:manage
Disable a webhook POST /v1/webhooks/{id}/disable Scope webhooks:manage
Rotate a webhook's signing secret POST /v1/webhooks/{id}/rotate-secret Scope webhooks:manage
Send a test event POST /v1/webhooks/{id}/test Scope webhooks:manage
List a webhook's deliveries GET /v1/webhooks/{id}/deliveries Scope webhooks:manage
Get a delivery GET /v1/webhooks/{id}/deliveries/{deliveryId} Scope webhooks:manage
Send a delivery again POST /v1/webhooks/{id}/deliveries/{deliveryId}/redeliver Scope webhooks:manage

GET /v1/webhooks

List webhooks. Scope webhooks:manage · the key's allowlist narrows the rows (never a 403 — rows outside it are absent) · paginated ({ data, nextCursor, hasMore }). Operation id listWebhooks · open in the API reference.

Lists the workspace's webhook endpoints, newest first (no secrets). updatedSince turns the list into an incremental sync ordered by updatedAt ascending (inclusive). Keys restricted to folders cannot use the webhook operations (403 not_allowed_for_key); keys restricted to workflows manage only webhooks whose workflowIds is a non-empty subset of their allowlist, and see only deliveries about those workflows (plus test events).

Query parameters (an unknown parameter is a 422 validation_failed with errors[].code = "unknown_parameter")

Name Type Required Description
updatedSince string (date-time) no Incremental sync: only items whose updatedAt is at or after this instant (inclusive), ordered by updatedAt ascending; an explicit conflicting sort / order is a 422. Overlap by a minute and dedupe: a Run by (id, revision), any other item (workflow, view, webhook, schedule, automation rule) by (id, updatedAt) — a higher revision or a later updatedAt replaces the copy you hold, an equal one is unchanged.
limit integer no
cursor string no The nextCursor of the previous page. Opaque, and bound to the query that produced it — a cursor from a different filter or sort is a 422.

Responses

Status Meaning Body
200 OK. WebhookList
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
422 validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "data": [
    {
      "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
      "url": "https://hooks.example.com/processcart",
      "description": "Everything",
      "events": [
        "*"
      ],
      "workflowIds": null,
      "filters": {},
      "enabled": true,
      "disabledReason": null,
      "disabledAt": null,
      "consecutiveFailures": 0,
      "lastDeliveryAt": null,
      "createdAt": "2026-10-11T05:28:25.162Z",
      "createdBy": null,
      "updatedAt": "2026-10-11T05:28:25.162Z"
    }
  ],
  "nextCursor": null,
  "hasMore": false
}

POST /v1/webhooks

Create a webhook. Scope webhooks:manage · accepts Idempotency-Key. Operation id createWebhook · open in the API reference.

Subscribes an https endpoint to events (* = everything but the opt-in types), optionally narrowed to some workflows and, for field.updated, to some field keys. The response carries the Standard Webhooks signing secret ONCE — store it; rotate to get a new one. The URL is checked against the SSRF policy (public https only). Keys restricted to folders cannot use the webhook operations (403 not_allowed_for_key); keys restricted to workflows manage only webhooks whose workflowIds is a non-empty subset of their allowlist, and see only deliveries about those workflows (plus test events).

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Request body — application/json, WebhookConfig

Property Type Required Description
url string yes
description string no
events EventType \ "*"[] yes
workflowIds Uuid[] \ null no
filters object no

Responses

Status Meaning Body
201 Created. Location names the new resource. WebhookWithSecret
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress. Problem
413 payload_too_large — Payload too large. Problem
415 unsupported_media_type — Unsupported media type. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example request

{
  "url": "https://hooks.example.com/processcart",
  "description": "Everything",
  "events": [
    "*"
  ]
}

Example response (201)

{
  "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
  "url": "https://hooks.example.com/processcart",
  "description": "Everything",
  "events": [
    "*"
  ],
  "workflowIds": null,
  "filters": {},
  "enabled": true,
  "disabledReason": null,
  "disabledAt": null,
  "consecutiveFailures": 0,
  "lastDeliveryAt": null,
  "createdAt": "2026-10-11T05:28:25.162Z",
  "createdBy": null,
  "updatedAt": "2026-10-11T05:28:25.162Z",
  "secret": "whsec_EXAMPLEEXAMPLEEXAMPLEEXAMPLEEXAMPLEEXAMPLE"
}

GET /v1/webhooks/{id}

Get a webhook. Scope webhooks:manage. Operation id getWebhook · open in the API reference.

Returns one webhook endpoint with its subscription, filters, enabled state, failure counter and last delivery time — never the secret.

Path parameters

Name Type Required Description
id string (uuid) yes

Responses

Status Meaning Body
200 OK. Webhook
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
422 validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
  "url": "https://hooks.example.com/processcart",
  "description": "Everything",
  "events": [
    "*"
  ],
  "workflowIds": null,
  "filters": {},
  "enabled": true,
  "disabledReason": null,
  "disabledAt": null,
  "consecutiveFailures": 0,
  "lastDeliveryAt": null,
  "createdAt": "2026-10-11T05:28:25.162Z",
  "createdBy": null,
  "updatedAt": "2026-10-11T05:28:25.162Z"
}

PATCH /v1/webhooks/{id}

Update a webhook. Scope webhooks:manage · accepts Idempotency-Key. Operation id updateWebhook · open in the API reference.

Changes any subset of the configuration: url (re-checked against the SSRF policy), description, events, workflowIds (null clears the filter; omit the key to keep it) and filters. enabled is not part of the configuration — use the enable and disable operations. Audited.

Path parameters

Name Type Required Description
id string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Request body — application/json, WebhookPatch

Property Type Required Description
url string no
description string no
events EventType \ "*"[] no
workflowIds Uuid[] \ null no
filters object no

Responses

Status Meaning Body
200 OK. Webhook
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress. Problem
413 payload_too_large — Payload too large. Problem
415 unsupported_media_type — Unsupported media type. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example request

{
  "description": "Renamed",
  "events": [
    "run.created",
    "run.completed"
  ]
}

Example response (200)

{
  "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
  "url": "https://hooks.example.com/processcart",
  "description": "Renamed",
  "events": [
    "run.created",
    "run.completed"
  ],
  "workflowIds": null,
  "filters": {},
  "enabled": true,
  "disabledReason": null,
  "disabledAt": null,
  "consecutiveFailures": 0,
  "lastDeliveryAt": "2026-10-11T05:28:29.806Z",
  "createdAt": "2026-10-11T05:28:25.162Z",
  "createdBy": null,
  "updatedAt": "2026-10-11T05:28:30.342Z"
}

DELETE /v1/webhooks/{id}

Delete a webhook. Scope webhooks:manage · accepts Idempotency-Key. Operation id deleteWebhook · open in the API reference.

Removes the endpoint with its secret and delivery log. Pending deliveries are dropped; nothing is sent to the endpoint. Audited.

Path parameters

Name Type Required Description
id string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Responses

Status Meaning Body
204 Done; no body. —
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

POST /v1/webhooks/{id}/enable

Enable a webhook. Scope webhooks:manage · accepts Idempotency-Key. Operation id enableWebhook · open in the API reference.

Turns deliveries back on and resets the consecutive-failure counter — also the way to bring back an endpoint that was disabled automatically (after repeated failures or a 410). Enabling an enabled webhook answers 200 unchanged.

Path parameters

Name Type Required Description
id string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Responses

Status Meaning Body
200 OK. Webhook
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
  "url": "https://hooks.example.com/processcart",
  "description": "Everything",
  "events": [
    "*"
  ],
  "workflowIds": null,
  "filters": {},
  "enabled": true,
  "disabledReason": null,
  "disabledAt": null,
  "consecutiveFailures": 0,
  "lastDeliveryAt": "2026-10-11T05:28:27.885Z",
  "createdAt": "2026-10-11T05:28:25.162Z",
  "createdBy": null,
  "updatedAt": "2026-10-11T05:28:28.995Z"
}

POST /v1/webhooks/{id}/disable

Disable a webhook. Scope webhooks:manage · accepts Idempotency-Key. Operation id disableWebhook · open in the API reference.

Stops deliveries (reason manual). Events that happen while it is disabled are not queued for it. Disabling a disabled webhook answers 200 unchanged.

Path parameters

Name Type Required Description
id string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Responses

Status Meaning Body
200 OK. Webhook
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
  "url": "https://hooks.example.com/processcart",
  "description": "Everything",
  "events": [
    "*"
  ],
  "workflowIds": null,
  "filters": {},
  "enabled": false,
  "disabledReason": "manual",
  "disabledAt": "2026-10-11T05:28:28.437Z",
  "consecutiveFailures": 0,
  "lastDeliveryAt": "2026-10-11T05:28:27.885Z",
  "createdAt": "2026-10-11T05:28:25.162Z",
  "createdBy": null,
  "updatedAt": "2026-10-11T05:28:28.437Z"
}

POST /v1/webhooks/{id}/rotate-secret

Rotate a webhook's signing secret. Scope webhooks:manage · accepts Idempotency-Key. Operation id rotateWebhookSecret · open in the API reference.

Mints a new signing secret and returns it once. Until previousExpiresAt every delivery is signed with both secrets (two entries in webhook-signature), so the endpoint can switch without missing a beat. Audited.

Path parameters

Name Type Required Description
id string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Responses

Status Meaning Body
200 OK. WebhookSecret
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "secret": "whsec_EXAMPLEEXAMPLEEXAMPLEEXAMPLEEXAMPLEEXAMPLE",
  "previousExpiresAt": "2026-10-12T05:28:29.267Z"
}

POST /v1/webhooks/{id}/test

Send a test event. Scope webhooks:manage · accepts Idempotency-Key. Operation id testWebhook · open in the API reference.

Queues a webhook.test delivery to this endpoint and sends it right away (the response does not wait for the endpoint). Read the delivery to see the outcome. A disabled webhook is refused.

Path parameters

Name Type Required Description
id string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Responses

Status Meaning Body
202 Accepted; the work completes asynchronously. WebhookQueuedDelivery
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 idempotency_in_progress — Request in progress; webhook_disabled — Webhook disabled. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (202)

{
  "delivery": {
    "id": "eb2383ee-da26-48db-aaa3-42e61dc67272",
    "webhookId": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
    "attempt": 0
  }
}

GET /v1/webhooks/{id}/deliveries

List a webhook's deliveries. Scope webhooks:manage · the key's allowlist narrows the rows (never a 403 — rows outside it are absent) · paginated ({ data, nextCursor, hasMore }). Operation id listWebhookDeliveries · open in the API reference.

The endpoint's delivery log, newest first, with each delivery's status, attempt count, last response code and next attempt time. Filter by status. Deliveries older than the retention window are gone. A key restricted to workflows sees only deliveries about those workflows (and test events).

Path parameters

Name Type Required Description
id string (uuid) yes

Query parameters (an unknown parameter is a 422 validation_failed with errors[].code = "unknown_parameter")

Name Type Required Description
status "pending" \ "delivered" \ "failed" \
limit integer no
cursor string no The nextCursor of the previous page. Opaque, and bound to the query that produced it — a cursor from a different filter or sort is a 422.

Responses

Status Meaning Body
200 OK. WebhookDeliveryList
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
422 validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "data": [
    {
      "id": "eb2383ee-da26-48db-aaa3-42e61dc67272",
      "webhookId": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
      "eventId": "evt_9d68ebed-af3b-42da-aace-77503bb95cdc",
      "eventType": "webhook.test",
      "status": "delivered",
      "attemptCount": 1,
      "lastStatusCode": 200,
      "lastError": null,
      "lastAttemptAt": "2026-10-11T05:28:26.227Z",
      "nextAttemptAt": null,
      "deliveredAt": "2026-10-11T05:28:26.485Z",
      "createdAt": "2026-10-11T05:28:26.084Z"
    }
  ],
  "nextCursor": null,
  "hasMore": false
}

GET /v1/webhooks/{id}/deliveries/{deliveryId}

Get a delivery. Scope webhooks:manage. Operation id getWebhookDelivery · open in the API reference.

One delivery with the event envelope that was (or will be) POSTed — useful to inspect a failed delivery or to replay an event by hand.

Path parameters

Name Type Required Description
id string (uuid) yes
deliveryId string (uuid) yes

Responses

Status Meaning Body
200 OK. WebhookDeliveryWithPayload
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
422 validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (200)

{
  "id": "eb2383ee-da26-48db-aaa3-42e61dc67272",
  "webhookId": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
  "eventId": "evt_9d68ebed-af3b-42da-aace-77503bb95cdc",
  "eventType": "webhook.test",
  "status": "delivered",
  "attemptCount": 1,
  "lastStatusCode": 200,
  "lastError": null,
  "lastAttemptAt": "2026-10-11T05:28:26.227Z",
  "nextAttemptAt": null,
  "deliveredAt": "2026-10-11T05:28:26.485Z",
  "createdAt": "2026-10-11T05:28:26.084Z",
  "payload": {
    "id": "evt_9d68ebed-af3b-42da-aace-77503bb95cdc",
    "org": {
      "id": "83b4ff3e-2634-423e-89ab-f2c5c07ced1f",
      "slug": "example-workspace"
    },
    "data": {
      "webhook": {
        "id": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa"
      }
    },
    "type": "webhook.test",
    "actor": {
      "kind": "api",
      "name": "Zapier",
      "keyId": "d5ec9555-1a0c-455a-86e6-c7b18bcabc78"
    },
    "timestamp": "2026-10-11T05:28:26.084Z"
  }
}

POST /v1/webhooks/{id}/deliveries/{deliveryId}/redeliver

Send a delivery again. Scope webhooks:manage · accepts Idempotency-Key. Operation id redeliverWebhookDelivery · open in the API reference.

Queues a finished delivery (delivered, failed or exhausted) again with the same webhook-id and sends it right away; the attempt count keeps counting. A delivery still in flight, or a disabled webhook, is refused. Audited.

Path parameters

Name Type Required Description
id string (uuid) yes
deliveryId string (uuid) yes

Request headers

Name Type Required Description
Idempotency-Key string no Makes the request safe to retry: a second request with the same key and a byte-identical body (and the same Expected-Revision) replays the stored response (Idempotent-Replayed: true); a different body with the same key is refused (422 idempotency_key_reused) and no second resource is created. Keys are stored per workspace for 24 hours and replayed only to the API key that made the request (or the key one rotation away from it); another API key sending the same value is refused (422 idempotency_key_reused), so prefix keys per integration. 409, 429 and 5xx answers are never stored.

Responses

Status Meaning Body
202 Accepted; the work completes asynchronously. WebhookQueuedDelivery
401 No usable credential. unauthorized — Authentication required; invalid_api_key — Invalid API key; key_revoked — API key revoked. Problem
403 insufficient_scope — Insufficient scope; not_allowed_for_key — Not allowed for this key; read_only_key — Read-only key. Problem
404 not_found — Not found. Problem
405 The verb is not supported on this path. method_not_allowed — Method not allowed. Problem
409 delivery_not_terminal — Delivery not finished; idempotency_in_progress — Request in progress; webhook_disabled — Webhook disabled. Problem
422 idempotency_key_reused — Idempotency key reused; validation_failed — Validation failed. Problem
429 rate_limited — Too many requests. Problem
500 internal_error — Internal error. Problem
503 unavailable — Service unavailable. Problem

Errors (every code this operation can answer; see Errors)

Example response (202)

{
  "delivery": {
    "id": "eb2383ee-da26-48db-aaa3-42e61dc67272",
    "webhookId": "2b64ebdd-e0ba-4d01-aca7-914b36d905aa",
    "attempt": 1
  }
}