Margin removal included
Each market carries its overround (margin) and, per outcome, fairProb and fair — computed with the multiplicative method on the raw Pinnacle price.
Sharp books are the market's best estimate of the true probability. PinnFeed streams Pinnacle prices with the margin already removed, so every outcome arrives with its fair probability and fair decimal price.
Each market carries its overround (margin) and, per outcome, fairProb and fair — computed with the multiplicative method on the raw Pinnacle price.
Compare a soft bookmaker's price against our fair decimal: if theirs is higher, the bet has positive expected value against the sharp line. Our docs include a 10-line example.
Every market includes Pinnacle's maximum stake. Higher limits mean more confidence in the line — useful for weighting signals.
Builder and above store the closing price of every market so you can measure closing-line value on every bet you place.
# 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())// npm install ws
import 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"{
"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 }
]
}
}]
}Multiplicative (proportional) normalization. The raw prices are included so you can apply power, Shin or additive methods yourself.
Yes, player props and futures are available on Builder and above.
Delayed REST data free forever. Real-time WebSocket from $29/mo.