Skip to content

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 son null. signal=arb devuelve las mismas filas con precio de la instantánea en vivo, filtradas a arbs confirmados.
  • GET /v2/pairs/{market_id}: un mercado por id, con include=ids,depth,settlement aplicado 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

CampoTipoSignificado
idstringEl id canónico estable, dino_<uuid>. Úsalo para llamar a GET /v2/pairs/{market_id}.
slugstring|nullUn identificador de nombre limpio. Aún no poblado; siempre null hoy.
sportstringLa clave de deporte amplia.
leaguestring|nullLa competición dentro del deporte, como MLB. Null cuando la serie de la plataforma no nombra ninguna.
titlestring|nullUn título de mejor esfuerzo construido a partir de los identificadores de equipo emparejados.
home / awaystring|nullAún no poblado; siempre null hoy.
start_timestring|nullInicio en ISO-8601 UTC.
statusstringopen, live, closed, o settled. Ver Status.
matchstringLa etiqueta de confianza de coincidencia. Actualmente siempre high_confidence en las filas servidas.
signalstring"arb" o "spread". Ver Signal.
spread_ptsnumber|nullBrecha máxima entre plataformas por resultado, en puntos porcentuales. Null a menos que cada resultado tenga precio en ambas plataformas.
potential_arb_pctnumber|nullEl 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.
coverageobject{ kalshi, polymarket }, cada uno true solo si cada resultado tiene precio en esa plataforma.
outcomesarrayPrecio por resultado. Ver Outcomes. Vacío cuando la fila no tiene precio.
resultobject|nullVeredicto de resolución, poblado solo una vez que status es settled.
updated_atstring|nullCuándo el motor de coincidencia volvió a analizar por última vez la identidad y los términos de resolución de este par.
priced_atstring|nullUna 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.
linksobject{ 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:

CampoTipoSignificado
key / namestringLa etiqueta del resultado, como un nombre de equipo.
kalshinumber|nullEl precio ask en Kalshi, de 0 a 1. Null si no está disponible; nunca 0 para indicar ausencia.
polymarketnumber|nullEl precio ask en Polymarket, de 0 a 1. Null si no está disponible.
cheaperstring|nullLa 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

ValorSignificado
openEmparejado y seguido activamente (cubre internamente tanto los pares active como los de banda review).
liveReservado para partidos en curso. Aún no servido; ninguna fila devuelve live hoy.
closedRetractado sin veredicto de resolución registrado.
settledRetractado 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.

ValorSignificado
"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.