Skip to content

快速入门

使用免费密钥通过 REST 获取你的第一份匹配数据流,然后连接实时流。

本指南将带你在大约两分钟内从零开始接入实时数据。前半部分使用免费密钥即可完成,后半部分连接实时流,需要 Basic 或 Pro 套餐。

首先,创建一个 API 密钥。打开控制台,使用 GitHub 或 Google 登录,然后创建一个密钥。密钥只会显示一次,请将它保存在安全的地方。每个新密钥默认使用 Free 套餐,这对完成前半部分内容已经足够。

通过 REST 获取匹配数据流

REST 快照会提供匹配数据流;如果你请求套利视图,还会返回已定价的数据。指定单个运动项目可以让响应体保持精简。请将密钥以 Bearer 令牌的形式发送。

curl -s "https://api.dino.markets/v2/markets?signal=arb&sport=baseball" \
  -H "Authorization: Bearer sk_live_..."

你会收到该运动项目的快照。下面是一个已确认的套利示例:

{
  "count": 1,
  "sport": "baseball",
  "has_more": false,
  "markets": [
    {
      "id": "dino_8f3a1c92-47e8-4c3f-b9d2-f1a8e6c4d5f2",
      "slug": null,
      "sport": "baseball",
      "league": "MLB",
      "title": "Nyy vs Bos",
      "home": null,
      "away": null,
      "start_time": "2026-07-01T23:05:00+00:00",
      "status": "open",
      "match": "high_confidence",
      "signal": "arb",
      "spread_pts": 2.0,
      "potential_arb_pct": 1.83,
      "coverage": { "kalshi": true, "polymarket": true },
      "outcomes": [
        { "key": "NYY", "name": "NYY", "kalshi": 0.52, "polymarket": 0.54, "cheaper": "kalshi" },
        { "key": "BOS", "name": "BOS", "kalshi": 0.50, "polymarket": 0.46, "cheaper": "polymarket" }
      ],
      "result": null,
      "updated_at": "2026-07-01T22:55:00+00:00",
      "priced_at": "2026-07-01T22:55:00+00:00",
      "links": { "kalshi": "https://kalshi.com/markets/KXMLBGAME-26JUL01NYYBOS", "polymarket": null }
    }
  ]
}

GET /v2/markets?signal=arb 返回已定价的规范市场对象。potential_arb_pct 是以卖价对卖价计算的毛收益率,尚未扣除平台手续费。outcomes 列出每个市场结果在两个平台上的价格,以及哪个平台的卖价更低(cheaper)。当匹配引擎已在判定结果上确认跨平台结算一致性时,signal"arb";其余情况——包括已匹配但披露了结算风险的价差——都会返回 "spread"。无论哪种情况,行动前都请先阅读 settlement.risks。你也可以添加 include=settlement,或调用下方的详情端点。

如需完整详情(平台标识、置信度、结算披露),请使用该行的 id 调用 GET /v2/pairs/{market_id}。这部分详情只有在匹配引擎重新分析实时文本时才会变化,因此可以将其缓存。

当没有任何机会开放时,markets 会是一个空数组,count0。这是套利之间的正常静默状态,而非错误。你还可以使用 sportlimit 进一步缩小快照范围。

实时流

REST 快照大约有两分钟延迟,因此只适合用于探索。要在套利一出现就立即采取行动,请读取 WebSocket 流,这需要 Basic 或 Pro 密钥。

连接流是一次两步握手:先通过 REST 生成一张短期有效的票据,然后用它打开 Socket 连接。Free 密钥在这一步会收到 402,并附带升级链接。

第一步,生成票据。它的有效期约为 120 秒:

curl -s -X POST "https://api.dino.markets/v1/stream/token" \
  -H "Authorization: Bearer sk_live_..."
{
  "ticket": "eyJhbGciOi...",
  "ws_url": "wss://stream.dino.markets/connection/websocket",
  "expires_in": 120,
  "allowed": {
    "channels": ["markets:all", "status"],
    "max_conns": 3
  }
}

第二步,连接。该流使用 Centrifugo 协议,因此请使用对应语言的 centrifuge 客户端,并在连接数据的 t 字段中传入票据。你不需要手动订阅频道——服务器会根据票据中的套餐信息,推送你有权访问的频道。

import { Centrifuge } from "centrifuge";

const centrifuge = new Centrifuge("wss://stream.dino.markets/connection/websocket", {
  data: { t: ticket },
});

centrifuge.on("publication", (ctx) => {
  console.log(ctx.channel, ctx.data);
});

centrifuge.connect();

一旦有任何变化,消息会立即被推送:markets:* 频道上会出现 market 状态帧和 price 增量帧;当某一对市场的 signal 为 arb 时,其帧还会携带按结果划分的深度订单簿,以及 max_stake。各类消息结构详见 WebSocket 流页面。

后续

市场对象参考文档介绍了规范对象结构、outcomes 数组、signal 类型,以及流消息封装。WebSocket 流页面介绍了如何连接,以及断线后如何恢复。如需平台标识和结算条款,请使用 GET /v2/pairs/{market_id},详见 REST 参考文档