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.
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 websocketsimport asyncio, json, os, websockets
async defmain():
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())
// npm install wsimport WebSocket from'ws';
const ws = new WebSocket('wss://pinnfeed.io/v1/stream', {
headers: { 'x-api-key': process.env.PINNSOCKET_KEY }, perMessageDeflate: true,
});
ws.on('open', () => ws.send(JSON.stringify({ type: 'subscribe', sports: ['tennis', 'basketball'] })));
ws.on('message', (buf) => {
const msg = JSON.parse(buf);
if (msg.type === 'ping') return ws.send('{"type":"pong"}');
if (msg.type === 'delta') for (const c of msg.changes) console.log(c.kind, c.op, c.market?.key ?? c.event?.home);
});
# REST snapshot: every live soccer event with main markets
curl -H "x-api-key: $PINNSOCKET_KEY" \
"https://pinnfeed.io/v1/odds?sport=soccer&live=true&main=true"# Closing lines for yesterday (Builder and above)
curl -H "x-api-key: $PINNSOCKET_KEY" \
"https://pinnfeed.io/v1/closing?date=2026-11-08&sport=tennis"