Send a delivery again
Sends the same event to the webhook again as a new delivery, signed afresh.
/v1/webhooks/{id}/deliveries/{delivery_id}/replay
Sends the same event to the webhook again as a new delivery, signed afresh. The event keeps its id, so a receiver that already has it can skip it.
Needs a key with the webhooks:manage scope.
Send an Idempotency-Key so a retry never acts twice.
Path parameters
idstringrequiredThe webhook’s id.
Starts with
wh_.delivery_idstringrequiredThe delivery’s id.
Starts with
dlv_.
Headers
Idempotency-KeystringAny string of up to 255 characters, new for each request. A retry with the same key gets the first answer back for 24 hours, with
Idempotent-Replayed: true.Up to 255 characters.
Example
/v1/webhooks/wh_1Hq2LxW9cVbN3mKpRtYs0a/deliveries/dlv_1Hq2LxW9cVbN3mKpRtYs0a/replaycurl -X POST "https://usebluebot.com/api/v1/webhooks/wh_1Hq2LxW9cVbN3mKpRtYs0a/deliveries/dlv_1Hq2LxW9cVbN3mKpRtYs0a/replay" \
-H "Authorization: Bearer $BLUEBOT_API_KEY" \
-H "Idempotency-Key: 0f6d8c2e-5b1a-4c7e-9d3f-2a8b6e1c4d70"Response
202: The new delivery, waiting to be sent.
idstringrequiredA dlv_ id.
Starts with
dlv_.object"webhook_delivery"requiredwebhook_idstringrequiredA wh_ id.
Starts with
wh_.event_idstringrequiredA evt_ id.
Starts with
evt_.event_typestringrequiredOne of
message.queued,message.sent,message.delivered,message.read,message.failed,message.unconfirmed,message.expired,message.canceled,message.received,message.edited,message.unsent,reaction.added,reaction.removed,chat.created,contact.created,contact.stopped,contact.unstopped,sequence.completed,broadcast.completed,automation.matched,device.online,device.offline,device.check_failed.testbooleanrequiredTrue for an example sent with
POST /v1/webhooks/{id}/test.statestringrequiredpending(trying, or waiting to try again),delivered,gave_upafter the last retry, ordropped.One of
pending,delivered,gave_up,dropped.attemptsintegerrequiredlast_statusinteger or nullrequiredThe HTTP status of the last try.
last_errorstring or nullrequiredWhy the last try failed, when there was no answer.
last_duration_msinteger or nullrequiredlast_response_bodystring or nullrequiredThe first 2 KB of what your endpoint answered on the last try, as text. Null when it answered with no body or not at all.
next_attempt_attimestamp or nullrequiredWhen it is tried next, while pending.
delivered_attimestamp or nullrequiredWhen a 2xx answered it.
replay_ofstring or nullrequiredThe delivery this one repeats, for a replay.
Starts with
dlv_.created_attimestamprequiredWhen it was made.
{
"id": "dlv_2Bf8QzD4kJmA6nXwEuTr1c",
"object": "webhook_delivery",
"webhook_id": "wh_1Hq2LxW9cVbN3mKpRtYs0a",
"event_id": "evt_1Hq2LxW9cVbN3mKpRtYs0a",
"event_type": "message.received",
"test": false,
"state": "pending",
"attempts": 0,
"last_status": null,
"last_error": null,
"last_duration_ms": null,
"last_response_body": null,
"next_attempt_at": "2026-11-13T19:41:00.000Z",
"delivered_at": null,
"replay_of": "dlv_1Hq2LxW9cVbN3mKpRtYs0a",
"created_at": "2026-11-13T19:44:12.000Z"
}Errors
Every refusal has the same envelope and a page of its own. These are the ones this operation can give.
| Code | Status | What it means |
|---|---|---|
| 401 | The request carried no key, or a key BlueBot doesn’t know: mistyped, revoked, or a test key sent to the live API. | |
| 403 | The key doesn’t carry the scope the endpoint needs. Each endpoint’s reference names its scope. | |
| 429 | Too many requests. A key may make 120 requests a minute. The RateLimit header says how many are left, and Retry-After how long to wait. | |
| 500 | Something went wrong on BlueBot’s side. It was reported. Send the request again; with an Idempotency-Key that is always safe. | |
| 404 | There is no such thing on this account. Ids are prefixed by kind, so a message id starts with msg_. | |
| 409 | The request doesn’t fit the thing’s current state, or another request with the same Idempotency-Key is still running. | |
| 409 | The Idempotency-Key was used in the last 24 hours with a different request. A key stands for one request. |
Try it
Call this operation from the page with your own key. The key stays in this tab and is forgotten when you leave.