Skip to main content
Transfers require a business account. If you’re interested in using this product, get in touch and our team will follow up to discuss fit.
Transfers represent both the request and execution of a fund movement from a source to a target. They provide upfront fee quotes and track the complete lifecycle from initiation through completion or failure.

Transfer types

Lifecycle

Transfers move through a simple lifecycle from quote to execution outcome.

Transfer statuses

Execution modes

Fee quotes

Every transfer provides a comprehensive fee quote in the fees array before any money moves. To review fees before execution:
  1. Create a transfer with execute: false
  2. Review the fees array in the response
  3. Call POST /v2/transfers/{transferId}/execute when ready to proceed
Fee quotes expire — the expiresAt field shows the deadline. If you use execute: false, you must call /execute before expiresAt.

Amount types

The amountType field controls whether the given amount is sent from source or received at target: Example — send exactly $100 to recipient, fees paid by sender:

Supported rails and settlement times

Exchange rate

For transfers involving currency conversion, the exchangeRate object provides rate information:
The rate indicates how many units of the target asset equal one unit of the source asset.

Estimated values

The estimate sub-object captures estimated values for transfers where amounts can’t be guaranteed (e.g., USDC → EURC). The values in estimate are not modified after a transfer is executed — they are preserved as an immutable record of the original pre-execution snapshot. The actual executed values are populated in the transfer resource post-execution. Quoted state example (USDC → EUR, rate not yet locked):
Completed state example (actual rate differed slightly from estimate):

Transfer validation

Use validateOnly: true to validate transfer parameters without creating a transfer. Useful for preflight checks.
validateOnly and execute are mutually exclusive. Setting both to true returns a 400 error.
See Transfer Validation for complete request/response examples, validation errors, and sandbox guidance.

Outcomes

Completion

When a transfer reaches completed status, it contains the final execution details:
  • completedAt — When the transfer finished
  • executedAt — When the transfer moved from quoted to processing
  • targetAmount — The actual amount delivered to the target
  • details — Additional information (e.g., deposit destination reference)

Failure

When a transfer fails, the failureReason field contains a human-readable description of what went wrong. A transfer can reach failed status in two ways:
  • Execution error — the transfer was executing and encountered an error (e.g., insufficient balance, network failure).
  • Quote expiration — the transfer was in quoted status and the fee quote expired before /execute was called. Create a new transfer to get a fresh quote.

Travel rule

For transfers requiring travel rule compliance, include the travelRule object with originator and beneficiary details. Set isIntermediary: true when your organization is a VASP using Coinbase to send crypto on behalf of your end customer. You must then provide the originator object with the sender’s details and your VASP information.

Webhooks

Subscribe to payment.transfer.* events to receive real-time status updates as transfers move through their lifecycle. See Webhooks for setup instructions.

Next steps

Quickstart

Create your first transfer in Sandbox

Example payloads

Payload shapes for each source/target type

Validation

Preflight checks and validation errors

Webhooks

Subscribe to transfer status events