Notas de quickstart
Lee el feed WebSocket de Pinnacle en Node.js
El contrato del WebSocket en Node: conecta, suscríbete en cinco segundos, responde a los pings y lee el snapshot antes de las actualizaciones.
El quickstart de WebSocket de este sitio está escrito en Python. El contrato es idéntico desde Node.js, y el Node moderno trae un cliente WebSocket incorporado, así que el lector entero cabe en un archivo sin dependencias. Aquí está la misma conexión, traducida.
El contrato, edición Node
El socket está junto a la API REST y acepta tu clave en la URL como ?key=, con la forma de cabecera también aceptada en la solicitud de upgrade, como documenta la página de WebSocket, verificado el 2026-10-04. Tres reglas sostienen la sesión: envía un mensaje de subscribe dentro de cinco segundos de conectar o el socket se cierra; el primer frame de cada stream es un snapshot y todo lo demás es una actualización; responde a cada frame ping con un pong.
El lector en un solo archivo
const WS = process.env.ODDS_WS_URL;
const KEY = process.env.ODDS_API_KEY;
function main() {
const ws = new WebSocket(`${WS}?key=${KEY}`);
const SUB = JSON.stringify({ type: "subscribe",
streams: ["live"], sport_ids: [1, 2] });
const PONG = JSON.stringify({ type: "pong" });
ws.addEventListener("open", () => ws.send(SUB));
ws.addEventListener("message", (ev) => {
const f = JSON.parse(ev.data);
if (f.type === "ping") ws.send(PONG);
else if (f.type === "snapshot")
console.log("baseline", (f.events || []).length);
else console.log(f.type, f);
});
ws.addEventListener("close", () => setTimeout(main, 5000));
}
main();
El manejador de open debe enviar el subscribe inmediatamente, porque la ventana de cinco segundos empieza cuando empieza la conexión. El mensaje de subscribe nombra streams e IDs de deporte; puedes suscribirte por hasta 200 IDs de evento por stream en su lugar, según la misma página.
Leyendo el primer minuto
Un primer minuto sano tiene una forma. El socket se abre, tu subscribe sale dentro de la ventana, y el snapshot llega cargando la línea base de todo lo que suscribiste. Las actualizaciones llegan luego conforme cambian los precios, al ritmo que el tablero se mueva. Los tramos tranquilos entre frames son normales; los frames de ping son el latido intermedio, y cada uno quiere su pong.
Si el socket se cierra en los primeros segundos, el sospechoso habitual es un subscribe que salió tarde o nunca salió. Revisa el manejador de open antes que cualquier otra cosa.
Antes de ejecutarlo
Dos comprobaciones primero. El complemento: los frames en bruto necesitan el add-on de WebSocket en un plan poll, poll + push o bulk, como lista la página de precios, verificado el 2026-10-04. Y el hábito de la línea base: hagas lo que hagas con los frames de actualización, construye tu estado desde el snapshot primero, porque una reconexión te entrega un snapshot nuevo e invalida el viejo.
De leer a mantener estado
Imprimir frames es la prueba de humo. El consumidor real mantiene un mapa de estado de eventos, aplica cada actualización sobre él, y trata cada reconexión como un reinicio completo. Las notas de recuperación de la versión Python aplican sin cambios; solo difiere la librería.
Un socket, un subscribe, snapshot primero. Node lee el stream exactamente como Python, un frame cada vez.