Send funds

View as MarkdownOpen in Claude
Signs and broadcasts a transfer, and returns as soon as the network accepts it. ⚠️ **A `txHash` is not a confirmation.** Poll `/txid` until `status` flips from `pending` to `success` or `failed`. ## The fee comes out of the amount — for native assets **Native transfers (BTC, ETH, BNB, POL, TRX, SOL) are sent net of the network fee: the recipient receives `amount` − `fee`, not `amount`.** The transfer is sized so that the total leaving the wallet equals exactly the `amount` you asked for. If you need the recipient to receive an exact figure, add the fee (quote it with `/fee`) to the `amount` you send. **Token transfers (USDT, USDC) deliver the full `amount`.** Their fee is paid separately, in the chain's native coin — so a token wallet also needs a native balance for gas. ## Amounts `amount` is a **human-decimal string** (`"0.5"`), matched against `/^\d+(\.\d+)?$/` and parsed to base units with the asset's decimals. Never send base units, and never send a float you produced by arithmetic. Minimums are enforced: **0.00001 BTC**, and **0.0001** for a native EVM send (ETH, BNB, POL). Token sends must be greater than zero. An amount with more decimal places than the asset supports is rejected. ## Sender The **sender is resolved server-side** from `userId` + `assetId`. A client can never supply a private key or a from-address. `recipient` must differ from the sender.

Authentication

AuthorizationBearer

A 15-minute token from /auth. Required on every endpoint except /auth.

Headers

X-Request-IdstringOptional
Correlation id. Generated if omitted, echoed on every response, and written to the audit log.
X-USER-IDstringOptionalformat: "^[0-9a-fA-F]{24}$"

Sent by the trusted gateway. When present it overrides any userId in the body.

Request

This endpoint expects an object.
userIdstringRequiredformat: "^[0-9a-fA-F]{24}$"

24-character hex id, returned by /create.

assetIdenumRequired
Primary asset selector. An all-digit string (`"21"`) is accepted and normalised to an integer. - `1` — BITCOIN BTC (native, 8 decimals) - `2` — ETHEREUM ETH (native, 18 decimals) - `21` — ETHEREUM USDT (ERC20, 6 decimals) - `22` — ETHEREUM USDC (ERC20, 6 decimals) - `3` — BNB BNB (native, 18 decimals) - `31` — BNB USDT (BEP20, 18 decimals) - `32` — BNB USDC (BEP20, 18 decimals) - `4` — TRON TRX (native, 6 decimals) - `41` — TRON USDT (TRC20, 6 decimals) - `42` — TRON USDC (TRC20, 6 decimals) - `5` — POLYGON POL (native, 18 decimals) - `51` — POLYGON USDT (ERC20, 6 decimals) — mainnet only - `52` — POLYGON USDC (ERC20, 6 decimals) - `6` — SOLANA SOL (native, 9 decimals) - `61` — SOLANA USDT (SPL, 6 decimals) — mainnet only - `62` — SOLANA USDC (SPL, 6 decimals)
recipientstringRequired
Destination address on the asset's chain. Must differ from the sender.
amountstringRequiredformat: "^\d+(\.\d+)?$"

Human-decimal amount, e.g. "0.5". Never base units, never a float.

passwordstringRequired>=8 characters

Keystore password (AES-256-GCM, scrypt KDF). Unrecoverable — required by /send and /extend.

Response

OK
resultobject
requestIdstring

Echo of the inbound X-Request-Id, or a generated one.

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
422
Unprocessable Entity Error
502
Bad Gateway Error
503
Service Unavailable Error