> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pods.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Move Money with Pods Ramp

> Onramp, offramp, and yield quotes for Pods Ramp

Money movement routes are available only after Ramp status is `approved`. See [Set up Pods Ramp](/guides/ramp/setup) to get a user to that state, and [Track Pods Ramp status](/guides/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.

```http theme={null}
GET /v2/swap/quote
```

Example (Brazil, Pix BRL to USDC on Base):

```bash theme={null}
curl -sS \
  -H "x-api-key: $PODS_API_KEY" \
  "$PODS_API_BASE_URL/v2/swap/quote?originChain=fiat&destinationChain=base&tokenIn=BRL&tokenOut=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&amountIn=1000&destinationAddress=0x0000000000000000000000000000000000000001"
```

| Query parameter      | Required | Value                                                                      |
| -------------------- | -------- | -------------------------------------------------------------------------- |
| `originChain`        | Yes      | `fiat`                                                                     |
| `destinationChain`   | Yes      | `base`                                                                     |
| `tokenIn`            | Yes      | Local fiat currency, e.g. `BRL`                                            |
| `tokenOut`           | Yes      | Base USDC: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`                    |
| `amountIn`           | Yes      | Fiat amount in the currency's smallest unit. Example: `1000` is BRL 10.00. |
| `destinationAddress` | Yes      | User wallet address that will receive USDC on Base.                        |

Successful response:

```json theme={null}
{
  "quote": {
    "quoteId": "9be08433-3338-4881-9517-31faa22489c9",
    "originChain": "fiat",
    "destinationChain": "base",
    "tokenIn": {
      "symbol": "BRL",
      "decimals": 2,
      "amount": "1000"
    },
    "tokenOut": {
      "contract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "symbol": "USDC",
      "decimals": 6,
      "expectedAmountOut": "1769602",
      "chainId": 8453
    },
    "status": "pending",
    "deadlineDate": "2026-06-25T15:38:38.670Z",
    "feeBreakdown": {
      "charges": [
        {
          "kind": "paymentRail",
          "label": "Pix fee",
          "amountRaw": "77",
          "decimals": 2,
          "symbol": "BRL",
          "asset": "tokenIn"
        },
        {
          "kind": "bridgeAndSlippage",
          "label": "Bridge fee + slippage",
          "amountRaw": "8848",
          "decimals": 6,
          "symbol": "USDC",
          "asset": "tokenOut"
        }
      ]
    }
  },
  "paymentInstructions": {
    "method": "PIX",
    "amount": {
      "currency": "BRL",
      "amountRaw": "1000",
      "decimals": 2
    },
    "expiresAt": "2026-06-25T15:43:39.433Z",
    "pix": {
      "copyPaste": "000201010212..."
    }
  },
  "id": "9be08433-3338-4881-9517-31faa22489c9"
}
```

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).

```http theme={null}
GET /v2/swap/quote
```

Example (Brazil, USDC on Base to Pix BRL):

```bash theme={null}
curl -sS \
  -H "x-api-key: $PODS_API_KEY" \
  "$PODS_API_BASE_URL/v2/swap/quote?originChain=base&destinationChain=fiat&tokenIn=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&tokenOut=BRL&amountIn=1000000&originAddress=0x0000000000000000000000000000000000000001"
```

| Query parameter    | Required | Value                                                                                                             |
| ------------------ | -------- | ----------------------------------------------------------------------------------------------------------------- |
| `originChain`      | Yes      | `base` or `monad`                                                                                                 |
| `destinationChain` | Yes      | `fiat`                                                                                                            |
| `tokenIn`          | Yes      | Base USDC: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`; Monad USDC: `0x754704Bc059F8C67012fEd69BC8A327a5aafb603` |
| `tokenOut`         | Yes      | Local fiat currency, e.g. `BRL`                                                                                   |
| `amountIn`         | Yes      | USDC amount in smallest units. Example: `1000000` is 1.00 USDC.                                                   |
| `originAddress`    | Yes      | Approved wallet address that will send USDC on the selected origin chain.                                         |

Successful response:

```json theme={null}
{
  "quote": {
    "quoteId": "1ed3ff63-58b8-4eb4-9152-723bbdfec724",
    "originChain": "base",
    "destinationChain": "fiat",
    "tokenIn": {
      "contract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "symbol": "USDC",
      "decimals": 6,
      "amount": "1000000",
      "chainId": 8453
    },
    "tokenOut": {
      "contract": "BRL",
      "symbol": "BRL",
      "decimals": 2,
      "amount": "520",
      "expectedAmountOut": "520",
      "chainId": 0
    },
    "provider": "deframe",
    "status": "pending",
    "deadlineDate": "2026-06-29T22:21:12.230Z",
    "feeBreakdown": {
      "charges": [
        {
          "kind": "paymentRail",
          "label": "Pix fee",
          "amountRaw": "20",
          "decimals": 2,
          "symbol": "BRL",
          "asset": "tokenOut"
        }
      ]
    }
  }
}
```

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`.

```http theme={null}
POST /v2/swap/bytecode
```

Request:

```json theme={null}
{
  "quoteId": "1ed3ff63-58b8-4eb4-9152-723bbdfec724",
  "originAddress": "0x0000000000000000000000000000000000000001",
  "pixKey": "user-pix-key@example.com"
}
```

| Body field      | Required | Description                                                                            |
| --------------- | -------- | -------------------------------------------------------------------------------------- |
| `quoteId`       | Yes      | Quote id returned by `/v2/swap/quote`.                                                 |
| `originAddress` | Yes      | Approved wallet address that will sign the USDC transfer on the selected origin chain. |
| `pixKey`        | Yes      | Payout key for the local rail that will receive the fiat. For Pix, the Pix key.        |

Successful response:

```json theme={null}
{
  "chainId": 8453,
  "depositAddress": "0x4444444444444444444444444444444444444444",
  "transactionData": [
    {
      "chainId": "8453",
      "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "data": "0x...",
      "value": "0"
    },
    {
      "chainId": "8453",
      "to": "0x...",
      "data": "0x...",
      "value": "0"
    }
  ],
  "id": "1ed3ff63-58b8-4eb4-9152-723bbdfec724"
}
```

Execute every transaction in `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 -- 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>`).

```http theme={null}
GET /v2/swap/quote
```

Example:

```bash theme={null}
curl -sS \
  -H "x-api-key: $PODS_API_KEY" \
  "$PODS_API_BASE_URL/v2/swap/quote?originChain=fiat&destinationChain=<yield_chain>&tokenIn=BRL&tokenOut=<yield_asset_address>&amountIn=1000&destinationAddress=0x0000000000000000000000000000000000000001"
```

| Query parameter      | Required | Value                                                  |
| -------------------- | -------- | ------------------------------------------------------ |
| `originChain`        | Yes      | `fiat`                                                 |
| `destinationChain`   | Yes      | `<yield_chain>`                                        |
| `tokenIn`            | Yes      | Local fiat currency, e.g. `BRL`                        |
| `tokenOut`           | Yes      | `<yield_asset>` contract address on `<yield_chain>`    |
| `amountIn`           | Yes      | Fiat amount in the currency's smallest unit.           |
| `destinationAddress` | Yes      | User wallet address that will receive `<yield_asset>`. |

Successful response:

```json theme={null}
{
  "quote": {
    "quoteId": "9be08433-3338-4881-9517-31faa22489c9",
    "originChain": "fiat",
    "destinationChain": "<yield_chain>",
    "tokenIn": {
      "symbol": "BRL",
      "decimals": 2,
      "amount": "1000"
    },
    "tokenOut": {
      "contract": "<yield_asset_address>",
      "symbol": "<yield_asset>",
      "decimals": 18,
      "expectedAmountOut": "...",
      "chainId": 0
    },
    "status": "pending",
    "deadlineDate": "2026-06-25T15:38:38.670Z",
    "feeBreakdown": {
      "charges": []
    }
  },
  "paymentInstructions": {
    "method": "PIX",
    "amount": {
      "currency": "BRL",
      "amountRaw": "1000",
      "decimals": 2
    },
    "expiresAt": "2026-06-25T15:43:39.433Z",
    "pix": {
      "copyPaste": "000201010212..."
    }
  },
  "id": "9be08433-3338-4881-9517-31faa22489c9"
}
```

`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](#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.

<Warning>
  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.
</Warning>

```http theme={null}
GET /v2/swap/quote
```

Example:

```bash theme={null}
curl -sS \
  -H "x-api-key: $PODS_API_KEY" \
  "$PODS_API_BASE_URL/v2/swap/quote?originChain=<yield_chain>&destinationChain=fiat&tokenIn=<yield_asset_address>&tokenOut=BRL&amountIn=1000000000000000000&originAddress=0x0000000000000000000000000000000000000001"
```

| Query parameter    | Required | Value                                                            |
| ------------------ | -------- | ---------------------------------------------------------------- |
| `originChain`      | Yes      | `<yield_chain>`                                                  |
| `destinationChain` | Yes      | `fiat`                                                           |
| `tokenIn`          | Yes      | `<yield_asset>` contract address on `<yield_chain>`              |
| `tokenOut`         | Yes      | Local fiat currency, e.g. `BRL`                                  |
| `amountIn`         | Yes      | Raw `<yield_asset>` share amount to redeem.                      |
| `originAddress`    | Yes      | Approved wallet address that holds the `<yield_asset>` position. |

Successful response:

```json theme={null}
{
  "quote": {
    "quoteId": "1ed3ff63-58b8-4eb4-9152-723bbdfec724",
    "originChain": "<yield_chain>",
    "destinationChain": "fiat",
    "tokenIn": {
      "contract": "<yield_asset_address>",
      "symbol": "<yield_asset>",
      "decimals": 18,
      "amount": "1000000000000000000",
      "chainId": 0
    },
    "tokenOut": {
      "contract": "BRL",
      "symbol": "BRL",
      "decimals": 2,
      "amount": "...",
      "expectedAmountOut": "...",
      "chainId": 0
    },
    "provider": "deframe",
    "status": "pending",
    "deadlineDate": "2026-06-29T22:21:12.230Z",
    "feeBreakdown": {
      "charges": []
    }
  }
}
```

Call `POST /v2/swap/bytecode` the same way as the plain offramp flow, passing the same `quoteId`, `originAddress`, and payout key:

```http theme={null}
POST /v2/swap/bytecode
```

```json theme={null}
{
  "quoteId": "1ed3ff63-58b8-4eb4-9152-723bbdfec724",
  "originAddress": "0x0000000000000000000000000000000000000001",
  "pixKey": "user-pix-key@example.com"
}
```

Successful response:

```json theme={null}
{
  "chainId": 0,
  "depositAddress": "0x4444444444444444444444444444444444444444",
  "transactionData": [
    {
      "chainId": "0",
      "to": "<yield_asset_address>",
      "data": "0x...",
      "value": "0"
    },
    {
      "chainId": "0",
      "to": "0x...",
      "data": "0x...",
      "value": "0"
    }
  ],
  "id": "1ed3ff63-58b8-4eb4-9152-723bbdfec724"
}
```

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).

<Warning>
  `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`.
</Warning>

```http theme={null}
GET /v2/swap/quote
```

Example:

```bash theme={null}
curl -sS \
  -H "x-api-key: $PODS_API_KEY" \
  "$PODS_API_BASE_URL/v2/swap/quote?originChain=base&destinationChain=fiat&tokenIn=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&tokenOut=BRL&amountIn=1000000&originAddress=0x0000000000000000000000000000000000000001&thirdParty=true"
```

| Query parameter    | Required | Value                                                                                                             |
| ------------------ | -------- | ----------------------------------------------------------------------------------------------------------------- |
| `originChain`      | Yes      | `base` or `monad`                                                                                                 |
| `destinationChain` | Yes      | `fiat`                                                                                                            |
| `tokenIn`          | Yes      | Base USDC: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`; Monad USDC: `0x754704Bc059F8C67012fEd69BC8A327a5aafb603` |
| `tokenOut`         | Yes      | Local fiat currency, e.g. `BRL`                                                                                   |
| `amountIn`         | Yes      | USDC amount in smallest units.                                                                                    |
| `originAddress`    | Yes      | Approved wallet address that will send USDC on the selected origin chain.                                         |
| `thirdParty`       | Yes      | `true`. Marks this offramp as paying a key that does not belong to `originAddress`'s own Ramp profile.            |

Then call `POST /v2/swap/bytecode` with the recipient's payout key and the same `thirdParty` value used on the quote:

```http theme={null}
POST /v2/swap/bytecode
```

```json theme={null}
{
  "quoteId": "1ed3ff63-58b8-4eb4-9152-723bbdfec724",
  "originAddress": "0x0000000000000000000000000000000000000001",
  "pixKey": "recipient-pix-key@example.com",
  "thirdParty": true
}
```

| Body field      | Required | Description                                                                                     |
| --------------- | -------- | ----------------------------------------------------------------------------------------------- |
| `quoteId`       | Yes      | Quote id returned by `/v2/swap/quote`.                                                          |
| `originAddress` | Yes      | Approved wallet address that will sign the USDC transfer on the selected origin chain.          |
| `pixKey`        | Yes      | Payout key of the **recipient** receiving the payment -- not the origin wallet owner's own key. |
| `thirdParty`    | Yes      | `true`, matching the value sent on the quote request.                                           |

Execute `transactionData` and track status exactly as in the normal offramp flow above; only the recipient of the resulting payout differs.

Reference:

* [Get a quote](/guides/swaps/get-quote)
* [Execute a swap](/guides/swaps/execute-swap)
