api de odds da pinnacle / websocket / frames brutos
API WebSocket da Pinnacle: cada frame, seu próprio estado
WSS/ws/feed
cada tickframe
O stream SSE da API de odds da Pinnacle envia alertas de queda que o provedor já processou. O WebSocket bruto envia cada frame, e o seu código reconstrói o estado de mercado a partir deles. Você vê cada preço conforme se move e decide o que conta como queda.
Obter uma chave de APIBruto, não processado
O SSE responde a uma pergunta: quais preços caíram. O socket entrega o feed inteiro, então qualquer coisa além dessa pergunta, livros completos, sinais personalizados, seus próprios limites de queda, é construída do seu lado a partir dos frames.
A troca é trabalho. Estado, lacunas e reconexões são seus. As seções abaixo mostram cada passo.
O que um frame carrega
O primeiro frame de cada stream é um snapshot, uma baseline completa dos eventos em que você se inscreveu. Cada frame seguinte atualiza essa baseline, então uma conexão aberta substitui um loop de polling.
Inscreva-se por esporte ou por até 200 IDs de evento por stream.
WSS/ws/feed?key=<your key>
subscribeem até 5 s
snapshot primeirodepois atualizações
Conecte e autentique
O socket fica ao lado da API REST, no host listado na documentação. Passe sua chave como ?key= na URL do socket, como faz o exemplo; o header x-portal-apikey também funciona na requisição de upgrade. O exemplo mantém o endereço e a chave em variáveis de ambiente, então nada secreto fica no arquivo.
Envie uma mensagem de subscribe em até cinco segundos após conectar ou o socket fecha. Depois disso, responda a cada ping com um pong e leia os frames conforme chegam.
Requer o complemento WebSocket em poll, poll + push ou bulk.
import asyncio
import json
import os
import websockets
WS = os.environ["ODDS_WS_URL"]
KEY = os.environ["ODDS_API_KEY"]
PONG = json.dumps({"type": "pong"})
SUB = json.dumps({
"type": "subscribe",
"streams": ["live"],
"sport_ids": [1, 2],
})
async def handle(ws, f):
kind = f.get("type")
if kind == "ping":
await ws.send(PONG)
elif kind == "snapshot":
ev = f.get("events", [])
print("baseline", len(ev))
else:
print(kind, f)
async def main():
url = f"{WS}?key={KEY}"
ws = await websockets.connect(url)
await ws.send(SUB) # within 5 s
async for raw in ws:
f = json.loads(raw)
await handle(ws, f)
asyncio.run(main())
Selecione o código para copiá-lo.
os frames paramconexão perdida
WSSconecte de novo, inscreva-se de novo
novo snapshotressincronização completa
Recuperação e reconexões
Frames perdidos não são reenviados. Tudo entre o último frame que você viu e o próximo snapshot é uma lacuna no seu estado, e nenhuma requisição de recuperação vai preenchê-la.
Trate cada novo snapshot como uma ressincronização completa: descarte o estado antigo, reconstrua a partir do snapshot e depois aplique os frames seguintes. Essa única regra mantém as reconexões previsíveis, quer o socket tenha caído ou você tenha reiniciado o processo.
Mantenha o socket ativo
O feed envia pings; seu cliente responde com pongs. O exemplo responde a cada ping com um pong, o que mantém uma conexão ociosa viva e diz ao servidor que você ainda está lendo.
Se os pings pararem completamente, assuma que a conexão está obsoleta: feche-a, conecte de novo e ressincronize a partir do novo snapshot.
socket, stream ou polling
Quando o socket vence
O polling REST serve para tarefas que acordam, perguntam o que mudou desde o cursor e param. O SSE serve para alertas: o fornecedor observa cada preço e envia as quedas que encontrou. O WebSocket bruto serve para qualquer coisa que precise do mercado inteiro o tempo todo, porque cada frame chega até você e o seu próprio estado responde imediatamente.
Os três podem conviver em uma stack. A página de Python tem um loop de polling e um listener SSE ao lado deste leitor.
Quanto o complemento custa por 30 dias e como ele se comporta depois de uma desconexão está descrito na página de WebSocket no pnclODDS.
Qual transporte serve para qual tarefa.
| Tarefa | Transporte |
|---|---|
| Verificações ocasionais, cron, planilhas | Polling REST com cursor since |
| Alertas de queda, processados para você | Stream SSE |
| Estado completo do mercado, cada preço | WebSocket bruto |
GET/pinnacle-odds-api-pricing/
Quanto custa o socket
O WebSocket bruto é um complemento de US$ 99 a cada 30 dias, somado ao poll (US$ 99 por mês), poll + push (US$ 149 por mês) ou bulk (US$ 229 por mês). Não está disponível no push, e a chave gratuita é somente REST.
A página de preços coloca os cinco planos e o complemento lado a lado.
PRÓXIMOpython ws.py
Guarde cada frame
Escolha um plano que aceite o complemento, exporte o endereço e a chave, e o script acima roda como está. A página de preços mostra quais planos o aceitam.