Wallet transfers
Move value between your wallets and across chains: directly, through a centralized-exchange hop at the best available rate, through one named venue, or through a privacy-coin leg. Non-custodial throughout.
Funding a set of fresh wallets, sweeping them back, moving SOL to Robinhood chain or BNB Chain: /api/transfer does all of it with one request shape. You pick a route (where the coins travel) and a mode (how the exchange executes). You sign exactly one thing: a deposit from your wallet. We never hold the coins.
Routes
| Route | What happens | When to use it |
|---|---|---|
direct | One signed transfer on the same chain, wallet → wallet. Nothing in between. | Moving money between wallets you are happy to see linked on chain. Same chain only. |
exchange · venue: "auto" | Smart routing. The order goes to the provider with the best price, speed and reliability at that moment, drawn from centralized-exchange liquidity. The destination is paid by the exchange, not by your wallet. | Default. Best rate, no on-chain link between the two wallets. |
exchange · venue: "<exchange>" — break wallet cluster | Execution is forced through the exchange you name (bybit, kucoin, htx, mexc, …), so the destination is paid out by that exchange's hot wallet, not by the default route's. On-chain, the new wallet's funder is a different exchange from the one that funded your other wallets. GET /api/transfer/venues says which are open; a closed one is refused with transfer_route_off. The answer carries venueHonoured. Non-default venues cost about 1 % more (their withdrawal fee). | Fresh wallets that must not share a funder with your existing ones. |
exchange · venue: "random" | A venue rolled per transfer (small amounts favour the cheapest route; larger ones mix venues). | Batches: fan-outs whose destinations should look independently funded. |
| cross-chain | Any exchange route with a different destination chain: SOL → ETH on Robinhood chain, SOL → BNB, ETH → SOL. The exchange does the conversion. | Moving between chains without a bridge contract or a wrapped asset. |
Which routes are open
The exchange switches venues off from time to time. GET /api/transfer/venues probes every route every two minutes without creating anything and reports open / closed / unknown per venue, plus the state of the default route. routes includes the same status on each venue entry, venue: "random" only rolls open venues, and a transfer to a closed venue is refused up front rather than silently rerouted.
{
"exchange": "on", "checkedAt": "2026-10-22T23:52:10.000Z",
"venues": {
"binance": { "status": "open", "default": true },
"bybit": { "status": "open" },
"kucoin": { "status": "closed", "reason": "the exchange refuses this route for our account" },
"htx": { "status": "closed", "reason": "switched off at the exchange right now" },
"mexc": { "status": "closed", "reason": "switched off at the exchange right now" },
"bitget": { "status": "closed", "reason": "switched off at the exchange right now" },
"gate": { "status": "closed", "reason": "switched off at the exchange right now" }
}
}
Modes
| Mode | Execution | Fee | Timing |
|---|---|---|---|
float (default) | Market rate at execution; output may vary slightly. | ~0.1–0.4 % | Fastest: usually under a few minutes. |
fixed | Rate locked when the order is created; exact output guaranteed. | 0.8 % | Same once the deposit confirms; the deposit must land within ~15 minutes or the order expires. |
private | Routed through a Monero or Zcash leg before paying out: the exchange converts in, hops through the privacy coin, converts out. | 1 % + network fees | Typically 5 minutes or more. |
Chains
| Chain | As source (from) | As destination (to) | Native unit |
|---|---|---|---|
Solana sol | yes — unsigned v0 deposit transaction | yes | SOL |
Robinhood chain rh | yes — {to, value, gas} deposit transaction | yes | ETH |
Ethereum eth | not yet | yes | ETH |
BNB Chain bnb | not yet | yes | BNB |
| Arc, Base | not yet | not yet (bridge route planned) | — |
How a transfer runs
Quote
GET /api/transfer/routes?from=sol&to=rh&amount=0.5→ every route and mode available now, with receive amount, fee, minimum and ETA. Respectmin.Create
POST /api/transfer→ the exchange opens an order; you get a one-time deposit address and an unsigned deposit transaction fromfrom.walletfor exactly the deposit amount.Sign and send
Sign that transaction with your wallet and submit it (
POST /api/sol/send, or your own node). Promptly: the address is single-use and fixed orders expire.Track
GET /api/transfer/:id→awaiting_deposit→exchanging→completedwithpayoutHashon the destination chain. Failed or slow orders carry ahelpblock with the receipt link and support contacts.
429 transfer_busy), 5 creations a minute per key, 25 legs per batch. The provider behind the exchange route is ours to run; you need no account with it.