{"id":2970,"date":"2026-06-15T10:00:00","date_gmt":"2026-06-15T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=2970"},"modified":"2026-06-05T14:41:03","modified_gmt":"2026-06-05T14:41:03","slug":"free-sports-data-api","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/","title":{"rendered":"Free Sports Data API: 69 Sports of Schedules &#038; Odds (Python)"},"content":{"rendered":"\n<h2>Free Sports Data API: Schedules &amp; Live Odds for 69 Sports<\/h2>\n\n<p>Search &#8220;free sports data API&#8221; and you get a wall of providers that either gate the good data behind a sales call or hand you a 20-event free tier that runs dry by lunchtime. If what you actually need is the <strong>betting-market data layer<\/strong> &mdash; fixtures, schedules, and live odds across every sport and bookmaker &mdash; this guide shows you how to pull it in Python from a genuinely free API.<\/p>\n\n<p>One honest note up front, because it saves you 20 minutes: OddsPapi is an <strong>odds-first<\/strong> sports data API. You get the schedule (who plays whom, when, and whether the game is live or finished) plus prices from <strong>370 bookmakers<\/strong>. You do <em>not<\/em> get play-by-play scores, box scores, or player stat lines. If you need final scores, every fixture ships a map of third-party IDs (Sofascore, Betradar, Pinnacle) so you can join results from a stats feed yourself. More on that below &mdash; we&#8217;ll be specific about what&#8217;s in the JSON and what isn&#8217;t.<\/p>\n\n<h2>What &#8220;Sports Data&#8221; Actually Means (and What You&#8217;re Probably Searching For)<\/h2>\n\n<p>&#8220;Sports data API&#8221; is a catch-all. In practice, devs searching it want one of three different things:<\/p>\n\n<figure class=\"wp-block-table\">\n<table>\n  <thead><tr><th>You want&hellip;<\/th><th>Example<\/th><th>Is OddsPapi the right tool?<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td>Schedules &amp; fixtures<\/td><td>&#8220;What MLB games are on tonight?&#8221;<\/td><td>\u2705 Yes &mdash; 69 sports, full boards<\/td><\/tr>\n    <tr><td>Betting odds &amp; lines<\/td><td>&#8220;What&#8217;s the moneyline on Yankees vs Red Sox?&#8221;<\/td><td>\u2705 Yes &mdash; 370 books, live<\/td><\/tr>\n    <tr><td>Live &amp; historical odds<\/td><td>&#8220;How did the line move before kickoff?&#8221;<\/td><td>\u2705 Yes &mdash; free historical endpoint<\/td><\/tr>\n    <tr><td>Final scores &amp; results<\/td><td>&#8220;Who won, and what was the score?&#8221;<\/td><td>\u26a0\ufe0f Partial &mdash; status only, no score<\/td><\/tr>\n    <tr><td>Player\/team stats<\/td><td>&#8220;How many strikeouts did the pitcher throw?&#8221;<\/td><td>\u274c No &mdash; use a dedicated stats feed<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/figure>\n\n<p>If your project lives in the top three rows &mdash; an odds comparison tool, an arb scanner, a value-betting model, a line-movement tracker &mdash; the rest of this post is your fast path. If you only need the bottom two rows, you want a stats provider, not us, and we&#8217;d rather tell you that now than waste your free credits.<\/p>\n\n<h2>The Old Way vs. The Free API<\/h2>\n\n<figure class=\"wp-block-table\">\n<table>\n  <thead><tr><th>The Old Way<\/th><th>OddsPapi<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td>Scrape each sportsbook site, fight Cloudflare, re-write your parser every time the HTML changes<\/td><td>One JSON endpoint, 370 books normalized to the same shape<\/td><\/tr>\n    <tr><td>&#8220;Free tier&#8221; capped at ~500 credits where one odds call burns 6+ credits<\/td><td>250 free requests\/month, each returning a full board of books<\/td><\/tr>\n    <tr><td>Historical odds locked behind a paid add-on<\/td><td>Free <code>\/historical-odds<\/code> endpoint for backtesting<\/td><\/tr>\n    <tr><td>~40 bookmakers, no sharps<\/td><td>370 books including Pinnacle, Polymarket, Kalshi, crypto<\/td><\/tr>\n    <tr><td>Polling on a timer, always a few seconds stale<\/td><td>Real-time WebSocket push available<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/figure>\n\n<h2>Step 1: Authentication<\/h2>\n\n<p>Auth is a query parameter, not a header. Grab a free key and pass it on every call.<\/p>\n\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\n# apiKey is a QUERY PARAMETER, never a header\nr = requests.get(f\"{BASE_URL}\/sports\", params={\"apiKey\": API_KEY})\nprint(r.status_code)          # 200\nprint(len(r.json()), \"sports\")  # 69\n<\/code><\/pre>\n\n<h2>Step 2: Discover the Sports Catalog<\/h2>\n\n<p>The <code>\/sports<\/code> endpoint returns all 69 sports with their IDs and slugs. You need the <code>sportId<\/code> for every downstream call.<\/p>\n\n<pre class=\"wp-block-code\"><code>sports = requests.get(f\"{BASE_URL}\/sports\", params={\"apiKey\": API_KEY}).json()\n\nfor s in sports[:8]:\n    print(s[\"sportId\"], s[\"slug\"], s[\"name\"])\n\n# 10 soccer Soccer\n# 11 basketball Basketball\n# 12 tennis Tennis\n# 13 baseball Baseball\n# 14 american-football American Football\n# 15 ice-hockey Ice Hockey\n# ...\n<\/code><\/pre>\n\n<h2>Step 3: Pull the Schedule (Fixtures)<\/h2>\n\n<p>The <code>\/fixtures<\/code> endpoint is your schedule feed. Give it a <code>sportId<\/code> and a date range (max 10 days apart) and it returns every fixture &mdash; teams, start time, tournament, status, and whether odds are available.<\/p>\n\n<pre class=\"wp-block-code\"><code>params = {\n    \"apiKey\": API_KEY,\n    \"sportId\": 13,            # Baseball\n    \"from\": \"2026-06-05\",\n    \"to\": \"2026-06-08\",\n}\nfixtures = requests.get(f\"{BASE_URL}\/fixtures\", params=params).json()\n\nfor f in fixtures:\n    if f[\"hasOdds\"] and f[\"statusName\"] == \"Pre-Game\":\n        print(f[\"fixtureId\"], f[\"participant1Name\"], \"vs\", f[\"participant2Name\"])\n\n# id1300010963301407 New York Yankees vs Boston Red Sox\n# id1300010963302659 Chicago Cubs vs San Francisco Giants\n# ...\n<\/code><\/pre>\n\n<p>How busy is the schedule? Here&#8217;s the real fixture count for a single 3-day window (June 5&ndash;8, 2026), and how many already carry live odds:<\/p>\n\n<figure class=\"wp-block-table\">\n<table>\n  <thead><tr><th>Sport<\/th><th>Fixtures (3-day window)<\/th><th>With live odds<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td>Soccer<\/td><td>1,553<\/td><td>734<\/td><\/tr>\n    <tr><td>Baseball<\/td><td>603<\/td><td>81<\/td><\/tr>\n    <tr><td>Tennis<\/td><td>357<\/td><td>177<\/td><\/tr>\n    <tr><td>Basketball<\/td><td>192<\/td><td>97<\/td><\/tr>\n    <tr><td>Cricket<\/td><td>128<\/td><td>69<\/td><\/tr>\n    <tr><td>Ice Hockey<\/td><td>21<\/td><td>12<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/figure>\n\n<h3>What&#8217;s in a Fixture Object (and What Isn&#8217;t)<\/h3>\n\n<p>This is the honesty section. Here&#8217;s a real fixture, trimmed:<\/p>\n\n<pre class=\"wp-block-code\"><code>{\n  \"fixtureId\": \"id1300010963301407\",\n  \"sportId\": 13,\n  \"tournamentName\": \"MLB\",\n  \"startTime\": \"2026-06-05T23:05:00.000Z\",\n  \"statusName\": \"Pre-Game\",          # Pre-Game | Live | Finished | Cancelled\n  \"hasOdds\": true,\n  \"participant1Name\": \"New York Yankees\",\n  \"participant2Name\": \"Boston Red Sox\",\n  \"externalProviders\": {\n    \"sofascoreId\": 16217421,\n    \"betradarId\": 67360970,\n    \"pinnacleId\": 1631660206,\n    \"opticoddsId\": \"2026060539CEEF6E\"\n  }\n}\n<\/code><\/pre>\n\n<p>You get <strong>status<\/strong> (so you know if a game is live or final) but <strong>no score and no stats<\/strong>. The trade-off: every fixture carries <code>externalProviders<\/code> &mdash; a map of IDs into Sofascore, Betradar, Pinnacle, and others. If you need final scores, use the <code>sofascoreId<\/code> to look the result up in a stats feed and join it back to the odds on <code>fixtureId<\/code>. That gives you a clean two-source pipeline: OddsPapi for the market data, a stats provider for the box score.<\/p>\n\n<h2>Step 4: Fetch the Odds<\/h2>\n\n<p>Pass a <code>fixtureId<\/code> to <code>\/odds<\/code> and you get every bookmaker pricing that game. The response is nested &mdash; <code>bookmakerOdds &rarr; slug &rarr; markets &rarr; marketId &rarr; outcomes &rarr; outcomeId &rarr; players[\"0\"] &rarr; price<\/code>.<\/p>\n\n<pre class=\"wp-block-code\"><code>fid = \"id1300010963301407\"   # Yankees vs Red Sox\nodds = requests.get(f\"{BASE_URL}\/odds\",\n                    params={\"apiKey\": API_KEY, \"fixtureId\": fid}).json()\n\nbooks = odds[\"bookmakerOdds\"]\nprint(len(books), \"books on this fixture\")   # 14\n\ndef moneyline(slug, outcome):\n    # market 131 = moneyline; outcome 131 = home, 132 = away\n    try:\n        node = books[slug][\"markets\"][\"131\"][\"outcomes\"][outcome][\"players\"][\"0\"]\n        return node[\"price\"] if node.get(\"active\") else None\n    except KeyError:\n        return None\n\nfor slug in sorted(books):\n    home, away = moneyline(slug, \"131\"), moneyline(slug, \"132\")\n    if home and away:\n        print(f\"{slug:18} {home}  {away}\")\n\n# betmgm             1.67   2.25\n# caesars            1.69   2.22\n# draftkings         1.67   2.23\n# fanduel            1.69   2.22\n# kalshi             1.724  2.273\n# pinnacle           1.719  2.28\n# polymarket         1.724  2.326\n# williamhill        1.69   2.22\n<\/code><\/pre>\n\n<p>Ten of the 14 books priced the moneyline, including the sharp anchor (Pinnacle) and two prediction markets (Kalshi, Polymarket). That mix &mdash; sharps, US retail books, and prediction markets in one call &mdash; is the thing the ~40-book &#8220;free&#8221; APIs can&#8217;t give you.<\/p>\n\n<h2>Step 5: Turn Raw Prices Into Fair Odds<\/h2>\n\n<p>Pinnacle is the sharpest book in the field, so de-vigging its line gives you a fair-probability benchmark to grade every other price against. Strip the margin with the simple two-way method:<\/p>\n\n<pre class=\"wp-block-code\"><code>def devig_two_way(home, away):\n    ih, ia = 1\/home, 1\/away\n    total = ih + ia                 # &gt; 1; the overround\n    return ih\/total, ia\/total, (total - 1) * 100\n\np_home, p_away, vig = devig_two_way(1.719, 2.28)   # Pinnacle\nprint(f\"Vig: {vig:.2f}%\")                           # 2.03%\nprint(f\"Fair: NYY {p_home*100:.1f}%  BOS {p_away*100:.1f}%\")\n# Fair: NYY 57.0%  BOS 43.0%   ->  fair odds 1.754 \/ 2.326\n<\/code><\/pre>\n\n<p>Pinnacle&#8217;s margin on this game was just <strong>2.03%<\/strong>. The no-vig fair line was Yankees 1.754 \/ Red Sox 2.326. Now line-shop: the best available Red Sox price across all 10 books was Polymarket at <strong>2.326<\/strong> &mdash; exactly the sharp fair number, and better than every retail book (FanDuel\/Caesars\/William Hill all sat at 2.22). The best Yankees price was Kalshi at 1.724. Finding those outliers is one loop:<\/p>\n\n<pre class=\"wp-block-code\"><code>def best_price(books, market, outcome):\n    best, who = 0, None\n    for slug, data in books.items():\n        try:\n            node = data[\"markets\"][market][\"outcomes\"][outcome][\"players\"][\"0\"]\n            if node.get(\"active\") and node[\"price\"] &gt; best:\n                best, who = node[\"price\"], slug\n        except KeyError:\n            continue\n    return who, best\n\nprint(best_price(books, \"131\", \"132\"))   # ('polymarket', 2.326)\n<\/code><\/pre>\n\n<h2>Free Historical Odds (For Backtesting)<\/h2>\n\n<p>The same fixture has a price history. <code>\/historical-odds<\/code> returns every recorded snapshot per book &mdash; free, where competitors charge for it. The shape differs from live: the top key is <code>bookmakers<\/code> (not <code>bookmakerOdds<\/code>), and <code>players[\"0\"]<\/code> is a <em>list<\/em> of snapshots, not a single price. Max 3 books per call.<\/p>\n\n<pre class=\"wp-block-code\"><code>params = {\"apiKey\": API_KEY, \"fixtureId\": fid, \"bookmakers\": \"pinnacle\"}\nhist = requests.get(f\"{BASE_URL}\/historical-odds\", params=params).json()\n\nsnaps = hist[\"bookmakers\"][\"pinnacle\"][\"markets\"][\"131\"][\"outcomes\"][\"131\"][\"players\"][\"0\"]\nfor snap in snaps[:5]:\n    print(snap[\"createdAt\"], snap[\"price\"])\n<\/code><\/pre>\n\n<p>Feed that into a closing-line-value model and you can grade your bets against where the sharp line actually closed &mdash; the only honest measure of whether you&#8217;re beating the market. Our <a href=\"https:\/\/oddspapi.io\/blog\/historical-odds-csv-excel-backtesting\/\">historical odds CSV\/Excel guide<\/a> walks through flattening this into a DataFrame.<\/p>\n\n<h2>FAQ<\/h2>\n\n<h3>Is there a truly free sports data API?<\/h3>\n<p>Yes. OddsPapi&#8217;s free tier gives you 250 requests\/month across 69 sports and 370 bookmakers, including free historical odds. There&#8217;s no credit card required and no sales call to unlock it.<\/p>\n\n<h3>Does the API include live scores and player stats?<\/h3>\n<p>No. OddsPapi is odds-first: you get schedules, fixture status (Pre-Game\/Live\/Finished), and bookmaker odds, but not scores or stat lines. Each fixture carries <code>externalProviders<\/code> IDs (Sofascore, Betradar) so you can join results from a dedicated stats feed.<\/p>\n\n<h3>How many sports and bookmakers are covered?<\/h3>\n<p>69 sports and 370 bookmakers as of June 2026, spanning sharps (Pinnacle, SBOBet), US books (DraftKings, FanDuel, BetMGM), prediction markets (Polymarket, Kalshi), and crypto books (Stake, 1xBet).<\/p>\n\n<h3>What&#8217;s the difference between this and an odds API?<\/h3>\n<p>None, functionally &mdash; &#8220;sports data API&#8221; and &#8220;odds API&#8221; describe the same product here. The data is fixtures plus odds. The only thing a generic &#8220;sports data&#8221; feed adds that we don&#8217;t is scores and stats.<\/p>\n\n<h3>How do I get real-time updates instead of polling?<\/h3>\n<p>OddsPapi pushes price changes over a <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket feed<\/a> so you don&#8217;t have to poll on a timer. For most projects, polling <code>\/odds<\/code> every few seconds on the free tier is plenty.<\/p>\n\n<h2>Start Pulling Sports Data<\/h2>\n\n<p>You now have the full path: discover sports, pull the schedule, fetch odds from 370 books, de-vig against Pinnacle, and line-shop for the best price &mdash; all on a free key. Stop scraping sportsbook HTML. <a href=\"https:\/\/oddspapi.io\/\">Get your free API key<\/a> and make your first call in the next five minutes.<\/p>\n\n<p>More tutorials: <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">Free Odds API guide<\/a> &middot; <a href=\"https:\/\/oddspapi.io\/blog\/sportsbook-api-350-bookmakers\/\">Sportsbook API<\/a> &middot; <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">Line shopping in Python<\/a> &middot; <a href=\"https:\/\/oddspapi.io\/blog\/live-betting-api-real-time-in-play-odds\/\">Live betting API<\/a> &middot; <a href=\"https:\/\/oddspapi.io\/blog\/the-odds-api-free-tier-limits\/\">The Odds API free tier limits<\/a>.<\/p>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\": \"Question\", \"name\": \"Is there a truly free sports data API?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. OddsPapi's free tier gives you 250 requests\/month across 69 sports and 370 bookmakers, including free historical odds. No credit card and no sales call required.\"}},\n    {\"@type\": \"Question\", \"name\": \"Does the API include live scores and player stats?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. OddsPapi is odds-first: you get schedules, fixture status, and bookmaker odds, but not scores or stat lines. Each fixture carries externalProviders IDs (Sofascore, Betradar) so you can join results from a dedicated stats feed.\"}},\n    {\"@type\": \"Question\", \"name\": \"How many sports and bookmakers are covered?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"69 sports and 370 bookmakers as of June 2026, spanning sharps, US books, prediction markets, and crypto books.\"}},\n    {\"@type\": \"Question\", \"name\": \"What is the difference between a sports data API and an odds API?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Functionally none here. The data is fixtures plus odds. The only thing a generic sports data feed adds that OddsPapi does not is scores and stats.\"}},\n    {\"@type\": \"Question\", \"name\": \"How do I get real-time updates instead of polling?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"OddsPapi pushes price changes over a WebSocket feed so you do not have to poll on a timer. For most projects polling the odds endpoint every few seconds on the free tier is enough.\"}}\n  ]\n}\n<\/script>\n\n\n<!--\nFocus Keyphrase: free sports data api\nSEO Title: Free Sports Data API: 69 Sports of Schedules & Odds (Python)\nMeta Description: Free sports data API for devs: pull schedules & live odds from 370 bookmakers across 69 sports in Python. Honest odds-first feed, free historical data.\nSlug: free-sports-data-api\n-->\n","protected":false},"excerpt":{"rendered":"<p>Free sports data API for devs: pull schedules &#038; live odds from 370 bookmakers across 69 sports in Python. Honest odds-first feed, free historical data.<\/p>\n","protected":false},"author":2,"featured_media":2971,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[12,8,9,11,10],"class_list":["post-2970","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 Sports Data API: 69 Sports of Schedules &amp; Odds (Python) | OddsPapi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Free Sports Data API: 69 Sports of Schedules &amp; Odds (Python) | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Free sports data API for devs: pull schedules &amp; live odds from 370 bookmakers across 69 sports in Python. Honest odds-first feed, free historical data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-15T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-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\/free-sports-data-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Free Sports Data API: 69 Sports of Schedules &#038; Odds (Python)\",\"datePublished\":\"2026-06-15T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\"},\"wordCount\":1206,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.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-sports-data-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\",\"name\":\"Free Sports Data API: 69 Sports of Schedules & Odds (Python) | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.webp\",\"datePublished\":\"2026-06-15T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Free Sports Data API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free Sports Data API: 69 Sports of Schedules &#038; Odds (Python)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds API Tutorials &amp; Guides\",\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"alternateName\":\"Odds Papi\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/oddspapi.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\",\"name\":\"OddsPapi\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"width\":135,\"height\":135,\"caption\":\"OddsPapi\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/oddspapiapi\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\",\"name\":\"Odds API Writer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"caption\":\"Odds API Writer\"},\"url\":\"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Free Sports Data API: 69 Sports of Schedules & Odds (Python) | OddsPapi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/","og_locale":"en_US","og_type":"article","og_title":"Free Sports Data API: 69 Sports of Schedules & Odds (Python) | OddsPapi Blog","og_description":"Free sports data API for devs: pull schedules & live odds from 370 bookmakers across 69 sports in Python. Honest odds-first feed, free historical data.","og_url":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-06-15T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-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\/free-sports-data-api\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Free Sports Data API: 69 Sports of Schedules &#038; Odds (Python)","datePublished":"2026-06-15T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/"},"wordCount":1206,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.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-sports-data-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/","url":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/","name":"Free Sports Data API: 69 Sports of Schedules & Odds (Python) | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.webp","datePublished":"2026-06-15T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/free-sports-data-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/free-sports-data-api-scaled.webp","width":2560,"height":1429,"caption":"Free Sports Data API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Free Sports Data API: 69 Sports of Schedules &#038; Odds (Python)"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds API Tutorials &amp; Guides","publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"alternateName":"Odds Papi","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/oddspapi.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/oddspapi.io\/blog\/#organization","name":"OddsPapi","url":"https:\/\/oddspapi.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","width":135,"height":135,"caption":"OddsPapi"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/oddspapiapi"]},{"@type":"Person","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13","name":"Odds API Writer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","caption":"Odds API Writer"},"url":"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/"}]}},"_links":{"self":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2970","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=2970"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2970\/revisions"}],"predecessor-version":[{"id":2972,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2970\/revisions\/2972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/2971"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=2970"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=2970"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=2970"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}