On the wire · 04:33:37 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 · Tipsters

Odds API for tipsters

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: tipsters use PinnFeed to attach an independent reference price to every pick. When you post a selection, store Pinnacle's decimal, fair and maxStake for that outcome with a timestamp; before kick-off, store the last Pinnacle price again (or read the closing record on Builder). Your record then shows the price you advised, the market's price at that moment and the closing line value, which followers can check instead of trusting screenshots.

The workflow#

  1. Pick: find the market with /v1/odds?sport=…&q=<team> (odds by team name).
  2. Stamp: save eventId, market.id, outcome name, decimal, fair, maxStake and the time.
  3. Close: capture the last price before the start, or on Builder read /v1/closing/{eventId}.
  4. Report: CLV = advised price / closing price − 1, averaged over all picks.

Ready-made sheet: bet tracker with CLV.

Snippet: stamp a pick#

import os, json, time, requests
KEY = os.environ["PINNFEED_KEY"]  # ps_live_...

def stamp(sport, team, outcome="home", market="moneyline"):
    r = requests.get("https://pinnfeed.io/v1/odds", headers={"x-api-key": KEY}, timeout=10,
                     params={"sport": sport, "q": team, "market": market, "main": "true"})
    e = r.json()["events"][0]
    m = next(m for m in e["markets"] if m["period"] == 0)
    o = next(o for o in m["outcomes"] if o["name"] == outcome)
    rec = {"ts": int(time.time()), "eventId": e["id"], "marketId": m["id"], "match": f'{e["home"]} v {e["away"]}',
           "outcome": outcome, "pinnacle": o["decimal"], "fair": o["fair"], "maxStake": m["maxStake"]}
    with open("picks.jsonl", "a") as f:
        f.write(json.dumps(rec) + "\n")
    return rec

What you may publish#

Posting the prices that belong to your picks (a few prices, fair odds, edges, charts) inside your own channel or site is a derived display, allowed under the Acceptable Use Policy. Re-publishing the full feed for others to consume is not.

Which plan#

NeedPlan
A few picks a day, delay acceptableFree (30 s delay, 2 sports)
Real-time stamps on 3 sportsHobby (€29/mo)
All sports, push alerts, stored closing recordsBuilder (€99/mo)

Paid plans: 3-day trial; a card is required and it is charged after day 3 unless you cancel.

For adults (18+). Publish results honestly, including losing runs; CLV is evidence, not a promise of profit.

Questions people ask#

Does a positive CLV prove a tipster is profitable?#

No. It is a better signal than short-term results, but only over many picks, and it is not a guarantee.

Can followers verify my stamps?#

They can compare your stamped price with the public line history they trust; publish timestamps and the source (Pinnacle via PinnFeed).

Is PinnFeed affiliated with Pinnacle?#

No. It is an independent feed of Pinnacle prices.

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.