On the wire · 05:12:37 UTC Live 587 · Prematch 14,342 · Markets 57,372 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Answer · Bots · Architecture

Sports betting bot architecture on Pinnacle odds

Updated · PinnFeed · 2 min read

Answer: most betting or trading bots have five parts: (1) a data feed, (2) a local state of events and markets, (3) signal rules, (4) risk checks, and (5) execution on the account you bet with. PinnFeed fills part 1 and helps with 2–3: a WebSocket (Builder) that sends a full snapshot and then delta frames with every Pinnacle price change, including fair, margin and maxStake. It does not place bets; execution is yours, on a book that allows it, where betting is legal for you.

The pipeline#

PartWhat it doesWith PinnFeed
IngestKeep one connection open, answer ping with pong, reconnect with backoffwss://pinnfeed.io/v1/stream (Python, Node)
StateMap of market.id → latest market; drop on op: "remove"snapshot/delta
SignalsPrice drop, offer above fair, line changesteam, EV screen
RiskStake caps, maxStake >= 100, max exposure per event, kill switchYour code
ExecutionPlace the bet, log price and resultYour bookmaker or exchange

Minimal signal loop (Python)#

book = {}                                   # market id -> market

def on_frame(msg, alert):
    if msg["type"] == "snapshot":
        for m in msg["markets"]:
            book[m["id"]] = m
    elif msg["type"] == "delta":
        for ch in msg["changes"]:
            if ch["kind"] != "market":
                continue
            if ch["op"] == "remove":
                book.pop(ch["id"], None)
                continue
            new, old = ch["market"], book.get(ch["market"]["id"])
            book[new["id"]] = new
            if not old or (new["maxStake"] or 0) < 100:
                continue
            for o_new, o_old in zip(new["outcomes"], old["outcomes"]):
                if o_old["decimal"] and o_new["decimal"] / o_old["decimal"] - 1 <= -0.04:
                    alert(new["eventId"], o_new["name"], o_old["decimal"], o_new["decimal"])

Plug on_frame into any client from the language pages (Go, Rust, Kotlin). Log every signal and decision so you can measure it later against the close: bet tracker with CLV.

Design tips#

  • Run ingest on an always-on host, not a serverless function.
  • Keep a paper mode that logs what the bot would do before it bets anything.
  • Use one WebSocket per process and fan out internally; Builder allows 3 connections, Pro 10.
  • Handle 4008 slow_consumer by moving work off the receive loop.

Plans#

Builder (€99/mo): WebSocket, all 13 sports, all markets. Pro (€199/mo): 10 connections and raw frames. 3-day trial; a card is required and it is charged after day 3 unless you cancel. Prototype on Free REST first: signup.

Educational content for adults (18+). Automated betting can lose money quickly; no tips, no guaranteed profit.

Related: startup MVP on Pinnacle odds, open-source betting bot, algorithmic sports betting.

Questions people ask#

Can PinnFeed place bets for my bot?#

No. It is read-only data. Execution happens on your own bookmaker or exchange account.

Is a bot allowed by bookmakers?#

Many books restrict automated betting in their terms. Check before you automate execution.

Can I build it with an AI coding tool?#

Yes: build a betting bot with Cursor and vibe coding.

The WebSocket plan: Builder, €99/mo.

Real-time Pinnacle odds pushed over one WebSocket, all 13 sports, every market, no-vig fair odds and closing lines. 3 days free, cancel in one click.

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.