跳到正文
火眼

OPEN API · V1

把行情、體檢與信號接入你的系統

這裡記錄目前程式碼已實作的介面:API Key 與工作階段認證、統一錯誤、分頁與限流、單幣資料、Webhook 簽名投遞,以及 Centrifugo 即時訂閱。

端點、參數與欄位表在建置時讀取儲存庫內的 packages/api-client/openapi.json,並對照平台路由核對認證與業務邊界。頁面靜態產生,不請求線上服務,也不代表任何外部網域已通過驗收。

快速開始

先建立一組只含所需 scope 的 API Key,再在受信任的伺服器端或本地量化程式中設定環境變數。不要把 Key 寫進原始碼、瀏覽器頁面、日誌或 WS URL。

  1. 將 API_BASE 設為實際部署的 API 根位址,不含末尾斜線;本頁不替你假定線上位址。
  2. 把 FF_API_KEY 放入安全的環境變數或密鑰管理器;把 ACCEPT_LANGUAGE 設為 zh-CN、zh-TW 或 en。
  3. 呼叫一個最小唯讀端點,檢查 HTTP 狀態、problem+json 錯誤與 RateLimit 回應標頭,再擴大整合範圍。
curl
curl --fail-with-body "${API_BASE}/v1/public/coins/BTCUSDT" \
  -H "Authorization: Bearer ${FF_API_KEY}" \
  -H "Accept-Language: ${ACCEPT_LANGUAGE}"

範例回應只說明 JSON 結構,不是即時行情、成績或收益聲明。生產可用性請以你自己的部署與健康檢查為準。

認證與 API Key scope

開放介面使用 Authorization: Bearer <API-Key>。Key 格式前綴為 ffk_live_ 或 ffk_test_,建立明文只顯示一次,平台只保存雜湊與前綴。量化版權限 api.enabled 會在每次認證時重新檢查。

可以為 Key 設定 CIDR IP 白名單。請按最小權限分配 scope、分開保存不同環境的 Key,並在洩露或不再使用時撤銷。匿名端點不需要也不應附帶 Key。

API Key 作用域
scope允許的操作
read:market公開幣種狀態、榜單、校準,以及市場即時頻道令牌。
read:checkup讀取目前 Key 所屬使用者自己的體檢檔案;不讀取其他使用者報告。
read:signals官方信號列表與 sig:{stream_code} 即時頻道。
webhooks:manage建立、列出、撤銷 Webhook 端點並讀取投遞記錄。
export:data市場狀態與信號 CSV 匯出;所屬使用者還必須有 data.export=full。

偽造、過期、撤銷或 IP 越界回傳 401/403;scope 不足回傳 403 FORBIDDEN;目前方案不再允許 API 時回傳 402 ENT_FEATURE_LOCKED。建立、列表與撤銷 Key 的 /v1/me/api-keys 使用使用者工作階段,不使用另一把 API Key。

Cookie 工作階段、CSRF 與冪等

瀏覽器 Cookie 工作階段的寫請求採用雙提交驗證:X-CSRF-Token 必須與 ff_csrf Cookie 一致。先取得 CSRF,再在建立 API Key 等工作階段寫介面中發送;登入後令牌會輪換,應使用最新值。

curl
curl --cookie-jar cookies.txt "${API_BASE}/v1/auth/csrf"

curl --request POST "${API_BASE}/v1/me/api-keys" \
  --cookie cookies.txt --cookie-jar cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: ${CSRF_TOKEN}" \
  --data '{"name":"local-bot","scopes":["read:market"],"ip_allowlist":[]}'

範例中的 cookies.txt 與 CSRF_TOKEN 都是本地佔位。帶 Authorization 的 API Key 請求一般不驗證 CSRF;Cookie 重新整理令牌流程是文件所述的例外,不能把例外推廣到所有 Bearer 請求。

冪等寫請求

訂單、支付、訂閱變更、提現等指定寫介面要求用戶端產生 UUID 作為 Idempotency-Key。同一 scope 與 Key 保留 24 小時:相同請求重放回傳首次回應,不要把冪等鍵複用到不同請求本文。

HTTP
Idempotency-Key: ${IDEMPOTENCY_KEY}

同鍵不同請求回傳 422 IDEMPOTENCY_KEY_REUSED;首次請求仍在處理時回傳 409 IDEMPOTENCY_IN_PROGRESS。只有明確要求冪等鍵的端點才需要發送,不要把所有唯讀請求都包裝成寫操作。

REST 錯誤:application/problem+json

成功回應直接回傳資源或列表,不包 {code,data} 外殼。錯誤遵循 RFC 9457,用戶端應同時檢查 HTTP 狀態與穩定 code;title 和 detail 可按 Accept-Language 本地化,不應作為程式分支依據。

JSON
{
  "type": "<api-base>/errors/RATE_LIMITED",
  "title": "<localized-title>",
  "status": 429,
  "code": "RATE_LIMITED",
  "detail": "<localized-detail>",
  "instance": "/v1/public/coins/BTCUSDT",
  "request_id": "<request-id>",
  "meta": { "bucket": "api_key" }
}
常見錯誤碼
錯誤碼HTTP含義與處理
AUTH_UNAUTHENTICATED401未認證、Key 無效或已撤銷;檢查憑證,不要無限重試。
FORBIDDEN403scope、IP 或資源權限不足;調整授權而不是更換請求重試。
ENT_FEATURE_LOCKED / ENT_QUOTA_EXCEEDED402目前權益未開放或配額已用完;讀取 meta 中的權益或重設資訊。
NOT_FOUND / MARKET_COIN_NOT_FOUND404資源或幣種不存在;核對路徑參數與符號。
VALIDATION_FAILED422參數、請求本文、游標或時間窗不合法;按 meta.errors 修正。
IDEMPOTENCY_IN_PROGRESS409同一冪等請求仍在處理;稍後查詢或按原鍵重試。
RATE_LIMITED429觸發限流;遵守 Retry-After,並降低並發或請求頻率。
DEPENDENCY_UNAVAILABLE503依賴暫不可用;採用有界退避重試,不偽造成功資料。

422 VALIDATION_FAILED 的 meta.errors 是 [{field,code,message}] 陣列。request_id 用於支援排查;錯誤不會故意回顯 SQL、堆疊、第三方原始回應或密鑰。

限流、分頁、時間與金額

限流

API Key REST 請求按 Key 使用 api.rate_per_min 的 60 秒令牌桶,換 IP 不會換桶。匿名公開端點使用各自 IP 桶,具體上限可以不同。已扣額請求無論成功或業務失敗都可能回傳 RateLimit-Limit、RateLimit-Remaining、RateLimit-Reset;429 另帶 Retry-After。

RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Retry-After

游標分頁

一般列表 limit 預設 20、最大 100,next_cursor 非空時原樣作為下一次 cursor;游標是不透明字串,不要解碼或自行構造。榜單與預測等端點使用規範中各自的上限,短列表和 CSV 不一定分頁。

JSON
{
  "items": [],
  "next_cursor": "<opaque-cursor-or-null>"
}

時間、金額與數值

時間輸入輸出使用 ISO 8601 UTC,輸出帶 Z;CSV 時間窗為 [from,to),最長 31 天。JSON 欄位使用 snake_case,空值保持 null,不把缺資料補成 0。

數值表示約定
資料類別規則
平台帳本金額Decimal 字串,例如 39.000000;不要用二進位浮點參與金額計算。
交易價格與名目價值交易相關金額和價格使用字串;純展示行情欄位可按 schema 使用 number。
_pct / _ratio / _score分別表示百分數、小數比例和分數;12.5 的 _pct 表示 12.5%,分數不是機率。
時間ISO 8601 UTC,例如 2026-10-28T00:00:00Z;業務日界為 UTC 00:00。

單幣體檢

匿名快檢回傳六個欄位,不登入、不扣全檢次數、不寫檔案。它可能有獨立 IP 限流;sentence 按請求語言產生。

GET

/v1/public/checkup/symbols/{symbol}

operationId
checkup_public_symbol_get
認證
匿名;可有獨立 IP 限流
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/checkup/symbols/{symbol}
欄位位置類型是否必填約束說明
symbolpathstring必填—引擎規範幣種符號,例如 BTCUSDT。

回應欄位

介面欄位表: GET /v1/public/checkup/symbols/{symbol}
欄位類型是否必填約束說明
as_ofstring必填—這份資料實際可見的截止時間;可能為 null。
gradestring必填—體檢等級 A–E,不由用戶端換算。
sentencestring必填—按請求語言產生的一句體檢摘要。
stagestring必填—引擎生命週期階段代碼。
staleboolean必填—資料是否不是最新;true 時應明確展示。
symbolstring必填—引擎規範幣種符號,例如 BTCUSDT。
curl
curl --fail-with-body "${API_BASE}/v1/public/checkup/symbols/BTCUSDT" \
  -H "Accept-Language: ${ACCEPT_LANGUAGE}"
JSON
{
  "symbol": "BTCUSDT",
  "grade": "B",
  "stage": "accumulation",
  "sentence": "<localized-summary>",
  "stale": false,
  "as_of": "2026-10-28T00:00:00Z"
}

以上 JSON 是結構範例,不代表 BTC 目前等級或階段。用戶端應使用實際回應的 as_of 與 stale 展示資料新鮮度。

體檢檔案與全檢

帶 read:checkup 的 Key 只能存取所屬使用者的報告:按 report_id 讀取檔案;GET /v1/public/checkups/{symbol}/latest 讀取該幣最新檔案;GET /v1/public/checkups/{symbol}?depth=full 執行全檢。pro=true 請求專業欄位;可見性仍由後端權益與內容決定,locked、sections 和 pro 不會被前端解鎖。

GET

/v1/public/checkup/reports/{report_id}

operationId
checkup_public_report_get
認證
Bearer API Key · read:checkup
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/checkup/reports/{report_id}
欄位位置類型是否必填約束說明
report_idpathstring必填uuid報告 UUID;開放檔案端點還會校驗所屬使用者。
proqueryboolean可選default=false是否請求專業模式欄位,預設 false。

回應欄位

介面欄位表: GET /v1/public/checkup/reports/{report_id}
欄位類型是否必填約束說明
anomaly_countinteger必填—報告或區塊中的異常項數量。
as_ofstring可選 · 可空date-time這份資料實際可見的截止時間;可能為 null。
cycle_atstring可選 · 可空date-time產生這份資料的引擎週期時間。
depthstring必填quick | full體檢深度:quick 或 full。
formula_versionstring必填—產生報告所使用的公式版本。
gradestring必填—體檢等級 A–E,不由用戶端換算。
lockedboolean必填—目前報告是否受權益鎖定。
long_riskinteger必填—做多風險分,不是機率。
metaobject必填—端點定義的附加中繼資料物件。
proProOut可選 · 可空—是否請求專業模式欄位,預設 false。
report_idstring可選 · 可空uuid報告 UUID;開放檔案端點還會校驗所屬使用者。
sectionsarray<SectionOut>必填—體檢報告區塊列表;每項含 ready、empty 或 locked 狀態。
short_riskinteger必填—做空風險分,不是機率。
sourcestring必填market | gateway資料來源或 CSV 記錄粒度。
stagestring必填—引擎生命週期階段代碼。
staleboolean必填—資料是否不是最新;true 時應明確展示。
symbolstring必填—引擎規範幣種符號,例如 BTCUSDT。
curl
curl --fail-with-body "${API_BASE}/v1/public/checkup/reports/${REPORT_ID}?pro=false" \
  -H "Authorization: Bearer ${FF_API_KEY}" \
  -H "Accept-Language: ${ACCEPT_LANGUAGE}"
GET

/v1/public/checkups/{symbol}/latest

operationId
checkup_public_symbol_latest
認證
Bearer API Key · read:checkup
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/checkups/{symbol}/latest
欄位位置類型是否必填約束說明
symbolpathstring必填—引擎規範幣種符號,例如 BTCUSDT。
proqueryboolean可選default=false是否請求專業模式欄位,預設 false。

回應欄位

介面欄位表: GET /v1/public/checkups/{symbol}/latest
欄位類型是否必填約束說明
anomaly_countinteger必填—報告或區塊中的異常項數量。
as_ofstring可選 · 可空date-time這份資料實際可見的截止時間;可能為 null。
cycle_atstring可選 · 可空date-time產生這份資料的引擎週期時間。
depthstring必填quick | full體檢深度:quick 或 full。
formula_versionstring必填—產生報告所使用的公式版本。
gradestring必填—體檢等級 A–E,不由用戶端換算。
lockedboolean必填—目前報告是否受權益鎖定。
long_riskinteger必填—做多風險分,不是機率。
metaobject必填—端點定義的附加中繼資料物件。
proProOut可選 · 可空—是否請求專業模式欄位,預設 false。
report_idstring可選 · 可空uuid報告 UUID;開放檔案端點還會校驗所屬使用者。
sectionsarray<SectionOut>必填—體檢報告區塊列表;每項含 ready、empty 或 locked 狀態。
short_riskinteger必填—做空風險分,不是機率。
sourcestring必填market | gateway資料來源或 CSV 記錄粒度。
stagestring必填—引擎生命週期階段代碼。
staleboolean必填—資料是否不是最新;true 時應明確展示。
symbolstring必填—引擎規範幣種符號,例如 BTCUSDT。
GET

/v1/public/checkups/{symbol}

operationId
checkup_public_symbol_full
認證
Bearer API Key · read:checkup
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/checkups/{symbol}
欄位位置類型是否必填約束說明
symbolpathstring必填—引擎規範幣種符號,例如 BTCUSDT。
depthquerystring可選default="full" · ^full$體檢深度:quick 或 full。
proqueryboolean可選default=false是否請求專業模式欄位,預設 false。

回應欄位

介面欄位表: GET /v1/public/checkups/{symbol}
欄位類型是否必填約束說明
anomaly_countinteger必填—報告或區塊中的異常項數量。
as_ofstring可選 · 可空date-time這份資料實際可見的截止時間;可能為 null。
cycle_atstring可選 · 可空date-time產生這份資料的引擎週期時間。
depthstring必填quick | full體檢深度:quick 或 full。
formula_versionstring必填—產生報告所使用的公式版本。
gradestring必填—體檢等級 A–E,不由用戶端換算。
lockedboolean必填—目前報告是否受權益鎖定。
long_riskinteger必填—做多風險分,不是機率。
metaobject必填—端點定義的附加中繼資料物件。
proProOut可選 · 可空—是否請求專業模式欄位,預設 false。
report_idstring可選 · 可空uuid報告 UUID;開放檔案端點還會校驗所屬使用者。
sectionsarray<SectionOut>必填—體檢報告區塊列表;每項含 ready、empty 或 locked 狀態。
short_riskinteger必填—做空風險分,不是機率。
sourcestring必填market | gateway資料來源或 CSV 記錄粒度。
stagestring必填—引擎生命週期階段代碼。
staleboolean必填—資料是否不是最新;true 時應明確展示。
symbolstring必填—引擎規範幣種符號,例如 BTCUSDT。
curl
curl --fail-with-body "${API_BASE}/v1/public/checkups/BTCUSDT?depth=full&pro=false" \
  -H "Authorization: Bearer ${FF_API_KEY}" \
  -H "Accept-Language: ${ACCEPT_LANGUAGE}"

單幣預測鏡像

匿名與工作階段預測鏡像位於 /v1/coins/{symbol}/predictions;API Key 開放預測位於 /v1/public/coins/{symbol}/predictions,要求 read:market。兩者 limit 預設 50、最大 200,並按各自訪問者權益套用延遲;next_cursor 非空時原樣傳回 cursor。

GET

/v1/coins/{symbol}/predictions

operationId
coin_predictions_v1_coins__symbol__predictions_get
認證
匿名;可有獨立 IP 限流
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/coins/{symbol}/predictions
欄位位置類型是否必填約束說明
symbolpathstring必填—引擎規範幣種符號,例如 BTCUSDT。
limitqueryinteger可選default=50 · 1..200本頁最大條數;預設值與上限見約束列。
cursorquerystring可選 · 可空length 0..512上一頁回應回傳的不透明游標。

回應欄位

介面欄位表: GET /v1/coins/{symbol}/predictions
欄位類型是否必填約束說明
as_ofstring可選 · 可空date-time這份資料實際可見的截止時間;可能為 null。
delayed_minutesinteger可選default=0目前視圖相對即時資料延遲的分鐘數。
itemsarray<PredictionOut>必填—目前頁資源陣列;元素類型見類型列。
next_cursorstring可選 · 可空—下一頁游標;null 表示沒有下一頁。
curl
curl --fail-with-body "${API_BASE}/v1/coins/BTCUSDT/predictions?limit=50"
GET

/v1/public/coins/{symbol}/predictions

operationId
market_public_coin_predictions
認證
Bearer API Key · read:market
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/coins/{symbol}/predictions
欄位位置類型是否必填約束說明
symbolpathstring必填—引擎規範幣種符號,例如 BTCUSDT。
limitqueryinteger可選default=50 · 1..200本頁最大條數;預設值與上限見約束列。
cursorquerystring可選 · 可空length 0..512上一頁回應回傳的不透明游標。

回應欄位

介面欄位表: GET /v1/public/coins/{symbol}/predictions
欄位類型是否必填約束說明
as_ofstring可選 · 可空date-time這份資料實際可見的截止時間;可能為 null。
delayed_minutesinteger可選default=0目前視圖相對即時資料延遲的分鐘數。
itemsarray<PredictionOut>必填—目前頁資源陣列;元素類型見類型列。
next_cursorstring可選 · 可空—下一頁游標;null 表示沒有下一頁。
curl
curl --fail-with-body "${API_BASE}/v1/public/coins/BTCUSDT/predictions?limit=50" \
  -H "Authorization: Bearer ${FF_API_KEY}"
JSON
{
  "items": [
    {
      "prediction_id": "<prediction-id>",
      "symbol": "BTCUSDT",
      "type": "near_edge",
      "direction": "long",
      "status": "open",
      "target_lo": 100.0,
      "target_hi": 120.0,
      "invalid_price": 90.0,
      "resolve_price": null,
      "opened_at": "2026-10-28T00:00:00Z",
      "deadline": "2026-10-29T00:00:00Z",
      "resolved_at": null,
      "era": "5"
    }
  ],
  "next_cursor": null,
  "as_of": null,
  "delayed_minutes": 15
}

預測 items[] 欄位

介面欄位表: 預測 items[] 欄位
欄位類型是否必填約束說明
prediction_idstring必填—引擎預測鏡像的穩定標識。
symbolstring必填—引擎規範幣種符號,例如 BTCUSDT。
typestring必填near_edge | ignition | rally_target | dump_bottom | dump_risk榜單或預測類型,具體含義取決於端點。
directionstring必填 · 可空—預測方向。
statusstring必填open | hit | failed | expired | corrupt資源目前狀態。
target_lonumber必填 · 可空—目標區間下界;未提供時為 null。
target_hinumber必填 · 可空—目標區間上界;未提供時為 null。
invalid_pricenumber必填 · 可空—預測失效價格;未提供時為 null。
resolve_pricenumber必填 · 可空—預測結算價格;未結算時為 null。
opened_atstring必填 · 可空ISO 8601 UTC預測建立時間。
deadlinestring必填 · 可空ISO 8601 UTC預測截止時間。
resolved_atstring必填 · 可空ISO 8601 UTC預測進入終態的時間;未結算時為 null。
erastring必填—產生預測的引擎紀元。

items 的元素類型以回應卡片中的 OpenAPI 為準;上表欄位按平台 market service 的實際序列化核對。預測狀態包括 open、hit、failed、expired、corrupt;空目標或結果保持 null。這裡是預測鏡像,不是收益承諾。

行情、信號、存證與 CSV

以下卡片直接展開真實 OpenAPI 契約。公開路徑中的 public 不等於匿名:請逐端點檢查認證行。狀態物件 state、venues、meta 等自由物件的內部鍵未由規範固定時,頁面不會另造欄位表。

GET

/v1/public/coins/{symbol}

operationId
market_public_coin_get
認證
Bearer API Key · read:market
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/coins/{symbol}
欄位位置類型是否必填約束說明
symbolpathstring必填—引擎規範幣種符號,例如 BTCUSDT。

回應欄位

介面欄位表: GET /v1/public/coins/{symbol}
欄位類型是否必填約束說明
as_ofstring可選 · 可空—這份資料實際可見的截止時間;可能為 null。
base_assetstring必填—基礎資產代碼。
delayed_minutesinteger可選default=0目前視圖相對即時資料延遲的分鐘數。
delistedboolean必填—該幣種是否已經下架。
display_namestring必填—用於展示的幣種名稱。
first_seen_atstring可選 · 可空—平台首次觀察到該幣的時間。
last_seen_atstring可選 · 可空—平台最近觀察到該幣的時間。
listing_datestring可選 · 可空—上架日期;未知時為 null。
prefix_multiplierinteger可選 · 可空—符號前綴對應的名目乘數;沒有時為 null。
primary_venuestring必填—目前主要資料交易所。
quote_assetstring可選 · 可空—計價資產代碼;未知時為 null。
stateobject可選 · 可空—最新或延遲後的幣種狀態物件,內部欄位未由目前 schema 固定。
symbolstring必填—引擎規範幣種符號,例如 BTCUSDT。
venuesarray<object>可選—交易所覆蓋資訊物件陣列。
GET

/v1/public/radar/lists

operationId
market_public_radar_lists
認證
Bearer API Key · read:market
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/radar/lists
欄位位置類型是否必填約束說明
typequerystring必填—榜單或預測類型,具體含義取決於端點。
limitqueryinteger可選default=50 · 1..200本頁最大條數;預設值與上限見約束列。

回應欄位

介面欄位表: GET /v1/public/radar/lists
欄位類型是否必填約束說明
as_ofstring可選 · 可空—這份資料實際可見的截止時間;可能為 null。
delayed_minutesinteger可選default=0目前視圖相對即時資料延遲的分鐘數。
itemsarray<object>必填—目前頁資源陣列;元素類型見類型列。
typestring必填—榜單或預測類型,具體含義取決於端點。
GET

/v1/public/calibration

operationId
market_public_calibration
認證
Bearer API Key · read:market
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/calibration
欄位位置類型是否必填約束說明
typequerystring可選 · 可空—榜單或預測類型,具體含義取決於端點。

回應欄位

介面欄位表: GET /v1/public/calibration
欄位類型是否必填約束說明
itemsarray<CalibrationItemOut>必填—目前頁資源陣列;元素類型見類型列。
GET

/v1/public/signals

operationId
signals_public_list
認證
Bearer API Key · read:signals
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/signals
欄位位置類型是否必填約束說明
statusquerystring可選 · 可空open | closed資源目前狀態。
symbolquerystring可選 · 可空length 0..64引擎規範幣種符號,例如 BTCUSDT。
limitqueryinteger可選default=20 · 1..100本頁最大條數;預設值與上限見約束列。
cursorquerystring可選 · 可空length 0..512上一頁回應回傳的不透明游標。

回應欄位

介面欄位表: GET /v1/public/signals
欄位類型是否必填約束說明
itemsarray<SignalItem>必填—目前頁資源陣列;元素類型見類型列。
next_cursorstring可選 · 可空—下一頁游標;null 表示沒有下一頁。
GET

/v1/public/signals/{stream}

operationId
signals_public_stream_list
認證
Bearer API Key · read:signals
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/signals/{stream}
欄位位置類型是否必填約束說明
streampathstring必填length 1..32官方信號流 stream_code。
statusquerystring可選 · 可空open | closed資源目前狀態。
symbolquerystring可選 · 可空length 0..64引擎規範幣種符號,例如 BTCUSDT。
limitqueryinteger可選default=20 · 1..100本頁最大條數;預設值與上限見約束列。
cursorquerystring可選 · 可空length 0..512上一頁回應回傳的不透明游標。

回應欄位

介面欄位表: GET /v1/public/signals/{stream}
欄位類型是否必填約束說明
itemsarray<SignalItem>必填—目前頁資源陣列;元素類型見類型列。
next_cursorstring可選 · 可空—下一頁游標;null 表示沒有下一頁。
POST

/v1/public/proofs/verify

operationId
signals_public_proofs_verify
認證
匿名;可有獨立 IP 限流
成功回應
200 · application/json

請求本文欄位

介面欄位表: POST /v1/public/proofs/verify
欄位類型是否必填約束說明
daystring可選 · 可空date存證批次的 UTC 日期。
leaf_hashstring可選 · 可空length 64..64 · ^[0-9a-f]{64}$待驗證的 64 位小寫十六進位葉子雜湊。
signal_idstring可選 · 可空uuid待驗證的信號 UUID。

回應欄位

介面欄位表: POST /v1/public/proofs/verify
欄位類型是否必填約束說明
daystring可選 · 可空—存證批次的 UTC 日期。
foundboolean必填—是否找到對應存證項。
item_idstring可選 · 可空—存證項標識。
item_typestring可選 · 可空—存證項類型。
leaf_hashstring可選 · 可空—待驗證的 64 位小寫十六進位葉子雜湊。
leaf_matches_currentboolean可選 · 可空—提供的葉子是否與目前記錄一致。
matches_rootboolean可選 · 可空—葉子與路徑是否能計算到批次根。
otsobject可選 · 可空—OpenTimestamps 狀態物件;未完成或不可用時可為 null。
patharray<object>可選 · 可空—Merkle 驗證路徑。
rootstring可選 · 可空—該 UTC 日批次的 Merkle 根。

歷史狀態與信號 CSV 匯出

兩個 CSV 端點都要求 export:data 和 data.export=full,窗口最長 31 天、單檔最多 100,000 筆資料列;超出時回傳 422,而不是靜默截斷。回應為 text/csv、private, no-store,適合串流保存。

GET

/v1/public/market/export/states.csv

operationId
market_public_states_csv_export
認證
Bearer API Key · export:data,另需 data.export=full
成功回應
200 · text/csv

請求參數

介面欄位表: GET /v1/public/market/export/states.csv
欄位位置類型是否必填約束說明
symbolquerystring必填length 1..64引擎規範幣種符號,例如 BTCUSDT。
fromquerystring可選 · 可空length 0..64時間窗起點(含),ISO 8601 UTC。
toquerystring可選 · 可空length 0..64時間窗終點(不含),ISO 8601 UTC。
curl
curl --fail-with-body --get "${API_BASE}/v1/public/market/export/states.csv" \
  -H "Authorization: Bearer ${FF_API_KEY}" \
  --data-urlencode "symbol=BTCUSDT" \
  --data-urlencode "from=2026-10-01T00:00:00Z" \
  --data-urlencode "to=2026-10-28T00:00:00Z" \
  --output market-states.csv

symbol, recorded_at, source, hour_at, stage, raw_stage, cluster, dump_score, ev_score, p_rally_ratio, chg24_pct, last_price, vol24_quote, vol_z, dist_ath_pct, funding_bps, oi_chg_24h_pct, impact_pct, level, delisted, primary_venue, summary_plain, low_revisit

以上是從後端 STATE_COLUMNS 核對的市場 CSV 表頭順序。嵌套物件以緊湊 JSON 放在儲存格中;文字公式前綴會被轉義。空儲存格表示缺資料,不應補零。信號 CSV 使用後端 SIGNAL_COLUMNS,並透過 /v1/public/signals/export.csv 匯出。

Webhook 端點、簽名與重試

Webhook 管理使用 webhooks:manage,不是 Cookie 工作階段。建立回應中的 secret 只出現一次,請立即存入密鑰管理器;端點必須是允許的公網 HTTPS 位址,不能帶帳號口令。

POST

/v1/me/webhooks

operationId
notify_webhooks_create
認證
Bearer API Key · webhooks:manage
成功回應
201 · application/json

請求本文欄位

介面欄位表: POST /v1/me/webhooks
欄位類型是否必填約束說明
urlstring必填length 8..2000Webhook 的公網 HTTPS 接收位址。

回應欄位

介面欄位表: POST /v1/me/webhooks
欄位類型是否必填約束說明
created_atunspecified必填—資源建立時間,ISO 8601 UTC。
idunspecified必填—資源 UUID。
secretunspecified必填—Webhook 簽名密鑰,僅在建立回應出現一次。
statusunspecified必填—資源目前狀態。
urlunspecified必填—Webhook 的公網 HTTPS 接收位址。
curl
curl --request POST "${API_BASE}/v1/me/webhooks" \
  -H "Authorization: Bearer ${FF_API_KEY}" \
  -H "Content-Type: application/json" \
  --data '{"url":"<public-https-webhook-url>"}'
JSON
{
  "id": "<endpoint-uuid>",
  "url": "<public-https-webhook-url>",
  "status": "active",
  "created_at": "2026-10-28T00:00:00Z",
  "secret": "<shown-once-store-securely>"
}

驗證簽名

對原始請求本文不做換行、重排或 JSON 再序列化。主簽名材料為 id.timestamp.body,使用 endpoint secret 做 HMAC-SHA256,並與 FF-Webhook-Signature 的 v1=<hex> 常數時間比較;時間戳允許 5 分鐘窗口。X-FF-Signature 是只簽原始 body 的相容標頭,新整合優先驗證主簽名。

FF-Webhook-Id · FF-Webhook-Timestamp · FF-Webhook-Signature: v1=<hex> · X-FF-Signature: sha256=<hex>

Python
import hashlib
import hmac
import os
import time

def verify_webhook(headers, raw_body: bytes) -> bool:
    delivery_id = headers["FF-Webhook-Id"]
    timestamp = headers["FF-Webhook-Timestamp"]
    signature = headers["FF-Webhook-Signature"]
    if abs(time.time() - int(timestamp)) > 300:
        return False
    material = delivery_id.encode() + b"." + timestamp.encode() + b"." + raw_body
    expected = hmac.new(
        os.environ["FF_WEBHOOK_SECRET"].encode(), material, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, "v1=" + expected)

範例從 FF_WEBHOOK_SECRET 讀取密鑰,不含真實 secret。生產程式碼還應拒絕缺失或畸形標頭、限制原始請求本文大小,並在驗證通過後再解析 JSON。

投遞與重試

接收方回傳 2xx 才算成功。首次失敗後按 1 分鐘、5 分鐘、30 分鐘、2 小時、6 小時、24 小時重試,共 7 次嘗試;之後該投遞標記 failed。端點連續 3 天沒有一次成功會自動停用並通知主人。

按 FF-Webhook-Id 與事件 id 去重,接收處理必須冪等;同一事件對同一端點只成功一次。只投遞端點建立之後發生的事件。可透過 GET /v1/me/webhooks/{endpoint_id}/deliveries 讀取投遞狀態,DELETE /v1/me/webhooks/{endpoint_id} 撤銷端點。

WebSocket 連線與訂閱

即時流使用 Centrifugo。先用 API Key 透過 HTTP 換 600 秒連線 JWT,再為私有頻道逐個換 600 秒訂閱 JWT;最後連線部署提供的 Centrifugo WebSocket 位址。長期 API Key 只出現在 HTTP Authorization 標頭。

POST

/v1/public/realtime/token

operationId
signals_public_realtime_token_create
認證
Bearer API Key · read:market 或 read:signals
成功回應
200 · application/json

回應欄位

介面欄位表: POST /v1/public/realtime/token
欄位類型是否必填約束說明
allowed_channelsarray<string>必填—該 Key 獲准使用的頻道類宣告,不替代逐頻道訂閱令牌。
expires_ininteger必填—短期 JWT 的簽發壽命,目前為 600 秒。
tokenstring必填—短期 Centrifugo JWT;不是長期 API Key。
GET

/v1/public/realtime/subscribe-token

operationId
signals_public_realtime_subscribe_token_get
認證
Bearer API Key · read:market 或 read:signals
成功回應
200 · application/json

請求參數

介面欄位表: GET /v1/public/realtime/subscribe-token
欄位位置類型是否必填約束說明
channelquerystring必填length 1..160要訂閱的完整 Centrifugo 頻道。

回應欄位

介面欄位表: GET /v1/public/realtime/subscribe-token
欄位類型是否必填約束說明
allowed_channelsarray<string>必填—該 Key 獲准使用的頻道類宣告,不替代逐頻道訂閱令牌。
channelstring必填—要訂閱的完整 Centrifugo 頻道。
expires_ininteger必填—短期 JWT 的簽發壽命,目前為 600 秒。
tokenstring必填—短期 Centrifugo JWT;不是長期 API Key。
scope 與頻道白名單
scope頻道
read:marketpub:market · pub:lists · pub:coins · live:market · live:lists · live:coins · live:coin.{SYMBOL}
read:signalssig:{stream_code};流必須存在
curl
curl --request POST "${API_BASE}/v1/public/realtime/token" \
  -H "Authorization: Bearer ${FF_API_KEY}"

curl --get "${API_BASE}/v1/public/realtime/subscribe-token" \
  -H "Authorization: Bearer ${FF_API_KEY}" \
  --data-urlencode "channel=live:coin.BTCUSDT"
JSON
{
  "token": "<short-lived-jwt>",
  "expires_in": 600,
  "allowed_channels": ["live:*"],
  "channel": "live:coin.BTCUSDT"
}
TypeScript
import { createApiKeyTokenSource, RealtimeClient } from "@ff/realtime";

const tokens = createApiKeyTokenSource({
  apiBaseUrl: process.env.API_BASE!,
  apiKey: process.env.FF_API_KEY!,
});
// API Key 自动使用 connect.data.token / subscribe.data.token;
// 普通用户 JWT 才使用原生 getToken / getSubscribeToken。
const client = new RealtimeClient({
  url: process.env.FF_REALTIME_URL!,
  ...tokens,
});
const stop = client.listen("live:coin.BTCUSDT", (ctx) => {
  console.log(ctx.data);
});

每個 Key 最多持有 10 個未過期連線令牌租約,訂閱令牌不佔此租約。舊連線到期後再取新連線令牌,不要提前反覆換票;這是簽發側租約限制,不等於真實線上連線數。

範例複用儲存庫現有 @ff/realtime,在受信任的伺服器端或本地程式執行。Key 撤銷後不能換發新令牌;已簽 JWT 是無狀態憑證,最長可存活到原 exp(600 秒),不保證即時離線。user:* 與 admin:* 不對 API Key 開放。

目前開放端點目錄

下表在建置時列舉 /v1/public 的真實 OpenAPI operations;operationId、方法和路徑以規範為準。新增公開端點隨共享規範產生後進入目錄,認證中繼資料仍需與後端路由一起核對。

API 端點目錄
方法路徑分組認證operationId
GET/v1/public/checkup/reports/{report_id}體檢Bearer API Key · read:checkupcheckup_public_report_get
GET/v1/public/checkup/symbols/{symbol}體檢匿名;可有獨立 IP 限流checkup_public_symbol_get
GET/v1/public/checkups/{symbol}體檢Bearer API Key · read:checkupcheckup_public_symbol_full
GET/v1/public/checkups/{symbol}/latest體檢Bearer API Key · read:checkupcheckup_public_symbol_latest
GET/v1/public/calibration行情Bearer API Key · read:marketmarket_public_calibration
GET/v1/public/coins/{symbol}行情Bearer API Key · read:marketmarket_public_coin_get
GET/v1/public/coins/{symbol}/predictions行情Bearer API Key · read:marketmarket_public_coin_predictions
GET/v1/public/market/export/states.csv行情Bearer API Key · export:data,另需 data.export=fullmarket_public_states_csv_export
GET/v1/public/radar/lists行情Bearer API Key · read:marketmarket_public_radar_lists
GET/v1/public/affiliates/{slug}其他公開資源匿名;可有獨立 IP 限流growth_public_affiliates_get
GET/v1/public/affiliates/{slug}/bot其他公開資源匿名;可有獨立 IP 限流growth_public_affiliate_bot_get
GET/v1/public/live/certifications/{token}其他公開資源匿名;可有獨立 IP 限流live_public_certification_get
GET/v1/public/proofs公開存證匿名;可有獨立 IP 限流signals_public_proofs_list
GET/v1/public/proofs/{day}公開存證匿名;可有獨立 IP 限流signals_public_proofs_get
POST/v1/public/proofs/verify公開存證匿名;可有獨立 IP 限流signals_public_proofs_verify
GET/v1/public/realtime/subscribe-token即時令牌Bearer API Key · read:market 或 read:signalssignals_public_realtime_subscribe_token_get
POST/v1/public/realtime/token即時令牌Bearer API Key · read:market 或 read:signalssignals_public_realtime_token_create
GET/v1/public/signals信號Bearer API Key · read:signalssignals_public_list
GET/v1/public/signals/{stream}信號Bearer API Key · read:signalssignals_public_stream_list
GET/v1/public/signals/export.csv信號Bearer API Key · export:data,另需 data.export=fullsignals_public_csv_export

相關管理與工作階段端點

API Key 管理、預測與 Webhook 不完全位於 /v1/public,單獨列出以免遺漏或誤改路徑。

API 端點目錄
方法路徑分組認證operationId
POST/v1/me/api-keys帳號與 API KeyCookie 工作階段;寫請求另需 CSRFauth_api_keys_create
GET/v1/coins/{symbol}/predictions行情匿名;可有獨立 IP 限流coin_predictions_v1_coins__symbol__predictions_get
GET/v1/me/webhooksWebhookBearer API Key · webhooks:managenotify_webhooks_list
POST/v1/me/webhooksWebhookBearer API Key · webhooks:managenotify_webhooks_create
DELETE/v1/me/webhooks/{endpoint_id}WebhookBearer API Key · webhooks:managenotify_webhooks_delete
GET/v1/me/webhooks/{endpoint_id}/deliveriesWebhookBearer API Key · webhooks:managenotify_webhooks_deliveries_list

未在此列出的後台、內部 ingest、節點控制面和管理端介面不是開放 API。目錄存在不代表外部生產網域已驗收或對你的網路可達。