{"id":2871,"date":"2026-05-11T10:00:00","date_gmt":"2026-05-11T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=2871"},"modified":"2026-06-05T18:10:24","modified_gmt":"2026-06-05T18:10:24","slug":"cricket-odds-api-ipl-t20-test","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/","title":{"rendered":"Cricket Odds API: IPL, T20 &#038; Test Match Data from 20+ Bookmakers (Free Tier)"},"content":{"rendered":"<h2>Cricket Odds API: Why Getting Programmatic Access Is Harder Than It Should Be<\/h2>\n<p>Cricket is the second-most bet sport on the planet. The IPL alone moves more money than most American leagues combined. But if you&#8217;re a developer trying to build anything \u2014 a model, a scanner, a dashboard \u2014 you&#8217;ll quickly discover the data ecosystem is a mess.<\/p>\n<p>The big bookmakers (Pinnacle, Bet365, Betfair) don&#8217;t offer public APIs. The cricket-specific data providers (CricketAPI, EntitySport) give you scores and stats, not odds. And the enterprise feeds from Sportradar and LSports will quote you five figures before you see a JSON response.<\/p>\n<p>OddsPapi sits in the middle: <strong>20+ cricket bookmakers<\/strong> (including Pinnacle and the Betfair Exchange), <strong>175+ live markets per fixture<\/strong>, and a free tier that doesn&#8217;t require a sales call. This guide walks you through pulling IPL, T20, and Test match odds with Python.<\/p>\n<h2>What You Get vs. What You&#8217;re Used To<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping \/ Manual<\/th>\n<th>Enterprise Feed (Sportradar, LSports)<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Cricket Bookmakers<\/strong><\/td>\n<td>1 at a time<\/td>\n<td>10\u201340<\/td>\n<td><strong>49 on IPL fixtures<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Sharp Lines (Pinnacle)<\/strong><\/td>\n<td>No public API<\/td>\n<td>Yes (enterprise only)<\/td>\n<td><strong>Yes (free tier)<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Betfair Exchange Depth<\/strong><\/td>\n<td>Requires Betfair API key<\/td>\n<td>Sometimes<\/td>\n<td><strong>Full back\/lay + liquidity<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Markets per Fixture<\/strong><\/td>\n<td>Match winner only<\/td>\n<td>50\u2013100<\/td>\n<td><strong>175+ (overs, powerplay, runs)<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Historical Odds<\/strong><\/td>\n<td>Not available<\/td>\n<td>$$$ add-on<\/td>\n<td><strong>Free (backtest your models)<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Price<\/strong><\/td>\n<td>Free (until you get blocked)<\/td>\n<td>$5K\u2013$50K\/year<\/td>\n<td><strong>Free tier available<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Authentication &amp; Sport Discovery<\/h2>\n<p>Every OddsPapi request uses a query parameter for auth \u2014 no headers, no OAuth.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\n# Verify your key works\nresponse = requests.get(f\"{BASE_URL}\/sports\", params={\"apiKey\": API_KEY})\nsports = response.json()\n\n# Find cricket\ncricket = [s for s in sports if s[\"slug\"] == \"cricket\"][0]\nprint(f\"Sport: {cricket['name']} (ID: {cricket['sportId']})\")\n# Output: Sport: Cricket (ID: 27)<\/code><\/pre>\n<p><strong>Important terminology:<\/strong> OddsPapi uses &#8220;tournament&#8221; where you might say &#8220;league,&#8221; &#8220;fixture&#8221; instead of &#8220;match,&#8221; and &#8220;participant&#8221; instead of &#8220;team.&#8221; The cricket sport ID is <strong>27<\/strong>.<\/p>\n<h2>Step 2: Fetch Cricket Fixtures (IPL, PSL, T20, Tests)<\/h2>\n<p>The <code>\/fixtures<\/code> endpoint returns upcoming and recent matches within a date range (max 10 days per call).<\/p>\n<pre class=\"wp-block-code\"><code>from datetime import datetime, timedelta\n\n# Get the next 10 days of cricket fixtures\ntoday = datetime.utcnow().strftime(\"%Y-%m-%d\")\nend = (datetime.utcnow() + timedelta(days=10)).strftime(\"%Y-%m-%d\")\n\nresponse = requests.get(f\"{BASE_URL}\/fixtures\", params={\n    \"apiKey\": API_KEY,\n    \"sportId\": 27,\n    \"from\": today,\n    \"to\": end\n})\nfixtures = response.json()\n\n# Filter to fixtures that actually have odds\nwith_odds = [f for f in fixtures if f.get(\"hasOdds\")]\nprint(f\"Total fixtures: {len(fixtures)}, With odds: {len(with_odds)}\")\n\n# Group by tournament\nfrom collections import Counter\ntournaments = Counter(f[\"tournamentName\"] for f in with_odds)\nfor name, count in tournaments.most_common(10):\n    print(f\"  {name}: {count} fixtures\")<\/code><\/pre>\n<p>A typical 10-day window gives you <strong>50\u201360 fixtures with odds<\/strong> across the IPL, Pakistan Super League, Big Bash, Caribbean Premier League, international T20s, and domestic competitions.<\/p>\n<p><strong>Tip:<\/strong> Only fixtures with <code>hasOdds: true<\/code> will return pricing from the <code>\/odds<\/code> endpoint. The rest are metadata-only.<\/p>\n<h2>Step 3: Pull Live Odds \u2014 Match Winner<\/h2>\n<p>The main cricket market is <strong>&#8220;Winner (incl. super over)&#8221;<\/strong> \u2014 market ID <code>271<\/code>. This is your match-winner line.<\/p>\n<pre class=\"wp-block-code\"><code># Pick an IPL fixture\nipl_fixtures = [f for f in with_odds if \"Indian Premier League\" in f.get(\"tournamentName\", \"\")]\n\nif not ipl_fixtures:\n    print(\"No IPL fixtures in range \u2014 try a different date window\")\nelse:\n    fixture = ipl_fixtures[0]\n    fid = fixture[\"fixtureId\"]\n    print(f\"{fixture['participant1Name']} vs {fixture['participant2Name']}\")\n    print(f\"Fixture ID: {fid}\")\n\n    time.sleep(0.2)\n\n    # Get odds from all bookmakers\n    odds_response = requests.get(f\"{BASE_URL}\/odds\", params={\n        \"apiKey\": API_KEY,\n        \"fixtureId\": fid\n    })\n    odds_data = odds_response.json()\n\n    # Parse match-winner prices (market 271)\n    MATCH_WINNER = \"271\"\n\n    for slug, bookie_data in odds_data[\"bookmakerOdds\"].items():\n        markets = bookie_data.get(\"markets\", {})\n        if MATCH_WINNER in markets:\n            outcomes = markets[MATCH_WINNER][\"outcomes\"]\n            home = outcomes.get(\"271\", {}).get(\"players\", {}).get(\"0\", {})\n            away = outcomes.get(\"272\", {}).get(\"players\", {}).get(\"0\", {})\n            print(f\"  {slug:20s}  {home.get('price', '-'):>6}  {away.get('price', '-'):>6}\")<\/code><\/pre>\n<p>On a live IPL match, you&#8217;ll see <strong>40\u201350 bookmakers<\/strong> pricing the match winner \u2014 including Pinnacle (the market benchmark), the Betfair Exchange, FanDuel, DraftKings, Dafabet, Betway, and dozens of regional books.<\/p>\n<h2>Step 4: Compare Sharp vs. Soft Lines<\/h2>\n<p>This is where it gets useful. Pinnacle sets the sharpest cricket line in the world. Comparing it against soft bookmakers is the foundation of every value betting and arbitrage strategy.<\/p>\n<pre class=\"wp-block-code\"><code># Build a comparison table: sharp vs soft\nSHARP_BOOKS = [\"pinnacle\"]\nSOFT_BOOKS = [\"fanduel\", \"draftkings\", \"betway\", \"dafabet\", \"paddypower\"]\n\ndef get_match_winner_prices(odds_data, market_id=\"271\"):\n    \"\"\"Extract match-winner prices for all bookmakers.\"\"\"\n    prices = {}\n    for slug, bdata in odds_data.get(\"bookmakerOdds\", {}).items():\n        markets = bdata.get(\"markets\", {})\n        if market_id in markets:\n            outcomes = markets[market_id][\"outcomes\"]\n            home_price = outcomes.get(\"271\", {}).get(\"players\", {}).get(\"0\", {}).get(\"price\")\n            away_price = outcomes.get(\"272\", {}).get(\"players\", {}).get(\"0\", {}).get(\"price\")\n            if home_price and away_price:\n                prices[slug] = {\"home\": home_price, \"away\": away_price}\n    return prices\n\nprices = get_match_winner_prices(odds_data)\n\nprint(f\"\\n{'Bookmaker':20s}  {'Home':>8}  {'Away':>8}  {'Edge vs Pinnacle':>16}\")\nprint(\"-\" * 60)\n\npinnacle = prices.get(\"pinnacle\")\nif pinnacle:\n    # Pinnacle implied probabilities (no-vig midpoint)\n    pin_home_prob = 1 \/ pinnacle[\"home\"]\n    pin_away_prob = 1 \/ pinnacle[\"away\"]\n    overround = pin_home_prob + pin_away_prob\n    fair_home = pin_home_prob \/ overround\n    fair_away = pin_away_prob \/ overround\n\n    for slug in SHARP_BOOKS + SOFT_BOOKS:\n        if slug in prices:\n            p = prices[slug]\n            # Edge = (price * fair_prob) - 1\n            home_edge = (p[\"home\"] * fair_home - 1) * 100\n            away_edge = (p[\"away\"] * fair_away - 1) * 100\n            best_edge = max(home_edge, away_edge)\n            print(f\"  {slug:20s}  {p['home']:>8.3f}  {p['away']:>8.3f}  {best_edge:>+14.1f}%\")<\/code><\/pre>\n<p>When a soft bookmaker is slow to move and Pinnacle has already shifted, the edge column lights up. That&#8217;s the signal arb scanners and value bettors are looking for.<\/p>\n<h2>Step 5: Cricket-Specific Markets (Overs, Runs, Powerplay)<\/h2>\n<p>Cricket isn&#8217;t just match-winner. OddsPapi covers <strong>175+ markets per IPL fixture<\/strong>, including:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Market<\/th>\n<th>Example ID<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Winner (incl. super over)<\/td>\n<td>271<\/td>\n<td>Match winner \u2014 the main line<\/td>\n<\/tr>\n<tr>\n<td>1X2<\/td>\n<td>273<\/td>\n<td>Home \/ Draw \/ Away (Test matches)<\/td>\n<\/tr>\n<tr>\n<td>Tied Match<\/td>\n<td>274<\/td>\n<td>Will the match end in a tie?<\/td>\n<\/tr>\n<tr>\n<td>To Win the Coin Toss<\/td>\n<td>278<\/td>\n<td>Coin toss winner<\/td>\n<\/tr>\n<tr>\n<td>Over\/Under Runs 1st Innings<\/td>\n<td>27188+<\/td>\n<td>Total runs lines (multiple thresholds)<\/td>\n<\/tr>\n<tr>\n<td>3 Overs 1st Innings<\/td>\n<td>271832+<\/td>\n<td>Powerplay segment runs<\/td>\n<\/tr>\n<tr>\n<td>6 Overs 1st Innings<\/td>\n<td>273620+<\/td>\n<td>Full powerplay lines<\/td>\n<\/tr>\n<tr>\n<td>10 Overs 1st Innings<\/td>\n<td>278092+<\/td>\n<td>Mid-innings lines<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Don&#8217;t hardcode these \u2014 the catalog is too large and changes across formats. Query the market catalog and build a lookup:<\/p>\n<pre class=\"wp-block-code\"><code># Build a market name lookup for cricket\ntime.sleep(0.2)\nresponse = requests.get(f\"{BASE_URL}\/markets\", params={\n    \"apiKey\": API_KEY,\n    \"sportId\": 27\n})\ncatalog = response.json()\n\nmarket_names = {m[\"marketId\"]: m[\"marketName\"] for m in catalog}\noutcome_names = {\n    (m[\"marketId\"], o[\"outcomeId\"]): o[\"outcomeName\"]\n    for m in catalog for o in m.get(\"outcomes\", [])\n}\n\nprint(f\"Cricket market catalog: {len(catalog)} entries\")\nprint(f\"Unique market types: {len(set(market_names.values()))}\")\n\n# Show what markets a fixture actually has\nfor slug in [\"pinnacle\"]:\n    if slug in odds_data.get(\"bookmakerOdds\", {}):\n        for mid in odds_data[\"bookmakerOdds\"][slug][\"markets\"]:\n            name = market_names.get(int(mid), mid)\n            print(f\"  {mid}: {name}\")<\/code><\/pre>\n<h2>Step 6: Betfair Exchange \u2014 Full Depth of Book<\/h2>\n<p>If you&#8217;ve ever used the Betfair API, you know the pain: account verification, API keys, rate limits, session tokens. OddsPapi normalizes Betfair Exchange data into the same format as every other bookmaker \u2014 with the addition of back\/lay depth.<\/p>\n<pre class=\"wp-block-code\"><code># Betfair Exchange data comes with full order book depth\nbetfair = odds_data.get(\"bookmakerOdds\", {}).get(\"betfair-ex\", {})\n\nif betfair:\n    for mid, mdata in betfair.get(\"markets\", {}).items():\n        name = market_names.get(int(mid), mid)\n        print(f\"\\nMarket: {name} (ID: {mid})\")\n\n        for oid, odata in mdata.get(\"outcomes\", {}).items():\n            p0 = odata.get(\"players\", {}).get(\"0\", {})\n            price = p0.get(\"price\")\n            meta = p0.get(\"exchangeMeta\", {})\n            oname = outcome_names.get((int(mid), int(oid)), oid)\n\n            print(f\"  {oname}:\")\n            print(f\"    Back: {price} (available: {p0.get('limit', 0):.2f})\")\n\n            if meta and \"availableToBack\" in meta:\n                for level in meta[\"availableToBack\"][:3]:\n                    print(f\"      {level['price']} x \u00a3{level['size']:.2f}\")\n                for level in meta.get(\"availableToLay\", [])[:3]:\n                    print(f\"      Lay {level['price']} x \u00a3{level['size']:.2f}\")<\/code><\/pre>\n<p>This gives you the full Betfair order book \u2014 back prices, lay prices, and available liquidity at each level \u2014 without touching the Betfair API directly.<\/p>\n<h2>Step 7: Historical Odds for Backtesting<\/h2>\n<p>Building a cricket prediction model? You need historical closing lines to measure accuracy. Most providers charge for this. OddsPapi includes it on the free tier.<\/p>\n<pre class=\"wp-block-code\"><code># Pull historical odds for a completed fixture\n# Note: historical endpoint uses \"bookmakers\" key (not \"bookmakerOdds\")\n# Max 3 bookmakers per call\n\ncompleted = [f for f in fixtures if not f.get(\"hasOdds\") or f[\"statusId\"] != 1]\n# Or use a known completed fixture ID\n\nHISTORICAL_FIXTURE = completed[0][\"fixtureId\"] if completed else fid\n\ntime.sleep(0.2)\nhist_response = requests.get(f\"{BASE_URL}\/historical-odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": HISTORICAL_FIXTURE,\n    \"bookmakers\": \"pinnacle,betfair-ex,dafabet\"\n})\nhist_data = hist_response.json()\n\n# The structure is different from live odds:\n# hist_data[\"bookmakers\"][slug][\"markets\"][mid][\"outcomes\"][oid][\"players\"][\"0\"]\n# is a LIST of snapshots, not a single dict\n\nfor slug, bdata in hist_data.get(\"bookmakers\", {}).items():\n    for mid, mdata in bdata.get(\"markets\", {}).items():\n        for oid, odata in mdata.get(\"outcomes\", {}).items():\n            snapshots = odata.get(\"players\", {}).get(\"0\", [])\n            if snapshots:\n                print(f\"\\n{slug} | Market {mid} | Outcome {oid}\")\n                print(f\"  {len(snapshots)} price snapshots\")\n                print(f\"  Opening: {snapshots[0]['price']} at {snapshots[0]['createdAt']}\")\n                print(f\"  Closing: {snapshots[-1]['price']} at {snapshots[-1]['createdAt']}\")<\/code><\/pre>\n<p><strong>Key difference:<\/strong> The live <code>\/odds<\/code> endpoint returns <code>bookmakerOdds<\/code> with a single price per outcome. The <code>\/historical-odds<\/code> endpoint returns <code>bookmakers<\/code> with a <strong>list<\/strong> of timestamped price snapshots. Don&#8217;t mix up the response shapes.<\/p>\n<h2>Step 8: Full Pipeline \u2014 IPL Odds Scanner<\/h2>\n<p>Here&#8217;s a complete script that scans all upcoming IPL fixtures and finds where soft bookmakers are offering better prices than Pinnacle&#8217;s fair line:<\/p>\n<pre class=\"wp-block-code\"><code>import requests\nimport time\nfrom datetime import datetime, timedelta\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef get_fixtures(sport_id, days=10):\n    \"\"\"Fetch fixtures with odds for a date range.\"\"\"\n    today = datetime.utcnow().strftime(\"%Y-%m-%d\")\n    end = (datetime.utcnow() + timedelta(days=days)).strftime(\"%Y-%m-%d\")\n    r = requests.get(f\"{BASE_URL}\/fixtures\", params={\n        \"apiKey\": API_KEY, \"sportId\": sport_id, \"from\": today, \"to\": end\n    })\n    return [f for f in r.json() if f.get(\"hasOdds\")]\n\ndef get_odds(fixture_id):\n    \"\"\"Fetch live odds for a fixture.\"\"\"\n    r = requests.get(f\"{BASE_URL}\/odds\", params={\n        \"apiKey\": API_KEY, \"fixtureId\": fixture_id\n    })\n    return r.json()\n\ndef find_value(odds_data, market_id=\"271\"):\n    \"\"\"Compare all bookmakers against Pinnacle's fair line.\"\"\"\n    pin = odds_data.get(\"bookmakerOdds\", {}).get(\"pinnacle\", {})\n    pin_markets = pin.get(\"markets\", {})\n    if market_id not in pin_markets:\n        return []\n\n    # Calculate Pinnacle fair probabilities\n    outcomes = pin_markets[market_id][\"outcomes\"]\n    pin_prices = {}\n    for oid, odata in outcomes.items():\n        p = odata.get(\"players\", {}).get(\"0\", {}).get(\"price\")\n        if p:\n            pin_prices[oid] = p\n\n    if len(pin_prices) < 2:\n        return []\n\n    overround = sum(1\/p for p in pin_prices.values())\n    fair_probs = {oid: (1\/p) \/ overround for oid, p in pin_prices.items()}\n\n    # Scan all bookmakers\n    edges = []\n    for slug, bdata in odds_data.get(\"bookmakerOdds\", {}).items():\n        if slug == \"pinnacle\":\n            continue\n        markets = bdata.get(\"markets\", {})\n        if market_id not in markets:\n            continue\n        for oid, odata in markets[market_id].get(\"outcomes\", {}).items():\n            price = odata.get(\"players\", {}).get(\"0\", {}).get(\"price\")\n            if price and oid in fair_probs:\n                edge = (price * fair_probs[oid] - 1) * 100\n                if edge > 0:\n                    edges.append({\n                        \"bookmaker\": slug,\n                        \"outcome\": oid,\n                        \"price\": price,\n                        \"pinnacle_price\": pin_prices[oid],\n                        \"edge\": edge\n                    })\n\n    return sorted(edges, key=lambda x: -x[\"edge\"])\n\n# Run the scanner\nfixtures = get_fixtures(sport_id=27)\nipl = [f for f in fixtures if \"Indian Premier League\" in f.get(\"tournamentName\", \"\")]\n\nprint(f\"Scanning {len(ipl)} IPL fixtures...\\n\")\n\nfor fixture in ipl:\n    name = f\"{fixture['participant1Name']} vs {fixture['participant2Name']}\"\n    time.sleep(0.2)\n    odds = get_odds(fixture[\"fixtureId\"])\n    values = find_value(odds)\n\n    if values:\n        print(f\"\\n{name}\")\n        for v in values[:5]:\n            side = \"Home\" if v[\"outcome\"] == \"271\" else \"Away\"\n            print(f\"  {v['bookmaker']:20s}  {side}  {v['price']:.3f}  \"\n                  f\"(Pin: {v['pinnacle_price']:.3f})  Edge: {v['edge']:+.1f}%\")<\/code><\/pre>\n<h2>Coverage: What Tournaments Are Included?<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Tournament<\/th>\n<th>Format<\/th>\n<th>Typical Bookmakers<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Indian Premier League (IPL)<\/strong><\/td>\n<td>T20<\/td>\n<td>49+<\/td>\n<\/tr>\n<tr>\n<td><strong>Pakistan Super League (PSL)<\/strong><\/td>\n<td>T20<\/td>\n<td>30+<\/td>\n<\/tr>\n<tr>\n<td><strong>Big Bash League<\/strong><\/td>\n<td>T20<\/td>\n<td>20+<\/td>\n<\/tr>\n<tr>\n<td><strong>Caribbean Premier League<\/strong><\/td>\n<td>T20<\/td>\n<td>20+<\/td>\n<\/tr>\n<tr>\n<td><strong>International T20s<\/strong><\/td>\n<td>T20<\/td>\n<td>20+<\/td>\n<\/tr>\n<tr>\n<td><strong>ODI Series<\/strong><\/td>\n<td>ODI<\/td>\n<td>20+<\/td>\n<\/tr>\n<tr>\n<td><strong>West Indies Championship<\/strong><\/td>\n<td>First-class<\/td>\n<td>10+<\/td>\n<\/tr>\n<tr>\n<td><strong>County Cricket \/ Domestic<\/strong><\/td>\n<td>Various<\/td>\n<td>10+<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Coverage scales with liquidity. The IPL gets the deepest bookmaker coverage because it has the most betting volume. Niche domestic leagues still get odds, just from fewer books.<\/p>\n<h2>Why Not Just Use The Odds API or CricketAPI?<\/h2>\n<p><strong>The Odds API<\/strong> covers cricket, but with ~40 bookmakers total across all sports. You won&#8217;t find Dafabet, TabTouch, Pamestoixima, or the other regional books that price cricket aggressively. And you won&#8217;t get Betfair Exchange depth.<\/p>\n<p><strong>CricketAPI (Roanuz)<\/strong> and <strong>EntitySport<\/strong> are excellent for scores, ball-by-ball data, and player stats. They don&#8217;t provide bookmaker odds. You&#8217;d need both CricketAPI <em>and<\/em> OddsPapi to build a complete cricket data pipeline \u2014 stats from one, prices from the other.<\/p>\n<p><strong>Enterprise feeds<\/strong> (Sportradar, LSports, OddsMatrix) cover cricket with depth, but the free tier either doesn&#8217;t exist or is too restrictive for development work. OddsPapi gives you free historical data, WebSocket streaming, and 350+ bookmakers across all sports \u2014 cricket is one of 69 supported sports.<\/p>\n<h2>Quick Reference: Cricket API Endpoints<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Endpoint<\/th>\n<th>Purpose<\/th>\n<th>Key Parameters<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>GET \/fixtures<\/code><\/td>\n<td>List cricket matches<\/td>\n<td><code>sportId=27<\/code>, <code>from<\/code>, <code>to<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>GET \/odds<\/code><\/td>\n<td>Live odds for a fixture<\/td>\n<td><code>fixtureId<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>GET \/historical-odds<\/code><\/td>\n<td>Price history for backtesting<\/td>\n<td><code>fixtureId<\/code>, <code>bookmakers<\/code> (max 3)<\/td>\n<\/tr>\n<tr>\n<td><code>GET \/markets<\/code><\/td>\n<td>Market catalog &amp; outcome names<\/td>\n<td><code>sportId=27<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>GET \/bookmakers<\/code><\/td>\n<td>Full bookmaker list<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>All endpoints use <code>?apiKey=YOUR_KEY<\/code> as a query parameter. Rate limit on free tier: ~1 request per second per endpoint. Add <code>time.sleep(0.2)<\/code> between iterations.<\/p>\n<h2>Get Started<\/h2>\n<p>Stop scraping Cricbuzz for odds that update every 30 seconds. <a href=\"https:\/\/oddspapi.io\">Get your free API key<\/a>, point your script at <code>sportId=27<\/code>, and start pulling real-time cricket lines from Pinnacle, Betfair, and 47 other bookmakers in under five minutes.<\/p>\n<p>The IPL is live right now. Your model should be too.<\/p>\n<p><!--\nFocus Keyphrase: cricket odds API\nSEO Title: Cricket Odds API: IPL, T20 & Test Match Data from 20+ Bookmakers (Free Tier)\nMeta Description: Access live cricket odds from Pinnacle, Betfair & 20+ bookmakers via API. Free tier. Python tutorial with IPL examples and historical data for backtesting.\nSlug: cricket-odds-api-ipl-t20-test\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access live cricket odds from Pinnacle, Betfair &#038; 20+ bookmakers via API. Free tier with historical data for backtesting. Python tutorial with IPL examples.<\/p>\n","protected":false},"author":2,"featured_media":2872,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[50,8,9,11,10],"class_list":["post-2871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-cricket","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>Cricket Odds API: IPL, T20 &amp; Test Match Data from 20+ Bookmakers (Free Tier) | 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\/cricket-odds-api-ipl-t20-test\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cricket Odds API: IPL, T20 &amp; Test Match Data from 20+ Bookmakers (Free Tier) | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Access live cricket odds from Pinnacle, Betfair &amp; 20+ bookmakers via API. Free tier with historical data for backtesting. Python tutorial with IPL examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-11T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-05T18:10:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-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=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Cricket Odds API: IPL, T20 &#038; Test Match Data from 20+ Bookmakers (Free Tier)\",\"datePublished\":\"2026-05-11T10:00:00+00:00\",\"dateModified\":\"2026-06-05T18:10:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/\"},\"wordCount\":1015,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp\",\"keywords\":[\"Cricket\",\"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\/cricket-odds-api-ipl-t20-test\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/\",\"name\":\"Cricket Odds API: IPL, T20 & Test Match Data from 20+ Bookmakers (Free Tier) | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp\",\"datePublished\":\"2026-05-11T10:00:00+00:00\",\"dateModified\":\"2026-06-05T18:10:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Cricket Odds API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cricket Odds API: IPL, T20 &#038; Test Match Data from 20+ Bookmakers (Free Tier)\"}]},{\"@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":"Cricket Odds API: IPL, T20 & Test Match Data from 20+ Bookmakers (Free Tier) | 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\/cricket-odds-api-ipl-t20-test\/","og_locale":"en_US","og_type":"article","og_title":"Cricket Odds API: IPL, T20 & Test Match Data from 20+ Bookmakers (Free Tier) | OddsPapi Blog","og_description":"Access live cricket odds from Pinnacle, Betfair & 20+ bookmakers via API. Free tier with historical data for backtesting. Python tutorial with IPL examples.","og_url":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-05-11T10:00:00+00:00","article_modified_time":"2026-06-05T18:10:24+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-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":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Cricket Odds API: IPL, T20 &#038; Test Match Data from 20+ Bookmakers (Free Tier)","datePublished":"2026-05-11T10:00:00+00:00","dateModified":"2026-06-05T18:10:24+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/"},"wordCount":1015,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp","keywords":["Cricket","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\/cricket-odds-api-ipl-t20-test\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/","url":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/","name":"Cricket Odds API: IPL, T20 & Test Match Data from 20+ Bookmakers (Free Tier) | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp","datePublished":"2026-05-11T10:00:00+00:00","dateModified":"2026-06-05T18:10:24+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/cricket-odds-api-ipl-t20-test-scaled.webp","width":2560,"height":1429,"caption":"Cricket Odds API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/cricket-odds-api-ipl-t20-test\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Cricket Odds API: IPL, T20 &#038; Test Match Data from 20+ Bookmakers (Free Tier)"}]},{"@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\/2871","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=2871"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2871\/revisions"}],"predecessor-version":[{"id":2995,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2871\/revisions\/2995"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/2872"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=2871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=2871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=2871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}