狀態暫不可用DEMO
文件

API 參考

一把 API Key、兩條即時通道,以及少量無狀態 REST 讀取;JSON 與 Protobuf 的語義完全一致。

快速開始

註冊、驗證郵箱並選擇套餐;付款確認後會顯示第一把 API Key(只顯示一次)。

01

建立帳號

驗證郵箱;未驗證的客戶不能購買或取得金鑰。

02

用 USDC 購買套餐

選擇 Solana、Base 或 Arbitrum,轉帳後提交交易哈希。

03

呼叫 API

REST 與 WebSocket 都使用 Authorization 標頭攜帶金鑰。

bash
curl -s "https://api.marketquote.io/v1/quote/AAPL" \
  -H "Authorization: Bearer mq_live_9f2c…" \
  -H "Accept: application/json"

{
  "symbol": "AAPL",
 "bid": "345.42",
 "bid_qty": "0",
 "ask": "345.46",
 "ask_qty": "0",
 "status": "TRADING",
 "time": 1793029498236
}
Authorization: Bearer <api_key>傳輸格式: JSON / Protobuf

認證

每個 REST 請求與 WebSocket 握手都在 Authorization 標頭攜帶 API Key;金鑰綁定一個客戶,有效性隨客戶狀態與訂閱判定。

Authorization: Bearer <api_key>
  • 每個客戶一把金鑰;明文只在建立或重置時顯示。
  • 在客戶門戶自助重置;舊金鑰立即吊銷。
  • 金鑰只能放在 Authorization 標頭;查詢字串中的金鑰一律拒絕。
  • REST 每次請求都會向 PostgreSQL 校驗金鑰與訂閱;已吊銷的金鑰立即失效。
  • WebSocket 連線會定期重新校驗;金鑰或訂閱失效時立即關閉連線。
  • 客戶被禁用、訂閱取消或退款都會使金鑰失效。

REST

商品、L1 報價、最新價、K 線、交易時段與資料源目錄的無狀態讀取;歷史查詢使用同一組端點並帶 from/to 視窗。

方法路徑說明
GET/v1/instruments公開商品目錄,包含資產類別。
GET/v1/quote/{symbol}最新合成 BBO;帶 from/to 與 limit 可查歷史。
GET/v1/tick/{symbol}最新合成最新價;帶 from/to 與 limit 可查歷史。
GET/v1/quotes?symbols=A,B單次最多 50 個商品的合成 BBO 最新報價;結果保持請求順序。
GET/v1/ticks?symbols=A,B單次最多 50 個商品的合成最新價;結果保持請求順序。
GET/v1/klines/{symbol}/1m最新 1m K 線;帶 from/to 與 limit 可查區間。
GET/v1/schedules/{symbol}商品時區下的每週交易時段與節假日覆蓋。
GET/v1/schedules?symbols=A,B單次最多 50 個商品的每週交易時段與節假日覆蓋。
GET/v1/sources公開資料源目錄,包含 LIVE 狀態。
UPGRADE/v1/wsWebSocket 升級;quote / tick 通道;必須攜帶 Authorization 標頭。

歷史查詢使用同一組端點並帶 from/to 視窗;from 與 to 是毫秒級 epoch 邊界(含端點),必須成對提供且 to 大於 from;limit 限制回傳列數。

批量讀取:/v1/quotes、/v1/ticks 與 /v1/schedules 接受逗號分隔的 symbols 查詢參數(最多 50 個,自動去重並保持請求順序),且只回傳最新值。

每個批量項目要麼是與單商品端點相同的物件,要麼是 {"symbol":"...","error":"CODE"};單個商品不可用不影響其他項,SNAPSHOT_UNAVAILABLE 與單商品端點使用相同的時效規則。

交易時段回傳商品 IANA 時區下的每週時段與節假日覆蓋;7x24 商品回傳 is_24x7 且不含每週時段。

包含 / 的商品符號必須做百分比編碼,例如 BTC%2FUSDT。

用 Accept: application/json 或 application/x-protobuf 選擇編碼;價格與數量是依商品 price_precision、qty_precision 格式化的十進位字串,時間戳為毫秒級 epoch。

REST 回應範例

GET /v1/instruments
{
  "instruments": [
    {
      "asset_category": "EQUITIES",
      "contract_month": null,
      "enable_pre_post": true,
      "expiry_date": null,
      "name": "Apple",
      "price_precision": 2,
      "product_code": null,
      "qty_precision": 0,
      "symbol": "AAPL"
    },
    {
      "asset_category": "EQUITIES",
      "contract_month": null,
      "enable_pre_post": true,
      "expiry_date": null,
      "name": "Microsoft",
      "price_precision": 2,
      "product_code": null,
      "qty_precision": 0,
      "symbol": "MSFT"
    },
    {
      "asset_category": "COMMODITIES",
      "contract_month": "2026-12",
      "enable_pre_post": false,
      "expiry_date": "2026-12-20",
      "name": "Crude Oil Dec 2026",
      "price_precision": 2,
      "product_code": "CL",
      "qty_precision": 0,
      "symbol": "CLZ6"
    },
    {
      "asset_category": "COMPOSITE",
      "contract_month": null,
      "enable_pre_post": false,
      "expiry_date": null,
      "name": "Crude Oil Composite Index",
      "price_precision": 4,
      "product_code": null,
      "qty_precision": 2,
      "symbol": "CL_IDX"
    }
  ]
}
GET /v1/quote/{symbol}
{
  "symbol": "AAPL",
  "bid": "345.42",
  "bid_qty": "0",
  "ask": "345.46",
  "ask_qty": "0",
  "status": "TRADING",
  "time": 1793029498236
}
GET /v1/quote/{symbol}?from=&to=&limit=
{
  "symbol": "AAPL",
  "quotes": [
    {
      "symbol": "AAPL",
      "bid": "345.42",
      "bid_qty": "0",
      "ask": "345.46",
      "ask_qty": "0",
      "status": "TRADING",
      "time": 1793029498236
    }
  ]
}
GET /v1/tick/{symbol}
{
  "symbol": "AAPL",
  "price": "345.46",
  "qty": "1",
  "side": 0,
  "status": "TRADING",
  "time": 1793029498081
}
GET /v1/tick/{symbol}?from=&to=&limit=
{
  "symbol": "AAPL",
  "prices": [
    {
      "symbol": "AAPL",
      "price": "345.46",
      "qty": "1",
      "side": 0,
      "status": "TRADING",
      "time": 1793029498081
    }
  ]
}
GET /v1/quote/CL_IDX (indicative composite index L1)
{
  "symbol": "CL_IDX",
  "bid": "69.8750",
  "bid_qty": "0.00",
  "ask": "70.3750",
  "ask_qty": "0.00",
  "status": "TRADING",
  "time": 1793029498236
}
GET /v1/tick/CL_IDX (composite index value)
{
  "symbol": "CL_IDX",
  "price": "70.1250",
  "qty": "0.00",
  "side": 0,
  "status": "TRADING",
  "time": 1793029498081
}
GET /v1/quotes?symbols=AAPL,EURUSD
{
  "quotes": [
    {
      "symbol": "AAPL",
      "bid": "345.42",
      "bid_qty": "0",
      "ask": "345.46",
      "ask_qty": "0",
      "status": "TRADING",
      "time": 1793029498236
    },
    { "symbol": "EURUSD", "error": "SNAPSHOT_UNAVAILABLE" }
  ]
}
GET /v1/ticks?symbols=AAPL,EURUSD
{
  "ticks": [
    {
      "symbol": "AAPL",
      "price": "345.46",
      "qty": "1",
      "side": 0,
      "status": "TRADING",
      "time": 1793029498081
    },
    { "symbol": "EURUSD", "error": "SNAPSHOT_UNAVAILABLE" }
  ]
}
GET /v1/klines/{symbol}/1m
{
  "symbol": "AAPL",
  "interval": "1m",
  "open_time": 1793029380000,
  "open": "345.48",
  "high": "345.48",
  "low": "345.41",
  "close": "345.42",
  "volume": "12576",
  "count": 143
}
GET /v1/klines/{symbol}/1m?from=&to=&limit=
{
  "symbol": "AAPL",
  "interval": "1m",
  "klines": [
    {
      "symbol": "AAPL",
      "interval": "1m",
      "open_time": 1793029380000,
      "open": "345.48",
      "high": "345.48",
      "low": "345.41",
      "close": "345.42",
      "volume": "12576",
      "count": 143
    }
  ]
}
GET /v1/schedules/{symbol}
{
  "symbol": "AAPL",
  "timezone": "America/New_York",
  "enable_pre_post": true,
  "is_halted": false,
  "is_24x7": false,
  "sessions": [
    {
      "day_of_week": 1,
      "session_type": "PRE",
      "start_local_time": "04:00:00",
      "end_local_time": "09:30:00"
    },
    {
      "day_of_week": 1,
      "session_type": "TRADING",
      "start_local_time": "09:30:00",
      "end_local_time": "16:00:00"
    }
  ],
  "overrides": [
    {
      "override_date": "2026-11-26",
      "session_status": "HOLIDAY_CLOSED",
      "start_local_time": "00:00:00",
      "end_local_time": "23:59:59",
      "name": "Apple"
    }
  ]
}
GET /v1/schedules?symbols=AAPL,NOPE1
{
  "schedules": [
    {
      "symbol": "AAPL",
      "timezone": "America/New_York",
      "enable_pre_post": true,
      "is_halted": false,
      "is_24x7": false,
      "sessions": [
        {
          "day_of_week": 1,
          "session_type": "TRADING",
          "start_local_time": "09:30:00",
          "end_local_time": "16:00:00"
        }
      ],
      "overrides": []
    },
    { "symbol": "NOPE1", "error": "NOT_FOUND" }
  ]
}
GET /v1/sources
{
  "sources": [
    { "source_id": 7, "name": "DATABENTO", "status": "LIVE" },
    { "source_id": 10, "name": "ITICK_STOCK", "status": "LIVE" },
    { "source_id": 11, "name": "ITICK_INDICES", "status": "LIVE" }
  ]
}

綜合指數

綜合指數是平台產生的商品,資產類目為 COMPOSITE。其數值為同一合約品種中未到期、且具有有效持倉量與價格的合約,按持倉量加權成分價格:Σ(持倉量 × 成分價格) / Σ持倉量。成分價格為該成員的最新價;未停牌成員的最新成交超過 last_stale_timeout_ms 未更新時,改以當前 L1 中間價計算;停牌成員則持續採用最後成交價。

期貨合約在商品目錄中提供 product_code、contract_month(YYYY-MM)與 expiry_date(YYYY-MM-DD)。綜合指數本身資產類目為 COMPOSITE,其合約欄位在 JSON 中為 null。

綜合指數的 L1 報價為指示性報價:買價 = 指數值 − 報價偏移,賣價 = 指數值 + 報價偏移,雙邊數量為 0;買賣價會鉗制為買價維持正值、賣價高於買價。指數最新值仍透過一般 tick 通道訂閱,並與其他商品一樣歸檔。

公開 API 客戶可像一般商品一樣使用綜合指數。成分、權重與持倉量僅在營運後台提供給操作員。

WebSocket

兩條通道:quote 提供合成 BBO,tick 提供合成最新價;控制訊框為 JSON 文字,行情推送為二進位 Protobuf MarketFrame 信封,攜帶 channel、symbol 與 L1Quote 或 LastPrice 載荷。

quote

合成買一/賣一、掛單量與市場狀態。

tick

合成最新價、成交量與主動方向;純報價商品由盤口中間價派生。

  • 握手必須攜帶 Authorization: Bearer <api_key>;查詢字串中的金鑰一律拒絕。
  • subscribe 動作會取代連線目前的訂閱集合,並以 JSON 訊框回覆確認。
  • 確認訊框之後,網關會立即推送每個已訂閱商品與通道的最新快照;降級(DEGRADED_NO_SOURCE)或已過期的快照會被跳過,即時推送也永不包含 DEGRADED_NO_SOURCE 訊框。時效判斷中 quote 使用 l1_stale_timeout_ms,tick 使用 last_stale_timeout_ms。
  • 網關會定期重新校驗權益;金鑰或訂閱失效時以代碼 1008 關閉連線。
  • 瀏覽器 WebSocket 用戶端無法設定 Authorization 標頭;請使用伺服器端用戶端,或由反向代理注入標頭。
bash
curl -s "https://api.marketquote.io/v1/quote/AAPL" \
  -H "Authorization: Bearer mq_live_9f2c…" \
  -H "Accept: application/json"

{
  "symbol": "AAPL",
 "bid": "345.42",
 "bid_qty": "0",
 "ask": "345.46",
 "ask_qty": "0",
 "status": "TRADING",
 "time": 1793029498236
}
Authorization: Bearer <api_key>傳輸格式: JSON / Protobuf

WebSocket 訊框範例

Subscribe (JSON text)
→ {"action":"subscribe","channels":["quote","tick"],"symbols":["AAPL"]}
← {"type":"subscribed","channels":["quote","tick"],"symbols":["AAPL"],"subscriptions":2}
Subscribe → immediate snapshot push
→ {"action":"subscribe","channels":["quote","tick"],"symbols":["AAPL"]}
← {"type":"subscribed","channels":["quote","tick"],"symbols":["AAPL"],"subscriptions":2}
← [binary] quote snapshot for AAPL   (pushed immediately after the ack)
← [binary] tick snapshot for AAPL    (evaluated per channel)

Snapshots that are DEGRADED_NO_SOURCE or older than the channel freshness
timeout are skipped. Live pushes never include DEGRADED_NO_SOURCE frames.
L1 frame (Protobuf MarketFrame)
channel: "quote"
symbol: "AAPL"
l1 {
  symbol: "AAPL"
  bid: "345.42"
  bid_qty: "0"
  ask: "345.46"
  ask_qty: "0"
  status: "TRADING"
  time: 1793029498236
}
Last frame (Protobuf MarketFrame)
channel: "tick"
symbol: "AAPL"
last {
  symbol: "AAPL"
  price: "345.46"
  qty: "1"
  side: 0
  status: "TRADING"
  time: 1793029498081
}
Error frame (JSON text)
← {"type":"error","code":"VALIDATION_FAILED",
   "message":"channels: channels 不能为空",
   "field_errors":[{"field":"channels","message":"channels 不能为空"}]}
Ping / Pong (JSON text)
→ {"action":"ping"}
← {"type":"pong"}

錯誤

錯誤由穩定的 code 與 HTTP 狀態組成;請以 code 作為契約,message 僅供人閱讀。

錯誤碼HTTP說明
UNAUTHENTICATED401缺少或無效的 API Key。
FORBIDDEN403金鑰有效,但訂閱未授予該權限。
NOT_FOUND404未知的商品、已退役商品或端點。
VALIDATION_FAILED400查詢參數格式錯誤,包含不合法的 from/to 視窗、limit 或 K 線週期。
RATE_LIMITED429REST 或 WebSocket 速率超限;請以退避重試。
SNAPSHOT_UNAVAILABLE503沒有可用的即時快照:缺失、降級(DEGRADED_NO_SOURCE)或已超過該通道的保鮮逾時。
MARKET_DATA_DEPENDENCY_UNAVAILABLE503行情依賴暫不可用;請以退避重試。
INTERNAL500未預期的伺服器錯誤;聯絡支援時請附上請求 ID。

限制

配額是套餐權益的一部分,由網關執行;超限時 API 回傳 429 並附 Retry-After。

API Key每個客戶 1 把
並行 WebSocket 連線套餐權益
單連線訂閱數套餐權益
單次批量商品數50
REST 請求按套餐的每分鐘配額
WebSocket 新建連線按套餐的每分鐘配額
歷史視窗由伺服器限制的 from/to
每次歷史查詢列數由伺服器限制的筆數

狀態

資料源目錄會揭露方案可存取商品所綁定資料源的 LIVE 狀態;官網演示在快照停止刷新時隱藏價格,而不是顯示舊值。

所有資料源上線 · 模擬

發生營運事件時,請先查看狀態頁與資料源目錄,再開支援工單。

準備好接入了嗎?

建立帳號、選擇套餐,取得你的第一把 API Key。