跳转至

API 概述

Sera API 是一个 RESTful API,用于程序化访问 Sera 的交易和账户管理功能。

基础 URL

https://api.testnet.sera.cx/api/v1

内容类型

所有请求和响应使用 JSON:

Content-Type: application/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 体:

{
  "detail": "Human-readable error message"
}

多数处理器 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 重试

代码示例

import requests

# 公共端点
tokens = requests.get("https://api.testnet.sera.cx/api/v1/tokens").json()

# 鉴权端点
headers = {"Authorization": "Bearer sera_abc123:secret456"}
orders = requests.get(
    "https://api.testnet.sera.cx/api/v1/orders",
    params={"owner_address": "0x..."},
    headers=headers,
).json()
// 公共端点(无需鉴权)
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());
# 公共端点
curl https://api.testnet.sera.cx/api/v1/tokens

# 鉴权端点
curl -H "Authorization: Bearer sera_abc123:secret456" \
  "https://api.testnet.sera.cx/api/v1/orders?owner_address=0x..."

客户端处理说明

报价、下单等端点接入应用层公共限流;生产类环境要求启用其 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,不能把这两个字段作为所有错误的必填项。