Submits one on-chain transaction from a wallet as generic actions[]: a native
transfer, a token transfer, an approve, a swap, a call to a registered contract.
The answer is 202 with the transaction — the body GET /transactions/{id} reads; the
outcome is asynchronous — poll GET /transactions/{id} or take the operation.* webhooks.
network is required: there is no default network. A wallet named by reference or
address is looked up on it; a wallet named by its id must live on it, else
422 network_mismatch. The network is checked before anything is reserved.
Funds are reserved at the door: the amounts and the network fee stop being spendable
before the answer. Your approval rules may hold the transaction for a passkey quorum:
still 202, with status: awaiting_approval and an approval block.
queue: true is different: nothing is reserved and nothing is sent. The payout waits
for a workflow to send it in a batch (see queue).
Needs the transactions.write scope. From a wallet outside the key’s vaults:
403 vault_limited.
POST /intents is the same endpoint under its older name.
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.
Makes a retry safe. The same key with the same body returns the first result; with a
different body (on /events/{name}: other inputs or another network),
409 idempotency_conflict. Also accepted as idempotency_key in the body. Without one,
POST /transactions answers with an idempotency_key of its own, intent:<uuid>.
Your key-A Ed25519 signature over the canonical request (see Authentication):
the 64 signature bytes in standard, padded base64 (88 characters). Stored with the
operation and verified by your own policy engine before anything is signed. A value
that is not base64 of 64 bytes (hex, for one) is refused with
422 invalid_request_signature. A signed request names wallet by id or address;
by reference it is refused with 422.
Wallet id, reference, or address on network; a wallet id must live on network. A signed request (X-Citadel-Request-Signature) names it by id or address only.
The network the data lives on. Required wherever it appears in a request — there is no
default network. One your installation does not serve: 422 network_not_served.
true records the payout for a workflow to send later in a batch, instead of
sending it now. Exactly one transfer action.
At the door nothing is reserved, no network fee is estimated, and your approval
rules are not asked. The funds stay spendable until a workflow's batch payout picks
the payout up by its tags and reserves them for the batch. The answer is 202 with
status: created and queued: true.
Once a batch carries it, the transaction reads final when the batch landed and
failed when it did not. It has no tx_hash of its own, and these changes come
without operation.* webhooks: read them with GET /transactions/{id}. Until a batch
carries it, POST /transactions/{id}/cancel withdraws it, with operation.failed.
The network the data lives on. Required wherever it appears in a request — there is no
default network. One your installation does not serve: 422 network_not_served.
The transaction was declared expired, then landed after all (the chain index served it
late). The earlier verdict is withdrawn — if you resubmitted on it, that payout is a
second one.
An EVM transaction waits behind its nonce: no node has taken its signed bytes for 5
minutes (the operation.stuck webhook). It keeps its holds and is sent again and again,
and new transactions from the wallet are refused until it moves. Absent once a node takes
it. POST /transactions/{id}/speedup signs it again at a higher fee.
Present when your approval rules held the transaction for a passkey quorum — on the
202 and on every read after it. Absent when it went out without waiting for people.
Show child attributes
{"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/transactions/send-a-transaction","slug":"/api-reference/transactions/send-a-transaction","pageMetadata":{"openapi":"/openapi.yaml post /transactions","description":"Submits one on-chain transaction from a wallet as generic `actions[]`: a native\ntransfer, a token transfer, an approve, a swap, a call to a registered contract.\nThe answer is `202` with the transaction — the body `GET /transactions/{id}` reads; the\noutcome is asynchronous — poll `GET /transactions/{id}` or take the `operation.*` webhooks.\n\n`network` is required: there is no default network. A `wallet` named by reference or\naddress is looked up on it; a wallet named by its id must live on it, else\n`422 network_mismatch`. The network is checked before anything is reserved.\n\nFunds are reserved at the door: the amounts and the network fee stop being spendable\nbefore the answer. Your approval rules may hold the transaction for a passkey quorum:\nstill `202`, with `status: awaiting_approval` and an `approval` block.\n\n`queue: true` is different: nothing is reserved and nothing is sent. The payout waits\nfor a workflow to send it in a batch (see `queue`).\n\nNeeds the `transactions.write` scope. From a wallet outside the key's vaults:\n`403 vault_limited`.\n\n`POST /intents` is the same endpoint under its older name.\n","href":"/api-reference/transactions/send-a-transaction","title":"Send a transaction"},"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: [\"Submits one on-chain transaction from a wallet as generic \", _jsx(_components.code, {\n children: \"actions[]\"\n }), \": a native\\ntransfer, a token transfer, an approve, a swap, a call to a registered contract.\\nThe answer is \", _jsx(_components.code, {\n children: \"202\"\n }), \" with the transaction — the body \", _jsx(_components.code, {\n children: \"GET /transactions/{id}\"\n }), \" reads; the\\noutcome is asynchronous — poll \", _jsx(_components.code, {\n children: \"GET /transactions/{id}\"\n }), \" or take the \", _jsx(_components.code, {\n children: \"operation.*\"\n }), \" webhooks.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"network\"\n }), \" is required: there is no default network. A \", _jsx(_components.code, {\n children: \"wallet\"\n }), \" named by reference or\\naddress is looked up on it; a wallet named by its id must live on it, else\\n\", _jsx(_components.code, {\n children: \"422 network_mismatch\"\n }), \". The network is checked before anything is reserved.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Funds are reserved at the door: the amounts and the network fee stop being spendable\\nbefore the answer. Your approval rules may hold the transaction for a passkey quorum:\\nstill \", _jsx(_components.code, {\n children: \"202\"\n }), \", with \", _jsx(_components.code, {\n children: \"status: awaiting_approval\"\n }), \" and an \", _jsx(_components.code, {\n children: \"approval\"\n }), \" block.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"queue: true\"\n }), \" is different: nothing is reserved and nothing is sent. The payout waits\\nfor a workflow to send it in a batch (see \", _jsx(_components.code, {\n children: \"queue\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Needs the \", _jsx(_components.code, {\n children: \"transactions.write\"\n }), \" scope. From a wallet outside the key’s vaults:\\n\", _jsx(_components.code, {\n children: \"403 vault_limited\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"POST /intents\"\n }), \" is the same endpoint under its older name.\"]\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 /transactions","description":"Submits one on-chain transaction from a wallet as generic `actions[]`: a native\ntransfer, a token transfer, an approve, a swap, a call to a registered contract.\nThe answer is `202` with the transaction — the body `GET /transactions/{id}` reads; the\noutcome is asynchronous — poll `GET /transactions/{id}` or take the `operation.*` webhooks.\n\n`network` is required: there is no default network. A `wallet` named by reference or\naddress is looked up on it; a wallet named by its id must live on it, else\n`422 network_mismatch`. The network is checked before anything is reserved.\n\nFunds are reserved at the door: the amounts and the network fee stop being spendable\nbefore the answer. Your approval rules may hold the transaction for a passkey quorum:\nstill `202`, with `status: awaiting_approval` and an `approval` block.\n\n`queue: true` is different: nothing is reserved and nothing is sent. The payout waits\nfor a workflow to send it in a batch (see `queue`).\n\nNeeds the `transactions.write` scope. From a wallet outside the key's vaults:\n`403 vault_limited`.\n\n`POST /intents` is the same endpoint under its older name.\n","href":"/api-reference/transactions/send-a-transaction","title":"Send a transaction"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Transactions"],"operationId":"createTransaction","summary":"Send a transaction","description":"Submits one on-chain transaction from a wallet as generic `actions[]`: a native\ntransfer, a token transfer, an approve, a swap, a call to a registered contract.\nThe answer is `202` with the transaction — the body `GET /transactions/{id}` reads; the\noutcome is asynchronous — poll `GET /transactions/{id}` or take the `operation.*` webhooks.\n\n`network` is required: there is no default network. A `wallet` named by reference or\naddress is looked up on it; a wallet named by its id must live on it, else\n`422 network_mismatch`. The network is checked before anything is reserved.\n\nFunds are reserved at the door: the amounts and the network fee stop being spendable\nbefore the answer. Your approval rules may hold the transaction for a passkey quorum:\nstill `202`, with `status: awaiting_approval` and an `approval` block.\n\n`queue: true` is different: nothing is reserved and nothing is sent. The payout waits\nfor a workflow to send it in a batch (see `queue`).\n\nNeeds the `transactions.write` scope. From a wallet outside the key's vaults:\n`403 vault_limited`.\n\n`POST /intents` is the same endpoint under its older name.\n","parameters":["c5cb97aa-1b60-451b-b700-2ad917ed3db5","1bdd9294-2a90-4e6f-ab2c-477ee3272d16"],"requestBody":"d0efe8ee-d58d-4291-8b6d-db457f022c98","responses":{"202":"2f1445d8-c7d9-4a5c-9279-e4528af33b84","401":"878c62dc-47e6-4b22-bdb8-530cff0960f1","403":"42dd8fda-38ad-44c6-a2bc-f976d1f3d1e8","409":"92dacf32-e55d-490a-a650-3fe30fb47e97","422":"b1d6086e-420e-4f4d-864e-1a7b8a3659d5","503":"5e70168a-589d-442f-aef5-714154aa548f"},"method":"post","type":"path","servers":["825d9789-7332-4a65-b039-b330384d4003"],"security":["24aebd70-fdbd-4dae-a4a9-d627e2d2711f"],"path":"/transactions","baseUrlOptions":["https://api.citadel.example/api/v1"],"title":"Send a transaction","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c5cb97aa-1b60-451b-b700-2ad917ed3db5":{"name":"Idempotency-Key","in":"header","required":false,"description":"Makes a retry safe. The same key with the same body returns the first result; with a\ndifferent body (on `/events/{name}`: other inputs or another network),\n`409 idempotency_conflict`. Also accepted as `idempotency_key` in the body. Without one,\n`POST /transactions` answers with an `idempotency_key` of its own, `intent:\u003cuuid>`.\n","schema":{"type":"string","maxLength":255,"isRequired":false,"description":"Makes a retry safe. The same key with the same body returns the first result; with a\ndifferent body (on `/events/{name}`: other inputs or another network),\n`409 idempotency_conflict`. Also accepted as `idempotency_key` in the body. Without one,\n`POST /transactions` answers with an `idempotency_key` of its own, `intent:\u003cuuid>`.\n","uniqueKey":"","typeLabel":"string"}},"1bdd9294-2a90-4e6f-ab2c-477ee3272d16":{"name":"X-Citadel-Request-Signature","in":"header","required":false,"description":"Your key-A Ed25519 signature over the canonical request (see Authentication):\nthe 64 signature bytes in standard, padded base64 (88 characters). Stored with the\noperation and verified by your own policy engine before anything is signed. A value\nthat is not base64 of 64 bytes (hex, for one) is refused with\n`422 invalid_request_signature`. A signed request names `wallet` by id or address;\nby reference it is refused with 422.\n","schema":{"type":"string","format":"byte","minLength":88,"maxLength":88,"isRequired":false,"description":"Your key-A Ed25519 signature over the canonical request (see Authentication):\nthe 64 signature bytes in standard, padded base64 (88 characters). Stored with the\noperation and verified by your own policy engine before anything is signed. A value\nthat is not base64 of 64 bytes (hex, for one) is refused with\n`422 invalid_request_signature`. A signed request names `wallet` by id or address;\nby reference it is refused with 422.\n","uniqueKey":"","typeLabel":"string\u003cbyte>"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["wallet","network","actions"],"properties":{"wallet":{"type":"string","description":"Wallet id, reference, or address on `network`; a wallet id must live on `network`. A signed request (X-Citadel-Request-Signature) names it by id or address only.","isRequired":true,"uniqueKey":"wallet","typeLabel":"string"},"network":{"type":"string","enum":["mainnet","testnet"],"description":"The network the data lives on. Required wherever it appears in a request — there is no\ndefault network. One your installation does not serve: `422 network_not_served`.\n","isRequired":true,"uniqueKey":"network","typeLabel":"enum\u003cstring>"},"actions":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","title":"transfer","required":["type","to","amount"],"properties":{"type":{"const":"transfer","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.0.type","typeLabel":"any"},"to":{"type":"string","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.0.to","typeLabel":"string"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.0.amount","typeLabel":"string"},"asset":{"type":"string","description":"Symbol, contract, or `native` (default).","uniqueKey":"actions.items.[INDEX].oneOf.0.asset","typeLabel":"string"}},"uniqueKey":"actions.items.[INDEX].oneOf.0","typeLabel":"transfer · object"},{"type":"object","title":"approve","required":["type","to","amount","asset"],"properties":{"type":{"const":"approve","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.1.type","typeLabel":"any"},"to":{"type":"string","description":"The spender.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.1.to","typeLabel":"string"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.1.amount","typeLabel":"string"},"asset":{"type":"string","description":"A token symbol or contract.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.1.asset","typeLabel":"string"}},"uniqueKey":"actions.items.[INDEX].oneOf.1","typeLabel":"approve · object"},{"type":"object","title":"swap","required":["type","to","amount","asset","token_out","min_amount_out"],"properties":{"type":{"const":"swap","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.2.type","typeLabel":"any"},"to":{"type":"string","description":"The router.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.2.to","typeLabel":"string"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.2.amount","typeLabel":"string"},"asset":{"type":"string","description":"Token in.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.2.asset","typeLabel":"string"},"token_out":{"type":"string","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.2.token_out","typeLabel":"string"},"min_amount_out":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.2.min_amount_out","typeLabel":"string"}},"uniqueKey":"actions.items.[INDEX].oneOf.2","typeLabel":"swap · object"},{"type":"object","title":"call","required":["type","method"],"properties":{"type":{"const":"call","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.3.type","typeLabel":"any"},"method":{"type":"string","isRequired":true,"uniqueKey":"actions.items.[INDEX].oneOf.3.method","typeLabel":"string"},"contract":{"type":"string","description":"A registered contract; absent for a chain-native system call.","uniqueKey":"actions.items.[INDEX].oneOf.3.contract","typeLabel":"string"},"args":{"type":"object","additionalProperties":true,"uniqueKey":"actions.items.[INDEX].oneOf.3.args","typeLabel":"object"},"value":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","uniqueKey":"actions.items.[INDEX].oneOf.3.value","typeLabel":"string"}},"uniqueKey":"actions.items.[INDEX].oneOf.3","typeLabel":"call · object"}],"uniqueKey":"actions.items.[INDEX]","typeLabel":"transfer · object | approve · object | swap · object | call · object"},"isRequired":true,"uniqueKey":"actions","typeLabel":"(transfer · object | approve · object | swap · object | call · object)[]"},"end_user_ref":{"type":"string","description":"The user the payout is for; policy limits count per user.","uniqueKey":"end_user_ref","typeLabel":"string"},"idempotency_key":{"type":"string","description":"Same as the `Idempotency-Key` header.","uniqueKey":"idempotency_key","typeLabel":"string"},"queue":{"type":"boolean","default":false,"description":"`true` records the payout for a workflow to send later in a batch, instead of\nsending it now. Exactly one `transfer` action.\n\nAt the door nothing is reserved, no network fee is estimated, and your approval\nrules are not asked. The funds stay spendable until a workflow's batch payout picks\nthe payout up by its `tags` and reserves them for the batch. The answer is `202` with\n`status: created` and `queued: true`.\n\nOnce a batch carries it, the transaction reads `final` when the batch landed and\n`failed` when it did not. It has no `tx_hash` of its own, and these changes come\nwithout `operation.*` webhooks: read them with `GET /transactions/{id}`. Until a batch\ncarries it, `POST /transactions/{id}/cancel` withdraws it, with `operation.failed`.\n","uniqueKey":"queue","typeLabel":"boolean"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"tags.items.[INDEX]","typeLabel":"string"},"description":"Selects a queued payout in a workflow.","uniqueKey":"tags","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"wallet":"hot-1","network":"mainnet","end_user_ref":"user-4211","actions":[{"type":"transfer","asset":"USDT","to":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","amount":"50000000"}]},"examples":{"Example":{"title":"Example","value":{"wallet":"hot-1","network":"mainnet","end_user_ref":"user-4211","actions":[{"type":"transfer","asset":"USDT","to":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","amount":"50000000"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"2f1445d8-c7d9-4a5c-9279-e4528af33b84":{"description":"Accepted. Status moves on asynchronously.","content":{"application/json":{"schema":{"type":"object","required":["operation_id","status","actions","tags","created_at","updated_at"],"description":"A transaction. A field with nothing to say is absent, except `actions` and `tags`.","properties":{"operation_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"operation_id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["created","aml_pending","awaiting_approval","authorized","signing","signed","broadcasting","broadcast","confirmed","final","failed","rejected","expired"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"actions":{"type":"array","description":"What it does, in order — the actions you sent, each asset named as balances name it.","items":{"type":"object","required":["type"],"description":"One action as the transaction carries it. A `transfer`, `approve` or `swap` names its asset\nby catalog `asset` symbol, `contract` (`null` for the native coin) and `decimals`; a `call`\nnames the `contract` it calls, its `method`, `args` and `value`.\n","properties":{"type":{"type":"string","enum":["transfer","approve","swap","stake","unstake","delegate","undelegate","call"],"isRequired":true,"uniqueKey":"actions.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"to":{"type":"string","uniqueKey":"actions.items.[INDEX].to","typeLabel":"string"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","uniqueKey":"actions.items.[INDEX].amount","typeLabel":"string"},"asset":{"type":"string","description":"The catalog symbol; the contract when the catalog has none; `native` when neither is known.","uniqueKey":"actions.items.[INDEX].asset","typeLabel":"string"},"contract":{"oneOf":[{"type":"string","uniqueKey":"actions.items.[INDEX].contract.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"actions.items.[INDEX].contract.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].contract","typeLabel":"string | null"},"decimals":{"oneOf":[{"type":"integer","uniqueKey":"actions.items.[INDEX].decimals.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"actions.items.[INDEX].decimals.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].decimals","typeLabel":"integer | null"},"token_out":{"type":"string","uniqueKey":"actions.items.[INDEX].token_out","typeLabel":"string"},"min_amount_out":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","uniqueKey":"actions.items.[INDEX].min_amount_out","typeLabel":"string"},"resource":{"type":"string","enum":["energy","bandwidth"],"uniqueKey":"actions.items.[INDEX].resource","typeLabel":"enum\u003cstring>"},"method":{"type":"string","uniqueKey":"actions.items.[INDEX].method","typeLabel":"string"},"args":{"type":"object","additionalProperties":true,"uniqueKey":"actions.items.[INDEX].args","typeLabel":"object"},"value":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","uniqueKey":"actions.items.[INDEX].value","typeLabel":"string"}},"uniqueKey":"actions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"actions","typeLabel":"object[]"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"tags.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"tags","typeLabel":"string[]"},"created_at":{"type":"string","format":"date-time","description":"When Citadel accepted it.","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","description":"Its last change of state.","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"network":{"type":"string","enum":["mainnet","testnet"],"description":"The network the data lives on. Required wherever it appears in a request — there is no\ndefault network. One your installation does not serve: `422 network_not_served`.\n","uniqueKey":"network","typeLabel":"enum\u003cstring>"},"chain":{"type":"string","enum":["tron","evm","solana","ton"],"uniqueKey":"chain","typeLabel":"enum\u003cstring>"},"wallet":{"type":"object","description":"The wallet it leaves from.","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"wallet.id","typeLabel":"string\u003cuuid>"},"reference":{"type":"string","uniqueKey":"wallet.reference","typeLabel":"string"},"address":{"type":"string","uniqueKey":"wallet.address","typeLabel":"string"}},"uniqueKey":"wallet","typeLabel":"object"},"end_user_ref":{"type":"string","uniqueKey":"end_user_ref","typeLabel":"string"},"tx_hash":{"type":"string","description":"Known from `broadcasting` on.","uniqueKey":"tx_hash","typeLabel":"string"},"fee":{"type":"object","required":["amount","asset"],"description":"The network fee the landed transaction cost, in the native coin of the chain it landed on. Absent until it lands.","properties":{"amount":{"type":"string","pattern":"^[0-9]+$","description":"An integer amount in the asset's smallest unit, as a string.","isRequired":true,"uniqueKey":"fee.amount","typeLabel":"string"},"asset":{"type":"string","isRequired":true,"uniqueKey":"fee.asset","typeLabel":"string"},"decimals":{"type":"integer","uniqueKey":"fee.decimals","typeLabel":"integer"}},"uniqueKey":"fee","typeLabel":"object"},"idempotency_key":{"type":"string","description":"The key the request was sent with. A request sent without one gets\n`intent:\u003cuuid>`, unique to this transaction; `GET /transactions/{id}` takes it too.\n","uniqueKey":"idempotency_key","typeLabel":"string"},"queued":{"type":"boolean","description":"true while a queued payout (`queue: true`) waits for its workflow; absent otherwise.","uniqueKey":"queued","typeLabel":"boolean"},"failure":{"type":"object","required":["stage","reason","retryable","message"],"properties":{"stage":{"type":"string","enum":["build","engine","signer","expired","rejected","reverted","approval","queue"],"description":"How far it got. `queue` — a queued payout (`queue: true`) cancelled before a batch carried it.","isRequired":true,"uniqueKey":"failure.stage","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","enum":["window_expired","rpc_unavailable","build_failed","sequence_refused","policy_refused","signing_failed","rejected_by_chain","reverted","approval_rejected","approval_expired","approval_stale","cancelled"],"isRequired":true,"uniqueKey":"failure.reason","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Safe to submit again with a NEW idempotency key — provably nothing moved.","isRequired":true,"uniqueKey":"failure.retryable","typeLabel":"boolean"},"message":{"type":"string","isRequired":true,"uniqueKey":"failure.message","typeLabel":"string"},"detail":{"type":"string","description":"What the refusing party said, trimmed.","uniqueKey":"failure.detail","typeLabel":"string"}},"uniqueKey":"failure","typeLabel":"object"},"corrected":{"type":"object","description":"The transaction was declared `expired`, then landed after all (the chain index served it\nlate). The earlier verdict is withdrawn — if you resubmitted on it, that payout is a\nsecond one.\n","properties":{"from":{"type":"string","enum":["expired"],"uniqueKey":"corrected.from","typeLabel":"enum\u003cstring>"},"failure":{"type":"object","required":["stage","reason","retryable","message"],"properties":{"stage":{"type":"string","enum":["build","engine","signer","expired","rejected","reverted","approval","queue"],"description":"How far it got. `queue` — a queued payout (`queue: true`) cancelled before a batch carried it.","isRequired":true,"uniqueKey":"corrected.failure.stage","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","enum":["window_expired","rpc_unavailable","build_failed","sequence_refused","policy_refused","signing_failed","rejected_by_chain","reverted","approval_rejected","approval_expired","approval_stale","cancelled"],"isRequired":true,"uniqueKey":"corrected.failure.reason","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Safe to submit again with a NEW idempotency key — provably nothing moved.","isRequired":true,"uniqueKey":"corrected.failure.retryable","typeLabel":"boolean"},"message":{"type":"string","isRequired":true,"uniqueKey":"corrected.failure.message","typeLabel":"string"},"detail":{"type":"string","description":"What the refusing party said, trimmed.","uniqueKey":"corrected.failure.detail","typeLabel":"string"}},"uniqueKey":"corrected.failure","typeLabel":"object"},"at":{"type":"string","format":"date-time","uniqueKey":"corrected.at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"corrected","typeLabel":"object"},"stuck":{"type":"object","description":"An EVM transaction waits behind its nonce: no node has taken its signed bytes for 5\nminutes (the `operation.stuck` webhook). It keeps its holds and is sent again and again,\nand new transactions from the wallet are refused until it moves. Absent once a node takes\nit. `POST /transactions/{id}/speedup` signs it again at a higher fee.\n","properties":{"since":{"type":"string","format":"date-time","description":"When its current version was signed.","uniqueKey":"stuck.since","typeLabel":"string\u003cdate-time>"},"sequence":{"type":"integer","description":"The nonce it holds.","uniqueKey":"stuck.sequence","typeLabel":"integer"},"error":{"type":"string","description":"The nodes' last answer, e.g. `max fee per gas less than block base fee` or `insufficient funds for gas * price + value`.","uniqueKey":"stuck.error","typeLabel":"string"}},"uniqueKey":"stuck","typeLabel":"object"},"speedup":{"type":"object","required":["status","number","requested_at"],"description":"The latest `POST /transactions/{id}/speedup` of this transaction, and what came of it.","properties":{"status":{"type":"string","enum":["requested","signed","refused"],"description":"`requested` — waiting for your signer, at most its 10-minute signing window. `signed` —\nthe new version (`tx_hash`) is sent in place of the old one. `refused` — not sent\n(`reason`); the old version is unchanged.\n","isRequired":true,"uniqueKey":"speedup.status","typeLabel":"enum\u003cstring>"},"number":{"type":"integer","description":"How many speedups this transaction has had, this one included.","isRequired":true,"uniqueKey":"speedup.number","typeLabel":"integer"},"requested_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"speedup.requested_at","typeLabel":"string\u003cdate-time>"},"tx_hash":{"type":"string","description":"The new version's hash, once signed.","uniqueKey":"speedup.tx_hash","typeLabel":"string"},"reason":{"type":"string","description":"Why it was refused.","uniqueKey":"speedup.reason","typeLabel":"string"}},"uniqueKey":"speedup","typeLabel":"object"},"approval":{"type":"object","description":"Present when your approval rules held the transaction for a passkey quorum — on the\n`202` and on every read after it. Absent when it went out without waiting for people.\n","required":["id","status","required","reasons","requested_at","expires_at","decisions"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"approval.id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["pending","approved","rejected","expired","superseded","cancelled"],"description":"A pending quorum past `expires_at` reads `expired`. `cancelled` — you cancelled the transaction while it waited.","isRequired":true,"uniqueKey":"approval.status","typeLabel":"enum\u003cstring>"},"required":{"type":"integer","description":"Approvals needed.","isRequired":true,"uniqueKey":"approval.required","typeLabel":"integer"},"reasons":{"type":"array","items":{"type":"string","uniqueKey":"approval.reasons.items.[INDEX]","typeLabel":"string"},"description":"Why the rules held it.","isRequired":true,"uniqueKey":"approval.reasons","typeLabel":"string[]"},"requested_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.requested_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.expires_at","typeLabel":"string\u003cdate-time>"},"decisions":{"type":"array","description":"Each person's passkey decision, oldest first.","items":{"type":"object","required":["decision","at","by"],"properties":{"decision":{"type":"string","enum":["approve","reject"],"isRequired":true,"uniqueKey":"approval.decisions.items.[INDEX].decision","typeLabel":"enum\u003cstring>"},"at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"approval.decisions.items.[INDEX].at","typeLabel":"string\u003cdate-time>"},"by":{"type":"object","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"approval.decisions.items.[INDEX].by.id","typeLabel":"string\u003cuuid>"},"name":{"oneOf":[{"type":"string","uniqueKey":"approval.decisions.items.[INDEX].by.name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"approval.decisions.items.[INDEX].by.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"approval.decisions.items.[INDEX].by.name","typeLabel":"string | null"},"email":{"type":"string","uniqueKey":"approval.decisions.items.[INDEX].by.email","typeLabel":"string"}},"isRequired":true,"uniqueKey":"approval.decisions.items.[INDEX].by","typeLabel":"object"}},"uniqueKey":"approval.decisions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"approval.decisions","typeLabel":"object[]"},"group":{"oneOf":[{"type":"string","description":"The approver group asked.","uniqueKey":"approval.group.oneOf.0","typeLabel":"string"},{"type":"null","description":"The approver group asked.","uniqueKey":"approval.group.oneOf.1","typeLabel":"null"}],"uniqueKey":"approval.group","typeLabel":"string | null"},"rule_version":{"oneOf":[{"type":"integer","description":"The approval rules version that held it.","uniqueKey":"approval.rule_version.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The approval rules version that held it.","uniqueKey":"approval.rule_version.oneOf.1","typeLabel":"null"}],"uniqueKey":"approval.rule_version","typeLabel":"integer | null"},"decided_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"approval.decided_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"approval.decided_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"approval.decided_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"approval","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"dispatched":{"title":"dispatched","value":{"operation_id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e","status":"authorized","network":"mainnet","chain":"tron","wallet":{"id":"0199a3b1-5e20-7d41-9c3a-2b4c6d8e0f12","reference":"hot-1","address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"},"actions":[{"type":"transfer","to":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","amount":"50000000","asset":"USDT","contract":"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t","decimals":6}],"end_user_ref":"user-4211","tags":[],"idempotency_key":"payout-981","created_at":"2026-10-08T12:00:00Z","updated_at":"2026-10-08T12:00:00Z"}},"queued":{"title":"queued","value":{"operation_id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e","status":"created","network":"mainnet","chain":"tron","wallet":{"id":"0199a3b1-5e20-7d41-9c3a-2b4c6d8e0f12","reference":"hot-1","address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"},"actions":[{"type":"transfer","to":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","amount":"50000000","asset":"USDT","contract":"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t","decimals":6}],"end_user_ref":"user-4211","tags":["batch-17"],"idempotency_key":"payout-981","queued":true,"created_at":"2026-10-08T12:00:00Z","updated_at":"2026-10-08T12:00:00Z"}},"without_key":{"title":"without_key","value":{"operation_id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e","status":"authorized","network":"mainnet","chain":"tron","wallet":{"id":"0199a3b1-5e20-7d41-9c3a-2b4c6d8e0f12","reference":"hot-1","address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"},"actions":[{"type":"transfer","to":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","amount":"50000000","asset":"USDT","contract":"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t","decimals":6}],"end_user_ref":"user-4211","tags":[],"idempotency_key":"intent:6f1d2c3b-4a5e-4f60-8b71-92a3b4c5d6e7","created_at":"2026-10-08T12:00:00Z","updated_at":"2026-10-08T12:00:00Z"}},"held":{"title":"held","value":{"operation_id":"0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e","status":"awaiting_approval","network":"mainnet","chain":"tron","wallet":{"id":"0199a3b1-5e20-7d41-9c3a-2b4c6d8e0f12","reference":"hot-1","address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"},"actions":[{"type":"transfer","to":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","amount":"50000000","asset":"USDT","contract":"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t","decimals":6}],"end_user_ref":"user-4211","tags":[],"idempotency_key":"payout-981","created_at":"2026-10-08T12:00:00Z","updated_at":"2026-10-08T12:00:00Z","approval":{"id":"0199a3c4-9b10-7d33-9e4f-5a6b7c8d9e0f","status":"pending","required":2,"reasons":["Amount above $10,000"],"group":"Treasury","rule_version":3,"requested_at":"2026-10-08T12:00:00Z","expires_at":"2026-10-08T16:00:00Z","decisions":[]}}}},"exampleType":"examples"}},"exampleType":"examples"},"878c62dc-47e6-4b22-bdb8-530cff0960f1":{"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"},"42dd8fda-38ad-44c6-a2bc-f976d1f3d1e8":{"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"},"92dacf32-e55d-490a-a650-3fe30fb47e97":{"description":"The idempotency key was already used with a different body.","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":"idempotency key reused with different parameters","code":"idempotency_conflict"},"examples":{"Example":{"title":"Example","value":{"error":"idempotency key reused with different parameters","code":"idempotency_conflict"}}},"exampleType":"examples"}},"exampleType":"examples"},"b1d6086e-420e-4f4d-864e-1a7b8a3659d5":{"description":"The request was understood and refused. Nothing was created or reserved. A request\nwithout `network` is refused with `network_required`, a network your installation does\nnot serve with `network_not_served`, a wallet id from another network with\n`network_mismatch`. A list refuses a cursor it did not issue with `invalid_cursor`, and an\nunknown filter value, a filter sent as a list or an object instead of one string, or a\n`limit` out of range without a `code`; so does a webhook retry of a period without `from`.\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":{"refused":{"title":"refused","value":{"error":"wallet has no address yet"}},"network_required":{"title":"network_required","value":{"error":"network is required (mainnet, testnet)","code":"network_required"}},"network_not_served":{"title":"network_not_served","value":{"error":"network \"devnet\" is not served here (mainnet, testnet)","code":"network_not_served"}},"network_mismatch":{"title":"network_mismatch","value":{"error":"wallet 0199a3c4-7f1e-7b11-9c2e-3f4a5b6c7d8e lives on testnet, not mainnet","code":"network_mismatch"}},"invalid_cursor":{"title":"invalid_cursor","value":{"error":"cursor is not one this API issued","code":"invalid_cursor"}},"invalid_filter":{"title":"invalid_filter","value":{"error":"unknown status settled (created, aml_pending, awaiting_approval, …)"}}},"exampleType":"examples"}},"exampleType":"examples"},"5e70168a-589d-442f-aef5-714154aa548f":{"description":"A chain node stayed down through retries. Nothing was created or reserved; send the\nsame request with the same idempotency key after `Retry-After` seconds.\n","headers":{"Retry-After":{"schema":{"type":"integer"}}},"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":"tron node unavailable","code":"rpc_unavailable","retryable":true},"examples":{"Example":{"title":"Example","value":{"error":"tron node unavailable","code":"rpc_unavailable","retryable":true}}},"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 transaction - Citadel API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"api-reference/transactions/send-a-transaction.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=\"Submits one on-chain transaction from a wallet as generic actions[]: a native transfer, a token transfer, an approve, a swap, a call to a registered contract. The answer is 202 with the transaction — the body GET /transactions/{id} reads; the outcome is asynchronous — poll GET /transactions/{id} or take the operation.* webhooks. network is required: there is no default network. A wallet named by reference or address is looked up on it; a wallet named by its id must live on it, else 422 network_mismatch. The network is checked before anything is reserved. Funds are reserved at the door: the amounts and the network fee stop being spendable before the answer. Your approval rules may hold the transaction for a passkey quorum: still 202, with status: awaiting_approval and an approval block. queue: true is different: nothing is reserved and nothing is sent. The payout waits for a workflow to send it in a batch (see queue). Needs the transactions.write scope. From a wallet outside the key\u0026#x27;s vaults: 403 vault_limited. POST /intents is the same endpoint under its older name.\">\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 transaction - Citadel API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Submits one on-chain transaction from a wallet as generic actions[]: a native transfer, a token transfer, an approve, a swap, a call to a registered contract. The answer is 202 with the transaction — the body GET /transactions/{id} reads; the outcome is asynchronous — poll GET /transactions/{id} or take the operation.* webhooks. network is required: there is no default network. A wallet named by reference or address is looked up on it; a wallet named by its id must live on it, else 422 network_mismatch. The network is checked before anything is reserved. Funds are reserved at the door: the amounts and the network fee stop being spendable before the answer. Your approval rules may hold the transaction for a passkey quorum: still 202, with status: awaiting_approval and an approval block. queue: true is different: nothing is reserved and nothing is sent. The payout waits for a workflow to send it in a batch (see queue). Needs the transactions.write scope. From a wallet outside the key\u0026#x27;s vaults: 403 vault_limited. POST /intents is the same endpoint under its older name.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Citadel API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://local./api-reference/transactions/send-a-transaction\">\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 transaction - Citadel API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Submits one on-chain transaction from a wallet as generic actions[]: a native transfer, a token transfer, an approve, a swap, a call to a registered contract. The answer is 202 with the transaction — the body GET /transactions/{id} reads; the outcome is asynchronous — poll GET /transactions/{id} or take the operation.* webhooks. network is required: there is no default network. A wallet named by reference or address is looked up on it; a wallet named by its id must live on it, else 422 network_mismatch. The network is checked before anything is reserved. Funds are reserved at the door: the amounts and the network fee stop being spendable before the answer. Your approval rules may hold the transaction for a passkey quorum: still 202, with status: awaiting_approval and an approval block. queue: true is different: nothing is reserved and nothing is sent. The payout waits for a workflow to send it in a batch (see queue). Needs the transactions.write scope. From a wallet outside the key\u0026#x27;s vaults: 403 vault_limited. POST /intents is the same endpoint under its older name.\">\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/transactions/send-a-transaction\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/transactions/send-a-transaction.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","description":"The transactions you sent with `POST /transactions` on one network, newest first, queued\nones included. Each row is the body `GET /transactions/{id}` reads. Use it to reconcile\nyour payouts, or to catch up after missed `operation.*` webhooks.\n\nOnly what your API keys submitted is listed. Transactions Citadel makes for itself (network\nfee top-ups, sweeps between your wallets, energy) are not, nor are the ones a workflow\nsends: those are on the workflow's run (`GET /runs/{id}`, the `run.*` webhooks).\n\n`network` is required. Paged with a cursor — see Lists and pagination. Needs the `read`\nscope. A key limited to vaults lists the transactions of wallets in them.\n","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","description":"Takes the body of `POST /transactions` and answers what sending it now would do, without\nsending anything: the network fee Citadel would hold next to the amounts, and whether your\napproval rules would hold it for a passkey quorum — how many approvals, from which group,\nwhy, and for how long. Nothing is created, reserved or signed, and no webhook follows.\n\nIt refuses what a send refuses, with the same status and `code`: an unknown wallet, a bad\namount or address, a wallet outside the key's vaults (`403 vault_limited`), a wallet id\nfrom another network (`422 network_mismatch`). `network` is required. `queue`, `tags` and\nthe idempotency key are not read: an estimate is for sending now.\n\n`network_fee` is the most the network may charge the sending wallet, in its native coin —\nwhat a send holds for it. Citadel prices it for EVM wallets that pay their own gas. For\nevery other wallet (TRON, TON, Solana, EVM smart accounts) it is `null`: a send holds\nnothing for the fee, and Citadel does not price it.\n\nWhat it does not promise. Your policy engine decides only when the transaction is signed,\nso an estimate never asks it. It does not check the balance: the send may still be refused\nfor insufficient funds. And by the time you send, the balance, the fee and the windows of\nyour velocity rules may have moved — the send is judged afresh.\n\nNeeds the `transactions.write` scope. Your approval rules judge the calling key (its age,\nwhat it sent recently), so estimate with the key that will send.\n","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","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 transaction - 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"]}