订单端点¶
下限价单¶
身份验证: EIP-712 Order 签名
请求体¶
{
"owner_address": "0x...",
"side": "bid",
"amount": "1000",
"price": "1.085",
"order_type": "limit",
"from_address": "0x...",
"to_address": "0x...",
"order_id": "00000000-0000-4000-8000-000000000001",
"uuid_int": "6427948336465191935941739505432058208337171677044006212075520",
"signature": "0x...",
"expiration": 1713254400
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
owner_address | address | 是 | 订单所有者的钱包地址 |
side | string | 是 | bid 或 ask |
amount | string | 是 | 自然单位数量(基础代币侧) |
price | string | 是 | 自然单位价格(报价 / 基础) |
order_type | string | 是 | limit 或 market;不提供公共 IOC/FOK/post-only 策略 |
from_address | address | 是 | 市场基础代币的 ERC-20 地址 |
to_address | address | 是 | 市场报价代币的 ERC-20 地址(必须与 from_address 不同) |
order_id | UUID string | 是 | 人类可读的 UUID4 订单 ID |
uuid_int | decimal string | 是 | 与 order_id 绑定的组合 uint256 |
signature | hex string | 是 | EIP-712 Order 签名 |
expiration | integer | 是 | Unix 时间戳截止时间,必须满足 now < expiration <= now + 365 天 - 300 秒 |
fee_bps 可选(非负 uint48 整数,默认 0),以 feeBps 进入签名。请求模型接受 client_id,但不将其作为订单标识符或幂等键传递。数量与价格必须是规范十进制字符串,签名前请使用订单预览。请求也接受 order_type="market",但不提供 IOC/FOK/post-only 执行策略;当前公共能力请读取 GET /config。
from_address 与 to_address 用来标识市场,而不是直接表示“支出/接收”方向。对于 bid,您是用 to_address 买入 from_address;对于 ask,您是卖出 from_address 换取 to_address。这些地址请通过 GET /tokens 获取。
响应¶
预览订单¶
身份验证: 无。预览校验公共市场精度和最低输入金额,不预留流动性,也不检查余额、自成交或合规准入。
请求使用与 POST /orders 相同的字段,包括 order_id、uuid_int、expiration,但不传 signature、client_id。fee_bps 可选,默认 0。请求示例:
{
"owner_address": "0x...",
"side": "bid",
"amount": "1000.0",
"price": "1.085",
"order_type": "limit",
"from_address": "0x...",
"to_address": "0x...",
"order_id": "00000000-0000-4000-8000-000000000001",
"uuid_int": "6427948336465191935941739505432058208337171677044006212075520",
"expiration": 1800000000
}
响应¶
| 字段 | 说明 |
|---|---|
ok | 成功时为 true |
symbol、side | 解析后的市场与买卖方向 |
normalized_amount、normalized_price | 规范正十进制字符串;"1000.0" 变为 "1000" |
amount_step、price_step | 允许的数量/价格步长 |
rounding_mode | reject_extra_precision |
canonicalization_required | 提交的字符串表示是否需要变更 |
from_token、to_token、from_amount、to_amount、notional | 签名代币方向、raw 数量和展示名义金额 |
eip712_order、eip712_types | 应使用 GET /config 域签名的完整 Order 消息与类型 |
把规范化后的值和生成的签名提交到 POST /orders。允许预览 "1000.0",但不能把该未规范字符串直接用于下单。超出市场精度的非零小数位返回 422 / INVALID_PRECISION;其他非规范提交字符串返回 INVALID_DECIMAL_FORMAT,不会静默取整。预览业务错误使用顶层 {ok:false, detail, error_code, ...},下单则将相同业务详情包装在 detail 内。
原始整数金额和价格接口请参阅整数金额 API(v2)。
取消订单¶
身份验证: EIP-712 CancelOrder 签名
请求体¶
{
"owner_address": "0x...",
"order_id": "00000000-0000-4000-8000-000000000001",
"uuid_int": "6427948336465191935941739505432058208337171677044006212075520",
"signature": "0x..."
}
uuid_int 为必填,因为签名中的 CancelOrder.orderId 使用的是组合 uint256,而不是 UUID 字符串。
响应¶
说明¶
- 订单受取消冷却期限制,默认值为 5 分钟。
- 在冷却期内取消会返回
429。 - 如果遗失了
uuid_int,请先查询订单;订单状态响应中会返回该字段。
取消所有订单¶
身份验证: API Key 与 EIP-712 CancelAll 签名。
仍必须传入小写 owner_address 查询参数,且与 API Key 所有者及请求体所有者一致。
请求体¶
nonce 是该所有者下唯一的正 uint256 字符串;deadline 是签名有效期范围内未来的 Unix 秒数整数。使用 Sera 域签署 CancelAll(owner address, nonce uint256, deadline uint256),详见身份验证。服务器只消费一次 nonce,重放返回 409。请保存请求,响应不确定时先查询订单状态,再决定是否重新签署取消。 响应¶
total 统计成功接受的取消,包括已处于终态的订单。已派发取消仍需后续查询订单状态,以确认终态和余额释放。请检查 failed、skipped_cooldown,该响应不保证所有未结订单均已取消。 获取订单¶
身份验证: 需要 API Key
响应¶
{
"trade_id": "00000000-0000-4000-8000-000000000001",
"owner_address": "0x...",
"status": "pending",
"order_type": "limit",
"symbol": "EURC/USDC",
"side": "bid",
"base_symbol": "EURC",
"quote_symbol": "USDC",
"base_token": "0x...",
"quote_token": "0x...",
"price": "1.085",
"amount": "1000.0",
"remaining_amount": "600.0",
"filled_base_amount": "400.0",
"filled_quote_amount": "434.0",
"notional": "1085.0",
"remaining_notional": "651.0",
"from_token": "0x...",
"to_token": "0x...",
"from_amount": "1085000000",
"filled_amount": "434000000",
"to_amount": "1000000000",
"created_at": "2026-04-15T08:00:00+00:00",
"updated_at": "2026-04-15T08:01:00+00:00",
"expiration": "1713254400",
"error": null,
"error_code": null,
"uuid_int": "6427948336465191935941739505432058208337171677044006212075520",
"vl_batch_id": null,
"settlement_summary": {
"status": "settled",
"total_fill_count": 1,
"pending_fill_count": 0,
"settled_fill_count": 1,
"failed_fill_count": 0,
"reverted_fill_count": 0,
"latest_settlement_id": 42,
"latest_tx_hash": "0x...",
"latest_parent_status": "confirmed",
"latest_fill_settlement_status": "settled",
"latest_failed_fill_failure_reason": null
},
"settlement_economics": {
"perspective_order_id": "00000000-0000-4000-8000-000000000001",
"gross_debits": [
{
"token": "USDC",
"token_address": "0x...",
"amount": "434.0",
"amount_raw": "434000000"
}
],
"gross_credits": [
{
"token": "EURC",
"token_address": "0x...",
"amount": "400.0",
"amount_raw": "400000000"
}
],
"fees_paid": [],
"balance_debits": [
{
"token": "USDC",
"token_address": "0x...",
"amount": "434.0",
"amount_raw": "434000000"
}
],
"balance_credits": [
{
"token": "EURC",
"token_address": "0x...",
"amount": "400.0",
"amount_raw": "400000000"
}
]
}
}
响应说明¶
order_type对限价单及 VL 流程为limit,通过POST /swap创建的订单为swap。expiration存在时会以字符串形式回显签名中的订单截止时间。error_code是结构化的终态失败码;完整说明见下方错误码。未识别的内部失败会折叠为TRANSIENT_SETTLEMENT_FAILURE。vl_batch_id会在该订单属于虚拟流动性批次时出现。settlement_summary汇总该订单各笔成交的结算进度。latest_failed_fill_failure_reason是经过白名单筛选的合约 revert 名称(不在公开白名单内的值会返回null)。settlement_economics是所有者视角的资金变化摘要,完整字段见下方结算资金变化说明。- 正价差成交时,
filled_amount/filled_quote_amount不一定等于用户实际扣除的源代币总额。钱包或 Vault 资金变动展示应使用settlement_economics.balance_debits和settlement_economics.balance_credits。
外部订单状态包括:
pending:已提交、仍在挂单中或部分成交,订单仍可继续成交或被取消matched— 已全部撮合,结算结果仍未确定;通过结算证据判断成功或失败。符合条件的失败限价 taker 可能在恢复时重新回到pending,不能假定状态只会单向前进。settled:链上确认的最终成功状态failed:链上确认的 revert,或在广播前的失败 / 拒绝cancelled— 当前已从订单簿移除。用户主动撤单会阻止恢复;失败结算后的系统移除,对符合条件的限价 taker 可能可恢复。请结合当前订单及逐笔成交结算状态判断。
列出订单¶
trade_ids 最多接受 50 个 ID。offset 范围为 0–10000(成交列表同样适用)。查询超出支持的扫描窗口时返回 400,请按市场、状态或时间缩小范围。只有成功查询的 total 才表示完整筛选结果数。
身份验证: 需要 API Key
查询参数¶
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
owner_address | address | 必填 | 必须与已认证所有者匹配 |
limit | integer | 50 | 最大 500 |
offset | integer | 0 | 分页偏移量 |
status | string | 全部 | 筛选接受 pending、settled、cancelled、failed;当前传入 matched 返回 422。 |
type | string | 全部 | swap 或 limit |
symbol | string | 全部 | 规范化后的交易对精确匹配,例如 EURC/USDC;不是模糊搜索。 |
side | string | 全部 | bid 或 ask |
from_token | string | 全部 | 按解析后的输入代币地址筛选 |
to_token | string | 全部 | 按解析后的输出代币地址筛选 |
base_token | string | 全部 | 按基础代币地址筛选 |
quote_token | string | 全部 | 按报价代币地址筛选 |
base_currency | string | 全部 | 兼容旧参数名,实际按 base_symbol 过滤,例如 EURC |
quote_currency | string | 全部 | 兼容旧参数名,实际按 quote_symbol 过滤,例如 USDC |
trade_ids | string | 全部 | 逗号分隔的 trade ID 列表 |
search | string | 全部 | 跨交易字段的自由文本搜索 |
has_error | boolean | 全部 | true 时只返回有错误的交易 |
min_price / max_price | string | 全部 | 价格区间筛选 |
min_amount / max_amount | string | 全部 | 数量区间筛选 |
min_remaining_amount / max_remaining_amount | string | 全部 | 剩余数量区间筛选 |
min_filled_amount / max_filled_amount | string | 全部 | 已成交数量区间筛选 |
min_notional / max_notional | string | 全部 | 名义金额区间筛选 |
created_after / created_before | string | 全部 | ISO8601 或兼容时间戳的创建时间范围 |
updated_after / updated_before | string | 全部 | ISO8601 或兼容时间戳的更新时间范围 |
sort_by | string | created_at | 允许值见下文。 |
order | string | desc | 排序方向:asc 或 desc |
sort_by 接受 amount、created_at、filled_base_amount、filled_quote_amount、notional、price、remaining_amount、remaining_notional、status、symbol、trade_id、type、updated_at;order_type 是 type 的别名。非法值返回 422。
status、type、symbol、side、from_token、to_token、base_token、quote_token、base_currency、quote_currency 与 trade_ids 接受逗号分隔的多个值。同一字段内为“或”,不同筛选字段组合生效。symbol 转为大写后精确匹配,自由文本使用 search。
matched 仍是已撮合待结算订单的合法返回状态,只是当前订单列表筛选不接受它;GET /fills?order_status=matched 仍受支持。查询这类订单时可获取较宽范围的列表后检查返回状态,不要发送 status=matched。
筛选会在完整匹配交易集合上应用,再进行分页;因此 total 反映全部筛选后的匹配数量,可直接据此分页。
响应¶
trades 中每条记录的字段与查询单个订单的响应一致,包含 base_token / quote_token、完整的数量明细(remaining_amount、filled_base_amount、filled_quote_amount、notional、remaining_notional)、vl_batch_id、settlement_summary 和公开安全的 settlement_economics。total 反映过滤后的总数,而非当前页大小。
{
"trades": [
{
"trade_id": "00000000-0000-4000-8000-000000000001",
"owner_address": "0x...",
"status": "pending",
"order_type": "limit",
"symbol": "EURC/USDC",
"side": "bid",
"base_symbol": "EURC",
"quote_symbol": "USDC",
"base_token": "0x...",
"quote_token": "0x...",
"price": "1.085",
"amount": "1000.0",
"remaining_amount": "1000.0",
"filled_base_amount": "0",
"filled_quote_amount": "0",
"notional": "1085.0",
"remaining_notional": "1085.0",
"from_token": "0x...",
"to_token": "0x...",
"from_amount": "1085000000",
"filled_amount": "0",
"to_amount": "1000000000",
"created_at": "2026-04-15T08:00:00+00:00",
"updated_at": "2026-04-15T08:00:00+00:00",
"expiration": "1713254400",
"error": null,
"error_code": null,
"uuid_int": "6427948336465191935941739505432058208337171677044006212075520",
"vl_batch_id": null,
"settlement_summary": {
"status": "pending",
"total_fill_count": 0,
"pending_fill_count": 0,
"settled_fill_count": 0,
"failed_fill_count": 0,
"reverted_fill_count": 0,
"latest_settlement_id": null,
"latest_tx_hash": null,
"latest_parent_status": null,
"latest_fill_settlement_status": null,
"latest_failed_fill_failure_reason": null
},
"settlement_economics": {
"perspective_order_id": "00000000-0000-4000-8000-000000000001",
"gross_debits": [],
"gross_credits": [],
"fees_paid": [],
"balance_debits": [],
"balance_credits": []
}
}
],
"total": 1
}
提交 VL 批次¶
身份验证: 每个同组订单都需要 EIP-712 Order 签名
请求体¶
{
"orders": [
{
"owner_address": "0x...",
"side": "bid",
"amount": "100",
"price": "0.75",
"order_type": "limit",
"from_address": "0x...",
"to_address": "0x...",
"order_id": "00000000-0000-4000-8000-000000000010",
"uuid_int": "6427948336465191935942058520151046588146668590738473494773760",
"signature": "0x...",
"expiration": 1713254400
},
{
"owner_address": "0x...",
"side": "bid",
"amount": "100",
"price": "0.80",
"order_type": "limit",
"from_address": "0x...",
"to_address": "0x...",
"order_id": "00000000-0000-4000-8000-000000000011",
"uuid_int": "6427948336465191935942079787798979146800635051651437980286977",
"signature": "0x...",
"expiration": 1713254400
}
]
}
VL 校验规则¶
| 规则 | 说明 |
|---|---|
| 批次数量 | 2 到 50 笔订单(运行时通过 GET /config 的 limits.vl_batch 获取当前上限) |
| 同一所有者 | 所有同组订单必须共享同一个 owner_address |
| 同一支出代币 | 所有同组订单解析后的 fromToken 必须一致 |
| 唯一市场 | 拒绝完全重复的市场和正反向互逆市场 |
| 共享分组 | 所有 uuid_int 必须共享同一个 VL group_id |
| 连续腿序 | leg_id 必须按数组顺序为 0, 1, 2, ... |
每个兄弟订单都沿用 POST /orders 的同一套语义:from_address 是市场基础代币,to_address 是报价代币,并且 expiration 为必填。
响应¶
{
"order_ids": [
"00000000-0000-4000-8000-000000000010",
"00000000-0000-4000-8000-000000000011"
],
"amendments": [],
"cancelled": [],
"fills": [],
"vl_group": {
"primary_id": "00000000-0000-4000-8000-000000000010",
"max_budget": "80",
"budget_consumed": null,
"spent_token": "USDC",
"status": "pending"
}
}
order_ids 按提交顺序标识所有腿,不证明每条腿已挂单或已结算。替换订单前应逐腿核对订单与结算状态。
下单结果明细¶
批次响应还返回 amendments、cancelled、fills 和可为 null 的 vl_group。空数组只表示本次响应未携带相应结果;待确认时不能据此推断挂单数量。
| 字段 | 说明 |
|---|---|
amendments[] | order_id、original_amount、actual_amount、reason 和可选 quantity_semantics |
quantity_semantics | placement_total_quantity 表示下单总量,remaining_quantity 表示剩余量;必须按此值解释 actual_amount |
cancelled[] | 下单期间被移除腿的 order_id 和 reason |
fills[] | order_id、即时 trades[](quantity、price、可选 counterparty_order_id、ts)及 remaining |
vl_group | primary_id、max_budget、spent_token、status、budget_consumed |
vl_group.status | confirmed 表示预算消耗已知;pending 表示尚未确认,此时 budget_consumed 为 null |
不能把待确认预算当作零,也不能假定每条已签名腿都按原始数量挂单。旧响应可能省略 quantity_semantics 或 status,不能从字段缺失推断已确认。
取消 VL 批次¶
身份验证: EIP-712 CancelVLBatch 签名
请求体¶
{
"owner_address": "0x...",
"vl_batch_id": "00000000-0000-4000-8000-000000000010",
"signature": "0x..."
}
响应¶
status 为取消结果,通常为 ok。
查询单个订单的成交记录¶
身份验证: 需要 API Key
查询参数¶
| 参数 | 类型 | 默认值 |
|---|---|---|
limit | integer | 100 |
offset | integer | 0 |
响应¶
{
"items": [
{
"maker_order_id": "maker-order-id",
"taker_order_id": "taker-order-id",
"quantity": "100.0",
"price": "0.75",
"settlement_status": "pending",
"tx_hash": null,
"timestamp": "2026-04-15T08:00:00+00:00",
"failure_reason": null,
"settlement_economics": {
"perspective_order_id": "taker-order-id",
"gross_debits": [
{
"token": "USDC",
"token_address": "0x...",
"amount": "75.0",
"amount_raw": "75000000"
}
],
"gross_credits": [
{
"token": "EURC",
"token_address": "0x...",
"amount": "100",
"amount_raw": "100000000"
}
],
"fees_paid": [],
"balance_debits": [
{
"token": "USDC",
"token_address": "0x...",
"amount": "75.0",
"amount_raw": "75000000"
}
],
"balance_credits": [
{
"token": "EURC",
"token_address": "0x...",
"amount": "100",
"amount_raw": "100000000"
}
]
}
}
]
}
每笔成交的 settlement_status 取值:
pending:结算交易尚未广播(tx_hash为null)confirming:结算交易已广播并等待区块确认(tx_hash已填充,可在链上观察)settled:链上已最终确认成功failed:结算层级失败reverted:链上批量结算合约中的单腿 revert;父结算交易仍可能成功
failure_reason 出现时来自固定的合约 revert 名称白名单;不在该白名单内的取值会被改写为 null,确保字段形态为封闭集合。
成交级 settlement_economics 与订单级相同,都是公开安全的所有者视角。成交行可以包含 maker_order_id 与 taker_order_id 作为引用,但不会展开交易对手的签名订单、协议价差收入或交易对手转账拆分。tx_hash 可以公开,因为它是链上结算交易引用。
跨订单列出成交记录¶
身份验证: 需要 API Key
查询参数¶
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
owner_address | address | 必填 | 必须与已认证所有者匹配 |
order_status | string | 全部 | pending、matched、settled、cancelled、failed |
settlement_status | string | 全部 | pending、confirming、settled、failed、reverted |
limit | integer | 100 | 最大 500 |
offset | integer | 0 | 分页偏移量 |
响应¶
{
"items": [
{
"maker_order_id": "maker-order-id",
"taker_order_id": "taker-order-id",
"quantity": "100.0",
"price": "0.75",
"settlement_status": "pending",
"tx_hash": null,
"timestamp": "2026-04-15T08:00:00+00:00",
"failure_reason": null,
"settlement_economics": {
"perspective_order_id": "taker-order-id",
"gross_debits": [],
"gross_credits": [],
"fees_paid": [],
"balance_debits": [],
"balance_credits": []
}
}
]
}
结算资金变化与错误码¶
订单与成交的 settlement_economics 包含 perspective_order_id、gross_debits、gross_credits、balance_debits、balance_credits、fees_paid。代币金额项包含 token、token_address、展示金额 amount 和原始金额 amount_raw,费用项还包含 type。balance_debits / balance_credits 描述所有者可见的余额变动。上游提供 balance 项时,公共 API 会将 gross_debits / gross_credits 映射为相同变动以保持兼容;不能仅凭 gross 名称将其视为手续费前交易总额。fees_paid 列出明确展示的费用。不要将 gross 与 balance 数组相加,也不要从已调整的余额变动中再次扣除所列费用。
除原有额度/截止时间/滑点/临时失败码外,公共订单错误还包括 STP_BLOCKED、INSUFFICIENT_EQUITY、PAIR_INACTIVE、AMOUNT_BELOW_MIN、QUOTE_STALE、COMPLIANCE_BLOCKED、DUPLICATE_ORDER_ID、INVALID_PRECISION、INVALID_DECIMAL_FORMAT。提交业务错误使用 detail.error_code,已存订单的 error_code 描述订单结果。校验/鉴权错误也可能只有字符串 detail。这些结构不能与 Exact Output 或筛查混用。
VL 下单的每一腿只接受 order_type="limit"。独立订单支持 market 不代表 /orders/vl/batch 也接受它。
已存订单与提交错误码¶
error_code | 含义与处理 |
|---|---|
ALLOWANCE_INSUFFICIENT | allowance 不足或 permit 无效/过期;确认原请求不能执行后,重新授权或签 permit |
INTENT_DEADLINE_EXPIRED | 已签名截止时间过期;确认原请求结果后,使用新截止时间创建新订单 |
SLIPPAGE_EXCEEDED | 无法按已签名价格执行;核对原订单后再调整价格 |
NO_LIQUIDITY | 当前价格下无可执行深度;核对结果后减量或选择其他市场 |
QUOTE_STALE | 报价/计划或签名截止时间过期;确认前次不能执行后重新提交 |
AMOUNT_BELOW_MIN | 金额低于最低要求;提高金额 |
STP_BLOCKED | 会与自己的订单成交;取消原挂单或调整方向 |
INSUFFICIENT_EQUITY | 支出代币可用抵押品不足;充值或取消占用余额的订单 |
PAIR_INACTIVE | 市场未激活;使用 GET /markets 选择活跃市场 |
TRANSIENT_SETTLEMENT_FAILURE | 未映射或暂时性结算失败;保留原请求身份,查询后按重试规则处理 |
GET /orders/{order_id} 的 error_code 描述已存订单结果;提交拒绝使用 detail.error_code。error 是展示用错误文本,不应作为客户端分支依据。其余校验、合规及重复 ID 错误见上文。