On the wire · 04:45:55 UTC Live 550 · Prematch 14,363 · Markets 56,936 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Antwort · Python · WebSocket

Pinnacle-Quoten-WebSocket: Python-Beispiel

Aktualisiert am · PinnFeed · 2 Min. Lesezeit

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.

Der WebSocket-Plan: Builder, 99 €/Monat.

Pinnacle-Quoten in Echtzeit über einen einzigen WebSocket: alle 13 Sportarten, alle Märkte, faire Quoten ohne Marge und Schlussquoten. 3 Tage kostenlos, mit einem Klick kündbar.

Form K-1 · Free API key

Get your free API key.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

One free key per email. Link valid for 20 minutes.