Posts a test.ping to the endpoint now: a real delivery, signed and retried like any other,
with an empty data. The answer is that delivery; follow it in GET /webhook_deliveries
(?endpoint=<id>&type=test.ping).
An endpoint that is not active (paused, or disabled by Citadel) answers
409 endpoint_disabled: resume it first. 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-endpoints/send-a-test-delivery","slug":"/api-reference/webhook-endpoints/send-a-test-delivery","pageMetadata":{"openapi":"/openapi.yaml post /webhook_endpoints/{id}/test","description":"Posts a `test.ping` to the endpoint now: a real delivery, signed and retried like any other,\nwith an empty `data`. The answer is that delivery; follow it in `GET /webhook_deliveries`\n(`?endpoint=\u003cid>\u0026type=test.ping`).\n\nAn endpoint that is not active (paused, or disabled by Citadel) answers\n`409 endpoint_disabled`: resume it first. Needs the `webhooks.write` scope. A key limited\nto vaults is refused with `403 vault_limited`.\n","href":"/api-reference/webhook-endpoints/send-a-test-delivery","title":"Send a test 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: [\"Posts a \", _jsx(_components.code, {\n children: \"test.ping\"\n }), \" to the endpoint now: a real delivery, signed and retried like any other,\\nwith an empty \", _jsx(_components.code, {\n children: \"data\"\n }), \". The answer is that delivery; follow it in \", _jsx(_components.code, {\n children: \"GET /webhook_deliveries\"\n }), \"\\n(\", _jsx(_components.code, {\n children: \"?endpoint=\u003cid>\u0026type=test.ping\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"An endpoint that is not active (paused, or disabled by Citadel) answers\\n\", _jsx(_components.code, {\n children: \"409 endpoint_disabled\"\n }), \": resume it first. Needs the \", _jsx(_components.code, {\n children: \"webhooks.write\"\n }), \" scope. A key limited\\nto vaults is refused with \", _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_endpoints/{id}/test","description":"Posts a `test.ping` to the endpoint now: a real delivery, signed and retried like any other,\nwith an empty `data`. The answer is that delivery; follow it in `GET /webhook_deliveries`\n(`?endpoint=\u003cid>\u0026type=test.ping`).\n\nAn endpoint that is not active (paused, or disabled by Citadel) answers\n`409 endpoint_disabled`: resume it first. Needs the `webhooks.write` scope. A key limited\nto vaults is refused with `403 vault_limited`.\n","href":"/api-reference/webhook-endpoints/send-a-test-delivery","title":"Send a test delivery"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Webhook endpoints"],"operationId":"testWebhookEndpoint","summary":"Send a test delivery","description":"Posts a `test.ping` to the endpoint now: a real delivery, signed and retried like any other,\nwith an empty `data`. The answer is that delivery; follow it in `GET /webhook_deliveries`\n(`?endpoint=\u003cid>\u0026type=test.ping`).\n\nAn endpoint that is not active (paused, or disabled by Citadel) answers\n`409 endpoint_disabled`: resume it first. Needs the `webhooks.write` scope. A key limited\nto vaults is refused with `403 vault_limited`.\n","parameters":["f045afc1-7bd8-4104-b447-37e8d62d5ee4"],"responses":{"202":"80781afc-0d5f-4c05-bc91-f1ff1aecb836","401":"52672796-ec6b-4d7b-b0f8-01c4d65ff776","403":"f2725811-a657-436e-80a2-93151387787b","404":"23cf46cc-e791-40be-b99a-0c0b0870ef1f","409":"db0a347f-688d-4020-9b73-98e5f562051f"},"method":"post","type":"path","servers":["825d9789-7332-4a65-b039-b330384d4003"],"security":["24aebd70-fdbd-4dae-a4a9-d627e2d2711f"],"path":"/webhook_endpoints/{id}/test","baseUrlOptions":["https://api.citadel.example/api/v1"],"title":"Send a test delivery","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"f045afc1-7bd8-4104-b447-37e8d62d5ee4":{"name":"id","in":"path","required":true,"description":"The endpoint id — `id` in its row, `endpoint.id` in a delivery.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"The endpoint id — `id` in its row, `endpoint.id` in a delivery.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"responses":{"80781afc-0d5f-4c05-bc91-f1ff1aecb836":{"description":"The test delivery, 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":"0199a3d0-0000-7000-8000-000000000002","type":"test.ping","resource":{"type":"webhook_endpoint","id":"0199a2f0-1b00-7a11-8c22-3d4e5f6a7b8c"},"data":{},"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-09T08:00:00Z"},"examples":{"Example":{"title":"Example","value":{"id":"0199a3d0-0000-7000-8000-000000000002","type":"test.ping","resource":{"type":"webhook_endpoint","id":"0199a2f0-1b00-7a11-8c22-3d4e5f6a7b8c"},"data":{},"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-09T08:00:00Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"52672796-ec6b-4d7b-b0f8-01c4d65ff776":{"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"},"f2725811-a657-436e-80a2-93151387787b":{"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"},"23cf46cc-e791-40be-b99a-0c0b0870ef1f":{"description":"No such endpoint 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 endpoint not found"},"examples":{"Example":{"title":"Example","value":{"error":"webhook endpoint not found"}}},"exampleType":"examples"}},"exampleType":"examples"},"db0a347f-688d-4020-9b73-98e5f562051f":{"description":"The endpoint is paused or disabled. Nothing was sent.","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":"the endpoint is not active; resume it, then test","code":"endpoint_disabled"},"examples":{"Example":{"title":"Example","value":{"error":"the endpoint is not active; resume it, then test","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":"Send a test delivery - Citadel API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"api-reference/webhook-endpoints/send-a-test-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=\"Posts a test.ping to the endpoint now: a real delivery, signed and retried like any other, with an empty data. The answer is that delivery; follow it in GET /webhook_deliveries (?endpoint=\u0026amp;type=test.ping). An endpoint that is not active (paused, or disabled by Citadel) answers 409 endpoint_disabled: resume it first. 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=\"Send a test delivery - Citadel API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Posts a test.ping to the endpoint now: a real delivery, signed and retried like any other, with an empty data. The answer is that delivery; follow it in GET /webhook_deliveries (?endpoint=\u0026amp;type=test.ping). An endpoint that is not active (paused, or disabled by Citadel) answers 409 endpoint_disabled: resume it first. 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-endpoints/send-a-test-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=\"Send a test delivery - Citadel API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Posts a test.ping to the endpoint now: a real delivery, signed and retried like any other, with an empty data. The answer is that delivery; follow it in GET /webhook_deliveries (?endpoint=\u0026amp;type=test.ping). An endpoint that is not active (paused, or disabled by Citadel) answers 409 endpoint_disabled: resume it first. 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-endpoints/send-a-test-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-endpoints/send-a-test-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","description":"Changes what the body names, nothing else: `url`, `description`, `event_types`, `state`.\nAll of it or nothing — a change that is refused leaves the endpoint as it was.\n\n`state: paused` stops deliveries until you resume. `state: active` resumes an endpoint you\npaused, and one Citadel disabled after 5 deliveries in a row exhausted their attempts; it\nclears that count. Failed deliveries stay failed: send them again with\n`POST /webhook_deliveries/retry`.\n\nA `url` another endpoint of yours has answers `409 endpoint_exists`; one that is not an\n`https://` URL with a host answers `422`. A field the endpoint does not take (`secret`,\n`network`, …), a field sent in the query string instead of the body, or an empty body,\nanswers `422`. Needs the `webhooks.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","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","description":"Generates a new signing secret and shows it in this answer only. The secret it replaces\nkeeps signing next to it for `overlap_seconds`: until `previous_secret_expires_at`, every\ndelivery carries two `v1` signatures in `X-Citadel-Signature`, the new secret's first.\nDeploy the new secret to your verifier within that time and no delivery is rejected on the\nway.\n\nOnly two secrets sign at once. Rotating again during an overlap retires the older one at\nonce; the secret being replaced becomes the previous one. `overlap_seconds: 0` retires the\nold secret now — deliveries already on their way may then fail your check once and are\nretried with the new one.\n\nNot idempotent: every call makes a new secret. A retry after a lost answer replaces the\nsecret of that answer, so the one your verifier holds stops signing at once: deploy the\nsecret from the last answer you got. `overlap_seconds` goes in the body; in the query\nstring it answers `422`.\n\nNeeds the `webhooks.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","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","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","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":"Send a test 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"]}