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 includedestinationAddress, the quote response includes payment instructions directly.
Successful response:
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 anapproved 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).
Successful response:
POST /v2/swap/bytecode.
Successful response:
transactionData, in order, from originAddress on the selected origin chain (base → chainId 8453, monad → chainId 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 — onlytokenOut 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>).
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.
Successful response:
POST /v2/swap/bytecode the same way as the plain offramp flow, passing the same quoteId, originAddress, and payout key:
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, useGET /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: setthirdParty=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).
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: