On the wire · 04:33:35 UTC Live 548 · Prematch 14,368 · Markets 56,965 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Use case · Data science

Pinnacle odds data for data scientists

Updated · PinnFeed · 2 min read

or start the 3-day Builder trial

Free key: no card. By continuing you agree to the Terms and Privacy Policy. · 3 days free, then €99/mo (VAT incl. where applicable) · card required · charged after day 3 unless you cancel

Answer: PinnFeed gives you Pinnacle prices as clean JSON with the benchmark fields models need: decimal, fairProb (proportional no-vig probability), margin and maxStake per market. Use it two ways: collect your own snapshots from /v1/odds or the WebSocket, and on Builder pull stored closing records per day from /v1/closing?date=YYYY-MM-DD (up to 2,000 rows per page). Bulk historical exports (CSV/Parquet) are an Enterprise option.

Typical tasks#

TaskFields and endpoints
Benchmark a model's probabilitiesfairProb at a fixed time before start (pandas)
Evaluate against the close/v1/closing?date= (Builder) (CLV report)
Study line movementYour own logged WebSocket delta frames (Postgres storage)
Liquidity-aware filtersmaxStake per market
R usershttr2 client

Closing records into a DataFrame (Builder)#

import os, requests, pandas as pd
KEY = os.environ["PINNFEED_KEY"]  # ps_live_...

def closing_day(day, sport="soccer"):
    rows, offset = [], 0
    while True:
        r = requests.get("https://pinnfeed.io/v1/closing", headers={"x-api-key": KEY}, timeout=30,
                         params={"date": day, "sport": sport, "main": "true", "limit": 2000, "offset": offset})
        r.raise_for_status()
        batch = r.json()["closing"]
        rows += batch
        if len(batch) < 2000:
            break
        offset += 2000
    return pd.json_normalize(rows)

df = closing_day("2026-11-08")
print(df[["eventId", "home", "away", "market.type", "market.line", "market.margin"]].head())

Honest limits#

  • Pinnacle only: no other bookmakers, no lineups or player stats.
  • Closing records exist from when PinnFeed started storing them; there is no deep archive on self-serve plans.
  • Your own snapshot history starts when you start logging it.

Which plan#

Free (30 s delay, 2 sports, 1,000 requests/day) is enough to design a schema. Builder (€99/mo) adds the WebSocket, all 13 sports and closing records. Enterprise: bulk CSV/Parquet exports, SLA and a commercial licence. 3-day trial; a card is required and it is charged after day 3 unless you cancel.

Educational content for adults (18+). Research use; no tips, no guaranteed profit.

See also: closing odds into DuckDB and Parquet, historical data vs a live feed, commercial use of the data.

Related: Power BI REST.

Questions people ask#

Can I use the data in a commercial model?#

Using the data inside your own models and products is allowed under the Acceptable Use Policy; redistributing it as a data feed needs Enterprise.

Is fairProb the true probability?#

No. It is Pinnacle's price with the margin removed proportionally, a strong market benchmark rather than ground truth.

Is there a Python SDK?#

No SDK is needed; requests or httpx plus /openapi.json is enough.

The WebSocket plan: Builder, €99/mo.

Real-time Pinnacle odds pushed over one WebSocket, all 13 sports, every market, no-vig fair odds and closing lines. 3 days free, cancel in one click.

Not ready to sign up?

Get the 3-step quickstart (free key, first call, WebSocket) by email.

We email you the quickstart once, now. Nothing else unless you tick the box below; every email has a one-click stop link. Privacy.

18+ only. Odds data for software development; we do not take bets.

Form K-1 · Free API key

Get your free API key.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

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