{"id":144,"date":"2026-01-31T15:10:21","date_gmt":"2026-01-31T15:10:21","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=144"},"modified":"2026-10-15T20:55:44","modified_gmt":"2026-10-15T20:55:44","slug":"free-odds-api-350-bookmakers","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/","title":{"rendered":"Free Odds API: 250 Requests, 274 Bookmakers in One Call"},"content":{"rendered":"<h2>You Need Data Before You Can Afford Data<\/h2>\n<p>You want to build a betting model, an arbitrage scanner or a value finder. First you need odds to prove the idea works, and most feeds want money before you write a line of code.<\/p>\n<p>OddsPapi&#8217;s free plan gives you every sport and every bookmaker for 250 requests a month, with no credit card. The number that matters is what one request returns. On 29 September 2026 we sent one <code>\/odds<\/code> call for Spain v Croatia in the UEFA Nations League. It came back with <strong>274 bookmakers, 871 market IDs and 194,745 prices<\/strong>.<\/p>\n<p>This guide measures that board, shows you how to spend 250 requests without waste, and gives you five tested Python scripts: live odds, sharp versus soft prices, and free opening and closing lines from history.<\/p>\n<h2>What the Free Plan Includes<\/h2>\n<p>The sign-up page states the plan in one line: all sports and all bookmakers, 250 requests a month. Here is what that covers, measured on 29 September 2026.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Free plan<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Bookmakers<\/strong><\/td>\n<td>All of them: 361 slugs in <code>\/v4\/bookmakers<\/code>, 286 flagged <code>liveOdds<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Sports<\/strong><\/td>\n<td>All 69 in <code>\/v4\/sports<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Sharp books and exchanges<\/strong><\/td>\n<td>Pinnacle, Singbet, Betfair Exchange, Polymarket and Kalshi all priced Spain v Croatia<\/td>\n<\/tr>\n<tr>\n<td><strong>Soft books<\/strong><\/td>\n<td>bet365, DraftKings, FanDuel and 1xBet all priced Spain v Croatia<\/td>\n<\/tr>\n<tr>\n<td><strong>Historical odds<\/strong><\/td>\n<td>Included. Full snapshot history per fixture, up to 3 bookmakers per call<\/td>\n<\/tr>\n<tr>\n<td><strong>Requests<\/strong><\/td>\n<td>250 a month<\/td>\n<\/tr>\n<tr>\n<td><strong>Credit card<\/strong><\/td>\n<td>Not needed<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>250 Requests vs 500 Credits<\/h2>\n<p>The Odds API&#8217;s free Starter plan gives you 500 credits a month. The count looks bigger until you read how their docs charge a call. A live odds call costs 1 credit per region per market. A historical call costs 10 credits per region per market. Their pricing page lists &#8220;most bookmakers&#8221; on the free plan. For the full breakdown, read <a href=\"https:\/\/oddspapi.io\/blog\/the-odds-api-free-tier-limits\/\">The Odds API free tier limits<\/a>.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>One call for&#8230;<\/th>\n<th>OddsPapi free<\/th>\n<th>The Odds API free<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Moneyline, spreads and totals, US + UK + EU regions<\/td>\n<td>1 request<\/td>\n<td>9 credits (3 markets x 3 regions)<\/td>\n<\/tr>\n<tr>\n<td>Every market a fixture carries (871 on Spain v Croatia)<\/td>\n<td>1 request<\/td>\n<td>1 credit per market per region<\/td>\n<\/tr>\n<tr>\n<td>Historical 1X2 for one fixture, full snapshot history<\/td>\n<td>1 request (3 books)<\/td>\n<td>10 credits per region, one snapshot per call<\/td>\n<\/tr>\n<tr>\n<td>Monthly allowance<\/td>\n<td>250 requests<\/td>\n<td>500 credits<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The Odds API rates are from their v4 docs and pricing page, read on 29 September 2026. If you need a wider comparison of paid tiers, see <a href=\"https:\/\/oddspapi.io\/blog\/odds-api-pricing-2026-comparison\/\">Odds API pricing compared<\/a>. For every free plan and trial in one list, see the <a href=\"https:\/\/sportsapis.dev\/free-odds-api\">free odds API roundup on SportsAPIs.dev<\/a>.<\/p>\n<h2>Get Started: Python Tutorial<\/h2>\n<h3>Step 1: Get Your Free API Key<\/h3>\n<p>Sign up at <a href=\"https:\/\/oddspapi.io\/en\/sign-up\" target=\"_blank\" rel=\"noopener\">oddspapi.io<\/a>. You get a key at once. OddsPapi reads the key from the <code>apiKey<\/code> query parameter, not from a header.<\/p>\n<h3>Step 2: Verify Your Key<\/h3>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_FREE_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\nresponse = requests.get(f\"{BASE_URL}\/sports\", params={\"apiKey\": API_KEY})\nprint(f\"Status: {response.status_code}\")\nprint(f\"Sports available: {len(response.json())}\")\n<\/code><\/pre>\n<p>Output on 29 September 2026:<\/p>\n<pre class=\"wp-block-code\"><code>Status: 200\nSports available: 69\n<\/code><\/pre>\n<h3>Step 3: Browse Sports<\/h3>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_FREE_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\nresponse = requests.get(f\"{BASE_URL}\/sports\", params={\"apiKey\": API_KEY})\nfor sport in response.json()[:10]:\n    print(f\"{sport['sportId']}: {sport['sportName']}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>10: Soccer\n11: Basketball\n12: Tennis\n13: Baseball\n14: American Football\n15: Ice Hockey\n16: ESport Dota\n17: ESport Counter-Strike\n18: ESport League of Legends\n19: Darts\n<\/code><\/pre>\n<p>Cache this list and the bookmaker catalogue. They change rarely, and every call you skip is a call you keep for odds.<\/p>\n<h3>Step 4: Find Tournaments with Fixtures<\/h3>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_FREE_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\nresponse = requests.get(f\"{BASE_URL}\/tournaments\", params={\n    \"apiKey\": API_KEY,\n    \"sportId\": 10,  # Soccer\n})\ntournaments = response.json()\n\n# futureFixtures &gt; 0 means the tournament has fixtures on the calendar\nactive = [t for t in tournaments if t.get(\"futureFixtures\", 0) &gt; 0]\nprint(f\"Soccer tournaments: {len(tournaments)}, with future fixtures: {len(active)}\")\n\nfor t in sorted(active, key=lambda t: -t[\"futureFixtures\"])[:5]:\n    print(f\"  {t['tournamentId']:&gt;6}  {t['categoryName']} \/ {t['tournamentName']}: {t['futureFixtures']}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Soccer tournaments: 1967, with future fixtures: 607\n     544  Spain \/ Segunda Federacion: 1605\n   48343  Spain \/ U19 Division de Honor Juvenil: 1567\n   46053  Greece \/ Gamma Ethniki: 1168\n   26178  USA \/ NCAA Regular Season, Women: 999\n   26176  USA \/ NCAA, Regular Season: 934\n<\/code><\/pre>\n<p>Filter on <code>futureFixtures<\/code>, not <code>upcomingFixtures<\/code>. On 29 September the Premier League showed 330 future fixtures and 0 upcoming, so an <code>upcomingFixtures<\/code> filter drops it.<\/p>\n<h3>Step 5: Get Fixtures for a Tournament<\/h3>\n<pre class=\"wp-block-code\"><code>import requests\nfrom datetime import date, timedelta\n\nAPI_KEY = \"YOUR_FREE_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\nTOURNAMENT_ID = 23755  # UEFA Nations League; 17 = Premier League, 8 = LaLiga\n\ntoday = date.today()\nresponse = requests.get(f\"{BASE_URL}\/fixtures\", params={\n    \"apiKey\": API_KEY,\n    \"tournamentId\": TOURNAMENT_ID,\n    \"from\": today.isoformat(),\n    \"to\": (today + timedelta(days=10)).isoformat(),\n})\n\n# A 404 means an empty window (off-season or international break), not an error\nfixtures = response.json() if response.status_code == 200 else []\nwith_odds = sorted((f for f in fixtures if f.get(\"hasOdds\")), key=lambda f: f[\"startTime\"])\nprint(f\"Fixtures: {len(fixtures)}, with odds: {len(with_odds)}\")\n\nfor f in with_odds[:3]:\n    print(f\"  {f['fixtureId']}  {f['participant1Name']} v {f['participant2Name']}  {f['startTime']}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Fixtures: 62, with odds: 62\n  id1002375568932360  Moldova v Faroe Islands  2026-09-29T16:00:00.000Z\n  id1002375568932506  Finland v Belarus  2026-09-29T16:00:00.000Z\n  id1002375568931694  Czechia v England  2026-09-29T18:45:00.000Z\n<\/code><\/pre>\n<p>If a tournament has no fixtures in the window, <code>\/fixtures<\/code> returns 404. On 29 September, during the international break, LaLiga and the Champions League both returned <code>FIXTURE_NOT_FOUND<\/code> for the next ten days. The script treats 404 as an empty list.<\/p>\n<h3>Step 6: One Request, the Whole Board<\/h3>\n<p>This script spends one request on one fixture and counts what comes back. Then it pulls the 1X2 (market 101) from three sharp or exchange prices and three soft books.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_FREE_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\nFIXTURE_ID = \"id1002375568931696\"  # Spain v Croatia, from Step 5\n\nresponse = requests.get(f\"{BASE_URL}\/odds\", params={\"apiKey\": API_KEY, \"fixtureId\": FIXTURE_ID})\nresponse.raise_for_status()\nbooks = response.json()[\"bookmakerOdds\"]\n\n# Drop internal test feeds before you count anything\nbooks = {s: b for s, b in books.items() if not s.startswith(\"pinnacle+\") and s != \"demo\"}\n\nmarket_ids, prices, active = set(), 0, 0\nfor b in books.values():\n    for mid, market in (b.get(\"markets\") or {}).items():\n        market_ids.add(mid)\n        for outcome in market[\"outcomes\"].values():\n            for p in outcome[\"players\"].values():\n                prices += 1\n                active += bool(p.get(\"active\"))\n\nprint(f\"One request: {len(books)} bookmakers, {len(market_ids)} market IDs, \"\n      f\"{prices:,} prices ({active:,} active), {len(response.content) \/ 1e6:.1f} MB\")\n\n# Market 101 = Full Time Result (1X2); outcomes 101 home, 102 draw, 103 away\ndef one_x_two(slug):\n    m = (books.get(slug, {}).get(\"markets\") or {}).get(\"101\")\n    if not m:\n        return None\n    legs = [m[\"outcomes\"].get(k, {}).get(\"players\", {}).get(\"0\", {}) for k in (\"101\", \"102\", \"103\")]\n    if not all(p.get(\"active\") for p in legs):\n        return None\n    return tuple(p[\"price\"] for p in legs)\n\nquotes = {s: q for s in books if (q := one_x_two(s))}\nprint(f\"Active 1X2 quotes: {len(quotes)} books, {len(set(quotes.values()))} distinct price tuples\")\n\nfor slug in [\"pinnacle\", \"singbet\", \"betfair-ex\", \"polymarket\", \"bet365\", \"draftkings\"]:\n    q = quotes.get(slug)\n    if q:\n        margin = sum(1 \/ x for x in q) - 1\n        print(f\"  {slug:&lt;11} {q[0]:&gt;6} {q[1]:&gt;6} {q[2]:&gt;6}   margin {margin:.2%}\")\n<\/code><\/pre>\n<p>Output, 29 September 2026 at 13:15 UTC, five and a half hours before kick-off:<\/p>\n<pre class=\"wp-block-code\"><code>One request: 274 bookmakers, 871 market IDs, 194,745 prices (153,280 active), 65.4 MB\nActive 1X2 quotes: 264 books, 98 distinct price tuples\n  pinnacle     1.202   7.45  12.97   margin 4.33%\n  singbet       1.21    6.8   14.0   margin 4.49%\n  betfair-ex    1.22    8.0   16.5   margin 0.53%\n  polymarket    1.22  7.692 14.286   margin 1.97%\n  bet365        1.19    6.5   11.0   margin 8.51%\n  draftkings     1.2    6.5   11.0   margin 7.81%\n<\/code><\/pre>\n<p>Three findings come out of that one request:<\/p>\n<ul>\n<li><strong>Dedupe before you count books.<\/strong> 264 books quoted an active 1X2, but they quoted only 98 distinct price tuples. Many slugs copy another book&#8217;s prices. The <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds guide<\/a> shows the dedupe step.<\/li>\n<li><strong>The soft books pay less on the long shot.<\/strong> bet365 and DraftKings both quoted Croatia at 11.0. Pinnacle had 12.97 and Betfair Exchange had 16.5. That gap is the raw material for <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping<\/a>.<\/li>\n<li><strong>Read the <code>active<\/code> flag.<\/strong> 41,465 of the 194,745 prices were suspended. If you skip the flag, your averages include dead prices.<\/li>\n<\/ul>\n<p>The payload is large: 65.4 MB for this fixture. If you only need a few books, pass <code>bookmakers=pinnacle,bet365<\/code> on the same call.<\/p>\n<h3>Step 7: Free Opening and Closing Lines<\/h3>\n<p>Historical odds are on the free plan. One call returns every snapshot for up to three bookmakers on a played fixture. This script reads the opening and closing 1X2 for Brighton v Arsenal (Premier League, 19 September 2026).<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_FREE_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\nFIXTURE_ID = \"id1000001772221276\"  # Brighton v Arsenal, played 19 Sep 2026\nKICK_OFF = \"2026-09-19T14:00:00.000Z\"  # startTime from \/fixtures\n\n# \/historical-odds takes at most 3 bookmakers per call\nresponse = requests.get(f\"{BASE_URL}\/historical-odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": FIXTURE_ID,\n    \"bookmakers\": \"pinnacle,bet365,draftkings\",\n})\nresponse.raise_for_status()\n\nfor slug, book in response.json()[\"bookmakers\"].items():\n    outcomes = book[\"markets\"][\"101\"][\"outcomes\"]\n    opening, closing = [], []\n    for leg in (\"101\", \"102\", \"103\"):\n        # players[\"0\"] is a list of snapshots, oldest first\n        snaps = [s for s in outcomes[leg][\"players\"][\"0\"]\n                 if s[\"active\"] and s[\"createdAt\"] &lt; KICK_OFF]\n        opening.append(snaps[0][\"price\"])\n        closing.append(snaps[-1][\"price\"])\n    first_seen = min(s[\"createdAt\"] for leg in outcomes.values() for s in leg[\"players\"][\"0\"])\n    print(f\"{slug:&lt;11} first quote {first_seen[:16]}\")\n    for label, q in ((\"open\", opening), (\"close\", closing)):\n        print(f\"  {label:&lt;5} {q[0]:&gt;6} {q[1]:&gt;6} {q[2]:&gt;6}   margin {sum(1 \/ x for x in q) - 1:.2%}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>bet365      first quote 2026-09-05T19:34\n  open   4.333    3.6   1.71   margin 9.34%\n  close    5.0    3.8   1.66   margin 6.56%\ndraftkings  first quote 2026-09-07T01:13\n  open     4.0   3.75    1.8   margin 7.22%\n  close    5.0   3.85   1.69   margin 5.15%\npinnacle    first quote 2026-09-06T19:16\n  open    3.48   3.51   2.04   margin 6.25%\n  close    5.3    4.0  1.689   margin 3.07%\n<\/code><\/pre>\n<p>Pinnacle opened Arsenal at 2.04 thirteen days out and closed at 1.689. Its margin fell from 6.25% to 3.07% on the way. A bettor who took 2.04 at the open held a price 20.8% above the close. That gap is closing line value (CLV), the number most models test against. The <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting guide<\/a> builds a full test on this endpoint.<\/p>\n<p>The live and historical payloads differ. Live odds nest under <code>bookmakerOdds<\/code> and <code>players[\"0\"]<\/code> is one price object. Historical odds nest under <code>bookmakers<\/code> and <code>players[\"0\"]<\/code> is a list of snapshots.<\/p>\n<h2>How Far 250 Requests Go<\/h2>\n<p>Every call is one request, whatever the payload size. This is how the jobs above price out:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Job<\/th>\n<th>Requests<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Discovery: <code>\/sports<\/code>, <code>\/bookmakers<\/code>, <code>\/tournaments<\/code> (cache them)<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>A six-fixture Nations League evening: 1 <code>\/fixtures<\/code> + 6 <code>\/odds<\/code><\/td>\n<td>7<\/td>\n<\/tr>\n<tr>\n<td>A ten-fixture Premier League matchday before kick-off<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>Opening and closing lines for 3 books on one played fixture<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>A 200-fixture closing-line backtest, 3 books each<\/td>\n<td>200<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Two habits stretch the budget. Pull odds once per fixture close to kick-off instead of polling. Space calls to the same endpoint by at least one second, because the API rate-limits per endpoint and returns HTTP 429 with a <code>retryMs<\/code> field. A 429 body is valid JSON, so check the status code before you read <code>bookmakerOdds<\/code>.<\/p>\n<h2>When to Upgrade<\/h2>\n<ul>\n<li><strong>You poll the same fixtures all day.<\/strong> Polling burns the 250 fast. Paid plans price per bookmaker, per sport and per request volume on the <a href=\"https:\/\/oddspapi.io\/en\/pricing\" target=\"_blank\" rel=\"noopener\">pricing calculator<\/a>.<\/li>\n<li><strong>You need push updates.<\/strong> WebSocket streaming is not part of the free plan. The <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket odds guide<\/a> covers what it adds.<\/li>\n<li><strong>You run a production system.<\/strong> Use the free plan to prove the model on real prices first.<\/li>\n<\/ul>\n<h2>FAQ<\/h2>\n<h3>Is there a free odds API with Pinnacle?<\/h3>\n<p>Yes. OddsPapi&#8217;s free plan covers every bookmaker, Pinnacle included. On 29 September 2026 one call on Spain v Croatia returned Pinnacle&#8217;s 1X2 at 1.202 \/ 7.45 \/ 12.97 with a stake limit on each leg.<\/p>\n<h3>How many requests does the OddsPapi free plan include?<\/h3>\n<p>250 a month, across all sports and all bookmakers. Each call counts as one request, whether it returns one book or 274.<\/p>\n<h3>Does the free plan include historical odds?<\/h3>\n<p>Yes. <code>\/historical-odds<\/code> returns every snapshot for up to three bookmakers per call. The window is rolling: in September 2026 it reached back about eight months on the Premier League.<\/p>\n<h3>How many bookmakers does one call return?<\/h3>\n<p>It depends on the fixture. Six Nations League fixtures on 29 September 2026 returned between 216 and 274 bookmakers each. Dedupe on the price tuple before you count, because regional skins quote identical prices.<\/p>\n<h3>Is OddsPapi free forever or a trial?<\/h3>\n<p>It is a plan, not a trial. The sign-up form asks for an email and a password, not a card, and the plan carries 250 requests a month.<\/p>\n<h3>How does the free plan compare to The Odds API free tier?<\/h3>\n<p>The Odds API gives 500 credits and charges 1 credit per region per market on a live call, 10 on a historical call. OddsPapi gives 250 requests and charges 1 per call, whatever it returns.<\/p>\n<p><script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[\n{\"@type\":\"Question\",\"name\":\"Is there a free odds API with Pinnacle?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. OddsPapi's free plan covers every bookmaker, Pinnacle included. On 29 September 2026 one call on Spain v Croatia returned Pinnacle's 1X2 at 1.202 \/ 7.45 \/ 12.97 with a stake limit on each leg.\"}},\n{\"@type\":\"Question\",\"name\":\"How many requests does the OddsPapi free plan include?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"250 a month, across all sports and all bookmakers. Each call counts as one request, whether it returns one book or 274.\"}},\n{\"@type\":\"Question\",\"name\":\"Does the free plan include historical odds?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. The historical-odds endpoint returns every snapshot for up to three bookmakers per call. The window is rolling: in September 2026 it reached back about eight months on the Premier League.\"}},\n{\"@type\":\"Question\",\"name\":\"How many bookmakers does one call return?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"It depends on the fixture. Six Nations League fixtures on 29 September 2026 returned between 216 and 274 bookmakers each. Dedupe on the price tuple before you count, because regional skins quote identical prices.\"}},\n{\"@type\":\"Question\",\"name\":\"Is OddsPapi free forever or a trial?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"It is a plan, not a trial. The sign-up form asks for an email and a password, not a card, and the plan carries 250 requests a month.\"}},\n{\"@type\":\"Question\",\"name\":\"How does the free plan compare to The Odds API free tier?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The Odds API gives 500 credits and charges 1 credit per region per market on a live call, 10 on a historical call. OddsPapi gives 250 requests and charges 1 per call, whatever it returns.\"}}]}\n<\/script><\/p>\n<h2>Stop Scraping. Start Building.<\/h2>\n<p>A scraper breaks every time a bookmaker changes its page. One free key gets you 350+ bookmakers, 69 sports and history under one schema.<\/p>\n<p><strong><a href=\"https:\/\/oddspapi.io\/en\/sign-up\" target=\"_blank\" rel=\"noopener\">Get your free OddsPapi API key<\/a><\/strong><\/p>\n<p><!--\nFocus Keyphrase: free odds API\nSEO Title: Free Odds API: 250 Requests, 274 Bookmakers in One Call\nMeta Description: One free odds API call on Spain v Croatia returned 871 market IDs and 194,745 prices. The 264 active 1X2 quotes dedupe to 98 distinct prices.\nSlug: free-odds-api-350-bookmakers\nRefreshed 29 Sep 2026. All figures measured live that day: catalogue 361 slugs \/ 286 liveOdds \/ 117 cloneOf; free plan text read on oddspapi.io\/en\/sign-up; The Odds API rates read on their v4 docs and home page.\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>One free odds API call on Spain v Croatia returned 871 market IDs and 194,745 prices. The 264 active 1X2 quotes dedupe to 98 distinct prices.<\/p>\n","protected":false},"author":2,"featured_media":683,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[12,8,9,11,10],"class_list":["post-144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-betting-data","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>Free Odds API: 250 Requests, 274 Bookmakers in One Call | 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\/free-odds-api-350-bookmakers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Free Odds API: 250 Requests, 274 Bookmakers in One Call | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"One free odds API call on Spain v Croatia returned 871 market IDs and 194,745 prices. The 264 active 1X2 quotes dedupe to 98 distinct prices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-31T15:10:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-15T20:55:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1408\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Free Odds API: 250 Requests, 274 Bookmakers in One Call\",\"datePublished\":\"2026-01-31T15:10:21+00:00\",\"dateModified\":\"2026-10-15T20:55:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\"},\"wordCount\":1226,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp\",\"keywords\":[\"Betting Data\",\"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\/free-odds-api-350-bookmakers\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\",\"name\":\"Free Odds API: 250 Requests, 274 Bookmakers in One Call | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp\",\"datePublished\":\"2026-01-31T15:10:21+00:00\",\"dateModified\":\"2026-10-15T20:55:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp\",\"width\":1408,\"height\":768,\"caption\":\"Free Odds API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free Odds API: 250 Requests, 274 Bookmakers in One Call\"}]},{\"@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":"Free Odds API: 250 Requests, 274 Bookmakers in One Call | 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\/free-odds-api-350-bookmakers\/","og_locale":"en_US","og_type":"article","og_title":"Free Odds API: 250 Requests, 274 Bookmakers in One Call | OddsPapi Blog","og_description":"One free odds API call on Spain v Croatia returned 871 market IDs and 194,745 prices. The 264 active 1X2 quotes dedupe to 98 distinct prices.","og_url":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-01-31T15:10:21+00:00","article_modified_time":"2026-10-15T20:55:44+00:00","og_image":[{"width":1408,"height":768,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.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":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Free Odds API: 250 Requests, 274 Bookmakers in One Call","datePublished":"2026-01-31T15:10:21+00:00","dateModified":"2026-10-15T20:55:44+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/"},"wordCount":1226,"commentCount":12,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp","keywords":["Betting Data","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\/free-odds-api-350-bookmakers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/","url":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/","name":"Free Odds API: 250 Requests, 274 Bookmakers in One Call | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp","datePublished":"2026-01-31T15:10:21+00:00","dateModified":"2026-10-15T20:55:44+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/01\/free-odds-api-2.webp","width":1408,"height":768,"caption":"Free Odds API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Free Odds API: 250 Requests, 274 Bookmakers in One Call"}]},{"@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\/144","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=144"}],"version-history":[{"count":5,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":5088,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/144\/revisions\/5088"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/683"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}