api de odds da pinnacle / node.js / fetch / websockets
API de odds da Pinnacle em Node.js
GET/kit/v1/markets?sport_id=2&since=141
só os eventos alterados200 OK
Um script Node.js curto para a API de odds da Pinnacle sem nada para instalar: um loop de polling no fetch global que pede só o que mudou desde a última chamada e imprime cada money line que se moveu. Exporte sua chave e a URL base da documentação, depois rode-o sem alterações.
Criar uma chave gratuitaConsulte com um cursor
O loop guarda last de cada resposta e o devolve como since, então depois da primeira chamada só chegam eventos alterados. Um 429 traz Retry-After, e o loop espera exatamente esse tempo em vez de travar.
O Node 18 e posteriores trazem fetch globalmente, então o script não tem dependências. Com uma chamada a cada três segundos, as 100 chamadas diárias da chave gratuita duram cinco minutos. Consulte a cada 15 minutos para um teste de dia inteiro, ou passe para o poll com 10 chamadas por segundo.
// Poll the REST feed with a
// since cursor. Node 18+.
const HOST = process.env.ODDS_BASE_URL;
const PATH = "/kit/v1/markets";
const KEY = process.env.ODDS_API_KEY;
const HDRS = {
"x-portal-apikey": KEY,
};
const sleep = (ms) =>
new Promise((r) =>
setTimeout(r, ms));
function moneyLine(ev) {
const p = ev.periods || {};
return (p.num_0 || {}).money_line;
}
async function poll(sportId, ms) {
let since = null;
for (;;) {
const q = new URLSearchParams({
sport_id: String(sportId),
});
if (since !== null)
q.set("since", String(since));
const r = await fetch(
HOST + PATH + "?" + q,
{ headers: HDRS });
if (r.status === 429) {
const w =
r.headers.get("Retry-After");
await sleep(Number(w) * 1000);
continue;
}
if (!r.ok)
throw Error("HTTP " + r.status);
const data = await r.json();
since = data.last;
for (const ev of data.events) {
const ml = moneyLine(ev);
if (ml)
console.log(ev.home, "v",
ev.away, ml);
}
await sleep(ms);
}
}
poll(2, 3000); // 2 = tennis
Selecione o código para copiá-lo.
GET/odds-drop?min_drop=5
conforme os preços caemdata: [alerts]
Escute as quedas a partir do Node
EventSource existe só no navegador, mas um stream SSE é uma requisição HTTP que fica aberta. Envie um header Accept: text/event-stream com fetch e depois leia res.body linha por linha: cada linha data: é um lote JSON de alertas. Um objeto solto em vez de uma lista é uma mensagem de controle: a saudação connected, ou plan_lacks_sse quando o plano da chave não tem stream.
O stream não tem filtro de esporte, então verifique sport conforme os alertas chegam se quiser só alguns esportes. min_drop vai até 1.
Requer push, poll + push ou bulk.
WSS/ws/feed?key=<your key>
subscribeem até 5 s
depois atualizaçõessnapshot
Notas sobre WebSocket
O socket espera uma mensagem de subscribe em até cinco segundos após a conexão. O primeiro frame de cada stream é um snapshot; cada frame seguinte atualiza essa baseline. Responda a cada ping com um pong.
O Node 22 e posteriores expõem um WebSocket global; no 18, o pacote ws fala o mesmo protocolo. Frames perdidos não são reenviados, então após uma desconexão, conecte de novo e comece do novo snapshot. Você pode se inscrever por esporte ou por até 200 IDs de evento por stream.
Requer o complemento WebSocket em poll, poll + push ou bulk.
PRÓXIMOnode node.mjs
Cole, exporte, execute
A chave gratuita roda o script de polling hoje. Quando as quedas ou o socket conquistarem seu lugar no seu código, a página de preços mostra qual plano os adiciona.