Issues up to 100 wallets in one call — for instance when your users move over from another
system. network is named once, for the whole batch: every wallet is issued on it. Each item
of wallets is what POST /wallets takes (reference, chain, end_user_ref, and
optionally label, tags, vault, account_implementation) and is issued or found the same
way: a reference that already names a wallet on the network returns that wallet as it is.
All or nothing. An item that is refused refuses the whole batch with 422, its index in the
message (wallets[3]: chain is not supported), and nothing is created. Fix it and send the
same batch again: the wallets it names that already exist come back as they are, the rest are
issued. An item may repeat the batch’s network, but not name another one; a reference may
appear once per batch; any other field is refused.
data lists the wallets in the order you sent them. A new wallet answers status: creating
without an address, as with POST /wallets: each one gets its wallet.active webhook when
your signer has derived it. Your signer derives them one after another, so the addresses of a
large batch arrive over a while.
Needs the wallets.write scope. A key limited to vaults issues only into them; an item whose
vault is outside them, or whose reference names a wallet outside them, refuses the batch.
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.
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.
{"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/wallets/issue-wallets-in-a-batch","slug":"/api-reference/wallets/issue-wallets-in-a-batch","pageMetadata":{"openapi":"/openapi.yaml post /wallets/batch","description":"Issues up to 100 wallets in one call — for instance when your users move over from another\nsystem. `network` is named once, for the whole batch: every wallet is issued on it. Each item\nof `wallets` is what `POST /wallets` takes (`reference`, `chain`, `end_user_ref`, and\noptionally `label`, `tags`, `vault`, `account_implementation`) and is issued or found the same\nway: a reference that already names a wallet on the network returns that wallet as it is.\n\nAll or nothing. An item that is refused refuses the whole batch with `422`, its index in the\nmessage (`wallets[3]: chain is not supported`), and nothing is created. Fix it and send the\nsame batch again: the wallets it names that already exist come back as they are, the rest are\nissued. An item may repeat the batch's `network`, but not name another one; a reference may\nappear once per batch; any other field is refused.\n\n`data` lists the wallets in the order you sent them. A new wallet answers `status: creating`\nwithout an address, as with `POST /wallets`: each one gets its `wallet.active` webhook when\nyour signer has derived it. Your signer derives them one after another, so the addresses of a\nlarge batch arrive over a while.\n\nNeeds the `wallets.write` scope. A key limited to vaults issues only into them; an item whose\n`vault` is outside them, or whose reference names a wallet outside them, refuses the batch.\n","href":"/api-reference/wallets/issue-wallets-in-a-batch","title":"Issue wallets in a batch"},"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: [\"Issues up to 100 wallets in one call — for instance when your users move over from another\\nsystem. \", _jsx(_components.code, {\n children: \"network\"\n }), \" is named once, for the whole batch: every wallet is issued on it. Each item\\nof \", _jsx(_components.code, {\n children: \"wallets\"\n }), \" is what \", _jsx(_components.code, {\n children: \"POST /wallets\"\n }), \" takes (\", _jsx(_components.code, {\n children: \"reference\"\n }), \", \", _jsx(_components.code, {\n children: \"chain\"\n }), \", \", _jsx(_components.code, {\n children: \"end_user_ref\"\n }), \", and\\noptionally \", _jsx(_components.code, {\n children: \"label\"\n }), \", \", _jsx(_components.code, {\n children: \"tags\"\n }), \", \", _jsx(_components.code, {\n children: \"vault\"\n }), \", \", _jsx(_components.code, {\n children: \"account_implementation\"\n }), \") and is issued or found the same\\nway: a reference that already names a wallet on the network returns that wallet as it is.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"All or nothing. An item that is refused refuses the whole batch with \", _jsx(_components.code, {\n children: \"422\"\n }), \", its index in the\\nmessage (\", _jsx(_components.code, {\n children: \"wallets[3]: chain is not supported\"\n }), \"), and nothing is created. Fix it and send the\\nsame batch again: the wallets it names that already exist come back as they are, the rest are\\nissued. An item may repeat the batch’s \", _jsx(_components.code, {\n children: \"network\"\n }), \", but not name another one; a reference may\\nappear once per batch; any other field is refused.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"data\"\n }), \" lists the wallets in the order you sent them. A new wallet answers \", _jsx(_components.code, {\n children: \"status: creating\"\n }), \"\\nwithout an address, as with \", _jsx(_components.code, {\n children: \"POST /wallets\"\n }), \": each one gets its \", _jsx(_components.code, {\n children: \"wallet.active\"\n }), \" webhook when\\nyour signer has derived it. Your signer derives them one after another, so the addresses of a\\nlarge batch arrive over a while.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Needs the \", _jsx(_components.code, {\n children: \"wallets.write\"\n }), \" scope. A key limited to vaults issues only into them; an item whose\\n\", _jsx(_components.code, {\n children: \"vault\"\n }), \" is outside them, or whose reference names a wallet outside them, refuses the batch.\"]\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 /wallets/batch","description":"Issues up to 100 wallets in one call — for instance when your users move over from another\nsystem. `network` is named once, for the whole batch: every wallet is issued on it. Each item\nof `wallets` is what `POST /wallets` takes (`reference`, `chain`, `end_user_ref`, and\noptionally `label`, `tags`, `vault`, `account_implementation`) and is issued or found the same\nway: a reference that already names a wallet on the network returns that wallet as it is.\n\nAll or nothing. An item that is refused refuses the whole batch with `422`, its index in the\nmessage (`wallets[3]: chain is not supported`), and nothing is created. Fix it and send the\nsame batch again: the wallets it names that already exist come back as they are, the rest are\nissued. An item may repeat the batch's `network`, but not name another one; a reference may\nappear once per batch; any other field is refused.\n\n`data` lists the wallets in the order you sent them. A new wallet answers `status: creating`\nwithout an address, as with `POST /wallets`: each one gets its `wallet.active` webhook when\nyour signer has derived it. Your signer derives them one after another, so the addresses of a\nlarge batch arrive over a while.\n\nNeeds the `wallets.write` scope. A key limited to vaults issues only into them; an item whose\n`vault` is outside them, or whose reference names a wallet outside them, refuses the batch.\n","href":"/api-reference/wallets/issue-wallets-in-a-batch","title":"Issue wallets in a batch"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Wallets"],"operationId":"createWalletBatch","summary":"Issue wallets in a batch","description":"Issues up to 100 wallets in one call — for instance when your users move over from another\nsystem. `network` is named once, for the whole batch: every wallet is issued on it. Each item\nof `wallets` is what `POST /wallets` takes (`reference`, `chain`, `end_user_ref`, and\noptionally `label`, `tags`, `vault`, `account_implementation`) and is issued or found the same\nway: a reference that already names a wallet on the network returns that wallet as it is.\n\nAll or nothing. An item that is refused refuses the whole batch with `422`, its index in the\nmessage (`wallets[3]: chain is not supported`), and nothing is created. Fix it and send the\nsame batch again: the wallets it names that already exist come back as they are, the rest are\nissued. An item may repeat the batch's `network`, but not name another one; a reference may\nappear once per batch; any other field is refused.\n\n`data` lists the wallets in the order you sent them. A new wallet answers `status: creating`\nwithout an address, as with `POST /wallets`: each one gets its `wallet.active` webhook when\nyour signer has derived it. Your signer derives them one after another, so the addresses of a\nlarge batch arrive over a while.\n\nNeeds the `wallets.write` scope. A key limited to vaults issues only into them; an item whose\n`vault` is outside them, or whose reference names a wallet outside them, refuses the batch.\n","requestBody":"1435d131-68a4-494f-b7e0-db225cc531f9","responses":{"200":"7e47ac2a-bcb9-401b-99b4-d79d003eba35","202":"9498e75b-44ff-457a-9aa3-450b21d60335","401":"32b30ee3-9a34-49a4-88ae-a5c239e42cb7","403":"2a5a3e61-b692-49bc-9bd9-48816a21db99","422":"d59a9e23-5870-4ba3-9885-f82e3a0f3ecd"},"method":"post","type":"path","servers":["825d9789-7332-4a65-b039-b330384d4003"],"security":["24aebd70-fdbd-4dae-a4a9-d627e2d2711f"],"path":"/wallets/batch","baseUrlOptions":["https://api.citadel.example/api/v1"],"title":"Issue wallets in a batch","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["network","wallets"],"properties":{"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>"},"wallets":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["reference","chain","end_user_ref"],"properties":{"reference":{"type":"string","minLength":1,"description":"Your id for the wallet; once per batch.","isRequired":true,"uniqueKey":"wallets.items.[INDEX].reference","typeLabel":"string"},"chain":{"type":"string","enum":["tron","evm","solana","ton"],"isRequired":true,"uniqueKey":"wallets.items.[INDEX].chain","typeLabel":"enum\u003cstring>"},"end_user_ref":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"wallets.items.[INDEX].end_user_ref","typeLabel":"string"},"label":{"type":"string","default":"deposit","uniqueKey":"wallets.items.[INDEX].label","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","minLength":1,"uniqueKey":"wallets.items.[INDEX].tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"wallets.items.[INDEX].tags","typeLabel":"string[]"},"vault":{"type":"string","format":"uuid","uniqueKey":"wallets.items.[INDEX].vault","typeLabel":"string\u003cuuid>"},"account_implementation":{"type":"string","uniqueKey":"wallets.items.[INDEX].account_implementation","typeLabel":"string"},"network":{"type":"string","enum":["mainnet","testnet"],"description":"Optional; when sent, the batch's own.","uniqueKey":"wallets.items.[INDEX].network","typeLabel":"enum\u003cstring>"}},"uniqueKey":"wallets.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"wallets","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"network":"mainnet","wallets":[{"reference":"user-4211","chain":"tron","end_user_ref":"user-4211","tags":["vip"]},{"reference":"user-4212","chain":"tron","end_user_ref":"user-4212"}]},"examples":{"Example":{"title":"Example","value":{"network":"mainnet","wallets":[{"reference":"user-4211","chain":"tron","end_user_ref":"user-4211","tags":["vip"]},{"reference":"user-4212","chain":"tron","end_user_ref":"user-4212"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"7e47ac2a-bcb9-401b-99b4-d79d003eba35":{"description":"Every reference already named a wallet on this network. Nothing was issued.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","description":"The wallets, in the order the batch named them.","items":{"type":"object","required":["id","reference","chain","network","status","created_at"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"data.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"reference":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].reference","typeLabel":"string"},"chain":{"type":"string","enum":["tron","evm","solana","ton"],"isRequired":true,"uniqueKey":"data.items.[INDEX].chain","typeLabel":"enum\u003cstring>"},"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":"data.items.[INDEX].network","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["creating","active","retired","failed"],"description":"`creating` — issued, your signer has not derived it yet; `active` — in circulation;\n`retired` — out of circulation (`POST /wallets/{reference}/retire`): still watched,\ncredited, and able to send; `failed` — your signer could not derive it, it has no address.\n","isRequired":true,"uniqueKey":"data.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"address":{"type":"string","description":"Absent while `creating`, and on a `failed` wallet.","uniqueKey":"data.items.[INDEX].address","typeLabel":"string"},"label":{"type":"string","uniqueKey":"data.items.[INDEX].label","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"data.items.[INDEX].tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"data.items.[INDEX].tags","typeLabel":"string[]"},"end_user_ref":{"type":"string","uniqueKey":"data.items.[INDEX].end_user_ref","typeLabel":"string"},"vault":{"type":"string","format":"uuid","description":"The vault the wallet is in.","uniqueKey":"data.items.[INDEX].vault","typeLabel":"string\u003cuuid>"},"account_implementation":{"type":"string","uniqueKey":"data.items.[INDEX].account_implementation","typeLabel":"string"}},"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":[{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","reference":"\u003cstring>","chain":"tron","network":"mainnet","status":"creating","created_at":"2023-11-07T05:31:56Z","address":"\u003cstring>","label":"\u003cstring>","tags":["\u003cstring>"],"end_user_ref":"\u003cstring>","vault":"3c90c3cc-0d44-4b50-8888-8dd25736052a","account_implementation":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"9498e75b-44ff-457a-9aa3-450b21d60335":{"description":"At least one wallet was issued.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","description":"The wallets, in the order the batch named them.","items":{"type":"object","required":["id","reference","chain","network","status","created_at"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"data.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"reference":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].reference","typeLabel":"string"},"chain":{"type":"string","enum":["tron","evm","solana","ton"],"isRequired":true,"uniqueKey":"data.items.[INDEX].chain","typeLabel":"enum\u003cstring>"},"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":"data.items.[INDEX].network","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["creating","active","retired","failed"],"description":"`creating` — issued, your signer has not derived it yet; `active` — in circulation;\n`retired` — out of circulation (`POST /wallets/{reference}/retire`): still watched,\ncredited, and able to send; `failed` — your signer could not derive it, it has no address.\n","isRequired":true,"uniqueKey":"data.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"address":{"type":"string","description":"Absent while `creating`, and on a `failed` wallet.","uniqueKey":"data.items.[INDEX].address","typeLabel":"string"},"label":{"type":"string","uniqueKey":"data.items.[INDEX].label","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"data.items.[INDEX].tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"data.items.[INDEX].tags","typeLabel":"string[]"},"end_user_ref":{"type":"string","uniqueKey":"data.items.[INDEX].end_user_ref","typeLabel":"string"},"vault":{"type":"string","format":"uuid","description":"The vault the wallet is in.","uniqueKey":"data.items.[INDEX].vault","typeLabel":"string\u003cuuid>"},"account_implementation":{"type":"string","uniqueKey":"data.items.[INDEX].account_implementation","typeLabel":"string"}},"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":[{"id":"0199a3c4-7f1e-7b11-9c2e-3f4a5b6c7d8e","reference":"user-4211","chain":"tron","network":"mainnet","status":"creating","label":"deposit","tags":["vip"],"end_user_ref":"user-4211","vault":"0199a3b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f","created_at":"2026-10-18T12:00:00Z"},{"id":"0199a3c4-7f1f-7c12-8d3f-4a5b6c7d8e9f","reference":"user-4212","chain":"tron","network":"mainnet","address":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","status":"active","label":"deposit","tags":[],"end_user_ref":"user-4212","vault":"0199a3b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f","created_at":"2026-10-07T12:00:00Z"}]},"examples":{"Example":{"title":"Example","value":{"data":[{"id":"0199a3c4-7f1e-7b11-9c2e-3f4a5b6c7d8e","reference":"user-4211","chain":"tron","network":"mainnet","status":"creating","label":"deposit","tags":["vip"],"end_user_ref":"user-4211","vault":"0199a3b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f","created_at":"2026-10-18T12:00:00Z"},{"id":"0199a3c4-7f1f-7c12-8d3f-4a5b6c7d8e9f","reference":"user-4212","chain":"tron","network":"mainnet","address":"TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF","status":"active","label":"deposit","tags":[],"end_user_ref":"user-4212","vault":"0199a3b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f","created_at":"2026-10-07T12:00:00Z"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"32b30ee3-9a34-49a4-88ae-a5c239e42cb7":{"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"},"2a5a3e61-b692-49bc-9bd9-48816a21db99":{"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"},"d59a9e23-5870-4ba3-9885-f82e3a0f3ecd":{"description":"The batch was refused and nothing was created: `wallets` is not a list of 1 to 100\nobjects, `network_required` or `network_not_served`, or an item was refused — named by\nits index, for any reason `POST /wallets` refuses a wallet, and for a field that is not a\nwallet field, a value that is not a string (`tags`: a list of non-empty strings), another\nnetwork, or a reference that appears twice. These refusals carry no `code`, except the\nnetwork ones.\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":{"item_refused":{"title":"item_refused","value":{"error":"wallets[1]: chain is not supported"}},"duplicate_reference":{"title":"duplicate_reference","value":{"error":"wallets[2]: reference user-4211 is also wallets[0]"}},"not_a_batch":{"title":"not_a_batch","value":{"error":"wallets must be a list of 1 to 100 wallets"}},"network_required":{"title":"network_required","value":{"error":"network is required (mainnet, testnet)","code":"network_required"}}},"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":"Issue wallets in a batch - Citadel API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"api-reference/wallets/issue-wallets-in-a-batch.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=\"Issues up to 100 wallets in one call — for instance when your users move over from another system. network is named once, for the whole batch: every wallet is issued on it. Each item of wallets is what POST /wallets takes (reference, chain, end_user_ref, and optionally label, tags, vault, account_implementation) and is issued or found the same way: a reference that already names a wallet on the network returns that wallet as it is. All or nothing. An item that is refused refuses the whole batch with 422, its index in the message (wallets[3]: chain is not supported), and nothing is created. Fix it and send the same batch again: the wallets it names that already exist come back as they are, the rest are issued. An item may repeat the batch\u0026#x27;s network, but not name another one; a reference may appear once per batch; any other field is refused. data lists the wallets in the order you sent them. A new wallet answers status: creating without an address, as with POST /wallets: each one gets its wallet.active webhook when your signer has derived it. Your signer derives them one after another, so the addresses of a large batch arrive over a while. Needs the wallets.write scope. A key limited to vaults issues only into them; an item whose vault is outside them, or whose reference names a wallet outside them, refuses the batch.\">\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=\"Issue wallets in a batch - Citadel API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Issues up to 100 wallets in one call — for instance when your users move over from another system. network is named once, for the whole batch: every wallet is issued on it. Each item of wallets is what POST /wallets takes (reference, chain, end_user_ref, and optionally label, tags, vault, account_implementation) and is issued or found the same way: a reference that already names a wallet on the network returns that wallet as it is. All or nothing. An item that is refused refuses the whole batch with 422, its index in the message (wallets[3]: chain is not supported), and nothing is created. Fix it and send the same batch again: the wallets it names that already exist come back as they are, the rest are issued. An item may repeat the batch\u0026#x27;s network, but not name another one; a reference may appear once per batch; any other field is refused. data lists the wallets in the order you sent them. A new wallet answers status: creating without an address, as with POST /wallets: each one gets its wallet.active webhook when your signer has derived it. Your signer derives them one after another, so the addresses of a large batch arrive over a while. Needs the wallets.write scope. A key limited to vaults issues only into them; an item whose vault is outside them, or whose reference names a wallet outside them, refuses the batch.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Citadel API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://local./api-reference/wallets/issue-wallets-in-a-batch\">\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=\"Issue wallets in a batch - Citadel API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Issues up to 100 wallets in one call — for instance when your users move over from another system. network is named once, for the whole batch: every wallet is issued on it. Each item of wallets is what POST /wallets takes (reference, chain, end_user_ref, and optionally label, tags, vault, account_implementation) and is issued or found the same way: a reference that already names a wallet on the network returns that wallet as it is. All or nothing. An item that is refused refuses the whole batch with 422, its index in the message (wallets[3]: chain is not supported), and nothing is created. Fix it and send the same batch again: the wallets it names that already exist come back as they are, the rest are issued. An item may repeat the batch\u0026#x27;s network, but not name another one; a reference may appear once per batch; any other field is refused. data lists the wallets in the order you sent them. A new wallet answers status: creating without an address, as with POST /wallets: each one gets its wallet.active webhook when your signer has derived it. Your signer derives them one after another, so the addresses of a large batch arrive over a while. Needs the wallets.write scope. A key limited to vaults issues only into them; an item whose vault is outside them, or whose reference names a wallet outside them, refuses the batch.\">\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/wallets/issue-wallets-in-a-batch\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/wallets/issue-wallets-in-a-batch.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","description":"Issues a wallet for one of your users on one chain and network. `network` is required:\nthere is no default network. `end_user_ref` names the user and is required too. Idempotent\non `(reference, network)`: the same reference returns the existing wallet with `200`.\n\nIssuance is asynchronous — your own signer derives the key — so a fresh wallet answers\n`202` with `status: creating` and no address. The address arrives with the\n`wallet.active` webhook or a later `GET /wallets/{reference}`.\n\nNeeds the `wallets.write` scope. A key limited to vaults issues only into them.\n","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","description":"Reads a wallet by your reference (within `network`) or by its id. `network` is\nrequired; a wallet named by its id must live on it, else `422 network_mismatch`.\n\nNeeds the `read` scope. A wallet outside the key's vaults answers `404`.\n","openapi":"/openapi.yaml get /wallets/{reference}","href":"/api-reference/wallets/get-a-wallet"},{"title":"Update a wallet","openapi":"/openapi.yaml patch /wallets/{reference}","href":"/api-reference/wallets/update-a-wallet"},{"title":"Retire a wallet","openapi":"/openapi.yaml post /wallets/{reference}/retire","href":"/api-reference/wallets/retire-a-wallet"},{"title":"Get a wallet balance","openapi":"/openapi.yaml get /wallets/{reference}/balance","href":"/api-reference/wallets/get-a-wallet-balance"},{"title":"Get a wallet's limits","openapi":"/openapi.yaml get /wallets/{reference}/limits","href":"/api-reference/wallets/get-a-wallets-limits"}]},{"group":"Transactions","pages":[{"title":"List transactions","openapi":"/openapi.yaml get /transactions","href":"/api-reference/transactions/list-transactions"},{"title":"Send a transaction","openapi":"/openapi.yaml post /transactions","href":"/api-reference/transactions/send-a-transaction"},{"title":"Estimate a transaction","openapi":"/openapi.yaml post /transactions/estimate","href":"/api-reference/transactions/estimate-a-transaction"},{"title":"Get a transaction","openapi":"/openapi.yaml get /transactions/{id}","href":"/api-reference/transactions/get-a-transaction"},{"title":"Cancel a transaction","openapi":"/openapi.yaml post /transactions/{id}/cancel","href":"/api-reference/transactions/cancel-a-transaction"},{"title":"Speed up a stuck EVM transaction","openapi":"/openapi.yaml post /transactions/{id}/speedup","href":"/api-reference/transactions/speed-up-a-stuck-evm-transaction"},{"title":"Validate an address","openapi":"/openapi.yaml get /addresses/validate","href":"/api-reference/transactions/validate-an-address"}]},{"group":"Transfers","pages":[{"title":"List transfers","openapi":"/openapi.yaml get /transfers","href":"/api-reference/transfers/list-transfers"},{"title":"Get a transfer","openapi":"/openapi.yaml get /transfers/{tx_hash}","href":"/api-reference/transfers/get-a-transfer"}]},{"group":"Reference","pages":[{"title":"List networks and chains","openapi":"/openapi.yaml get /networks","href":"/api-reference/reference/list-networks-and-chains"},{"title":"List assets","openapi":"/openapi.yaml get /assets","href":"/api-reference/reference/list-assets"},{"title":"List asset prices","openapi":"/openapi.yaml get /prices","href":"/api-reference/reference/list-asset-prices"},{"title":"Get network status","openapi":"/openapi.yaml get /status","href":"/api-reference/reference/get-network-status"}]},{"group":"Organization","pages":[{"title":"List vaults","openapi":"/openapi.yaml get /vaults","href":"/api-reference/organization/list-vaults"},{"title":"Get organization balances","openapi":"/openapi.yaml get /balances","href":"/api-reference/organization/get-organization-balances"},{"title":"Get the calling key","openapi":"/openapi.yaml get /me","href":"/api-reference/organization/get-the-calling-key"},{"title":"Get the billing balance","openapi":"/openapi.yaml get /billing/balance","href":"/api-reference/organization/get-the-billing-balance"}]},{"group":"Approvals","pages":[{"title":"List approvals","openapi":"/openapi.yaml get /approvals","href":"/api-reference/approvals/list-approvals"}]},{"group":"Policy","pages":[{"title":"Get the policy document","openapi":"/openapi.yaml get /policy","href":"/api-reference/policy/get-the-policy-document"},{"title":"Draft the policy document","openapi":"/openapi.yaml post /policy/drafts","href":"/api-reference/policy/draft-the-policy-document"},{"title":"Get a policy draft","openapi":"/openapi.yaml get /policy/drafts/{version}","href":"/api-reference/policy/get-a-policy-draft"},{"title":"Publish a signed policy draft","openapi":"/openapi.yaml post /policy/publish","href":"/api-reference/policy/publish-a-signed-policy-draft"}]},{"group":"Workflows","pages":[{"title":"Start workflows by event","openapi":"/openapi.yaml post /events/{name}","href":"/api-reference/workflows/start-workflows-by-event"},{"title":"List workflow runs","openapi":"/openapi.yaml get /runs","href":"/api-reference/workflows/list-workflow-runs"},{"title":"Get a workflow run","openapi":"/openapi.yaml get /runs/{id}","href":"/api-reference/workflows/get-a-workflow-run"},{"title":"Cancel a workflow run","openapi":"/openapi.yaml post /runs/{id}/cancel","href":"/api-reference/workflows/cancel-a-workflow-run"},{"title":"List workflows","openapi":"/openapi.yaml get /workflows","href":"/api-reference/workflows/list-workflows"}]},{"group":"Webhook endpoints","pages":[{"title":"List webhook endpoints","openapi":"/openapi.yaml get /webhook_endpoints","href":"/api-reference/webhook-endpoints/list-webhook-endpoints"},{"title":"Add a webhook endpoint","openapi":"/openapi.yaml post /webhook_endpoints","href":"/api-reference/webhook-endpoints/add-a-webhook-endpoint"},{"title":"Get a webhook endpoint","openapi":"/openapi.yaml get /webhook_endpoints/{id}","href":"/api-reference/webhook-endpoints/get-a-webhook-endpoint"},{"title":"Remove a webhook endpoint","openapi":"/openapi.yaml delete /webhook_endpoints/{id}","href":"/api-reference/webhook-endpoints/remove-a-webhook-endpoint"},{"title":"Change a webhook endpoint","openapi":"/openapi.yaml patch /webhook_endpoints/{id}","href":"/api-reference/webhook-endpoints/change-a-webhook-endpoint"},{"title":"Send a test delivery","openapi":"/openapi.yaml post /webhook_endpoints/{id}/test","href":"/api-reference/webhook-endpoints/send-a-test-delivery"},{"title":"Rotate the signing secret","openapi":"/openapi.yaml post /webhook_endpoints/{id}/rotate_secret","href":"/api-reference/webhook-endpoints/rotate-the-signing-secret"}]},{"group":"Webhook deliveries","pages":[{"title":"List webhook deliveries","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":"Issue wallets in a batch - 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"]}