Retry Delivery
curl --request POST \
--url https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry', 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.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "8c7d6e5f-4a3b-2c1d-0e9f-8a7b6c5d4e3f",
"event": "job.completed",
"event_id": "evt_9f2c4a7b1e8d40a3b6c5d2e1f0a9b8c7",
"status": "pending",
"webhook_id": "3f9a1c22-8e4b-4d7a-9c11-77d2f0b5a8e3",
"target_url": "https://your-server.com/webhooks/fastdrop",
"job_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"attempts": 0,
"max_attempts": 3,
"response_status": null,
"response_body": null,
"error": null,
"created_at": "2026-08-15T12:01:15Z",
"last_attempt_at": "2026-08-15T12:11:45Z",
"next_retry_at": null,
"delivered_at": null
}
Webhooks
Retry Delivery
Replay a webhook delivery — no credits, no re-running the job
POST
/
webhooks
/
deliveries
/
{delivery_id}
/
retry
Retry Delivery
curl --request POST \
--url https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry', 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.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fastdrop.io/api/v1/webhooks/deliveries/{delivery_id}/retry")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "8c7d6e5f-4a3b-2c1d-0e9f-8a7b6c5d4e3f",
"event": "job.completed",
"event_id": "evt_9f2c4a7b1e8d40a3b6c5d2e1f0a9b8c7",
"status": "pending",
"webhook_id": "3f9a1c22-8e4b-4d7a-9c11-77d2f0b5a8e3",
"target_url": "https://your-server.com/webhooks/fastdrop",
"job_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"attempts": 0,
"max_attempts": 3,
"response_status": null,
"response_body": null,
"error": null,
"created_at": "2026-08-15T12:01:15Z",
"last_attempt_at": "2026-08-15T12:11:45Z",
"next_retry_at": null,
"delivered_at": null
}
Re-send a delivery that failed, or one that succeeded but was lost downstream.
The payload and its
event_id are unchanged, so a handler that dedupes on the event id can safely receive a replay. Replaying costs no credits — you never need to re-run a job to recover a missed event.
Retrying resets the attempt counter, so the delivery gets the full 30s / 120s / 480s ladder again.
Path parameters
string
required
Delivery UUID from List Deliveries.
Response (200 OK)
The delivery, nowpending with attempts reset to 0. Same shape as List Deliveries.
Errors
error
No such delivery, or it belongs to another API key.
error
Already queued for another automatic attempt. Wait for it to resolve —
next_retry_at tells you when.error
The endpoint has been deleted or deactivated, so a replay would fail for the same reason. Register a new endpoint first.
Recovering after an outage
import httpx
HEADERS = {"X-API-Key": "fd_live_your_key_here"}
BASE = "https://api.fastdrop.io/api/v1"
# Everything we could not deliver while you were down
failed = httpx.get(
f"{BASE}/webhooks/deliveries",
params={"status": "failed", "limit": 100},
headers=HEADERS,
).json()["deliveries"]
for d in failed:
resp = httpx.post(f"{BASE}/webhooks/deliveries/{d['id']}/retry", headers=HEADERS)
print(f"{d['event']} for job {d['job_id']}: {resp.status_code}")
curl -X POST \
https://api.fastdrop.io/api/v1/webhooks/deliveries/8c7d6e5f-4a3b-2c1d-0e9f-8a7b6c5d4e3f/retry \
-H "X-API-Key: fd_live_your_key_here"
Deploy the fix before replaying in bulk. A replay against a still-broken endpoint burns the retry ladder again and lands back in
failed.{
"id": "8c7d6e5f-4a3b-2c1d-0e9f-8a7b6c5d4e3f",
"event": "job.completed",
"event_id": "evt_9f2c4a7b1e8d40a3b6c5d2e1f0a9b8c7",
"status": "pending",
"webhook_id": "3f9a1c22-8e4b-4d7a-9c11-77d2f0b5a8e3",
"target_url": "https://your-server.com/webhooks/fastdrop",
"job_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"attempts": 0,
"max_attempts": 3,
"response_status": null,
"response_body": null,
"error": null,
"created_at": "2026-08-15T12:01:15Z",
"last_attempt_at": "2026-08-15T12:11:45Z",
"next_retry_at": null,
"delivered_at": null
}