{"id":3086,"date":"2026-07-03T10:00:00","date_gmt":"2026-07-03T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3086"},"modified":"2026-06-21T15:44:35","modified_gmt":"2026-06-21T15:44:35","slug":"bookmaker-margin-analytics-vig-trends","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/","title":{"rendered":"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python)"},"content":{"rendered":"<p>If you run a book, your margin is your revenue. The overround baked into every market (the vig) is the number that pays the bills. But a margin you never benchmark is a margin you are guessing at. Set it too fat and sharp customers route around you; set it too thin and you leave money on the table. The only honest reference point is the sharp market, measured not once but across the whole pricing window.<\/p>\n<p>This guide shows operators and trading desks how to turn that into a programmatic workflow: compute overround from any book, pull a full Pinnacle vig timeline from <strong>free historical odds<\/strong>, and benchmark your own margin against the sharpest book in the market across 350+ books. Every number below was pulled live before publishing.<\/p>\n<h2>Why a Single Snapshot Lies<\/h2>\n<p>A vig calculator that reads today&#8217;s prices answers &#8220;what is my margin right now.&#8221; That is a spot check, not analytics. Real margin management is a time-series question:<\/p>\n<ul>\n<li><strong>Does your margin hold as the line moves?<\/strong> A disciplined book keeps its overround roughly constant from open through to close, even as the underlying prices swing hard.<\/li>\n<li><strong>How does it compare at open vs in-play?<\/strong> Margins typically compress as a market matures and liquidity arrives. If yours does not, you are mispricing the window.<\/li>\n<li><strong>Where does it sit against the sharp floor?<\/strong> Pinnacle runs one of the tightest margins in the industry. The gap between your overround and theirs is your competitive exposure, customer by customer.<\/li>\n<\/ul>\n<p>You cannot answer any of those from one snapshot. You need history, and OddsPapi gives it away on the free tier.<\/p>\n<h2>The Old Way vs The OddsPapi Way<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Task<\/th>\n<th>Old Way<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Today&#8217;s margin<\/td>\n<td>Manual spreadsheet spot check<\/td>\n<td>One <code>\/odds<\/code> call, computed<\/td>\n<\/tr>\n<tr>\n<td>Margin over time<\/td>\n<td>Log prices yourself for weeks<\/td>\n<td>Free <code>\/historical-odds<\/code>, full price history<\/td>\n<\/tr>\n<tr>\n<td>Sharp benchmark<\/td>\n<td>Eyeball Pinnacle by hand<\/td>\n<td>Pinnacle in the same response<\/td>\n<\/tr>\n<tr>\n<td>Coverage<\/td>\n<td>The books you can scrape<\/td>\n<td>350+ books, one schema<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Overround From Any Set of Prices<\/h2>\n<p>Overround is the sum of the implied probabilities. Subtract 1 and you have the margin. This works for any market, two-way or three-way.<\/p>\n<pre class=\"wp-block-code\"><code>def overround(decimal_prices: list[float]) -> float:\n    \"\"\"Return the bookmaker margin (%) baked into a set of decimal odds.\"\"\"\n    implied = sum(1 \/ p for p in decimal_prices)\n    return round((implied - 1) * 100, 2)\n\n\n# Pinnacle on a pre-game soccer 1X2 market\nprint(overround([2.03, 4.50, 2.98]))   # -> 5.04  (a tight, sharp margin)\nprint(overround([2.05, 3.80, 2.75]))   # -> 11.46 (a fat retail margin)\n<\/code><\/pre>\n<p>Those two lines are the same match. The first is Pinnacle, the second is a major retail book. The retail book is holding more than double the margin on identical outcomes. That gap is the whole point of this post.<\/p>\n<h2>Step 2: Build a Vig Timeline From Free Historical Odds<\/h2>\n<p>The <code>\/historical-odds<\/code> endpoint returns the full price history of a fixture. Unlike the live <code>\/odds<\/code> endpoint, the top key is <code>bookmakers<\/code> and each outcome&#8217;s <code>players[\"0\"]<\/code> is a <strong>list<\/strong> of snapshots, not a single price. Max 3 books per call; auth is the <code>apiKey<\/code> query parameter.<\/p>\n<p>We pulled Pinnacle&#8217;s history on a Norwegian fixture (Raufoss IL vs Sogndal) and got <strong>313 snapshots per outcome<\/strong> spanning a full week from market open through to in-play.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\nparams = {\n    \"apiKey\": API_KEY,\n    \"fixtureId\": \"id1000002267018014\",\n    \"bookmakers\": \"pinnacle\",          # max 3 per call\n}\ndata = requests.get(f\"{BASE}\/historical-odds\", params=params).json()\n\n# Full Time Result = market 101; outcomes 101 Home, 102 Draw, 103 Away\noutcomes = data[\"bookmakers\"][\"pinnacle\"][\"markets\"][\"101\"][\"outcomes\"]\nhistory = {oid: outcomes[oid][\"players\"][\"0\"] for oid in (\"101\", \"102\", \"103\")}\n\nprint(len(history[\"101\"]), \"snapshots\")   # -> 313\n<\/code><\/pre>\n<p>Each outcome moves on its own clock, so to compute overround at any instant you forward-fill the last known price of each leg onto a shared timeline, then sum the implied probabilities.<\/p>\n<pre class=\"wp-block-code\"><code>def price_at(snapshots, t):\n    \"\"\"Last known price at or before timestamp t.\"\"\"\n    last = None\n    for s in snapshots:\n        if s[\"active\"] is False:\n            continue\n        if s[\"createdAt\"] &lt;= t:\n            last = s[\"price\"]\n        else:\n            break\n    return last\n\n\n# Union of all timestamps, then sample the overround across the window\nstamps = sorted({s[\"createdAt\"] for leg in history.values() for s in leg})\nfor t in (stamps[0], stamps[len(stamps)\/\/2], stamps[-1]):\n    legs = [price_at(history[o], t) for o in (\"101\", \"102\", \"103\")]\n    if all(legs):\n        print(t[:19], legs, f\"{overround(legs)}%\")\n<\/code><\/pre>\n<p>The result is the finding that matters to an operator:<\/p>\n<pre class=\"wp-block-code\"><code>2026-06-14T14:12:16  [2.93, 3.61, 2.2]    7.29%   # market open\n2026-06-21T14:28:56  [1.662, 3.9, 4.62]   7.45%   # in-play, prices swinging\n2026-06-21T15:32:44  [1.358, 3.99, 11.95] 7.07%   # latest\n<\/code><\/pre>\n<p>Look at what the prices did: the home leg collapsed from 2.93 to 1.36 as the match developed, the away leg ballooned past 11.0. The odds moved violently. The <strong>margin barely flinched<\/strong>, holding inside a 7.0 to 7.5 percent band the entire week. That discipline is exactly what a sharp book sells, and it is the benchmark you measure your own book against.<\/p>\n<h2>Step 3: Benchmark Your Book Against the Field<\/h2>\n<p>Now scan every book on a fixture and rank them by margin. This is the operator&#8217;s mirror: it shows where your overround sits in the competitive set. We ran it pre-game on a 12-book Icelandic fixture (Valur vs Keflavik).<\/p>\n<pre class=\"wp-block-code\"><code>odds = requests.get(f\"{BASE}\/odds\",\n                    params={\"apiKey\": API_KEY,\n                            \"fixtureId\": \"id1000018868194688\"}).json()\n\nranked = []\nfor slug, book in odds[\"bookmakerOdds\"].items():\n    try:\n        o = book[\"markets\"][\"101\"][\"outcomes\"]\n        legs = [o[x][\"players\"][\"0\"] for x in (\"101\", \"102\", \"103\")]\n    except KeyError:\n        continue\n    if all(p[\"active\"] and p[\"price\"] for p in legs):\n        ranked.append((overround([p[\"price\"] for p in legs]), slug))\n\nfor margin, slug in sorted(ranked):\n    print(f\"{margin:6.2f}%  {slug}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>  5.04%  pinnacle        &lt;- the sharp floor\n  6.13%  draftkings\n  7.68%  fanduel\n  8.34%  sbobet\n  9.62%  betmgm\n 10.53%  hardrockbet\n 10.90%  betrivers\n 11.46%  bet365          &lt;- 2.3x Pinnacle's margin\n<\/code><\/pre>\n<p>Pinnacle anchors the market at 5.04 percent. The retail pack clusters between 9 and 11.5 percent. If you are operating in that pack, this is your map: bettors who price-shop will always find the thinner book, so your fat margin only holds with customers who do not compare. Knowing the exact spread, per market and per fixture, is the difference between a deliberate margin strategy and an accidental one.<\/p>\n<h2>A Note on Cross-Sport Comparison<\/h2>\n<p>Margins vary by sport, but compare like with like. A three-way soccer market (Home\/Draw\/Away) carries a structurally higher summed overround than a two-way market simply because it has an extra outcome. Pinnacle&#8217;s two-way basketball moneyline on AS Monaco vs Paris ran 4.21 percent against the 5.04 percent it held on the three-way soccer market above. To track vig trends across sports, normalise per outcome or hold the market structure constant; never put a two-way and a three-way overround in the same column. For the underlying margin mechanics, see our <a href=\"https:\/\/oddspapi.io\/blog\/vig-calculator-python-sportsbook-margin\/\">vig calculator<\/a>.<\/p>\n<h2>From Snapshot to Strategy<\/h2>\n<p>Two endpoints give an operator a full margin analytics loop: <code>\/odds<\/code> for the live competitive snapshot and the free <code>\/historical-odds<\/code> for the time-series. Wire them on a schedule and you have:<\/p>\n<ul>\n<li><strong>Free historical odds<\/strong> across every fixture, so you backtest your margin policy against real closing markets instead of guessing.<\/li>\n<li><strong>350+ bookmakers<\/strong> in one schema, so the sharp floor and the full retail set are always one call away.<\/li>\n<li>A repeatable benchmark you can run per sport, per market, and per pricing window.<\/li>\n<\/ul>\n<p>Pair this with our <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds calculator<\/a> to de-vig against the whole field, the <a href=\"https:\/\/oddspapi.io\/blog\/clv-sportsbook-line-audit\/\">CLV line audit<\/a> to grade your closing prices, and the <a href=\"https:\/\/oddspapi.io\/blog\/historical-odds-csv-excel-backtesting\/\">historical odds CSV export<\/a> to push the timeline into your own warehouse. The pricing pipeline that feeds all of it is covered in the <a href=\"https:\/\/oddspapi.io\/blog\/sportsbook-odds-feed-websocket-pipeline\/\">WebSocket feed guide<\/a>.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>How do I calculate a bookmaker&#8217;s margin in Python?<\/h3>\n<p>Sum the implied probabilities of every outcome (1 divided by each decimal price), subtract 1, and multiply by 100. For Pinnacle&#8217;s 2.03 \/ 4.50 \/ 2.98 on a soccer 1X2 market that is 5.04 percent. The same formula works for two-way and three-way markets.<\/p>\n<h3>What is the difference between vig and overround?<\/h3>\n<p>They describe the same thing. Overround is the amount by which a book&#8217;s implied probabilities exceed 100 percent; the vig (or juice) is the operator&#8217;s margin that overround represents. A 5 percent overround means a 5 percent built-in margin.<\/p>\n<h3>Can I track how a bookmaker&#8217;s margin changes over time?<\/h3>\n<p>Yes. Use the free <code>\/historical-odds<\/code> endpoint, which returns the full list of price snapshots per outcome. Forward-fill each leg onto a shared timeline and compute the overround at each point. A sharp book like Pinnacle typically holds its margin within a tight band across the whole window.<\/p>\n<h3>Why does OddsPapi historical odds nest prices as a list?<\/h3>\n<p>The historical endpoint returns price history, so <code>players[\"0\"]<\/code> is a list of snapshots (each with a price and createdAt), not the single current price the live <code>\/odds<\/code> endpoint returns. The top-level key is also <code>bookmakers<\/code>, not <code>bookmakerOdds<\/code>. The endpoint accepts a maximum of 3 bookmakers per call.<\/p>\n<h3>Which bookmaker has the lowest margin to benchmark against?<\/h3>\n<p>Pinnacle consistently runs one of the tightest margins in the market and is the standard sharp benchmark. In the 12-book example above it held 5.04 percent where retail books ran 9 to 11.5 percent on the identical fixture.<\/p>\n<h2>Benchmark Your Margin<\/h2>\n<p>Stop guessing where your overround sits. <a href=\"https:\/\/oddspapi.io\/\">Get a free OddsPapi API key<\/a>, pull the sharp market&#8217;s full history, and measure your margin against it across every fixture you price.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\": \"Question\", \"name\": \"How do I calculate a bookmaker's margin in Python?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Sum the implied probabilities of every outcome (1 divided by each decimal price), subtract 1, and multiply by 100. For Pinnacle's 2.03 \/ 4.50 \/ 2.98 on a soccer 1X2 market that is 5.04 percent. The formula works for two-way and three-way markets.\"}},\n    {\"@type\": \"Question\", \"name\": \"What is the difference between vig and overround?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"They describe the same thing. Overround is the amount by which a book's implied probabilities exceed 100 percent; the vig is the operator's margin that overround represents. A 5 percent overround means a 5 percent built-in margin.\"}},\n    {\"@type\": \"Question\", \"name\": \"Can I track how a bookmaker's margin changes over time?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Use the free historical-odds endpoint, which returns the full list of price snapshots per outcome. Forward-fill each leg onto a shared timeline and compute overround at each point. A sharp book like Pinnacle typically holds its margin within a tight band.\"}},\n    {\"@type\": \"Question\", \"name\": \"Why does OddsPapi historical odds nest prices as a list?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"The historical endpoint returns price history, so players['0'] is a list of snapshots, not the single current price the live odds endpoint returns. The top-level key is bookmakers, not bookmakerOdds, and the endpoint accepts a maximum of 3 bookmakers per call.\"}},\n    {\"@type\": \"Question\", \"name\": \"Which bookmaker has the lowest margin to benchmark against?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Pinnacle consistently runs one of the tightest margins in the market and is the standard sharp benchmark. In the 12-book example it held 5.04 percent where retail books ran 9 to 11.5 percent on the identical fixture.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: bookmaker margin\nSEO Title: Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python)\nMeta Description: Benchmark your sportsbook margin against the sharp market over time. Track vig and overround trends in Python with free historical odds from 350+ books.\nSlug: bookmaker-margin-analytics-vig-trends\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Benchmark your sportsbook margin against the sharp market over time. Track vig and overround trends in Python with free historical odds from 350+ books.<\/p>\n","protected":false},"author":2,"featured_media":3087,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,4,9,11,74],"class_list":["post-3086","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-free-api","tag-historical-odds","tag-odds-api","tag-python","tag-sportsbook-operators"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python) | OddsPapi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python) | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Benchmark your sportsbook margin against the sharp market over time. Track vig and overround trends in Python with free historical odds from 350+ books.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-03T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1429\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Odds API Writer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/oddspapi.io\/logo-v2.webp\" \/>\n<meta name=\"twitter:creator\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:site\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Odds API Writer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python)\",\"datePublished\":\"2026-07-03T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\"},\"wordCount\":1205,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp\",\"keywords\":[\"Free API\",\"historical odds\",\"Odds API\",\"Python\",\"Sportsbook Operators\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\",\"name\":\"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python) | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp\",\"datePublished\":\"2026-07-03T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Bookmaker Margin Analytics - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds API Tutorials &amp; Guides\",\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"alternateName\":\"Odds Papi\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/oddspapi.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\",\"name\":\"OddsPapi\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"width\":135,\"height\":135,\"caption\":\"OddsPapi\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/oddspapiapi\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\",\"name\":\"Odds API Writer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"caption\":\"Odds API Writer\"},\"url\":\"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python) | OddsPapi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/","og_locale":"en_US","og_type":"article","og_title":"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python) | OddsPapi Blog","og_description":"Benchmark your sportsbook margin against the sharp market over time. Track vig and overround trends in Python with free historical odds from 350+ books.","og_url":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-07-03T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp","type":"image\/webp"}],"author":"Odds API Writer","twitter_card":"summary_large_image","twitter_image":"https:\/\/oddspapi.io\/logo-v2.webp","twitter_creator":"@oddspapiapi","twitter_site":"@oddspapiapi","twitter_misc":{"Written by":"Odds API Writer","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python)","datePublished":"2026-07-03T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/"},"wordCount":1205,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp","keywords":["Free API","historical odds","Odds API","Python","Sportsbook Operators"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/","url":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/","name":"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python) | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp","datePublished":"2026-07-03T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/bookmaker-margin-analytics-vig-trends-scaled.webp","width":2560,"height":1429,"caption":"Bookmaker Margin Analytics - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Bookmaker Margin Analytics: Track Vig Trends Across 350+ Books (Python)"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds API Tutorials &amp; Guides","publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"alternateName":"Odds Papi","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/oddspapi.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/oddspapi.io\/blog\/#organization","name":"OddsPapi","url":"https:\/\/oddspapi.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","width":135,"height":135,"caption":"OddsPapi"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/oddspapiapi"]},{"@type":"Person","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13","name":"Odds API Writer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","caption":"Odds API Writer"},"url":"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/"}]}},"_links":{"self":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/comments?post=3086"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3086\/revisions"}],"predecessor-version":[{"id":3088,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3086\/revisions\/3088"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3087"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}