快速入门
使用免费密钥通过 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 会是一个空数组,count 为 0。这是套利之间的正常静默状态,而非错误。你还可以使用 sport 和 limit 进一步缩小快照范围。
实时流
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 参考文档。