Appliquer snapshot et deltas Pinnacle dans une Map Node
Réponse : après subscribe, appliquez les parties du snapshot dans une Map indexée par id de marché (eventId:key), puis chaque changes[] des deltas (upsert / remove). Client complet : guide Python/Node. Nécessite Builder (99 €/mois).
Logique de fusion#
import WebSocket from "ws";
const markets = new Map(); // id -> market object
const KEY = process.env.PINNFEED_KEY;
function applyChange(ch) {
if (ch.op === "upsert" || ch.type === "upsert") {
const m = ch.market || ch.value;
markets.set(m.id, m);
} else if (ch.op === "remove" || ch.type === "remove") {
markets.delete(ch.id || ch.marketId);
}
}
const ws = new WebSocket("wss://pinnfeed.io/v1/stream", {
headers: { "x-api-key": KEY },
perMessageDeflate: true,
});
ws.on("open", () => {
ws.send(JSON.stringify({
type: "subscribe",
sports: ["soccer"],
markets: ["moneyline"],
main: true,
}));
});
ws.on("message", (buf) => {
const msg = JSON.parse(buf.toString());
if (msg.type === "ping") return ws.send(JSON.stringify({ type: "pong" }));
if (msg.type === "snapshot" || msg.part != null) {
for (const m of msg.markets || []) markets.set(m.id, m);
}
if (msg.type === "delta" && Array.isArray(msg.changes)) {
for (const ch of msg.changes) applyChange(ch);
}
});
Les noms de champs suivent la doc WebSocket. Plans payants : essai de 3 jours ; carte requise, débitée après le jour 3 sauf résiliation.
Voir aussi : snapshot et delta · reconnexion Node · frames bruts (Pro).
Contenu éducatif pour adultes (18+) : ni pronostics ni promesse de gain. En France, seuls les opérateurs agréés par l'ANJ peuvent proposer des paris en ligne.
Questions fréquentes#
Les événements se fusionnent-ils de la même façon ?#
Oui — gardez une seconde Map pour les événements si vous avez besoin des métadonnées home/away ; snapshot et delta peuvent porter les deux.
Pourquoi Builder ?#
Les clés Free/Hobby reçoivent 403 plan_lacks_ws sur le WebSocket. Le polling REST marche en Free ; le push demande Builder ou Pro.