Developers searching for a Pinnacle API mostly want one thing: Pinnacle's lines in their own code, to use as a benchmark. Pinnacle is widely treated as a sharp book, with a reputation for low margins and for taking bets from winning players, so its prices are a common reference for what a fair price is. Whether Pinnacle offers outside developers an API today, who qualifies and on what terms, is for Pinnacle to confirm on its own site. The general alternative is a service that reads the book's public prices and returns them with other books.
ZippyOddsAPI is one of those services, and it's independent: Pinnacle and other sportsbooks don't endorse it, partner with it or have any affiliation with it. This guide covers why a sharp book's line is used as a reference, how to turn it into a fair price, and how ZippyOddsAPI weighs Pinnacle when it's feeding.
What to confirm with the operator
Look for Pinnacle API documentation published by Pinnacle itself, and read the terms that come with it. The questions are the usual ones: whether access is open or by arrangement, which regions it applies to, what you may store, whether you may show the prices to others, and what rate limits apply. Pinnacle doesn't take bets everywhere, so check where it operates and what that means for your use.
Treat third-party code samples and forum threads as unconfirmed. Endpoints, access rules and terms change, and only the operator's own pages are current.
Why a sharp line makes a good reference
A sportsbook's price is two things at once: its estimate of the chance, and its margin. A book with a wide margin and a habit of limiting winners can afford to be slow or wrong. A book that takes large bets from sharp players, at a thin margin, can't. Its prices get corrected quickly by the people betting into them, so they tend to sit close to the true chance.
That's why the closing odds Pinnacle posts are a common yardstick for closing line value: whether the price you took beat the market's last word before kickoff. It's also why a sharp line, with its margin removed, is the usual starting point for a fair price.
A sharp line is still an estimate. It's less reliable in thin markets, on player props and in lower leagues than on a main spread, and a single book can be wrong on any one game.
Turning a sharp line into a fair price
Say the sharp book has a moneyline at -150 and +135.
| Side | Price | Implied chance |
|---|---|---|
| Favorite | -150 | 60.00% |
| Underdog | +135 | 42.55% |
The two add up to 102.55%, so the margin is 2.55%. Divide each side by 1.0255 and the fair chances are 58.51% and 41.49%. As fair prices, that's about -141 and +141.
Now another book has the underdog at +150, a decimal price of 2.50. Its expected value against the fair line is 0.4149 × 2.50 - 1 = 0.0373, or about +3.7% of the stake. At +145 it would be about +1.7%, and anything shorter than +141 would be negative.
Two cautions. The even split is the simplest way to remove a margin, not the most accurate. And a +3.7% edge is an average over many bets: this one still loses nearly 6 times in 10.
How ZippyOddsAPI uses Pinnacle
ZippyOddsAPI doesn't take any single book's word. It builds a fair price from several reference books, each with its own margin removed by Shin's method, averaged by weight. In the docs' reference table, Pinnacle carries the top weight, 100, on all markets, level with Circa Sports. Other references carry 50 or 25. Pinnacle and PS3838 count as one family, because books on one odds platform are one opinion, and a price is never compared with its own book or family.
Every /v1/ev row names the books behind its fair price in references, with reference_observed_at and reference_age_seconds showing how old the oldest one was. Pick'em pricing uses the sharp books too, with Pinnacle and Circa Sports weighted highest, which is how a pick'em line gets a fair chance to compare with the app's payout table. The PrizePicks API guide covers that side.
The age of a reference
A reference is only useful while it's current. The docs note that Pinnacle's public data can be held by its CDN for up to 15 minutes, so a gap against its line can already be gone by the time you see it. ZippyOddsAPI dates each copy from when it was really fetched, gives references their own age limit before the game and a 90-second limit once it starts, and marks a row stale when its reference is too old. The docs give the current limits.
You can ask for Pinnacle's prices directly, when it's feeding:
curl -s "https://zippyoddsapi.com/v1/odds?league=nhl&books=pinnacle&markets=moneyline" \
-H "Authorization: Bearer $ZIPPYODDS_KEY"
Each Pinnacle entry carries updated_at. Check it against meta.generated_at before treating a price as current, and check the coverage page to see whether Pinnacle is feeding at all.
Recording closing lines
/v1/history stores a point each time a full-game moneyline, spread or total changes, and keeps points for 30 days. A market's line is part of its id, so save the market_id of the Pinnacle market you care about while the game is on the board, then read its points and take the last one before start_time. That's the closing price for that line, ready to compare with the price you took.
Further reading
An exchange is the other common reference, priced by its users rather than a house, and the Betfair API guide covers that kind of venue. The sportsbook API guide covers reading any book's prices in code. The ZippyOddsAPI docs explain the references, weights and gates in full, and how to get a key. To work with odds Pinnacle has priced in your own model, start with the fair-price step above and keep the age of every number next to it.