Objeto Market
El objeto de mercado canónico devuelto por GET /v2/markets y GET /v2/pairs/{market_id}, y el envelope del stream en tiempo real.
La API sirve un solo objeto de mercado canónico a través de REST y del stream. GET /v2/markets devuelve una lista de ellos; GET /v2/pairs/{market_id} devuelve uno con los bloques de detalle completos adjuntos. Ya no existe una forma "lean-tick" separada. El mismo objeto lleva identidad, precios y resolución, con los bloques de precio y resolución poblados solo donde la solicitud los pidió.
GET /v2/markets: el catálogo, una fila por partido emparejado. Sin filtrar, los precios sonnull.signal=arbdevuelve las mismas filas con precio de la instantánea en vivo, filtradas a arbs confirmados.GET /v2/pairs/{market_id}: un mercado por id, coninclude=ids,depth,settlementaplicado por defecto: identificadores de plataforma, confianza, detalle de libro por resultado, y divulgación de resolución.
El objeto de mercado
{
"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 }
}
Campos del objeto
| Campo | Tipo | Significado |
|---|---|---|
id | string | El id canónico estable, dino_<uuid>. Úsalo para llamar a GET /v2/pairs/{market_id}. |
slug | string|null | Un identificador de nombre limpio. Aún no poblado; siempre null hoy. |
sport | string | La clave de deporte amplia. |
league | string|null | La competición dentro del deporte, como MLB. Null cuando la serie de la plataforma no nombra ninguna. |
title | string|null | Un título de mejor esfuerzo construido a partir de los identificadores de equipo emparejados. |
home / away | string|null | Aún no poblado; siempre null hoy. |
start_time | string|null | Inicio en ISO-8601 UTC. |
status | string | open, live, closed, o settled. Ver Status. |
match | string | La etiqueta de confianza de coincidencia. Actualmente siempre high_confidence en las filas servidas. |
signal | string | "arb" o "spread". Ver Signal. |
spread_pts | number|null | Brecha máxima entre plataformas por resultado, en puntos porcentuales. Null a menos que cada resultado tenga precio en ambas plataformas. |
potential_arb_pct | number|null | El retorno bruto ask-to-ask, antes de las comisiones de la plataforma. Poblado solo cuando signal es "arb". Una observación de la instantánea en priced_at. |
coverage | object | { kalshi, polymarket }, cada uno true solo si cada resultado tiene precio en esa plataforma. |
outcomes | array | Precio por resultado. Ver Outcomes. Vacío cuando la fila no tiene precio. |
result | object|null | Veredicto de resolución, poblado solo una vez que status es settled. |
updated_at | string|null | Cuándo el motor de coincidencia volvió a analizar por última vez la identidad y los términos de resolución de este par. |
priced_at | string|null | Una señal de frescura. En REST actualmente es el mismo valor que updated_at — todavía no existe una marca de tiempo de precio en vivo separada almacenada por fila, así que trátalo como "última escritura en este par", no como "último tick de precio". En el stream de WebSocket markets:*, ambos tipos de frame (market y price) llevan el instante de captura real. Null solo si la fila tampoco tiene updated_at. |
links | object | { kalshi, polymarket } URLs de la plataforma. polymarket es null hasta que haya disponible una forma de enlace estable. |
Outcomes
Cada entrada en outcomes es un resultado de mercado (por ejemplo, un equipo) con sus precios en ambas plataformas:
| Campo | Tipo | Significado |
|---|---|---|
key / name | string | La etiqueta del resultado, como un nombre de equipo. |
kalshi | number|null | El precio ask en Kalshi, de 0 a 1. Null si no está disponible; nunca 0 para indicar ausencia. |
polymarket | number|null | El precio ask en Polymarket, de 0 a 1. Null si no está disponible. |
cheaper | string|null | La plataforma con el ask más bajo para este resultado, "kalshi" o "polymarket". Null si alguno de los lados no tiene precio. |
Con include=depth, cada resultado también lleva kalshi_book y polymarket_book, objetos hermanos con ask, depth, y el ticker o id de token de la plataforma. Estos nunca reemplazan a los campos de precio escalares kalshi / polymarket.
Status
| Valor | Significado |
|---|---|
open | Emparejado y seguido activamente (cubre internamente tanto los pares active como los de banda review). |
live | Reservado para partidos en curso. Aún no servido; ninguna fila devuelve live hoy. |
closed | Retractado sin veredicto de resolución registrado. |
settled | Retractado con un veredicto de resolución registrado; result está poblado. |
Solo las filas con status open llevan un signal distinto de spread. Una fila que no está open siempre fuerza signal a spread y potential_arb_pct a null, sin importar qué precios tenga adjuntos.
Signal
signal etiqueta la relación de resolución que el motor de coincidencia encontró para el mercado, re-derivada en cada solicitud a partir de la fila y los precios actuales. Nunca se confía en una etiqueta cacheada.
| Valor | Significado |
|---|---|
"arb" | Ganado. Todo lo siguiente: status es open con 2 o más confirmaciones, paridad de resolución confirmada, ningún riesgo de severidad high o critical en el conjunto completo de riesgo interno del par, y cada resultado con precio en ambas plataformas. potential_arb_pct está poblado. |
"spread" | Todo lo que no es un arb confirmado. Incluye un partido correctamente emparejado con riesgo de resolución divulgado, una fila de catálogo sin precio, o un candidato en banda de revisión. Lee settlement.risks (vía include=settlement o /v2/pairs/{market_id}) antes de tratar una fila spread como operable en absoluto. |
Los settlement.risks servidos nunca incluyen eventos de cancelación (cancel_*); esos se filtran del lado del servidor, mientras que las puertas de signal siguen evaluando el conjunto interno completo. Una fila arb aún puede llevar una entrada acotada que no sea de cancelación y que no rompa la paridad de resolución normal, así que arb no implica un risks[] vacío. Lee siempre el bloque de resolución antes de actuar.
Cómo se producen estas puntuaciones, incluida la pasada de coincidencia, el límite difuso, y la puerta de promoción automatizada, se cubre en Coincidencia y confianza.
Sobre el WebSocket
El objeto de mercado viaja por los canales markets:* como frames planos: un frame market (el objeto canónico completo, en un cambio de estado) y un frame price (un delta compacto indexado por la key del resultado, en un movimiento de precio). Ambos tipos de frame están documentados en la página del stream de WebSocket.
Arranque desde REST
GET /v2/markets no lleva un campo de offset de stream. No hay as_of_offset en v2. Para empezar con una imagen completa y luego mantenerte en vivo: lee /v2/markets?signal=arb para los arbs abiertos ahora mismo, y luego conecta el stream de WebSocket. Los mensajes que llegan después de que te conectas no tienen huecos desde ese punto en adelante; no hay unión de instantánea a offset en v2, así que trata la lectura REST y la conexión del stream como dos vistas independientes. La página del stream de WebSocket cubre cómo conectar y la recuperación tras una desconexión.