pnclFEED Chave gratuita

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.