On the wire · 04:57:29 UTC Live 567 · Prematch 14,380 · Markets 56,896 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Resposta · Node · Reconexão

WebSocket de odds da Pinnacle em Node.js com reconexão

Atualizado em · PinnFeed · 2 min de leitura

Resposta: no close, espere min(delay*2, 30000) ms mais um jitter, abra um socket novo, reenvie o subscribe e reconstrua o estado com o novo snapshot (limpe os mapas quando part === 1). Responda sempre ao ping do servidor com {"type":"pong"} ou o servidor fecha a conexão depois de uns 60 s. Exige o plano Builder (€99/mês). Arquivo completo: stream.mjs no guia de Python e Node.

Padrão de reconexão#

// Example — npm install ws; export PINNFEED_KEY=...
import WebSocket from 'ws';

const WS_URL = process.env.PINNFEED_WS || 'wss://pinnfeed.io/v1/stream';
const KEY = process.env.PINNFEED_KEY;
const events = new Map();
const markets = new Map();

function connect(delay = 1000) {
  const ws = new WebSocket(WS_URL, { headers: { 'x-api-key': KEY } });
  ws.on('open', () => {
    delay = 1000;
    ws.send(JSON.stringify({
      type: 'subscribe',
      sports: ['soccer', 'tennis'],
      markets: ['moneyline'],
      main: true,
      specials: false,
    }));
  });
  ws.on('message', (raw) => {
    const msg = JSON.parse(raw);
    if (msg.type === 'ping') return ws.send('{"type":"pong"}');
    if (msg.type === 'snapshot') {
      if (msg.part === 1) { events.clear(); markets.clear(); }
      msg.events.forEach((e) => events.set(e.id, e));
      msg.markets.forEach((m) => markets.set(m.id, m));
      if (msg.final) console.log(`book ready: ${events.size} events, ${markets.size} markets`);
    }
    // apply deltas the same way as in the full stream.mjs
  });
  ws.on('close', (code) => {
    const wait = Math.min(delay * 2, 30000);
    console.log(`closed (${code}); reconnecting in ${wait / 1000}s`);
    setTimeout(() => connect(wait), wait + Math.random() * 1000);
  });
}
connect();

O código de fechamento 1001 (server_shutdown) indica um deploy: reconecte com backoff (docs do WebSocket). Evite o efeito manada: o jitter importa.

Planos#

Comece com o Builder. Teste de 3 dias; é preciso cartão e a cobrança acontece depois do dia 3, se você não cancelar. Relacionado: exemplo em Python.

Conteúdo educativo para maiores de 18 anos. Sem palpites nem lucro garantido. No Brasil, aposte apenas em operadores autorizados pela SPA/MF.

Perguntas frequentes#

Reaproveito o mesmo Map entre reconexões?#

Limpe-o na primeira parte do snapshot (part === 1). Senão você mantém mercados que o novo snapshot não menciona mais.

O Hobby pode reconectar ao stream?#

O Hobby não tem WebSocket. Você recebe 403 plan_lacks_ws antes de qualquer lógica de reconexão rodar.

O plano WebSocket: Builder, €99/mês.

Odds da Pinnacle em tempo real por um único WebSocket: os 13 esportes, todos os mercados, odds justas sem margem e odds de fechamento. 3 dias grátis, cancele com um clique.

Form K-1 · Free API key

Get your free API key.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

One free key per email. Link valid for 20 minutes.