Odds API for tipsters
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
- 548 live · 14,368 prematch events on the feed now · last Pinnacle update 1 s ago · status
- 13 sports, live + prematch
- Docs open, no signup to read
- Hosted MCP server for Claude, Cursor, ChatGPT
- Lowest monthly price we found for a live + prematch Pinnacle odds WebSocket (Nov 2026)
- Operated by Blackline Solutions, S.L. · Madrid, Spain
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#
- Pick: find the market with
/v1/odds?sport=…&q=<team>(odds by team name). - Stamp: save
eventId,market.id, outcome name,decimal,fair,maxStakeand the time. - Close: capture the last price before the start, or on Builder read
/v1/closing/{eventId}. - 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#
| Need | Plan |
|---|---|
| A few picks a day, delay acceptable | Free (30 s delay, 2 sports) |
| Real-time stamps on 3 sports | Hobby (€29/mo) |
| All sports, push alerts, stored closing records | Builder (€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.