On the wire · 12:48:37 UTC Live 56 · Prematch 7,908 · Markets 33,011 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed

Build with AI

Pinnacle odds MCP server

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.

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.

02 · Build with AIWorks with your assistant

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.

03 · Build with AIAsk in plain language

"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.

04 · Build with AISame data and limits as the API

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.

A working client, and what it receives.

# 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())
Delta frame
{
  "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 }
      ]
    }
  }]
}

Pinnacle odds MCP server: common questions

Is the MCP server free?

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.

Which transport does it use?

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.

Try it free today.

Delayed REST data free forever. Real-time WebSocket from $29/mo with a 3-day free trial.

Form K-1 · Free API key

Get your free API key.

No password. We email you a link; click it and your key is on screen.

One free key per email. Link valid for 20 minutes.