Skip to main content
Swaps convert balance between your seven assets — USD, USDT, USDC, BTC, GOLD, SILVER and PLATINUM — synchronously and instantly, without the money ever leaving your account. Any pair works (including direct BTC ↔ GOLD, and USD ↔ USDT at exact 1:1); local fiat (BOB, MXN, ARS) is not swappable yet (invalid_pair). The rate you see in the quote is the rate you execute at: no separate fees — quoted = received.

1. Quote (optional, free)

The quote is indicative: the swap executes at the rate of the POST moment (BTC and GOLD prices move). Stablecoin pairs (USDT ↔ USDC) are stable.

2. Execute the swap

amount is in the source currency (from_asset), with up to its decimals (6 for USDT/USDC/GOLD/SILVER/PLATINUM, 8 for BTC). 201 response — the swap is synchronous, your balance changes instantly:
Replaying with the same idempotency_key → 200 with the original swap and idempotency_hit: true — never re-executed.

3. Query and history

In your movements (GET /v1/movements) and in the statement the swap shows as swap_out in the source currency and swap_in in the destination, each reconciling in its own section.

Rules and limits

  • Same account: the money never leaves your account — it only changes currency. That is why no OTP is required.
  • Any pair between USDT, USDC, BTC and GOLD (source ≠ destination).
  • Execution rate of the moment: BTC and GOLD use the live execution price; if it is unavailable or stale the swap is rejected with 503 pricing_unavailable (it never executes on an old price).
  • Volatile-currency limits (BTC/GOLD/SILVER/PLATINUM, shared with payouts and card purchases): per-operation cap and 24h rolling volume cap per account (GET /v1/settlement shows yours). USDT ↔ USDC has no limit.
  • Requires your approved identity verification and the swaps service enabled.

BTC price protection

For BTC swaps valued at USD 1,000 or more, CBPay checks the execution reference against the current market book before the swap. If the divergence exceeds the configured threshold, the request returns 422 guard_diverged; wait for convergence or split the operation and retry with the same idempotency_key. If market data is temporarily unavailable, the swap may continue with an operational alert and the execution-price safeguards still apply. This protection does not apply to internal checkout/payin conversions or OTC flows.

Errors

FAQ

The quoted rate is your account’s execution rate: it includes the cost of providing instant, guaranteed conversion (immediate liquidity, no slippage, without leaving your account). Same philosophy as payout and payin rates: what is quoted is exactly what you receive, with no surprise fees afterwards.
No — it is indicative. BTC and GOLD move, so execution uses the price at the POST moment. Between stablecoins (USDT ↔ USDC) the difference is negligible. For the final figure, check the to_amount in the swap response (already credited).
There is no undo: an executed swap is final (your balance already changed). You can swap back any time, at that moment’s rate.
Volatile-currency limits are shared across swaps, payouts paid from BTC/GOLD/SILVER/PLATINUM and card purchases from BTC/GOLD/SILVER/PLATINUM — they all count against the same 24h rolling volume of your account. Check your caps at GET /v1/settlement.
GOLD represents grams of fine gold and BTC bitcoin: price exposure without leaving the ecosystem. You can pay payouts, fees and card purchases straight from those balances (multi-asset settlement), and swap back to USDT/USDC whenever you want.

USD as the principal ledger asset

Accounts use USD as the default for settlement_asset and payin_settlement_asset; change it any time with PUT /v1/settlement. In-flight operations are never re-quoted. USD ledger amounts use cents (two decimal places). Direct credits and debits, fees, and supported payout, checkout, POS, and card paths use USD only where their asset field accepts it. Swaps between USD and USDT use 1:1 pricing and do not use an FX oracle. BOB, MXN, and ARS remain separate fiat-ledger assets; v1 money-out pricing for those assets remains unavailable. Swap execution may have an internal back-office coverage workflow. This does not change the POST /v1/swaps request or response, the execution rate, or the account ledger contract. A payin credited directly to a USD-principal account exposes credit_asset: USD and the credited fiat amount in cents; usdt_credited remains the USD-equivalent reporting field. A controversy hold follows the credited asset: USD credits use hold_asset: USD. disputed and held use hold-asset units; disputed_usdt and held_usdt are normalized equivalents.
Last modified on October 14, 2026