{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Partner Dashboard Changelog","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, chosen by how much of the payment experience the partner owns: **Banxa Native API** for payments that happen inside the partner's product (headless bank transfers, HMAC server-to-server; card, Apple Pay and Google Pay on a native sheet via SDK, no Banxa-hosted screens); **Banxa Hosted Checkout** for a Banxa-run payment flow with the broadest payment method coverage (three paths: Referral URL, API, or SDK). Either product can run KYC on either side. Both use the same sandbox and production environments at `https://api.banxa-sandbox.com` and `https://api.banxa.com`.\n\n## When to use Banxa\n\nReach for Banxa when a product needs to let people **buy crypto with fiat or sell crypto for fiat** without the partner holding money-transmitter or VASP licences. Banxa is the licensed counterparty: it takes the payment, runs compliance, and delivers the asset. Typical fits are wallets, exchanges, dApps, gaming platforms and fintech apps adding an on-ramp or off-ramp.\n\nPick the product by how much of the payment experience the partner wants to own. KYC is configurable on both and does not decide it.\n\n- **Banxa Native API** - the payment experience lives inside the partner's product. Bank transfers run completely headless through the API; card, Apple Pay and Google Pay run on a native payment sheet through a Banxa SDK, with no redirect or webview. Needs a backend. Days to weeks to integrate.\n- **Banxa Hosted Checkout** - Banxa runs the payment flow, reached by redirect, embedded iFrame, or SDK. Broadest payment method coverage. No backend required for the referral path. Hours to days to integrate.\n- **Alternative payment methods** (PayPal, iDEAL, Klarna, PIX, VietQR and local methods) are not supported headless. Native integrations offer them by creating those orders through Hosted Checkout, so most Native integrations use both products.\n- **Legacy API** - existing integrations only. Do not start here.\n\nBanxa is not the right tool for crypto-to-crypto swaps, custody or wallet infrastructure, or for any flow where the partner wants to settle funds itself.\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**: Choose by payment experience, not by KYC — both products support partner-run or Banxa-run KYC. Banxa Native is for payments rendered inside the partner's product; Banxa Hosted Checkout is for a Banxa-run payment flow. They are separate surfaces with separate credentials and base paths, so never substitute one product's endpoint for the other's. Combining them is expected in one case only: alternative payment methods are not supported headless, so a Native integration creates those specific orders through Hosted Checkout.\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"}}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"partner-dashboard-changelog","__idx":0},"children":["Partner Dashboard Changelog"]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the complete documentation index, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.banxa.com/llms.txt"},"children":["llms.txt"]},". Append ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".md"]}," to any page URL for its markdown version."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Release notes for the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://dashboard.banxa.com/"},"children":["Banxa Partner Dashboard"]},". API and SDK changes are tracked separately in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/changelog"},"children":["product changelogs"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-08-11","__idx":1},"children":["2026-08-11"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"changed","__idx":2},"children":["Changed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Display is now Assets"]}," — The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Display"]}," item in the sidebar and mobile navigation is now ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Assets"]},". Same page, same permissions, clearer name for what it manages. → ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/hosted-checkout/docs/getting-started/partner-dashboard"},"children":["Partner Dashboard"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-08-10","__idx":3},"children":["2026-08-10"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"fixed","__idx":4},"children":["Fixed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Documentation links pointed at the old docs site"]}," — Links out of the dashboard now resolve to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs.banxa.com"]},"."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-07-29","__idx":5},"children":["2026-07-29"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"changed-1","__idx":6},"children":["Changed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Display settings moved into Settings"]}," — Checkout display options are now configured on the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Settings"]}," page rather than on their own page. Permissions moved with them, so a role that could edit display settings keeps that access under Settings."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-07-22","__idx":7},"children":["2026-07-22"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"added","__idx":8},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Testing information panel"]}," — The dashboard home now shows the sandbox testing configuration for your account, so test card and test payment details are visible next to the environment you are using them in. → ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/hosted-checkout/docs/testing/sandbox-test-data"},"children":["Sandbox Test Data"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-05-25","__idx":9},"children":["2026-05-25"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"changed-2","__idx":10},"children":["Changed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Webhook URLs are validated before they are saved"]}," — A webhook URL must now use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https"]}," on port ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["443"]}," and resolve to a public IP address. URLs that resolve to private, loopback, link-local, multicast or carrier-grade NAT ranges are rejected when you save them, including IPv6 addresses with an IPv4 address embedded in them."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This affects local development: a tunnel URL such as an ngrok HTTPS address works, but pointing a webhook at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["localhost"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]}," or an internal hostname no longer saves. → ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/hosted-checkout/docs/transaction-lifecycle/webhooks"},"children":["Webhooks"]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-28","__idx":11},"children":["2026-04-28"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"added-1","__idx":12},"children":["Added"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mixed integration type"]}," — An account can now hold both Checkout API and Native API credentials at once. The dashboard issues credentials according to the integration type set on your account:"]},{"$$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":"Integration type"},"children":["Integration type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Credentials issued"},"children":["Credentials issued"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Checkout API"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Checkout API only"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Native API"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Native API only"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Mixed (Checkout + Native)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Both"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Native card, Apple Pay and Google Pay payments need ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mixed"]},", because the order is created through the Checkout API while identity and eligibility run through the Native API. → ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/hosted-checkout/docs/getting-started/authentication-and-environments"},"children":["Authentication & Environments"]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-02-11","__idx":13},"children":["2026-02-11"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"fixed-1","__idx":14},"children":["Fixed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Clicking an order did not open its details"]}," — Orders in some statuses failed to expand when selected. All order statuses now resolve."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-02-10","__idx":15},"children":["2026-02-10"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"changed-3","__idx":16},"children":["Changed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Checkout-only pages are hidden for Native API accounts"]}," — Accounts on the Native API integration type no longer see dashboard pages that only apply to Hosted Checkout."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"fixed-2","__idx":17},"children":["Fixed"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Orders table pagination"]}," — Paging through the orders list returned the wrong page of results."]}]}]},"headings":[{"value":"Partner Dashboard Changelog","id":"partner-dashboard-changelog","depth":1},{"value":"2026-08-11","id":"2026-08-11","depth":2},{"value":"Changed","id":"changed","depth":4},{"value":"2026-08-10","id":"2026-08-10","depth":2},{"value":"Fixed","id":"fixed","depth":4},{"value":"2026-07-29","id":"2026-07-29","depth":2},{"value":"Changed","id":"changed-1","depth":4},{"value":"2026-07-22","id":"2026-07-22","depth":2},{"value":"Added","id":"added","depth":4},{"value":"2026-05-25","id":"2026-05-25","depth":2},{"value":"Changed","id":"changed-2","depth":4},{"value":"2026-04-28","id":"2026-04-28","depth":2},{"value":"Added","id":"added-1","depth":4},{"value":"2026-02-11","id":"2026-02-11","depth":2},{"value":"Fixed","id":"fixed-1","depth":4},{"value":"2026-02-10","id":"2026-02-10","depth":2},{"value":"Changed","id":"changed-3","depth":4},{"value":"Fixed","id":"fixed-2","depth":4}],"frontmatter":{"title":"Partner Dashboard Changelog","description":"Release notes for the Banxa Partner Dashboard. Changes to credentials, webhooks, settings, orders and navigation.","seo":{"title":"Partner Dashboard Changelog"}},"lastModified":"2026-09-25T21:14:47.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/changelog/partner-dashboard","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}