POST /wallet/send
Initiate an on-chain transfer using a wallet you manage.
Request (single-output)
asset, provide a contract address):
Request (BTC multi-output)
For Bitcoin you can send to multiple recipients in one transaction. Provide a mapping of destination addresses to amounts and omit the top-levelamount:
| Field | Type | Required | Notes |
|---|---|---|---|
api_key | string | ✓ | Customer API key. |
wallet_id | string | ✓ | Wallet ID (w_<uuid>) or on-chain address. |
amount | number | ✓* | Natural units (ETH, BTC, TRX, or token units). Required for single-output sends; omit for BTC multi-output. |
destination | string or object | ✓ | Single-output: recipient address as a string. BTC multi-output: object mapping { "address": amount }. |
asset | string | ✓* | Supported values: |
• ETH wallets → ETH, USDC, USDT | |||
• BTC wallets → BTC | |||
• Tron wallets → TRX, USDT | |||
For Ethereum, asset is not required when you provide eth_erc20_contract. | |||
btc_fee | string | ✕ | Optional BTC fee tier. Accepted values: low, normal, high. Defaults to the provider recommendation. May also accept a sat/vByte or sat/kByte string. |
eth_fee | string | ✕ | Optional Ethereum gas limit. Defaults to 21,000 for native ETH transfers and 65,000 for ERC-20 transfers. |
eth_max_priority_fee_per_gas | string | ✕ | Optional for Ethereum. Tip paid to validators, expressed in wei. Must not exceed eth_max_fee_per_gas. |
eth_max_fee_per_gas | string | ✕ | Optional for Ethereum. Total fee cap per gas unit in wei. Defaults to the API-estimated value when omitted. |
eth_erc20_contract | string | ✕ | Ethereum only. Provide a custom ERC-20 contract when sending a token not covered by asset. When present, omit asset. |
metadata | object | ✕ | Optional JSON object stored on the resulting transaction. Keys must be strings and data must be JSON serializable. |
Response
Successful broadcast:result flag to decide whether to retry or alert an operator. A value of "ok" always includes the blockchain transaction hash in tx_id; a value of "fail" contains the upstream provider’s error string. Even when the result is "ok", final settlement still depends on miners or validators confirming the transaction on-chain.
Examples
Errors
| Status | Payload | When it happens |
|---|---|---|
400 | { "error": "Missing required fields" } | Missing body parameters. |
403 | { "error": "API key is not valid" } | API key fails validation. |
404 | { "result": "not_found" } | Wallet does not exist or isn’t owned by your account. |
400 | { "error": "Wallet is not a BTC wallet" } | Attempting to send BTC assets from a non-BTC wallet. |
500 | { "error": "<message>" } | Unexpected service error. |
Bitcoin UTXO handling
When broadcasting BTC, 1151 first tries to cover the transfer amount(s) and miner fee with a single UTXO from the wallet. If no individual output is large enough, the platform selects the smallest possible combination of UTXOs to fulfill the spend. Any change output — including the remainder from consolidated UTXOs — is automatically returned to the wallet’s receiving address as a single UTXO.Operational tips
- ERC-20 and TRC-20 transfers require the wallet to maintain enough native token (ETH/TRX) for gas or energy.
- On Ethereum, choose one: either set
asset(for native ETH and supported tokens) or provideeth_erc20_contractfor a custom ERC-20. - When customizing Ethereum gas, ensure
eth_max_fee_per_gasis greater than or equal toeth_max_priority_fee_per_gas; otherwise broadcasts will fail client-side. - If you omit Ethereum gas overrides, the API uses current network estimates. Supply all three Ethereum-specific parameters when you want a fully custom gas configuration.
- Metadata travels with the transaction so you can look it up later via
/transaction/getor the SDK helpers.
client.sendFromWallet(...) / wallet.send(...) in JavaScript and client.send_from_wallet(...) / wallet.send(...) in Python) accept the full set of optional arguments described above, including ERC-20 contract overrides, custom fees, and BTC multi-output payloads.