{"id":58,"date":"2025-11-25T18:27:17","date_gmt":"2025-11-25T18:27:17","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=58"},"modified":"2026-02-05T17:19:58","modified_gmt":"2026-02-05T17:19:58","slug":"free-nfl-odds-api-guide","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/","title":{"rendered":"Free NFL Odds API Guide: Python Code for Real-Time Betting Data"},"content":{"rendered":"<div class=\"wp-block-media-text is-stacked-on-mobile\" style=\"grid-template-columns: 51% auto;\">\n<div class=\"wp-block-media-text__content\"><\/div>\n<\/div>\n<p>Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.<\/p>\n<p>If you are building a <a href=\"https:\/\/betunfair.io\/\">sports betting model<\/a>, <a href=\"https:\/\/betunfair.io\/\">a real-time odds line tracker<\/a>, an <a href=\"https:\/\/jedibets.com\/tools\/arbitrage-calculator\">arbitrage bot<\/a>, or a <a href=\"https:\/\/jedibets.com\/\">player props odds screener<\/a>, you have likely run into a wall. The data is either prohibitively expensive (Sportradar, Genius) or frustratingly limited (APIs that only cover 10 sportsbooks).<\/p>\n<p>You need coverage of the &#8220;Big 4&#8221; US books (DraftKings, FanDuel, BetMGM, Caesars) <em>plus<\/em> the offshore sharps (Pinnacle, Circa) to find true market value. And you need it fast.<\/p>\n<p>In this guide, we&#8217;ll show you how to use <a href=\"https:\/\/oddspapi.io\/\"><strong>OddsPapi<\/strong><\/a> to fetch real-time NFL data using Python.<\/p>\n<h2>NFL Odds API Providers Compared (2025)<\/h2>\n<p>Before diving into code, here&#8217;s how the major NFL odds API providers stack up:<\/p>\n<figure class=\"wp-block-table\">\n<table style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr style=\"background-color: #f4f4f4; text-align: left;\">\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Provider<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Bookmakers<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Historical Data<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Free Tier<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>OddsPapi<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">300+ (incl. Pinnacle, Circa)<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Yes (free)<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">200 requests\/month<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>The Odds API<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">~15 US books<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">No (paid only)<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">500 requests\/month<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>SportsDataIO<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">~10 books<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Limited<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Trial only<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>Sportradar<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Enterprise-level<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Yes<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">None ($2k+\/mo)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The key difference: OddsPapi includes <strong>sharp bookmakers<\/strong> like Pinnacle and Circa that set the true market price. Most &#8220;free&#8221; APIs only cover retail sportsbooks that copy lines from the sharps with worse juice.<\/p>\n<h2>API Terminology: US Sports vs. Global Standards<\/h2>\n<p>OddsPapi is a global provider. To use it effectively for US Sports, you need to map a few terms:<\/p>\n<figure class=\"wp-block-table\">\n<table style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr style=\"background-color: #f4f4f4; text-align: left;\">\n<th style=\"padding: 10px; border: 1px solid #ddd;\">US Concept<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">API Term<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Technical Note<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>League<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>Tournament<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">The NFL is a tournament within Sport ID 14 (American Football).<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>Game<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>Fixture<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">You need the <code>fixtureId<\/code> to pull odds.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>Moneyline<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>Market ID 141<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Markets are returned by ID. 141 is the standard Match Winner.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>Spread<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>Asian Handicap Markets<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Multiple IDs based on spread line (see Market IDs section below).<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><strong>Totals<\/strong><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>Market ID 148<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Over\/Under on total points scored.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Authentication &amp; Sport IDs<\/h2>\n<p>First, get your free API key. Unlike some APIs that use headers, OddsPapi expects the <code>apiKey<\/code> as a standard query parameter. This makes it easy to test right in your browser.<\/p>\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link\" href=\"https:\/\/oddspapi.io\/\">Get your free OddsPapi API key here<\/a><\/div>\n<p>We also need to target the correct sport. In our system, <strong>American Football is Sport ID 14<\/strong>.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\r\nimport json\r\nfrom datetime import datetime, timedelta\r\n\r\nAPI_KEY = \"YOUR_API_KEY_HERE\"\r\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\r\n\r\ndef get_nfl_tournament_id():\r\n    # Pass the API Key as a 'param'.\r\n    # Sport ID 14 is American Football.\r\n    params = {\r\n        \"apiKey\": API_KEY,\r\n        \"sportId\": 14\r\n    }\r\n\r\n    response = requests.get(f\"{BASE_URL}\/tournaments\", params=params)\r\n\r\n    if response.status_code == 200:\r\n        tournaments = response.json()\r\n        # Find the NFL in the list (excluding Simulations)\r\n        nfl = next((t for t in tournaments if \"NFL\" in t.get('tournamentName', '') and \"Sim\" not in t.get('tournamentName', '')), None)\r\n\r\n        if nfl:\r\n            print(f\"Found NFL League ID: {nfl['tournamentId']}\")\r\n            return nfl['tournamentId']\r\n\r\n    print(\"NFL not found.\")\r\n    return None\r\n\r\nnfl_id = get_nfl_tournament_id()\r\n<\/code><\/pre>\n<h2>Step 2: Get the Schedule (Fixtures)<\/h2>\n<p>The <code>\/fixtures<\/code> endpoint returns a flat list of games. We need to filter this list to find games that actually have odds available (<code>hasOdds: true<\/code>). This saves you from making useless calls on games that books haven&#8217;t posted lines for yet.<\/p>\n<pre class=\"wp-block-code\"><code>def get_nfl_games(tournament_id):\r\n    # Get games for the next 7 days\r\n    today = datetime.now()\r\n    params = {\r\n        \"apiKey\": API_KEY,\r\n        \"tournamentId\": tournament_id,\r\n        \"from\": today.strftime(\"%Y-%m-%dT00:00:00Z\"),\r\n        \"to\": (today + timedelta(days=7)).strftime(\"%Y-%m-%dT23:59:59Z\")\r\n    }\r\n\r\n    response = requests.get(f\"{BASE_URL}\/fixtures\", params=params)\r\n\r\n    if response.status_code == 200:\r\n        fixtures = response.json()\r\n        # Filter for games that have odds\r\n        games_with_odds = [f for f in fixtures if f.get('hasOdds')]\r\n        return games_with_odds\r\n\r\n    return []\r\n\r\nupcoming_games = get_nfl_games(nfl_id)\r\nif upcoming_games:\r\n    print(f\"Found {len(upcoming_games)} games with odds.\")\r\n    print(f\"Next Game: {upcoming_games[0]['participant1Name']} vs {upcoming_games[0]['participant2Name']}\")\r\n<\/code><\/pre>\n<h2>Step 3: Parsing the Nested Odds Structure<\/h2>\n<p>This is where most developers get stuck. To handle data from 300+ bookmakers without crashing your application, OddsPapi uses a highly optimized, nested JSON structure.<\/p>\n<p>The hierarchy is: <code>Bookmaker -&gt; Markets -&gt; Outcomes -&gt; Players -&gt; Price<\/code>.<\/p>\n<p>We specifically look for <strong>Market ID 141<\/strong> (Moneyline) to get the &#8220;Win&#8221; odds for each team.<\/p>\n<pre class=\"wp-block-code\"><code>def get_moneyline_odds(fixture_id):\r\n    params = {\r\n        \"apiKey\": API_KEY,\r\n        \"fixtureId\": fixture_id,\r\n        \"bookmaker\": \"draftkings,pinnacle,bet365\" # Compare US vs Offshore\r\n    }\r\n\r\n    response = requests.get(f\"{BASE_URL}\/odds\", params=params)\r\n    data = response.json()\r\n\r\n    print(f\"\\nOdds for Game ID: {fixture_id}\")\r\n\r\n    # Loop through Bookmakers\r\n    bookmakers = data.get('bookmakerOdds', {})\r\n\r\n    for bookie_name, bookie_data in bookmakers.items():\r\n        if not bookie_data.get('bookmakerIsActive'):\r\n            continue\r\n\r\n        # Market 141 is the Moneyline\r\n        markets = bookie_data.get('markets', {})\r\n        if '141' in markets:\r\n            outcomes = markets['141'].get('outcomes', {})\r\n\r\n            # Outcome 141 is Home Team, 142 is Away Team\r\n            # We dig deep into the 'players' object to find the 'price'\r\n            home_price = outcomes.get('141', {}).get('players', {}).get('0', {}).get('price')\r\n            away_price = outcomes.get('142', {}).get('players', {}).get('0', {}).get('price')\r\n\r\n            if home_price and away_price:\r\n                # Convert Decimal to American for display\r\n                print(f\"{bookie_name}: Home {decimal_to_american(home_price)} | Away {decimal_to_american(away_price)}\")\r\n\r\ndef decimal_to_american(decimal):\r\n    if decimal &gt;= 2.0:\r\n        return f\"+{int((decimal - 1) * 100)}\"\r\n    else:\r\n        return f\"{int(-100 \/ (decimal - 1))}\"\r\n\r\n# Run it for the first game found\r\nif upcoming_games:\r\n    get_moneyline_odds(upcoming_games[0]['fixtureId'])\r\n<\/code><\/pre>\n<h3>Output Example<\/h3>\n<p>When you run the script above, you get a clean comparison of lines. Notice how easy it is to spot arbitrage or value when you compare DraftKings odds directly against Pinnacle odds:<\/p>\n<pre class=\"wp-block-code\"><code>Odds for Game ID: id1400003160574919\r\ndraftkings: Home -135 | Away +115\r\npinnacle:   Home -131 | Away +119\r\nbet365:     Home -133 | Away +110\r\n<\/code><\/pre>\n<h2>Step 4: Fetching NFL Spreads (Asian Handicap)<\/h2>\n<p>NFL spreads are returned as Asian Handicap markets. Unlike moneylines which use a single Market ID, <strong>spreads use different Market IDs based on the handicap line<\/strong>.<\/p>\n<p>For a deep dive into Asian Handicap market structure, see our <a href=\"https:\/\/oddspapi.io\/blog\/singbet-api-access-and-asian-handicap-odds-guide\/\">OddsPapi Singbet API and Asian Handicap guide<\/a>.<\/p>\n<p>Here are the key Market IDs for NFL spreads:<\/p>\n<figure class=\"wp-block-table\">\n<table style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr style=\"background-color: #f4f4f4; text-align: left;\">\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Market ID<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">Handicap Line<\/th>\n<th style=\"padding: 10px; border: 1px solid #ddd;\">NFL Example<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>1072<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">0 (Pick&#8217;em)<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Even matchup<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>1068<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">-0.5<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">PK (no push)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>1076<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">-3.5<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">Standard NFL spread<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #ddd;\"><code>1080<\/code><\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">-7.5<\/td>\n<td style=\"padding: 10px; border: 1px solid #ddd;\">One-TD favorite<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<pre class=\"wp-block-code\"><code>def get_spread_odds(fixture_id):\r\n    \"\"\"Fetch NFL spread odds from multiple bookmakers.\"\"\"\r\n    params = {\r\n        \"apiKey\": API_KEY,\r\n        \"fixtureId\": fixture_id,\r\n        \"bookmaker\": \"pinnacle,draftkings,fanduel\"\r\n    }\r\n\r\n    response = requests.get(f\"{BASE_URL}\/odds\", params=params)\r\n    data = response.json()\r\n\r\n    # Common NFL spread market IDs\r\n    spread_markets = ['1076', '1080', '1068']  # -3.5, -7.5, -0.5\r\n\r\n    bookmakers = data.get('bookmakerOdds', {})\r\n\r\n    for bookie_name, bookie_data in bookmakers.items():\r\n        if not bookie_data.get('bookmakerIsActive'):\r\n            continue\r\n\r\n        markets = bookie_data.get('markets', {})\r\n\r\n        for market_id in spread_markets:\r\n            if market_id in markets:\r\n                outcomes = markets[market_id].get('outcomes', {})\r\n                print(f\"{bookie_name} - Market {market_id}:\")\r\n\r\n                for outcome_id, outcome_data in outcomes.items():\r\n                    price = outcome_data.get('players', {}).get('0', {}).get('price')\r\n                    handicap = outcome_data.get('players', {}).get('0', {}).get('handicap', 'N\/A')\r\n                    if price:\r\n                        print(f\"  Handicap {handicap}: {decimal_to_american(price)}\")\r\n<\/code><\/pre>\n<h2>Step 5: Fetching Totals (Over\/Under)<\/h2>\n<p>For totals, use <strong>Market ID 148<\/strong>. This gives you the Over\/Under lines for total points scored.<\/p>\n<pre class=\"wp-block-code\"><code>def get_totals_odds(fixture_id):\r\n    \"\"\"Fetch NFL Over\/Under odds.\"\"\"\r\n    params = {\r\n        \"apiKey\": API_KEY,\r\n        \"fixtureId\": fixture_id,\r\n        \"bookmaker\": \"pinnacle,draftkings\"\r\n    }\r\n\r\n    response = requests.get(f\"{BASE_URL}\/odds\", params=params)\r\n    data = response.json()\r\n\r\n    bookmakers = data.get('bookmakerOdds', {})\r\n\r\n    for bookie_name, bookie_data in bookmakers.items():\r\n        if not bookie_data.get('bookmakerIsActive'):\r\n            continue\r\n\r\n        markets = bookie_data.get('markets', {})\r\n\r\n        # Market 148 is Totals (Over\/Under)\r\n        if '148' in markets:\r\n            outcomes = markets['148'].get('outcomes', {})\r\n            print(f\"\\n{bookie_name} Totals:\")\r\n\r\n            for outcome_id, outcome_data in outcomes.items():\r\n                price = outcome_data.get('players', {}).get('0', {}).get('price')\r\n                total_line = outcome_data.get('players', {}).get('0', {}).get('handicap')\r\n                outcome_name = \"Over\" if outcome_id == '391' else \"Under\"\r\n\r\n                if price and total_line:\r\n                    print(f\"  {outcome_name} {total_line}: {decimal_to_american(price)}\")\r\n<\/code><\/pre>\n<h2>Why Market IDs Matter<\/h2>\n<p>Other APIs use text labels like &#8220;h2h&#8221; or &#8220;spreads&#8221;. The problem? If a bookmaker changes &#8220;Spread&#8221; to &#8220;Handicap&#8221; in their feed, your bot breaks.<\/p>\n<p>OddsPapi uses stable Integer IDs. Here is your cheat sheet for the NFL:<\/p>\n<ul>\n<li><strong>141:<\/strong> Moneyline (Home\/Away Winner)<\/li>\n<li><strong>148:<\/strong> Totals (Over\/Under)<\/li>\n<li><strong>1068-1080+:<\/strong> Asian Handicap (Spreads) &#8211; varies by line<\/li>\n<\/ul>\n<h2>Historical Odds Data for Backtesting<\/h2>\n<p>This is the feature that sets OddsPapi apart from the competition. If you are building a model, you need to know what the odds were <em>in the past<\/em>. Being able to access <a href=\"https:\/\/oddspapi.io\/en\/docs\/get-historical-odds\">historical Pinnacle odds via OddsPapi<\/a> or <a href=\"https:\/\/oddspapi.io\/blog\/bet365-historical-odds-guide-the-data-apis-and-strategy\/\">Bet365 historical odds via OddsPapi<\/a> is a must-have when building out your project to compare against softer bookies.<\/p>\n<p>Most &#8220;free&#8221; APIs lock this behind a paywall. We don&#8217;t. You can use the <code>\/historical-odds<\/code> endpoint to fetch closing lines. This is essential for verifying if your strategy would have been profitable last season.<\/p>\n<pre class=\"wp-block-code\"><code>def get_historical_closing_line(fixture_id, bookmaker=\"pinnacle\"):\r\n    \"\"\"\r\n    Fetch the closing line for a completed NFL game.\r\n    Essential for backtesting betting models.\r\n    \"\"\"\r\n    params = {\r\n        \"apiKey\": API_KEY,\r\n        \"fixtureId\": fixture_id,\r\n        \"bookmakers\": bookmaker\r\n    }\r\n\r\n    response = requests.get(f\"{BASE_URL}\/historical-odds\", params=params)\r\n\r\n    if response.status_code == 200:\r\n        data = response.json()\r\n        # Historical data includes timestamped odds movements\r\n        # The last entry is the closing line\r\n        return data\r\n\r\n    return None\r\n\r\n# Example: Analyze closing line value\r\nhistorical = get_historical_closing_line(\"PAST_GAME_ID\")\r\n<\/code><\/pre>\n<h2>Beyond the NFL: NCAA College Football<\/h2>\n<p>The logic we used above works for any sport. Because we use a dynamic <code>tournamentId<\/code> system, you can easily switch to College Football.<\/p>\n<p>Simply change your Step 1 search string from <code>\"NFL\"<\/code> to <code>\"NCAA\"<\/code>. You will find the tournament ID for College Football, and the rest of the code (Fixtures, Odds, Parsing) remains exactly the same. This is powerful for developers building &#8220;All-in-One&#8221; football tools.<\/p>\n<p>For esports betting data, check out our <a href=\"https:\/\/oddspapi.io\/blog\/esports-odds-api-the-developers-guide-for-cs2-lol-and-dota-2\/\">OddsPapi Esports Odds API guide<\/a> which covers CS2, League of Legends, and Dota 2.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<div>\n<div>\n<h4>What bookmakers does the NFL Odds API include?<\/h4>\n<div>\n<div>\n<p>OddsPapi covers 300+ bookmakers including all major US sportsbooks (DraftKings, FanDuel, BetMGM, Caesars) plus sharp offshore books like Pinnacle and Circa. This gives you both the retail lines and the &#8220;true&#8221; market price.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<h4>Is the NFL odds data real-time?<\/h4>\n<div>\n<div>\n<p>Yes. Our REST API provides near real-time odds updates. For high-frequency trading applications, we also offer WebSocket connections that push line movements as they happen.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<h4>Can I access NFL player props?<\/h4>\n<div>\n<div>\n<p>Yes. Player props are available through additional Market IDs. Contact our team for documentation on prop market structures, or explore the API response to discover available markets for each fixture.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<h4>How do I get historical NFL odds for backtesting?<\/h4>\n<div>\n<div>\n<p>Use the <code>\/historical-odds<\/code> endpoint with any past fixture ID. This returns timestamped odds movements so you can see opening lines, closing lines, and everything in between. Historical data is included in the free tier.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2>Ready to Build Your NFL Betting Tool?<\/h2>\n<p>You now have Python scripts that authenticate correctly, find the NFL dynamically, and parse the deep nested JSON to extract moneylines, spreads, and totals. Stop scraping websites and start building with a professional API.<\/p>\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link\" href=\"https:\/\/oddspapi.io\/\">Get your OddsPapi API key and start coding<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Free NFL odds API with Python code examples. Get real-time spreads, moneylines, and player props from 300+ bookmakers including DraftKings and FanDuel.<\/p>\n","protected":false},"author":2,"featured_media":60,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,6],"tags":[],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","category-nfl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Free NFL Odds API Guide: Python Code for Real-Time Betting Data | Odds API Development Blog<\/title>\n<meta name=\"description\" content=\"Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.\" \/>\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-nfl-odds-api-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Free NFL Odds API Guide: Python Code for Real-Time Betting Data | Odds API Development Blog\" \/>\n<meta property=\"og:description\" content=\"Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Odds API Development Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-25T18:27:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-05T17:19:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg\" \/>\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\/jpeg\" \/>\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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Free NFL Odds API Guide: Python Code for Real-Time Betting Data\",\"datePublished\":\"2025-11-25T18:27:17+00:00\",\"dateModified\":\"2026-02-05T17:19:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\"},\"wordCount\":1019,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg\",\"articleSection\":[\"How To Guides\",\"NFL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\",\"name\":\"Free NFL Odds API Guide: Python Code for Real-Time Betting Data | Odds API Development Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg\",\"datePublished\":\"2025-11-25T18:27:17+00:00\",\"dateModified\":\"2026-02-05T17:19:58+00:00\",\"description\":\"Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg\",\"width\":1408,\"height\":768},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free NFL Odds API Guide: Python Code for Real-Time Betting Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds APIs 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 NFL Odds API Guide: Python Code for Real-Time Betting Data | Odds API Development Blog","description":"Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.","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-nfl-odds-api-guide\/","og_locale":"en_US","og_type":"article","og_title":"Free NFL Odds API Guide: Python Code for Real-Time Betting Data | Odds API Development Blog","og_description":"Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.","og_url":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/","og_site_name":"Odds API Development Blog","article_published_time":"2025-11-25T18:27:17+00:00","article_modified_time":"2026-02-05T17:19:58+00:00","og_image":[{"width":1408,"height":768,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg","type":"image\/jpeg"}],"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":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Free NFL Odds API Guide: Python Code for Real-Time Betting Data","datePublished":"2025-11-25T18:27:17+00:00","dateModified":"2026-02-05T17:19:58+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/"},"wordCount":1019,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg","articleSection":["How To Guides","NFL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/","url":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/","name":"Free NFL Odds API Guide: Python Code for Real-Time Betting Data | Odds API Development Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg","datePublished":"2025-11-25T18:27:17+00:00","dateModified":"2026-02-05T17:19:58+00:00","description":"Learn to fetch real-time NFL lines, spreads, and props with Python. The best free NFL Odds API featuring 300+ bookmakers, native American odds, and historical data.","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/free-nfl-odds-api-guide.jpg","width":1408,"height":768},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Free NFL Odds API Guide: Python Code for Real-Time Betting Data"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds APIs 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\/58","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=58"}],"version-history":[{"count":12,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":1180,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions\/1180"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/60"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}