On the wire · 04:54:17 UTC Live 549 · Prematch 14,380 · Markets 56,913 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Respuesta · Node · Reconexión

WebSocket de cuotas Pinnacle en Node.js con reconexión

Actualizado el · PinnFeed · 2 min de lectura

Respuesta: en close, espera min(delay*2, 30000) ms más un jitter, abre un socket nuevo, reenvía subscribe y reconstruye el estado con el snapshot nuevo (vacía los mapas cuando part === 1). Responde siempre al ping del servidor con {"type":"pong"} o el servidor te cierra tras unos 60 s. Requiere el plan Builder (€99/mes). Archivo completo: stream.mjs en la guía de Python y Node.

Patrón de reconexión#

// 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();

El código de cierre 1001 (server_shutdown) significa un despliegue: reconecta con backoff (docs del WebSocket). Evita la estampida: el jitter importa.

Planes#

Empieza con Builder. Prueba de 3 días; se requiere tarjeta y se cobra después del día 3 salvo que canceles. Relacionado: ejemplo en Python.

Contenido educativo para mayores de 18 años. Sin pronósticos ni ganancias garantizadas. En España, apuesta solo con operadores con licencia de la DGOJ.

Preguntas frecuentes#

¿Reutilizo el mismo Map entre reconexiones?#

Vacíalo con la primera parte del snapshot (part === 1). Si no, conservas mercados que el snapshot nuevo ya no menciona.

¿Hobby puede reconectar al stream?#

Hobby no tiene WebSocket. Recibirás 403 plan_lacks_ws antes de que corra la lógica de reconexión.

El plan WebSocket: Builder, 99 €/mes.

Cuotas de Pinnacle en tiempo real por un único WebSocket: los 13 deportes, todos los mercados, cuotas justas sin margen y cuotas de cierre. 3 días gratis y cancelas con un clic.

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.