api de odds da pinnacle / curl / jq / primeira requisição
API de odds da Pinnacle com curl e jq
GET/kit/v1/markets?sport_id=1
{ events, last }200 OK
A primeira requisição à API de odds da Pinnacle não precisa de nada além de um terminal. Uma chamada curl com a chave em um cabeçalho devolve o quadro inteiro de futebol em JSON, e o jq o transforma em uma linha por partida. O script roda como está assim que as duas variáveis do topo são definidas.
Criar uma chave gratuitaLeia o envelope antes dos preços
A resposta é um objeto, não uma lista: um array events e um cursor last. O primeiro filtro jq imprime os dois, que é a verificação mais rápida de que a chave funciona e o quadro está ativo. Cada evento guarda seus mercados sob períodos; num_0 é a partida completa, e seu money_line traz casa, empate e fora como odds decimais.
Envie last de volta como since e a próxima chamada devolve só os eventos que mudaram. A chave gratuita permite 20 chamadas por minuto e 100 por dia, então um loop que roda a cada 15 minutos cabe nela o dia inteiro; um 429 traz Retry-After, e a reação certa é esperar exatamente esse tempo.
# One request, then jq. The key
# and base URL come from your
# account and the docs.
export ODDS_API_KEY="your key"
export ODDS_BASE_URL="https://..."
URL="$ODDS_BASE_URL/kit/v1/markets"
H="x-portal-apikey: $ODDS_API_KEY"
# Soccer board: cursor and count.
curl -s -H "$H" "$URL?sport_id=1" \
| jq '{last, n: (.events | length)}'
# One line per event: full-match
# money line (period 0).
curl -s -H "$H" "$URL?sport_id=1" \
| jq -r '.events[]
| [.home, .away,
.periods.num_0.money_line.home,
.periods.num_0.money_line.draw,
.periods.num_0.money_line.away]
| @tsv'
# Next call: only what changed.
LAST=$(curl -s -H "$H" \
"$URL?sport_id=1" | jq .last)
curl -s -H "$H" \
"$URL?sport_id=1&since=$LAST" \
| jq '.events | length'
Selecione o código para copiá-lo.
GET/api/drops?mode=live&min_drop_pct=5
{ total, drops }200 OK
Quedas recentes, sob demanda
O endpoint de quedas devolve os movimentos que o feed detectou nos últimos minutos como JSON simples, então um script de shell pode listar o que caiu sem manter um stream aberto. mode escolhe ao vivo ou pré-jogo, min_drop_pct o tamanho do movimento e max_age_sec a janela. Cada queda nomeia a partida, o mercado e o lado, traz o preço antes e depois, a porcentagem e o preço justo em nvp.
É a mesma detecção que alimenta o stream SSE, lida sob demanda em vez de enviada. Para um processo que deve reagir no momento em que um preço cai, a página de Python mantém o stream aberto.
# Drops of 5% or more in the last
# five minutes, live markets.
URL="$ODDS_BASE_URL/api/drops"
H="x-portal-apikey: $ODDS_API_KEY"
curl -s -H "$H" \
"$URL?mode=live&min_drop_pct=5" \
| jq -r '.drops[]
| "\(.sport_name) \(.home) v \(.away)
\(.market) \(.side): \(.from) -> \(.to)
(\(.drop_pct)%) fair \(.nvp // "n/a")"'
Selecione o código para copiá-lo.
GET/kit/v1/markets?sport_id=1
Retry-After: 2429
O que os outros status significam
O curl imprime o status com -w '%{http_code}'. Um 401 significa que o cabeçalho está faltando ou a chave está errada; um 403 significa que a chave está certa mas o plano não inclui o que você pediu; um 429 significa esperar o número de segundos em Retry-After. Nada mais vale a pena repetir mais do que umas duas vezes a partir de um shell.
Quando as chamadas funcionam à mão, o mesmo cabeçalho e cursor vão para qualquer linguagem que o projeto use; a página de Node.js é a versão em loop deste script. O runbook de erros no pnclENGINE cobre cada status a fundo.
Todos os planos, inclusive a chave gratuita.
PRÓXIMObash curl.sh
Duas variáveis, um script
A chave gratuita executa todas as requisições desta página. Quando um loop precisa de mais de 100 chamadas por dia, a página de preços mostra o plano que eleva o limite para 10 por segundo.