API 概述¶
Sera API 是一个 RESTful API,用于程序化访问 Sera 的交易和账户管理功能。
基础 URL¶
内容类型¶
所有请求和响应使用 JSON:
身份验证¶
API 支持两种身份验证方式:
| 方式 | 用途 | 请求头 |
|---|---|---|
| API Key | 账户读取端点和交易构建辅助端点 | Authorization: Bearer {key}:{secret} |
| EIP-712 签名 | 交易写入、取消、提款和 API Key 管理 | 包含在请求体或查询参数中 |
详情请参阅身份验证。
频率限制¶
边缘代理/CDN 也可配置客户端限流,请以目标环境公布的限制为准。携带 API Key 的请求会在应用内按钱包地址限流:
| 分组 | 典型端点 | 限制 |
|---|---|---|
read | GET /orders、GET /balances、GET /fills | 10 req/s |
trade | POST /orders、POST /swap | 5 req/s |
cancel | POST /orders/cancel、POST /orders/cancel-all | 2 req/s |
transfer | 充值、授权、提现、转账与交易广播辅助端点 | 2 req/s |
quote | POST /swap/quote、POST /swap/quote/batch、Exact Output 报价 | 50 条报价/秒 |
接口访问范围¶
客户接口可供外部集成,调用时仍须满足各端点的 API Key、钱包签名或已签名交易要求。表中的“无”仅表示无需交易 API Key,不代表无限制访问;凭据校验仍须提供待校验的凭据。功能和访问入口以目标环境实际开放的范围为准。
运维探针供部署、负载均衡和监控使用,应通过受限的运维入口访问,不属于客户交易流程。文档记录这些路径不代表要求将其开放到公网。
端点¶
系统¶
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /health | 无 | 服务健康、executor_id 与签名就绪状态 |
| GET | /system/time | 无 | 服务器时间戳 |
| GET | /tokens | 无 | 代币注册表 |
| GET | /markets | 无 | 活跃市场元数据 |
| GET | /fx/rate | 无 | ISO 货币对的聚合汇率与 24 小时涨跌幅 |
| GET | /permit/metadata | API Key | EIP-2612 permit 域、nonce 与额度探测 |
| GET | /config | 无 | 公共链上与合约引导配置 |
| POST | /verify-signature | 无 | 验证 EIP-712 订单签名 |
交易¶
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| POST | /swap/quote | 无 | 获取兑换报价 |
| POST | /swap/quote/batch | 无 | 最多 50 条独立报价 |
| POST | /orders/preview | 无 | 规范数值与 EIP-712 Order 预览 |
| POST | /swap | EIP-712 | 执行已签名的兑换 |
| POST | /orders | EIP-712 | 下限价单 |
| POST | /orders/cancel | EIP-712 | 取消订单 |
| POST | /orders/cancel-all | API Key + EIP-712 | 取消所有未结订单 |
| POST | /orders/vl/batch | EIP-712 | 提交虚拟流动性批量订单 |
| POST | /orders/vl/cancel | EIP-712 | 取消虚拟流动性批次 |
账户¶
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /orders/{order_id} | API Key | 获取订单状态 |
| GET | /orders | API Key | 列出订单 |
| GET | /fills/{order_id} | API Key | 获取单笔订单成交明细 |
| GET | /fills | API Key | 获取账户范围成交明细 |
| GET | /balances | API Key | 获取账户余额 |
| POST | /balances/sync | API Key | 请求余额同步 |
| POST | /approve | API Key | 构建未签名的 ERC-20 approve(spender, amount) 交易 |
| POST | /deposit | API Key | 构建未签名的 depositFund 或 depositFundWithPermit 交易 |
| POST | /tx/send | API Key | 广播已签名的授权/存款交易 |
| POST | /withdraw | EIP-712;API Key 可选 | 获取提款联合签名 |
| POST | /withdraw/build | 用户及执行器签名;API Key 可选 | 构建未签名的提款交易 |
| POST | /withdraw/send | 已签名交易;API Key 可选 | 广播已签名的提款交易 |
| POST | /transfer | API Key | 构建未签名的 ERC-20 转账 |
| POST | /transfer/send | API Key | 广播已签名的转账 |
API Key 管理¶
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| POST | /api-keys | EIP-712 | 创建 API Key |
| GET | /api-keys | EIP-712 | 列出 API Key(带签名的查询参数) |
| POST | /api-keys/list | EIP-712 | 列出 API Key(带签名的 JSON 请求体) |
| DELETE | /api-keys | EIP-712 | 撤销 API Key(带签名的查询参数) |
| POST | /api-keys/revoke | EIP-712 | 撤销 API Key(带签名的 JSON 请求体) |
| POST | /api-keys/revoke-all | EIP-712 | 通过一次签名批量撤销该钱包下所有有效 API Key |
| POST | /api-keys/self-revoke | API Key | 用当前凭据撤销该 API Key 自身 |
| POST | /api-keys/verify | 请求体中的 Key/Secret | 校验请求体中的 API Key/Secret 对 |
其他 API 版本与服务¶
| 方法 | 完整路径 | 认证 | 参考 |
|---|---|---|---|
| POST | /api/v2/orders | EIP-712 | 整数金额 API |
| GET | /api/v2/orders/{order_id} | API Key | 整数金额 API |
| GET | /api/v2/orders | API Key | 整数金额 API |
| GET | /api/v2/fills/{order_id} | API Key | 整数金额 API |
| GET | /api/v2/fills | API Key | 整数金额 API |
| GET | /api/v2/balances | API Key | 整数金额 API |
| POST | /api/v2/balances/sync | API Key | 请求余额同步 |
| POST | /api/v1/swap/exact-output/quote | 无 | Exact Output |
| POST | /api/v1/swap/exact-output | EIP-712 | Exact Output |
| GET | /api/v1/swap/exact-output/{quote_uuid} | API Key | Exact Output |
| GET | /api/v1/swap/exact-output | API Key | Exact Output,使用 quote_uuid 查询参数 |
v1 与 v2 并存,v2 的金额、状态解释和分页方式不同,请使用以上完整版本路径。地址筛查 API 是独立服务,有自己的主机与响应契约。系统端点还介绍 GET /api/v1/livez、/api/v1/warmz、/api/v1/readyz、/api/v1/policy-readyz、/api/v1/traffic-readyz、/api/v1/screening/status。
运维探针¶
以下端点供运维使用。代码中未要求交易 API Key,部署入口应另行限制访问;不要将“无 API Key”理解为已具备公网访问保护。
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| GET | /livez | 无 | 进程存活 |
| GET | /warmz | 无 | 预热依赖状态 |
| GET | /readyz | 无 | 策略就绪兼容别名 |
| GET | /policy-readyz | 无 | 交易与筛查策略就绪 |
| GET | /traffic-readyz | 无 | 流量服务就绪 |
| GET | /screening/status | 无 | 筛查服务状态,不查询具体地址 |
错误响应¶
多数错误返回包含 detail 字段的 JSON 体:
多数处理器 5xx 故障返回 503、{"detail":"Service temporarily unavailable; please retry"} 和 Retry-After: 1。启动准入可能返回不同详情。结构化错误和安全重试请参阅下方客户端处理说明。
状态码¶
| 状态码 | 含义 |
|---|---|
| 200 | 成功 |
| 202 | 已接受;执行或余额同步待确认 |
| 201 | 资源已创建 |
| 400 | 请求无效(参数错误、签名不匹配) |
| 401 | 身份验证失败 |
| 403 | 禁止访问(访问其他用户的数据) |
| 404 | 资源未找到 |
| 409 | 冲突(重复签名、自成交拒绝等) |
| 410 | 已过期(报价过期、已消费或不存在) |
| 413 | 整个请求体超过部署上限 |
| 422 | 校验失败 |
| 429 | 触发限速或取消冷却 |
| 503 | 服务暂时不可用;请按 Retry-After 重试 |
代码示例¶
// 公共端点(无需鉴权)
const tokens = await fetch("https://api.testnet.sera.cx/api/v1/tokens")
.then(r => r.json());
// 鉴权端点(API key)
const orders = await fetch(
"https://api.testnet.sera.cx/api/v1/orders?owner_address=0x...",
{ headers: { "Authorization": "Bearer sera_abc123:secret456" } },
).then(r => r.json());
客户端处理说明¶
报价、下单等端点接入应用层公共限流;生产类环境要求启用其 429 拒绝行为。不能据此推断每条匿名端点都使用相同限额。批量报价每条消耗一个额度,不是每个 HTTP 请求只消耗一个。API Key 钱包限额仍适用。返回 X-RateLimit-Limit、X-RateLimit-Remaining、Retry-After 时请使用这些值。
多数处理器 5xx 会被替换为通用 503 和 Retry-After: 1。缓存预热期间,启动准入可能返回不同的 503 detail。X-Sera-Retry-Safe: true 明确标识部分准入前失败;没有该标记时,不能推断写入未生效。替换结果未知的执行前,先按订单/报价身份查询。
| 错误字段 | 示例 / 客户端处理 |
|---|---|
detail.error_code | INVALID_PRECISION、INVALID_DECIMAL_FORMAT:使用预览并签署规范值 |
detail.error_code | DUPLICATE_ORDER_ID:查询该 ID,仅为独立新订单生成新 ID |
detail.error_code | WITHDRAW_UNAVAILABLE:刷新余额和订单 |
detail.error_code | COMPLIANCE_BLOCKED:受保护操作被拒绝 |
detail.code | 报价特定错误,例如 AMOUNT_BELOW_MIN 和 Exact Output 冲突 |
顶层 error_code,同时 ok:false | 订单预览业务拒绝 |
error.code | 独立筛查服务的错误 |
不能假定 detail 总是字符串,也不能假定每个 422 都有 Pydantic 字段详情。请求模型错误使用 { "detail": "Invalid request" }。新增流程还使用 202(执行待确认)、304(市场响应未变化,无响应体)、406(编码不可接受)。未知错误码仍应视为失败,并保留请求 ID 供排查。
示例用于说明请求/响应结构。实际调用前请替换占位地址和历史时间戳,从 /config 读取当前链与合约信息,从 /system/time 读取当前秒数。文档列出某条路径,不代表每个部署都已启用该功能。
请求体大小¶
交易 API 对整个请求体默认限制 64 KiB(65,536 字节),以目标部署设置为准;流式请求也受此限制。批量条数和单个签名长度满足要求,不代表合计大小符合要求。超限返回 HTTP 413、{"detail":"Request body too large"};应缩小请求,不要原样反复重试。筛查服务有独立的请求体与错误规则,其协议错误及 429 不一定带 schema_version、error.retryable,不能把这两个字段作为所有错误的必填项。