{"id":3083,"date":"2026-07-02T10:00:00","date_gmt":"2026-07-02T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3083"},"modified":"2026-06-21T15:36:05","modified_gmt":"2026-06-21T15:36:05","slug":"first-odds-api-call-python","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/","title":{"rendered":"Your First Odds API Call in Python: A Beginner&#8217;s Guide (Free Key)"},"content":{"rendered":"<p>You want live betting odds in a Python script. You searched, found a wall of enterprise sales pages and scraping tutorials that break every week, and bounced. This guide is the opposite: a copy-paste walkthrough that takes you from zero to a live odds payload in about five minutes, on a free API key, no credit card.<\/p>\n<p>By the end you will have made four real calls: authenticate, list the sports, fetch a fixture, and read a live price from 12 bookmakers including Pinnacle. Every snippet below was run against the live API before publishing.<\/p>\n<h2>What You Need<\/h2>\n<ul>\n<li>Python 3.8 or newer.<\/li>\n<li>The <code>requests<\/code> library: <code>pip install requests<\/code>.<\/li>\n<li>A free OddsPapi API key. <a href=\"https:\/\/oddspapi.io\/\">Grab one here<\/a>, it takes a minute and no card is required.<\/li>\n<\/ul>\n<p>That is the whole shopping list. No SDK to install, no OAuth dance, no webhook setup. The API is plain JSON over HTTPS.<\/p>\n<h2>The One Gotcha That Trips Up Beginners<\/h2>\n<p>Most APIs want your key in an <code>Authorization<\/code> header. OddsPapi does not. The key goes in the <strong>query string<\/strong> as <code>apiKey<\/code>. Put it in a header and you get a 401, then waste an hour wondering why. With the <code>requests<\/code> library you never build the URL by hand; you pass a <code>params<\/code> dict and it does the encoding for you.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\n# apiKey is a QUERY PARAMETER, not a header.\nparams = {\"apiKey\": API_KEY}\nresponse = requests.get(f\"{BASE}\/sports\", params=params)\n\nprint(response.status_code)  # 200 means you are in\n<\/code><\/pre>\n<p>Run that. A <code>200<\/code> is your handshake. If you see <code>401<\/code>, your key is wrong or you put it in a header. That is the entire authentication story.<\/p>\n<h2>Scraping vs One API Call<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping a sportsbook<\/th>\n<th>One OddsPapi call<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Setup<\/td>\n<td>Headless browser, proxies, captcha solver<\/td>\n<td><code>pip install requests<\/code><\/td>\n<\/tr>\n<tr>\n<td>Breaks when<\/td>\n<td>The site changes its HTML (weekly)<\/td>\n<td>Practically never (stable JSON)<\/td>\n<\/tr>\n<tr>\n<td>Books covered<\/td>\n<td>One, the one you scraped<\/td>\n<td>350+ in a single response<\/td>\n<\/tr>\n<tr>\n<td>Legal grey area<\/td>\n<td>Yes<\/td>\n<td>No, it is an API<\/td>\n<\/tr>\n<tr>\n<td>Time to first data<\/td>\n<td>A weekend<\/td>\n<td>Five minutes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: List the Sports<\/h2>\n<p>The call you already made returns every sport OddsPapi covers, each with a numeric <code>sportId<\/code> you will use everywhere else. There are 69 of them.<\/p>\n<pre class=\"wp-block-code\"><code>sports = response.json()\nprint(len(sports), \"sports\")\n\n# Find the one you want by slug\nsoccer = next(s for s in sports if s[\"slug\"] == \"soccer\")\nprint(soccer)\n# {'sportId': 10, 'slug': 'soccer', 'sportName': 'Soccer'}\n<\/code><\/pre>\n<p>Soccer is <code>sportId<\/code> 10. Basketball is 11, tennis 12, baseball 13, American football 14. Hold onto that number, the next call needs it.<\/p>\n<h2>Step 2: Fetch Today&#8217;s Fixtures<\/h2>\n<p>A &#8220;fixture&#8221; is a single match (OddsPapi uses fixture for game, participant for team, tournament for league). Ask for fixtures in a date range, up to 10 days wide. Each one tells you whether it has odds yet via the <code>hasOdds<\/code> flag.<\/p>\n<pre class=\"wp-block-code\"><code>from datetime import date, timedelta\n\ntoday = date.today().isoformat()\nin_three = (date.today() + timedelta(days=3)).isoformat()\n\nparams = {\n    \"apiKey\": API_KEY,\n    \"sportId\": 10,        # soccer\n    \"from\": today,\n    \"to\": in_three,\n}\nfixtures = requests.get(f\"{BASE}\/fixtures\", params=params).json()\n\n# Keep only matches that already have prices\nlive = [f for f in fixtures if f[\"hasOdds\"]]\nprint(len(live), \"soccer fixtures with odds\")\n\nsample = live[0]\nprint(sample[\"fixtureId\"], sample[\"participant1Name\"], \"vs\", sample[\"participant2Name\"])\n<\/code><\/pre>\n<p>Each fixture carries the two team names, the tournament, the kickoff time, and the all-important <code>fixtureId<\/code>. That ID is the key to the odds.<\/p>\n<h2>Step 3: Read a Live Price<\/h2>\n<p>Now the payoff. Pass a <code>fixtureId<\/code> to <code>\/odds<\/code> and you get every bookmaker&#8217;s prices for that match. We ran this on Valur Reykjavik vs Keflavik IF (Icelandic Besta deild) and got back <strong>12 bookmakers<\/strong>, including the sharp books Pinnacle and SBOBet.<\/p>\n<p>The response is nested. The path to a single price reads: bookmaker, then market, then outcome, then the current price under <code>players[\"0\"]<\/code>. Market 101 is the Full Time Result (1X2); outcomes are 101 (Home), 102 (Draw), 103 (Away).<\/p>\n<pre class=\"wp-block-code\"><code>params = {\n    \"apiKey\": API_KEY,\n    \"fixtureId\": \"id1000018868194688\",\n    \"bookmakers\": \"pinnacle,bet365\",\n}\nodds = requests.get(f\"{BASE}\/odds\", params=params).json()\n\npinnacle = odds[\"bookmakerOdds\"][\"pinnacle\"][\"markets\"][\"101\"][\"outcomes\"]\nfor outcome_id, label in [(\"101\", \"Home\"), (\"102\", \"Draw\"), (\"103\", \"Away\")]:\n    price = pinnacle[outcome_id][\"players\"][\"0\"][\"price\"]\n    print(label, price)\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Home 2.05\nDraw 4.48\nAway 2.93\n<\/code><\/pre>\n<p>That is a live, sharp-bookmaker price in your terminal. The same payload also gives you American (<code>priceAmerican<\/code>) and fractional (<code>priceFractional<\/code>) formats, pre-converted, so you never write a converter yourself.<\/p>\n<h2>Step 4: Find the Best Price Across All 12 Books<\/h2>\n<p>One book is fine. The reason to use an aggregator is to compare them. Here is the smallest useful loop in sports betting: scan every bookmaker on the fixture and find who pays the most on the home win.<\/p>\n<pre class=\"wp-block-code\"><code># Drop the bookmakers filter to get ALL books on the fixture\nodds = requests.get(f\"{BASE}\/odds\",\n                    params={\"apiKey\": API_KEY,\n                            \"fixtureId\": \"id1000018868194688\"}).json()\n\nbest_book, best_price = None, 0.0\nfor slug, book in odds[\"bookmakerOdds\"].items():\n    try:\n        outcome = book[\"markets\"][\"101\"][\"outcomes\"][\"101\"][\"players\"][\"0\"]\n    except KeyError:\n        continue                      # this book did not price 1X2\n    if outcome[\"active\"] and outcome[\"price\"] &gt; best_price:\n        best_book, best_price = slug, outcome[\"price\"]\n\nprint(f\"Best home price: {best_price} at {best_book}\")\n# Best home price: 2.16 at sbobet\n<\/code><\/pre>\n<p>SBOBet pays 2.16 on the home win where Pinnacle pays 2.05. On a 100 unit stake that is 11 units of extra profit for the exact same bet, found in five lines of code. Always check <code>active<\/code> before trusting a price; suspended outcomes can carry stale numbers.<\/p>\n<h2>What&#8217;s Next<\/h2>\n<p>You now have the four moves that underpin every odds script: authenticate, discover, fetch, parse. From here the same four calls power real tools:<\/p>\n<ul>\n<li><strong>350+ bookmakers<\/strong> in one response means line shopping and arbitrage are just bigger versions of Step 4. See <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping in Python<\/a>.<\/li>\n<li><strong>Free historical odds<\/strong> on the free tier let you backtest a model on real closing prices.<\/li>\n<li>Want a UI? Pipe the same data into <a href=\"https:\/\/oddspapi.io\/blog\/pandas-odds-api-dataframe-tutorial\/\">a pandas DataFrame<\/a> or build <a href=\"https:\/\/oddspapi.io\/blog\/build-betting-app-python-beginner-guide\/\">a full betting app<\/a>.<\/li>\n<\/ul>\n<h2>Frequently Asked Questions<\/h2>\n<h3>How do I authenticate with the OddsPapi API in Python?<\/h3>\n<p>Pass your key as the <code>apiKey<\/code> query parameter, not as a header. With the requests library, use <code>requests.get(url, params={\"apiKey\": \"YOUR_KEY\"})<\/code>. A 200 status confirms it worked; a 401 usually means the key was placed in a header by mistake.<\/p>\n<h3>Do I need a credit card to get a free odds API key?<\/h3>\n<p>No. The OddsPapi free tier requires only a sign-up, no card. It includes 350+ bookmakers and free historical odds, so you can build and backtest without paying.<\/p>\n<h3>What is the difference between a fixture, a tournament, and a participant?<\/h3>\n<p>OddsPapi uses fixture for a single match (US &#8220;game&#8221;), tournament for a league or competition, and participant for a team or player. A <code>fixtureId<\/code> is what you pass to the <code>\/odds<\/code> endpoint to get prices.<\/p>\n<h3>Why is the odds response so deeply nested?<\/h3>\n<p>Because one fixture holds many bookmakers, each with many markets, each with multiple outcomes. The path to a current price is bookmaker, market, outcome, then <code>players[\"0\"][\"price\"]<\/code>. Never assume flat JSON.<\/p>\n<h3>Can I get odds from more than one bookmaker in a single call?<\/h3>\n<p>Yes. Pass a comma-separated list to the <code>bookmakers<\/code> parameter, or omit it entirely to receive every book that priced the fixture (12 in the example above, up to 350+ on major matches).<\/p>\n<h2>Make the Call<\/h2>\n<p>Four calls, five minutes, zero scraping. <a href=\"https:\/\/oddspapi.io\/\">Get your free OddsPapi API key<\/a> and run the snippets above. The hardest part is already behind you.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\": \"Question\", \"name\": \"How do I authenticate with the OddsPapi API in Python?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Pass your key as the apiKey query parameter, not as a header. With requests, use requests.get(url, params={'apiKey': 'YOUR_KEY'}). A 200 status confirms it worked; a 401 usually means the key was placed in a header.\"}},\n    {\"@type\": \"Question\", \"name\": \"Do I need a credit card to get a free odds API key?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. The OddsPapi free tier requires only a sign-up, no card. It includes 350+ bookmakers and free historical odds, so you can build and backtest without paying.\"}},\n    {\"@type\": \"Question\", \"name\": \"What is the difference between a fixture, a tournament, and a participant?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"OddsPapi uses fixture for a single match, tournament for a league or competition, and participant for a team or player. A fixtureId is what you pass to the odds endpoint to get prices.\"}},\n    {\"@type\": \"Question\", \"name\": \"Why is the odds response so deeply nested?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Because one fixture holds many bookmakers, each with many markets, each with multiple outcomes. The path to a current price is bookmaker, market, outcome, then players['0']['price'].\"}},\n    {\"@type\": \"Question\", \"name\": \"Can I get odds from more than one bookmaker in a single call?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Pass a comma-separated list to the bookmakers parameter, or omit it to receive every book that priced the fixture, up to 350+ on major matches.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: odds api python tutorial\nSEO Title: Your First Odds API Call in Python: A Beginner's Guide (Free Key)\nMeta Description: New to odds APIs? Make your first Python call in 5 minutes. Free OddsPapi key, 350+ bookmakers, no scraping, no card. Beginner tutorial with tested code.\nSlug: first-odds-api-call-python\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>New to odds APIs? Make your first Python call in 5 minutes. Free OddsPapi key, 350+ bookmakers, no scraping, no card. Beginner tutorial with tested code.<\/p>\n","protected":false},"author":2,"featured_media":3084,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,9,11,10],"class_list":["post-3083","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","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>Your First Odds API Call in Python: A Beginner&#039;s Guide (Free Key) | 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\/first-odds-api-call-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Your First Odds API Call in Python: A Beginner&#039;s Guide (Free Key) | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"New to odds APIs? Make your first Python call in 5 minutes. Free OddsPapi key, 350+ bookmakers, no scraping, no card. Beginner tutorial with tested code.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-02T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1429\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Odds API Writer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/oddspapi.io\/logo-v2.webp\" \/>\n<meta name=\"twitter:creator\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:site\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Odds API Writer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Your First Odds API Call in Python: A Beginner&#8217;s Guide (Free Key)\",\"datePublished\":\"2026-07-02T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/\"},\"wordCount\":921,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp\",\"keywords\":[\"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\/first-odds-api-call-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/\",\"name\":\"Your First Odds API Call in Python: A Beginner's Guide (Free Key) | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp\",\"datePublished\":\"2026-07-02T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Your First Odds API Call in Python - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Your First Odds API Call in Python: A Beginner&#8217;s Guide (Free Key)\"}]},{\"@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":"Your First Odds API Call in Python: A Beginner's Guide (Free Key) | 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\/first-odds-api-call-python\/","og_locale":"en_US","og_type":"article","og_title":"Your First Odds API Call in Python: A Beginner's Guide (Free Key) | OddsPapi Blog","og_description":"New to odds APIs? Make your first Python call in 5 minutes. Free OddsPapi key, 350+ bookmakers, no scraping, no card. Beginner tutorial with tested code.","og_url":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-07-02T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp","type":"image\/webp"}],"author":"Odds API Writer","twitter_card":"summary_large_image","twitter_image":"https:\/\/oddspapi.io\/logo-v2.webp","twitter_creator":"@oddspapiapi","twitter_site":"@oddspapiapi","twitter_misc":{"Written by":"Odds API Writer","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Your First Odds API Call in Python: A Beginner&#8217;s Guide (Free Key)","datePublished":"2026-07-02T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/"},"wordCount":921,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp","keywords":["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\/first-odds-api-call-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/","url":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/","name":"Your First Odds API Call in Python: A Beginner's Guide (Free Key) | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp","datePublished":"2026-07-02T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/first-odds-api-call-python-scaled.webp","width":2560,"height":1429,"caption":"Your First Odds API Call in Python - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/first-odds-api-call-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Your First Odds API Call in Python: A Beginner&#8217;s Guide (Free Key)"}]},{"@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\/3083","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=3083"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3083\/revisions"}],"predecessor-version":[{"id":3085,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3083\/revisions\/3085"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3084"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}