The response body shown here is a static example, not live data. After you click Send, your live result appears in a separate panel headed 200 OK. The panel under the status-code tabs is a fixed sample from the spec — its field values (fees, prices, sizes, IDs, timestamps) are placeholders. Use Send, or call the endpoint, for current values.
Move collateral between two account indexes of the same wallet. In v0 transfers are same-wallet only: both fromAccountIndex and toAccountIndex belong to ethereumAddress, so there is no cross-wallet recipient field. Funds never leave custody, so nothing settles on-chain.Two mutually exclusive authentication modes are supported, selected by the presence of the X-API-Key header:
Wallet-signed (default): the request is self-authenticated by a secp256k1 EIP-712 typed-data signature in the body’s signature field — no X-API-Key / X-Signature headers.
API-key-signed: the request carries the X-API-Key / X-Timestamp / X-Signature header triple with an Ed25519 signature over the TransferV1 typed canonical payload (see below); the body signature field is then omitted. The key must be bound to ethereumAddress, and a key scoped to a single subaccount may set only that subaccount as fromAccountIndex (a key scoped to all subaccounts of its wallet may use any). No special permission is required — moving funds between a wallet’s own subaccounts carries the same authority as trading, which every valid key already has for its scope. The destination is another subaccount of the same wallet, so no separate recipient authorization applies.
Response behavior
Asynchronous. A 202 Accepted means the transfer passed validation and was queued to the matching engine with status: PENDING. The definitive outcome (applied, or rejected for insufficient free collateral) is delivered asynchronously — poll GET /v1/accountTransferUpdates or subscribe to the account transfer update WebSocket channel and correlate on transferId.
Signing the request (wallet mode)
Transfers use EIP-712 typed data (eth_signTypedData_v4). Sign this typed data with the wallet that owns ethereumAddress, then split the 65-byte result into {r, s, v} for the signature field. The gateway recovers the signer and rejects mismatches with HTTP 401.Domain
{ "name": "Arcus Transfer", "version": "1", "chainId": <rootchain chain id, e.g. 4663>, "verifyingContract": "<BridgeVault address for that chain>"}
amount is the integer collateral quote-quantum amount (same value as the amount request field).Per-environment domain parameters.chainId and verifyingContract are identical to the withdraw domain — see the per-environment table under POST /v1/withdraw. Only the domain name differs ("Arcus Transfer" vs "Arcus Withdraw").Complete eth_signTypedData_v4 call (ethers v6 / viem)
// ethers v6 — chainId / verifyingContract per the /v1/withdraw tableconst domain = { name: "Arcus Transfer", version: "1", chainId, // e.g. 4663 on production (see /v1/withdraw) verifyingContract, // BridgeVault for that chain (see /v1/withdraw)};const types = { Transfer: [ { name: "ethereumAddress", type: "address" }, { name: "fromAccountIndex", type: "uint8" }, { name: "toAccountIndex", type: "uint8" }, { name: "amount", type: "uint256" }, { name: "nonce", type: "string" } ]};const message = { ethereumAddress: "0xYourAddress", fromAccountIndex: 0, toAccountIndex: 1, amount: BigInt("100000000000"), // quote quantums nonce: "1730000000000000000"};const sig = await signer.signTypedData(domain, types, message);const r = sig.slice(0, 66);const s = "0x" + sig.slice(66, 130);const v = "0x" + sig.slice(130, 132);
The v component must be 0x1b (27) or 0x1c (28); wallets that return 0 / 1 should have 27 added before sending.
Signing the request (API-key mode)
The X-Signature header carries a lowercase-hex Ed25519 signature over the TransferV1 typed canonical payload — the same compact key-sorted-JSON convention as placeOrder. The payload is built from parsed request values (never raw body bytes):
Keys are strictly alphabetical (ad, af, at, ct, n, op, q, v) with no whitespace. ct must equal the X-Timestamp header value (nanosecond epoch), binding the signature to the drift window; op is fixed at 6 (transfer — a signature for any other operation can never authorize a transfer, and a transfer signature can never authorize any other operation); both af and at are signed, so the destination cannot be swapped after signing; q is the integer quote-quantum amount (same value as the amount field, unquoted); n is the body nonce signed verbatim.Example (payload → signature):
Replay protection is two-layered on this mode: the X-Timestamp drift window bounds how long a captured signature stays valid, and the nonce is single-use per (ethereumAddress, fromAccountIndex, toAccountIndex) exactly as on the wallet-signed mode (409 on reuse).
Authorizations
X-API-Key
string
header
required
Hex-encoded Ed25519 public key (64 chars). The public key IS the API key — register it via POST /createApiKey. Required on every authenticated request, both read-only and signed.
X-Timestamp
string
header
required
Unix time in nanoseconds as a decimal string (e.g. "1713825891591000000"). Millisecond or second epochs are rejected with 401 Unauthorized. Must be within ±30,000 ms of server wall-clock, or the request is rejected with 401 Unauthorized. Required on all mutating / credential-creating endpoints. This same value must appear as the ct field in the ordersign typed canonical payload (single-order endpoints) or in each element's ct field (batch endpoints).
Single-order endpoints (placeOrder, cancelOrder, modifyOrder, and other non-batch mutating routes) sign over the ordersign typed canonical payload — a compact, key-sorted JSON object built from parsed request fields using engine-native integer values:
placeOrder: {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,"g":N,"m":N,"op":1,"p":N,"q":N,"r":0|1,"s":N,"t":N,"v":1} cancelOrder: {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,[,"id":"…"],"m":N,"op":2,"v":1} modifyOrder: {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,"g":N,[,"id":"…"],"m":N,"op":3,"p":N,"q":N,"r":0|1,"s":N,"t":N,"v":1} (exactly one of id / c)
ct must equal the X-Timestamp header value. Keys in brackets are conditional (omitted when empty). op values: 1=place, 2=cancel, 3=modify. See the ordersign package for field definitions and reference signing code.
Other signed routes (e.g. createApiKey) still use the legacy scheme: signing_message = X-Timestamp + ACTION + canonicalJSON(body), where ACTION is the camelCase final path segment.
Batch endpoints (batchPlaceOrders, batchCancelOrders, batchModifyOrders) do NOT use this header. They authenticate with per-element typed ordersign signatures embedded in the request body (see the global auth description and the per-field signature descriptions on OrderRequest / CancelOrderRequest / ModifyOrderRequest).
Read endpoints are authenticated by ?address= (and optionally X-API-Key) only — no signature is required, except for the signed affiliate reads (see the Referral tag), which require the full header triple; with no body their signing message is X-Timestamp + ACTION. canonicalJSON(body) is the JSON body with object keys sorted lexicographically at every level and no whitespace; the server canonicalizes the received body before verifying, so only the bytes signed over must be canonical. Required on all mutating / credential-creating endpoints.
Body
application/json
ethereumAddress
string
required
Master EVM address that owns both the source and destination accounts. In v0 an internal transfer is same-wallet only: the funds move between two account indexes of this one address — there is no cross-wallet recipient field.
Pattern: ^(0x|0X)?[0-9a-fA-F]{40}$
Example:
"0x742d35cc6634c0532925a3b844bc9e7595f2bd18"
fromAccountIndex
integer
required
Account index to debit.
Required range: 0 <= x <= 9
toAccountIndex
integer
required
Account index to credit. Must differ from fromAccountIndex; a transfer to the same index is rejected with HTTP 400.
Required range: 0 <= x <= 9
amount
string
required
Amount to transfer, as a base-10 integer string in quote quantums (1e9 = $1; for example, 1000000000 represents $1). Amounts must be positive and fit in a signed 64-bit integer. Unlike withdrawals, an internal transfer never settles on-chain, so the amount is NOT constrained to collateral-base-unit multiples. Float-style decimals are rejected. The source account must have sufficient free collateral or the transfer is rejected asynchronously with REJECTED_INSUFFICIENT_COLLATERAL.
Pattern: ^[0-9]+$
Example:
"100000000000"
nonce
string
required
Replay-protection nonce, single-use per (ethereumAddress, fromAccountIndex, toAccountIndex) — a repeated nonce is rejected with 409. Send the current time as nanoseconds since the Unix epoch (a plain base-10 integer, e.g. 1730000000000000000); the server accepts a timestamp up to 48 hours in the past by default and up to 24 hours in the future by default — both bounds are configurable per environment. A legacy opaque nonce (e.g. a UUID) is still accepted but deprecated. At most 64 characters.
Required string length: 1 - 64
Example:
"1730000000000000000"
signature
object
secp256k1 EIP-712 typed-data signature (r, s, v) over the Transfer payload (eth_signTypedData_v4). See the POST /v1/transfer endpoint description for the exact domain, types, and message. Produced by the wallet that owns ethereumAddress; requests whose recovered signer does not match are rejected with HTTP 401. Required on the default wallet-signed mode; omit it when authenticating with the X-API-Key / X-Timestamp / X-Signature header triple (the header signature is the proof on that mode).
Show child attributes
Response
Transfer accepted and queued to the matching engine. The body carries status: PENDING and a transferId; the terminal outcome is delivered on the account transfer update stream.
transferId
string
required
Server-generated identifier (UUID) correlating this transfer with the matching AccountTransferUpdate on the account transfer update stream.
Example:
"b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"
ethereumAddress
string
required
20-byte EVM address as hex: optional 0x or 0X prefix and exactly 40 hexadecimal digits. API responses normalize to lowercase a–f after 0x.
Pattern: ^(0x|0X)?[0-9a-fA-F]{40}$
fromAccountIndex
integer
required
Account index (account index, 0–9). Identifies the account for orders, positions, fills, and API keys.
Required range: 0 <= x <= 9
toAccountIndex
integer
required
Account index (account index, 0–9). Identifies the account for orders, positions, fills, and API keys.
Required range: 0 <= x <= 9
amount
string
required
Transfer amount echoed back as a human-readable decimal in quote currency (quote resolution 1e9), matching how the amount is reported on the account transfer update feed.
Examples:
"100"
"1.5"
status
enum<string>
required
Synchronous status of a submitted transfer. Always PENDING on the 202 response — the transfer has been queued to the matching engine but not yet applied. The terminal outcome (APPLIED, REJECTED_INSUFFICIENT_COLLATERAL, ...) is delivered asynchronously on the account transfer update stream (see AccountTransferUpdate).
Available options:
PENDING
submittedAt
integer<int64>
required
Server receive timestamp (epoch microseconds).
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Arcus Docs","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/arcus-11aecf6e/Pw2ZUiZemhLSrOMO/logo/light.svg?fit=max\u0026auto=format\u0026n=Pw2ZUiZemhLSrOMO\u0026q=85\u0026s=9bbd1de2de2a31d08c50e0d58bdac466","dark":"https://mintcdn.com/arcus-11aecf6e/Pw2ZUiZemhLSrOMO/logo/dark.svg?fit=max\u0026auto=format\u0026n=Pw2ZUiZemhLSrOMO\u0026q=85\u0026s=811a9395d1f3457230f9f5defa23c9d0"},"favicon":"https://mintcdn.com/arcus-11aecf6e/cwobDWFqGCQyNAqW/favicon.svg?fit=max\u0026auto=format\u0026n=cwobDWFqGCQyNAqW\u0026q=85\u0026s=c3d0e980a4a9fe344d7143e7f3c18caf","navbar":{"links":[{"href":"https://help.arcus.xyz","label":"Help Center"}],"primary":{"type":"button","label":"Go to Arcus","href":"https://app.arcus.xyz"}},"integrations":{"ga4":{"measurementId":"G-1232GKGLVQ"},"intercom":{"appId":"fdd72bam"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"arcus-11aecf6e","hasAudioNarration":false,"actualSubdomain":"arcus-11aecf6e","customDomains":["docs.arcus.xyz"],"gitSource":{"type":"github","owner":"dydxprotocol","repo":"v5-documentation","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af6b1f7aa6a9b02a8ca4e72","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"API reference","count":99},{"language":"default","tag":"Endpoints","count":69},{"language":"default","tag":"Public","count":36},{"language":"default","tag":"WebSocket","count":22},{"language":"default","tag":"Concepts","count":20},{"language":"default","tag":"Referral","count":17},{"language":"default","tag":"Exchange","count":13},{"language":"default","tag":"Market data","count":11},{"language":"default","tag":"Guides","count":10},{"language":"default","tag":"Perpetuals","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"starterQuestions":[{"_id":"6a0c053228609ad420f986bc","deploymentId":"69f19afe69cb5ad533409b0a","questionText":"How do I place an order","status":"active","generatedBy":"manual","createdAt":"2026-05-19T06:37:38.436Z","updatedAt":"2026-05-19T06:37:38.436Z","__v":0}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/exchange/submit-internal-transfer","slug":"/api-reference/exchange/submit-internal-transfer","pageMetadata":{"title":"Submit internal transfer","description":"Move collateral between two account indexes of the **same wallet**.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/transfer","href":"/api-reference/exchange/submit-internal-transfer","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Move collateral between two account indexes of the \", _jsx(_components.strong, {\n children: \"same wallet\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsxs(Note,{children:[_jsx(_components.strong,{children:`The response body shown here is a static example, not live data.`}),` After you click `,_jsx(_components.strong,{children:`Send`}),`, your live result appears in a separate panel headed `,_jsx(_components.strong,{children:`200 OK`}),`. The panel under the status-code tabs is a fixed sample from the spec — its field values (fees, prices, sizes, IDs, timestamps) are placeholders. Use `,_jsx(_components.strong,{children:`Send`}),`, or call the endpoint, for current values.`]}),`\n`,_jsxs(_components.p,{children:[`Move collateral between two account indexes of the `,_jsx(_components.strong,{children:`same wallet`}),`. In v0 transfers are same-wallet only: both `,_jsx(_components.code,{children:`fromAccountIndex`}),` and `,_jsx(_components.code,{children:`toAccountIndex`}),` belong to `,_jsx(_components.code,{children:`ethereumAddress`}),`, so there is no cross-wallet recipient field. Funds never leave custody, so nothing settles on-chain.`]}),`\n`,_jsxs(_components.p,{children:[`Two mutually exclusive authentication modes are supported, selected by the presence of the `,_jsx(_components.code,{children:`X-API-Key`}),` header:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Wallet-signed (default):`}),` the request is self-authenticated by a secp256k1 `,_jsx(_components.strong,{children:`EIP-712`}),` typed-data signature in the body’s `,_jsx(_components.code,{children:`signature`}),` field — no `,_jsx(_components.code,{children:`X-API-Key`}),` / `,_jsx(_components.code,{children:`X-Signature`}),` headers.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`API-key-signed:`}),` the request carries the `,_jsx(_components.code,{children:`X-API-Key`}),` / `,_jsx(_components.code,{children:`X-Timestamp`}),` / `,_jsx(_components.code,{children:`X-Signature`}),` header triple with an Ed25519 signature over the `,_jsx(_components.code,{children:`TransferV1`}),` typed canonical payload (see below); the body `,_jsx(_components.code,{children:`signature`}),` field is then omitted. The key must be bound to `,_jsx(_components.code,{children:`ethereumAddress`}),`, and a key scoped to a single subaccount may set only that subaccount as `,_jsx(_components.code,{children:`fromAccountIndex`}),` (a key scoped to all subaccounts of its wallet may use any). `,_jsx(_components.strong,{children:`No special permission is required`}),` — moving funds between a wallet’s own subaccounts carries the same authority as trading, which every valid key already has for its scope. The destination is another subaccount of the same wallet, so no separate recipient authorization applies.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`response-behavior`,children:`Response behavior`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Asynchronous.`}),` A `,_jsx(_components.code,{children:`202 Accepted`}),` means the transfer passed validation and was queued to the matching engine with `,_jsx(_components.code,{children:`status: PENDING`}),`. The definitive outcome (applied, or rejected for insufficient free collateral) is delivered asynchronously — poll `,_jsx(_components.code,{children:`GET /v1/accountTransferUpdates`}),` or subscribe to the account transfer update WebSocket channel and correlate on `,_jsx(_components.code,{children:`transferId`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`signing-the-request-wallet-mode`,children:`Signing the request (wallet mode)`}),`\n`,_jsxs(_components.p,{children:[`Transfers use `,_jsx(_components.strong,{children:`EIP-712 typed data`}),` (`,_jsx(_components.code,{children:`eth_signTypedData_v4`}),`). Sign this typed data with the wallet that owns `,_jsx(_components.code,{children:`ethereumAddress`}),`, then split the 65-byte result into `,_jsx(_components.code,{children:`{r, s, v}`}),` for the `,_jsx(_components.code,{children:`signature`}),` field. The gateway recovers the signer and rejects mismatches with HTTP 401.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Domain`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"name\": \"Arcus Transfer\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"version\": \"1\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"chainId\": \u003crootchain chain id, e.g. 4663>,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"verifyingContract\": \"\u003cBridgeVault address for that chain>\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Types`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Transfer(address ethereumAddress,uint8 fromAccountIndex,uint8 toAccountIndex,uint256 amount,string nonce)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Message`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`8`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"ethereumAddress\": \"\u003cethereumAddress>\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"fromAccountIndex\": \u003cfromAccountIndex>,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"toAccountIndex\": \u003ctoAccountIndex>,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"amount\": \"\u003camount>\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"nonce\": \"\u003cnonce>\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`amount`}),` is the integer collateral quote-quantum amount (same value as the `,_jsx(_components.code,{children:`amount`}),` request field).`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Per-environment domain parameters.`}),` `,_jsx(_components.code,{children:`chainId`}),` and `,_jsx(_components.code,{children:`verifyingContract`}),` are identical to the withdraw domain — see the per-environment table under `,_jsx(_components.code,{children:`POST /v1/withdraw`}),`. Only the domain `,_jsx(_components.code,{children:`name`}),` differs (`,_jsx(_components.code,{children:`\"Arcus Transfer\"`}),` vs `,_jsx(_components.code,{children:`\"Arcus Withdraw\"`}),`).`]}),`\n`,_jsx(_components.p,{children:_jsxs(_components.strong,{children:[`Complete `,_jsx(_components.code,{children:`eth_signTypedData_v4`}),` call (ethers v6 / viem)`]})}),`\n`,_jsx(CodeBlock,{numberOfLines:`27`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`27`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ethers v6 — chainId / verifyingContract per the /v1/withdraw table`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` domain`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Arcus Transfer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` version:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` chainId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// e.g. 4663 on production (see /v1/withdraw)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` verifyingContract`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// BridgeVault for that chain (see /v1/withdraw)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`};`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` types`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Transfer:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ethereumAddress\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"address\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"fromAccountIndex\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"uint8\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"toAccountIndex\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"uint8\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"amount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"uint256\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"nonce\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"string\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`};`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` message`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` ethereumAddress:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"0xYourAddress\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` fromAccountIndex:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` toAccountIndex:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` amount:`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` BigInt`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"100000000000\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// quote quantums`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` nonce:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"1730000000000000000\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`};`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` sig`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` signer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`signTypedData`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`types`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`message`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` r`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` sig`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`slice`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`66`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` s`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"0x\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` sig`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`slice`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`66`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`130`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` v`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"0x\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` sig`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`slice`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`130`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`132`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// viem`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` sig`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` walletClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`signTypedData`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`types`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`primaryType:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Transfer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`message`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`v`}),` component must be `,_jsx(_components.code,{children:`0x1b`}),` (27) or `,_jsx(_components.code,{children:`0x1c`}),` (28); wallets that return `,_jsx(_components.code,{children:`0`}),` / `,_jsx(_components.code,{children:`1`}),` should have 27 added before sending.`]}),`\n`,_jsx(Heading,{level:`2`,id:`signing-the-request-api-key-mode`,children:`Signing the request (API-key mode)`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`X-Signature`}),` header carries a lowercase-hex Ed25519 signature over the `,_jsx(_components.code,{children:`TransferV1`}),` typed canonical payload — the same compact key-sorted-JSON convention as `,_jsx(_components.code,{children:`placeOrder`}),`. The payload is built from parsed request values (never raw body bytes):`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{\"ad\":\"\u003cethereumAddress, lowercase 0x hex>\",\"af\":\u003cfromAccountIndex>,\"at\":\u003ctoAccountIndex>,\"ct\":\u003cX-Timestamp value, ns>,\"n\":\"\u003cnonce, verbatim>\",\"op\":6,\"q\":\u003camount, integer quote quantums>,\"v\":1}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Keys are strictly alphabetical (`,_jsx(_components.code,{children:`ad`}),`, `,_jsx(_components.code,{children:`af`}),`, `,_jsx(_components.code,{children:`at`}),`, `,_jsx(_components.code,{children:`ct`}),`, `,_jsx(_components.code,{children:`n`}),`, `,_jsx(_components.code,{children:`op`}),`, `,_jsx(_components.code,{children:`q`}),`, `,_jsx(_components.code,{children:`v`}),`) with no whitespace. `,_jsx(_components.code,{children:`ct`}),` must equal the `,_jsx(_components.code,{children:`X-Timestamp`}),` header value (nanosecond epoch), binding the signature to the drift window; `,_jsx(_components.code,{children:`op`}),` is fixed at `,_jsx(_components.code,{children:`6`}),` (transfer — a signature for any other operation can never authorize a transfer, and a transfer signature can never authorize any other operation); both `,_jsx(_components.code,{children:`af`}),` and `,_jsx(_components.code,{children:`at`}),` are signed, so the destination cannot be swapped after signing; `,_jsx(_components.code,{children:`q`}),` is the integer quote-quantum amount (same value as the `,_jsx(_components.code,{children:`amount`}),` field, unquoted); `,_jsx(_components.code,{children:`n`}),` is the body `,_jsx(_components.code,{children:`nonce`}),` signed verbatim.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example (payload → signature):`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`payload = {\"ad\":\"0x1234123412341234123412341234123412341234\",\"af\":0,\"at\":1,\"ct\":1718644999000000000,\"n\":\"1718644999000\",\"op\":6,\"q\":100000000000,\"v\":1}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`X-Signature = hex(ed25519_sign(privateKey, payload))`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Replay protection is two-layered on this mode: the `,_jsx(_components.code,{children:`X-Timestamp`}),` drift window bounds how long a captured signature stays valid, and the `,_jsx(_components.code,{children:`nonce`}),` is single-use per `,_jsx(_components.code,{children:`(ethereumAddress, fromAccountIndex, toAccountIndex)`}),` exactly as on the wallet-signed mode (409 on reuse).`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Submit internal transfer","description":"Move collateral between two account indexes of the **same wallet**.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/transfer","href":"/api-reference/exchange/submit-internal-transfer","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Response behavior","slug":"response-behavior","depth":3,"children":[]},{"title":"Signing the request (wallet mode)","slug":"signing-the-request-wallet-mode","depth":2,"children":[]},{"title":"Signing the request (API-key mode)","slug":"signing-the-request-api-key-mode","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Submit internal transfer","description":"Move collateral between two account indexes of the **same wallet**.","operationId":"transfer","tags":["Exchange"],"security":["87a95d17-20cc-4f3f-83b9-90e9c772a7ce","44688300-15e1-4125-8175-c9eea65f9c64"],"requestBody":"e38e0fe1-4113-463e-9481-c7e3dbb02c2b","responses":{"202":"2ab65ed2-f47d-4d15-bc6a-e5113e80ba5b","400":"de5c2890-dad5-4af4-abe6-615416ca9395","401":"52271993-07db-4380-8d38-9cc1864a5697","403":"f67a0879-cf60-442d-903c-64e0bea4bd07","409":"dab84998-86c2-4401-b7a9-2fff0e7dc1ef","429":"67812d92-eebb-4679-b6b9-fc569fa4c26e","500":"75e2ba5a-56dc-4071-8d80-3b1562483241"},"x-mint":{"content":"\u003cNote>**The response body shown here is a static example, not live data.** After you click **Send**, your live result appears in a separate panel headed **200 OK**. The panel under the status-code tabs is a fixed sample from the spec — its field values (fees, prices, sizes, IDs, timestamps) are placeholders. Use **Send**, or call the endpoint, for current values.\u003c/Note>\n\nMove collateral between two account indexes of the **same wallet**. In v0 transfers are same-wallet only: both `fromAccountIndex` and `toAccountIndex` belong to `ethereumAddress`, so there is no cross-wallet recipient field. Funds never leave custody, so nothing settles on-chain.\n\nTwo mutually exclusive authentication modes are supported, selected by the presence of the `X-API-Key` header:\n\n- **Wallet-signed (default):** the request is self-authenticated by a secp256k1 **EIP-712** typed-data signature in the body's `signature` field — no `X-API-Key` / `X-Signature` headers.\n- **API-key-signed:** the request carries the `X-API-Key` / `X-Timestamp` / `X-Signature` header triple with an Ed25519 signature over the `TransferV1` typed canonical payload (see below); the body `signature` field is then omitted. The key must be bound to `ethereumAddress`, and a key scoped to a single subaccount may set only that subaccount as `fromAccountIndex` (a key scoped to all subaccounts of its wallet may use any). **No special permission is required** — moving funds between a wallet's own subaccounts carries the same authority as trading, which every valid key already has for its scope. The destination is another subaccount of the same wallet, so no separate recipient authorization applies.\n\n### Response behavior\n\n**Asynchronous.** A `202 Accepted` means the transfer passed validation and was queued to the matching engine with `status: PENDING`. The definitive outcome (applied, or rejected for insufficient free collateral) is delivered asynchronously — poll `GET /v1/accountTransferUpdates` or subscribe to the account transfer update WebSocket channel and correlate on `transferId`.\n\n## Signing the request (wallet mode)\n\nTransfers use **EIP-712 typed data** (`eth_signTypedData_v4`). Sign this typed data with the wallet that owns `ethereumAddress`, then split the 65-byte result into `{r, s, v}` for the `signature` field. The gateway recovers the signer and rejects mismatches with HTTP 401.\n\n**Domain**\n\n```\n{\n \"name\": \"Arcus Transfer\",\n \"version\": \"1\",\n \"chainId\": \u003crootchain chain id, e.g. 4663>,\n \"verifyingContract\": \"\u003cBridgeVault address for that chain>\"\n}\n```\n\n**Types**\n\n```\nTransfer(address ethereumAddress,uint8 fromAccountIndex,uint8 toAccountIndex,uint256 amount,string nonce)\n```\n\n**Message**\n\n```\n{\n \"ethereumAddress\": \"\u003cethereumAddress>\",\n \"fromAccountIndex\": \u003cfromAccountIndex>,\n \"toAccountIndex\": \u003ctoAccountIndex>,\n \"amount\": \"\u003camount>\",\n \"nonce\": \"\u003cnonce>\"\n}\n```\n\n`amount` is the integer collateral quote-quantum amount (same value as the `amount` request field).\n\n**Per-environment domain parameters.** `chainId` and `verifyingContract` are identical to the withdraw domain — see the per-environment table under `POST /v1/withdraw`. Only the domain `name` differs (`\"Arcus Transfer\"` vs `\"Arcus Withdraw\"`).\n\n**Complete `eth_signTypedData_v4` call (ethers v6 / viem)**\n\n```js\n// ethers v6 — chainId / verifyingContract per the /v1/withdraw table\nconst domain = {\n name: \"Arcus Transfer\",\n version: \"1\",\n chainId, // e.g. 4663 on production (see /v1/withdraw)\n verifyingContract, // BridgeVault for that chain (see /v1/withdraw)\n};\nconst types = {\n Transfer: [\n { name: \"ethereumAddress\", type: \"address\" },\n { name: \"fromAccountIndex\", type: \"uint8\" },\n { name: \"toAccountIndex\", type: \"uint8\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"nonce\", type: \"string\" }\n ]\n};\nconst message = {\n ethereumAddress: \"0xYourAddress\",\n fromAccountIndex: 0,\n toAccountIndex: 1,\n amount: BigInt(\"100000000000\"), // quote quantums\n nonce: \"1730000000000000000\"\n};\nconst sig = await signer.signTypedData(domain, types, message);\nconst r = sig.slice(0, 66);\nconst s = \"0x\" + sig.slice(66, 130);\nconst v = \"0x\" + sig.slice(130, 132);\n```\n\n```ts\n// viem\nconst sig = await walletClient.signTypedData({ domain, types, primaryType: \"Transfer\", message });\n```\n\nThe `v` component must be `0x1b` (27) or `0x1c` (28); wallets that return `0` / `1` should have 27 added before sending.\n\n## Signing the request (API-key mode)\n\nThe `X-Signature` header carries a lowercase-hex Ed25519 signature over the `TransferV1` typed canonical payload — the same compact key-sorted-JSON convention as `placeOrder`. The payload is built from parsed request values (never raw body bytes):\n\n```\n{\"ad\":\"\u003cethereumAddress, lowercase 0x hex>\",\"af\":\u003cfromAccountIndex>,\"at\":\u003ctoAccountIndex>,\"ct\":\u003cX-Timestamp value, ns>,\"n\":\"\u003cnonce, verbatim>\",\"op\":6,\"q\":\u003camount, integer quote quantums>,\"v\":1}\n```\n\nKeys are strictly alphabetical (`ad`, `af`, `at`, `ct`, `n`, `op`, `q`, `v`) with no whitespace. `ct` must equal the `X-Timestamp` header value (nanosecond epoch), binding the signature to the drift window; `op` is fixed at `6` (transfer — a signature for any other operation can never authorize a transfer, and a transfer signature can never authorize any other operation); both `af` and `at` are signed, so the destination cannot be swapped after signing; `q` is the integer quote-quantum amount (same value as the `amount` field, unquoted); `n` is the body `nonce` signed verbatim.\n\n**Example (payload → signature):**\n\n```\npayload = {\"ad\":\"0x1234123412341234123412341234123412341234\",\"af\":0,\"at\":1,\"ct\":1718644999000000000,\"n\":\"1718644999000\",\"op\":6,\"q\":100000000000,\"v\":1}\nX-Signature = hex(ed25519_sign(privateKey, payload))\n```\n\nReplay protection is two-layered on this mode: the `X-Timestamp` drift window bounds how long a captured signature stays valid, and the `nonce` is single-use per `(ethereumAddress, fromAccountIndex, toAccountIndex)` exactly as on the wallet-signed mode (409 on reuse)."},"method":"post","type":"path","servers":["8bcbded4-ced7-41f7-9103-ef78afb86c4b","db341041-78f8-47d5-bb08-4c97d4cfedb3"],"path":"/v1/transfer","baseUrlOptions":["https://api.arcus.xyz","https://api.testnet.arcus.xyz"],"title":"Submit internal transfer","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ethereumAddress","fromAccountIndex","toAccountIndex","amount","nonce"],"properties":{"ethereumAddress":{"type":"string","pattern":"^(0x|0X)?[0-9a-fA-F]{40}$","description":"Master EVM address that owns both the source and destination accounts. In v0 an internal transfer is same-wallet only: the funds move between two account indexes of this one address — there is no cross-wallet recipient field.","examples":["0x742d35cc6634c0532925a3b844bc9e7595f2bd18"],"isRequired":true,"uniqueKey":"ethereumAddress","typeLabel":"string"},"fromAccountIndex":{"type":"integer","minimum":0,"maximum":9,"description":"Account index to debit.","isRequired":true,"uniqueKey":"fromAccountIndex","typeLabel":"integer"},"toAccountIndex":{"type":"integer","minimum":0,"maximum":9,"description":"Account index to credit. Must differ from `fromAccountIndex`; a transfer to the same index is rejected with HTTP 400.","isRequired":true,"uniqueKey":"toAccountIndex","typeLabel":"integer"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"Amount to transfer, as a base-10 integer string in quote quantums (1e9 = $1; for example, 1000000000 represents $1). Amounts must be positive and fit in a signed 64-bit integer. Unlike withdrawals, an internal transfer never settles on-chain, so the amount is NOT constrained to collateral-base-unit multiples. Float-style decimals are rejected. The source account must have sufficient free collateral or the transfer is rejected asynchronously with `REJECTED_INSUFFICIENT_COLLATERAL`.","examples":["100000000000"],"isRequired":true,"uniqueKey":"amount","typeLabel":"string"},"nonce":{"type":"string","minLength":1,"maxLength":64,"description":"Replay-protection nonce, single-use per `(ethereumAddress, fromAccountIndex, toAccountIndex)` — a repeated nonce is rejected with 409. Send the current time as nanoseconds since the Unix epoch (a plain base-10 integer, e.g. `1730000000000000000`); the server accepts a timestamp up to 48 hours in the past by default and up to 24 hours in the future by default — both bounds are configurable per environment. A legacy opaque nonce (e.g. a UUID) is still accepted but deprecated. At most 64 characters.","examples":["1730000000000000000"],"isRequired":true,"uniqueKey":"nonce","typeLabel":"string"},"signature":{"type":"object","description":"secp256k1 **EIP-712** typed-data signature `(r, s, v)` over the `Transfer` payload (`eth_signTypedData_v4`). See the `POST /v1/transfer` endpoint description for the exact domain, types, and message. Produced by the wallet that owns `ethereumAddress`; requests whose recovered signer does not match are rejected with HTTP 401. Required on the default wallet-signed mode; omit it when authenticating with the `X-API-Key` / `X-Timestamp` / `X-Signature` header triple (the header signature is the proof on that mode).","required":["r","s","v"],"properties":{"r":{"type":"string","pattern":"^(?=.*[1-9a-fA-F])(0x)?[0-9a-fA-F]{1,64}$","minLength":1,"maxLength":66,"description":"Hex-encoded r component of the secp256k1 signature (up to 32 bytes; leading zeros may be omitted, but the value must be non-zero).","examples":["0x69e7308419769592ec8363d002e3077e803e403b4e1920fc30e485b63d76e2a3"],"isRequired":true,"uniqueKey":"signature.r","typeLabel":"string"},"s":{"type":"string","pattern":"^(?=.*[1-9a-fA-F])(0x)?[0-9a-fA-F]{1,64}$","minLength":1,"maxLength":66,"description":"Hex-encoded s component of the secp256k1 signature (up to 32 bytes; leading zeros may be omitted, but the value must be non-zero).","examples":["0x0980d0742c9e65037af9d54e559704ae2c2285f3112a9d89544191a740f103cf"],"isRequired":true,"uniqueKey":"signature.s","typeLabel":"string"},"v":{"type":"string","pattern":"^(0x)?[0-9a-fA-F]{1,8}$","minLength":1,"maxLength":10,"description":"Hex-encoded recovery byte (`v`). Accepts any standard Ethereum encoding: raw recovery id (`0x00` / `0x01`), legacy (`0x1b` / `0x1c`), or EIP-155 chain-bound values; the gateway normalizes internally. Most wallet signing APIs (`eth_signTypedData_v4`, `personal_sign`) emit `0x1b`/`0x1c`.","examples":["0x1c"],"isRequired":true,"uniqueKey":"signature.v","typeLabel":"string"}},"uniqueKey":"signature","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"ethereumAddress":"0x742d35cc6634c0532925a3b844bc9e7595f2bd18","fromAccountIndex":4,"toAccountIndex":4,"amount":"100000000000","nonce":"1730000000000000000"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"2ab65ed2-f47d-4d15-bc6a-e5113e80ba5b":{"description":"Transfer accepted and queued to the matching engine. The body carries `status: PENDING` and a `transferId`; the terminal outcome is delivered on the account transfer update stream.\n","content":{"application/json":{"schema":{"type":"object","required":["transferId","ethereumAddress","fromAccountIndex","toAccountIndex","amount","status","submittedAt"],"properties":{"transferId":{"type":"string","description":"Server-generated identifier (UUID) correlating this transfer with the matching `AccountTransferUpdate` on the account transfer update stream.","examples":["b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"],"isRequired":true,"uniqueKey":"transferId","typeLabel":"string"},"ethereumAddress":{"type":"string","pattern":"^(0x|0X)?[0-9a-fA-F]{40}$","description":"20-byte EVM address as hex: optional `0x` or `0X` prefix and exactly 40 hexadecimal digits. API responses normalize to lowercase `a`–`f` after `0x`.\n","isRequired":true,"uniqueKey":"ethereumAddress","typeLabel":"string"},"fromAccountIndex":{"type":"integer","minimum":0,"maximum":9,"description":"Account index (account index, 0–9). Identifies the account for orders, positions, fills, and API keys.","isRequired":true,"uniqueKey":"fromAccountIndex","typeLabel":"integer"},"toAccountIndex":{"type":"integer","minimum":0,"maximum":9,"description":"Account index (account index, 0–9). Identifies the account for orders, positions, fills, and API keys.","isRequired":true,"uniqueKey":"toAccountIndex","typeLabel":"integer"},"amount":{"type":"string","description":"Transfer amount echoed back as a human-readable decimal in quote currency (quote resolution 1e9), matching how the amount is reported on the account transfer update feed.","examples":["100","1.5"],"isRequired":true,"uniqueKey":"amount","typeLabel":"string"},"status":{"type":"string","enum":["PENDING"],"description":"Synchronous status of a submitted transfer. Always `PENDING` on the `202` response — the transfer has been queued to the matching engine but not yet applied. The terminal outcome (`APPLIED`, `REJECTED_INSUFFICIENT_COLLATERAL`, ...) is delivered asynchronously on the account transfer update stream (see `AccountTransferUpdate`).","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"submittedAt":{"type":"integer","format":"int64","description":"Server receive timestamp (epoch microseconds).","isRequired":true,"uniqueKey":"submittedAt","typeLabel":"integer\u003cint64>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"transferId":"b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","ethereumAddress":"\u003cstring>","fromAccountIndex":4,"toAccountIndex":4,"amount":"100","status":"PENDING","submittedAt":123}}},"exampleType":"generated"}},"exampleType":"generated"},"de5c2890-dad5-4af4-abe6-615416ca9395":{"description":"Validation error: missing `ethereumAddress` / `amount` / `nonce`, missing `signature` on the wallet-signed mode (not required on the API-key mode), an account index out of range, `toAccountIndex` equal to `fromAccountIndex`, amount not a positive base-10 integer, overflowing int64, malformed Ethereum address, a malformed `(r, s, v)` signature, or a nanosecond-timestamp nonce that is not in nanoseconds or falls outside the accepted drift window.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","examples":["Invalid request body"],"isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable error code for generic (non-order) rejections. Present on geo-restriction blocks; clients should key product-availability UI off this rather than the human `error` string.\n\n| Value | Meaning |\n|------------------|---------|\n| `GEO_RESTRICTED` | The action is not available from the caller's country/region for this product (perps and/or spot). Reads remain available; only state-changing actions are blocked. |\n","enum":["GEO_RESTRICTED"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"errorSource":{"type":"string","description":"Scopes the failure to a specific operation. Present on structured order errors (place / cancel / modify flows); absent on generic HTTP errors.\n","enum":["Order","Cancel"],"uniqueKey":"errorSource","typeLabel":"enum\u003cstring>"},"errorType":{"type":"string","description":"Machine-readable reason for the API-layer rejection. Present alongside `errorSource` on structured order errors; absent on generic HTTP errors.\n\n| Value | Meaning |\n|-------------------|---------|\n| `Tick` | Price or size does not align to the market's tick size / step size. |\n| `InvalidRequest` | A request field failed validation (bad address, unknown market, invalid enum, etc.). TPSL-specific causes: `stopPrice` required when `tpslType` is set; `tpslType` must be `STOP_LOSS` or `TAKE_PROFIT`; `reduceOnly` must be `true` for TPSL orders; trigger price must not sit on the wrong side of the current mark (would fire immediately); batch grouping/shape constraints violated (wrong order count, missing or duplicate `tpslType` legs). |\n| `OracleDeviation` | The order's price deviates from the current oracle price by more than the allowed threshold. Adjust the price closer to the oracle and resubmit. |\n| `ReduceOnly` | A reduce-only order was rejected because filling it would open or increase the account's position rather than reduce it. |\n| `Unavailable` | The requested operation (place / cancel) is temporarily disabled. |\n| `Unauthorized` | API key or trading-identity check failed. |\n| `Forbidden` | The authenticated key is not permitted to perform the requested operation. |\n| `NotImplemented` | The requested capability is not yet available on this path (e.g. TPSL over WebSocket). |\n| `Transmission` | The gateway accepted and validated the request but could not deliver it to the matching engine. Retry. |\n| `Internal` | Unexpected gateway-side failure unrelated to transmission. |\n","enum":["Tick","InvalidRequest","OracleDeviation","ReduceOnly","Unavailable","Unauthorized","Forbidden","NotImplemented","Transmission","Internal"],"uniqueKey":"errorType","typeLabel":"enum\u003cstring>"},"rejectionReason":{"type":"string","description":"Machine-readable engine-level rejection code. Present on `OrderResponse` / `BatchOrderItemResponse` when `status` is `REJECTED` on the synchronous `200` path (i.e. the gateway already had a definitive engine reject before responding). Absent on `202` responses and on HTTP error bodies — in those cases rejection reasons are delivered asynchronously via the `orders` WebSocket channel.\n\n| Value | Meaning |\n|------------------------------------|---------|\n| `POST_ONLY_WOULD_CROSS` | Post-only order would have crossed the book and taken liquidity. |\n| `SELF_TRADE` | Order would match against the account's own resting order; blocked by self-trade prevention. |\n| `UNDERCOLLATERALIZED` | Account has insufficient free collateral / margin to support the order. |\n| `COULD_NOT_FILL` | Generic \"could not fill\" (legacy; prefer `IOC_CANCELED` / `FOK_FAILED`). |\n| `IOC_CANCELED` | IOC order produced zero fills and was canceled. |\n| `FOK_FAILED` | FOK order could not be fully filled at submission. |\n| `REDUCE_ONLY_WOULD_INCREASE` | reduce-only order would have opened or increased the position. |\n| `TOO_MANY_CLIENT_IDS` | Account already has 10,000 live `clientId`s (the per-account maximum). Cancel or let existing orders reach a terminal state to free slots before placing new ones with distinct `clientId`s. |\n| `DUPLICATE_CLIENT_ID` | Account already has an open order with the same `clientId`. |\n| `POSITION_TPSL_ALREADY_EXISTS` | A position-level TPSL of the same trigger class (TP or SL) already exists for this account+market. At most one TP and one SL per market. |\n| `ENTRY_TPSL_CANNOT_BE_POSITION_TPSL` | A TPSL bound to an entry order (`parentOrderId` set) cannot also be a position-level TPSL; entry-linked TPSLs are sized partial legs. |\n| `OPEN_ORDER_CAP_EXCEEDED` | Account has reached its per-account open-order cap; cancel a resting order or let one reach a terminal state before placing another. |\n| `FILL_WILL_EXCEED_TRADING_BOUND` | Outside regular trading hours, the order would fill at or beyond the active off-hours trading bound. Per-order rejection; in-band trading continues. |\n| `OPEN_INTEREST_CAP_EXCEEDED` | Market is at its operator-set open-interest cap and the order's next fill would have increased open interest. OI-neutral and OI-reducing orders still match. |\n| `ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT` | Deprecated — no longer emitted; replaced by `FILL_WILL_EXCEED_TRADING_BOUND`. |\n| `ORDER_NOT_FOUND` | `cancelOrder` referenced an order not on the orderbook (already filled, canceled, never placed, or owned by another account). |\n| `ORDER_NOT_FOUND_FOR_MODIFY` | `modifyOrder` referenced an order not on the regular orderbook; TPSL and untriggered orders cannot be modified. The rejected modify is also buffered briefly and applied if the target placement arrives shortly after. |\n| `MODIFY_CHANGED_IMMUTABLE_FIELD` | `modifyOrder` attempted to change an immutable field (`side`, `timeInForce`, `reduceOnly`, or `orderType`). |\n| `MODIFY_ZERO_SIZE` | `modifyOrder` specified a new size of zero or less. |\n| `POSITION_SIZE_CAP_EXCEEDED` | The order, modify, or resulting fill would exceed the per-market position notional cap. Distinct from `UNDERCOLLATERALIZED`: the account may be fully funded — the size is the problem. |\n| `MODIFY_TPSL_NOT_SUPPORTED` | `modifyOrder` targeted an untriggered TPSL order; TPSL trigger parameters cannot be changed via modify. A live TPSL survives unchanged; a buffered modify that meets an arriving TPSL placement cancels that placement as a precaution. |\n| `MODIFY_SUPERSEDED_BY_CANCEL` | `modifyOrder` was discarded because a `cancelOrder` for the same order is pending; cancels always dominate modifies and the order's final state is canceled. |\n| `MODIFY_SIZE_ALREADY_FILLED` | Under total-size modify semantics, `modifyOrder`'s new size (the order's new TOTAL size) is at or below the quantity already filled, leaving nothing to rest. The original order is canceled (a `CANCELED` update precedes this rejection). |\n","enum":["POST_ONLY_WOULD_CROSS","SELF_TRADE","UNDERCOLLATERALIZED","COULD_NOT_FILL","IOC_CANCELED","FOK_FAILED","REDUCE_ONLY_WOULD_INCREASE","TOO_MANY_CLIENT_IDS","DUPLICATE_CLIENT_ID","POSITION_TPSL_ALREADY_EXISTS","ENTRY_TPSL_CANNOT_BE_POSITION_TPSL","OPEN_ORDER_CAP_EXCEEDED","ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT","ORDER_NOT_FOUND","ORDER_NOT_FOUND_FOR_MODIFY","MODIFY_CHANGED_IMMUTABLE_FIELD","MODIFY_ZERO_SIZE","FILL_WILL_EXCEED_TRADING_BOUND","OPEN_INTEREST_CAP_EXCEEDED","POSITION_SIZE_CAP_EXCEEDED","MODIFY_TPSL_NOT_SUPPORTED","MODIFY_SUPERSEDED_BY_CANCEL","MODIFY_SIZE_ALREADY_FILLED"],"uniqueKey":"rejectionReason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid request body","code":"GEO_RESTRICTED","errorSource":"Order","errorType":"Tick","rejectionReason":"POST_ONLY_WOULD_CROSS"}}},"exampleType":"generated"}},"exampleType":"generated"},"52271993-07db-4380-8d38-9cc1864a5697":{"description":"Authentication failed. Wallet-signed: the address recovered from `signature` did not match `ethereumAddress`. API-key-signed: the `X-API-Key` is invalid, its `X-Timestamp` is outside the drift window, the key is not bound to `ethereumAddress` or to the requested `fromAccountIndex`, or the `X-Signature` did not verify over the `TransferV1` payload.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","examples":["Invalid request body"],"isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable error code for generic (non-order) rejections. Present on geo-restriction blocks; clients should key product-availability UI off this rather than the human `error` string.\n\n| Value | Meaning |\n|------------------|---------|\n| `GEO_RESTRICTED` | The action is not available from the caller's country/region for this product (perps and/or spot). Reads remain available; only state-changing actions are blocked. |\n","enum":["GEO_RESTRICTED"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"errorSource":{"type":"string","description":"Scopes the failure to a specific operation. Present on structured order errors (place / cancel / modify flows); absent on generic HTTP errors.\n","enum":["Order","Cancel"],"uniqueKey":"errorSource","typeLabel":"enum\u003cstring>"},"errorType":{"type":"string","description":"Machine-readable reason for the API-layer rejection. Present alongside `errorSource` on structured order errors; absent on generic HTTP errors.\n\n| Value | Meaning |\n|-------------------|---------|\n| `Tick` | Price or size does not align to the market's tick size / step size. |\n| `InvalidRequest` | A request field failed validation (bad address, unknown market, invalid enum, etc.). TPSL-specific causes: `stopPrice` required when `tpslType` is set; `tpslType` must be `STOP_LOSS` or `TAKE_PROFIT`; `reduceOnly` must be `true` for TPSL orders; trigger price must not sit on the wrong side of the current mark (would fire immediately); batch grouping/shape constraints violated (wrong order count, missing or duplicate `tpslType` legs). |\n| `OracleDeviation` | The order's price deviates from the current oracle price by more than the allowed threshold. Adjust the price closer to the oracle and resubmit. |\n| `ReduceOnly` | A reduce-only order was rejected because filling it would open or increase the account's position rather than reduce it. |\n| `Unavailable` | The requested operation (place / cancel) is temporarily disabled. |\n| `Unauthorized` | API key or trading-identity check failed. |\n| `Forbidden` | The authenticated key is not permitted to perform the requested operation. |\n| `NotImplemented` | The requested capability is not yet available on this path (e.g. TPSL over WebSocket). |\n| `Transmission` | The gateway accepted and validated the request but could not deliver it to the matching engine. Retry. |\n| `Internal` | Unexpected gateway-side failure unrelated to transmission. |\n","enum":["Tick","InvalidRequest","OracleDeviation","ReduceOnly","Unavailable","Unauthorized","Forbidden","NotImplemented","Transmission","Internal"],"uniqueKey":"errorType","typeLabel":"enum\u003cstring>"},"rejectionReason":{"type":"string","description":"Machine-readable engine-level rejection code. Present on `OrderResponse` / `BatchOrderItemResponse` when `status` is `REJECTED` on the synchronous `200` path (i.e. the gateway already had a definitive engine reject before responding). Absent on `202` responses and on HTTP error bodies — in those cases rejection reasons are delivered asynchronously via the `orders` WebSocket channel.\n\n| Value | Meaning |\n|------------------------------------|---------|\n| `POST_ONLY_WOULD_CROSS` | Post-only order would have crossed the book and taken liquidity. |\n| `SELF_TRADE` | Order would match against the account's own resting order; blocked by self-trade prevention. |\n| `UNDERCOLLATERALIZED` | Account has insufficient free collateral / margin to support the order. |\n| `COULD_NOT_FILL` | Generic \"could not fill\" (legacy; prefer `IOC_CANCELED` / `FOK_FAILED`). |\n| `IOC_CANCELED` | IOC order produced zero fills and was canceled. |\n| `FOK_FAILED` | FOK order could not be fully filled at submission. |\n| `REDUCE_ONLY_WOULD_INCREASE` | reduce-only order would have opened or increased the position. |\n| `TOO_MANY_CLIENT_IDS` | Account already has 10,000 live `clientId`s (the per-account maximum). Cancel or let existing orders reach a terminal state to free slots before placing new ones with distinct `clientId`s. |\n| `DUPLICATE_CLIENT_ID` | Account already has an open order with the same `clientId`. |\n| `POSITION_TPSL_ALREADY_EXISTS` | A position-level TPSL of the same trigger class (TP or SL) already exists for this account+market. At most one TP and one SL per market. |\n| `ENTRY_TPSL_CANNOT_BE_POSITION_TPSL` | A TPSL bound to an entry order (`parentOrderId` set) cannot also be a position-level TPSL; entry-linked TPSLs are sized partial legs. |\n| `OPEN_ORDER_CAP_EXCEEDED` | Account has reached its per-account open-order cap; cancel a resting order or let one reach a terminal state before placing another. |\n| `FILL_WILL_EXCEED_TRADING_BOUND` | Outside regular trading hours, the order would fill at or beyond the active off-hours trading bound. Per-order rejection; in-band trading continues. |\n| `OPEN_INTEREST_CAP_EXCEEDED` | Market is at its operator-set open-interest cap and the order's next fill would have increased open interest. OI-neutral and OI-reducing orders still match. |\n| `ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT` | Deprecated — no longer emitted; replaced by `FILL_WILL_EXCEED_TRADING_BOUND`. |\n| `ORDER_NOT_FOUND` | `cancelOrder` referenced an order not on the orderbook (already filled, canceled, never placed, or owned by another account). |\n| `ORDER_NOT_FOUND_FOR_MODIFY` | `modifyOrder` referenced an order not on the regular orderbook; TPSL and untriggered orders cannot be modified. The rejected modify is also buffered briefly and applied if the target placement arrives shortly after. |\n| `MODIFY_CHANGED_IMMUTABLE_FIELD` | `modifyOrder` attempted to change an immutable field (`side`, `timeInForce`, `reduceOnly`, or `orderType`). |\n| `MODIFY_ZERO_SIZE` | `modifyOrder` specified a new size of zero or less. |\n| `POSITION_SIZE_CAP_EXCEEDED` | The order, modify, or resulting fill would exceed the per-market position notional cap. Distinct from `UNDERCOLLATERALIZED`: the account may be fully funded — the size is the problem. |\n| `MODIFY_TPSL_NOT_SUPPORTED` | `modifyOrder` targeted an untriggered TPSL order; TPSL trigger parameters cannot be changed via modify. A live TPSL survives unchanged; a buffered modify that meets an arriving TPSL placement cancels that placement as a precaution. |\n| `MODIFY_SUPERSEDED_BY_CANCEL` | `modifyOrder` was discarded because a `cancelOrder` for the same order is pending; cancels always dominate modifies and the order's final state is canceled. |\n| `MODIFY_SIZE_ALREADY_FILLED` | Under total-size modify semantics, `modifyOrder`'s new size (the order's new TOTAL size) is at or below the quantity already filled, leaving nothing to rest. The original order is canceled (a `CANCELED` update precedes this rejection). |\n","enum":["POST_ONLY_WOULD_CROSS","SELF_TRADE","UNDERCOLLATERALIZED","COULD_NOT_FILL","IOC_CANCELED","FOK_FAILED","REDUCE_ONLY_WOULD_INCREASE","TOO_MANY_CLIENT_IDS","DUPLICATE_CLIENT_ID","POSITION_TPSL_ALREADY_EXISTS","ENTRY_TPSL_CANNOT_BE_POSITION_TPSL","OPEN_ORDER_CAP_EXCEEDED","ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT","ORDER_NOT_FOUND","ORDER_NOT_FOUND_FOR_MODIFY","MODIFY_CHANGED_IMMUTABLE_FIELD","MODIFY_ZERO_SIZE","FILL_WILL_EXCEED_TRADING_BOUND","OPEN_INTEREST_CAP_EXCEEDED","POSITION_SIZE_CAP_EXCEEDED","MODIFY_TPSL_NOT_SUPPORTED","MODIFY_SUPERSEDED_BY_CANCEL","MODIFY_SIZE_ALREADY_FILLED"],"uniqueKey":"rejectionReason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid request body","code":"GEO_RESTRICTED","errorSource":"Order","errorType":"Tick","rejectionReason":"POST_ONLY_WOULD_CROSS"}}},"exampleType":"generated"}},"exampleType":"generated"},"f67a0879-cf60-442d-903c-64e0bea4bd07":{"description":"Geo-restricted: transfers are blocked from the caller's country/region. Body carries `code: GEO_RESTRICTED`. Allowed only when the caller is restricted from every product (read access is unaffected).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","examples":["Invalid request body"],"isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable error code for generic (non-order) rejections. Present on geo-restriction blocks; clients should key product-availability UI off this rather than the human `error` string.\n\n| Value | Meaning |\n|------------------|---------|\n| `GEO_RESTRICTED` | The action is not available from the caller's country/region for this product (perps and/or spot). Reads remain available; only state-changing actions are blocked. |\n","enum":["GEO_RESTRICTED"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"errorSource":{"type":"string","description":"Scopes the failure to a specific operation. Present on structured order errors (place / cancel / modify flows); absent on generic HTTP errors.\n","enum":["Order","Cancel"],"uniqueKey":"errorSource","typeLabel":"enum\u003cstring>"},"errorType":{"type":"string","description":"Machine-readable reason for the API-layer rejection. Present alongside `errorSource` on structured order errors; absent on generic HTTP errors.\n\n| Value | Meaning |\n|-------------------|---------|\n| `Tick` | Price or size does not align to the market's tick size / step size. |\n| `InvalidRequest` | A request field failed validation (bad address, unknown market, invalid enum, etc.). TPSL-specific causes: `stopPrice` required when `tpslType` is set; `tpslType` must be `STOP_LOSS` or `TAKE_PROFIT`; `reduceOnly` must be `true` for TPSL orders; trigger price must not sit on the wrong side of the current mark (would fire immediately); batch grouping/shape constraints violated (wrong order count, missing or duplicate `tpslType` legs). |\n| `OracleDeviation` | The order's price deviates from the current oracle price by more than the allowed threshold. Adjust the price closer to the oracle and resubmit. |\n| `ReduceOnly` | A reduce-only order was rejected because filling it would open or increase the account's position rather than reduce it. |\n| `Unavailable` | The requested operation (place / cancel) is temporarily disabled. |\n| `Unauthorized` | API key or trading-identity check failed. |\n| `Forbidden` | The authenticated key is not permitted to perform the requested operation. |\n| `NotImplemented` | The requested capability is not yet available on this path (e.g. TPSL over WebSocket). |\n| `Transmission` | The gateway accepted and validated the request but could not deliver it to the matching engine. Retry. |\n| `Internal` | Unexpected gateway-side failure unrelated to transmission. |\n","enum":["Tick","InvalidRequest","OracleDeviation","ReduceOnly","Unavailable","Unauthorized","Forbidden","NotImplemented","Transmission","Internal"],"uniqueKey":"errorType","typeLabel":"enum\u003cstring>"},"rejectionReason":{"type":"string","description":"Machine-readable engine-level rejection code. Present on `OrderResponse` / `BatchOrderItemResponse` when `status` is `REJECTED` on the synchronous `200` path (i.e. the gateway already had a definitive engine reject before responding). Absent on `202` responses and on HTTP error bodies — in those cases rejection reasons are delivered asynchronously via the `orders` WebSocket channel.\n\n| Value | Meaning |\n|------------------------------------|---------|\n| `POST_ONLY_WOULD_CROSS` | Post-only order would have crossed the book and taken liquidity. |\n| `SELF_TRADE` | Order would match against the account's own resting order; blocked by self-trade prevention. |\n| `UNDERCOLLATERALIZED` | Account has insufficient free collateral / margin to support the order. |\n| `COULD_NOT_FILL` | Generic \"could not fill\" (legacy; prefer `IOC_CANCELED` / `FOK_FAILED`). |\n| `IOC_CANCELED` | IOC order produced zero fills and was canceled. |\n| `FOK_FAILED` | FOK order could not be fully filled at submission. |\n| `REDUCE_ONLY_WOULD_INCREASE` | reduce-only order would have opened or increased the position. |\n| `TOO_MANY_CLIENT_IDS` | Account already has 10,000 live `clientId`s (the per-account maximum). Cancel or let existing orders reach a terminal state to free slots before placing new ones with distinct `clientId`s. |\n| `DUPLICATE_CLIENT_ID` | Account already has an open order with the same `clientId`. |\n| `POSITION_TPSL_ALREADY_EXISTS` | A position-level TPSL of the same trigger class (TP or SL) already exists for this account+market. At most one TP and one SL per market. |\n| `ENTRY_TPSL_CANNOT_BE_POSITION_TPSL` | A TPSL bound to an entry order (`parentOrderId` set) cannot also be a position-level TPSL; entry-linked TPSLs are sized partial legs. |\n| `OPEN_ORDER_CAP_EXCEEDED` | Account has reached its per-account open-order cap; cancel a resting order or let one reach a terminal state before placing another. |\n| `FILL_WILL_EXCEED_TRADING_BOUND` | Outside regular trading hours, the order would fill at or beyond the active off-hours trading bound. Per-order rejection; in-band trading continues. |\n| `OPEN_INTEREST_CAP_EXCEEDED` | Market is at its operator-set open-interest cap and the order's next fill would have increased open interest. OI-neutral and OI-reducing orders still match. |\n| `ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT` | Deprecated — no longer emitted; replaced by `FILL_WILL_EXCEED_TRADING_BOUND`. |\n| `ORDER_NOT_FOUND` | `cancelOrder` referenced an order not on the orderbook (already filled, canceled, never placed, or owned by another account). |\n| `ORDER_NOT_FOUND_FOR_MODIFY` | `modifyOrder` referenced an order not on the regular orderbook; TPSL and untriggered orders cannot be modified. The rejected modify is also buffered briefly and applied if the target placement arrives shortly after. |\n| `MODIFY_CHANGED_IMMUTABLE_FIELD` | `modifyOrder` attempted to change an immutable field (`side`, `timeInForce`, `reduceOnly`, or `orderType`). |\n| `MODIFY_ZERO_SIZE` | `modifyOrder` specified a new size of zero or less. |\n| `POSITION_SIZE_CAP_EXCEEDED` | The order, modify, or resulting fill would exceed the per-market position notional cap. Distinct from `UNDERCOLLATERALIZED`: the account may be fully funded — the size is the problem. |\n| `MODIFY_TPSL_NOT_SUPPORTED` | `modifyOrder` targeted an untriggered TPSL order; TPSL trigger parameters cannot be changed via modify. A live TPSL survives unchanged; a buffered modify that meets an arriving TPSL placement cancels that placement as a precaution. |\n| `MODIFY_SUPERSEDED_BY_CANCEL` | `modifyOrder` was discarded because a `cancelOrder` for the same order is pending; cancels always dominate modifies and the order's final state is canceled. |\n| `MODIFY_SIZE_ALREADY_FILLED` | Under total-size modify semantics, `modifyOrder`'s new size (the order's new TOTAL size) is at or below the quantity already filled, leaving nothing to rest. The original order is canceled (a `CANCELED` update precedes this rejection). |\n","enum":["POST_ONLY_WOULD_CROSS","SELF_TRADE","UNDERCOLLATERALIZED","COULD_NOT_FILL","IOC_CANCELED","FOK_FAILED","REDUCE_ONLY_WOULD_INCREASE","TOO_MANY_CLIENT_IDS","DUPLICATE_CLIENT_ID","POSITION_TPSL_ALREADY_EXISTS","ENTRY_TPSL_CANNOT_BE_POSITION_TPSL","OPEN_ORDER_CAP_EXCEEDED","ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT","ORDER_NOT_FOUND","ORDER_NOT_FOUND_FOR_MODIFY","MODIFY_CHANGED_IMMUTABLE_FIELD","MODIFY_ZERO_SIZE","FILL_WILL_EXCEED_TRADING_BOUND","OPEN_INTEREST_CAP_EXCEEDED","POSITION_SIZE_CAP_EXCEEDED","MODIFY_TPSL_NOT_SUPPORTED","MODIFY_SUPERSEDED_BY_CANCEL","MODIFY_SIZE_ALREADY_FILLED"],"uniqueKey":"rejectionReason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid request body","code":"GEO_RESTRICTED","errorSource":"Order","errorType":"Tick","rejectionReason":"POST_ONLY_WOULD_CROSS"}}},"exampleType":"generated"}},"exampleType":"generated"},"dab84998-86c2-4401-b7a9-2fff0e7dc1ef":{"description":"Replay: this `(ethereumAddress, fromAccountIndex, toAccountIndex, nonce)` was already accepted by a prior submission. A signed transfer is single-use — resubmitting the identical signed body (or any body with the same `nonce`) does not queue a second transfer. Use a fresh `nonce` for each new transfer.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","examples":["Invalid request body"],"isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable error code for generic (non-order) rejections. Present on geo-restriction blocks; clients should key product-availability UI off this rather than the human `error` string.\n\n| Value | Meaning |\n|------------------|---------|\n| `GEO_RESTRICTED` | The action is not available from the caller's country/region for this product (perps and/or spot). Reads remain available; only state-changing actions are blocked. |\n","enum":["GEO_RESTRICTED"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"errorSource":{"type":"string","description":"Scopes the failure to a specific operation. Present on structured order errors (place / cancel / modify flows); absent on generic HTTP errors.\n","enum":["Order","Cancel"],"uniqueKey":"errorSource","typeLabel":"enum\u003cstring>"},"errorType":{"type":"string","description":"Machine-readable reason for the API-layer rejection. Present alongside `errorSource` on structured order errors; absent on generic HTTP errors.\n\n| Value | Meaning |\n|-------------------|---------|\n| `Tick` | Price or size does not align to the market's tick size / step size. |\n| `InvalidRequest` | A request field failed validation (bad address, unknown market, invalid enum, etc.). TPSL-specific causes: `stopPrice` required when `tpslType` is set; `tpslType` must be `STOP_LOSS` or `TAKE_PROFIT`; `reduceOnly` must be `true` for TPSL orders; trigger price must not sit on the wrong side of the current mark (would fire immediately); batch grouping/shape constraints violated (wrong order count, missing or duplicate `tpslType` legs). |\n| `OracleDeviation` | The order's price deviates from the current oracle price by more than the allowed threshold. Adjust the price closer to the oracle and resubmit. |\n| `ReduceOnly` | A reduce-only order was rejected because filling it would open or increase the account's position rather than reduce it. |\n| `Unavailable` | The requested operation (place / cancel) is temporarily disabled. |\n| `Unauthorized` | API key or trading-identity check failed. |\n| `Forbidden` | The authenticated key is not permitted to perform the requested operation. |\n| `NotImplemented` | The requested capability is not yet available on this path (e.g. TPSL over WebSocket). |\n| `Transmission` | The gateway accepted and validated the request but could not deliver it to the matching engine. Retry. |\n| `Internal` | Unexpected gateway-side failure unrelated to transmission. |\n","enum":["Tick","InvalidRequest","OracleDeviation","ReduceOnly","Unavailable","Unauthorized","Forbidden","NotImplemented","Transmission","Internal"],"uniqueKey":"errorType","typeLabel":"enum\u003cstring>"},"rejectionReason":{"type":"string","description":"Machine-readable engine-level rejection code. Present on `OrderResponse` / `BatchOrderItemResponse` when `status` is `REJECTED` on the synchronous `200` path (i.e. the gateway already had a definitive engine reject before responding). Absent on `202` responses and on HTTP error bodies — in those cases rejection reasons are delivered asynchronously via the `orders` WebSocket channel.\n\n| Value | Meaning |\n|------------------------------------|---------|\n| `POST_ONLY_WOULD_CROSS` | Post-only order would have crossed the book and taken liquidity. |\n| `SELF_TRADE` | Order would match against the account's own resting order; blocked by self-trade prevention. |\n| `UNDERCOLLATERALIZED` | Account has insufficient free collateral / margin to support the order. |\n| `COULD_NOT_FILL` | Generic \"could not fill\" (legacy; prefer `IOC_CANCELED` / `FOK_FAILED`). |\n| `IOC_CANCELED` | IOC order produced zero fills and was canceled. |\n| `FOK_FAILED` | FOK order could not be fully filled at submission. |\n| `REDUCE_ONLY_WOULD_INCREASE` | reduce-only order would have opened or increased the position. |\n| `TOO_MANY_CLIENT_IDS` | Account already has 10,000 live `clientId`s (the per-account maximum). Cancel or let existing orders reach a terminal state to free slots before placing new ones with distinct `clientId`s. |\n| `DUPLICATE_CLIENT_ID` | Account already has an open order with the same `clientId`. |\n| `POSITION_TPSL_ALREADY_EXISTS` | A position-level TPSL of the same trigger class (TP or SL) already exists for this account+market. At most one TP and one SL per market. |\n| `ENTRY_TPSL_CANNOT_BE_POSITION_TPSL` | A TPSL bound to an entry order (`parentOrderId` set) cannot also be a position-level TPSL; entry-linked TPSLs are sized partial legs. |\n| `OPEN_ORDER_CAP_EXCEEDED` | Account has reached its per-account open-order cap; cancel a resting order or let one reach a terminal state before placing another. |\n| `FILL_WILL_EXCEED_TRADING_BOUND` | Outside regular trading hours, the order would fill at or beyond the active off-hours trading bound. Per-order rejection; in-band trading continues. |\n| `OPEN_INTEREST_CAP_EXCEEDED` | Market is at its operator-set open-interest cap and the order's next fill would have increased open interest. OI-neutral and OI-reducing orders still match. |\n| `ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT` | Deprecated — no longer emitted; replaced by `FILL_WILL_EXCEED_TRADING_BOUND`. |\n| `ORDER_NOT_FOUND` | `cancelOrder` referenced an order not on the orderbook (already filled, canceled, never placed, or owned by another account). |\n| `ORDER_NOT_FOUND_FOR_MODIFY` | `modifyOrder` referenced an order not on the regular orderbook; TPSL and untriggered orders cannot be modified. The rejected modify is also buffered briefly and applied if the target placement arrives shortly after. |\n| `MODIFY_CHANGED_IMMUTABLE_FIELD` | `modifyOrder` attempted to change an immutable field (`side`, `timeInForce`, `reduceOnly`, or `orderType`). |\n| `MODIFY_ZERO_SIZE` | `modifyOrder` specified a new size of zero or less. |\n| `POSITION_SIZE_CAP_EXCEEDED` | The order, modify, or resulting fill would exceed the per-market position notional cap. Distinct from `UNDERCOLLATERALIZED`: the account may be fully funded — the size is the problem. |\n| `MODIFY_TPSL_NOT_SUPPORTED` | `modifyOrder` targeted an untriggered TPSL order; TPSL trigger parameters cannot be changed via modify. A live TPSL survives unchanged; a buffered modify that meets an arriving TPSL placement cancels that placement as a precaution. |\n| `MODIFY_SUPERSEDED_BY_CANCEL` | `modifyOrder` was discarded because a `cancelOrder` for the same order is pending; cancels always dominate modifies and the order's final state is canceled. |\n| `MODIFY_SIZE_ALREADY_FILLED` | Under total-size modify semantics, `modifyOrder`'s new size (the order's new TOTAL size) is at or below the quantity already filled, leaving nothing to rest. The original order is canceled (a `CANCELED` update precedes this rejection). |\n","enum":["POST_ONLY_WOULD_CROSS","SELF_TRADE","UNDERCOLLATERALIZED","COULD_NOT_FILL","IOC_CANCELED","FOK_FAILED","REDUCE_ONLY_WOULD_INCREASE","TOO_MANY_CLIENT_IDS","DUPLICATE_CLIENT_ID","POSITION_TPSL_ALREADY_EXISTS","ENTRY_TPSL_CANNOT_BE_POSITION_TPSL","OPEN_ORDER_CAP_EXCEEDED","ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT","ORDER_NOT_FOUND","ORDER_NOT_FOUND_FOR_MODIFY","MODIFY_CHANGED_IMMUTABLE_FIELD","MODIFY_ZERO_SIZE","FILL_WILL_EXCEED_TRADING_BOUND","OPEN_INTEREST_CAP_EXCEEDED","POSITION_SIZE_CAP_EXCEEDED","MODIFY_TPSL_NOT_SUPPORTED","MODIFY_SUPERSEDED_BY_CANCEL","MODIFY_SIZE_ALREADY_FILLED"],"uniqueKey":"rejectionReason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid request body","code":"GEO_RESTRICTED","errorSource":"Order","errorType":"Tick","rejectionReason":"POST_ONLY_WOULD_CROSS"}}},"exampleType":"generated"}},"exampleType":"generated"},"67812d92-eebb-4679-b6b9-fc569fa4c26e":{"description":"Rate limit exceeded. Two signals are returned, designed to coexist with both naive HTTP clients and rate-limit-aware SDK clients:\n\n- `Retry-After` header (integer seconds, RFC 7231 compliant). Rounds up — clients that obey this header sleep at least as long as required. Safe for generic HTTP libraries to read.\n- JSON body `retryAfterMs` (precise milliseconds, matches the server's internal computation). Sophisticated clients should prefer this over the header to avoid the round-up overshoot.\n- JSON body `reason` indicates which rate-limit layer rejected: `ip` (per-IP weight bucket), `account_empty` (per-subaccount pool fully exhausted, in drip throttle), `account_partial` (pool has some credit but not enough for this batch — split the request smaller to drain), or `unknown` (defensive fallback).\n- JSON body `clientId` (single-order endpoints) or `clientIds` (batch endpoints) echoes the request's client-supplied order identifier(s) so the client can correlate the rejection to a specific order request.\n","headers":{"Retry-After":{"description":"Seconds the client should wait before retrying the request.","schema":{"type":"integer","minimum":1,"example":1}}},"content":{"application/json":{"schema":{"description":"429 response body shape. Extends the generic `Error` with two rate-limit-specific fields:\n\n- `reason` — which limiter rejected the request. Stable string enum; new values may be added in future versions, so clients should treat unknown values as opaque.\n- `retryAfterMs` — precise milliseconds the client should wait before retrying. The HTTP `Retry-After` header carries the same information rounded up to whole seconds (RFC 7231); prefer this field when sub-second precision matters.\n","type":"object","required":["error"],"properties":{"error":{"type":"string","example":"rate limited","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"reason":{"type":"string","enum":["ip","account_empty","account_partial","unknown"],"description":"Layer that rejected the request:\n * `ip` — per-IP weight bucket exhausted.\n * `account_empty` — per-subaccount pool fully exhausted; the\n drip-throttle has no token available either.\n * `account_partial` — pool has some credit but not enough\n for this batch. Split the request into smaller chunks to\n drain the remaining headroom.\n * `unknown` — defensive fallback; clients should retry per\n `retryAfterMs` and report the occurrence.\n","uniqueKey":"reason","typeLabel":"enum\u003cstring>"},"retryAfterMs":{"type":"integer","format":"int64","minimum":0,"description":"Milliseconds to wait before retrying. Matches the precise wait the rate limiter computed (the `Retry-After` header rounds up to the next whole second).","uniqueKey":"retryAfterMs","typeLabel":"integer\u003cint64>"},"clientId":{"type":"string","description":"Echo of the request's client-supplied `clientId`, so the client can correlate the rejection to a specific order request. Present only on single-order endpoints (placeOrder, modifyOrder, cancelOrder) when the request carried a `clientId`. Omitted on batch endpoints (see `clientIds`) and when the request had none.\n","uniqueKey":"clientId","typeLabel":"string"},"clientIds":{"type":"array","items":{"type":"string","uniqueKey":"clientIds.items.[INDEX]","typeLabel":"string"},"description":"Echo of every client-supplied `clientId` in a batch request (batchPlaceOrders, batchCancelOrders), positionally aligned with the submitted `orders` / `cancels` array. A batch is rejected all-or-nothing, so every listed order was rejected; the echo lets a client submitting multiple batches concurrently correlate the 429 to a specific batch. An entry is empty when that element carried no `clientId` (e.g. a cancel-by-orderId). Omitted on single-order endpoints (see `clientId`).\n","uniqueKey":"clientIds","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"rate limited","reason":"account_empty","retryAfterMs":850,"clientId":"my-order-42"},"examples":{"Example":{"title":"Example","value":{"error":"rate limited","reason":"account_empty","retryAfterMs":850,"clientId":"my-order-42"}}},"exampleType":"examples"}},"exampleType":"examples"},"75e2ba5a-56dc-4071-8d80-3b1562483241":{"description":"Internal error (e.g. failed to encode or dispatch the transfer).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","examples":["Invalid request body"],"isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable error code for generic (non-order) rejections. Present on geo-restriction blocks; clients should key product-availability UI off this rather than the human `error` string.\n\n| Value | Meaning |\n|------------------|---------|\n| `GEO_RESTRICTED` | The action is not available from the caller's country/region for this product (perps and/or spot). Reads remain available; only state-changing actions are blocked. |\n","enum":["GEO_RESTRICTED"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"errorSource":{"type":"string","description":"Scopes the failure to a specific operation. Present on structured order errors (place / cancel / modify flows); absent on generic HTTP errors.\n","enum":["Order","Cancel"],"uniqueKey":"errorSource","typeLabel":"enum\u003cstring>"},"errorType":{"type":"string","description":"Machine-readable reason for the API-layer rejection. Present alongside `errorSource` on structured order errors; absent on generic HTTP errors.\n\n| Value | Meaning |\n|-------------------|---------|\n| `Tick` | Price or size does not align to the market's tick size / step size. |\n| `InvalidRequest` | A request field failed validation (bad address, unknown market, invalid enum, etc.). TPSL-specific causes: `stopPrice` required when `tpslType` is set; `tpslType` must be `STOP_LOSS` or `TAKE_PROFIT`; `reduceOnly` must be `true` for TPSL orders; trigger price must not sit on the wrong side of the current mark (would fire immediately); batch grouping/shape constraints violated (wrong order count, missing or duplicate `tpslType` legs). |\n| `OracleDeviation` | The order's price deviates from the current oracle price by more than the allowed threshold. Adjust the price closer to the oracle and resubmit. |\n| `ReduceOnly` | A reduce-only order was rejected because filling it would open or increase the account's position rather than reduce it. |\n| `Unavailable` | The requested operation (place / cancel) is temporarily disabled. |\n| `Unauthorized` | API key or trading-identity check failed. |\n| `Forbidden` | The authenticated key is not permitted to perform the requested operation. |\n| `NotImplemented` | The requested capability is not yet available on this path (e.g. TPSL over WebSocket). |\n| `Transmission` | The gateway accepted and validated the request but could not deliver it to the matching engine. Retry. |\n| `Internal` | Unexpected gateway-side failure unrelated to transmission. |\n","enum":["Tick","InvalidRequest","OracleDeviation","ReduceOnly","Unavailable","Unauthorized","Forbidden","NotImplemented","Transmission","Internal"],"uniqueKey":"errorType","typeLabel":"enum\u003cstring>"},"rejectionReason":{"type":"string","description":"Machine-readable engine-level rejection code. Present on `OrderResponse` / `BatchOrderItemResponse` when `status` is `REJECTED` on the synchronous `200` path (i.e. the gateway already had a definitive engine reject before responding). Absent on `202` responses and on HTTP error bodies — in those cases rejection reasons are delivered asynchronously via the `orders` WebSocket channel.\n\n| Value | Meaning |\n|------------------------------------|---------|\n| `POST_ONLY_WOULD_CROSS` | Post-only order would have crossed the book and taken liquidity. |\n| `SELF_TRADE` | Order would match against the account's own resting order; blocked by self-trade prevention. |\n| `UNDERCOLLATERALIZED` | Account has insufficient free collateral / margin to support the order. |\n| `COULD_NOT_FILL` | Generic \"could not fill\" (legacy; prefer `IOC_CANCELED` / `FOK_FAILED`). |\n| `IOC_CANCELED` | IOC order produced zero fills and was canceled. |\n| `FOK_FAILED` | FOK order could not be fully filled at submission. |\n| `REDUCE_ONLY_WOULD_INCREASE` | reduce-only order would have opened or increased the position. |\n| `TOO_MANY_CLIENT_IDS` | Account already has 10,000 live `clientId`s (the per-account maximum). Cancel or let existing orders reach a terminal state to free slots before placing new ones with distinct `clientId`s. |\n| `DUPLICATE_CLIENT_ID` | Account already has an open order with the same `clientId`. |\n| `POSITION_TPSL_ALREADY_EXISTS` | A position-level TPSL of the same trigger class (TP or SL) already exists for this account+market. At most one TP and one SL per market. |\n| `ENTRY_TPSL_CANNOT_BE_POSITION_TPSL` | A TPSL bound to an entry order (`parentOrderId` set) cannot also be a position-level TPSL; entry-linked TPSLs are sized partial legs. |\n| `OPEN_ORDER_CAP_EXCEEDED` | Account has reached its per-account open-order cap; cancel a resting order or let one reach a terminal state before placing another. |\n| `FILL_WILL_EXCEED_TRADING_BOUND` | Outside regular trading hours, the order would fill at or beyond the active off-hours trading bound. Per-order rejection; in-band trading continues. |\n| `OPEN_INTEREST_CAP_EXCEEDED` | Market is at its operator-set open-interest cap and the order's next fill would have increased open interest. OI-neutral and OI-reducing orders still match. |\n| `ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT` | Deprecated — no longer emitted; replaced by `FILL_WILL_EXCEED_TRADING_BOUND`. |\n| `ORDER_NOT_FOUND` | `cancelOrder` referenced an order not on the orderbook (already filled, canceled, never placed, or owned by another account). |\n| `ORDER_NOT_FOUND_FOR_MODIFY` | `modifyOrder` referenced an order not on the regular orderbook; TPSL and untriggered orders cannot be modified. The rejected modify is also buffered briefly and applied if the target placement arrives shortly after. |\n| `MODIFY_CHANGED_IMMUTABLE_FIELD` | `modifyOrder` attempted to change an immutable field (`side`, `timeInForce`, `reduceOnly`, or `orderType`). |\n| `MODIFY_ZERO_SIZE` | `modifyOrder` specified a new size of zero or less. |\n| `POSITION_SIZE_CAP_EXCEEDED` | The order, modify, or resulting fill would exceed the per-market position notional cap. Distinct from `UNDERCOLLATERALIZED`: the account may be fully funded — the size is the problem. |\n| `MODIFY_TPSL_NOT_SUPPORTED` | `modifyOrder` targeted an untriggered TPSL order; TPSL trigger parameters cannot be changed via modify. A live TPSL survives unchanged; a buffered modify that meets an arriving TPSL placement cancels that placement as a precaution. |\n| `MODIFY_SUPERSEDED_BY_CANCEL` | `modifyOrder` was discarded because a `cancelOrder` for the same order is pending; cancels always dominate modifies and the order's final state is canceled. |\n| `MODIFY_SIZE_ALREADY_FILLED` | Under total-size modify semantics, `modifyOrder`'s new size (the order's new TOTAL size) is at or below the quantity already filled, leaving nothing to rest. The original order is canceled (a `CANCELED` update precedes this rejection). |\n","enum":["POST_ONLY_WOULD_CROSS","SELF_TRADE","UNDERCOLLATERALIZED","COULD_NOT_FILL","IOC_CANCELED","FOK_FAILED","REDUCE_ONLY_WOULD_INCREASE","TOO_MANY_CLIENT_IDS","DUPLICATE_CLIENT_ID","POSITION_TPSL_ALREADY_EXISTS","ENTRY_TPSL_CANNOT_BE_POSITION_TPSL","OPEN_ORDER_CAP_EXCEEDED","ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT","ORDER_NOT_FOUND","ORDER_NOT_FOUND_FOR_MODIFY","MODIFY_CHANGED_IMMUTABLE_FIELD","MODIFY_ZERO_SIZE","FILL_WILL_EXCEED_TRADING_BOUND","OPEN_INTEREST_CAP_EXCEEDED","POSITION_SIZE_CAP_EXCEEDED","MODIFY_TPSL_NOT_SUPPORTED","MODIFY_SUPERSEDED_BY_CANCEL","MODIFY_SIZE_ALREADY_FILLED"],"uniqueKey":"rejectionReason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid request body","code":"GEO_RESTRICTED","errorSource":"Order","errorType":"Tick","rejectionReason":"POST_ONLY_WOULD_CROSS"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"87a95d17-20cc-4f3f-83b9-90e9c772a7ce":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Hex-encoded Ed25519 public key (64 chars). The public key IS the API key — register it via `POST /createApiKey`. Required on every authenticated request, both read-only and signed.\n","scopes":[],"schemeName":"apiKey"},"timestamp":{"type":"apiKey","in":"header","name":"X-Timestamp","description":"Unix time in **nanoseconds** as a decimal string (e.g. `\"1713825891591000000\"`). Millisecond or second epochs are rejected with `401 Unauthorized`. Must be within ±30,000 ms of server wall-clock, or the request is rejected with `401 Unauthorized`. Required on all mutating / credential-creating endpoints. This same value must appear as the `ct` field in the ordersign typed canonical payload (single-order endpoints) or in each element's `ct` field (batch endpoints).\n","scopes":[],"schemeName":"timestamp"},"signature":{"type":"apiKey","in":"header","name":"X-Signature","description":"Lowercase hex-encoded Ed25519 signature (128 chars).\n\n**Single-order endpoints** (`placeOrder`, `cancelOrder`, `modifyOrder`, and other non-batch mutating routes) sign over the **ordersign typed canonical payload** — a compact, key-sorted JSON object built from parsed request fields using engine-native integer values:\n\n```\nplaceOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,\"g\":N,\"m\":N,\"op\":1,\"p\":N,\"q\":N,\"r\":0|1,\"s\":N,\"t\":N,\"v\":1}\ncancelOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,[,\"id\":\"…\"],\"m\":N,\"op\":2,\"v\":1}\nmodifyOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,\"g\":N,[,\"id\":\"…\"],\"m\":N,\"op\":3,\"p\":N,\"q\":N,\"r\":0|1,\"s\":N,\"t\":N,\"v\":1} (exactly one of id / c)\n```\n\n`ct` must equal the `X-Timestamp` header value. Keys in brackets are conditional (omitted when empty). `op` values: `1`=place, `2`=cancel, `3`=modify. See the `ordersign` package for field definitions and reference signing code.\n\nOther signed routes (e.g. `createApiKey`) still use the legacy scheme: `signing_message = X-Timestamp + ACTION + canonicalJSON(body)`, where `ACTION` is the camelCase final path segment.\n\n**Batch endpoints (`batchPlaceOrders`, `batchCancelOrders`, `batchModifyOrders`) do NOT use this header.** They authenticate with per-element typed ordersign signatures embedded in the request body (see the global auth description and the per-field `signature` descriptions on `OrderRequest` / `CancelOrderRequest` / `ModifyOrderRequest`).\n\nRead endpoints are authenticated by `?address=` (and optionally `X-API-Key`) only — no signature is required, except for the signed affiliate reads (see the Referral tag), which require the full header triple; with no body their signing message is `X-Timestamp + ACTION`. `canonicalJSON(body)` is the JSON body with object keys sorted lexicographically at every level and no whitespace; the server canonicalizes the received body before verifying, so only the bytes signed over must be canonical. Required on all mutating / credential-creating endpoints.\n","scopes":[],"schemeName":"signature"}},"44688300-15e1-4125-8175-c9eea65f9c64":{}},"servers":{"8bcbded4-ced7-41f7-9103-ef78afb86c4b":{"url":"https://api.arcus.xyz","description":"Mainnet"},"db341041-78f8-47d5-bb08-4c97d4cfedb3":{"url":"https://api.testnet.arcus.xyz","description":"Testnet"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Hex-encoded Ed25519 public key (64 chars). The public key IS the API key — register it via `POST /createApiKey`. Required on every authenticated request, both read-only and signed.\n","scopes":[],"schemeName":"apiKey"},"schema":{"title":"X-API-Key","type":"string","description":"Hex-encoded Ed25519 public key (64 chars). The public key IS the API key — register it via `POST /createApiKey`. Required on every authenticated request, both read-only and signed.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"X-API-Key"},{"scheme":{"type":"apiKey","in":"header","name":"X-Timestamp","description":"Unix time in **nanoseconds** as a decimal string (e.g. `\"1713825891591000000\"`). Millisecond or second epochs are rejected with `401 Unauthorized`. Must be within ±30,000 ms of server wall-clock, or the request is rejected with `401 Unauthorized`. Required on all mutating / credential-creating endpoints. This same value must appear as the `ct` field in the ordersign typed canonical payload (single-order endpoints) or in each element's `ct` field (batch endpoints).\n","scopes":[],"schemeName":"timestamp"},"schema":{"title":"X-Timestamp","type":"string","description":"Unix time in **nanoseconds** as a decimal string (e.g. `\"1713825891591000000\"`). Millisecond or second epochs are rejected with `401 Unauthorized`. Must be within ±30,000 ms of server wall-clock, or the request is rejected with `401 Unauthorized`. Required on all mutating / credential-creating endpoints. This same value must appear as the `ct` field in the ordersign typed canonical payload (single-order endpoints) or in each element's `ct` field (batch endpoints).\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"timestamp","name":"X-Timestamp"},{"scheme":{"type":"apiKey","in":"header","name":"X-Signature","description":"Lowercase hex-encoded Ed25519 signature (128 chars).\n\n**Single-order endpoints** (`placeOrder`, `cancelOrder`, `modifyOrder`, and other non-batch mutating routes) sign over the **ordersign typed canonical payload** — a compact, key-sorted JSON object built from parsed request fields using engine-native integer values:\n\n```\nplaceOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,\"g\":N,\"m\":N,\"op\":1,\"p\":N,\"q\":N,\"r\":0|1,\"s\":N,\"t\":N,\"v\":1}\ncancelOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,[,\"id\":\"…\"],\"m\":N,\"op\":2,\"v\":1}\nmodifyOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,\"g\":N,[,\"id\":\"…\"],\"m\":N,\"op\":3,\"p\":N,\"q\":N,\"r\":0|1,\"s\":N,\"t\":N,\"v\":1} (exactly one of id / c)\n```\n\n`ct` must equal the `X-Timestamp` header value. Keys in brackets are conditional (omitted when empty). `op` values: `1`=place, `2`=cancel, `3`=modify. See the `ordersign` package for field definitions and reference signing code.\n\nOther signed routes (e.g. `createApiKey`) still use the legacy scheme: `signing_message = X-Timestamp + ACTION + canonicalJSON(body)`, where `ACTION` is the camelCase final path segment.\n\n**Batch endpoints (`batchPlaceOrders`, `batchCancelOrders`, `batchModifyOrders`) do NOT use this header.** They authenticate with per-element typed ordersign signatures embedded in the request body (see the global auth description and the per-field `signature` descriptions on `OrderRequest` / `CancelOrderRequest` / `ModifyOrderRequest`).\n\nRead endpoints are authenticated by `?address=` (and optionally `X-API-Key`) only — no signature is required, except for the signed affiliate reads (see the Referral tag), which require the full header triple; with no body their signing message is `X-Timestamp + ACTION`. `canonicalJSON(body)` is the JSON body with object keys sorted lexicographically at every level and no whitespace; the server canonicalizes the received body before verifying, so only the bytes signed over must be canonical. Required on all mutating / credential-creating endpoints.\n","scopes":[],"schemeName":"signature"},"schema":{"title":"X-Signature","type":"string","description":"Lowercase hex-encoded Ed25519 signature (128 chars).\n\n**Single-order endpoints** (`placeOrder`, `cancelOrder`, `modifyOrder`, and other non-batch mutating routes) sign over the **ordersign typed canonical payload** — a compact, key-sorted JSON object built from parsed request fields using engine-native integer values:\n\n```\nplaceOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,\"g\":N,\"m\":N,\"op\":1,\"p\":N,\"q\":N,\"r\":0|1,\"s\":N,\"t\":N,\"v\":1}\ncancelOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,[,\"id\":\"…\"],\"m\":N,\"op\":2,\"v\":1}\nmodifyOrder: {\"ad\":\"0x…\",\"ai\":N,[,\"c\":\"…\"],\"ct\":N,\"g\":N,[,\"id\":\"…\"],\"m\":N,\"op\":3,\"p\":N,\"q\":N,\"r\":0|1,\"s\":N,\"t\":N,\"v\":1} (exactly one of id / c)\n```\n\n`ct` must equal the `X-Timestamp` header value. Keys in brackets are conditional (omitted when empty). `op` values: `1`=place, `2`=cancel, `3`=modify. See the `ordersign` package for field definitions and reference signing code.\n\nOther signed routes (e.g. `createApiKey`) still use the legacy scheme: `signing_message = X-Timestamp + ACTION + canonicalJSON(body)`, where `ACTION` is the camelCase final path segment.\n\n**Batch endpoints (`batchPlaceOrders`, `batchCancelOrders`, `batchModifyOrders`) do NOT use this header.** They authenticate with per-element typed ordersign signatures embedded in the request body (see the global auth description and the per-field `signature` descriptions on `OrderRequest` / `CancelOrderRequest` / `ModifyOrderRequest`).\n\nRead endpoints are authenticated by `?address=` (and optionally `X-API-Key`) only — no signature is required, except for the signed affiliate reads (see the Referral tag), which require the full header triple; with no body their signing message is `X-Timestamp + ACTION`. `canonicalJSON(body)` is the JSON body with object keys sorted lexicographically at every level and no whitespace; the server canonicalizes the received body before verifying, so only the bytes signed over must be canonical. Required on all mutating / credential-creating endpoints.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"signature","name":"X-Signature"}],"title":"apiKey \u0026 timestamp \u0026 signature"}]},"originalFileLocation":"api-reference/openapi.yml"},"subdomain":"arcus-11aecf6e","siteName":"Arcus Docs","title":"Submit internal transfer - Arcus Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T03:48:06.566Z","originalFileLocation":"api-reference/exchange/submit-internal-transfer.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=\"Move collateral between two account indexes of the same wallet.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Arcus Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Submit internal transfer - Arcus Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Move collateral between two account indexes of the same wallet.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Arcus Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://arcus-11aecf6e.mintlify.site/_mintlify/api/og/v2?division=Exchange\u0026amp;title=Submit+internal+transfer\u0026amp;description=Move+collateral+between+two+account+indexes+of+the+**same+wallet**.\u0026amp;theme=8f431044d56cd21a41b03f79\u0026amp;signature=924b472b5c8b9ffd47b7a6833f5f6c037cb83af46a275d3429dd1ba5de74430f\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Submit internal transfer - Arcus Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Move collateral between two account indexes of the same wallet.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://arcus-11aecf6e.mintlify.site/_mintlify/api/og/v2?division=Exchange\u0026amp;title=Submit+internal+transfer\u0026amp;description=Move+collateral+between+two+account+indexes+of+the+**same+wallet**.\u0026amp;theme=8f431044d56cd21a41b03f79\u0026amp;signature=924b472b5c8b9ffd47b7a6833f5f6c037cb83af46a275d3429dd1ba5de74430f\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/arcus-11aecf6e/zluNDxrkwkprdXlm/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Arcus Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/exchange/submit-internal-transfer.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.arcus.xyz/#organization\",\"name\":\"Arcus Docs\",\"url\":\"https://docs.arcus.xyz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/arcus-11aecf6e/Pw2ZUiZemhLSrOMO/logo/light.svg?fit=max\u0026auto=format\u0026n=Pw2ZUiZemhLSrOMO\u0026q=85\u0026s=9bbd1de2de2a31d08c50e0d58bdac466\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.arcus.xyz#website\",\"name\":\"Arcus Docs\",\"url\":\"https://docs.arcus.xyz\",\"publisher\":{\"@id\":\"https://docs.arcus.xyz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer#webpage\",\"url\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer\",\"name\":\"Submit internal transfer\",\"description\":\"Move collateral between two account indexes of the same wallet.\",\"dateModified\":\"2026-11-12T03:48:06.566Z\",\"isPartOf\":{\"@id\":\"https://docs.arcus.xyz#website\"},\"breadcrumb\":{\"@id\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.arcus.xyz/api-reference/public/service-info\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Exchange\",\"item\":\"https://docs.arcus.xyz/api-reference/exchange/place-order\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Submit internal transfer\",\"item\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer#apireference\",\"headline\":\"Submit internal transfer\",\"name\":\"Submit internal transfer\",\"description\":\"Move collateral between two account indexes of the same wallet.\",\"url\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer\",\"mainEntityOfPage\":{\"@id\":\"https://docs.arcus.xyz/api-reference/exchange/submit-internal-transfer#webpage\"},\"dateModified\":\"2026-11-12T03:48:06.566Z\",\"publisher\":{\"@id\":\"https://docs.arcus.xyz/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.arcus.xyz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Arcus Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Arcus Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/exchange/submit-internal-transfer.md","siteName":"Arcus Docs","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/guides/fund-testnet-account"}]},{"tab":"Concepts","pages":[{"title":"Concepts","href":"/concepts/onboarding"}]},{"tab":"API reference","groups":[{"group":"API documentation","pages":[{"title":"Introduction","href":"/api-reference/introduction"},{"title":"Authentication","href":"/api-reference/authentication"},{"title":"WebSocket","href":"/api-reference/websocket"},{"title":"Rate limits","href":"/api-reference/rate-limits"}]},{"group":"Endpoints","pages":[{"group":"Public","pages":[{"title":"Service info","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /","href":"/api-reference/public/service-info"},{"title":"Health check","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /health","href":"/api-reference/public/health-check"},{"title":"Get L2 orderbook snapshot","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/l2OrderBook/{market}","href":"/api-reference/public/get-l2-orderbook-snapshot"},{"title":"Get Best Bid Offer (BBO)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/bbo/{market}","href":"/api-reference/public/get-best-bid-offer-bbo"},{"title":"Get current server time","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/time","href":"/api-reference/public/get-current-server-time"},{"title":"Get all mid prices","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/mids","href":"/api-reference/public/get-all-mid-prices"},{"title":"Get live prices for all markets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/prices","href":"/api-reference/public/get-live-prices-for-all-markets"},{"title":"Get fee tier table","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/feetiers","href":"/api-reference/public/get-fee-tier-table"},{"title":"Get referral commission rate schedule","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/commissionrates","href":"/api-reference/public/get-referral-commission-rate-schedule"},{"title":"Get markets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/markets","href":"/api-reference/public/get-markets"},{"title":"Get market fee schedules","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/markets/feeSchedules","href":"/api-reference/public/get-market-fee-schedules"},{"title":"Get corporate actions","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/corporateActions","href":"/api-reference/public/get-corporate-actions"},{"title":"Get corporate actions for a market","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/corporateActions/{market_id}","href":"/api-reference/public/get-corporate-actions-for-a-market"},{"title":"Get spot collateral assets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/spotAssets","href":"/api-reference/public/get-spot-collateral-assets"},{"title":"Get global lending attributes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/lendingAttributes","href":"/api-reference/public/get-global-lending-attributes"},{"title":"Get recent public trades","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/trades","href":"/api-reference/public/get-recent-public-trades"},{"title":"Get a single trade by ID","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/trade/{tradeId}","href":"/api-reference/public/get-a-single-trade-by-id"},{"title":"Get OHLCV candles","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/candles","href":"/api-reference/public/get-ohlcv-candles"},{"title":"Get open orders","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/openOrders","href":"/api-reference/public/get-open-orders"},{"title":"Get order history","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/orders","href":"/api-reference/public/get-order-history"},{"title":"Get fills","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/fills","href":"/api-reference/public/get-fills"},{"title":"Get spot fills","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/spotFills","href":"/api-reference/public/get-spot-fills"},{"title":"Get fill by ID","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/fill/{tradeId}","href":"/api-reference/public/get-fill-by-id"},{"title":"Get account transfer updates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/accountTransferUpdates","href":"/api-reference/public/get-account-transfer-updates"},{"title":"Get funding payments","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/funding","href":"/api-reference/public/get-funding-payments"},{"title":"Get interest payments","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/interest","href":"/api-reference/public/get-interest-payments"},{"title":"Get market funding rates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/fundingRates","href":"/api-reference/public/get-market-funding-rates"},{"title":"Get portfolio history","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/portfolio","href":"/api-reference/public/get-portfolio-history"},{"title":"Get current rate-limit usage","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/rateLimit","href":"/api-reference/public/get-current-rate-limit-usage"},{"title":"Get positions","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/positions","href":"/api-reference/public/get-positions"},{"title":"Get spot positions","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/spotPositions","href":"/api-reference/public/get-spot-positions"},{"title":"Get account","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/account","href":"/api-reference/public/get-account"},{"title":"Get account stats","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/account/stats","href":"/api-reference/public/get-account-stats"},{"title":"Get order status","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/order/{orderId}","href":"/api-reference/public/get-order-status"},{"title":"Get leverage and margin mode for an account across all markets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/leverages","href":"/api-reference/public/get-leverage-and-margin-mode-for-an-account-across-all-markets"},{"title":"Get the all-traders leaderboard","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/leaderboard","href":"/api-reference/public/get-the-all-traders-leaderboard"}]},{"group":"Exchange","pages":[{"title":"Place order","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/placeOrder","href":"/api-reference/exchange/place-order"},{"title":"Place batch orders","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/batchPlaceOrders","href":"/api-reference/exchange/place-batch-orders"},{"title":"Cancel order","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/cancelOrder","href":"/api-reference/exchange/cancel-order"},{"title":"Batch cancel orders","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/batchCancelOrders","href":"/api-reference/exchange/batch-cancel-orders"},{"title":"Schedule cancel-all (dead man's switch)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/scheduleCancel","href":"/api-reference/exchange/schedule-cancel-all-dead-mans-switch"},{"title":"Cancel all open orders","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/cancelAllOrders","href":"/api-reference/exchange/cancel-all-open-orders"},{"title":"Modify order","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/modifyOrder","href":"/api-reference/exchange/modify-order"},{"title":"Batch modify orders","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/batchModifyOrders","href":"/api-reference/exchange/batch-modify-orders"},{"title":"Set leverage for a market","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/setLeverage","href":"/api-reference/exchange/set-leverage-for-a-market"},{"title":"Add or remove margin on an isolated-mode position","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/adjustIsolatedMargin","href":"/api-reference/exchange/add-or-remove-margin-on-an-isolated-mode-position"},{"title":"Sell spot collateral to settle the account's loan","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/settleLoan","href":"/api-reference/exchange/sell-spot-collateral-to-settle-the-accounts-loan"},{"title":"Submit withdrawal","description":"Submit a withdrawal of collateral to the chain.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/withdraw","href":"/api-reference/exchange/submit-withdrawal"},{"title":"Submit internal transfer","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/transfer","href":"/api-reference/exchange/submit-internal-transfer"}]},{"group":"Onboarding","pages":[{"title":"Get API keys","description":"Returns all API keys associated with the given Ethereum address.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/apiKeys","href":"/api-reference/onboarding/get-api-keys"},{"title":"Create API key","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/createApiKey","href":"/api-reference/onboarding/create-api-key"},{"title":"Revoke API key","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/revokeApiKey","href":"/api-reference/onboarding/revoke-api-key"}]},{"group":"Referral","pages":[{"title":"Create referral code","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/createCode","href":"/api-reference/referral/create-referral-code"},{"title":"Register as referee","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/registerAffiliate","href":"/api-reference/referral/register-as-referee"},{"title":"Update kickback rate","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/kickback","href":"/api-reference/referral/update-kickback-rate"},{"title":"Revoke referral code","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/revokeCode","href":"/api-reference/referral/revoke-referral-code"},{"title":"Rename referral code","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/modifyCode","href":"/api-reference/referral/rename-referral-code"},{"title":"Claim accrued commission","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/claim","href":"/api-reference/referral/claim-accrued-commission"},{"title":"Get affiliate info","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/info","href":"/api-reference/referral/get-affiliate-info"},{"title":"Get the caller's referral code","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/code","href":"/api-reference/referral/get-the-callers-referral-code"},{"title":"Get referees","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/referees","href":"/api-reference/referral/get-referees"},{"title":"Get my referrer","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/myReferrer","href":"/api-reference/referral/get-my-referrer"},{"title":"Get affiliate leaderboard","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/leaderboard","href":"/api-reference/referral/get-affiliate-leaderboard"},{"title":"Get affiliate commission history","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/commissions","href":"/api-reference/referral/get-affiliate-commission-history"},{"title":"Get affiliate claim history","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/claims","href":"/api-reference/referral/get-affiliate-claim-history"},{"title":"Look up a single claim","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/claimStatus","href":"/api-reference/referral/look-up-a-single-claim"},{"title":"Check whether a referral code is available","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/codeAvailable","href":"/api-reference/referral/check-whether-a-referral-code-is-available"},{"title":"List the caller's invite codes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml get /v1/affiliate/inviteCodes","href":"/api-reference/referral/list-the-callers-invite-codes"},{"title":"Redeem an invite code","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yml post /v1/affiliate/redeemInvite","href":"/api-reference/referral/redeem-an-invite-code"}]}]},{"group":"WebSocket","pages":[{"group":"Market data","pages":[{"asyncapi":"api-reference/asyncapi.yaml l2Orderbook","href":"/api-reference/market-data/l2orderbook","title":"L2 orderbook","version":null},{"asyncapi":"api-reference/asyncapi.yaml l2OrderbookUpdates","href":"/api-reference/market-data/l2orderbookupdates","title":"L2 orderbook updates","version":null},{"asyncapi":"api-reference/asyncapi.yaml trades","href":"/api-reference/market-data/trades","title":"Trades","version":null},{"asyncapi":"api-reference/asyncapi.yaml markets","href":"/api-reference/market-data/markets","title":"Markets","version":null},{"asyncapi":"api-reference/asyncapi.yaml oraclePrices","href":"/api-reference/market-data/oracleprices","title":"Oracle prices","version":null},{"asyncapi":"api-reference/asyncapi.yaml bbo","href":"/api-reference/market-data/bbo","title":"Bbo","version":null},{"asyncapi":"api-reference/asyncapi.yaml lendingRates","href":"/api-reference/market-data/lendingrates","title":"Lending rates","version":null},{"asyncapi":"api-reference/asyncapi.yaml predictedFunding","href":"/api-reference/market-data/predictedfunding","title":"Predicted funding","version":null},{"asyncapi":"api-reference/asyncapi.yaml exchangeAttributeUpdates","href":"/api-reference/market-data/exchangeattributeupdates","title":"Exchange attribute updates","version":null},{"asyncapi":"api-reference/asyncapi.yaml marketAttributes","href":"/api-reference/market-data/marketattributes","title":"Market attributes","version":null},{"asyncapi":"api-reference/asyncapi.yaml candles","href":"/api-reference/market-data/candles","title":"Candles","version":null}]},{"group":"Account","pages":[{"asyncapi":"api-reference/asyncapi.yaml account","href":"/api-reference/account/account","title":"Account","version":null},{"asyncapi":"api-reference/asyncapi.yaml positions","href":"/api-reference/account/positions","title":"Positions","version":null},{"asyncapi":"api-reference/asyncapi.yaml spotPositions","href":"/api-reference/account/spotpositions","title":"Spot positions","version":null},{"asyncapi":"api-reference/asyncapi.yaml userFills","href":"/api-reference/account/userfills","title":"User fills","version":null},{"asyncapi":"api-reference/asyncapi.yaml spotFills","href":"/api-reference/account/spotfills","title":"Spot fills","version":null},{"asyncapi":"api-reference/asyncapi.yaml settleLoanResults","href":"/api-reference/account/settleloanresults","title":"Settle loan results","version":null},{"asyncapi":"api-reference/asyncapi.yaml orders","href":"/api-reference/account/orders","title":"Orders","version":null},{"asyncapi":"api-reference/asyncapi.yaml funding","href":"/api-reference/account/funding","title":"Funding","version":null},{"asyncapi":"api-reference/asyncapi.yaml accountTransferUpdates","href":"/api-reference/account/accounttransferupdates","title":"Account transfer updates","version":null},{"asyncapi":"api-reference/asyncapi.yaml accountAttributeUpdates","href":"/api-reference/account/accountattributeupdates","title":"Account attribute updates","version":null}]},{"group":"Trading","pages":[{"asyncapi":"api-reference/asyncapi.yaml orderOperations","href":"/api-reference/trading/orderoperations","title":"Order operations","version":null}]}]},{"group":"Changelog","pages":[{"title":"Changelog API (Mainnet)","href":"/changelog"},{"title":"Upcoming mainnet release","href":"/changelog/upcoming"},{"title":"Changelog API (Testnet)","href":"/changelog/testnet"},{"title":"Arcus Changelog","href":"/changelog/frontend"}]}]}]},"basePath":"","title":"Submit internal transfer - Arcus Docs","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DdEMm2kG.js","utils-BMo572L7.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C-4m9KAx.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DPLK2Oq9.js","snippetPresets-BKjfJMC9.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-DTsgtCEj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C8vmhyQM.js","shallow-r9w8LQGS.js","getApiPlaygroundDisplay-DjPI64HQ.js","CodeSnippet-C8Bvhl16.js","CodeSnippets-BtWUwcMy.js","Page-BIYvYBgk.js","getPastedJson-Dcm_3Pgl.js","icon-BXwrTpjc.js","MethodPill-CcjfVmmy.js","DuplicateIcon-BuKIbXAQ.js","createIcon-DaL9yXsO.js","DynamicMarkdown-Co5nikxh.js","SectionHeading-P4UNTsMZ.js","axios-vUo_bRtp.js","Markdown-CEfymfIH.js","clsx-Dq9TQuNi.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-D2J8knkn.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BgZ2ThuU.js"]}