On the wire · 04:54:21 UTC Live 549 · Prematch 14,380 · Markets 56,913 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
回答 · Node · 再接続

ピナクルのオッズWebSocketをNode.jsで再接続する

更新日 · PinnFeed · 約1分で読めます

回答: closeのときmin(delay*2, 30000) + jitterミリ秒待ってから新しいソケットを開き、subscribeを送り直し、新しいsnapshotから状態を再構築します(part === 1でマップを空にします)。サーバーのpingには必ず{"type":"pong"}で応答してください。応答しないと約60秒で切断されます。Builderプラン(月額99ユーロ)が必要です。基準となるファイル:PythonとNodeのガイドのstream.mjs。

再接続のパターン#

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

クローズコード1001(server_shutdown)はデプロイを意味します。バックオフ付きで再接続してください(WebSocketドキュメント)。一斉再接続を避けるためにジッターが重要です。

プラン#

Builder:3日間のトライアルがあります。カード登録が必要で、解約しない場合は3日目の後に課金されます。 関連:Pythonの例、snapshotとdelta。

18歳以上の方を対象とした教育目的のコンテンツです。予想や利益の約束ではありません。日本では刑法により賭博は原則として禁止されています。

よくある質問#

再接続のたびに同じMapを使い回すべきですか?#

snapshotの最初のパート(part === 1)で空にしてください。そうしないと、新しいsnapshotに含まれない市場が残ってしまいます。

Hobbyでストリームに再接続できますか?#

HobbyにはWebSocketがありません。再接続のロジックが動く前に403 plan_lacks_wsが返ります。

WebSocketプラン:Builder、月額99ユーロ

ピナクルのオッズを1本のWebSocketでリアルタイムに。全13競技、全マーケット、マージンなしのフェアオッズとクロージングオッズ。3日間無料、ワンクリックで解約できます。

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.