/api/partner/v2/off-ramp
Field Relationships
- Provide
quoteIdOR (fiatCurrency+blockchainSymbol+tokenSymbol). When a quote is used, currency/token fields are inherited from the quote. - Provide either
fiatAmountorcryptoAmount, not both. - Provide either
userBankInformation(inline bank details) oruserBankInformationId(reference to a saved bank account). receiverIdis optional — when provided, the off-ramp is processed for that receiver instead of the user directly.
Bank Account Requirements by Country
| Country | Required Fields |
|---|---|
| MX | accountIdentifier (18-digit CLABE) |
| DO | accountIdentifier, bankName, accountType, documentIdentifier, documentType |
| US | accountIdentifier, bankName, routingNumber, accountHolder, address |
| SEPA | iban, bic, bankName, accountHolder |
Integration Flow
Create a user
Complete KYC verification
Get a quote (optional)
Create off-ramp transaction
POST /api/partner/v2/off-ramp (this endpoint) — returns a destinationWalletAddressExecute the off-ramp
Important Notes
- User must be KYC-verified before creating transactions.
- Mexico bank verification: First-time bank accounts trigger a penny test to verify the KYC’d user is the account owner. If verification fails, the transaction is cancelled.
- CLABE validation (Mexico): Must match
^\d{18}$. Consider using clabe-validator. - Amount limits: Fiat and crypto amounts must fall within the min/max thresholds defined in your partner agreement.
- Destination wallet: The response includes a unique
destinationWalletAddress— the user must send crypto to this address.
Use Cases
- User Payout: Convert crypto to fiat and withdraw to a verified bank account.
- B2C Integration: Let individual users off-ramp from within your app.
- Third-Party Payments: Use
receiverIdto send fiat payouts to receivers on behalf of a user.
Error Codes
Common Errors
| HTTP Status | Code | Message |
|---|---|---|
| 401 | UNAUTHORIZED | ”API Key is missing” |
| 401 | UNAUTHORIZED | ”Invalid API Key format” |
| 401 | UNAUTHORIZED | ”Invalid API Key” |
| 403 | INVALID_PARTNER_FLOW | ”The partner has an invalid flow.” |
Verified User Errors
| HTTP Status | Code | Message |
|---|---|---|
| 400 | REQUIRED_USER_ID_ERROR | ”This endpoint requires a user id to be provided” |
| 403 | USER_NOT_VERIFIED_ERROR | ”User is not allowed to perform the operations because has not completed the KYC verification.” |
Endpoint-Specific Errors
| HTTP Status | Code | Message |
|---|---|---|
| 400 | INVALID_USER_INPUT_ERROR | ”Invalid User Input” |
| 400 | BAD_REQUEST | ”Either quoteId or fiatCurrency, blockchainSymbol, tokenSymbol, and at least one of fiatAmount or cryptoAmount must be provided” |
| 400 | BAD_REQUEST | ”Fiat currency is disabled or does not exist” |
| 400 | BAD_REQUEST | ”This blockchain and token combination is disabled or does not exist” |
| 400 | QUOTE_EXPIRED | ”Quote has expired” |
| 400 | BAD_REQUEST | ”Quote is not valid for OFF_RAMP” |
| 400 | INVALID_TOKEN_OPERATION_ERROR | ”Token cannot be operated as OTC, only stable coins are allowed” |
| 400 | BAD_REQUEST | ”Either userBankInformationId or userBankInformation must be provided” |
| 400 | BAD_REQUEST | ”The receiver user account is not verified” |
| 400 | INVALID_FIAT_AMOUNT_ERROR | ”Fiat amount is outside of the allowed range for OFF_RAMP. Should be between and “ |
| 400 | INVALID_TOKEN_AMOUNT_ERROR | ”Token amount is outside of the allowed range for OFF_RAMP. Should be between and “ |
| 403 | RECEIVER_CANNOT_INITIATE_TRANSACTION | ”Receiver accounts cannot initiate transactions directly.” |
| 403 | RECEIVER_USER_MISMATCH | ”The receiver does not belong to the specified user.” |
| 403 | USER_BANK_INFO_ACCESS_DENIED | ”The bank information does not belong to the specified user.” |
| 403 | USER_BANK_INFO_ACCESS_DENIED | ”The bank information belongs to a different partner.” |
| 404 | RECEIVER_NOT_FOUND | ”Receiver not found.” |
| 404 | USER_BANK_INFO_NOT_FOUND | ”User bank information not found.” |
Headers
Api key for the affiliated partner that is performing the request
Body
Identifier for the user who's submitting the off-ramp order
"8374f327-38bd-4b0b-b8a7-2524599eb903"
Inline bank account details for the off-ramp.
Identifier for the quote to be used for the transaction.
Amount of fiat currency to be received in conversion.
Amount of crypto currency to be converted to fiat currency.
Identifier for the fiat currency which the user will rec. Required when quoteId is not provided.
MXN, DOP, USD, EUR Identifier for the blockchain to token from which the conversion will be made. Required when quoteId is not provided.
POL, SOL, ETH Identifier for the token from which the conversion will be made. Required when quoteId is not provided.
USDC, USDT Spread percentage to be applied to the exchange rate
Identifier for a previously created receiver (via /api/partner/v2/receivers).