pnclFEED Chave gratuita

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 gratuita

Consulte 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.

node.mjs
// 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

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.