curl --request POST \
--url https://api.citadel.example/api/v1/webhook_deliveries/retry \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": "2026-10-08T00:00:00Z",
"to": "2026-10-09T00:00:00Z"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({from: '2026-10-08T00:00:00Z', to: '2026-10-09T00:00:00Z'})
};
fetch('https://api.citadel.example/api/v1/webhook_deliveries/retry', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.citadel.example/api/v1/webhook_deliveries/retry"
payload = {
"from": "2026-10-08T00:00:00Z",
"to": "2026-10-09T00:00:00Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.citadel.example/api/v1/webhook_deliveries/retry"
payload := strings.NewReader("{\n \"from\": \"2026-10-08T00:00:00Z\",\n \"to\": \"2026-10-09T00:00:00Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"retried": 500,
"more": true,
"skipped": 0
}Retry the failed deliveries of a period
Sends every failed delivery recorded in a period again — how you catch up once your
endpoint is back. Each goes back in line as with a single retry, keeping its id.
Oldest first, at most 500 per call: while more is true, send the same call again.
Calling again is safe, because what one call sent is pending by the next, not failed. A
failed delivery whose endpoint is paused or disabled stays failed and counts in skipped:
resume the endpoint (PATCH /webhook_endpoints/{id} with state: active), then call again.
Takes the list’s filters except status. Needs the webhooks.write scope. A key limited
to vaults is refused with 403 vault_limited.
curl --request POST \
--url https://api.citadel.example/api/v1/webhook_deliveries/retry \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": "2026-10-08T00:00:00Z",
"to": "2026-10-09T00:00:00Z"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({from: '2026-10-08T00:00:00Z', to: '2026-10-09T00:00:00Z'})
};
fetch('https://api.citadel.example/api/v1/webhook_deliveries/retry', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.citadel.example/api/v1/webhook_deliveries/retry"
payload = {
"from": "2026-10-08T00:00:00Z",
"to": "2026-10-09T00:00:00Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.citadel.example/api/v1/webhook_deliveries/retry"
payload := strings.NewReader("{\n \"from\": \"2026-10-08T00:00:00Z\",\n \"to\": \"2026-10-09T00:00:00Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"retried": 500,
"more": true,
"skipped": 0
}Authorizations
An API key minted in the console (ctd_…). Authenticates; never authorizes funds. A key
carries scopes (read, wallets.write, transactions.write, events.write,
webhooks.write, policy.write) and may be limited to vaults, to IP addresses, and in
lifetime — see Authentication.
Body
Required. Deliveries Citadel recorded at this time or later (created_at).
Only deliveries recorded before this time.
One event type, or several separated by commas in this one string. A list
(["run.failed"]) is refused with 422, never read as "every type".
Only the deliveries to this endpoint.
Response
What went back in line.