Skip to main content
A transfer debits an entity’s account and sends the funds to a counterparty’s payment details. Every transfer is asynchronous: the create response shows the initial state, and the final outcome arrives by webhook.

Choose a payment type

The payment type decides the rail. See Send a payout for the fields each rail needs.

Lifecycle

Subscribe to outflows.created, outflows.completed, outflows.failed and outflows.cancelled instead of polling. Treat the webhook as a prompt, then retrieve the transfer and read its status before you act. See Confirm state before acting.

Rules that affect your integration

  • Idempotency. unique_reference identifies a transfer for your entity. A second request with the same reference returns 409 error_duplicate_resource and does not return the original transfer.
  • Funds are checked at creation. If the account can’t cover the amount and fee, the request fails with 400 error_transfer_insufficient_funds and the message states the available balance.
  • Currency conversion needs a quote. When the source account currency differs from the transfer currency, pass an fx_quote_id. Each quote is single use. See FX quotes.
  • Payment details must be complete. A USD transfer to a bank account needs the full bank_address on the payment detail: line1, city, state, postal_code and country. Otherwise the transfer returns 422 error_validation_required_field_missing for the missing field.

Next steps