Drafts a new version of your policy document from your backend: the whitelist of each
chain (your address book), the assets your engine recognises, the ceilings and limits. See
Address book for the whole round.
The body is the whole document — what you leave out is not in it. An empty whitelist
lets your engine pay no external address; an asset without a ceiling cannot be sent.
Citadel stamps the next version and each chain’s module version and answers document:
the exact YAML bytes your policy key signs. Before you sign, parse document and check that
it says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and
hand the signature to POST /policy/publish.
There is one draft per organization: a new draft replaces the one waiting to be signed,
whether it was made here or in the console. Rules equal to the change already waiting for
approval answer that change (200, status: pending) and leave the draft as it was. Rules
equal to the version in force are refused with 422 nothing_changed.
A field the document does not have, an address its chain cannot parse, an amount that is
not an integer string, or a window that is not a duration is refused with 422 before the
draft is replaced. One document rules every network and every vault: it takes no
network. Needs the policy.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.
Body
application/json
The whole policy document, less what Citadel stamps (version, each chain's chain_module_version).
Limits per end_user_ref, each one listed by name — never matched by a pattern. {} for none. Payouts to your whitelist go without a request signature, so your engine counts them all under the reserved reference system:whitelisted, not under their end_user_ref: limit them there. With allow_unregistered_reference off, list it, or those payouts are refused.
Why a rejected change was never sent: an approver declined it, it was not approved in time, or a newer change replaced it or a newer version came into force first.
{"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/policy/draft-the-policy-document","slug":"/api-reference/policy/draft-the-policy-document","pageMetadata":{"openapi":"/openapi.yaml post /policy/drafts","description":"Drafts a new version of your policy document from your backend: the whitelist of each\nchain (your address book), the assets your engine recognises, the ceilings and limits. See\n[Address book](/address-book) for the whole round.\n\nThe body is the **whole** document — what you leave out is not in it. An empty whitelist\nlets your engine pay no external address; an asset without a ceiling cannot be sent.\nCitadel stamps the next `version` and each chain's module version and answers `document`:\nthe exact YAML bytes your policy key signs. Before you sign, parse `document` and check that\nit says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and\nhand the signature to `POST /policy/publish`.\n\nThere is one draft per organization: a new draft replaces the one waiting to be signed,\nwhether it was made here or in the console. Rules equal to the change already waiting for\napproval answer that change (`200`, `status: pending`) and leave the draft as it was. Rules\nequal to the version in force are refused with `422 nothing_changed`.\n\nA field the document does not have, an address its chain cannot parse, an amount that is\nnot an integer string, or a window that is not a duration is refused with `422` before the\ndraft is replaced. One document rules every network and every vault: it takes no\n`network`. Needs the `policy.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","href":"/api-reference/policy/draft-the-policy-document","title":"Draft the policy document"},"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 a: \"a\",\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Drafts a new version of your policy document from your backend: the whitelist of each\\nchain (your address book), the assets your engine recognises, the ceilings and limits. See\\n\", _jsx(_components.a, {\n href: \"/address-book\",\n children: \"Address book\"\n }), \" for the whole round.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The body is the \", _jsx(_components.strong, {\n children: \"whole\"\n }), \" document — what you leave out is not in it. An empty whitelist\\nlets your engine pay no external address; an asset without a ceiling cannot be sent.\\nCitadel stamps the next \", _jsx(_components.code, {\n children: \"version\"\n }), \" and each chain’s module version and answers \", _jsx(_components.code, {\n children: \"document\"\n }), \":\\nthe exact YAML bytes your policy key signs. Before you sign, parse \", _jsx(_components.code, {\n children: \"document\"\n }), \" and check that\\nit says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and\\nhand the signature to \", _jsx(_components.code, {\n children: \"POST /policy/publish\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"There is one draft per organization: a new draft replaces the one waiting to be signed,\\nwhether it was made here or in the console. Rules equal to the change already waiting for\\napproval answer that change (\", _jsx(_components.code, {\n children: \"200\"\n }), \", \", _jsx(_components.code, {\n children: \"status: pending\"\n }), \") and leave the draft as it was. Rules\\nequal to the version in force are refused with \", _jsx(_components.code, {\n children: \"422 nothing_changed\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A field the document does not have, an address its chain cannot parse, an amount that is\\nnot an integer string, or a window that is not a duration is refused with \", _jsx(_components.code, {\n children: \"422\"\n }), \" before the\\ndraft is replaced. One document rules every network and every vault: it takes no\\n\", _jsx(_components.code, {\n children: \"network\"\n }), \". Needs the \", _jsx(_components.code, {\n children: \"policy.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 /policy/drafts","description":"Drafts a new version of your policy document from your backend: the whitelist of each\nchain (your address book), the assets your engine recognises, the ceilings and limits. See\n[Address book](/address-book) for the whole round.\n\nThe body is the **whole** document — what you leave out is not in it. An empty whitelist\nlets your engine pay no external address; an asset without a ceiling cannot be sent.\nCitadel stamps the next `version` and each chain's module version and answers `document`:\nthe exact YAML bytes your policy key signs. Before you sign, parse `document` and check that\nit says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and\nhand the signature to `POST /policy/publish`.\n\nThere is one draft per organization: a new draft replaces the one waiting to be signed,\nwhether it was made here or in the console. Rules equal to the change already waiting for\napproval answer that change (`200`, `status: pending`) and leave the draft as it was. Rules\nequal to the version in force are refused with `422 nothing_changed`.\n\nA field the document does not have, an address its chain cannot parse, an amount that is\nnot an integer string, or a window that is not a duration is refused with `422` before the\ndraft is replaced. One document rules every network and every vault: it takes no\n`network`. Needs the `policy.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","href":"/api-reference/policy/draft-the-policy-document","title":"Draft the policy document"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Policy"],"operationId":"createPolicyDraft","summary":"Draft the policy document","description":"Drafts a new version of your policy document from your backend: the whitelist of each\nchain (your address book), the assets your engine recognises, the ceilings and limits. See\n[Address book](/address-book) for the whole round.\n\nThe body is the **whole** document — what you leave out is not in it. An empty whitelist\nlets your engine pay no external address; an asset without a ceiling cannot be sent.\nCitadel stamps the next `version` and each chain's module version and answers `document`:\nthe exact YAML bytes your policy key signs. Before you sign, parse `document` and check that\nit says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and\nhand the signature to `POST /policy/publish`.\n\nThere is one draft per organization: a new draft replaces the one waiting to be signed,\nwhether it was made here or in the console. Rules equal to the change already waiting for\napproval answer that change (`200`, `status: pending`) and leave the draft as it was. Rules\nequal to the version in force are refused with `422 nothing_changed`.\n\nA field the document does not have, an address its chain cannot parse, an amount that is\nnot an integer string, or a window that is not a duration is refused with `422` before the\ndraft is replaced. One document rules every network and every vault: it takes no\n`network`. Needs the `policy.write` scope. A key limited to vaults is refused with\n`403 vault_limited`.\n","requestBody":"4bc9e9c6-cb54-4fae-9fc9-cc51387226c9","responses":{"200":"5c0793a5-c11d-475e-b1ee-5ceefb5ea46f","201":"9cca851f-a7c5-48d5-954c-b124ec5e0598","401":"c3eb6919-3f45-4b1e-b49b-fd9214270cfd","403":"8516b28d-0fa9-44db-ab0a-0a017309de50","422":"f7ef1e71-0430-44bd-a5de-21e3e5c42835"},"method":"post","type":"path","servers":["825d9789-7332-4a65-b039-b330384d4003"],"security":["24aebd70-fdbd-4dae-a4a9-d627e2d2711f"],"path":"/policy/drafts","baseUrlOptions":["https://api.citadel.example/api/v1"],"title":"Draft the policy document","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"The whole policy document, less what Citadel stamps (`version`, each chain's `chain_module_version`).","additionalProperties":false,"required":["chains","ceiling","references"],"properties":{"chains":{"type":"object","minProperties":1,"description":"The address-bound rules of each chain you use, keyed by chain: `tron`, `evm`, `solana`, `ton`.","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"whitelist":{"type":"array","items":{"type":"string","uniqueKey":"chains.additionalProperties.whitelist.items.[INDEX]","typeLabel":"string"},"description":"The external addresses your engine may pay on this chain: your address book. Absent or empty — none. Your own wallets need no entry.","uniqueKey":"chains.additionalProperties.whitelist","typeLabel":"string[]"},"assets":{"type":"object","description":"The assets your engine recognises on this chain: a token contract, or `native` for the chain's coin, to the asset key its limits count under (`USDT/6`). By contract, never by symbol: anything unnamed cannot be sent.","additionalProperties":{"type":"string","uniqueKey":"chains.additionalProperties.assets.additionalProperties","typeLabel":"string"},"uniqueKey":"chains.additionalProperties.assets","typeLabel":"object"},"wallets":{"type":"object","description":"Limits per wallet of yours, keyed by its address.","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"limits":{"type":"object","description":"Per asset key, the most that may move within a rolling window.","additionalProperties":{"type":"object","additionalProperties":false,"required":["window","max"],"properties":{"window":{"type":"string","description":"A duration: `1h`, `24h`, `1h30m`.","isRequired":true,"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.limits.additionalProperties.window","typeLabel":"string"},"max":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.limits.additionalProperties.max","typeLabel":"string"}},"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.limits.additionalProperties","typeLabel":"object"},"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.limits","typeLabel":"object"},"velocity":{"type":"object","additionalProperties":false,"required":["window","max"],"description":"How many authorizations a rolling window allows.","properties":{"window":{"type":"string","description":"A duration: `1h`, `24h`, `1h30m`.","isRequired":true,"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.velocity.window","typeLabel":"string"},"max":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.velocity.max","typeLabel":"integer"}},"uniqueKey":"chains.additionalProperties.wallets.additionalProperties.velocity","typeLabel":"object"}},"uniqueKey":"chains.additionalProperties.wallets.additionalProperties","typeLabel":"object"},"uniqueKey":"chains.additionalProperties.wallets","typeLabel":"object"}},"uniqueKey":"chains.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"chains","typeLabel":"object"},"ceiling":{"type":"object","description":"The most one transaction may move, per asset key (`SYMBOL/decimals`), in base units. An asset with no ceiling cannot be sent.","additionalProperties":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","uniqueKey":"ceiling.additionalProperties","typeLabel":"string"},"isRequired":true,"uniqueKey":"ceiling","typeLabel":"object"},"references":{"type":"object","description":"Limits per `end_user_ref`, each one listed by name — never matched by a pattern. `{}` for none. Payouts to your whitelist go without a request signature, so your engine counts them all under the reserved reference `system:whitelisted`, not under their `end_user_ref`: limit them there. With `allow_unregistered_reference` off, list it, or those payouts are refused.","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"limits":{"type":"object","description":"Per asset key, the most that may move within a rolling window.","additionalProperties":{"type":"object","additionalProperties":false,"required":["window","max"],"properties":{"window":{"type":"string","description":"A duration: `1h`, `24h`, `1h30m`.","isRequired":true,"uniqueKey":"references.additionalProperties.limits.additionalProperties.window","typeLabel":"string"},"max":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"references.additionalProperties.limits.additionalProperties.max","typeLabel":"string"}},"uniqueKey":"references.additionalProperties.limits.additionalProperties","typeLabel":"object"},"uniqueKey":"references.additionalProperties.limits","typeLabel":"object"},"velocity":{"type":"object","additionalProperties":false,"required":["window","max"],"description":"How many authorizations a rolling window allows.","properties":{"window":{"type":"string","description":"A duration: `1h`, `24h`, `1h30m`.","isRequired":true,"uniqueKey":"references.additionalProperties.velocity.window","typeLabel":"string"},"max":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"references.additionalProperties.velocity.max","typeLabel":"integer"}},"uniqueKey":"references.additionalProperties.velocity","typeLabel":"object"}},"uniqueKey":"references.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"references","typeLabel":"object"},"allow_unregistered_reference":{"type":"boolean","default":false,"description":"Accept an `end_user_ref` that `references` does not list. Leave it off when you set per-reference limits.","uniqueKey":"allow_unregistered_reference","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"example":{"chains":{"tron":{"whitelist":["TGz2TZmabrZZowj7G8BbyMYg6HacJLuzaj","TVsjquD89kcRu2WTSWsoJhYMNLQbFt8xQ4"],"assets":{"native":"TRX/6","TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t":"USDT/6"},"wallets":{}}},"ceiling":{"TRX/6":"100000000","USDT/6":"50000000"},"references":{}},"examples":{"Example":{"title":"Example","value":{"chains":{"tron":{"whitelist":["TGz2TZmabrZZowj7G8BbyMYg6HacJLuzaj","TVsjquD89kcRu2WTSWsoJhYMNLQbFt8xQ4"],"assets":{"native":"TRX/6","TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t":"USDT/6"},"wallets":{}}},"ceiling":{"TRX/6":"100000000","USDT/6":"50000000"},"references":{}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"5c0793a5-c11d-475e-b1ee-5ceefb5ea46f":{"description":"These rules already wait for approval — the change that carries them. Nothing to sign.","content":{"application/json":{"schema":{"type":"object","required":["version","status","document","key_id","signature","approval","rejected_reason","created_at","updated_at"],"properties":{"version":{"type":"integer","isRequired":true,"uniqueKey":"version","typeLabel":"integer"},"status":{"type":"string","enum":["draft","pending","published","rejected"],"description":"`draft` — to sign and publish; `pending` — signed, waits for approval; `published` — sent to your engine; `rejected` — never sent.","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"document":{"type":"string","description":"The YAML document: the exact bytes your policy key signs.","isRequired":true,"uniqueKey":"document","typeLabel":"string"},"key_id":{"oneOf":[{"type":"string","description":"The policy key that signed. `null` for a draft.","isRequired":true,"uniqueKey":"key_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The policy key that signed. `null` for a draft.","isRequired":true,"uniqueKey":"key_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"key_id","typeLabel":"string | null"},"signature":{"oneOf":[{"type":"string","description":"Your policy key's signature over `document`, in standard base64. `null` for a draft.","isRequired":true,"uniqueKey":"signature.oneOf.0","typeLabel":"string"},{"type":"null","description":"Your policy key's signature over `document`, in standard base64. `null` for a draft.","isRequired":true,"uniqueKey":"signature.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"signature","typeLabel":"string | null"},"approval":{"oneOf":[{"type":"null","description":"The approval a change published through the API waits for, or waited for. `null` for a draft, and for a version published in the console.","isRequired":true,"uniqueKey":"approval.oneOf.0","typeLabel":"null"},{"type":"object","description":"The approval a change published through the API waits for, or waited for. `null` for a draft, and for a version published in the console.","required":["id","status","required","approved","expires_at","decided_at"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"approval.oneOf.1.id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["pending","approved","rejected","expired","superseded"],"isRequired":true,"uniqueKey":"approval.oneOf.1.status","typeLabel":"enum\u003cstring>"},"required":{"type":"integer","description":"Approvals needed.","isRequired":true,"uniqueKey":"approval.oneOf.1.required","typeLabel":"integer"},"approved":{"type":"integer","description":"Approvals given so far.","isRequired":true,"uniqueKey":"approval.oneOf.1.approved","typeLabel":"integer"},"expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.oneOf.1.expires_at","typeLabel":"string\u003cdate-time>"},"decided_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.oneOf.1.decided_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"approval.oneOf.1.decided_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"approval.oneOf.1.decided_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"approval.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"approval","typeLabel":"null | object"},"rejected_reason":{"oneOf":[{"type":"string","enum":["approval_rejected","approval_expired","superseded",null],"description":"Why a `rejected` change was never sent: an approver declined it, it was not approved in time, or a newer change replaced it or a newer version came into force first.","isRequired":true,"uniqueKey":"rejected_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["approval_rejected","approval_expired","superseded",null],"description":"Why a `rejected` change was never sent: an approver declined it, it was not approved in time, or a newer change replaced it or a newer version came into force first.","isRequired":true,"uniqueKey":"rejected_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rejected_reason","typeLabel":"enum\u003cstring> | null"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"version":123,"status":"draft","document":"\u003cstring>","key_id":"\u003cstring>","signature":"\u003cstring>","approval":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","status":"pending","required":123,"approved":123,"expires_at":"2023-11-07T05:31:56Z","decided_at":"2023-11-07T05:31:56Z"},"rejected_reason":"approval_rejected","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}}},"exampleType":"generated"}},"exampleType":"generated"},"9cca851f-a7c5-48d5-954c-b124ec5e0598":{"description":"The draft — sign `document` with your policy key.","content":{"application/json":{"schema":{"type":"object","required":["version","status","document","key_id","signature","approval","rejected_reason","created_at","updated_at"],"properties":{"version":{"type":"integer","isRequired":true,"uniqueKey":"version","typeLabel":"integer"},"status":{"type":"string","enum":["draft","pending","published","rejected"],"description":"`draft` — to sign and publish; `pending` — signed, waits for approval; `published` — sent to your engine; `rejected` — never sent.","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"document":{"type":"string","description":"The YAML document: the exact bytes your policy key signs.","isRequired":true,"uniqueKey":"document","typeLabel":"string"},"key_id":{"oneOf":[{"type":"string","description":"The policy key that signed. `null` for a draft.","isRequired":true,"uniqueKey":"key_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The policy key that signed. `null` for a draft.","isRequired":true,"uniqueKey":"key_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"key_id","typeLabel":"string | null"},"signature":{"oneOf":[{"type":"string","description":"Your policy key's signature over `document`, in standard base64. `null` for a draft.","isRequired":true,"uniqueKey":"signature.oneOf.0","typeLabel":"string"},{"type":"null","description":"Your policy key's signature over `document`, in standard base64. `null` for a draft.","isRequired":true,"uniqueKey":"signature.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"signature","typeLabel":"string | null"},"approval":{"oneOf":[{"type":"null","description":"The approval a change published through the API waits for, or waited for. `null` for a draft, and for a version published in the console.","isRequired":true,"uniqueKey":"approval.oneOf.0","typeLabel":"null"},{"type":"object","description":"The approval a change published through the API waits for, or waited for. `null` for a draft, and for a version published in the console.","required":["id","status","required","approved","expires_at","decided_at"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"approval.oneOf.1.id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["pending","approved","rejected","expired","superseded"],"isRequired":true,"uniqueKey":"approval.oneOf.1.status","typeLabel":"enum\u003cstring>"},"required":{"type":"integer","description":"Approvals needed.","isRequired":true,"uniqueKey":"approval.oneOf.1.required","typeLabel":"integer"},"approved":{"type":"integer","description":"Approvals given so far.","isRequired":true,"uniqueKey":"approval.oneOf.1.approved","typeLabel":"integer"},"expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.oneOf.1.expires_at","typeLabel":"string\u003cdate-time>"},"decided_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.oneOf.1.decided_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"approval.oneOf.1.decided_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"approval.oneOf.1.decided_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"approval.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"approval","typeLabel":"null | object"},"rejected_reason":{"oneOf":[{"type":"string","enum":["approval_rejected","approval_expired","superseded",null],"description":"Why a `rejected` change was never sent: an approver declined it, it was not approved in time, or a newer change replaced it or a newer version came into force first.","isRequired":true,"uniqueKey":"rejected_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["approval_rejected","approval_expired","superseded",null],"description":"Why a `rejected` change was never sent: an approver declined it, it was not approved in time, or a newer change replaced it or a newer version came into force first.","isRequired":true,"uniqueKey":"rejected_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rejected_reason","typeLabel":"enum\u003cstring> | null"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"example":{"version":4,"status":"draft","document":"---\nceiling:\n TRX/6: '100000000'\n USDT/6: '50000000'\nchains:\n tron:\n assets:\n TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t: USDT/6\n native: TRX/6\n chain_module_version: 1\n wallets: {}\n whitelist:\n - TGz2TZmabrZZowj7G8BbyMYg6HacJLuzaj\n - TVsjquD89kcRu2WTSWsoJhYMNLQbFt8xQ4\nreferences: {}\nversion: 4\n","key_id":null,"signature":null,"approval":null,"rejected_reason":null,"created_at":"2026-10-18T09:00:00Z","updated_at":"2026-10-18T09:00:00Z"},"examples":{"Example":{"title":"Example","value":{"version":4,"status":"draft","document":"---\nceiling:\n TRX/6: '100000000'\n USDT/6: '50000000'\nchains:\n tron:\n assets:\n TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t: USDT/6\n native: TRX/6\n chain_module_version: 1\n wallets: {}\n whitelist:\n - TGz2TZmabrZZowj7G8BbyMYg6HacJLuzaj\n - TVsjquD89kcRu2WTSWsoJhYMNLQbFt8xQ4\nreferences: {}\nversion: 4\n","key_id":null,"signature":null,"approval":null,"rejected_reason":null,"created_at":"2026-10-18T09:00:00Z","updated_at":"2026-10-18T09:00:00Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"c3eb6919-3f45-4b1e-b49b-fd9214270cfd":{"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"},"8516b28d-0fa9-44db-ab0a-0a017309de50":{"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"},"f7ef1e71-0430-44bd-a5de-21e3e5c42835":{"description":"Not a policy document your engine can read, or nothing new. The draft was not replaced.\n`code: nothing_changed` — these are the rules in force.\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":{"invalid":{"title":"invalid","value":{"error":"chains.tron.whitelist: bad checksum for \"TVsjquD89kcRu2WTSWsoJhYMNLQbFt8xQ5\""}},"unknown_field":{"title":"unknown_field","value":{"error":"unknown fields: whitelists (a draft takes chains, ceiling, references, allow_unregistered_reference)"}},"nothing_changed":{"title":"nothing_changed","value":{"error":"nothing changed: these are the rules in force","code":"nothing_changed"}}},"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":"Draft the policy document - Citadel API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"api-reference/policy/draft-the-policy-document.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=\"Drafts a new version of your policy document from your backend: the whitelist of each chain (your address book), the assets your engine recognises, the ceilings and limits. See Address book for the whole round. The body is the whole document — what you leave out is not in it. An empty whitelist lets your engine pay no external address; an asset without a ceiling cannot be sent. Citadel stamps the next version and each chain\u0026#x27;s module version and answers document: the exact YAML bytes your policy key signs. Before you sign, parse document and check that it says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and hand the signature to POST /policy/publish. There is one draft per organization: a new draft replaces the one waiting to be signed, whether it was made here or in the console. Rules equal to the change already waiting for approval answer that change (200, status: pending) and leave the draft as it was. Rules equal to the version in force are refused with 422 nothing_changed. A field the document does not have, an address its chain cannot parse, an amount that is not an integer string, or a window that is not a duration is refused with 422 before the draft is replaced. One document rules every network and every vault: it takes no network. Needs the policy.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=\"Draft the policy document - Citadel API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Drafts a new version of your policy document from your backend: the whitelist of each chain (your address book), the assets your engine recognises, the ceilings and limits. See Address book for the whole round. The body is the whole document — what you leave out is not in it. An empty whitelist lets your engine pay no external address; an asset without a ceiling cannot be sent. Citadel stamps the next version and each chain\u0026#x27;s module version and answers document: the exact YAML bytes your policy key signs. Before you sign, parse document and check that it says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and hand the signature to POST /policy/publish. There is one draft per organization: a new draft replaces the one waiting to be signed, whether it was made here or in the console. Rules equal to the change already waiting for approval answer that change (200, status: pending) and leave the draft as it was. Rules equal to the version in force are refused with 422 nothing_changed. A field the document does not have, an address its chain cannot parse, an amount that is not an integer string, or a window that is not a duration is refused with 422 before the draft is replaced. One document rules every network and every vault: it takes no network. Needs the policy.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/policy/draft-the-policy-document\">\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=\"Draft the policy document - Citadel API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Drafts a new version of your policy document from your backend: the whitelist of each chain (your address book), the assets your engine recognises, the ceilings and limits. See Address book for the whole round. The body is the whole document — what you leave out is not in it. An empty whitelist lets your engine pay no external address; an asset without a ceiling cannot be sent. Citadel stamps the next version and each chain\u0026#x27;s module version and answers document: the exact YAML bytes your policy key signs. Before you sign, parse document and check that it says what you sent. Then sign those bytes, unchanged, with your policy key (key B) and hand the signature to POST /policy/publish. There is one draft per organization: a new draft replaces the one waiting to be signed, whether it was made here or in the console. Rules equal to the change already waiting for approval answer that change (200, status: pending) and leave the draft as it was. Rules equal to the version in force are refused with 422 nothing_changed. A field the document does not have, an address its chain cannot parse, an amount that is not an integer string, or a window that is not a duration is refused with 422 before the draft is replaced. One document rules every network and every vault: it takes no network. Needs the policy.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/policy/draft-the-policy-document\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/policy/draft-the-policy-document.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","description":"The policy document last published to your policy engine: the whitelist, limits and\nnetworks it enforces. `document` is the exact YAML your policy key signed, byte for byte,\nand `signature` your key's Ed25519 signature over those bytes (base64): check it with your\nown key's public half, and compare the document with the one you signed. Your engine\nverifies the signature before it installs a document; what it enforces is its own copy.\n\nOne document rules every network and every vault: it takes no `network`. Needs the `read`\nscope. A key limited to vaults is refused with `403 vault_limited`. Before the first\ndocument is published, `404`.\n","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","description":"One version of the policy document, drafted here or in the console, and what became of it:\n\n- `draft` — sign `document` and publish it;\n- `pending` — signed; waits for approval (`approval`);\n- `published` — sent to your engine; `GET /policy` reads what is in force;\n- `rejected` — never sent; `rejected_reason` says why.\n\nRead it to follow a change after `POST /policy/publish`, or to fetch a draft's bytes again\nbefore you sign. No `network`. Needs the `read` scope. A key limited to vaults is refused\nwith `403 vault_limited`.\n","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","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":"Draft the policy document - 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"]}