{"id":3124,"date":"2026-07-21T10:00:00","date_gmt":"2026-07-21T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3124"},"modified":"2026-06-22T14:15:13","modified_gmt":"2026-06-22T14:15:13","slug":"dutching-calculator-python","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/","title":{"rendered":"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books"},"content":{"rendered":"<p>You fancy three outsiders for a tournament. Or you want to cover the draw and the away win and only lose if the favourite delivers. How much do you put on each so your return is identical no matter which one lands? That&#8217;s <strong>dutching<\/strong> &mdash; splitting your stake across several selections so they all pay back the same.<\/p>\n<p>The catch every generic dutching calculator ignores: the margin you pay to cover all those outcomes depends entirely on <em>which prices you get<\/em>. Take each selection&#8217;s best price across many books and the cost of covering collapses &mdash; occasionally past break-even into a genuine arbitrage. This guide builds a dutching calculator in pure Python and wires it straight into the <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">OddsPapi odds API<\/a> so every leg is priced at the best of 350+ bookmakers.<\/p>\n<h2>What Dutching Actually Is<\/h2>\n<p>Back <em>N<\/em> selections. Size each stake so that whichever one wins, you collect the same amount. The math is one line: stake each selection in proportion to its <strong>inverse odds<\/strong> (its implied probability).<\/p>\n<pre class=\"wp-block-code\"><code>stake_i = total_stake * (1 \/ odds_i) \/ sum(1 \/ odds_j for all j)<\/code><\/pre>\n<p>The guaranteed return if any selection wins is <code>total_stake \/ sum(1\/odds_j)<\/code>. That denominator &mdash; the sum of inverse odds &mdash; is the <strong>book percentage<\/strong>. It&#8217;s the whole game:<\/p>\n<ul>\n<li><strong>Book % &gt; 100%<\/strong> &mdash; you pay a margin to cover everything (normal case).<\/li>\n<li><strong>Book % = 100%<\/strong> &mdash; you break even whoever wins.<\/li>\n<li><strong>Book % &lt; 100%<\/strong> &mdash; you profit no matter what. That&#8217;s an <a href=\"https:\/\/oddspapi.io\/blog\/arbitrage-betting-bot-python\/\">arbitrage<\/a>.<\/li>\n<\/ul>\n<p>So minimising book % is the entire job, and that means shopping each leg for its best price. Here&#8217;s what that looks like on a real fixture.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Pricing source (3-way market)<\/th>\n<th>Book %<\/th>\n<th>Cost to cover all 3<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bet365 alone<\/td>\n<td>105.54%<\/td>\n<td>-5.25%<\/td>\n<\/tr>\n<tr>\n<td>FanDuel alone<\/td>\n<td>105.17%<\/td>\n<td>-4.92%<\/td>\n<\/tr>\n<tr>\n<td>DraftKings alone<\/td>\n<td>104.29%<\/td>\n<td>-4.11%<\/td>\n<\/tr>\n<tr>\n<td>Pinnacle alone<\/td>\n<td>102.17%<\/td>\n<td>-2.12%<\/td>\n<\/tr>\n<tr>\n<td><strong>Best price per leg (350+ books)<\/strong><\/td>\n<td><strong>101.22%<\/strong><\/td>\n<td><strong>-1.21%<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Same three outcomes, same match. Covering them on Bet365 alone costs 5.25%; line-shopping each leg cuts that to 1.21% &mdash; a quarter of the cost.<\/p>\n<h2>Step 1: Authenticate and Pull the Market<\/h2>\n<p>OddsPapi auth is a query parameter, not a header. Grab a <a href=\"https:\/\/oddspapi.io\/\">free API key<\/a> and pull every book&#8217;s prices for one fixture in a single call. We&#8217;ll use a World Cup 2026 match (snapshot, June 2026) and the Full Time Result market (1X2, market ID 101; outcomes Home=101, Draw=102, Away=103).<\/p>\n<pre class=\"wp-block-code\"><code>import requests, time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef get(path, **params):\n    # GET with the ~0.9s same-endpoint cooldown handled\n    params[\"apiKey\"] = API_KEY\n    for _ in range(6):\n        r = requests.get(f\"{BASE}\/{path}\", params=params)\n        try:\n            data = r.json()\n            if data:\n                return data\n        except ValueError:\n            pass\n        time.sleep(1.0)\n    return {}\n\nfixture_id = \"id1000001666457012\"\nodds = get(\"odds\", fixtureId=fixture_id)\nbooks = odds[\"bookmakerOdds\"]\nprint(f\"{len(books)} bookmakers on this fixture\")\n<\/code><\/pre>\n<p>Note: do <strong>not<\/strong> pass the <code>bookmakers<\/code> filter unless you&#8217;re certain every slug you list is present &mdash; if any requested book is missing on the fixture, the API zeroes the entire response. Pull them all, then pick.<\/p>\n<h2>Step 2: Find the Best Price for Each Selection<\/h2>\n<p>Walk every book, keep the highest <em>active<\/em> price for each outcome. The <code>active<\/code> check matters &mdash; a suspended price can sit in the payload looking like a juicy outlier.<\/p>\n<pre class=\"wp-block-code\"><code>OUTCOMES = {101: \"Home\", 102: \"Draw\", 103: \"Away\"}\n\ndef best_prices(books, market_id=101, outcome_ids=OUTCOMES):\n    best = {oid: (0.0, None) for oid in outcome_ids}\n    for slug, bdata in books.items():\n        outs = bdata.get(\"markets\", {}).get(str(market_id), {}).get(\"outcomes\", {})\n        for oid in outcome_ids:\n            o = outs.get(str(oid))\n            if not o:\n                continue\n            leg = o[\"players\"][\"0\"]\n            price, active = leg.get(\"price\"), leg.get(\"active\", True)\n            if price and active and price > best[oid][0]:\n                best[oid] = (price, slug)\n    return best\n\nbest = best_prices(books)\nfor oid, name in OUTCOMES.items():\n    price, slug = best[oid]\n    print(f\"{name:5}: {price} @ {slug}\")\n# Home : 2.25 @ pinnacle\n# Draw : 3.6  @ bet365\n# Away : 3.448 @ kalshi\n<\/code><\/pre>\n<h2>Step 3: The Dutching Calculator<\/h2>\n<p>Two ways to use it. Fix a total stake and see the guaranteed return, or fix a target return and see the total outlay. Both fall straight out of the inverse-odds split.<\/p>\n<pre class=\"wp-block-code\"><code>def dutch(odds_list, total_stake=None, target_return=None):\n    inv = [1.0 \/ o for o in odds_list]\n    book_pct = sum(inv)\n    if target_return is not None:\n        # stake_i = target_return \/ odds_i  -> every leg returns target_return\n        stakes = [target_return \/ o for o in odds_list]\n        total_stake = sum(stakes)\n        guaranteed = target_return\n    else:\n        stakes = [total_stake * i \/ book_pct for i in inv]\n        guaranteed = total_stake \/ book_pct\n    profit = guaranteed - total_stake\n    return {\n        \"stakes\": stakes,\n        \"total_stake\": total_stake,\n        \"guaranteed_return\": guaranteed,\n        \"profit\": profit,\n        \"book_pct\": book_pct * 100,\n    }\n\nprices = [best[oid][0] for oid in OUTCOMES]   # [2.25, 3.6, 3.448]\nresult = dutch(prices, total_stake=100)\n\nfor (oid, name), stake in zip(OUTCOMES.items(), result[\"stakes\"]):\n    print(f\"{name:5}: stake {stake:6.2f} @ {best[oid][0]}\")\nprint(f\"Book %: {result['book_pct']:.2f}%\")\nprint(f\"Guaranteed return on any winner: {result['guaranteed_return']:.2f}\")\nprint(f\"P\/L: {result['profit']:+.2f}\")\n<\/code><\/pre>\n<p>Output:<\/p>\n<pre class=\"wp-block-code\"><code>Home : stake  43.91 @ 2.25\nDraw : stake  27.44 @ 3.6\nAway : stake  28.65 @ 3.448\nBook %: 101.22%\nGuaranteed return on any winner: 98.79\nP\/L: -1.21<\/code><\/pre>\n<p>Stake &pound;100 across the three best prices and you get &pound;98.79 back whoever wins &mdash; a fixed &pound;1.21 cost to have the entire match covered. On Bet365 alone that same cover would cost &pound;5.25.<\/p>\n<h2>Step 4: Dutch a Subset (Fade the Favourite)<\/h2>\n<p>You don&#8217;t have to cover every outcome. A common play is to back only the draw and the away win &mdash; you collect the same on either, and only lose if the favourite delivers. Just pass the subset:<\/p>\n<pre class=\"wp-block-code\"><code>subset = [best[102][0], best[103][0]]   # Draw 3.6, Away 3.448\nr = dutch(subset, total_stake=100)\nprint(f\"Draw stake {r['stakes'][0]:.2f}, Away stake {r['stakes'][1]:.2f}\")\nprint(f\"Return if draw or away: {r['guaranteed_return']:.2f}  (lose 100 if home wins)\")\n# Book % here is ~56.5%, so the \"return\" is ~1.77x your stake on a hit\n<\/code><\/pre>\n<p>This is risk-shaping, not free money &mdash; you&#8217;re trading a smaller payout for two ways to win instead of one. The calculator just tells you the exact split.<\/p>\n<h2>Step 5: Flag the Arbs Automatically<\/h2>\n<p>Run the best-price dutch across your slate and surface any fixture where the combined book % dips below 100% &mdash; that&#8217;s a covered position that profits no matter what.<\/p>\n<pre class=\"wp-block-code\"><code>def scan_arbs(fixture_ids, market_id=101):\n    for fid in fixture_ids:\n        books = get(\"odds\", fixtureId=fid).get(\"bookmakerOdds\", {})\n        if not books:\n            continue\n        best = best_prices(books, market_id)\n        if not all(best[o][1] for o in best):\n            continue\n        book_pct = sum(1.0 \/ best[o][0] for o in best) * 100\n        flag = \"  &lt;&lt;&lt; ARB\" if book_pct &lt; 100 else \"\"\n        print(f\"{fid}: {book_pct:.2f}%{flag}\")\n        time.sleep(1.0)   # respect the per-endpoint cooldown\n<\/code><\/pre>\n<p>Most fixtures land just over 100% &mdash; the books&#8217; margin doing its job &mdash; but with 350+ books quoting independently, the occasional cross-book gap drops a line under 100. For a deeper arb engine with stake locking, see our <a href=\"https:\/\/oddspapi.io\/blog\/arbitrage-betting-bot-python\/\">arbitrage betting bot guide<\/a>; dutching is the staking mechanic underneath it.<\/p>\n<h2>The Honest Part: Dutching Doesn&#8217;t Create Edge<\/h2>\n<p>Read this before you fund anything. Dutching is a <em>staking method<\/em>, not a money machine. If the combined book % is over 100% &mdash; which it almost always is on a single market &mdash; covering every outcome <strong>locks in a small loss<\/strong>. You&#8217;re paying the bookmaker&#8217;s margin for certainty. The only ways dutching turns a profit:<\/p>\n<ul>\n<li><strong>The combined price is mispriced below 100%<\/strong> (a true arb), which line-shopping across 350+ books makes far more findable but never guarantees.<\/li>\n<li><strong>You&#8217;re dutching a subset you have a genuine view on<\/strong> &mdash; e.g. you think the favourite is overpriced, so you cover the other two. The profit then comes from your read, not the dutch.<\/li>\n<\/ul>\n<p>Watch the same traps that bite line-shoppers: a stale or boosted outlier price inflates the apparent best line and evaporates when you click. Always filter on <code>active<\/code>, and treat a single book that&#8217;s wildly off the others with suspicion. If you&#8217;re sizing for a known edge rather than equal cover, the <a href=\"https:\/\/oddspapi.io\/blog\/kelly-criterion-staking-calculator-python\/\">Kelly criterion<\/a> is the right tool, and to lock profit on a bet you already hold, reach for the <a href=\"https:\/\/oddspapi.io\/blog\/hedging-calculator-python\/\">hedging calculator<\/a>.<\/p>\n<h2>Build It on Real Prices<\/h2>\n<p>The calculator is a dozen lines; the leverage is the data feeding it. Best-price-per-leg dutching only works if you can see every book at once &mdash; and OddsPapi returns 350+ on a single call, with free historical odds if you want to backtest how often a market actually drifts under 100%.<\/p>\n<p><strong>Stop overpaying to cover your bets. <a href=\"https:\/\/oddspapi.io\/\">Get your free OddsPapi API key<\/a><\/strong> and price every dutching leg at the best of 350+ bookmakers.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>What is dutching in betting?<\/h3>\n<p>Dutching is splitting your stake across multiple selections so that you win the same amount whichever one lands. You size each stake in proportion to its implied probability (inverse odds). It&#8217;s used to cover several outcomes in one market or to back a group of selections you fancy.<\/p>\n<h3>Is dutching profitable?<\/h3>\n<p>Not on its own. Covering every outcome in a market costs the bookmaker&#8217;s margin, so the combined &#8220;book percentage&#8221; is usually above 100% and you lock a small loss. Dutching only profits when the combined best price is below 100% (an arbitrage) or when you&#8217;re dutching a subset based on a genuine edge.<\/p>\n<h3>How does line shopping reduce dutching cost?<\/h3>\n<p>The cost of covering outcomes equals the sum of inverse odds. Taking each selection&#8217;s best price across many books minimises that sum. In the worked example, covering a 3-way market cost 5.25% on one book but only 1.21% when each leg was priced at the best of 350+ books.<\/p>\n<h3>What&#8217;s the difference between dutching, hedging, and arbitrage?<\/h3>\n<p>Dutching backs multiple selections at the same time for an equal return. Hedging places an opposing bet to lock profit or limit loss on a bet you already hold. Arbitrage is a dutch (or back\/lay) where the combined price guarantees profit. They share the same inverse-odds math but solve different problems.<\/p>\n<h3>Which markets work best for dutching?<\/h3>\n<p>Any market with mutually exclusive outcomes: 1X2 (home\/draw\/away), outright tournament winners, correct score, first goalscorer. The more selections you cover, the higher the combined book percentage, so line-shopping each leg matters more as the field grows.<\/p>\n<p><!--\nFocus Keyphrase: dutching calculator python\nSEO Title: Dutching Calculator in Python: Cover Every Outcome (Free Odds API)\nMeta Description: Build a dutching calculator in Python and line-shop every selection across 350+ bookmakers with the free OddsPapi API. Cut the cost of covering outcomes.\nSlug: dutching-calculator-python\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Win the same whichever selection lands. Build a dutching calculator in Python and line-shop every leg across 350+ books with the free OddsPapi API.<\/p>\n","protected":false},"author":2,"featured_media":3125,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[78,8,9,11,10],"class_list":["post-3124","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-arbitrage","tag-free-api","tag-odds-api","tag-python","tag-sports-betting-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dutching Calculator in Python: Cover Every Outcome Across 350+ Books | 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\/dutching-calculator-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Win the same whichever selection lands. Build a dutching calculator in Python and line-shop every leg across 350+ books with the free OddsPapi API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-21T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-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=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books\",\"datePublished\":\"2026-07-21T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/\"},\"wordCount\":1208,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp\",\"keywords\":[\"Arbitrage\",\"Free API\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/\",\"name\":\"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp\",\"datePublished\":\"2026-07-21T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Dutching Calculator in Python - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books\"}]},{\"@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":"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books | 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\/dutching-calculator-python\/","og_locale":"en_US","og_type":"article","og_title":"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books | OddsPapi Blog","og_description":"Win the same whichever selection lands. Build a dutching calculator in Python and line-shop every leg across 350+ books with the free OddsPapi API.","og_url":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-07-21T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-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":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books","datePublished":"2026-07-21T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/"},"wordCount":1208,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp","keywords":["Arbitrage","Free API","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/","url":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/","name":"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp","datePublished":"2026-07-21T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/dutching-calculator-python-scaled.webp","width":2560,"height":1429,"caption":"Dutching Calculator in Python - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/dutching-calculator-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Dutching Calculator in Python: Cover Every Outcome Across 350+ Books"}]},{"@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\/3124","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=3124"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3124\/revisions"}],"predecessor-version":[{"id":3127,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3124\/revisions\/3127"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3125"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}