{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-products/hosted-checkout/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Off-Ramp Overview","description":"Official Banxa API documentation – on-ramp and off-ramp transfers with identity verification and compliance.","llmstxt":{"title":"Banxa Developer Documentation","description":"Integrate crypto-fiat exchange with Banxa's licensed infrastructure: payments, KYC, compliance, and settlement handled. 150+ countries, 45 global licences.","details":{"content":"Two integration products: **Banxa Native API** for partners who manage their own KYC and want full UX control (headless, HMAC server-to-server, no Banxa-hosted screens); **Banxa Hosted Checkout** for partners who want Banxa to handle KYC and payments (three paths: Referral URL, API, or React Native SDK). Both use the same sandbox and production environments at `https://api.banxa-sandbox.com` and `https://api.banxa.com`.\n\n## Constraints\n\n- **Authentication**: HMAC credentials must be stored server-side only, never expose in frontend, mobile, or client-side code. HMAC is required for all Native API calls and for KYC sharing in Hosted Checkout; `x-api-key` is used for all other Hosted Checkout endpoints.\n- **`externalCustomerId`**: Required on every buy and sell order. Use a stable opaque identifier, never PII.\n- **`identityReference`**: Must remain constant for the same user across all requests. Must not contain PII. If you attempt to create an identity for an email that already exists, you will receive a 422 / code 81, so retrieve the existing record rather than retrying creation. Use `GET /eapi/v0/identities/{identityReference}?email=user@example.com` to look up the real `identityReference` linked to an email.\n- **`quoteId`**: Only supported by `POST /eapi/v0/ramps` (bank transfer). The React Native SDK and Embedded Payment Button do not accept a `quoteId`, so use indicative pricing (`GET /eapi/v0/price`) for SDK and Embedded Payment Button flows.\n- **Quotes**: Indicative prices are not rate-locked, so refresh close to order creation to minimise rate drift. Locked quotes (`GET /eapi/v0/quote`) expire after approximately 3 minutes and are only valid for bank transfer ramp creation.\n- **Eligibility gate**: Never create a ramp or invoke the SDK when `paymentReady` is `false`. Always check eligibility and satisfy all requirements before payment execution.\n- **Webhooks**: Verify all inbound webhook signatures with HMAC-SHA256 before processing. Return HTTP 200 immediately and process asynchronously.\n- **Product selection**: Banxa Native is for partners who manage their own KYC. Banxa Hosted Checkout is for partners who do not do KYC. These are separate products with separate flows: do not mix endpoints across products.\n- **SDK scope**: The React Native SDK has no `banxa.customerIdentity` module. Identity and KYC are handled through the Native API only. `primerCallbacks` and `primerSettings` are Native context only and must not be referenced in Hosted Checkout integrations.\n- **Payment method naming**: Never use \"eAPI\" or \"EAPI\" as a product name. The correct name is \"Banxa Native API\". The URL path prefix `/eapi/` is correct and should not be changed.\n"},"hide":false,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"off-ramp-overview","__idx":0},"children":["Off-Ramp Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Off-ramp refers to the process of converting cryptocurrency into fiat currency. The customer sends crypto to Banxa, and Banxa delivers the fiat payout to the customer's bank account or payment method."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":1},"children":["How it works"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your customer selects the crypto they want to sell and the amount."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["They provide their bank account or payout details."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["They complete identity verification (KYC) if required."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The crypto is transferred to Banxa's receiving wallet — either by the customer (non-custodial) or by your platform (custodial)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Banxa verifies receipt of the crypto and releases the fiat payout to the customer."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"custodial-vs-non-custodial","__idx":2},"children":["Custodial vs. non-custodial"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sell flow has two variants depending on how the crypto transfer is executed:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":""},"children":[]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Non-custodial"},"children":["Non-custodial"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Custodial"},"children":["Custodial"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Who transfers the crypto"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your platform"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["How"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customer scans QR code or sends manually"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your platform executes transfer via blockchain"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Typical use case"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Consumer wallets"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Exchange or custodial wallet products"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["→ See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/hosted-checkout/docs/on-ramp-off-ramp/custodial-vs-non-custodial"},"children":["Custodial vs. Non-Custodial"]}," for implementation details."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"supported-payout-methods","__idx":3},"children":["Supported payout methods"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fiat payout methods vary by region. Common options include:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PayID"]}," — AUD (Australia)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SEPA bank transfer"]}," — EUR (Europe)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PIX"]}," — BRL (Brazil)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Retrieve the available options for your integration:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET /{partnerRef}/v2/payment-methods\n"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"off-ramp-configuration","__idx":4},"children":["Off-ramp configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Off-ramp must be enabled and configured for your partner account before you can create sell orders. Contact Banxa to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enable off-ramp for your account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Choose between custodial and non-custodial flow."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure supported crypto assets and payout methods."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"integration","__idx":5},"children":["Integration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["→ ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/hosted-checkout/docs/api-integration/create-sell-order"},"children":["API Integration: Create Sell Order"]}]}]},"headings":[{"value":"Off-Ramp Overview","id":"off-ramp-overview","depth":1},{"value":"How it works","id":"how-it-works","depth":2},{"value":"Custodial vs. non-custodial","id":"custodial-vs-non-custodial","depth":2},{"value":"Supported payout methods","id":"supported-payout-methods","depth":2},{"value":"Off-ramp configuration","id":"off-ramp-configuration","depth":2},{"value":"Integration","id":"integration","depth":2}],"frontmatter":{"title":"Crypto Off-Ramp Integration Overview | Banxa Docs","description":"How Banxa's crypto-to-fiat off-ramp works. Covers custodial vs. non-custodial flows, supported fiat payout methods, and required partner account configuration.","seo":{"title":"Off-Ramp Overview"}},"lastModified":"2026-05-19T23:30:38.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/hosted-checkout/docs/on-ramp-off-ramp/off-ramp-overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}