Pinnacle Odds API — Sharp Lines, Limits & Fair Odds
Pricing
from $1.40 / 1,000 odds rows
Pinnacle Odds API — Sharp Lines, Limits & Fair Odds
Pinnacle's moneyline, spread and total for every game, with the maximum stake it will accept on each market and the fair probability with the bookmaker's margin removed. Pinnacle is the sharp reference the rest of the market prices against — no API key, no login.
Pricing
from $1.40 / 1,000 odds rows
Rating
5.0
(1)
Developer
Matvey
Maintained by CommunityActor stats
0
Bookmarked
25
Total users
15
Monthly active users
6 days ago
Last modified
Categories
Share
Pinnacle Odds API returns Pinnacle's moneyline, spread and total for every game it prices, with two numbers almost no other feed carries: the maximum stake Pinnacle will accept on that market, and the fair probability with the bookmaker's margin removed. No API key, no account, no browser.

Pinnacle is the sharp reference book. It runs on low margins and high limits and it does not restrict winning customers, so the rest of the market prices against it. Its number, stripped of margin, is the closest thing to a true probability that a betting market produces.
What is Pinnacle Odds API?
A clean feed of Pinnacle's own board: every game in the leagues you pick, every market on it, both sides priced, with the implied and the fair probability side by side. Two modes: odds (one row per game, market and side) and leagues (what is covered right now).
What makes it different
The limit is data. Pinnacle publishes the maximum it will accept on each market, and that figure says how much the book itself trusts its own number. A line with a low limit is one Pinnacle is unsure about; a full-limit line is one it will happily take money on. Feeds that only copy prices throw that away.
Fair probability, not implied. Both sides of a market always add up to more than 1: the surplus is the margin. Every row carries the raw impliedProbability, the overround, and the fairProbability with the margin split out — a share of 1, summing to 1, which is the number a model should actually consume.
Every price format. American, decimal, fractional or implied probability — set oddsFormat for the price columns; the decimal price is on every row as well.
What data does it return?
| Field | Example |
|---|---|
league, game, startTime, status | nfl · Baltimore Ravens at Indianapolis Colts · … |
market, line | moneyline / spread / total · −3.5 |
homePrice, awayPrice, drawPrice | −165 · +140 · (soccer only) |
overPrice, underPrice | −110 · −110 |
homeDecimal, awayDecimal, overDecimal, underDecimal | 1.606 · 2.40 · … |
homeImpliedProbability, awayImpliedProbability | 0.67 · 0.3623 — shares of 1, and they sum to more than 1 |
homeFairProbability, awayFairProbability | 0.649 · 0.351 — the same two with the margin removed, summing to 1 |
overround | 0.0323 — the book's margin on this market, here 3.2% |
limitUsd | 20,000 — the largest stake Pinnacle will take here |
favorite, sourceUrl | Indianapolis Colts · link to the game |
Alternate lines — the full ladder of spreads and totals, not just the main number — come back when you ask for them.
How much does it cost?
Pay per row, and only for rows you actually get:
| Event | Price |
|---|---|
| Odds row | $0.002 |
| Game (nested output) | $0.006 |
| League row | $0.0005 |
Error rows are never charged. No browser, no proxy — one public JSON API — so platform usage on top is negligible.
| Job | Cost |
|---|---|
| An NFL Sunday, moneyline, spread and total (≈40 rows) | $0.08 |
| Five leagues, moneyline only, once a day for a month | $6.00 |
| A single game's full ladder of alternate lines | $0.20 |
Bulk export: what 50,000 odds rows actually cost
This Actor is built for bulk jobs — put hundreds of inputs into one run, or call it from the API on a schedule. There is no fee per run, no fee per page and no proxy charge: you pay for the rows you keep, and error rows are free. That is what decides the bill once you pull a whole market rather than a single league.
| Job | This Actor | Most-used Actor in this category |
|---|---|---|
| 50,000 odds rows across 100 runs | $100 | $150 |
Checked on the Apify Store on 24 September 2026 against the Actor with the most monthly users in this category ($0.003 per odds row plus a $0.00005 start fee, counted in). Its row is one side of a market, ours carries both sides, so per market the gap is wider than the table shows. Some Actors here ask less per row — this table compares against the one buyers actually use most.
How to use it
- Name your 🏆 Leagues —
nfl,nba,mlb,nhl,epl,ncaafand the rest. - Pick the 📈 Markets: moneyline, spread, total.
- Set 📅 Days ahead, or an explicit date range.
- Choose 🔢 Odds format — American, decimal, fractional or implied probability.
- Click Start, then export as JSON, CSV or Excel, or read the dataset through the API.

⬇️ Input
{"mode": "odds","leagues": ["nfl", "nba"],"markets": ["moneyline", "spread", "total"],"daysAhead": 7,"oddsFormat": "american"}
One game with every alternate line
{ "mode": "odds", "leagues": ["nfl"], "includeAlternateLines": true, "maxItems": 500 }
One row per game instead of one per side
{ "mode": "odds", "leagues": ["epl"], "outputFormat": "nested" }
⬆️ Output
{"type": "odds","league": "nfl","game": "Baltimore Ravens at Indianapolis Colts","startTime": "2026-09-13T17:00Z","market": "moneyline","homeTeam": "Indianapolis Colts","awayTeam": "Baltimore Ravens","homePrice": -203,"awayPrice": 176,"homeDecimal": 1.493,"awayDecimal": 2.76,"homeImpliedProbability": 0.67,"awayImpliedProbability": 0.3623,"homeFairProbability": 0.649,"awayFairProbability": 0.351,"overround": 0.0323,"limitUsd": 20000,"favorite": "Indianapolis Colts","sourceUrl": "https://www.pinnacle.com/en/football/nfl/matchups","scrapedAt": "2026-09-09T13:30:00.000Z"}
A request that fails arrives as a type: "error" row with the reason, never as a silently short list.
Use cases
A reference price for your model
Fair probabilities from the sharpest book are the benchmark every other price is judged against.
Closing line value
Schedule the run and store the line at intervals; the closing number is the standard measure of whether a bet was good.
Comparing your book against the market
Put Pinnacle's fair probability next to whatever price you were offered elsewhere and see who is paying more than the risk deserves.
Limits as a signal
Track limitUsd through the week: limits rising into kick-off means the book has settled on its number.
AI agents
An agent asked "what are the real odds on this game" reads homeFairProbability straight off the row.
🤖 For AI Agents & LLM Apps
Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (lergassy/pinnacle-odds-api).
Minimal input:
{ "leagues": ["nfl"], "markets": ["moneyline"], "daysAhead": 3 }
Behaviors an agent should know:
- Quote
fairProbability, notimpliedProbability. Both are shares of 1. The implied numbers include the book's margin and sum to more than 1; the fair ones sum to exactly 1. Multiply by 100 before showing a percentage. limitUsdis how much Pinnacle will accept on that market — a confidence signal, not a price.linebelongs to spreads and totals; a moneyline row has none.drawPriceexists only where a draw is possible, which in practice means soccer.- Prices move constantly. Every row carries
scrapedAt; treat a row as a snapshot, not a standing quote. - Set
oddsFormatrather than converting prices yourself. - The Pinnacle guest API is public: no key, no account, no proxy.
Pinnacle API without a key
Pinnacle's own guest endpoints serve matchups and prices as JSON, split across two documents that have to be joined by matchup id — and the market list carries the limits that most feeds discard. This Actor does the join, keeps the limits, and returns one stable row shape per league.
❓ FAQ
Is this betting advice?
No. It reads public odds data and returns it as a table. It places no bets.
Why Pinnacle rather than a retail sportsbook?
Because its margin is small and it does not close winning accounts, so its price reflects what the market actually believes rather than what a book can get away with.
What is the overround?
The amount by which the two sides of a market exceed 1. It is the book's margin — 0.0323 means 3.2% — and removing it gives the fair probability.
Which leagues are covered?
The major US leagues and the main soccer competitions. Run the leagues mode to see the current list.
How fresh are the numbers?
Live at the moment of the run. Schedule the Actor if you want a line-movement history.
Can I use it with the Apify API or an MCP server?
Yes. It runs from the API and the official clients, and AI agents reach it through the Apify MCP server without extra setup.
Your feedback
Missing a league or a market? Open an issue on the Issues tab — every one gets answered.
You might also like
| Actor | What it does |
|---|---|
| Sports Betting Odds API | Several books at once, with arbitrage and value bets |
| DFS Player Props API | PrizePicks and Underdog lines side by side |
| Sports Injury Report API | Who is out, questionable or probable |
| Sports Scores & Schedules API | Live scores and schedules for 33 leagues |
Also known as
People look for this Actor as a Pinnacle API, Pinnacle odds scraper, sharp odds data, closing line value data, fair odds, no-vig odds and betting limits data.
Use via API
Run this Actor from your own code or pipeline. Get your token in Apify Console → Settings → API & Integrations. Every input field below has the same name as in the JSON tab of the input form.
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("lergassy/pinnacle-odds-api").call(run_input={"mode": "odds","leagues": ["nfl","nba","epl"],"daysAhead": 7})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('lergassy/pinnacle-odds-api').call({"mode": "odds","leagues": ["nfl","nba","epl"],"daysAhead": 7});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
cURL (runs the Actor and returns the results in one call)
curl -X POST "https://api.apify.com/v2/acts/lergassy~pinnacle-odds-api/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"mode": "odds", "leagues": ["nfl", "nba", "epl"], "daysAhead": 7}'