External wallets API
To send to a destination repeatedly, register it as an external wallet and allowlist one or more assets/addresses on it. An external transfer to a wallet is only permitted for assets allowlisted on that wallet — the wallet is the authorization boundary.
| Method | Path | Scope |
|---|---|---|
POST | /v1/external-wallets | external-wallets:write |
GET | /v1/external-wallets | external-wallets:read |
GET | /v1/external-wallets/{id} | external-wallets:read |
POST | /v1/external-wallets/{id}/assets | external-wallets:write |
DELETE | /v1/external-wallets/{id}/assets/{assetCanonical} | external-wallets:write |
Create a wallet and allowlist an asset
POST /v1/external-wallets
{ "label": "treasury-cold" }
POST /v1/external-wallets/{id}/assets
{ "assetCanonical": "USDT_ETHEREUM", "address": "0xfeed...beef", "memo": null }
The asset entry has a status. On some chains it starts pending (while the
allowlist entry is approved) and becomes active; a transfer can only target an
active asset entry.
Using a wallet in a withdrawal
Reference it by id in an external transfer:
POST /v1/transfers/external
{ "srcAccountId": "...", "assetCanonical": "USDT_ETHEREUM", "amount": "250.00",
"destination": { "externalWalletId": "b2d4...uuid" } }
Sending an asset that isn't allowlisted on the wallet returns 400. For one-off
destinations you can skip the allowlist and pass a destination.address
directly — see Send a withdrawal.