Skip to main content
Transfers are the core payment processing component of Infinite, handling movement of funds across fiat and crypto rails with built-in compliance.

Overview

A transfer moves money from a source account to a destination account, optionally converting between currencies. Transfers support:
  • Fiat to crypto — Deposit fiat, receive stablecoins
  • Crypto to fiat — Deposit stablecoins, receive fiat via SWIFT, SEPA, ACH, etc.
  • Crypto to crypto — Move between chains or stablecoins. Same-asset USDC/USDT across supported chains settles at par — see Same-asset bridging
  • Fiat to fiat — Cross-border fiat payments
Transfers are one-off: you specify the amount and destination per payment. For a standing deposit address that sweeps every incoming deposit automatically, see Fixed Routes.

Creating a Transfer

Every transfer requires a source, destination, amount, and payment reason:

Key Fields

Response

Transfer Status

If funds have already been received and the transfer needs manual review before it can be settled or returned, the transfer remains IN_REVIEW externally until it reaches COMPLETED or REVERSED.

Transfer Legs

Transfers are broken into legs (steps) that represent each segment of the payment flow. For example, a crypto-to-fiat transfer might have:
  1. Crypto deposit leg — Customer deposits stablecoins
  2. Conversion leg — Stablecoins converted to fiat
  3. Fiat payout leg — Fiat sent to bank account
Each leg has its own status (PENDING, IN_PROGRESS, COMPLETED, FAILED, SKIPPED) and is visible in the transfer response under the legs array.

Deposit Instructions

When a transfer requires the customer to deposit funds (e.g. crypto or fiat), the response includes depositInstructions. One-off POST /v1/transfers onramps often reuse the same bank coordinates for a customer. There is no unique memo or transaction reference on those fiat instructions, so concurrent deposits cannot be told apart by bank details — matching is by amount. Parallel onramps at the same amount will collide. For concurrent or recurring USD→crypto, create a unique virtual bank account per destination with POST /v1/fixed-routes/virtual-bank-accounts and sweepTargetAccountId set to that wallet. Each route gets its own account number, so the deposit identifies itself. Listen for transfer.* webhooks on the auto-created sweep — no per-deposit create-transfer needed. The same pattern applies to crypto offramps via POST /v1/fixed-routes/virtual-wallets (unique deposit address per destination).

Crypto Deposit

Fiat Deposit

Amounts

All amounts in the API use the MoneyOutput format:
  • value is the amount in the smallest unit (cents, base units)
  • exponent is the number of decimal places
  • displayValue is the human-readable decimal
When creating transfers, use MoneyInput:

Tracking Transfers

Webhooks

Subscribe to transfer events for real-time updates:
  • transfer.created — Transfer created
  • transfer.processing — Transfer is being processed
  • transfer.completed — Transfer completed successfully
  • transfer.failed — Transfer failed before funds were received
  • transfer.cancelled — Transfer was cancelled
  • transfer.refund_initiated — Refund was initiated
  • transfer.refund_completed — Refund completed
See the Webhooks guide for setup instructions.

Next Steps

Quotes and Transfers

Learn about quoting and rate locking

SWIFT Payouts

Crypto-to-fiat via SWIFT wire transfers

Same-asset bridging

USDC or USDT from one chain to another at par