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

# 💵 Off-Ramp

> The Off-Ramp feature provided by Capa allows users to sell cryptocurrencies to get fiat currencies. Capa supports off-ramp operations for MXN (Mexican Peso) and DOP (Dominican Peso).

***

## Integration Flow

<Steps>
  <Step title="Create a user and complete KYC">
    [Create User](/reference/userpartnercontrollerv2_createuser), then [KYC verification](/reference/userpartnercontrollerv2_createverificationlink)
  </Step>

  <Step title="Get an off-ramp quote (optional)">
    [Create Quote](/reference/quotepartnerv2controller_createpartnerquote) to lock the exchange rate
  </Step>

  <Step title="Create off-ramp transaction">
    [Create Off Ramp](/reference/offramppartnerv2controller_createpartnerofframp)
  </Step>

  <Step title="User sends crypto">
    The user sends crypto to the wallet address returned in the transaction response
  </Step>
</Steps>

## How to do an Off-Ramp Operation

To successfully execute an off-ramp operation, follow these steps:

1. ### Select the Blockchain and Token:
   1. The following is a list of the Blockchains and Tokens
   2. The list of Blockchains - Tokens symbols supported in Capa are:
      1. POL - USDC, USDT
      2. ETH - USDC
      3. SOL - USDC
      4. BSC - USDT (available only for transactions over 50,000 MXN)

2. ### Select the Fiat Currency:
   1. Choose the supported fiat currency for the transaction. Capa currently supports the following fiat currencies:
      1. MXN (Mexican Peso)
      2. DOP (Dominican Peso)
      {/* 4. EUR (Euro) */}

3. ### Quoting:
   1. To show a real-time estimate of how much fiat the user will get with the selected **Blockchain Token**, **Fiat Currency** and **Amount** use the [Get Quote Rate](/reference/quotepartnerv2controller_getpartnerquoterate) endpoint.
   2. To lock a guaranteed exchange rate, use the [Create Quote](/reference/quotepartnerv2controller_createpartnerquote) endpoint. This returns a `quoteId` with an expiration time (`expiresAt`). Pass the `quoteId` when creating the transaction to use the locked rate.
   3. You can specify either `fiatAmount` or `cryptoAmount` in the quote request.
   4. **Forward Settlement (MXN OTC only):** For MXN orders above 50,000 MXN (OTC), the locked quote supports a `forwardingDays` parameter (0-4) that lets you lock the rate now but settle the transaction T+N days later.

4. ### User Bank Information:
   1. The user bank information can be provided in multiple ways:
      * **Inline bank details**: Pass `userBankInformation` directly in the off-ramp request body.
      * **Saved bank account**: Use a previously saved bank account ID.
      * **Receiver**: Pass a `receiverId` for third-party payouts (see [Receivers Guide](/docs/receivers)).

   2. Bank account requirements vary by country:

      | Country | Required Fields                                                                                                                                                   |
      | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
      | **MX**  | `accountIdentifier` (18-digit CLABE)                                                                                                                              |
      | **DO**  | `accountIdentifier`, `bankName`, `accountType`, `documentIdentifier`, `documentType`. [List of Dominican Republic Banks](/docs/off-ramp#dominican-republic-banks) |

      {/* | **SEPA** | `iban`, `bic`, `bankName`, `accountHolder` (`type`, `firstName`/`lastName` or `businessName`) | */}

   3. For MX accounts, the bank information will go through a penny testing process to ensure that the KYC'd user is the actual owner. If the user is successfully verified the transaction will go through, otherwise it will be CANCELLED and the crypto will be reimbursed.

5. ### Obtain User Wallet Address:
   After a successful KYC users get their own **Wallet Address** which is used as an intermediary to identify the user's off ramps on chain transaction. In order to show the user where the crypto must be sent to you must obtain the wallet by creating the Off Ramp transaction, the response would have the wallet address.

6. ### Execute the Off-Ramp:

   With all required information gathered, you can proceed to execute the off-ramp operation using the Capa API. See the documentation to execute the off ramp [Create Off Ramp](/reference/offramppartnerv2controller_createpartnerofframp)

   Key parameters:

   * `userId` (required): The user's Capa ID
   * `fiatCurrency`, `blockchainSymbol`, `tokenSymbol`: The selected currency, blockchain, and token (required when `quoteId` is not provided)
   * `fiatAmount` or `cryptoAmount`: The amount to convert
   * `userBankInformation` (optional): Inline bank account details
   * `receiverId` (optional): A previously created receiver for third-party payouts
   * `quoteId` (optional): A locked quote ID from the Create Quote endpoint
   * `premiumSpread` (optional): A spread percentage to apply to the exchange rate

## Transaction Status Progression

### Regular Off-Ramp

```mermaid theme={null}
stateDiagram-v2
    [*] --> PENDING
    PENDING --> CRYPTO_RECEIVED : Crypto deposited
    PENDING --> CRYPTO_NOT_RECEIVED : Timeout
    PENDING --> CANCELLED : Cancelled
    CRYPTO_RECEIVED --> IN_PROGRESS : Processing
    CRYPTO_RECEIVED --> CANCELLED : Cancelled
    IN_PROGRESS --> COMPLETED_CRYPTO_RECEIVAL : Crypto confirmed
    COMPLETED_CRYPTO_RECEIVAL --> BANK_TRANSFER_PENDING : Preparing payout
    COMPLETED_CRYPTO_RECEIVAL --> CANCELLED : Cancelled
    BANK_TRANSFER_PENDING --> READY_BANK_TRANSFER : Ready
    READY_BANK_TRANSFER --> COMPLETED : Fiat sent
```

### OTC Off-Ramp (large amounts)

```mermaid theme={null}
stateDiagram-v2
    [*] --> PENDING_PAYMENT
    PENDING_PAYMENT --> CRYPTO_RECEIVED : Crypto deposited
    PENDING_PAYMENT --> CRYPTO_NOT_RECEIVED : Timeout
    PENDING_PAYMENT --> CANCELLED : Cancelled
    CRYPTO_RECEIVED --> IN_PROGRESS : Processing
    IN_PROGRESS --> COMPLETED_CRYPTO_RECEIVAL : Crypto confirmed
    COMPLETED_CRYPTO_RECEIVAL --> WAITING_FOR_FUNDS : Waiting
    COMPLETED_CRYPTO_RECEIVAL --> CANCELLED : Cancelled
    WAITING_FOR_FUNDS --> BANK_TRANSFER_PENDING : Preparing payout
    BANK_TRANSFER_PENDING --> READY_BANK_TRANSFER : Ready
    READY_BANK_TRANSFER --> COMPLETED : Fiat sent
```

## Settlement Times

Expected settlement times for MXN off-ramp fiat payouts:

| Amount           | Expected Time |
| ---------------- | ------------- |
| Under 50,000 MXN | \~2–3 minutes |
| Over 50,000 MXN  | 10–30 minutes |

<Note>The times above apply to same-day settlements. For forwarded OTC quotes that use the `forwardingDays` parameter (1–4), the fiat payout is scheduled on settlement day T+N and the 10–30 minute window applies once that day arrives.</Note>

## Over-Funding

If a partner sends more crypto than the quoted amount, the excess remains in the user's wallet and is not included in the off-ramp transaction.

## SPEI Payout Reference

Off-ramp fiat payouts via SPEI include the **sanitized transaction ID** (with dashes, the `-` character, removed) in the concepto field, allowing partners to match payouts to specific off-ramp orders.

For example, a transaction ID of `f51f2332-c7d4-40eb-8fb2-11e1608bc24c` appears in the concepto as `f51f2332c7d440eb8fb211e1608bc24c`.

## Rounding

Fiat amounts are rounded to **2 decimal places**. Crypto amounts are rounded to **6 decimal places**. Any difference between the amount sent and the transaction amount stays in the user's wallet.

## Execute Off-Ramp (Forwards-Enabled Partners)

<Note>This section only applies to partners enabled for forwards who hold crypto in their wallet. To enable this feature, contact the Capa development team.</Note>

For partners with forwards enabled, off-ramp transactions are not immediately executed after creation. Instead, you must explicitly trigger processing by calling the [Execute Off-Ramp](/reference/offramppartnerv2controller_executeofframp) endpoint with the `transactionId`.

This call triggers the `CRYPTO_RECEIVED_OFF_RAMP` webhook event and starts the fiat payout process.

```json theme={null}
{
  "transactionId": "8374f327-38bd-4b0b-b8a7-2524599eb903"
}
```

If you receive the error `"partner is not configured for manual off-ramp execution"`, this feature has not been enabled for your partner account. Contact the Capa team to request enablement.

## Available Platforms

* **Partner API**: Off-ramp operations are performed via the API using the Partner API key. For instructions on generating and using the API key, refer to the [API Key Generation Guide](/docs/partner-api-key-generation).
* **[Sandbox](https://sandbox.capa.fi)**: Test and manage off-ramp transactions, users, quoting, and webhook configuration in the staging environment.
* **[Dashboard](https://dashboard.capa.fi)**: Manage off-ramp transactions, users, quoting, and webhook configuration in production.

## Notifications

Capa sends notifications to keep you updated on transaction statuses:

* Webhooks for Partners: Capa posts updates to the configured partner webhooks to notify of transaction status changes.\
  Email Notifications for Users (Optional): Users receive email notifications regarding their transaction status and other relevant updates. [Webhooks](/docs/how-our-webhooks-work)
* Ensure that your webhook settings are correctly configured to receive timely notifications and stay informed about the status of transactions. [Webhook Settings](/reference/partnerwebhooksettingsv2controller_update)

## Dominican Republic Banks

```json JSON theme={null}
[
  "ABONAP",
  "Alaver",
  "Asociación Cibao",
  "Asociación Duarte",
  "Asociación La Nacional",
  "Asociación Maguana",
  "Asociación Mocana",
  "Asociación Peravia",
  "Asociación Popular",
  "Asociación Romana",
  "Bancamérica",
  "Banco Activo",
  "Banco Ademi",
  "Banco Adopem",
  "Banco Agrícola",
  "Banco Atlántico",
  "Banco BACC",
  "Banco BDI",
  "Banco BHD",
  "Banco Caribe",
  "Banco Cofaci",
  "Banco Confisa",
  "Banco Fihogar",
  "Banco Gruficorp",
  "Banco Lafise",
  "Banco López de Haro",
  "Banco Popular",
  "Banco Promerica",
  "Banco Santa Cruz",
  "Banco Unión",
  "Banco Vimenca",
  "Banco Óptima",
  "Bancotui",
  "Bandex",
  "Banesco",
  "Banfondesa",
  "Banreservas",
  "Bonanza Banco",
  "Citibank",
  "Corporación de Crédito Monumental",
  "Corporación de Crédito Nordestana",
  "Corporación de Crédito Oficorp",
  "JMMB Bank",
  "Leasing Confisa",
  "Motor Crédito",
  "Qik Banco Digital",
  "Scotiabank"
]
```

***

## What's Next

* [/api/partner/v2/off-ramp](/reference/offramppartnerv2controller_createpartnerofframp)
