bitmart-exchange-spot

Use when the user asks about BitMart spot trading, including buying or selling crypto, placing limit or market orders, checking spot balance, querying open orders, viewing trade history, or managing margin positions. Do NOT use for futures/contract trading (use bitmart-exchange-futures).

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "bitmart-exchange-spot" with this command: npx skills add bitmartexchange/bitmart-skills/bitmartexchange-bitmart-skills-bitmart-exchange-spot

BitMart Spot Trading

Overview

#CategoryAPI EndpointTypeDescription
1Market DataGET /spot/quotation/v3/tickerREADGet single pair ticker
2Market DataGET /spot/quotation/v3/tickersREADGet all pair tickers
3Market DataGET /spot/quotation/v3/booksREADOrder book depth (max 50)
4Market DataGET /spot/quotation/v3/tradesREADRecent public trades (max 50)
5Market DataGET /spot/quotation/v3/klinesREADHistorical K-line/candlestick
6Market DataGET /spot/quotation/v3/lite-klinesREADLatest K-line data
7Market DataGET /spot/v1/symbols/detailsREADTrading pair details
8Market DataGET /spot/v1/symbolsREADTrading pair list
9Market DataGET /spot/v1/currenciesREADAll supported currencies
10AccountGET /account/v1/walletREADAccount balance (all wallets)
11AccountGET /spot/v1/walletREADSpot wallet balance
12AccountGET /spot/v1/trade_feeREADActual trade fee rate
13AccountGET /spot/v1/user_feeREADBase fee rate (account tier)
14Margin AccountGET /spot/v1/margin/isolated/accountREADIsolated margin account details
15Margin AccountGET /spot/v1/margin/isolated/pairsREADBorrowing rate & amount
16Margin AccountGET /spot/v1/margin/isolated/borrow_recordREADBorrow record
17Margin AccountGET /spot/v1/margin/isolated/repay_recordREADRepayment record
18TradingPOST /spot/v2/submit_orderWRITEPlace single order
19TradingPOST /spot/v1/margin/submit_orderWRITEPlace margin order
20TradingPOST /spot/v4/batch_ordersWRITEBatch orders (max 10)
21TradingPOST /spot/v3/cancel_orderWRITECancel single order
22TradingPOST /spot/v4/cancel_ordersWRITECancel multiple orders
23TradingPOST /spot/v4/cancel_allWRITECancel all open orders
24Order QueryPOST /spot/v4/query/orderREADQuery order by order ID
25Order QueryPOST /spot/v4/query/client-orderREADQuery by client order ID
26Order QueryPOST /spot/v4/query/open-ordersREADAll open orders
27Order QueryPOST /spot/v4/query/history-ordersREADHistorical orders
28Order QueryPOST /spot/v4/query/tradesREADAccount trade history
29Order QueryPOST /spot/v4/query/order-tradesREADTrades for specific order
30Margin LoanPOST /spot/v1/margin/isolated/borrowWRITEMargin borrow (isolated)
31Margin LoanPOST /spot/v1/margin/isolated/repayWRITEMargin repay (isolated)
32Margin LoanPOST /spot/v1/margin/isolated/transferWRITEMargin asset transfer
33SystemGET /system/timeREADGet server time (milliseconds)
34SystemGET /system/serviceREADGet system service status / maintenance

Skill Routing

User IntentCorrect Skill
Spot buy/sell, order management, balance, fee ratesbitmart-exchange-spot (this skill)
Futures/contract trading, leverage, TP/SL, plan ordersbitmart-exchange-futures

Authentication

Credential Check (Before Any Private API Call)

Before calling any authenticated endpoint, verify credentials are available:

  1. Check for environment variables:
    • BITMART_API_KEY — API key
    • BITMART_API_SECRET — Secret key
    • BITMART_API_MEMO — Memo string
  2. Or check for config file: ~/.bitmart/config.toml
    [default]
    api_key = "your-api-key"
    api_secret = "your-secret-key"
    memo = "your-memo"
    
  3. If missing: STOP. Guide user to set up credentials. Do NOT proceed with any authenticated call.

Key display rules: When displaying credentials back to the user, show only the first 5 and last 4 characters (e.g., bmk12...9xyz). NEVER display full secret or memo values.

Auth Levels

LevelWhenHeaders Required
NONEPublic market data (endpoints 1-9)None
KEYEDRead-only private data — balances, fees, margin account, borrow/repay records (endpoints 10-17)X-BM-KEY
SIGNEDWrite operations and order queries (endpoints 18-32)X-BM-KEY + X-BM-SIGN + X-BM-TIMESTAMP

Signature Generation

timestamp = current UTC time in milliseconds
message   = "{timestamp}#{memo}#{request_body_json}"
signature = HMAC-SHA256(secret_key, message) → hex string
  • For POST requests: request_body_json is the JSON body string.
  • For GET requests: request_body_json is an empty string "".

Required Headers (SIGNED)

HeaderValue
Content-Typeapplication/json
X-BM-KEYAPI key
X-BM-SIGNHex-encoded HMAC-SHA256 signature
X-BM-TIMESTAMPCurrent UTC timestamp in milliseconds

See references/authentication.md for full setup guide and troubleshooting.


API Base

  • Base URL: https://api-cloud.bitmart.com
  • Symbol Format: BTC_USDT (base_quote, underscore separated)

Standard Response Format

Success:

{
  "code": 1000,
  "message": "OK",
  "trace": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "data": { ... }
}

Error:

{
  "code": 50000,
  "message": "Bad Request",
  "trace": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "data": null
}

Important: code == 1000 means success. Any other code is an error. Important: Spot business error codes are endpoint/version specific. Do not assume the same numeric code has the same meaning across all spot flows.

GET requests: Parameters go in the query string. POST requests: Parameters go in the JSON body.


Rate Limits

EndpointRateTarget
GET /spot/quotation/v3/ticker15 req/2secIP
GET /spot/quotation/v3/tickers10 req/2secIP
GET /spot/quotation/v3/lite-klines15 req/2secIP
GET /spot/quotation/v3/klines10 req/2secIP
GET /spot/quotation/v3/books15 req/2secIP
GET /spot/quotation/v3/trades15 req/2secIP
GET /spot/v1/currencies8 req/2secIP
GET /spot/v1/symbols8 req/2secIP
GET /spot/v1/symbols/details12 req/2secIP
Balance12 req/2secKEY
Trade Fee / User Fee2 req/2secKEY
Margin Account12 req/2secKEY
Margin Pairs2 req/2secKEY
Borrow / Repay Records150 req/2secKEY
Place Order (spot)40 req/2secUID
Batch Place Orders (/spot/v4/batch_orders)40 req/2secUID
Place Order (margin)20 req/1secUID
Cancel Order40 req/2secUID
Cancel Multiple (/spot/v4/cancel_orders)40 req/2secUID
Cancel All1 req/3secUID
Query Order by ID50 req/2secKEY
Query by Client Order ID (/spot/v4/query/client-order)50 req/2secKEY
Open / History / Trades12 req/2secKEY
Order-Trades12 req/2secKEY
Margin Borrow / Repay / Transfer2 req/2secKEY
GET /system/time10 req/secIP
GET /system/service10 req/secIP

Rate limit response headers:

  • X-BM-RateLimit-Remaining — Number of requests already used in the current window
  • X-BM-RateLimit-Limit — Maximum allowed requests in the current window
  • X-BM-RateLimit-Reset — Current time window length (seconds)

Warning: If X-BM-RateLimit-Remaining >= X-BM-RateLimit-Limit, stop calling immediately and wait for reset to avoid sending one extra over-limit request.

If rate limited (HTTP 429), wait for the reset period before retrying.


Quickstart

Example 1: Get BTC price (no auth)

curl -s 'https://api-cloud.bitmart.com/spot/quotation/v3/ticker?symbol=BTC_USDT'

Example 2: Get account balance (KEYED)

curl -s -H "X-BM-KEY: $BITMART_API_KEY" \
  'https://api-cloud.bitmart.com/account/v1/wallet'

Example 3: Place limit buy order (SIGNED)

TIMESTAMP=$(date +%s000)
BODY='{"symbol":"BTC_USDT","side":"buy","type":"limit","size":"0.001","price":"60000"}'
SIGN=$(echo -n "${TIMESTAMP}#${BITMART_API_MEMO}#${BODY}" | openssl dgst -sha256 -hmac "$BITMART_API_SECRET" | awk '{print $NF}')
curl -s -X POST 'https://api-cloud.bitmart.com/spot/v2/submit_order' \
  -H "Content-Type: application/json" \
  -H "X-BM-KEY: $BITMART_API_KEY" \
  -H "X-BM-SIGN: $SIGN" \
  -H "X-BM-TIMESTAMP: $TIMESTAMP" \
  -d "$BODY"

API Reference

See references/api-reference.md for full endpoint documentation with parameters, examples, and response formats. See references/scenarios.md for step-by-step execution flows for common spot tasks such as market buy, limit sell, batch orders, and cancel-replace.


Reference: Order Types

TypeDescription
limitExecute at specified price or better
marketExecute immediately at best available price
limit_makerPost-only; rejected if it would immediately match (ensures maker fee)
iocImmediate-or-cancel; unfilled portion is canceled immediately

Reference: Order Sides

SideDescription
buyBuy base currency with quote currency
sellSell base currency for quote currency

Reference: Order States

StateDescription
newOrder accepted, not yet filled
partially_filledPartially executed, still open
filledFully executed
canceledCanceled by user
partially_canceledPartially filled, then canceled

Reference: Cancel Sources

SourceDescription
"" (empty)Not canceled
userCanceled by user
systemCanceled by system (e.g., insufficient balance)
stpCanceled by self-trade prevention

Reference: STP Modes

ModeDescription
noneNo self-trade prevention
cancel_makerCancel the resting (maker) order if self-trade detected
cancel_takerCancel the incoming (taker) order if self-trade detected
cancel_bothCancel both orders if self-trade detected

Reference: Trade Roles

RoleDescription
takerOrder matched immediately against resting order
makerOrder rested on book and was matched later

Reference: Parameter Naming Convention

CRITICAL — Wrong case = silently ignored field. The API does NOT return an error for misnamed params; it simply ignores them, causing unexpected behavior or wrong results. Always verify the endpoint version before constructing any request body.

API VersionConventionExamples
v1-v3snake_caseclient_order_id, order_id, start_time
v4camelCaseclientOrderId, orderId, orderMode, startTime

Mixed-case exceptions (must be memorized):

  • POST /spot/v2/submit_order: stpMode (camelCase) alongside client_order_id (snake_case)
  • POST /spot/v1/margin/submit_order: clientOrderId (camelCase in a v1 endpoint)

Reference: K-Line Steps

Step (minutes)Description
11-minute candles
55-minute candles
1515-minute candles
3030-minute candles
601-hour candles
1202-hour candles
2404-hour candles
14401-day candles
100801-week candles
432001-month candles

Operation Flow

Step 0: Credential Check

Verify BITMART_API_KEY, BITMART_API_SECRET, and BITMART_API_MEMO are available via environment variables or ~/.bitmart/config.toml. If missing, STOP and guide the user to set up credentials.

Step 1: Identify User Intent

Parse user request and map to a READ or WRITE operation:

  • READ operations: market data, balance queries, order queries, fee rates
  • WRITE operations: place order, cancel order, batch orders

Timestamp Display Rules

API responses contain Unix timestamps in different units. When displaying any timestamp to the user, always convert to human-readable local time.

FieldUnitConversion
createTime, updateTime (order responses)Milliseconds÷ 1000 → Unix seconds → local time
server_time (system time)Milliseconds÷ 1000 → Unix seconds → local time
t (K-line candle open time)SecondsDirect → Unix seconds → local time
create_time (borrow records)SecondsDirect → Unix seconds → local time
repay_time (repay records)SecondsDirect → Unix seconds → local time

Display format: YYYY-MM-DD HH:MM:SS in the user's local timezone. Example: timestamp 1700000000000 (ms) → 2023-11-15 06:13:20 (UTC+8).

Common mistakes to avoid:

  • Do NOT treat millisecond timestamps as seconds (produces dates in year 55000+)
  • Do NOT display raw numeric timestamps — always convert to readable format
  • Do NOT assume UTC — convert to the user's local timezone

Step 2: Execute

  • READ: Call the API endpoint, parse response, format data for user display.

  • WRITE: Follow these sub-steps strictly in order:

    2a. Parameter naming check (prevents silent failures):

    • Identify the API version of the target endpoint
    • v4 endpoints (/spot/v4/...): ALL params must be camelCase (clientOrderId, orderId, orderMode, startTime)
    • v1–v3 endpoints: ALL params must be snake_case (client_order_id, order_id, start_time)
    • Special exception: POST /spot/v2/submit_order uses mixedclient_order_id (snake_case) + stpMode (camelCase)
    • The API does NOT return an error for wrong-case params — it silently ignores them, causing wrong orders or failed queries

    2b. Order type rules — params, precision, minimum validation:

    First call GET /spot/v1/symbols/details, locate the symbol in data.symbols[], extract: price_max_precision, quote_increment, min_buy_amount, min_sell_amount.

    Then branch:

    type=market, side=buy — Market buy:

    • Send only notional (USDT/quote amount). Do NOT send size or price — silently ignored and causes error 50021.
    • Validate: float(notional) >= min_buy_amount. If not, STOP — suggest "notional":"<min_buy_amount>". API returns 51012 otherwise.
    • Body: {"symbol":"XRP_USDT","side":"buy","type":"market","notional":"5"}

    type=market, side=sell — Market sell:

    • Send only size (base currency quantity, e.g. XRP amount). Do NOT send price or notional.
    • Truncate size to quote_increment precision.
    • Estimate value: size * current_last_price. If estimated value < min_sell_amount, STOP and warn user.
    • Body: {"symbol":"XRP_USDT","side":"sell","type":"market","size":"10"}

    type=limit — Limit order:

    • Send size + price. Truncate price to price_max_precision, size to quote_increment.
    • Note: If price exceeds price_max_precision, the API silently truncates the extra decimals instead of returning an error. Always truncate client-side to ensure the submitted price matches the intended price.
    • Calculate order_value = size * price. If order_value < min_buy_amount (buy) or < min_sell_amount (sell), STOP.
    • If user requested "buy all" / "use full balance": size = floor(balance / price) at precision, re-verify minimum.
    • No hidden risk — order sits on the book until filled or canceled.

    type=limit_maker — Post-only (maker-only):

    • Same params as limit (size + price). Same precision/minimum rules.
    • CRITICAL behavioral note: The server auto-cancels the order (no error) if the price would immediately match:
      • Buy limit_maker: if price >= best_ask, order is silently canceled. Price must be below best ask.
      • Sell limit_maker: if price <= best_bid, order is silently canceled. Price must be above best bid.
    • Inform user of this risk when setting an aggressive limit_maker price.

    type=ioc — Immediate-or-Cancel:

    • Same params as limit (size + price). Same precision/minimum rules.
    • Behavioral note: Fills whatever quantity is available immediately at the given price; the unfilled remainder is immediately canceled. User may receive a partial fill or no fill at all.

    2c. Confirm and execute:

    • Present order summary based on type:
      • market buy: symbol, side=buy, type=market, notional amount
      • market sell: symbol, side=sell, type=market, size (quantity)
      • limit/limit_maker/ioc: symbol, side, type, size, price, estimated order value
    • For limit_maker: include a reminder that the order will be auto-canceled if the price crosses the spread.
    • Ask for explicit "CONFIRM" before executing. Only proceed after user confirms.

Step 3: Verify (WRITE only)

  • After placing an order: Call POST /spot/v4/query/order with {"orderId":"..."} to confirm order status.
  • After canceling an order: Call POST /spot/v4/query/open-orders to verify the order is no longer open.
  • Report the verified result to the user.

Cross-Skill Workflows

Workflow 1: Check Price → Check Balance → Buy

  1. bitmart-exchange-spotGET /spot/quotation/v3/ticker?symbol=BTC_USDT — Get current price
  2. bitmart-exchange-spotGET /account/v1/wallet — Check available balance
  3. bitmart-exchange-spotPOST /spot/v2/submit_order — Place buy order (after user CONFIRM)
  4. bitmart-exchange-spotPOST /spot/v4/query/order — Verify order execution

Error Handling

Spot business error codes are endpoint/version specific. Use the table below for authentication / transport issues and common current spot order-query behavior. For margin borrow / repay / transfer flows, see the margin-only notes after the table.

CodeDescriptionAction
1000SuccessProcess response normally
30002X-BM-KEY not foundCheck that API key is set correctly
30005X-BM-SIGN is wrongVerify signature generation (timestamp, memo, body format)
30006X-BM-TIMESTAMP is wrongEnsure X-BM-TIMESTAMP is present and is a Unix timestamp in milliseconds
30007Timestamp/recvWindow validation failedSync system clock (NTP), send X-BM-TIMESTAMP as Unix milliseconds, and ensure (serverTime - timestamp) <= recvWindow; recvWindow must be Long in (0,60000], default 5000 (max 60000). For current signed v4 flows, rely on recvWindow as the effective request-validity window.
30010IP forbiddenCheck API key IP whitelist settings
30013Rate limit exceededWait for rate limit window to reset, then retry
50005Order Id not found / query returned no dataOn POST /spot/v4/query/order, a missing orderId / clientOrderId currently returns this code
50021param errorFor market buy, use notional (USDT amount) — do NOT use size; size is silently ignored and causes this error
51011param not match : size * price >= XRead symbol constraints from GET /spot/v1/symbols/details; enforce side-specific minimum notional (min_buy_amount/min_sell_amount)
51012below minimum order amountnotional (for market buy) or size * price (for limit) is below min_buy_amount; increase order value to at least the symbol minimum
52000Unsupported OrderMode TypeOn current v4 query endpoints, use a valid orderMode (spot / iso_margin) or omit the field to query all modes
40044Invalid order sizeCall GET /spot/v1/symbols/details; use symbol precision/increment fields and truncate (not round) size and price
50023Operation is limitedPair may not support API trading; use a different pair
429HTTP rate limitBack off exponentially, check X-BM-RateLimit-Reset header
418IP bannedStop all requests immediately; wait before retrying

Margin-only business codes (do not treat as global spot codes):

  • 51003Account Limit. Use in margin borrow / repay / transfer context; do not use as the generic “order not found” code for v4 order-query flows.
  • 51006Exceeds the amount to be repaid. Use for isolated margin repay flows.
  • 51007order_mode not found in the official business-code table. Do not use this as guidance for current v4 query endpoints; invalid orderMode requests currently return 52000. | 403 | Cloudflare WAF block | Check IP reputation (VPN/cloud IPs are commonly challenged); wait 30-60 seconds and retry; do not auto-retry more than 3 times | | 503 | Cloudflare challenge / origin unavailable | Same as 403; if response body contains "Cloudflare" or "cf-", it is a Cloudflare interception, not a BitMart error; check network environment |

Cloudflare Handling

BitMart API is behind Cloudflare CDN. If you receive HTTP 403/503 and the response body contains "Cloudflare", "cf-", or an HTML challenge page (instead of JSON):

  1. This is a Cloudflare interception, not a BitMart API error — do not parse as JSON
  2. Check if too many requests were sent in a short window (Cloudflare WAF has its own rules independent of API rate limits)
  3. Wait 30-60 seconds before retrying
  4. If running from a cloud server or VPN, the IP may have low reputation — try from a different network
  5. Do not auto-retry more than 3 times — inform the user if the issue persists

Security Notes

  • Never display full API keys or secrets. Show first 5 + last 4 characters only (e.g., bmk12...9xyz).
  • All WRITE operations require explicit user confirmation before execution. Present a clear summary of the action and wait for "CONFIRM".
  • Recommend IP whitelist on API keys for additional security.
  • Recommend minimum permissions: Read-Only + Spot-Trade only (no Withdraw permission).
  • All trading outputs include disclaimer: "Not financial advice. You are solely responsible for your investment decisions."

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

bitmart-exchange-futures

No summary provided by upstream source.

Repository SourceNeeds Review
Web3

Use Circle Wallets

Choose and implement the right Circle wallet type for your application. Compares developer-controlled, user-controlled, and modular (passkey) wallets across...

Registry SourceRecently Updated
Web3

DeFi Position Tracker

Monitor and analyze DeFi positions across protocols and chains. Track LP (liquidity provider) positions, staking rewards, yield farming returns, impermanent...

Registry SourceRecently Updated
Web3

Use Usdc

USDC is Circle's stablecoin deployed across multiple blockchain ecosystems including EVM chains (Ethereum, Base, Arbitrum, Polygon, Arc) and Solana. Use this...

Registry SourceRecently Updated