1. MinGlobal External API (v1)
MIN-Global API
  • MinGlobal External API (v1)
    • 01. Overview and Quick Start
      • Step 1. Check API Reachability (no key needed)
      • Step 2. Your First Signed Request
    • 02. Authentication and Request Signing
    • 03. Spot Trading Explained
    • 04. Futures Trading Explained
    • 05. Data Formats and Conventions
    • 06. Errors and Troubleshooting
    • 07. Rate Limits, Permissions and Known Limits
    • 08. Market Data API (public, no key needed)
      • List Spot Trading Pairs
      • Get All Spot Tickers
      • Get Spot Candlesticks (Klines)
      • Get Spot Order Book (Depth)
      • Get Recent Spot Trades
      • List Futures Contracts
      • Get All Futures Tickers
      • Get Futures Candlesticks (Klines)
      • Get Futures Order Book (Depth)
      • Get Recent Futures Trades
    • 09. Wallets and Balances API
      • Get All Balances
      • Get Balances by Coin
    • 10. Assets and Networks API
      • List Supported Coins
      • List Networks for a Coin
    • 11. Spot Trading API
      • Place Spot Order (Limit Buy)
      • Place Spot Order (Market Sell)
      • List Your Spot Orders
      • Get One Spot Order
      • Cancel Spot Order
    • 12. Futures Trading API
      • Get Futures Margin Balance
      • Open Futures Position (Limit Long)
      • Close Futures Position (Reduce Only)
      • List Open Futures Orders
      • Get Futures Order History
      • Get One Futures Order
      • Cancel Futures Order
  1. MinGlobal External API (v1)

03. Spot Trading Explained

Spot Trading Explained#

This page assumes you have never traded before. It covers what spot trading is, the words you need, how an order actually travels through this API, and then the exact sequence of calls to make one trade from start to finish.

1. What is spot trading?#

Spot trading means buying or selling a coin for immediate delivery, at the price it is worth right now. "Spot" means "on the spot": you pay now, and you own the coin now.
It is the simplest form of trading there is. It works like changing money at an exchange counter, except the counter never closes and the price keeps moving.

A worked example#

You hold 1,000 USDT. Bitcoin is trading at 60,000 USDT. You buy 0.001 BTC.
You pay: 0.001 x 60,000 = 60 USDT
You now hold: 940 USDT and 0.001 BTC
If Bitcoin later rises to 70,000 USDT, your 0.001 BTC is worth 70 USDT, so you could sell for a 10 USDT profit. If it falls to 50,000 USDT, it is worth 50 USDT and you are down 10 USDT.
Either way the coins are genuinely yours. Nobody can take them from you, and you never owe anyone anything.

How spot differs from futures#

SpotFutures
What you ownThe actual coinA contract that tracks the price
Money requiredThe full amountA fraction of it, called margin
Borrowing involvedNoneYes. That is what leverage is
Worst caseThe coin loses valueThe exchange closes your position and your margin is gone
Can you be forced out?NoYes, this is called liquidation
If you are new, start with spot. You cannot lose more than you put in.

2. The words you need#

Trading pair#

Every market is written as BASE-QUOTE, in capitals, joined by a hyphen: BTC-USDT, ETH-USDT.
Base (BTC) is the coin you are buying or selling.
Quote (USDT) is the money you pay with or receive.
Price always means "how much quote for one base". A BTC-USDT price of 60000 means one BTC costs 60,000 USDT.
So on BTC-USDT:
BUY means spend USDT and receive BTC.
SELL means spend BTC and receive USDT.

Order types#

TypeWhat you are sayingYou controlThe price field
MARKET"Fill me now, at whatever the best available price is"The quantity onlyMust be left out
LIMIT"Fill me only at my price or better. Wait if you have to"The price and the quantityRequired
A MARKET order almost always fills straight away, but you cannot know the exact price in advance. A LIMIT order gets you the price you asked for, but it may sit open for a long time and may never fill at all.
Sending a price on a MARKET order is rejected, not ignored. Leave the field out entirely.

Available balance and locked balance#

Your balance has two parts:
available is what you can spend right now.
locked is money that is already committed to an open order.
When you place an order, MinGlobal sets aside the funds it will need. This is called the reserve, and it moves money from available to locked. It is still your money. It is simply spoken for, so you cannot accidentally spend it twice.
Which coin gets reserved depends on the side:
SideReservesHow much
BUYThe quote coin (USDT)quantity x price, plus a buffer on MARKET orders
SELLThe base coin (BTC)quantity
The reservedAsset field on the order tells you which coin was set aside, and reservedAmount tells you how much. Trading fees are charged separately and are not part of the reserve, so leave a little headroom.

Wallets#

Your account has three separate wallets: SPOT, ASSET and FUTURE. Spot orders spend from the spot wallet only. If your money is sitting in the asset or futures wallet, you must move it in the web app first. The API deliberately cannot move funds between your own wallets.

3. How spot trading works, in API terms#

What happens when you place an order#

1.
You send POST /v1/orders.
2.
MinGlobal validates it: is the pair tradeable, is the price a valid increment, do you have enough money.
3.
MinGlobal reserves your funds. They move from available to locked.
4.
You get 201 Created back with an order object.
5.
Separately, the order is forwarded to the venue where it is actually matched against other traders.
6.
It fills completely, fills partly, sits waiting, or is refused.
Steps 4 and 5 are not the same moment. This is the single most important thing to understand about this API.

A 201 does not mean the market accepted your order#

201 Created only means "we took your order and set your money aside". The market may still refuse it a moment later, and a refusal is not an HTTP error. Your HTTP client will not raise an exception, and a naive if (response.ok) check will treat a rejected order as a success.
Always read the status field in the response body. Never decide based on the HTTP status code alone.

Order statuses#

statusWhat it meansWhat to do
PENDING_SUBMITWe accepted it and reserved your money. Not at the market yetWait, then poll
SUBMITTEDLive at the market, waiting to fillWait, then poll
FILLEDFully tradedDone
CANCELEDCancelled. Reserve releasedDone
EXPIREDExpired. Reserve releasedDone
REJECTEDRefused. Reserve releasedRead rejectReason and venueCode from GET /v1/orders/{id}
UNKNOWNThe market did not answer in time. Your money is still reservedPoll GET /v1/orders/{id}. Do not place the order again
UNKNOWN deserves real care. It does not mean the order failed. It means nobody knows yet, and a background process is working out the truth. If you re-send the order assuming it failed, you can end up with two live orders and double the exposure you intended.

How to track an order#

There is no WebSocket and no streaming for account data, so you poll. Call GET /v1/orders/{id} for one order, or GET /v1/orders?limit=50 for your recent orders, newest first.
Keep your own copy of order history. The list endpoint has no paging beyond limit, so you can never read further back than your most recent 200 orders.

4. How to make a spot trade, step by step#

The full sequence, with the exact call at each step. In this collection the signing headers are added for you.

Step 1. Find out what you can trade#

GET /v1/market/symbols
This returns every tradeable pair. Use this list, not the asset catalogue: /v1/deposit/assets lists coins you can hold, which is a different thing from pairs you can trade.

Step 2. Check the current price#

GET /v1/market/tickers                    # 24-hour summary of every pair
GET /v1/market/depth?symbol=BTC-USDT      # the actual offers waiting in the book
Look at the depth if you are planning a MARKET order. The best ask is roughly what you will pay to buy, and the best bid is roughly what you will receive if you sell. The gap between them is the spread, and on a thin market it can be wide.

Step 3. Check you have the money#

GET /v1/transfers/balances?asset=USDT
Read wallets.USDT.spot.available. That is what you can actually spend. Anything in locked is already committed to other orders.

Step 4. Work out what the order will cost#

LIMIT BUY: you need quantity x price of the quote coin. Buying 0.001 BTC at 60,000 USDT needs 60 USDT available.
LIMIT SELL: you need quantity of the base coin. Selling 0.001 BTC needs 0.001 BTC available.
MARKET BUY: the reserve includes a slippage buffer on top, because the final price is not known yet.
If you do not have enough, nothing is written at all and you get 409 INSUFFICIENT_BALANCE.

Step 5. Place the order#

POST /v1/orders
Content-Type: application/json
Idempotency-Key: <a fresh unique string>

{
  "symbol": "BTC-USDT",
  "side": "BUY",
  "type": "LIMIT",
  "quantity": "0.001",
  "price": "60000"
}
Every amount is a string, not a number. See 05. Data Formats and Conventions for why this matters.
The Idempotency-Key header is what makes retrying safe. If your network drops and you never see the response, you can send the identical request with the identical key and get the original result back rather than placing a second order.

Step 6. Read the status, not the HTTP code#

You get 201 Created. Now look inside:
{
  "id": "clw8n2k4x0003abcdefghij",
  "status": "SUBMITTED",
  "orderType": "LIMIT",
  "reservedAmount": "60",
  "reservedAsset": "USDT"
}
status: "SUBMITTED" means it is live. status: "REJECTED" means it was refused, even though the HTTP code was 201.
Note the naming difference: you send type, and you receive orderType. They are not the same field name. timeInForce comes back as "GTC" for LIMIT orders and null for MARKET orders, and price is null on MARKET orders.

Step 7. Watch it#

GET /v1/orders/{id}
Poll until status reaches a terminal value: FILLED, CANCELED, EXPIRED or REJECTED. filledQty shows how much has traded so far, and avgPrice shows the average price you actually got.

Step 8. Cancel if you change your mind#

DELETE /v1/orders/{id}
Idempotency-Key: <a fresh unique string>
A successful cancel returns the order with status: "CANCELED" and the reserve released.
A failed cancel is not a cancelled order, and it is not a failed order either. If this call returns 501, 409 or 503, nothing was released and no status was written. Your order is still whatever GET /v1/orders/{id} says it is a moment later. Re-read it rather than assuming. Never treat a failed cancel as a reason to place a replacement order.

Step 9. Confirm the result#

GET /v1/transfers/balances?asset=BTC
After a filled BUY, your BTC available has gone up and your USDT has gone down. The trade is complete.

5. Common mistakes, and what they look like#

MistakeWhat you seeFix
Treating 201 as "the trade worked"Silent losses. Rejected orders counted as successesBranch on the status field
Sending price with a MARKET order400 VALIDATION_ERRORLeave price out entirely for MARKET
Sending numbers instead of strings for moneyRounding errors, rejected valuesUse strings: "0.001", never 0.001
Comparing money with == on strings"1.5" and "1.50" look different but are equalCompare through a decimal type
Adding a field the schema does not knowThe whole request is rejectedThe body schema is strict. Send only documented fields
Filtering with ?symbol= on GET /v1/ordersYou get orders for every symbolThere is no symbol filter. Filter in your own code
Retrying by resending identical signed bytes401 REPLAYED_REQUESTSign again with a fresh timestamp
Money sitting in the wrong wallet409 INSUFFICIENT_BALANCE while the app shows a balanceSpot orders spend from the spot wallet. Move funds in the web app
Re-placing an order after UNKNOWN or a failed cancelTwo live orders, double the exposurePoll and find out the real state first
Modified at 2026-09-02 09:50:41
Previous
02. Authentication and Request Signing
Next
04. Futures Trading Explained
Built with