Pinnacle API alternative

Pinnacle odds API

Pinnacle closed its public API in July 2025. PinnFeed gives developers the same sharp prices again — live and prematch, every line and period — through a clean WebSocket and REST API.

01Pinnacle API alternative

Why Pinnacle prices matter

Pinnacle runs a low-margin, high-limit book that welcomes winning players, so its lines move fast and close sharp. That makes its odds the reference point for value betting, arbitrage, trading models and closing-line-value (CLV) tracking.

02Pinnacle API alternative

What you get

Every Pinnacle market we can see — moneyline / 1X2, handicaps including quarter lines, totals, team totals, every period — normalized into events and markets with stable ids, decimal and American odds, max stake and a no-vig fair price per outcome.

03Pinnacle API alternative

How it is delivered

Subscribe to a WebSocket with filters for sport, league, market and live/prematch and receive a snapshot followed by delta-only updates. Or call REST snapshot endpoints from a cron job. Both use the same schema.

04Pinnacle API alternative

Migrating from the old Pinnacle API

The old Pinnacle API returned fixtures and odds in separate polling calls with a since cursor. With PinnFeed you open one socket and receive merged events and markets in real time — see the quickstart for a 20-line client.

# pip install websockets
import asyncio, json, os, websockets

async def main():
    url = "wss://pinnfeed.io/v1/stream"
    async with websockets.connect(url, additional_headers={"x-api-key": os.environ["PINNSOCKET_KEY"]}) as ws:
        await ws.send(json.dumps({"type": "subscribe", "sports": ["soccer"], "live": True}))
        async for raw in ws:
            msg = json.loads(raw)
            if msg["type"] == "ping": await ws.send('{"type":"pong"}')
            elif msg["type"] == "delta":
                for c in msg["changes"]:
                    if c["kind"] == "market" and c["op"] == "upsert":
                        m = c["market"]; print(m["key"], [(o["name"], o["decimal"], o["fair"]) for o in m["outcomes"]])

asyncio.run(main())
{
  "type": "delta", "seq": 48213, "ts": 1762679412093,
  "changes": [{
    "kind": "market", "op": "upsert",
    "market": {
      "id": "1640278226:s;0;m", "eventId": 1640278226,
      "type": "moneyline", "period": 0, "main": true, "live": true,
      "margin": 0.0357, "maxStake": 1500,
      "outcomes": [
        { "name": "home", "american": -128, "decimal": 1.781, "fair": 1.845, "fairProb": 0.5421 },
        { "name": "draw", "american": 262,  "decimal": 3.62,  "fair": 3.750, "fairProb": 0.2667 },
        { "name": "away", "american": 405,  "decimal": 5.05,  "fair": 5.230, "fairProb": 0.1912 }
      ]
    }
  }]
}
FAQ

Pinnacle odds API: common questions

Do I need a Pinnacle account?

No. PinnFeed is an independent service; you only need a PinnFeed API key.

Is this the official Pinnacle API?

No. PinnFeed is not affiliated with Pinnacle. We redistribute observed prices for software development and research.

How fresh are the odds?

Paid plans stream in real time, typically well under a second from the source. The free plan is delayed by 30 seconds.

Try it free today.

Delayed REST data free forever. Real-time WebSocket from $29/mo.