Skip to main content
Move funds from one asset to another: fiat to stablecoin, stablecoin to fiat, and stablecoin swaps. Stablecoin Exchange moves funds from one asset to another. It covers three operations: converting fiat into stablecoins, converting stablecoins into fiat, and swapping one stablecoin for another, including across chains. Every conversion settles at a locked rate and fee, and the result lands in the merchant’s stablecoin account by default or can be paid out directly to a recipient without touching the merchant account first. Exchange and Global Accounts are two sides of the same ledger: Global Accounts tracks which currency account holds the money, while exchange moves balances between currencies. Source accounts, destination accounts, and recipients are all maintained in Global Accounts; this document only describes rates, quotes, and conversions.

Use Cases

  • Convert fiat received from customers into USDT or USDC for settlement or outbound payments.
  • Convert stablecoins into local fiat and pay a supplier or an individual’s bank account directly.
  • Move stablecoins across chains, such as USDC on Solana into USDT on TRON.
  • Quote a price to a customer first and execute the conversion later at the same rate.

Core Concepts

Exchange rate. The rate endpoint returns the current mid-market price as a decimal string, for example 0.9998. Rates do not depend on the blockchain network; the same pair uses the same price across chains. Quote. A quote locks a rate and fee for a limited time and is single-use: referencing it in a transfer consumes it, and it expires if unused. Use quotes when you need to show a price to a customer or when the flow spans a longer period; to convert immediately, skip the quote and lock the rate in the transfer request. Transfer. The execution record of one conversion. All three conversion types are submitted through the same create-transfer endpoint, distinguished by transfer_type, and share one state machine.

Three Ways to Specify a Rate

Exactly one rate option applies per conversion.

The Three Conversion Types

Fiat to stablecoin. Converts a fiat deposit record in full: each record converts once and must be converted entirely, so the requested amount must equal the record amount. You can choose the target token and network; the result lands in the primary account by default, or in a specified account, or directly to a stablecoin address recipient. Stablecoin to fiat. Conversion and bank payout happen in one step: the fiat goes straight to the recipient’s bank account instead of landing in the merchant account. A fiat-account recipient is therefore required, and its currency must match the target currency. Stablecoin swap. Supports same-chain and cross-chain swaps: specify the source token and network plus the target token and network, and optionally pay the result directly to a stablecoin address recipient; without a recipient the funds enter the merchant account.

Fiat Deposits

Fiat conversions are funded by fiat deposit records. The collection details endpoint returns local clearing account details plus an attribution code; the payer puts that code in the transfer reference, and incoming funds are attributed to the merchant automatically and produce a deposit record. Before converting, query the convertible fiat deposit balance, which is the sum of deposit records not yet converted, aggregated by currency.

Fees, Settlement, and Status

Fees are charged in the source currency, and both quotes and transfers report the fee amount and its currency. The sell amount on a transfer excludes fees: the account is debited the sell amount plus the fee. Under floating, the target amount is an estimate and the executed result is authoritative. Network fees are borne by the platform. All three types share one status chain: processing → payment_submitted (funds dispatched) → completed. Terminal states also include funds_refunded and bounced_back, with the reason recorded on the failure reason field.

Events and Notifications

Exchange-related events cover fiat deposits being credited, the quote lifecycle, and the transfer lifecycle. They are pushed to the merchant’s configured webhook; the same event may arrive more than once, so deduplicate by event ID and confirm final state with transfer and quote queries. Handling guidance: transfer events only signal a state change; use GET /transfer/{transfer_id} for amounts and final state, and do not promise funds to customers before transfer.completed. On funds_refunded or bounced_back, update your records using the failure reason. Quote events exist so you can drop expired or consumed quotes instead of referencing them again.

Relationship to Other Products

Checkout, QR Pay, and Payment Links bring money in, exchange moves balances between currencies, and Global Accounts records and reports balances. Outbound payments can use the withdrawal capability in Global Accounts or the Payouts product; neither changes the rate and quote rules described here.

FAQ

Last modified on October 29, 2026