pnclFEED Clave gratuita

api de cuotas de pinnacle / websocket / frames en bruto

API WebSocket de Pinnacle: cada frame, tu propio estado

WSS/ws/feed

cada tickframe

El stream SSE de la API de cuotas de Pinnacle envía alertas de caída que el proveedor ya procesó. El WebSocket en bruto envía cada frame, y tu código reconstruye el estado de mercado a partir de ellos. Ves cada precio a medida que se mueve y decides qué cuenta como caída.

Obtener una clave de API

En bruto, no procesado

SSE responde a una pregunta: qué precios cayeron. El socket te entrega el feed completo, así que todo lo que vaya más allá de esa pregunta, libros completos, señales personalizadas, tus propios umbrales de caída, se construye de tu lado a partir de los frames.

El intercambio es trabajo. El estado, los huecos y las reconexiones son tuyos. Las secciones de abajo muestran cada paso.

Qué lleva un frame

El primer frame de cada stream es un snapshot, una línea base completa de los eventos a los que te suscribiste. Cada frame posterior actualiza esa línea base, así que una conexión abierta sustituye a un bucle de sondeo.

Suscríbete por deporte, o por hasta 200 IDs de evento por stream.

WSS/ws/feed?key=<your key>

subscribeen menos de 5 s

snapshot primeroluego actualizaciones

Conecta y autentícate

El socket está junto a la API REST, en el host que lista la documentación. Pasa tu clave como ?key= en la URL del socket, como hace el ejemplo; la cabecera x-portal-apikey también funciona en la solicitud de upgrade. El ejemplo guarda la dirección y la clave en variables de entorno, así que nada secreto queda en el archivo.

Envía un mensaje de suscripción en los cinco segundos siguientes a la conexión o el socket se cierra. Después, responde a cada ping con un pong y lee los frames a medida que llegan.

Necesita el complemento WebSocket en poll, poll + push o 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())

los frames se detienenconexión perdida

WSSconecta de nuevo, suscríbete de nuevo

snapshot nuevoresincronización completa

Recuperación y reconexiones

Los frames perdidos no se repiten. Todo lo que hay entre el último frame que viste y el siguiente snapshot es un hueco en tu estado, y ninguna solicitud de recuperación lo rellenará.

Trata cada snapshot nuevo como una resincronización completa: descarta el estado antiguo, reconstruye desde el snapshot y luego aplica los frames que siguen. Esa única regla mantiene las reconexiones sin sorpresas, ya sea que el socket se cayera o que reiniciaras el proceso.

Mantén el socket activo

El feed envía pings; tu cliente responde con pongs. El ejemplo responde a cada ping con un pong, lo que mantiene viva una conexión inactiva y le dice al servidor que sigues leyendo.

Si los pings dejan de llegar por completo, asume que la conexión está obsoleta: ciérrala, conecta de nuevo y resincroniza desde el snapshot nuevo.

socket, stream o sondeo

Cuándo gana el socket

El sondeo REST encaja con trabajos que se despiertan, preguntan qué cambió desde el cursor y se detienen. SSE encaja con las alertas: el proveedor vigila cada precio y envía las caídas que encontró. El WebSocket en bruto encaja con cualquier cosa que necesite todo el mercado todo el tiempo, porque cada frame llega a ti y tu propio estado responde de inmediato.

Los tres pueden convivir en un mismo stack. La página de Python tiene un bucle de sondeo y un oyente SSE junto a este lector.

Lo que cuesta el complemento por 30 días y cómo se comporta tras una desconexión se detalla en la página de WebSocket en pnclODDS.

Qué transporte encaja con qué trabajo.

TrabajoTransporte
Comprobaciones ocasionales, cron, hojas de cálculoSondeo REST con cursor since
Alertas de caída, procesadas para tiStream SSE
Estado completo del mercado, cada precioWebSocket en bruto

GET/pinnacle-odds-api-pricing/

Qué cuesta el socket

El WebSocket en bruto es un complemento de 99 USD cada 30 días, además de poll (99 USD al mes), poll + push (149 USD al mes) o bulk (229 USD al mes). No está disponible en push, y la clave gratuita es solo REST.

La página de precios muestra los cinco planes y el complemento uno junto a otro.

SIGUIENTEpython ws.py

Conserva cada frame

Elige un plan que admita el complemento, exporta la dirección y la clave, y el script de arriba funciona tal cual. La página de precios muestra qué planes lo admiten.