arrow-right-arrow-leftOff Ramp

Off-ramp operations (crypto to fiat) — sell crypto and receive fiat

Get off-ramp price estimate

post
/api/v1/partner/offramp/estimate

Get indicative off-ramp pricing (crypto to fiat) without creating a quote. Pricing can be driven from either side: provide crypto_amount to compute the fiat payout, or fiat_amount to compute the crypto required (exactly one of the two). This endpoint is lightweight and does not reserve liquidity.

Use this when you need quick pricing discovery before calling /partner/offramp/quote. Optional filters: payment_method_slug, payment_network_slug, provider_scope, country_code. This endpoint is indicative and does not apply user/payment-details ownership checks; for executable pricing use quote.

Note: EUR, AUD, and GBP off-ramp payouts require the user's physical address. Ensure the user's KYC includes address, city, and postal_code before initiating. See PATCH /partner/users/{user_uuid}/kyc to update.

Authorizations
X-API-KeystringRequired

Partner API key for authentication. Required for all partner account endpoints.

Body
anyOptional
or
anyOptional
Responses
chevron-right
200

Estimate retrieved successfully

application/json
successbooleanRequired

Indicates if the request was successful

Example: true
post
/api/v1/partner/offramp/estimate

Get off-ramp quote

post
/api/v1/partner/offramp/quote

Get a price quote for an off-ramp operation (crypto to fiat). Returns the exchange rate, amounts, and a quote ID that can be used to initiate the order. Quotes expire after 60 seconds.

The user_uuid is the public UUID returned by POST /partner/users (the id field). The payment_details_id is the ID of a previously created payment profile for the user.

Anchor mode — provide exactly one of crypto_amount or fiat_amount:

Field
Anchor
Guarantee

crypto_amount

Crypto-anchored

Exact crypto cost; fiat payout varies by Switch rate at settlement

fiat_amount

Fiat-anchored

Exact fiat delivery to recipient; crypto cost may vary within a 1.20× safety bound

The response anchor_type field tells you which side is guaranteed: "crypto" or "fiat".

Fiat-anchored notes:

  • Useful for exact-payout use cases (e.g. deliver exactly 500,000 NGN).

  • If Switch quotes a crypto cost exceeding 1.20× the expected amount, the order moves to failed status and the deposit is automatically refunded from escrow back to the partner wallet. Create a new quote to retry.

  • slippage_tolerance.type=amount in fiat-anchored mode is evaluated as crypto-side delta, not fiat-side (fiat is always exact by construction).

  • Integer-minor-unit currencies (NGN, UGX, TZS, KES, GHS): fiat_amount must be a whole number.

Fee structure: The fee_breakdown object shows all fee components transparently: platform_fee (our fee in crypto), partner_fee (partner's markup, currently 0, configurable via dashboard in a future release), and total_fee (sum of both).

Address requirement for EUR/AUD/GBP: EUR, AUD, and GBP payouts require the user's physical address (street, city, postal code). If the user's KYC does not include address data, the quote response will include a beneficiary_requirements field indicating which fields are needed. You can update the user's KYC with PATCH /partner/users/{user_uuid}/kyc to provide the address before or after initiating the order. If you initiate without address, the order will be created with status pending_address until the address is provided.

Authorizations
X-API-KeystringRequired

Partner API key for authentication. Required for all partner account endpoints.

Body
anyOptional
or
anyOptional
Responses
chevron-right
200

Quote retrieved successfully

application/json
successbooleanRequired

Indicates if the request was successful

Example: true
post
/api/v1/partner/offramp/quote

Initiate off-ramp order

post
/api/v1/partner/offramp/initiate

Initiate an off-ramp order using a previously obtained quote. The quote must still be active (not expired or already used). The system refreshes the price and checks slippage tolerance before creating the order.

If the price has moved beyond the slippage tolerance, a PRICE_CHANGED_REQUOTE error is returned with details about the old and new rates, so the partner can request a new quote.

On success, returns the created order with status awaiting_liquidity_provider.

Address requirement for EUR/AUD/GBP: For EUR/AUD/GBP orders, if the user's KYC does not include a physical address, the order will be created with status pending_address. The response will include required_fields: ["address", "city", "postal_code"] and next_action: "provide_address". Call PATCH /partner/users/{user_uuid}/kyc to add the address, and the order will automatically advance.

Recommended flow for EUR/AUD/GBP:

  1. Submit KYC with address/city/postal_code (POST /kyc-submissions)

  2. Create payment details (POST /payment-details) — address auto-populated from KYC

  3. Get quote (POST /offramp/quote)

  4. Initiate (POST /offramp/initiate) — proceeds without delays

Authorizations
X-API-KeystringRequired

Partner API key for authentication. Required for all partner account endpoints.

Body
quote_idstring · uuidRequired

Quote ID from the quote endpoint. Payment details are taken from the quote.

Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
reference_idstringOptional

Optional partner-supplied external reference ID (e.g. your internal order ID). Stored on the order and echoed back in responses.

Example: your-internal-order-id
Responses
post
/api/v1/partner/offramp/initiate

Last updated