API 概覽¶
Sera API 是一個 RESTful API,用於程式化存取 Sera 的交易和帳戶管理功能。
基礎 URL¶
內容類型¶
所有請求和回應使用 JSON:
身份驗證¶
API 支援兩種身份驗證方法:
| 方法 | 使用場景 | Header |
|---|---|---|
| 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 domain、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,不能把這兩個欄位作為所有錯誤的必填項。