Bet tracker spreadsheet with CLV
Answer: log one row per bet with the price you took, then capture Pinnacle's price for the same outcome twice: when you bet and shortly before kick-off. Closing line value is your price / closing price − 1. You can capture both Pinnacle prices yourself from /v1/odds or /v1/events/{id} on any plan (Free is 30 s delayed), or on Builder read the stored closing record from /v1/closing/{eventId}.
Columns#
| Column | Example | How to fill it |
|---|---|---|
| Date, event, market, outcome | 2026-11-09, Ajax v PSV, moneyline, home | You |
event_id, market_id | 123456, 123456:... | From /v1/odds when you bet |
| My price | 2.30 | The price your book gave you |
| Stake | 10 | You |
| Pinnacle at bet | 2.22 | decimal of that outcome |
| Pinnacle fair at bet | 2.27 | fair of that outcome |
| Pinnacle close | 2.15 | Last price you captured before kick-off |
| CLV | =G2/J2-1 | Your price vs the close |
| Result | won / lost / void | You |
A positive CLV over many bets suggests you are beating the closing price; short-run profit says little either way.
Capture the close yourself (any plan)#
import os, requests
KEY = os.environ["PINNFEED_KEY"] # ps_live_...
def pinnacle_price(event_id: int, market_id: str, outcome: str):
r = requests.get(f"https://pinnfeed.io/v1/events/{event_id}",
headers={"x-api-key": KEY}, timeout=10)
if r.status_code == 404:
return None # event no longer listed (started or finished)
for m in r.json()["event"]["markets"]:
if m["id"] == market_id:
for o in m["outcomes"]:
if o["name"] == outcome:
return o["decimal"], o["fair"]
return None
Run it from a scheduler a few minutes before each start time and write the result into the "Pinnacle close" column. Events disappear from /v1/events/{id} once Pinnacle stops listing them, so capture before kick-off. On Free the value is 30 s delayed.
Or read the stored closing record (Builder)#
GET /v1/closing/{eventId} returns the closing record PinnFeed stored for each market (needs Builder or Pro): closing odds and CLV, Python CLV report.
Plans#
Free (2 sports, 1,000 requests/day, 30 s delay) is enough to log a few bets a day. Builder (€99/mo) adds real-time push and stored closing records. 3-day trial; a card is required and it is charged after day 3 unless you cancel. Sheet setup: Sheets refresh trigger.
Educational content for adults (18+). Track results responsibly; nothing here promises a profit.
Related: MLB CLV tracker.
Questions people ask#
Should CLV use the fair or the raw closing price?#
Both are used. Raw is simpler; fair (no-vig) removes Pinnacle's margin. Pick one and stay consistent.
How many bets before CLV means anything?#
Many: a few dozen bets are noisy. Look at the average over hundreds.
Can I log prices from other books via PinnFeed?#
No. PinnFeed carries Pinnacle only; you enter your own book's price.