Prerequisites
Before integrating any flow on this page:- API key — create an API key with the required permissions in the WhiteBIT dashboard. Every endpoint on this page requires HMAC-signed requests (
X-TXC-APIKEY,X-TXC-PAYLOAD,X-TXC-SIGNATUREheaders). Store the secret per Security Best Practices. - Webhook URL — configure the webhook endpoint in the API key settings to receive transaction notifications. See Webhooks.
- Fiat access — fiat operations additionally require completed institutional onboarding with approved fiat access.
Use cases
Four scenarios cover the most common partner integrations. Each closes with a link to the section documenting the endpoints.UC1 — Payment provider with per-end-user deposit address
A payment-provider partner assigns each end customer a unique deposit address and credits the customer’s account when funds arrive. Reconciliation is webhook-driven byuniqueId (each deposit address corresponds to one customer in the partner’s database).
See Deposit address generation for endpoint detail.
UC2 — EEA crypto withdrawal with Travel Rule
A partner serving EEA end users submits withdrawals with the requiredtravelRule object. The withdrawal goes through compliance review before on-chain broadcast.
See Create a withdrawal for endpoint detail.
UC3 — Crypto payout with conversion
When the partner holds one currency in Main balance but needs to send another, request a conversion quote, confirm it, and submit the withdrawal. The convert service handles balance routing internally; no manual Main↔Trade transfers are required. See Conversion in the withdrawal flow for endpoint detail.UC4 — Charge a WhiteBIT user’s balance (Express Withdraw)
A merchant or partner service collects a crypto payment from a WhiteBIT user’s balance instantly and off-chain: the partner creates a single-use payment token, presents the returned URL, and the user confirms in one tap. Settlement is an internal zero-fee transfer into the partner’s Main balance. See Express Withdraw payments for endpoint detail.Crypto deposits
Generate deposit addresses, track the deposit lifecycle, handle refunds, and clear Travel Rule holds.Deposit address generation
Generate a deposit address by callingPOST /api/v4/main-account/address. See the API Reference for the full endpoint specification.
Required parameters:
Optional parameters:
network — cryptocurrency network (e.g., ERC20, TRC20). Required for multi-network currencies like USDT; omit for single-network currencies. Query the Asset Status endpoint for available networks per currency.
The endpoint returns the same address for the same ticker and network combination on repeated calls — addresses are permanent and reusable, not ephemeral.
Key response fields: account.address, account.memo (for currencies requiring a memo or destination tag), required.fixedFee, required.flexFee, required.minAmount, required.maxAmount.
Rate limit: subject to platform-level rate limits — see Rate Limits for current enforced values.
- curl
- Python
Unique address per user
ThePOST /api/v4/main-account/address endpoint above returns the same address for the same ticker and network combination on every call. For payment provider integrations that assign a unique deposit address per end user, use POST /api/v4/main-account/create-new-address instead — this endpoint generates a fresh address on every call. See the API Reference for the full specification.
For sub-accounts, crypto deposits are disabled by default. To enable deposits, contact the assigned Account Manager or institutional@whitebit.com.
Optional parameters:
network (required for multi-network currencies; for USDT the default network is ERC20), type (address type for currencies that support several formats — BTC and LTC accept p2sh-segwit and bech32; the default is bech32).
Rate limit: subject to platform-level rate limits — see Rate Limits for current enforced values.
- curl
- Python
/address; repeat calls return the same address. Partners assigning one address per end customer (payment provider, per-user wallet) use /create-new-address; each call returns a fresh address, so an incoming deposit identifies the end user by address alone.
Deposit lifecycle
After funds arrive at a generated deposit address, the deposit passes through a defined sequence of states before crediting to the Main balance.- Address generated (
POST /api/v4/main-account/address) - Funds sent by the external party — mempool detection begins
- Confirmation tracking begins —
deposit.acceptedwebhook fires whileconfirmations.actualis belowconfirmations.required - Each confirmation-count change fires the
deposit.updatedwebhook with the newconfirmations.actual— this event tracks progress; it does not signal completion - Deposit credited to Main balance —
deposit.processedwebhook fires — terminal success state - OR: Deposit canceled —
deposit.canceledwebhook fires — terminal failure state - OR (EEA/Turkey): Travel Rule hold — deposit frozen (status 27 or 28). If the Travel Rule API is enabled, submit originator data via API to unfreeze; otherwise manual action at whitebit.com is required. See Travel Rule below.
Deposit status state machine
The deposit/withdraw history endpoint returns numeric status codes. The following table maps each code to the meaning and the corresponding webhook event.Numeric status codes are namespaced by
transactionMethod. The same code may mean different things for deposits (transactionMethod: 1) and withdrawals (transactionMethod: 2). Always interpret the code in the context of the transactionMethod that returned it.Use
POST /api/v4/main-account/history with transactionMethod: 1 and status filter to poll for deposits in specific states. See the endpoint page for the current enforced rate limit.Network confirmations
Each cryptocurrency network requires a different number of block confirmations before the platform credits a deposit. Webhook payloads includeconfirmations.actual and confirmations.required fields — the confirmations.required value determines when the deposit completes. Query the Asset Status endpoint (GET /api/v4/public/assets) for per-currency confirmation requirements.
Confirmation requirements vary by currency and network. Do not hardcode specific numbers — always retrieve the current values from the Asset Status endpoint.
Partial / over-payment scenarios
Crypto deposits credit the actual on-chain amount received; the system does not flag deposits as “underpaid” or “overpaid”. If a partner expects an exact amount (e.g., for invoice matching), reconciliation logic must compare the deposit amount in thedeposit.processed webhook against the expected amount and surface mismatches as application-level alerts.
Refund flow
When a deposit is canceled (status 4 or 9), a refund may be available. Endpoint:POST /api/v4/main-account/refund-deposit — see the API Reference for the full specification.
Prerequisites:
- The deposit must have status
canceled. - Obtain
transactionIdfrom thedeposit.canceledwebhook (uniqueIdfield) or from the deposit/withdraw history in the WhiteBIT interface.
The refund
address must satisfy three constraints:
- The address must support the same network and asset as the original deposit.
- The address must not be a WhiteBIT-generated deposit address (an address created by
/api/v4/main-account/addressor/api/v4/main-account/create-new-address) — the endpoint refunds to external addresses only. - The address does not need to match the original sender address.
refund.successful— refund completed (includesrefundAmount,refundNetworkFee,refundHash)refund.failed— refund failed (the destination address does not support the required network or asset, or address validation fails; use a different address or contact support)
- curl
- Python
Required endpoints for deposits
For integrations that use a single persistent deposit address instead of unique addresses per user, substitute
POST /api/v4/main-account/address (API Reference) for the /create-new-address endpoint.Travel Rule (EEA and Turkey)
Since May 18, 2025, WhiteBIT places inbound crypto deposits for EEA and Turkey accounts on hold until Travel Rule verification completes.- Status 27 (
DEPOSIT_TRAVEL_RULE_FROZEN): deposit frozen, awaiting Travel Rule data from the account holder - Status 28 (
DEPOSIT_TRAVEL_RULE_FROZEN_PROCESSING): Travel Rule data submitted, under review by WhiteBIT
API-based verification: When the Travel Rule API is enabled for the account, partners can submit originator data via
POST /api/v4/travel-rule/deposit/verification to unfreeze deposits programmatically. See Travel Rule for the full verification flow and request format.Crypto withdrawals
Submit crypto withdrawals, attach the Travel Rule payload for EEA accounts, and follow the withdrawal state machine and fee model.Create a withdrawal
Submit a crypto withdrawal by callingPOST /api/v4/main-account/withdraw. See the API Reference for the full endpoint specification.
Two withdrawal endpoints are available:
Internal-transfer routing: When the destination
address belongs to another WhiteBIT user, the platform may route the transfer as an internal off-chain transfer rather than an on-chain broadcast, in which case no blockchain fee applies and the recipient sees the funds immediately. This routing is not guaranteed for every destination — confirm the behavior with WhiteBIT for the specific flow before designing around fee-free instant settlement, or funds may settle on-chain with the standard fee. For deterministic fee-free settlement between known WhiteBIT accounts, use WhiteBIT Codes rather than relying on withdrawal auto-routing.
Optional parameters:
network (required for multi-network currencies), memo (for currencies requiring a memo or destination tag).
Rate limit: subject to platform-level rate limits — see Rate Limits for current enforced values.
- curl
- Python
Travel Rule for EEA withdrawals
Crypto withdrawals from EEA accounts require atravelRule object in the request body. The object identifies the destination wallet and, for hosted wallets, the destination VASP (Virtual Asset Service Provider — the exchange or custodian hosting the receiving wallet).
Structured format (recommended)
See Travel Rule for the full schema reference and request examples.
Legacy format (deprecated)
See Travel Rule — Legacy format for migration guidance.
Withdrawal confirmation model
After a withdrawal request is submitted, the system validates the request and begins processing. ThePOST /api/v4/main-account/withdraw endpoint returns HTTP 201 when validation succeeds. The platform confirms and processes API-initiated withdrawals immediately — the signed request is the authentication. There is no interactive 2FA step between the POST response and the processing start.
Exceptions to immediate processing:
- Sub-account withdrawals wait for main-account approval before processing.
- Withdrawals to AML-blocked destination addresses freeze pending compliance review.
- Temporary withdrawal freeze (3 days) applies after a password reset or a 2FA setting change on the account.
A revised confirmation model for IP-whitelisted API keys is planned but not yet deployed. Contact institutional@whitebit.com for availability.
Withdrawal status state machine
The withdrawal lifecycle progresses through the following states.Fee calculation
Withdrawal fees combine a fixed component and a flexible (percentage-based) component. Fee model (sourced from the deposit address endpoint response and the Asset Status endpoint):fixedFee— flat fee charged regardless of amountflexFee— percentage-based fee with floor and ceiling:percent— percentage rateminFee— minimum fee (floor)maxFee— maximum fee (ceiling)
maxFee is "0", no ceiling applies.
Worked example — BTC withdrawal of 0.5 BTC:
Fee parameters vary by currency and network. Query the Asset Status endpoint (
GET /api/v4/public/assets) for current fee values.Required endpoints for withdrawals
For withdrawals that include currency conversion before sending, see Withdrawal with conversion for the extended endpoint list.
Fiat operations
Generate fiat deposit invoices and submit fiat withdrawals once institutional fiat access is approved.Prerequisites for fiat operations
Fiat deposit and withdrawal operations require completion of institutional onboarding with approved fiat access. This flow applies to the institutional partner’s master account. For sub-account fiat scope and constraints under Embedded Trading, see the Embedded Trading integration guide. The onboarding process has two phases: Phase 1 (crypto access via KYB) and Phase 2 (fiat access via fiat processing partner review). Fiat access is not automatic after KYB approval — a separate review process with the fiat processing partner is required.Fiat deposit
The fiat deposit flow is invoice-based: generate a payment URL, hand it to the end user, and reconcile the settlement.1
Generate a deposit invoice
Call
POST /api/v4/main-account/fiat-deposit-url with the fiat ticker, amount, provider, and a partner-side uniqueId. The response contains a url. See the API Reference for the full specification.2
Present the URL to the end user
The end user opens the returned URL and completes the payment with the provider or bank.
3
For SEPA: instruct the end user on the payment reference
The bank-side transfer must carry the
uniqueId in the payment-reference field — see SEPA payment reference below.4
Confirm completion and reconcile
Confirm the credited deposit through the deposit history (
POST /api/v4/main-account/history) or the Main balance (POST /api/v4/main-account/balance), matching by uniqueId.The fiat deposit endpoint requires per-account activation. Contact WhiteBIT support and provide the API key to request access.
Optional parameters:
Not every fiat ticker is depositable via API. Check
can_deposit in the Asset Status response before generating an invoice; tickers without API deposit support run through the WhiteBIT web interface.provider value for the currency from the Asset Status response.
- curl
- Python
SEPA payment reference
TheuniqueId submitted in the /fiat-deposit-url request must appear in the SEPA payment-reference field of the bank-side transfer initiated by the end user. WhiteBIT uses this string to match the incoming SEPA settlement to the original deposit request. If the end user omits or alters it, the deposit may settle unmatched and require manual reconciliation through institutional support.
Card-provider flows
VISAMASTER
Referer header: When using the VISAMASTER provider, configure the browser to send the Referer header when opening the invoice link. If the header is missing (e.g., when opening the link from a Telegram message or an email client that strips referrers), WhiteBIT redirects the end user to the homepage instead of the payment provider. Test the redirect path in the actual deployment surface (mobile app, email link, in-app web view) before go-live.Deposit request errors
Common synchronous rejections from/fiat-deposit-url and the recovery for each:
Fiat withdrawal
Create a fiat withdrawal using the samePOST /api/v4/main-account/withdraw endpoint used for crypto, specifying a fiat ticker.
The same withdrawal endpoints apply (/withdraw and /withdraw-pay). Use fiat-specific tickers such as EUR, USD, USD_VISAMASTER, EUR_VISAMASTER.
The beneficiary object is required for fiat withdrawals with tickers USD_VISAMASTER, EUR_VISAMASTER, USD, and EUR. Set partialEnable to true for increased maximum limits — the application must then handle status 18 (“Partially successful”).
Beneficiary object fields
Sub-field requirements vary by ticker and provider. Verify the current contract on the Create Withdraw reference before integration.
Fiat withdrawals require KYC verification. Accounts without KYC verification cannot process fiat withdrawals.
In exceptional cases, the WhiteBIT institutional team may grant a per-account override that permits fiat withdrawal without standard KYC. This is exception-only — not a default capability. Contact institutional@whitebit.com for integrations with a documented case requiring the override.
Required endpoints for fiat operations
WhiteBIT Codes
Move balance fee-free between WhiteBIT accounts by creating and applying codes.WhiteBIT Codes overview
WhiteBIT Codes enable fee-free value transfer between WhiteBIT accounts. WhiteBIT Codes are alphanumeric strings representing a fixed amount of a specific currency. One account creates a code, shares the code string via any channel, and another account applies the code to receive the funds.- Fee-free — no fees for creating or applying codes
- Use cases: internal transfers between accounts, promotional distributions, settlement between sub-accounts or partner accounts
- Optional passphrase protection (up to 25 characters)
Lifecycle and behavior
State machine: A WhiteBIT Code moves through two states:created (an unredeemed code exists; the platform reserves the creator’s funds) and applied (terminal — the code has been redeemed; funds credited to the redeemer). There is no void or cancel operation; the creator cannot reclaim an unredeemed code.
Apply failures: Codes may fail to apply for several reasons (expired, invalid format, non-existent, wrong passphrase). The apply response distinguishes an already-applied code and a code applied by its own creator; the platform collapses the remaining failure modes into a generic rejection. If a redeemer’s apply fails on a recently-created code, request a fresh code from the creator.
Correlation: The code string is the only correlation key shared between creator and redeemer. The creator-side description field is creator-only and not exposed to the redeemer. Partners running redemption flows must map the code to an internal user ID on the partner side.
Security model: Share codes through trusted channels and consider the optional passphrase for an additional protection layer. Passphrases accept Latin letters, digits, and ASCII symbols (no whitespace, no Unicode) up to 25 characters. Treat the code string as sensitive on the partner side: do not log it in plaintext, do not include it in error reports, do not commit it to version control.
Create and apply a code
The code lifecycle has two steps: create and apply. Create:POST /api/v4/main-account/codes — see the API Reference
Required parameters:
Optional parameters:
Key response fields:
code — the generated WhiteBIT Code string to share with the redeemer; message — success message; external_id — external identifier.
Rate limit: subject to platform-level rate limits — see Rate Limits for current enforced values.
Apply: POST /api/v4/main-account/codes/apply — see the API Reference
Required parameters:
Optional parameters:
Rate limit: subject to platform-level rate limits — see Rate Limits for current enforced values.
Webhook event:
code.apply fires when an account applies a code.
- curl
- Python
Express Withdraw
Charge a WhiteBIT user’s balance in one confirmation with a single-use payment token.Express Withdraw payments
Express Withdraw lets an approved partner charge a specific amount from a WhiteBIT user’s balance in one confirmation. The partner integrates a single endpoint —POST /api/v4/main-account/express-withdraw/token (API Reference) — and WhiteBIT hosts everything the paying user sees. Settlement is an internal balance move: instant, off-chain, and fee-free on both sides.
Express Withdraw is available only for B2B partner services and requires a separate approval process. Request access at https://institutional.whitebit.com/. Without the permission, the endpoint returns
403 Forbidden.Token lifecycle
A payment token moves through four states:- Created — the partner calls the create-token endpoint with
ticker,amount, and a partner-sideexternalId(order or invoice identifier). The response carries the paymenturlandexpireAt(UTC); every token is valid for 90 seconds after creation. - Presented — the partner hands the
urlto the user as a redirect, mobile deep link, or QR code. Treat the value as opaque: WhiteBIT returns the hosted web confirmation page by default, or a deep link when one is configured for the partner at onboarding; the token travels in thetokenquery parameter either way. - Confirmed (terminal) — the user, authenticated on WhiteBIT, reviews the exact
tickerandamountand confirms. WhiteBIT re-validates balance, limits, and permissions, debits the user, credits the partner’s Main balance in the same operation, and marks the token used. - Expired (terminal) — a token left unconfirmed for 90 seconds becomes unusable. Re-create the payment with the same
externalId; WhiteBIT issues a fresh token.
Idempotency and replay protection
TheexternalId is unique per partner account and drives both guarantees:
- Re-requesting a token for the same
externalIdwith an identicaltickerandamountwhile the token is still valid returns the same token — safe to retry after a timeout without double-charging. - Changing
tickeroramountfor a pendingexternalIdfails with error code18— parameters of a pending payment cannot change; use a newexternalId. - Re-submitting an
externalIdthat the user already paid fails with error code19— the order is settled, and the rejection prevents a duplicate charge.
Limits and eligibility
- Per-payment cap: 10,000 USDT-equivalent, rejected with error code
191above the cap. WhiteBIT enforces the cap at token creation and re-enforces it at confirmation. - Currency: crypto only; the ticker must be withdrawal-enabled on the platform. The endpoint rejects fiat tickers.
- No self-payments: the paying user and the token creator must be different WhiteBIT accounts.
- Payer eligibility: at confirmation the user must have withdrawals enabled, pass the standard withdrawal restriction checks, and hold a sufficient balance.
- Rate limits: standard private-API limits apply — see Rate Limits; the endpoint has no endpoint-specific limit.
Withdrawal with conversion
Convert the source currency before withdrawing, using the Convert service.Conversion in the withdrawal flow
When the currency held in Main balance differs from the currency the end user needs to withdraw, request a conversion quote, confirm it, and then submit the withdrawal. The Convert service handles balance routing internally — manual transfers between Main and Trade balances are not required.Step-by-step flow
1
Check Main balance
Verify the source currency is available in Main balance.Endpoint:
POST /api/v4/main-account/balance — API Reference2
Request a conversion estimate
Request a quote for converting the source currency to the withdrawal currency. The response includes an
id (quote identifier), the quoted rate, and expireAt (Unix timestamp).Endpoint: POST /api/v4/convert/estimate — API Reference3
Confirm the conversion
Confirm the quote using
quoteId from the estimate response. The conversion executes atomically.Endpoint: POST /api/v4/convert/confirm — API Reference4
Create withdrawal request
Submit a withdrawal to the end user’s external address using the converted currency.Endpoint:
POST /api/v4/main-account/withdraw or POST /api/v4/main-account/withdraw-pay — API Reference5
Receive webhook confirmation
The
withdraw.successful webhook fires when the withdrawal completes. See Webhooks for setup and signature verification.6
Verify via history
Query the history endpoint to confirm the withdrawal status. See Withdrawal status state machine for the full status state machine.Endpoint:
POST /api/v4/main-account/history — API ReferenceThe convert service sets quote expiry per quote and returns the value in
expireAt (Unix timestamp). Confirm the quote before that time elapses, or request a new estimate. See Convert for full parameter details, direction options, and history queries.Conversion errors
Common synchronous rejections from/convert/confirm and the recovery for each:
Error
message values may arrive as translation keys (e.g., api.converter.quoteExpired) rather than finalized English strings. Treat the code and the field name under errors as the stable contract.Code example
Convert USDT to BTC and withdraw BTC to an external address. The estimate returns a short-lived quote — confirm it before it expires, or request a new one: The critical-path call is the estimate — every later step reuses identifiers from its response. The Crypto deposits section defines thesend_request() helper used below.
- Python
- curl
Required endpoints for withdrawal with conversion
Webhook reconciliation
Reliable fund tracking requires both webhook-based and polling-based reconciliation. Primary method — webhooks for real-time notifications:- Configure the webhook URL in API key settings (see Webhooks)
- Verify the HMAC-SHA512 signature on every incoming webhook. Each delivery includes three headers —
X-TXC-APIKEY(the API key the webhook is bound to),X-TXC-PAYLOAD(base64-encoded JSON body), andX-TXC-SIGNATURE(HMAC-SHA512 of the payload with the API secret). See Security Best Practices for the verification algorithm. - Track the
noncefield — each webhook nonce is strictly greater than the previous. The nonce travels inside the JSON payload, not in a separate header.
POST /api/v4/main-account/history:
- Use
transactionMethod: 1for deposits,transactionMethod: 2for withdrawals - Filter by
statusarray for specific states - Recommended polling interval: every 5 minutes for active monitoring
- See Rate Limits for current enforced values
uniqueId from webhook payloads and history responses to deduplicate across webhook and polling paths.
The meaning of
uniqueId differs by direction: for withdrawals, the value echoes the identifier supplied in the withdrawal request; for deposits, the platform assigns the value (the transaction identifier that the refund endpoint consumes as transactionId). Both are unique per transaction and safe as idempotency keys.WhiteBIT does not offer a webhook replay mechanism. Implement polling as a fallback for outages longer than the 24-hour retry window. Store all processed
uniqueId values to prevent double-processing.- Receive webhook — verify signature — extract
uniqueIdandstatus - Store the event with
uniqueIdas the idempotency key - On polling cycle: query the history endpoint — compare
uniqueIdvalues against stored events - Process any events found via polling that the webhook path did not deliver
- Mark transactions as complete only when the transaction reaches a terminal status (3/7 for success, 4/9 for canceled deposits, 4 for canceled withdrawals)
What’s next
Webhooks
Webhook setup, event types, signature verification, and retry behavior.
Convert
Estimate and confirm flow, plus conversion history queries.
Security Best Practices
API key management, IP whitelisting, and secret storage.
On/Off-Ramp Guide
Journey-level guide for corporate fiat ↔ crypto clients: onboarding gates, EUR/SEPA flows, and failure paths.