pnclFEED Chave gratuita

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 API

Bruto, 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.

ws.py
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())

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.

TarefaTransporte
Verificações ocasionais, cron, planilhasPolling REST com cursor since
Alertas de queda, processados para vocêStream SSE
Estado completo do mercado, cada preçoWebSocket 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.