Skip to main content
Money movement routes are available only after Ramp status is approved. See Set up Pods Ramp to get a user to that state, and Track Pods Ramp status to poll both KYC approval and quote status. Pods Ramp uses the same Swap v2 quote routes across every supported country: originChain/destinationChain of fiat select the local payment rail, and tokenIn/tokenOut select the fiat currency or on-chain asset. The examples below use Brazil’s Pix rail, the only rail live today; Mexico, Colombia, and Argentina will use their own local rail and currency through the same routes once live. Send all requests from your backend with x-api-key; never expose PODS_API_KEY to a browser or mobile client.

Onramp: local fiat to crypto

Use this when a verified user pays in local fiat and receives a token on-chain. When you include destinationAddress, the quote response includes payment instructions directly.
Example (Brazil, Pix BRL to USDC on Base):
Successful response:
Show paymentInstructions to the user in the shape of the local rail — for Pix, paymentInstructions.pix.copyPaste is the copy-paste code. Use quote.feeBreakdown to display payment-rail, Pods/customer, and bridge or slippage charges.

Offramp: crypto to local fiat

Use this when a verified user pays a token on-chain and receives local fiat. The user must have an approved Ramp profile for the same originAddress. The examples below use Base; for Monad, set originChain=monad and the Monad USDC address, and sign the returned transactions on Monad (chainId 143).
Example (Brazil, USDC on Base to Pix BRL):
Successful response:
The quote locks the expected fiat output and fee breakdown. To create the origin-chain transactions and register the payout key, call POST /v2/swap/bytecode.
Request:
Successful response:
Execute every transaction in transactionData, in order, from originAddress on the selected origin chain (basechainId 8453, monadchainId 143; each transaction carries its own chainId). The first transaction transfers USDC to the returned depositAddress; the next transaction records the transfer for tracking. After Pods detects and collects the USDC payment, Pods creates the local-rail payout to pixKey.

Onramp to yield: local fiat to a yield-bearing asset

Some routes deposit fiat directly into a yield strategy instead of a plain token. The shape of the flow is identical to the plain onramp above — only tokenOut changes, from the plain token address to the strategy’s yield-bearing asset address (for example a vault share token such as <yield_asset> on <yield_chain>).
Example:
Successful response:
quote.tokenOut.decimals reflects the yield-bearing asset’s own decimals (for example 18 for a vault share token), not the underlying token’s decimals. quote.tokenOut.amount/expectedAmountOut is a raw share amount of <yield_asset>, not an underlying-token amount. Store it: it lets you reconstruct the exact deposited share amount later for a full yield-to-fiat withdraw. There is no on-chain transaction for the user to sign on this side. After the fiat payment settles, Pods collects it, converts it into the strategy’s underlying token, deposits into the strategy, and sends the resulting <yield_asset> shares to destinationAddress.

Offramp from yield: a yield-bearing asset back to local fiat

Use this when a verified user wants to redeem a yield position and receive local fiat. The input token is the yield-bearing asset itself (for example <yield_asset> on <yield_chain>), not the underlying token, and amountIn must be a raw share amount of <yield_asset> — not an underlying-token amount and not a principal/currentPosition value from the wallet endpoint (see Check yield position and profit below). For a full withdraw, use the wallet’s on-chain share balance, or the share amount stored from the onramp quote above.
Do not pass a USDC- or fiat-denominated position value as amountIn for a yield-to-fiat quote. amountIn here is always a raw share amount of the yield-bearing asset.
Example:
Successful response:
Call POST /v2/swap/bytecode the same way as the plain offramp flow, passing the same quoteId, originAddress, and payout key:
Successful response:
Execute every transaction in transactionData, in order, from originAddress. The first transaction redeems <yield_asset> into the strategy’s underlying token and sends it directly to depositAddress; the next transaction records the transfer for tracking. Pods validates the redeem on-chain before creating the local-rail payout to the payout key.

Check yield position and profit

For routes that hold a yield position, use GET /v2/wallets/{wallet} to read the strategy position instead of a plain token balance. Find the entry where strategy.id matches the strategy backing <yield_asset> on <yield_chain>. spotPosition.currentPosition, principal, profit, and cumulativeProfit are all reported in the strategy’s underlying token terms (for example USDC), even though the wallet’s on-chain balance is held as <yield_asset> shares. Do not use any of these values as the amountIn share amount for a yield-to-fiat quote — they are reporting values, not share amounts. To withdraw the full position to fiat, use the wallet’s on-chain <yield_asset> share balance or the share amount stored from the original onramp quote. If the user instead wants to exit the yield position into the underlying token on-chain (no fiat involved), use that strategy’s own withdraw bytecode endpoint, which takes an underlying-token amount rather than a share amount — see the yield strategy guides for details.

Offramp to a third party

Use this when a verified user wants to convert USDC (Base or Monad) into a fiat payment sent to someone else, instead of paying themselves back. This is the same offramp flow as above, with two differences: set thirdParty=true on both the quote and the bytecode request, and pass the recipient’s payout key (normal offramp assumes the payout key belongs to the same person as originAddress; third-party offramp does not).
thirdParty must be the same value on the quote and the bytecode request for the same quoteId. If they differ, POST /v2/swap/bytecode returns PIX_THIRD_PARTY_QUOTE_MISMATCH.
Example:
Then call POST /v2/swap/bytecode with the recipient’s payout key and the same thirdParty value used on the quote:
Execute transactionData and track status exactly as in the normal offramp flow above; only the recipient of the resulting payout differs. Reference: