Skip to main content
Onchain Transfer moves stablecoins between wallets on the same chain, single or batched. v2 and v3 share the same underlying transfer engine and status enum — what changed is how source/destination are specified (always a registered wallet in v3, never a raw address). Cancellation and CSV export aren’t available in v3 yet. See the platform-wide changes for ID format, pagination, error shape, and idempotency.

Endpoints

Request changes: create a transfer

v2 identified source/destination by chain + user/wallet, and allowed a raw destination address:
v3 requires registered wallets on both sides and derives chain from the source wallet:
If you currently send to raw, unregistered addresses in v2, plan for an extra step in v3: register the destination as an External Wallet before you can transfer to it.

Request changes: create a batch transfer

v2 — one destination array (destination.batch), each entry needs a bare userId or raw walletAddress and a string amount; chain and top-level requireApproval work the same as a single transfer:
v3destination.batch becomes a top-level destinations array of registered wallets with numeric amounts; chain is still derived from the source wallet:
Same 50-item cap and XRPL exclusion apply on both sides.

Response changes: single transfer

v2 (nested envelope, lowercase currency):
v3 (flat, uppercase currency):

Response changes: batch transfer

v2 (nested envelope, source/destination entries carry a raw userId/walletAddress):
v3 (flat, one receipt for the whole batch):

Status and lifecycle

Unchanged — v2 and v3 share the exact same status enum (OPEN_QUOTE, PENDING_APPROVAL, COMPLETED, etc.). Note CANCELLED still exists in the shared enum even though the public cancel endpoint isn’t available in v3 yet.