curl -sS \
-X POST \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Idempotency-Key: wh_redeliver_456' \
'https://api.0xinsider.com/api/v1/webhooks/123/deliveries/456/redeliver'import requests
url = "https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyRedeliver a webhook delivery
Retry a failed webhook delivery with a new allowance of 8 attempts.
curl -sS \
-X POST \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Idempotency-Key: wh_redeliver_456' \
'https://api.0xinsider.com/api/v1/webhooks/123/deliveries/456/redeliver'import requests
url = "https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodystatus is dead_letter. It returns the delivery in the same format as Webhook deliveries.
Re-enabling an endpoint through Update a webhook does not resend failed events. Use this route for individual deliveries or Event replay to recover recorded large-trade events.
Parameters
| Parameter | Description |
|---|---|
id | The endpoint the delivery belongs to. |
delivery_id | The delivery to requeue, taken from Webhook deliveries. It has to belong to the endpoint named by id. |
Idempotency-Key header | Optional, and up to 255 characters. Reuse it only when you are retrying this exact request, on this same delivery. |
What the requeue changes
| Field | After the call |
|---|---|
status | pending. The delivery is queued again like any other. |
attempt_count | 0. The full schedule of 8 attempts runs again. |
next_attempt_at | Now. |
retry_schedule_reason | manual_redelivery. |
event_id and the delivery’s idempotency-key header | Unchanged, so a receiver that already processed this event can recognize the repeat and skip it. |
x-0xinsider-delivery-attempt | Starts again at 1. |
last_response_status and last_error | They keep the old failure until the next attempt records its own. |
url and signed with its current secret, not the ones in use when the delivery first failed.
Retry schedule
The wait after each failure is capped at the value below, and the 8th failure returns the delivery todead_letter. Webhook deliveries explains how each wait is chosen, how a Retry-After from your server changes it, and what each retry_schedule_reason value means.
| Attempt that failed | Wait before the next one, at most |
|---|---|
| 1 | 60 seconds |
| 2 | 120 seconds |
| 3 | 240 seconds |
| 4 | 480 seconds |
| 5 | 960 seconds |
| 6 | 1,920 seconds |
| 7 | 3,600 seconds |
| 8 | None. status returns to dead_letter. |
Example
curl -X POST \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H "Idempotency-Key: webhook-redeliver-456-2026-09-22" \
"https://api.0xinsider.com/api/v1/webhooks/42/deliveries/456/redeliver"
Handle a 409 or a 422
| Answer | What it means | What to do |
|---|---|---|
409, error.param delivery_id | The delivery was already delivered, or it is still queued as pending, retry, or processing. Only a dead_letter delivery can be requeued. | Read the row in Webhook deliveries. A queued row needs nothing from you. |
409, error.param endpoint | The endpoint is disabled, is not verified, or no longer subscribes to this delivery’s event_type, so the resend would be dead-lettered again. | Do what error.message names, then send this request again. |
409, error.reason idempotency_in_progress | Your first request with this Idempotency-Key is still running. | Wait a few seconds, then send the same key again. |
422, error.param Idempotency-Key | The key was already used for a different request, such as a different delivery_id. | Pick a new key. One key belongs to one request. |
What it does not do
- Find the delivery for you. Take
delivery_idfrom Webhook deliveries. - Requeue in bulk. It is one call per delivery, so for a long gap catch up from Event replay instead.
- Reach a row that retention deleted.
deliveredanddead_letterrows are kept for 7 days, after which thedelivery_idreturns404. - Answer anything but
404for an endpoint or a delivery you do not own. That is the same answer as an id that never existed.
Authorizations
Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).
Headers
Opt into strict query-name validation. The default is compatible: unknown names are ignored and reported in X-Query-Ignored. With strict, an unknown name returns 400 bad_request with error.reason unknown_query_parameter before the handler runs, including when its percent escape is incomplete.
strict Optional safe-retry key. Reuse the same value only when retrying the exact same mutation request body; a different body returns 422 and an in-flight matching request returns 409.
1 - 255Path Parameters
Webhook endpoint id owned by the authenticated API key user.
Delivery id from GET /api/v1/webhooks/{id}/deliveries. It must belong to the webhook endpoint named by id.
Response
The requeued delivery, in the same shape as one GET /api/v1/webhooks/{id}/deliveries row.
"webhook_delivery"Owner-scoped view of one webhook delivery attempt. Deliberately omits the request body and the endpoint signing secret: a delivery log never re-exposes the payload or any secret material.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?