Create a transfer
POST/transfers
Moves money in one of three shapes, inferred from the endpoints:
- Fund a wallet — source = bank-account payment method, destination = wallet account (pull; settles asynchronously).
- Pay an account — source = your wallet account, destination = another wallet account (internal; instant & final for a fiat currency). When the currency is a crypto code (e.g.
BASE-USDC) this same shape moves a crypto wallet balance between accounts instead — e.g. player ↔ casino USDC transfers — and settles asynchronously over the crypto rail rather than posting instantly. - Cash out — source = wallet account, destination = bank-account payment method (push; settles asynchronously). A crypto-currency source cashes out to a bank (USDC → USD).
You must control the source account. Sending to a bank (cash-out/payout) requires the source account to be KYX-verified. bank→bank is rejected.
Request
Header Parameters
Unique key per logical transfer. Replaying the same key (for the same account) returns the original transfer instead of creating a new one.
- application/json
Body
required
- Wallet to wallet (internal)
- Wallet to bank (cash-out, fiat)
- Bank to wallet (funding)
- Crypto cashout (crypto wallet → external bank)
oneOf
Source account id — its wallet for the transfer currency is debited. The actor is this account.
Destination account id — its wallet for the transfer currency is credited. May be a different account than the source.
Possible values: >= 1
Amount in the smallest currency unit (e.g. cents).
ISO 4217 currency code (e.g. USD) for a fiat wallet-to-wallet move, or a crypto currency code in CHAIN-TOKEN format (e.g. BASE-USDC) to move a crypto wallet balance between accounts. Addresses the (account, currency) wallet on each side.
Optional merchant-facing description.
metadata
object
Optional arbitrary key/value pairs.
Optional arbitrary key/value pairs.
Source account id — its wallet for the transfer currency is debited. The actor is this account.
Destination bank-account payment-method id (the ACH push target). Must belong to the source account.
Possible values: >= 1
Amount in the smallest currency unit (e.g. cents). Must not exceed the wallet's available balance.
ISO 4217 currency code, e.g. USD. Addresses the source (account, currency) wallet; the bank account must operate in this currency.
Optional merchant-facing description.
metadata
object
Optional arbitrary key/value pairs.
Optional arbitrary key/value pairs.
Source bank-account payment-method id (the ACH pull origin). The actor is this payment method's owner.
Destination account id — its wallet for the transfer currency is credited (held pending until settlement). Must own the source bank account.
Possible values: >= 1
Amount in the smallest currency unit (e.g. cents).
ISO 4217 currency code, e.g. USD. Addresses the destination (account, currency) wallet; the bank account must operate in this currency.
Optional merchant-facing description.
metadata
object
Optional arbitrary key/value pairs.
Optional arbitrary key/value pairs.
Source account id — its crypto wallet for the given currency is debited. The actor is this account.
Destination bank-account payment-method id (the ACH push target). Must belong to the source account.
Possible values: >= 1
Amount in the smallest currency unit. For USDC this is the value in micro-dollars (e.g. 1000000 = $1.00 USDC).
Crypto currency code in CHAIN-TOKEN format. Currently supported: BASE-USDC (USDC on Base mainnet, converted to USD on cash-out).
Optional merchant-facing description.
metadata
object
Optional arbitrary key/value pairs.
Optional arbitrary key/value pairs.
Responses
- 200
- 202
- 401
- 403
- 409
- 422
- 500
Transfer created and final. Returned for an internal fiat wallet-to-wallet transfer, which posts synchronously. No response body — read the created transfer from the Location header (GET /transfers/{id}) or transfer.* webhooks.
Response Headers
Location
string
Path of the created transfer, e.g.
/transfers/{transfer_id}.
Transfer accepted and still settling. Returned when a bank leg is involved (fund-wallet pull or cash-out push), or when a crypto wallet-to-wallet / crypto cash-out transfer is dispatched over the crypto rail; the transfer is created but not yet final. No response body — read the created transfer from the Location header (GET /transfers/{id}) or transfer.* webhooks.
Response Headers
Location
string
Path of the created transfer, e.g.
/transfers/{transfer_id}.
Access token is missing or invalid
Access denied
Request failed due to a conflict in the provided entity
- application/json
- Schema
- Example (from schema)
Schema
Possible values: [fail]
Possible values: [409]
Failure reason
{
"status": "fail",
"code": 409,
"message": "Entity with Id already exists"
}
Request failed due to validation failure
Server error