01 · Build with AIEight tools, one URL
get_account, list_sports, search_events, get_live_odds, get_prematch_odds, get_event, get_drops and get_closing_odds — over Streamable HTTP at https://pinnfeed.io/mcp, authenticated with your PinnFeed key.
Build with AI
Give your AI assistant live sharp prices. PinnFeed runs a hosted Model Context Protocol server at /mcp: add one URL and your API key, and Claude, Cursor, Copilot, Codex or ChatGPT can query live Pinnacle odds, odds drops and closing lines on their own.
get_account, list_sports, search_events, get_live_odds, get_prematch_odds, get_event, get_drops and get_closing_odds — over Streamable HTTP at https://pinnfeed.io/mcp, authenticated with your PinnFeed key.
One command for Claude Code, a JSON block for Cursor and VS Code, a config entry for Codex CLI, and a connector URL for Claude and ChatGPT. The dashboard fills every snippet with your key and plan.
"Which NBA spreads moved most in the last 15 minutes?", "Show the no-vig price for Arsenal v Chelsea", "Compare tonight's closing lines with my bets" — the assistant calls the right tool and reads normalized JSON.
MCP tool calls use your plan: sports, real-time or delayed data, rate limits. Each call counts as one REST request, so you can mix code and AI on one key.
# 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 }
]
}
}]
}Yes, on every plan including Free (delayed data, two sports). Paid plans get real-time prices; every paid plan starts with a 3-day free trial.
Streamable HTTP (MCP spec 2025-06-18), stateless JSON responses. Send the key as Authorization: Bearer, x-api-key, or ?key= for clients that cannot set headers.
Delayed REST data free forever. Real-time WebSocket from $29/mo with a 3-day free trial.