Complete guide to crypto deposits, withdrawals, withdrawals with currency conversion, fiat SEPA operations, and WhiteBIT Codes — including status state machines, fee calculation, and webhook reconciliation.
The Payment Integration guide covers every step required to move funds into and out of WhiteBIT programmatically — crypto deposits, crypto withdrawals, crypto withdrawals with currency conversion, fiat (SEPA) operations, and WhiteBIT Codes. Each section includes the full transaction lifecycle, status state machine, fee calculation, and webhook events.
EEA users: USDT deposits and withdrawals are not available since December 30, 2024 (MiCA compliance). Use USDC or EURI as alternatives. See Regulatory Compliance for details.
Generate a deposit address by calling POST /api/v4/main-account/address. See the API Reference for the full endpoint specification.Required parameters:
Parameter
Type
Description
ticker
string
Currency ticker (e.g., BTC, ETH). The currency must have can_deposit: true in the Asset Status response.
network
string
Cryptocurrency network (e.g., ERC20, TRC20). Required for multi-network currencies like USDT. 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: 1,000 requests per 10 seconds.
The POST /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.
The /create-new-address endpoint is not available by default. Contact support@whitebit.com to request access.
Required parameters:
Parameter
Type
Description
ticker
string
Currency ticker (e.g., BTC, ETH)
network
string
Cryptocurrency network (e.g., ERC20, TRC20). Required for multi-network currencies.
The deposit/withdraw history endpoint returns numeric status codes. The following table maps each code to the meaning and the corresponding webhook event.
Status Code
State
Webhook Event
Terminal?
Description
15
Pending
deposit.accepted
No
Deposit detected, awaiting confirmations
15
Updated
deposit.updated
No
Confirmation count changed
3, 7
Successful
deposit.processed
Yes
Funds credited to Main balance
4, 9
Canceled
deposit.canceled
Yes
Deposit canceled (refund may be available)
5
Unconfirmed by user
—
No
Awaiting user action
21
Additional data required
—
No
System requires additional information
22
Uncredited
—
No
Deposit detected but not yet credited
27
Travel Rule frozen
—
No
Awaiting Travel Rule verification (EEA/Turkey)
28
Travel Rule processing
—
No
Travel Rule data under review
Use POST /api/v4/main-account/history with transactionMethod: 1 and status filter to poll for deposits in specific states. Rate limit: 200 requests per 10 seconds.
Each cryptocurrency network requires a different number of block confirmations before a deposit is credited.Webhook payloads include confirmations.actual and confirmations.required fields — use the confirmations.required value to determine when the deposit will complete. 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.
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.
Since May 19, 2025, inbound crypto deposits for EEA and Turkey accounts are placed 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
Travel Rule verification for deposits requires the account holder to submit data through the WhiteBIT web interface. The API does not provide an endpoint to submit Travel Rule data for incoming deposits. Inform end users that frozen deposits require manual action at whitebit.com.
Submit a crypto withdrawal by calling POST /api/v4/main-account/withdraw. See the API Reference for the full endpoint specification.Two withdrawal endpoints are available:
Endpoint
Fee Handling
POST /api/v4/main-account/withdraw
Amount includes the fee — the receiver gets amount - fee
POST /api/v4/main-account/withdraw-pay
Amount excludes the fee — the receiver gets the exact amount specified; the fee is charged on top
Required parameters:
Parameter
Type
Description
ticker
string
Currency ticker (e.g., BTC, ETH)
amount
string
Withdrawal amount
address
string
Destination wallet address
unique_id
string
Unique transaction identifier — generate a new UUID for each withdrawal request
Optional parameters:network (required for multi-network currencies), memo (for currencies requiring a memo or destination tag).Rate limit: 1,000 requests per 10 seconds.
Crypto withdrawals from EEA accounts require a travelRule object in the request body. The travelRule object is required when the currency is crypto AND the account is from the EEA.
Field
Type
Description
type
string
"individual" or "entity" — the receiver type
vasp
string
Destination platform (VASP) name (e.g., "Binance")
name
string
If individual: first name. If entity: entity name.
address
string
If individual: last name. If entity: entity address.
After a withdrawal request is submitted, the system validates the request and begins processing.The POST /api/v4/main-account/withdraw endpoint returns HTTP 201 when validation succeeds and the withdrawal creation process starts. The status transitions from unconfirmed through pending to successful or canceled. Webhook events track the full lifecycle (see the state machine below).
API-initiated withdrawals require 2FA confirmation by default. After the POST /api/v4/main-account/withdraw call succeeds (HTTP 201), the account holder must confirm the withdrawal through their configured 2FA method before the withdrawal moves from unconfirmed to pending.New IP security freeze: When a new IP address is added to the API key whitelist, an email notification is sent to the account owner and withdrawals from that IP are temporarily frozen for a security hold period. Plan for this delay when onboarding new infrastructure.
Coming soon for B2B partners: IP-whitelisted API keys will be able to bypass withdrawal confirmation. When a new IP is whitelisted, an email notification is sent and withdrawals from that IP are temporarily frozen for security. Contact institutional@whitebit.com to be notified when this feature is available.
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 amount
flexFee — percentage-based fee with floor and ceiling:
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 transaction_id from the deposit.canceled webhook (uniqueId field) or from the deposit/withdraw history in the WhiteBIT interface
Refund address requirements:
Must support the same network and asset as the original deposit
Must NOT be a WhiteBIT address
Does not need to match the original sender address
Fiat deposit and withdrawal operations require completion of institutional onboarding with approved fiat access.
Fiat operations require completion of institutional onboarding including KYB verification and fiat provider approval. See Institutional Onboarding for the full two-phase process. Fiat endpoints are not available until fiat access is explicitly approved.
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.
Generate a fiat deposit invoice by calling POST /api/v4/main-account/fiat-deposit-url. See the API Reference for the full specification.
The fiat deposit endpoint works on demand. Contact WhiteBIT support and provide the API key to get access.
Required parameters:
Parameter
Type
Description
ticker
string
Fiat currency ticker (e.g., EUR)
amount
string
Deposit amount
provider
string
Payment provider — check Asset Status endpoint for fiat currencies with can_deposit: true
uniqueId
string
Unique transaction identifier
Optional parameters:successLink, failureLink (redirect URLs after deposit completion — must use HTTPS scheme).The endpoint returns a URL that the end user opens to complete the fiat deposit.
When using the VISAMASTER provider, pass the Referer header when opening the invoice link.
Create a fiat withdrawal using the same POST /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, UAH_IBAN, USD_VISAMASTER, EUR_VISAMASTER.The beneficiary object is required for fiat withdrawals with tickers UAH_IBAN, USD_VISAMASTER, EUR_VISAMASTER, USD, and EUR. The partiallySuccessful parameter may be set to true for increased maximum limits — the application must handle status 18 (“Partially successful”).Fiat withdrawals require KYC verification. Accounts without KYC verification cannot process fiat withdrawals.See Institutional Onboarding for the full fiat onboarding process.
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, cross-account settlement
Optional passphrase protection (up to 25 characters)
WhiteBIT Codes are fee-free. No creation fee, no application fee. Ideal for internal settlement between sub-accounts or partner accounts.
When the currency held in Main balance differs from the currency the end user needs to withdraw, the withdrawal flow includes a conversion step. The Convert feature operates on Trade balance, so the flow requires transfers between Main and Trade before and after conversion.
Convert operates on Trade balance. Deposits arrive in Main balance and withdrawals leave from Main balance. Transfer funds to Trade balance before conversion and back to Main balance before withdrawal. See Balances & Transfers for account type details.
Verify the source currency is available in Main balance.Endpoint:POST /api/v4/main-account/balance — API Reference
2
Transfer from Main to Trade
Transfer the source currency from Main to Trade balance using method deposit.Endpoint:POST /api/v4/main-account/transfer — API Reference
3
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 Reference
4
Confirm the conversion
Confirm the quote using the id from the estimate response. The conversion executes immediately on Trade balance.Endpoint:POST /api/v4/convert/confirm — API Reference
5
Transfer from Trade to Main
Transfer the converted currency from Trade to Main balance using method withdraw.Endpoint:POST /api/v4/main-account/transfer — API Reference
6
Create withdrawal request
Submit a withdrawal to the end user’s external address.Endpoint:POST /api/v4/main-account/withdraw or POST /api/v4/main-account/withdraw-pay — API Reference
7
Receive webhook confirmation
The withdraw.successful webhook fires when the withdrawal completes. See Webhooks for setup and signature verification.
8
Verify via history
Query the history endpoint with transactionMethod: 2 to confirm the withdrawal status. See the Crypto Withdrawals tab for the full status state machine.Endpoint:POST /api/v4/main-account/history — API Reference
Conversion quotes expire after 10 seconds. If the quote expires before confirmation, request a new estimate. See Convert for full parameter details, direction options, and history queries.
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 (X-TXC-SIGNATURE header) — see Security Best Practices for the verification algorithm
Track the nonce field — each webhook nonce is strictly greater than the previous
Retry policy: 5 retries at 10-minute intervals = 50 minutes of delivery coverage.Fallback method — poll POST /api/v4/main-account/history:
Use transactionMethod: 1 for deposits, transactionMethod: 2 for withdrawals
Filter by status array for specific states
Recommended polling interval: every 5 minutes for active monitoring
Rate limit: 200 requests per 10 seconds
Deduplication: Use the uniqueId from webhook payloads and history responses to deduplicate across webhook and polling paths.
WhiteBIT does not offer a webhook replay mechanism. Implement polling as a fallback for outages longer than 50 minutes. Store all processed uniqueId values to prevent double-processing.
Reconciliation pattern:
Receive webhook — verify signature — extract uniqueId and status
Store the event with uniqueId as the idempotency key
On polling cycle: query the history endpoint — compare uniqueId values against stored events
Process any events found via polling that the webhook path did not deliver
Mark transactions as complete only when a terminal status is reached (3/7 for success, 4/9 for canceled deposits, 4 for canceled withdrawals)