퀵스타트
무료 키로 첫 매칭 피드를 REST로 가져온 다음, 실시간 스트림에 연결합니다.
이 가이드는 약 2분 만에 아무것도 없는 상태에서 실시간 데이터까지 안내합니다. 전반부는 무료 키로 진행됩니다. 후반부는 실시간 스트림에 연결하며 Basic 또는 Pro 플랜이 필요합니다.
먼저 API 키를 생성하세요. 대시보드를 열고 GitHub 또는 Google로 로그인한 다음 키를 생성합니다. 키는 한 번만 표시되므로 안전한 곳에 복사해두세요. 새로 생성한 키는 모두 Free로 시작하며, 이는 전반부에 필요한 전부입니다.
REST로 보는 매칭 피드
REST 스냅샷은 요청 시 arb 뷰로 가격이 매겨진 매칭 피드를 제공합니다. 응답을 작게 유지하려면 스포츠 하나를 지정하세요. 키는 베어러 토큰으로 전송합니다.
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는 가격이 매겨진 표준 market 객체를 반환합니다. potential_arb_pct는 거래소 수수료를 반영하기 전, ask 대 ask 기준의 총수익률입니다. outcomes는 각 마켓 결과와 두 거래소에서의 가격, 그리고 어느 거래소의 ask가 더 낮은지(cheaper)를 나열합니다. signal은 매칭 엔진이 확정된 결과에 대해 두 거래소 간 정산 정합성(parity)을 확인한 경우에만 "arb"이며, 정산 리스크가 공개된 매칭된 갭을 포함해 그 외의 경우는 모두 "spread"로 반환됩니다. 어느 쪽이든 실행하기 전에 settlement.risks를 확인하세요. include=settlement를 추가하거나 아래의 상세 엔드포인트를 호출하면 됩니다.
전체 상세 정보(거래소 식별자, 신뢰도, 정산 공개 정보)를 보려면 해당 행의 id를 사용해 GET /v2/pairs/{market_id}를 호출하세요. 이 상세 정보는 매칭 엔진이 실시간 텍스트를 다시 분석할 때만 변경되므로 캐싱해도 됩니다.
열려 있는 것이 없을 때는 markets가 빈 배열이 되고 count는 0이 됩니다. 이는 차익거래 사이의 정상적인 대기 상태이며 오류가 아닙니다. sport와 limit으로 스냅샷을 더 좁힐 수 있습니다.
실시간 스트림
REST 스냅샷은 약 2분 지연되므로 탐색용입니다. 차익거래가 열리는 순간 바로 실행하려면 WebSocket 스트림을 읽으세요. Basic 또는 Pro 키가 필요합니다.
스트림은 2단계 핸드셰이크로 이루어집니다. REST로 단기 티켓을 발급받은 다음, 그 티켓으로 소켓을 엽니다. Free 키는 여기서 업그레이드 링크와 함께 402를 받습니다.
1단계, 티켓을 발급받습니다. 유효기간은 약 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
}
}
2단계, 연결합니다. 스트림은 Centrifugo 프로토콜을 사용하므로, 사용하는 언어에 맞는 centrifuge 클라이언트를 사용해 connect data의 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 스트림 페이지에서 각 형태를 다룹니다.
다음 단계
Market 객체 레퍼런스는 표준 객체 형태, outcomes 배열, signal 유형, 스트림 봉투(envelope)를 다룹니다. WebSocket 스트림 페이지는 연결 방법과 연결 끊김 이후 복구 방법을 다룹니다. 거래소 식별자와 정산 조건은 REST 레퍼런스에 문서화된 GET /v2/pairs/{market_id}를 사용하세요.