Skip to main content

Error Codes

Spot APIs return errors as {"error": "<STRING_CODE>"} plus the HTTP status. This page lists every code emitted by the spot subsystem grouped by category.

Auth & permission

HTTPerrorWhen
401(empty body)Missing / invalid JWT, missing / wrong HMAC signature, or timestamp outside ±5000 ms of server time.
403API Key permission deniedAPI-key caller hit POST /spot/transfer or POST /spot/withdraw/request (JWT only).
403FORBIDDENTargeted resource (order, withdrawal) belongs to another user.

Market state

HTTPerrorWhen
404MARKET_NOT_FOUNDsymbol doesn't exist in spot_markets.
409MARKET_HALTEDMarket in halted status; no new orders.
410MARKET_DELISTEDMarket in delisted status; terminal.

Order placement (POST /spot/orders)

HTTPerrorWhen
400invalid sideside not in sell.
400invalid typetype not in market.
400invalid tiftif not in post_only. Note: lowercase only.
400quantity required for limitlimit order missing quantity.
400quantity required for market sellmarket SELL missing quantity.
400quote_quantity required for market buymarket BUY missing quote_quantity.
400INVALID_TICKprice is not a multiple of the market's tick_size.
400INVALID_LOTquantity is not a multiple of the market's lot_size.
400BELOW_MIN_NOTIONALprice * quantity < min_notional.
400INSUFFICIENT_BALANCEThe lock the order needs (base for SELL, quote for BUY) exceeds caller's available.
400POST_ONLY_REJECTtif=post_only order would have crossed the book at placement.
400SELF_TRADENew order would cross caller's own resting order (DECLINE_TAKER policy).

Order management

HTTPerrorWhen
400invalid idPath :id is not a UUID.
404ORDER_NOT_FOUNDOrder doesn't exist, is terminal, or belongs to another user.
404WITHDRAWAL_NOT_FOUNDWithdrawal id doesn't exist or belongs to another user.

Engine availability

HTTPerrorWhenAction
503spot trading disabledSPOT_TRADING_ENABLED=false on this server.Permanent for this env.
503ENGINE_BUSYEngine mpsc backlog full.Retry with backoff (200 / 400 / 800 ms).
503ENGINE_RESTARTINGRecovery in progress.Retry after a few seconds.
503TICKER_NOT_FOUNDGET /spot/ticker/24hr?symbol=… for a symbol with no row yet.Will resolve after the first fill.

Transfer (POST /spot/transfer)

HTTPerrorWhen
400INVALID_DIRECTIONdirection not in spot_to_perp.
400AMOUNT_NON_POSITIVEamount <= 0.
400INSUFFICIENT_BALANCESource side does not have enough free USDT.
400UNSUPPORTED_TOKENMVP supports USDT only.

Withdraw (POST /spot/withdraw/request)

HTTPerrorWhen
400AMOUNT_NON_POSITIVEamount <= 0.
400INSUFFICIENT_BALANCEavailable < amount for the requested token.
400UNSUPPORTED_TOKENToken not in the spot wallet's supported list (currently DF).
503SIGNER_UNAVAILABLEBackend signer (or its KMS) is unreachable. Transient.

Admin (/admin/spot/*)

HTTPerrorWhen
400INVALID_STATUSstatus not in delisted.
400AMOUNT_NON_POSITIVECredit amount is <= 0.
404DISABLEDPOST /admin/spot/balances/credit called when TESTNET_ONLY != true.
409MARKET_EXISTSCreating a market whose id already exists.
500DB_ERRORPostgres error during the admin write.

Server faults

HTTPerrorWhen
500DB_ERRORAny unexpected Postgres error during a write. Investigate logs.
500(html body)Panic in the request task. Capture the request and report.