Skip to content
← Blog

Llevar los datos de Kalshi y Polymarket a un mismo flujo con REST y MCP

dino.markets

Una app que combina Kalshi y Polymarket enseguida acumula trabajo extra: identificadores distintos por plataforma, formas distintas de expresar el resultado y condiciones de resolución que no coinciden entre sí. dino.markets entrega datos de mercados relacionados ya emparejados a través de una REST API y un MCP. Este tutorial arranca con una instantánea por REST y termina explorando el mismo plano de datos desde un cliente MCP.

Este artículo es contenido técnico encargado por Nusantara Ventures LLC, la empresa que opera dino.markets. Trata los precios y los spreads como datos observados: antes de tomar cualquier decisión de trading, verifica por tu cuenta las comisiones, las condiciones de resolución y la disponibilidad de cada plataforma.

Necesitas una clave de API de dino.markets, curl y, si quieres probar MCP, un entorno de desarrollo compatible. Crea la clave de API y revisa el paso de autenticación en la documentación en español.

Primero, una instantánea de mercado con la REST API

La siguiente petición trae las Opportunities de arbitraje confirmadas para MLB. Que la respuesta venga vacía no es un error: solo se devuelven las Opportunities que en ese momento pasan tanto la condición de ejecución como la de resolución.

export DINO_API_KEY="sk_live_..."

curl -sS "https://api.dino.markets/v2/arbitrage?sport=baseball" \
  -H "Authorization: Bearer ${DINO_API_KEY}" | jq '{
    count,
    as_of,
    opportunities: [
      .opportunities[] | {
        id,
        market_id,
        title,
        category,
        market_type,
        sport,
        competition,
        tags,
        edge_pct,
        roi_pct,
        fees_included,
        fee_model,
        max_wager_usd,
        legs
      }
    ]
  }'

En la respuesta, id identifica la Opportunity y market_id sirve para consultar el detalle del mercado. edge_pct y roi_pct son valores de un modelo conservador que ya incluye las comisiones de cada plataforma. fee_model: "conservative_per_contract" calcula la comisión de 1 contract por pierna y la escala hasta el tamaño ejecutable, así que puede diferir del redondeo por cantidad que aplica cada plataforma. max_wager_usd es la estimación de ese capital, y la misma respuesta trae los legs exactos que se seleccionaron. El precio, la profundidad del libro y las reglas de cada plataforma pueden cambiar, así que no trates la instantánea como una garantía de ejecución.

La instantánea de REST llega con un retraso de unos 2 minutos en todos los planes. Funciona bien para paneles de monitoreo, trabajos de análisis o investigación de contenido; no es el plano de datos para enviar órdenes.

Desde código de aplicación se llama al mismo endpoint.

const response = await fetch(
  "https://api.dino.markets/v2/arbitrage?sport=baseball",
  { headers: { Authorization: `Bearer ${process.env.DINO_API_KEY}` } },
);

if (!response.ok) throw new Error(`HTTP ${response.status}`);

const { count, as_of, opportunities } = await response.json();
console.log({ count, as_of, opportunities });

Antes de operar sobre un mercado individual, llama a GET /v2/pairs/{market_id} con el market_id de la Opportunity y revisa los resultados junto con settlement.risks. Si solo te interesa la diferencia de precio, usa GET /v2/spreads.

El mismo plano de datos desde MCP

Con MCP puedes buscar mercados y verificar su detalle desde un cliente compatible o desde la conversación de un agente. La dirección Streamable HTTP es https://api.dino.markets/v2/mcp/, con la barra final incluida.

En un cliente que ejecuta mcp-remote, agrega esto a la configuración.

{
  "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_..." }
    }
  }
}

Guarda la configuración, reinicia el cliente MCP y prueba primero con una tarea de verificación como esta.

Busca MLB con find_markets y usa los ID que encuentres para llamar a get_market. Resume los resultados y el settlement.risks de cada mercado, y no interpretes el precio como una señal de trading.

El MCP público expone 8 herramientas: find_markets, find_arbitrage, list_markets, list_categories, get_market, get_spreads, report_bad_arb y watch_markets. Están disponibles en todos los planes activos. El alcance de suscripción por WebSocket sí varía por plan: Free tiene sample y status, los planes de pago tienen markets:*.

Límites que conviene mantener en la implementación

El emparejamiento existe para que puedas revisar mercados relacionados dentro del mismo flujo de datos. La regla de resolución final de cada mercado la define la propia plataforma. En tu aplicación, no te quedes solo con guardar la respuesta de la API: mostrar el detalle por id, la hora de la consulta y el riesgo de resolución en el mismo lugar hace mucho más fácil investigar después.

dino.markets documenta mercados relacionados de deportes, clima, cripto y economía. Este ejemplo usó el filtro sport=baseball de la API pública para tener un punto de partida fácil de reproducir.

Los endpoints, la autenticación y los filtros de REST están en la documentación en español. Cómo conectar cada cliente MCP está en la documentación de MCP en español. El repositorio público del servidor MCP es dino-markets-mcp.

Más del blog