On the wire · 04:55:10 UTC Live 549 · Prematch 14,380 · Markets 56,929 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Answer · Bettors · CLV

Bet tracker spreadsheet with CLV

Updated · PinnFeed · 2 min read

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#

ColumnExampleHow to fill it
Date, event, market, outcome2026-11-09, Ajax v PSV, moneyline, homeYou
event_id, market_id123456, 123456:...From /v1/odds when you bet
My price2.30The price your book gave you
Stake10You
Pinnacle at bet2.22decimal of that outcome
Pinnacle fair at bet2.27fair of that outcome
Pinnacle close2.15Last price you captured before kick-off
CLV=G2/J2-1Your price vs the close
Resultwon / lost / voidYou

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.

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.

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.