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.
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 thefees array before any money moves.
To review fees before execution:
- Create a transfer with
execute: false - Review the
feesarray in the response - Call
POST /v2/transfers/{transferId}/executewhen ready to proceed
expiresAt field shows the deadline. If you use execute: false, you must call /execute before expiresAt.
Amount types
TheamountType 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, theexchangeRate object provides rate information:
rate indicates how many units of the target asset equal one unit of the source asset.
Estimated values
Theestimate 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):
Transfer validation
UsevalidateOnly: 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.Outcomes
Completion
When a transfer reachescompleted status, it contains the final execution details:
completedAt— When the transfer finishedexecutedAt— When the transfer moved fromquotedtoprocessingtargetAmount— The actual amount delivered to the targetdetails— Additional information (e.g., deposit destination reference)
Failure
When a transfer fails, thefailureReason 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
quotedstatus and the fee quote expired before/executewas called. Create a new transfer to get a fresh quote.
Travel rule
For transfers requiring travel rule compliance, include thetravelRule 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 topayment.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