For developers. Fiat access is gated: it is the second phase of institutional onboarding and is not automatic after KYB. For positioning, the access gates, onboarding, and how to apply, see the On/Off-Ramp overview.
Prerequisites
- Completed institutional onboarding with approved fiat access — a separate, non-automatic phase after KYB; see How to get started on the overview page.
- Per-account enablement gates — the fiat deposit invoice endpoint, API deposits for each provider on the bank-details route, dedicated deposit addresses, and Express Withdraw are enabled per account. Confirm the invoice endpoint, the provider access, and Express Withdraw with the account manager; for dedicated deposit addresses, see Unique address per user. Express Withdraw is optional. It applies only when a WhiteBIT user pays a crypto amount from a WhiteBIT balance, and the amount settles off-chain in the partner’s Main balance — see Express Withdraw payments.
- API access — HMAC-signed requests on the main account.
- Convert terms — before the first conversion, the account owner accepts the Convert terms once on whitebit.com. See Convert.
On-ramp flow: fiat in, crypto out
The sequence follows one card deposit through Convert to the crypto withdrawal. For other outcomes, see Results and retries, Retry strategy by error type, the withdrawal status state machine, and Failure and exception paths.The
fiat-deposit-url endpoint works on demand. Request access through the account manager and provide the API key. Without activation, the endpoint returns a permission error.uniqueId (any string up to 255 characters, new for each request; the endpoint rejects a value already taken). The ticker must be a fiat currency with can_deposit: true, and the provider value comes from the Asset Status response — see the provider glossary entry:
- curl
- Python
- SEPA payment reference. WhiteBIT accepts bank transfers only from the partner’s own KYB’d bank account. The
uniqueIdof thefiat-deposit-urlrequest must appear in the SEPA payment-reference field of the transfer. A transfer without the reference, or with an altered one, may settle unmatched — see SEPA payment reference. - Redirect links.
successLinkandfailureLinkrequire feature activation through the account manager, and WhiteBIT validates the destination domain;returnLinkneeds no activation. - Card flows. Card funding in USD or EUR (the VISAMASTER provider) requires a
customerbilling block, and the browser must send theRefererheader when opening the invoice link — messengers and email clients often strip it. See Card-provider flows. - Web-only currencies. Not every fiat ticker is depositable via API; confirm
can_depositin the Asset Status response before generating an invoice, and route unsupported tickers through the WhiteBIT web interface.
POST /api/v4/convert/estimate after the transferred amount shows on the Trade balance, and execute it with POST /api/v4/convert/confirm before the quote expires. Then transfer the converted amount back to Main before the withdrawal (see Convert balances). The transfer request takes no idempotency key, so check Get transfer history before resending a transfer. Honor the per-quote expiry returned in the response rather than assuming a fixed window. Convert accepts the supported fiat currencies as either leg of a conversion. The crypto withdrawal step is documented in Crypto Withdrawals; for EEA accounts the crypto withdrawal carries a Travel Rule payload — see Travel Rule and the EEA crypto withdrawal with Travel Rule use case (UC2).
SEPA deposit from the partner’s bank account
A SEPA deposit uses either the hosted deposit page or the bank details that Create fiat deposit returns, and the credited EUR then follows the conversion step above.Off-ramp flow: crypto in, fiat out
The sequence shows the partner’s crypto arriving on the main account, the conversion to EUR, and the payout to the partner’s own bank account or to an end user’s card. Statuses follow the deposit lifecycle and the withdrawal status state machine. For a conversion with an unknown result, follow Results and retries. Receive the crypto leg on a deposit address of the main account; dedicated per-transaction addresses via/create-new-address require per-account permission from the account manager. Inbound deposits for EEA and Turkey accounts are held until Travel Rule verification completes — see Travel Rule.
Convert the crypto to the fiat currency through the Trade balance: transfer the source currency from Main to Trade, convert it, and transfer the converted amount back to Main before the fiat withdrawal (see Convert balances).
For the fiat leg, choose the fee semantics: POST /api/v4/main-account/withdraw treats amount as including the fee, while POST /api/v4/main-account/withdraw-pay charges the fee on top so the recipient receives the specified amount. USD and EUR withdrawals require a beneficiary object; the required sub-fields vary by ticker and provider, so verify the current contract on the Create Withdraw Request reference before integration. A customerIp field is additionally required for USD or EUR with the VISAMASTER provider.
For the VISAMASTER provider, pass the card token from Issue card token in address; the withdraw endpoints do not accept a card number. Issue card token authenticates with a JWT, as its reference page describes.
The EUR SEPA IBAN example below uses the SEPA_BCB_GROUP provider, one of the SEPA/bank-rail providers (SEPA, SEPA_CLEAR_JUNCTION, SEPA_BCB_GROUP, FINCI, ZEN, BANKING_CIRCLE) that requires a top-level bankBic field carrying the beneficiary bank’s BIC/SWIFT code; the active provider for the account is confirmed via the Asset Status endpoint or the account manager.
The request body below sends an EUR IBAN transfer (SEPA), which goes only to the partner’s own KYB’d bank account:
- Partial withdrawals.
partialEnable: trueraises the maximum limit for fiat withdrawals; the application must then handle thePartially successfulstatus (18) and reconcilerequestAmountagainstprocessedAmountin the history record. - KYC. Fiat withdrawals require KYC verification. In exceptional, documented cases the institutional team can arrange a per-account override — see Fiat withdrawal.
Reconciliation and monitoring
Webhooks are optional and add speed; run scheduled history polling either way. To use webhooks, verify the domain, then configure the webhook URL — see Webhooks for the setup flow. Verify the HMAC-SHA512 signature on every delivery using theX-TXC-APIKEY, X-TXC-PAYLOAD, and X-TXC-SIGNATURE headers, and track the strictly increasing nonce in each payload. WhiteBIT retries delivery a small number of times spaced roughly an hour apart over a window of about one day; treat the cadence as best-effort. There is no webhook replay mechanism, so pair webhooks with polling: query POST /api/v4/main-account/history (transactionMethod: 1 for deposits, 2 for withdrawals) on a regular cycle and deduplicate against received events. The reconciliation pattern in the Payment Integration guide walks through the full loop.
The identifier appears under different names across the API surface:
No field ties a conversion to the withdrawal that spends it; see Convert in payment flows for the reconciliation method.
Mark transactions complete only at terminal statuses: 3/7 for success, 4/9 for canceled deposits, 4 for canceled withdrawals. A canceled withdrawal (status 4) returns the amount to the balance. Handle every status in the deposit status table and the withdrawal status table, and poll deposits without a
status filter. WhiteBIT publishes platform availability at status.whitebit.com; per-asset deposit and withdrawal availability is reported by the Asset Status endpoint.
Failure and exception paths
Build handling for each of these before go-live:What’s next
On/Off-Ramp FAQ
Activation, SEPA matching, fee semantics, reconciliation, and compliance questions.
Payment Integration
Endpoint-level lifecycle reference: statuses, fees, fiat operations, refunds.
Go-Live Checklist
Pre-production readiness verification for keys, webhooks, and compliance.