Skip to main content
A crypto transfer moves digital assets from one Bastion account to a destination. Transfers operate on Bastion-custodied accounts and are submitted through a single endpoint (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 with POST /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 ACCEPTEDSUBMITTEDCONFIRMED, 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 via deposit_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_v2 webhook
  • The recipient receives a deposit_v2 webhook
These are separate events on separate accounts. Your platform may handle one or both depending on whether the sender, the recipient, or both are on your platform.

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.