Notas de quickstart
Leia o feed WebSocket da Pinnacle em Node.js
O contrato do WebSocket em Node: conecte, subscreva em cinco segundos, responda aos pings e leia o snapshot antes das atualizações. Um arquivo só.
O quickstart de WebSocket deste site é escrito em Python. O contrato é idêntico a partir do Node.js, e o Node moderno traz um cliente WebSocket embutido, então o leitor inteiro cabe num arquivo sem dependências. Aqui está a mesma conexão, traduzida.
O contrato, edição Node
O socket fica ao lado da API REST e aceita sua chave na URL como ?key=, com a forma de cabeçalho também aceita na requisição de upgrade, como a página de WebSocket documenta, verificado em 2026-10-04. Três regras sustentam a sessão: envie uma mensagem de subscribe dentro de cinco segundos após conectar ou o socket fecha; o primeiro frame de cada stream é um snapshot e tudo depois dele é uma atualização; responda a cada frame de ping com um pong.
O leitor num arquivo só
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();
O handler de open deve enviar o subscribe imediatamente, porque a janela de cinco segundos começa quando a conexão começa. A mensagem de subscribe nomeia streams e IDs de esporte; você pode subscrever por até 200 IDs de evento por stream em vez disso, conforme a mesma página.
Lendo o primeiro minuto
Um primeiro minuto saudável tem um formato. O socket abre, seu subscribe sai dentro da janela, e o snapshot chega carregando a baseline de tudo que você subscreveu. As atualizações então chegam conforme os preços mudam, no ritmo em que o board se move. Períodos quietos entre frames são normais; os frames de ping são o batimento no meio, e cada um quer seu pong.
Se o socket fecha nos primeiros segundos, o suspeito usual é um subscribe que saiu tarde demais ou nunca saiu. Confira o handler de open antes de qualquer outra coisa.
Antes de rodar
Duas checagens primeiro. O complemento: frames brutos precisam do add-on de WebSocket num plano poll, poll + push ou bulk, como a página de preços lista, verificado em 2026-10-04. E o hábito da baseline: o que quer que você faça com os frames de atualização, construa seu estado a partir do snapshot primeiro, porque uma reconexão te entrega um snapshot novo e invalida o antigo.
De ler a manter estado
Imprimir frames é o teste de fumaça. O consumidor real mantém um mapa de estado de eventos, aplica cada atualização a ele, e trata toda reconexão como um reset completo. As notas de recuperação da versão Python se aplicam sem mudança; só a biblioteca difere.
Um socket, um subscribe, snapshot primeiro. O Node lê o stream exatamente como o Python, um frame por vez.