Kalshi와 Polymarket 데이터를 REST와 MCP 한 흐름으로 연결하기
Kalshi와 Polymarket을 함께 다루는 서비스에서는 거래소마다 다른 식별자, 결과 표현, 정산 조건을 계속 확인하게 됩니다. dino.markets는 관련 시장을 매칭한 데이터를 REST API와 MCP로 제공합니다. 이 글에서는 REST 스냅샷을 가져오고 MCP 클라이언트에서 같은 데이터 면을 탐색하는 흐름을 직접 구성합니다.
이 글은 dino.markets 운영사 Nusantara Ventures LLC의 의뢰로 작성되었습니다. 가격과 스프레드는 관측 데이터로 다루고, 거래 결정을 내릴 때는 각 거래소의 수수료, 정산 조건, 이용 가능 여부를 별도로 확인해야 합니다.
필요한 것은 dino.markets API 키, curl, 그리고 선택적으로 MCP를 지원하는 개발 환경입니다. API 키를 만든 뒤 한국어 문서의 인증 안내를 확인하세요.
REST API로 시장 스냅샷 가져오기
아래 요청은 MLB 관련 시장을 signal=arb로 필터링합니다. 결과가 비어 있어도 정상입니다. 매칭이 완료되었고 그 시점의 조건에 맞는 시장만 반환됩니다.
export DINO_API_KEY="sk_live_..."
curl -sS "https://api.dino.markets/v2/markets?signal=arb&sport=baseball" \
-H "Authorization: Bearer ${DINO_API_KEY}" | jq '{
count,
markets: [
.markets[] | {
id,
title,
sport,
league,
signal,
spread_pts,
potential_arb_pct,
outcomes
}
]
}'
응답의 id는 상세 조회에 사용합니다. signal=arb는 Dino 매처가 정산 조건의 동등성을 확인했고, 이를 막는 정산 위험을 찾지 못한 조합을 뜻합니다. 거래소 규칙과 수수료는 바뀔 수 있습니다. potential_arb_pct는 거래소 수수료 전 ask-to-ask 기준의 추정치이므로, 실현 가능한 수익률로 해석하면 안 됩니다.
REST 스냅샷은 모든 플랜에서 약 2분 지연됩니다. 모니터링 화면, 분석 작업, 콘텐츠 조사에는 유용하며 주문 실행용 데이터 면은 아닙니다.
애플리케이션 코드에서도 같은 엔드포인트를 호출합니다.
const response = await fetch(
"https://api.dino.markets/v2/markets?signal=arb&sport=baseball",
{ headers: { Authorization: `Bearer ${process.env.DINO_API_KEY}` } },
);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { count, markets } = await response.json();
console.log({ count, markets });
개별 시장을 사용하기 전에는 반환된 id로 GET /v2/pairs/{market_id}를 호출하고 결과와 settlement.risks를 살펴보세요. signal=spread 데이터를 쓰는 경우에는 이 확인을 흐름에 포함하는 편이 좋습니다.
MCP에서 같은 데이터 면 사용하기
MCP를 사용하면 지원되는 클라이언트나 에이전트의 대화에서 시장 탐색과 상세 확인을 할 수 있습니다. Streamable HTTP 연결 주소는 마지막 슬래시까지 포함한 https://api.dino.markets/v2/mcp/입니다.
mcp-remote를 실행하는 클라이언트에서는 설정에 다음을 추가합니다.
{
"mcpServers": {
"dino-markets": {
"command": "npx",
"args": [
"mcp-remote",
"https://api.dino.markets/v2/mcp/",
"--header",
"Authorization:Bearer ${DINO_API_KEY}"
],
"env": { "DINO_API_KEY": "sk_live_..." }
}
}
}
설정을 저장하고 MCP 클라이언트를 다시 시작한 뒤, 먼저 아래와 같은 데이터 확인 작업을 요청할 수 있습니다.
find_markets로 MLB를 검색한 뒤 찾은 ID로get_market을 호출해 주세요. 각 시장의 결과와settlement.risks를 요약하고, 가격을 거래 판단으로 해석하지 마세요.
공개 MCP에는 find_markets, find_arbitrage, list_markets, list_leagues, get_market, get_spreads, report_bad_arb, watch_markets의 8개 도구가 있습니다. 활성화된 모든 플랜에서 사용할 수 있습니다. WebSocket 구독 범위는 플랜별로 다르며 Free는 sample과 status, 유료 플랜은 markets:*를 제공합니다.
구현에서 지켜둘 경계
매칭의 목적은 관련 시장을 같은 데이터 흐름에서 확인하도록 돕는 것입니다. 최종 정산 규칙은 각 거래소가 정합니다. 앱에서는 API 응답만 저장하기보다 id별 상세 정보, 조회 시각, 정산 위험을 함께 표시하면 이후 조사에 도움이 됩니다.
dino.markets는 스포츠, 날씨, 암호자산, 경제 관련 시장을 문서화합니다. 이 글은 공개 API의 sport=baseball 필터를 사용해 재현하기 쉬운 시작점에 집중했습니다.
엔드포인트, 인증, REST 필터는 한국어 문서에서 확인할 수 있습니다. MCP 클라이언트별 연결 방법은 한국어 MCP 문서를 참고하세요. MCP 서버의 공개 저장소는 dino-markets-mcp입니다.
블로그의 다른 글
“같은” 예측 시장의 오즈가 다른 이유
비슷한 제목이 비교 가능한 계약을 뜻하지는 않습니다. 질문, 결과 구간, 정산 규칙, 시점, 유동성이 오즈의 의미를 바꿉니다.
월드컵 토너먼트 차익거래는 빈도는 유지했지만 깊이를 잃었다
16강전에서 8강전으로 넘어가는 동안 Kalshi와 Polymarket 사이의 3구간 차익거래는 같은 빈도로 계속 발동했지만, 엣지는 절반으로 얕아지고 마감 속도는 두 배로 빨라졌습니다.
월드컵 토너먼트에서는 무승부(Tie)가 이길 수도 있다
Kalshi와 Polymarket 모두 토너먼트 머니라인 마켓을 90분 플러스 추가시간 기준으로 정산합니다. 한 팀이 연장전이나 승부차기로 진출하는 동안에도 무승부(Draw) 계약은 지급될 수 있습니다.