Market-Making Program overview
Maker-fee rebates are tiered by 30-day rolling trading volume, with separate tiers for spot and futures. Negative maker fees are rebates — the exchange pays the market maker for each maker order filled. Rates and volume breakpoints change over time and are not duplicated here. For current fees and tier requirements, see the Market-Making Program page, the trading fees page, or the VIP program. Program benefits beyond fees:- Colocation access
- Dedicated account manager
- Cross-marketing support
- Sub-accounts for strategy separation
- Access to Liquidity Provision program for non-MM liquidity partnerships
Prerequisites
- Approved Market-Making Program enrollment — contact
institutional@whitebit.comwith trading-volume history and target markets (see How to apply); the Market-Making overview covers program terms. - Colocation connection details — provisioned by the account manager for latency-sensitive strategies (see Colocation setup).
- API access — HMAC-signed requests.
Colocation setup
Colocation provides low-latency API access from AWS infrastructure co-located with the WhiteBIT matching engine. The account manager provides the specific AWS region, availability zone, and connection endpoints during onboarding. EC2 sizing recommendations:- Network: up to 10Gbit bandwidth
- CPU: minimum 4 vCPU cores
- Low-performance VPS instances result in higher latency
Available colocation endpoints
The colocation infrastructure exposes 35 endpoints organized into three categories: spot trading (17), collateral trading for both Margin and Futures (14), and utility (4).Spot trading (17 endpoints)
Collateral / Margin and Futures trading (14 endpoints)
API naming convention: WhiteBIT’s API uses “collateral” endpoints for both Margin and Futures trading. The market pair determines the product: spot pairs (e.g.,
BTC_USDT) for Margin, perpetual pairs (e.g., BTC_PERP) for Futures. All endpoints under /api/v4/order/collateral/ and /api/v4/collateral-account/ serve both products.Utility (4 endpoints)
For endpoints not listed above, use the standard WhiteBIT API at
https://whitebit.com.
Quoting strategy
Quoting on WhiteBIT uses limit orders placed via individual endpoints orPOST /api/v4/order/bulk (up to 20 limit orders per request), paired with the depth and bookTicker WebSocket channels for price input. Orders can be placed over REST — covered in this section — or, from September 2, 2026, over the WebSocket order methods on the same connection (global platform only); see Placing and canceling orders over WebSocket for the trade-offs.
Bulk vs individual: bulk reduces wire and auth overhead and gives atomic same-timestamp placement of a quote ladder. The bulk response only returns once every leg in the batch is processed. Pipelined individual orders give faster per-leg acknowledgment for clients optimized for that pattern. Use bulk for atomic quote refreshes and less-optimized clients; use individual orders when lowest per-leg ack latency matters most.
RPI mode: Each order item in /order/bulk can set rpi: true to enable Retail Price Improvement (RPI) mode. RPI orders are post-only and hidden from public depth and bookTicker feeds. RPI orders remain visible in the exchange UI order book (web/mobile) — capturing UI-driven retail flow rather than algorithmic flow consuming the public feed. RPI executions use an account-specific fee or rebate model. Incompatible with ioc. RPI is a flow-segmentation tool, not a default MM primitive — fit depends on volume targets and the account’s fee arrangement. See the API Reference and glossary entry.
Real-time orderbook: Subscribe to the depth WebSocket channel for real-time orderbook updates. See the WebSocket Quickstart.
Order modify: POST /api/v4/order/modify — change an existing order’s price, amount, or activation price. The matching engine internally cancels the original order and creates a replacement with a new orderId, so modify does NOT preserve queue priority. Use clientOrderId as the stable identifier across modifications. Identify the target by orderId OR clientOrderId — never both. See the API Reference. For how the engine sequences orders — price-time priority, participant fairness, and latency factors — see Matching engine.
Kill-switch (circuit breaker): POST /api/v4/order/kill-switch — sets a per-market timeout of 5–600 seconds; if the endpoint is not called again before it expires, the kill-switch cancels every open order on that market. Quoting several markets requires one timer per market. The deadman trigger for process crashes, lost connectivity, and operator absence. See the API Reference.
- Configuration: set the timeout (5–600 seconds); each call to the endpoint resets the timer;
timeout: nulldeletes it - Scope: pass the optional
typesarray ("spot","margin","futures") to restrict the breaker to a subset of order types — useful when spot market-making runs alongside futures positions whose protective orders must stay on the book - Check status:
POST /api/v4/order/kill-switch/status— see the API Reference
stp mode passed at order placement. The default mode (no) allows self-trades, which is usually not what a two-sided quoter wants. See Self-Trade Prevention for the available modes.
The examples below assume an API key with trade permissions. Payload signing (X-TXC-PAYLOAD, X-TXC-SIGNATURE) is covered in the request-signing setup.
- curl
- Python
WebSocket workflow for market making
The market-making loop runs on real-time WebSocket data, not REST polling. Quote inputs arrive ondepth (deep book) or bookTicker (top of book); inventory state arrives on balanceSpot; fill confirmations arrive on deals (executions) and ordersPending (state transitions including partial fills and cancels). Wire those four channels together to close the loop: market data drives the quote, REST order/bulk or order/modify places it, ordersPending confirms the state transition, deals confirms the fill, balanceSpot confirms the inventory delta, and the loop recomputes.
The protocol primitives — connect, ping/pong, authorize, exponential-backoff reconnection, and the query-then-subscribe recovery pattern — are covered end-to-end in the WebSocket Quickstart.
Futures additions. When quoting perpetuals (e.g.
BTC_PERP), add two more channels:
Canonical subscribe set (spot MM). Send these messages after the
authorize handshake — the three private subscriptions will be rejected on an unauthenticated socket. For multi-symbol MM, repeat each *_subscribe per market or use the multiple-subscription flag where supported (see the depth subscribe parameters). To stop quoting on one pair without disrupting the others, send depth_unsubscribe or bookTicker_unsubscribe with that market name in params — only that market’s feed drops; an empty array unsubscribes from all markets on the stream.
ordersPending_subscribe takes a flat array of markets, deals_subscribe takes a single-element array containing the array of markets. The full schema lives in asyncapi/private/deals.yaml (rendered as the Deals channel page).
For the full reconnect-with-fresh-token + auto-resubscribe pattern that wraps these subscriptions in production, see WS Quickstart — Reconnection and state recovery and the worked grid-bot example in the Bot Guide.
Placing and canceling orders over WebSocket
Coming soon — order placement over WebSocket becomes available on September 2, 2026, on the global platform only; the EU platform is not yet supported. Until then, place orders over REST as described in Quoting strategy.
params array — prices and amounts as decimal strings, side as "buy" or "sell":
id: result holds the order object — with side inverted to 1 for sell or 2 for buy — and error is null on success. The full parameter set, the flag rules, and every method live on the Order Management reference and the Place limit order page.
When the socket wins. Placing over the open connection removes the per-request HTTP round trip and the per-request HMAC signature that each REST order carries: the connection authorizes once, and every later order frame rides that session. For a quoter refreshing one price at a time, the socket is the shortest path to the book.
When REST still wins. Two market-making primitives run over REST, so a socket-first quoter keeps a REST client alongside the connection:
- Atomic ladder placement.
POST /api/v4/order/bulkplaces up to 20 limit orders in one request with same-timestamp atomicity. The WebSocket methods place one order per frame, and order frames draw on the same 200-requests-per-minute-per-connection budget as subscriptions — a 20-level requote is 20 frames against that budget. Refresh a full ladder over REST bulk; place and cancel individual quotes over the socket. - The deadman timer. The kill-switch (
POST /api/v4/order/kill-switch) that cancels a market’s orders when the client stops calling in is a REST endpoint. Arm it over REST no matter which transport places the quotes — the WebSocketorder_cancel_allmethod cancels one market on demand but does not run a timer.
id; responses interleave with subscription pushes, so match answers by id, not by arrival order. order_modify over the socket is cancel-and-replace exactly as the REST modify is — a new engine order id, client_order_id preserved, queue priority lost. The rpi flag is accepted on order_limit_place, so RPI quoting works over either transport.
Infrastructure best practices
Three pieces are load-bearing in production: how the account is partitioned across strategies, how the socket recovers when it drops, and how requests stay under per-endpoint limits. Sub-accounts for strategy separation: Use sub-accounts to isolate different trading strategies or pair groups. Each sub-account has independent balances and can have dedicated API keys; transfers between sub-accounts are fee-free. Worked example: run the BTC_USDT spot MM book in one sub-account funded with its own USDT balance, and a directional ETH_USDT swing book in a second sub-account with its own balance and leverage limit. A drawdown that wipes the swing book’s collateral cannot pull capital from the MM book — the MM bot keeps quoting on its untouched balance, and the swing book’s API key has no authority over the MM sub-account. WebSocket connection management:- Authenticate after connecting: fetch a token via
POST /api/v4/profile/websocket_token(rate limit: 10 requests per 60 seconds — cache the token across reconnects within its lifetime), then send{"id": N, "method": "authorize", "params": ["<token>", "public"]}on the socket. On{"result": {"status": "success"}}, subscribe to private channels such asbalanceSpot,ordersPending, anddeals - Implement automatic reconnection with exponential backoff
- Re-subscribe to all channels after reconnection
- Use the ping/pong mechanism to detect stale connections
- After reconnecting, reconcile local state: call
POST /api/v4/ordersfor the current active set andPOST /api/v4/trade-account/executed-historyfor fills since the last-seen ID. Do not assume in-memory state survived the disconnect - See the WebSocket Quickstart for a full connection + auth example
trade-account reads allow 12,000. The outlier is POST /api/v4/profile/websocket_token at 10 requests per 60 seconds. Full reference: Rate Limits.
- Use bulk orders (
/order/bulk) to reduce request count: 20 orders per call vs. 20 individual calls - Use WebSocket for market data instead of polling REST endpoints
- Maintain a per-endpoint token bucket sized to the table above; back off when the bucket empties rather than retrying after a 429
Monitoring and safety
Set the kill-switch first; everything below is the loop that keeps it reset, the manual cancel that overrides it, and the balance and fee surfaces the loop reads from. Kill-switch configuration: Set a kill-switch timer for every quoted market as the first action after connecting — each timer covers only its own market. Configure the timeout based on the maximum acceptable unmonitored period for the system. Reset the timers with each regular API call to the kill-switch endpoint. If the system crashes or loses connectivity, the kill-switch cancels each covered market’s open orders as its timeout expires. Disconnect protection: WhiteBIT provides no automatic cancel-on-disconnect for WebSocket clients — resting orders persist when the socket drops. The per-market kill-switch is the disconnect safeguard: set a timer for each quoted market and reset it on the connection heartbeat, so a dropped or crashed client has its open orders canceled when the timer lapses. The kill-switch is a REST endpoint — arm it over REST whether quotes are placed over REST or the WebSocket order methods. Emergency cancel:POST /api/v4/order/cancel/all — cancel every open order synchronously; the response returns after the cancellations complete. Use the optional market field to scope to a single pair and the type array to scope to "spot", "margin", or "futures"; omit both to cancel everything on the account. This is the “big red button” for live traders; the kill-switch is the deadman timer for unattended operation. order/cancel/all is available on colocation as well as through the standard public API. See the API Reference.
- curl
- Python
balanceSpot channel for real-time balance updates, or poll POST /api/v4/trade-account/balance for periodic checks. Monitor for unexpected balance changes.
Fee tracking: Use POST /api/v4/market/fee to pull the account’s global maker and taker fees plus any per-pair custom fees — the market request parameter is currently ignored, so the endpoint returns fees for all markets regardless. Filter the per-pair custom_fee map client-side. Fee tiers are based on 30-day rolling volume — monitor tier changes as volume accumulates. Look up tier breakpoints on the VIP program page or the trading fees page.
Self-Trade Prevention: Understand the STP mode active on the account. Two-sided quoters hit STP frequently when bid and ask orders overlap. See Self-Trade Prevention for the available modes and behavior.
How to apply
Contact institutional@whitebit.com with trading volume history and target markets. The dedicated account manager provides colocation connection details — AWS region, availability zone, and connection endpoints — during onboarding.What’s next
Colocation
AWS regions, EC2 sizing, and availability-zone placement for colocation onboarding.
Spot Trading API
Full endpoint documentation for all spot trading endpoints.
Self-Trade Prevention
STP modes and behavior for two-sided quoting.