POST /v2/crypto/transfers).
If you’re not familiar with how Bastion custody works, start with Custody concepts before continuing.
Transfer modes
There are two ways to send crypto from a Bastion account. Which modes are available depends on the account type and where the funds are going.
If your platform uses segregated wallets, all transfers are on-chain. If your platform uses omnibus accounts, you can use either mode depending on the destination.
Asynchronous processing
Crypto transfers are processed asynchronously. Submitting a transfer withPOST /v2/crypto/transfers returns 202 Accepted with { id, request_id }. The id is the transfer identifier, and request_id is the idempotency key you supplied. Track the transfer as it moves through Bastion’s processing queue by polling GET /v2/crypto/transfers/{transfer_id} with that id, or by listening for submit_cryptocurrency_transfer_v2 webhooks.
A transfer moves through ACCEPTED → SUBMITTED → CONFIRMED, with FAILED, DROPPED, and CANCELED as terminal error states. Each submit_cryptocurrency_transfer_v2 webhook includes id, request_id, and status. Deduplicate updates on id plus status and keep your handler idempotent, since deliveries can repeat.
Deposits
A deposit is the receiving side of a transfer. When crypto arrives at a Bastion account, whether from an external wallet, an exchange, or another account on the same platform, Bastion detects it, runs compliance screening, and credits the recipient’s balance. Deposits are delivered to your platform viadeposit_v2 webhooks. The source_type field indicates where the deposit came from:
Deposits from on-chain transfers include
source_address, destination_chain, and transaction_hash. Deposits from off-chain transfers include source_account_id, and the chain and hash fields are empty (CHAIN_UNSPECIFIED, empty string).
How transfers and deposits relate
A transfer and a deposit are two sides of the same movement. When a transfer completes, two events fire:- The sender receives a
submit_cryptocurrency_transfer_v2webhook - The recipient receives a
deposit_v2webhook
Transaction limit policies
Platforms can define limits on crypto transfers to manage risk. Transaction limit policies are configured through the Bastion Admin Dashboard and apply to transfers submitted via the crypto transfers endpoint. Policies are defined by four properties:
Up to four policies may apply to a given identity, one per combination of evaluation window and threshold type. When both an app-scoped and identity-scoped policy exist with the same evaluation window and threshold type, the identity-scoped policy takes precedence.
For full configuration details, see Transaction limit policies.
Related documentation
- Concepts
- Getting started