Pinnacle-Quoten-WebSocket: Python-Beispiel
Antwort: installiere websockets, setze PINNFEED_KEY, verbinde dich mit wss://pinnfeed.io/v1/stream und dem Header x-api-key, sende einen subscribe-Frame, wende jeden snapshot und jedes delta an, beantworte ping mit {"type":"pong"} und verbinde mit exponentiellem Backoff neu. Du brauchst den Builder-Tarif (99 €/Monat); Free- und Hobby-Keys erhalten auf /v1/stream den Fehler 403 plan_lacks_ws.
Es ist derselbe Client wie im Python- und Node-Guide; unten steht die minimale lauffähige Form.
Minimaler Client#
pip install websockets
export PINNFEED_KEY="ps_live_..."
# Example — truncated for the page. Full file: see the Python/Node guide.
import asyncio, json, os, random
import websockets
WS = os.environ.get("PINNFEED_WS", "wss://pinnfeed.io/v1/stream")
KEY = os.environ["PINNFEED_KEY"]
async def main():
delay = 1
while True:
try:
async with websockets.connect(WS, additional_headers={"x-api-key": KEY}, max_size=None) as ws:
await ws.send(json.dumps({
"type": "subscribe",
"sports": ["soccer", "tennis"],
"markets": ["moneyline"],
"main": True,
"specials": False,
}))
async for raw in ws:
msg = json.loads(raw)
if msg["type"] == "ping":
await ws.send('{"type":"pong"}')
elif msg["type"] == "snapshot" and msg.get("final"):
print("book ready", len(msg.get("markets", [])), "markets in last part")
delay = 1
elif msg["type"] == "delta":
for c in msg["changes"]:
if c["kind"] == "market" and c["op"] == "upsert":
m = c["market"]
print(m["id"], [(o["name"], o["decimal"], o["fair"]) for o in m["outcomes"]])
except (OSError, websockets.ConnectionClosed) as e:
print("disconnected", e, "retry in", delay, "s")
await asyncio.sleep(delay + random.random())
delay = min(delay * 2, 30)
asyncio.run(main())
Felder je Ausgang: decimal, american, fair (ohne Marge), fairProb. Die Markt-ID ist eventId:key. Alle Frames: WebSocket-Doku. Schema: Schema.
Tarife#
Starte die 3-tägige Builder-Testphase über die Preise (Karte nötig; Belastung nach Tag 3, wenn du nicht kündigst) oder hol dir zuerst einen kostenlosen REST-Key. Siehe auch: Node.js mit Reconnect, Steam-Erkennung.
Bildungsinhalt für Erwachsene (18+). Keine Tipps, kein Gewinnversprechen. In Deutschland nur bei Anbietern auf der GGL-Whitelist wetten.
Häufige Fragen#
Warum bekommt mein Free-Key 403 auf dem WebSocket?#
Free und Hobby sind nur REST. /v1/stream liefert 403 plan_lacks_ws. Wechsle für den Push-Feed zu Builder oder frage /v1/odds ab: Free mit 30 s Verzögerung, Hobby in Echtzeit.
Muss ich Pings beantworten?#
Ja. Der Server sendet etwa alle 20 Sekunden einen ping. Antworte mit {"type":"pong"}, sonst wird der Socket nach rund 60 s ohne Antwort geschlossen.