Sends one failed delivery again. It goes back in line with the whole retry schedule ahead
of it, first attempt now, and the answer is the delivery as it now stands: pending, no
attempts yet. Same id, same payload: your endpoint deduplicates it like any retry.
Only a failed delivery: a pending one is already on its way, a delivered one arrived —
both answer 409 delivery_not_failed. A delivery whose endpoint is paused or disabled
answers 409 endpoint_disabled: resume the endpoint first (PATCH /webhook_endpoints/{id}
with state: active).
Needs the webhooks.write scope. A key limited to vaults is refused with
403 vault_limited.
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.
pending while attempts remain; delivered once the endpoint answered 2xx; failed
when every attempt failed, or the endpoint was disabled with the delivery in flight.
When Citadel recorded the event for this endpoint. from and to filter on it.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Citadel API","colors":{"primary":"#1F5BD8","light":"#5B8BEF","dark":"#163F99"},"api":{"playground":{"display":"interactive"},"examples":{"languages":["curl","javascript","python","go"]}},"integrations":{"telemetry":{"enabled":false}},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"hasAudioNarration":false,"customDomains":[],"gitSource":{"type":"github","owner":"local","repo":"local","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":"local","isBase":true},"buildId":"local","clientVersion":"0.0.4088"},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false,"isLoggedInCli":false,"mintExport":{}},"customCss":[],"page":{"pagePath":"api-reference/webhook-deliveries/retry-a-failed-delivery","slug":"/api-reference/webhook-deliveries/retry-a-failed-delivery","pageMetadata":{"openapi":"/openapi.yaml post /webhook_deliveries/{id}/retry","description":"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead\nof it, first attempt now, and the answer is the delivery as it now stands: `pending`, no\nattempts yet. Same `id`, same payload: your endpoint deduplicates it like any retry.\n\nOnly a `failed` delivery: a pending one is already on its way, a delivered one arrived —\nboth answer `409 delivery_not_failed`. A delivery whose endpoint is paused or disabled\nanswers `409 endpoint_disabled`: resume the endpoint first (`PATCH /webhook_endpoints/{id}`\nwith `state: active`).\n\nNeeds the `webhooks.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","href":"/api-reference/webhook-deliveries/retry-a-failed-delivery","title":"Retry a failed delivery"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead\\nof it, first attempt now, and the answer is the delivery as it now stands: \", _jsx(_components.code, {\n children: \"pending\"\n }), \", no\\nattempts yet. Same \", _jsx(_components.code, {\n children: \"id\"\n }), \", same payload: your endpoint deduplicates it like any retry.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Only a \", _jsx(_components.code, {\n children: \"failed\"\n }), \" delivery: a pending one is already on its way, a delivered one arrived —\\nboth answer \", _jsx(_components.code, {\n children: \"409 delivery_not_failed\"\n }), \". A delivery whose endpoint is paused or disabled\\nanswers \", _jsx(_components.code, {\n children: \"409 endpoint_disabled\"\n }), \": resume the endpoint first (\", _jsx(_components.code, {\n children: \"PATCH /webhook_endpoints/{id}\"\n }), \"\\nwith \", _jsx(_components.code, {\n children: \"state: active\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Needs the \", _jsx(_components.code, {\n children: \"webhooks.write\"\n }), \" scope. A key limited to vaults is refused with\\n\", _jsx(_components.code, {\n children: \"403 vault_limited\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"openapi":"/openapi.yaml post /webhook_deliveries/{id}/retry","description":"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead\nof it, first attempt now, and the answer is the delivery as it now stands: `pending`, no\nattempts yet. Same `id`, same payload: your endpoint deduplicates it like any retry.\n\nOnly a `failed` delivery: a pending one is already on its way, a delivered one arrived —\nboth answer `409 delivery_not_failed`. A delivery whose endpoint is paused or disabled\nanswers `409 endpoint_disabled`: resume the endpoint first (`PATCH /webhook_endpoints/{id}`\nwith `state: active`).\n\nNeeds the `webhooks.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","href":"/api-reference/webhook-deliveries/retry-a-failed-delivery","title":"Retry a failed delivery"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Webhook deliveries"],"operationId":"retryWebhookDelivery","summary":"Retry a failed delivery","description":"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead\nof it, first attempt now, and the answer is the delivery as it now stands: `pending`, no\nattempts yet. Same `id`, same payload: your endpoint deduplicates it like any retry.\n\nOnly a `failed` delivery: a pending one is already on its way, a delivered one arrived —\nboth answer `409 delivery_not_failed`. A delivery whose endpoint is paused or disabled\nanswers `409 endpoint_disabled`: resume the endpoint first (`PATCH /webhook_endpoints/{id}`\nwith `state: active`).\n\nNeeds the `webhooks.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","parameters":["e07e195e-1513-4ec9-b2d1-0188f3acbf0f"],"responses":{"202":"76fa0583-c394-44ae-928a-e772e82b34e0","401":"1265f179-a6b2-4987-99f3-2d9476733f55","403":"79d47744-973e-495d-9b3a-604a687e9259","404":"6b61fa76-41f7-49dc-913a-10e64f3f7750","409":"bf99bf1d-44db-4adc-9b84-662add348af6"},"method":"post","type":"path","servers":["825d9789-7332-4a65-b039-b330384d4003"],"security":["24aebd70-fdbd-4dae-a4a9-d627e2d2711f"],"path":"/webhook_deliveries/{id}/retry","baseUrlOptions":["https://api.citadel.example/api/v1"],"title":"Retry a failed delivery","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"e07e195e-1513-4ec9-b2d1-0188f3acbf0f":{"name":"id","in":"path","required":true,"description":"The delivery id — `id` in the webhook body and in `X-Citadel-Delivery`.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"The delivery id — `id` in the webhook body and in `X-Citadel-Delivery`.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"responses":{"76fa0583-c394-44ae-928a-e772e82b34e0":{"description":"Back in line; the first attempt is queued.","content":{"application/json":{"schema":{"type":"object","required":["id","type","resource","data","endpoint","status","attempts","next_attempt_at","delivered_at","last_response_code","last_error","created_at"],"properties":{"id":{"type":"string","format":"uuid","description":"The delivery id — `id` in the webhook body and `X-Citadel-Delivery`. Stable across retries.","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"type":{"type":"string","description":"The event type.","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"resource":{"type":"object","description":"What the event is about, as in the webhook body.","properties":{"type":{"type":"string","uniqueKey":"resource.type","typeLabel":"string"},"id":{"type":"string","format":"uuid","uniqueKey":"resource.id","typeLabel":"string\u003cuuid>"}},"isRequired":true,"uniqueKey":"resource","typeLabel":"object"},"data":{"type":"object","description":"The event's `data`, as the endpoint receives it.","isRequired":true,"uniqueKey":"data","typeLabel":"object"},"endpoint":{"type":"object","required":["id","url"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"endpoint.id","typeLabel":"string\u003cuuid>"},"url":{"type":"string","isRequired":true,"uniqueKey":"endpoint.url","typeLabel":"string"}},"isRequired":true,"uniqueKey":"endpoint","typeLabel":"object"},"status":{"type":"string","enum":["pending","delivered","failed"],"description":"`pending` while attempts remain; `delivered` once the endpoint answered `2xx`; `failed`\nwhen every attempt failed, or the endpoint was disabled with the delivery in flight.\n","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"attempts":{"type":"integer","description":"Attempts made since the delivery was recorded, or since its last retry.","isRequired":true,"uniqueKey":"attempts","typeLabel":"integer"},"next_attempt_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the next attempt goes out; `null` unless `pending`.","isRequired":true,"uniqueKey":"next_attempt_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the next attempt goes out; `null` unless `pending`.","isRequired":true,"uniqueKey":"next_attempt_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"next_attempt_at","typeLabel":"string\u003cdate-time> | null"},"delivered_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"delivered_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"delivered_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"delivered_at","typeLabel":"string\u003cdate-time> | null"},"last_response_code":{"oneOf":[{"type":"integer","description":"The endpoint's HTTP status on the last attempt; `null` when it did not answer or nothing was tried yet.","isRequired":true,"uniqueKey":"last_response_code.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The endpoint's HTTP status on the last attempt; `null` when it did not answer or nothing was tried yet.","isRequired":true,"uniqueKey":"last_response_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"last_response_code","typeLabel":"integer | null"},"last_error":{"oneOf":[{"type":"string","description":"Why the last attempt failed. Human-readable; not stable.","isRequired":true,"uniqueKey":"last_error.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the last attempt failed. Human-readable; not stable.","isRequired":true,"uniqueKey":"last_error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"last_error","typeLabel":"string | null"},"created_at":{"type":"string","format":"date-time","description":"When Citadel recorded the event for this endpoint. `from` and `to` filter on it.","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"example":{"id":"0199a3c5-0000-7000-8000-000000000001","type":"operation.confirmed","resource":{"type":"operation","id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e"},"data":{"operation_id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e","kind":"transfer","status":"confirmed","chain_ref":"9f1c2e…"},"endpoint":{"id":"0199a2f0-1b00-7a11-8c22-3d4e5f6a7b8c","url":"https://merchant.example/hooks/citadel"},"status":"pending","attempts":0,"next_attempt_at":"2026-10-09T08:00:00Z","delivered_at":null,"last_response_code":null,"last_error":null,"created_at":"2026-10-08T12:30:00Z"},"examples":{"Example":{"title":"Example","value":{"id":"0199a3c5-0000-7000-8000-000000000001","type":"operation.confirmed","resource":{"type":"operation","id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e"},"data":{"operation_id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e","kind":"transfer","status":"confirmed","chain_ref":"9f1c2e…"},"endpoint":{"id":"0199a2f0-1b00-7a11-8c22-3d4e5f6a7b8c","url":"https://merchant.example/hooks/citadel"},"status":"pending","attempts":0,"next_attempt_at":"2026-10-09T08:00:00Z","delivered_at":null,"last_response_code":null,"last_error":null,"created_at":"2026-10-08T12:30:00Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"1265f179-a6b2-4987-99f3-2d9476733f55":{"description":"Missing, unknown, revoked or expired API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable; not stable.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code, where one exists.","uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"unauthorized"},"examples":{"Example":{"title":"Example","value":{"error":"unauthorized"}}},"exampleType":"examples"}},"exampleType":"examples"},"79d47744-973e-495d-9b3a-604a687e9259":{"description":"The key may not make this call. Nothing was created or reserved. `code`:\n`ip_not_allowed` — the call came from an address outside the key's IP allowlist;\n`scope_missing` — the key lacks the scope the endpoint needs;\n`vault_limited` — the key is limited to vaults and the wallet is outside them, or the\nendpoint drives or lists workflows, manages webhook endpoints, reads webhook deliveries,\nreads or changes the policy document, or asks for or reads a report.\n","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable; not stable.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code, where one exists.","uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"ip_not_allowed":{"title":"ip_not_allowed","value":{"error":"request from 198.51.100.1 is not allowed for this key","code":"ip_not_allowed"}},"scope_missing":{"title":"scope_missing","value":{"error":"this key lacks the transactions.write scope","code":"scope_missing"}},"vault_limited":{"title":"vault_limited","value":{"error":"wallet is outside this key's vaults","code":"vault_limited"}}},"exampleType":"examples"}},"exampleType":"examples"},"6b61fa76-41f7-49dc-913a-10e64f3f7750":{"description":"No such delivery in your organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable; not stable.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code, where one exists.","uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"webhook delivery not found"},"examples":{"Example":{"title":"Example","value":{"error":"webhook delivery not found"}}},"exampleType":"examples"}},"exampleType":"examples"},"bf99bf1d-44db-4adc-9b84-662add348af6":{"description":"The delivery cannot be sent again. Nothing changed. `code`:\n`delivery_not_failed` — it is pending (already on its way) or delivered;\n`endpoint_disabled` — its endpoint is paused or disabled; resume it, then retry.\n","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable; not stable.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code, where one exists.","uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"delivery_not_failed":{"title":"delivery_not_failed","value":{"error":"the delivery is delivered; only a failed one is sent again","code":"delivery_not_failed"}},"endpoint_disabled":{"title":"endpoint_disabled","value":{"error":"the delivery's endpoint is disabled; resume it, then retry","code":"endpoint_disabled"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"24aebd70-fdbd-4dae-a4a9-d627e2d2711f":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key minted in the console (`ctd_…`). Authenticates; never authorizes funds. A key\ncarries scopes (`read`, `wallets.write`, `transactions.write`, `events.write`,\n`webhooks.write`, `policy.write`) and may be limited to vaults, to IP addresses, and in\nlifetime — see Authentication.\n","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"825d9789-7332-4a65-b039-b330384d4003":{"url":"https://api.citadel.example/api/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An API key minted in the console (`ctd_…`). Authenticates; never authorizes funds. A key\ncarries scopes (`read`, `wallets.write`, `transactions.write`, `events.write`,\n`webhooks.write`, `policy.write`) and may be limited to vaults, to IP addresses, and in\nlifetime — see Authentication.\n","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An API key minted in the console (`ctd_…`). Authenticates; never authorizes funds. A key\ncarries scopes (`read`, `wallets.write`, `transactions.write`, `events.write`,\n`webhooks.write`, `policy.write`) and may be limited to vaults, to IP addresses, and in\nlifetime — see Authentication.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"localhost","siteName":"Citadel API","title":"Retry a failed delivery - Citadel API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"api-reference/webhook-deliveries/retry-a-failed-delivery.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead of it, first attempt now, and the answer is the delivery as it now stands: pending, no attempts yet. Same id, same payload: your endpoint deduplicates it like any retry. Only a failed delivery: a pending one is already on its way, a delivered one arrived — both answer 409 delivery_not_failed. A delivery whose endpoint is paused or disabled answers 409 endpoint_disabled: resume the endpoint first (PATCH /webhook_endpoints/{id} with state: active). Needs the webhooks.write scope. A key limited to vaults is refused with 403 vault_limited.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Citadel API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/local/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/local/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/local/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/local/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Retry a failed delivery - Citadel API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead of it, first attempt now, and the answer is the delivery as it now stands: pending, no attempts yet. Same id, same payload: your endpoint deduplicates it like any retry. Only a failed delivery: a pending one is already on its way, a delivered one arrived — both answer 409 delivery_not_failed. A delivery whose endpoint is paused or disabled answers 409 endpoint_disabled: resume the endpoint first (PATCH /webhook_endpoints/{id} with state: active). Needs the webhooks.write scope. A key limited to vaults is refused with 403 vault_limited.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Citadel API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://local./api-reference/webhook-deliveries/retry-a-failed-delivery\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Retry a failed delivery - Citadel API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Sends one failed delivery again. It goes back in line with the whole retry schedule ahead of it, first attempt now, and the answer is the delivery as it now stands: pending, no attempts yet. Same id, same payload: your endpoint deduplicates it like any retry. Only a failed delivery: a pending one is already on its way, a delivered one arrived — both answer 409 delivery_not_failed. A delivery whose endpoint is paused or disabled answers 409 endpoint_disabled: resume the endpoint first (PATCH /webhook_endpoints/{id} with state: active). Needs the webhooks.write scope. A key limited to vaults is refused with 403 vault_limited.\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/local/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Citadel API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1F5BD8\">\u003clink data-mint-head rel=\"canonical\" href=\"https://local./api-reference/webhook-deliveries/retry-a-failed-delivery\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/webhook-deliveries/retry-a-failed-delivery.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Citadel API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Citadel API","nav":{"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API reference","groups":[{"group":"Wallets","pages":[{"title":"List wallets","openapi":"/openapi.yaml get /wallets","href":"/api-reference/wallets/list-wallets"},{"title":"Issue a deposit wallet","openapi":"/openapi.yaml post /wallets","href":"/api-reference/wallets/issue-a-deposit-wallet"},{"title":"Issue wallets in a batch","openapi":"/openapi.yaml post /wallets/batch","href":"/api-reference/wallets/issue-wallets-in-a-batch"},{"title":"Get a wallet","openapi":"/openapi.yaml get /wallets/{reference}","href":"/api-reference/wallets/get-a-wallet"},{"title":"Update a wallet","openapi":"/openapi.yaml patch /wallets/{reference}","href":"/api-reference/wallets/update-a-wallet"},{"title":"Retire a wallet","openapi":"/openapi.yaml post /wallets/{reference}/retire","href":"/api-reference/wallets/retire-a-wallet"},{"title":"Get a wallet balance","openapi":"/openapi.yaml get /wallets/{reference}/balance","href":"/api-reference/wallets/get-a-wallet-balance"},{"title":"Get a wallet's limits","openapi":"/openapi.yaml get /wallets/{reference}/limits","href":"/api-reference/wallets/get-a-wallets-limits"}]},{"group":"Transactions","pages":[{"title":"List transactions","openapi":"/openapi.yaml get /transactions","href":"/api-reference/transactions/list-transactions"},{"title":"Send a transaction","openapi":"/openapi.yaml post /transactions","href":"/api-reference/transactions/send-a-transaction"},{"title":"Estimate a transaction","openapi":"/openapi.yaml post /transactions/estimate","href":"/api-reference/transactions/estimate-a-transaction"},{"title":"Get a transaction","openapi":"/openapi.yaml get /transactions/{id}","href":"/api-reference/transactions/get-a-transaction"},{"title":"Cancel a transaction","openapi":"/openapi.yaml post /transactions/{id}/cancel","href":"/api-reference/transactions/cancel-a-transaction"},{"title":"Speed up a stuck EVM transaction","openapi":"/openapi.yaml post /transactions/{id}/speedup","href":"/api-reference/transactions/speed-up-a-stuck-evm-transaction"},{"title":"Validate an address","openapi":"/openapi.yaml get /addresses/validate","href":"/api-reference/transactions/validate-an-address"}]},{"group":"Transfers","pages":[{"title":"List transfers","openapi":"/openapi.yaml get /transfers","href":"/api-reference/transfers/list-transfers"},{"title":"Get a transfer","openapi":"/openapi.yaml get /transfers/{tx_hash}","href":"/api-reference/transfers/get-a-transfer"}]},{"group":"Reference","pages":[{"title":"List networks and chains","openapi":"/openapi.yaml get /networks","href":"/api-reference/reference/list-networks-and-chains"},{"title":"List assets","openapi":"/openapi.yaml get /assets","href":"/api-reference/reference/list-assets"},{"title":"List asset prices","openapi":"/openapi.yaml get /prices","href":"/api-reference/reference/list-asset-prices"},{"title":"Get network status","openapi":"/openapi.yaml get /status","href":"/api-reference/reference/get-network-status"}]},{"group":"Organization","pages":[{"title":"List vaults","openapi":"/openapi.yaml get /vaults","href":"/api-reference/organization/list-vaults"},{"title":"Get organization balances","openapi":"/openapi.yaml get /balances","href":"/api-reference/organization/get-organization-balances"},{"title":"Get the calling key","openapi":"/openapi.yaml get /me","href":"/api-reference/organization/get-the-calling-key"},{"title":"Get the billing balance","openapi":"/openapi.yaml get /billing/balance","href":"/api-reference/organization/get-the-billing-balance"}]},{"group":"Approvals","pages":[{"title":"List approvals","openapi":"/openapi.yaml get /approvals","href":"/api-reference/approvals/list-approvals"}]},{"group":"Policy","pages":[{"title":"Get the policy document","openapi":"/openapi.yaml get /policy","href":"/api-reference/policy/get-the-policy-document"},{"title":"Draft the policy document","openapi":"/openapi.yaml post /policy/drafts","href":"/api-reference/policy/draft-the-policy-document"},{"title":"Get a policy draft","openapi":"/openapi.yaml get /policy/drafts/{version}","href":"/api-reference/policy/get-a-policy-draft"},{"title":"Publish a signed policy draft","openapi":"/openapi.yaml post /policy/publish","href":"/api-reference/policy/publish-a-signed-policy-draft"}]},{"group":"Workflows","pages":[{"title":"Start workflows by event","openapi":"/openapi.yaml post /events/{name}","href":"/api-reference/workflows/start-workflows-by-event"},{"title":"List workflow runs","openapi":"/openapi.yaml get /runs","href":"/api-reference/workflows/list-workflow-runs"},{"title":"Get a workflow run","openapi":"/openapi.yaml get /runs/{id}","href":"/api-reference/workflows/get-a-workflow-run"},{"title":"Cancel a workflow run","openapi":"/openapi.yaml post /runs/{id}/cancel","href":"/api-reference/workflows/cancel-a-workflow-run"},{"title":"List workflows","openapi":"/openapi.yaml get /workflows","href":"/api-reference/workflows/list-workflows"}]},{"group":"Webhook endpoints","pages":[{"title":"List webhook endpoints","openapi":"/openapi.yaml get /webhook_endpoints","href":"/api-reference/webhook-endpoints/list-webhook-endpoints"},{"title":"Add a webhook endpoint","openapi":"/openapi.yaml post /webhook_endpoints","href":"/api-reference/webhook-endpoints/add-a-webhook-endpoint"},{"title":"Get a webhook endpoint","openapi":"/openapi.yaml get /webhook_endpoints/{id}","href":"/api-reference/webhook-endpoints/get-a-webhook-endpoint"},{"title":"Remove a webhook endpoint","openapi":"/openapi.yaml delete /webhook_endpoints/{id}","href":"/api-reference/webhook-endpoints/remove-a-webhook-endpoint"},{"title":"Change a webhook endpoint","openapi":"/openapi.yaml patch /webhook_endpoints/{id}","href":"/api-reference/webhook-endpoints/change-a-webhook-endpoint"},{"title":"Send a test delivery","openapi":"/openapi.yaml post /webhook_endpoints/{id}/test","href":"/api-reference/webhook-endpoints/send-a-test-delivery"},{"title":"Rotate the signing secret","openapi":"/openapi.yaml post /webhook_endpoints/{id}/rotate_secret","href":"/api-reference/webhook-endpoints/rotate-the-signing-secret"}]},{"group":"Webhook deliveries","pages":[{"title":"List webhook deliveries","description":"What Citadel posted, or still tries to post, to your webhook endpoints, newest first: one\nrow per event and endpoint, with its attempts and the endpoint's last answer. `id`, `type`,\n`resource` and `data` are the body the endpoint receives, without the per-attempt\n`timestamp`, so a row you missed can go through your webhook handler, deduplicated on `id`.\n\nTakes no `network`: an endpoint hears every network. A paused or disabled endpoint gets no\ndeliveries: an event that happened meanwhile has no row here — read it from\n`GET /transfers` or `GET /transactions`.\n\nPaged with a cursor — see Lists and pagination. Needs the `read` scope. A key limited to\nvaults is refused with `403 vault_limited`: an endpoint serves every vault.\n","openapi":"/openapi.yaml get /webhook_deliveries","href":"/api-reference/webhook-deliveries/list-webhook-deliveries"},{"title":"Retry a failed delivery","openapi":"/openapi.yaml post /webhook_deliveries/{id}/retry","href":"/api-reference/webhook-deliveries/retry-a-failed-delivery"},{"title":"Retry the failed deliveries of a period","description":"Sends every failed delivery recorded in a period again — how you catch up once your\nendpoint is back. Each goes back in line as with a single retry, keeping its `id`.\n\nOldest first, at most 500 per call: while `more` is `true`, send the same call again.\nCalling again is safe, because what one call sent is pending by the next, not failed. A\nfailed delivery whose endpoint is paused or disabled stays failed and counts in `skipped`:\nresume the endpoint (`PATCH /webhook_endpoints/{id}` with `state: active`), then call again.\n\nTakes the list's filters except `status`. Needs the `webhooks.write` scope. A key limited\nto vaults is refused with `403 vault_limited`.\n","openapi":"/openapi.yaml post /webhook_deliveries/retry","href":"/api-reference/webhook-deliveries/retry-the-failed-deliveries-of-a-period"}]},{"group":"Reports","pages":[{"title":"Ask for a report","openapi":"/openapi.yaml post /reports","href":"/api-reference/reports/ask-for-a-report"},{"title":"Get a report","openapi":"/openapi.yaml get /reports/{id}","href":"/api-reference/reports/get-a-report"},{"title":"Download a report's file","openapi":"/openapi.yaml get /reports/{id}/file","href":"/api-reference/reports/download-a-reports-file"}]},{"group":"API Reference","pages":[{"title":"Operation*","openapi":"/openapi.yaml webhook operation","href":"/api-reference/operation*"},{"title":"Blockchain event*","openapi":"/openapi.yaml webhook blockchain_event","href":"/api-reference/blockchain_event*"},{"title":"Run*","openapi":"/openapi.yaml webhook run","href":"/api-reference/run*"},{"title":"Wallet*","openapi":"/openapi.yaml webhook wallet","href":"/api-reference/wallet*"}]}]}]},"basePath":"","title":"Retry a failed delivery - Citadel API","buildId":"3c5c97139bf8","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DGp7Pxzx.js","utils-8Jv-1L07.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CLSsw4wM.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-RrVIaDh7.js","snippetPresets-DSI4wgEf.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-W2e9g_oX.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CDpwfEDw.js","shallow-Dq5-SwG1.js","getApiPlaygroundDisplay-basMZYRO.js","CodeSnippet-CWKJfCQt.js","CodeSnippets-xDLW1FEv.js","Page-Dc5qkJG8.js","getPastedJson-DObxGgIR.js","icon-HMNWawTa.js","MethodPill-DA_6XsWN.js","DuplicateIcon-DK5o2DOi.js","createIcon-BhUMOhLi.js","DynamicMarkdown-Dokq7GGW.js","SectionHeading-DSaxk-9e.js","axios-vUo_bRtp.js","Markdown-BDO6y5hF.js","clsx-DfU2JnNK.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BRVLaqXg.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CxOoiG7S.js"]}