跳到主要内容

订单

下单、撤单、查询、列表。看自己的成交。

鉴权

本页所有接口都要求 JWT 或 API Key

Authorization: Bearer <JWT>

X-API-Key: <key>

下单

POST /spot/orders

请求体

{
"symbol": "DFUSDT",
"side": "buy",
"type": "limit",
"tif": "gtc",
"price": "0.5000",
"quantity": "100",
"quote_quantity": null
}
字段类型必填备注
symbolstringGET /spot/markets 里的 market id
sidestringbuysell
typestringlimitmarket
tifstringgtc(限价默认)/ ioc / post_only。市价单总是 IOC
pricestring / number仅限价必须是 tick_size 的倍数
quantitystring / number限价 + 市价卖base 数量,必须是 lot_size 的倍数
quote_quantitystring / number仅市价买要花的 quote 数量(USDT)。市价买用这个代替 quantity

TIF 语义

tif行为
gtcGood-Til-Canceled。剩余部分留在盘口,直到撤销或全成
iocImmediate-Or-Cancel。立刻成交能成的部分,剩余撤销。任何剩余意味着 status 变 canceledfilled_qty > 0 表示部分成交)
post_only仅限价。下单时如果会与对手盘交叉,直接拒绝 POST_ONLY_REJECT不发生任何成交。否则像 GTC 一样挂上

市价 BUY 约定(quote_quantity

市价买预先冻结 quote token(USDT)。你指定愿意花多少(quote_quantity),engine 沿着 ask 升序撮合,每档按 lot_size 取整。锁完后剩余的 quote 退还。

市价卖用 quantity(base / DF),跟限价卖一致。

自成交保护

如果你的新单会跟自己挂着的订单交叉,新单被拒 SELF_TRADE(DECLINE_TAKER 策略)。已挂的订单不动。

响应 — 200 OK

fills 数组同步返回本次请求中触发的成交(Binance 风格):

{
"id": "9f2a-...-uuid",
"symbol": "DFUSDT",
"side": "buy",
"type": "limit",
"tif": "gtc",
"price": "0.5",
"quantity": "100",
"quote_quantity": null,
"filled_qty": "30",
"avg_fill_price": "0.499",
"status": "partially_filled",
"reject_reason": null,
"created_at": 1778400000,
"updated_at": 1778400000,
"fills": [
{ "trade_id": "...", "price": "0.499", "quantity": "30", "fee": "0", "fee_token": "DF" }
]
}

fee_token调用者收到的 token(BUY → base,SELL → quote)。MVP fee=0,字段保留是为后续兼容。

状态

status含义
open挂在盘口(无成交)
partially_filled挂在盘口且 filled_qty > 0
filled完全成交 —— 终态
canceled用户撤单 / IOC 残量 / 市价残量 / 市场 delist —— 终态
rejectedengine 接受前校验失败(如自成交)—— 终态
expired(现货 MVP 暂不用此状态)

错误响应

HTTPerror何时
400MARKET_NOT_FOUNDINVALID_TICKINVALID_LOTBELOW_MIN_NOTIONALINSUFFICIENT_BALANCEPOST_ONLY_REJECTSELF_TRADEinvalid side/type/tifquote_quantity required for market buyquantity required for limit/market sell请求校验 / engine 预检
404MARKET_NOT_FOUNDsymbol 不在 spot_markets
409MARKET_HALTED市场处于 halted
410MARKET_DELISTED市场终态
503spot trading disabled(engine 未启动)/ ENGINE_BUSY(mpsc 满)/ ENGINE_RESTARTING(恢复中)临时
500DB_ERROR服务端故障

撤一单

DELETE /spot/orders/:id

:id 为订单 UUID。仅当订单 open / partially_filled 且属于调用者时撤销。返回被撤的订单。

响应 — 200 OK

字段同 GET /spot/orders/:idstatus = "canceled"

错误

HTTPerror
400invalid id(UUID 解析失败)
403FORBIDDEN(订单属于其他用户)
404ORDER_NOT_FOUND(已终态或不存在)

撤所有

DELETE /spot/orders?symbol=DFUSDT

撤销调用者所有 open / partially_filled 的订单,可选用 symbol 过滤到一个市场。已终态的静默跳过。

响应 — 200 OK

{ "canceled": [ { ...订单... }, { ...订单... } ] }

查单笔

GET /spot/orders/:id

返回调用者拥有的某个订单。不存在或属于他人 → 404 ORDER_NOT_FOUND

{
"id": "9f2a-...", "symbol": "DFUSDT", "side": "buy", "type": "limit", "tif": "gtc",
"price": "0.5", "quantity": "100", "quote_quantity": null,
"filled_qty": "100", "avg_fill_price": "0.499",
"status": "filled", "reject_reason": null,
"created_at": 1778400000, "updated_at": 1778400090
}

列订单

GET /spot/orders

Query 参数

参数类型默认备注
symbolstring(任意)过滤到某个市场
statusstring(任意)open / partially_filled / filled / canceled / rejected / expired
startnumber(unix 秒)(任意)created_at >= start
endnumber(unix 秒)(任意)created_at <= end
limitnumber501–200,服务端 clamp

响应 — 200 OK:订单数组,最新优先。

Tip:要看当前还在挂的单,用 GET /spot/orders?status=open(也可叠加 partially_filled);都是非终态。


我的成交(Fills)

调用者参与过的所有成交(无论 maker 还是 taker)。

GET /spot/trades/me

Query 参数

参数类型默认备注
symbolstring(任意)
start / endnumber(unix 秒)(任意)
limitnumber501–200

响应 — 200 OK

[
{
"trade_id": "...",
"symbol": "DFUSDT",
"side": "buy",
"price": "0.499",
"quantity": "30",
"fee": "0",
"fee_token": "DF",
"role": "taker",
"order_id": "9f2a-...",
"ts": 1778400090
}
]
字段备注
side调用者在该笔成交里的 side(BUY/SELL),不是全局 taker side
fee / fee_token调用者支付的手续费,以收到的 token 计
rolemakertaker
order_id调用者参与该笔成交的订单 id
tsUnix 秒

代码示例

端到端:下单 → 等成交 → 列出对应成交。

import requests, time

BASE = "https://api-sepolia.p99.world/api/v1"
JWT = "your_jwt_token"
H = {"Authorization": f"Bearer {JWT}", "Content-Type": "application/json"}

# 限价 GTC 买单
order = requests.post(f"{BASE}/spot/orders", headers=H, json={
"symbol": "DFUSDT", "side": "buy", "type": "limit", "tif": "gtc",
"price": "0.5", "quantity": "100"
}).json()
print(order["status"], order["filled_qty"], "/", order["quantity"])

# 轮询到终态
oid = order["id"]
while True:
o = requests.get(f"{BASE}/spot/orders/{oid}", headers=H).json()
if o["status"] in ("filled", "canceled", "rejected"):
break
time.sleep(1)

# 看自己的成交
fills = requests.get(f"{BASE}/spot/trades/me?symbol=DFUSDT&limit=10", headers=H).json()
for f in fills:
print(f" {f['role']:5} {f['side']:4} {f['quantity']:>8} @ {f['price']}")