Web Scraping

ESPN’s Hidden API: How to Access Free Sports Data

@adrian_horning_
3 mins read
Treasure chest with ESPN logo bursting open, spilling free sports data in JSON format labeled Stats, Scores, API.

Introduction

Did you know ESPN gives away an incredible amount of data...for free? Hidden in plain sight, ESPN’s own website uses an open API that anyone can tap into. With a few clicks in your browser’s developer tools, you can unlock a treasure trove of sports stats, play-by-play data, scores, schedules, and more.

In this guide, we’ll break down how to access ESPN’s API, what kind of information you can extract, and why this is a goldmine for developers, sports analysts, and data enthusiasts.

Where the ESPN API Lives

ESPN’s site makes API calls to:

https://site.web.api.espn.com/apis

This endpoint is wide open. You don’t need authentication keys or tokens, just a simple GET request will return structured JSON data.

Real Example: 2016 NBA Finals, Game 7

Let’s take one of the greatest games in sports history, Cavaliers vs. Warriors, 2016 Game 7.

Open the ESPN page for the game: Cavs vs Warriors, Game 7

Now, do the following:

  1. Right-click → Inspect → Open Network tab.
  2. Filter traffic by Fetch/XHR.
  3. Look at the requests firing in the background.

You’ll notice an endpoint like this:

summary?region=us&lang=en&contentorigin=espn&event=400878160

That event parameter is the unique game ID.

The Full ESPN API Endpoint

Here’s the complete URL for the 2016 Finals Game 7:

https://site.web.api.espn.com/apis/site/v2/sports/basketball/nba/summary?region=us&lang=en&contentorigin=espn&event=400878160

Paste it directly into your browser, or hit it with curl, Python, or Node.js, and you’ll see ESPN return a ton of structured JSON data.

In Node.js, you would do:

 import axios from 'axios'

const response = await axios.get("https://site.web.api.espn.com/apis/site/v2/sports/basketball/nba/summary?region=us&lang=en&contentorigin=espn&event=400878160")

console.log(response.data)

What Data Can You Get?

The API returns far more than just the score. For a single game, you can access:

  • Team and player stats
  • Play-by-play details
  • Box scores
  • Highlights and recaps
  • Injuries, rosters, and schedules

This makes ESPN’s API incredibly powerful if you’re building apps, scraping sports data, or analyzing historical matchups.

Here is a sample of the json that gets returned for that game:

 {
  "boxscore": {
    "teams": [
      {
        "team": {
          "id": "5",
          "uid": "s:40~l:46~t:5",
          "slug": "cleveland-cavaliers",
          "location": "Cleveland",
          "name": "Cavaliers",
          "abbreviation": "CLE",
          "displayName": "Cleveland Cavaliers",
          "shortDisplayName": "Cavaliers",
          "color": "061642",
          "alternateColor": "bc945c",
          "logo": "https://a.espncdn.com/i/teamlogos/nba/500/cle.png"
        },
        "statistics": [
          {
            "name": "fieldGoalsMade-fieldGoalsAttempted",
            "displayValue": "33-82",
            "label": "FG"
          },
          {
            "name": "fieldGoalPct",
            "displayValue": "40.2",
            "abbreviation": "FG%",
            "label": "Field Goal %"
          },
          {
            "name": "threePointFieldGoalsMade-threePointFieldGoalsAttempted",
            "displayValue": "6-25",
            "label": "3PT"
          },
          {
            "name": "threePointFieldGoalPct",
            "displayValue": "24.0",
            "abbreviation": "3P%",
            "label": "Three Point %"
          },
          {
            "name": "freeThrowsMade-freeThrowsAttempted",
            "displayValue": "21-25",
            "label": "FT"
          },
          {
            "name": "freeThrowPct",
            "displayValue": "84.0",
            "abbreviation": "FT%",
            "label": "Free Throw %"
          },
          {
            "name": "totalRebounds",
            "displayValue": "59",
            "abbreviation": "REB",
            "label": "Rebounds"
          },
          {
            "name": "offensiveRebounds",
            "displayValue": "9",
            "abbreviation": "OR",
            "label": "Offensive Rebounds"
          },
          {
            "name": "defensiveRebounds",
            "displayValue": "39",
            "abbreviation": "DR",
            "label": "Defensive Rebounds"
          },
          {
            "name": "assists",
            "displayValue": "17",
            "abbreviation": "AST",
            "label": "Assists"
          },
          {
            "name": "steals",
            "displayValue": "7",
            "abbreviation": "STL",
            "label": "Steals"
          },
          {
            "name": "blocks",
            "displayValue": "6",
            "abbreviation": "BLK",
            "label": "Blocks"
          },
          {
            "name": "turnovers",
            "displayValue": "11",
            "abbreviation": "TO",
            "label": "Turnovers"
          },
          {
            "name": "teamTurnovers",
            "displayValue": "0",
            "abbreviation": "TTO",
            "label": "Team Turnovers"
          },
          {
            "name": "totalTurnovers",
            "displayValue": "11",
            "abbreviation": "ToTO",
            "label": "Total Turnovers"
          },
          {
            "name": "technicalFouls",
            "displayValue": "0",
            "abbreviation": "TECH",
            "label": "Technical Fouls"
          },
          {
            "name": "totalTechnicalFouls",
            "displayValue": "0",
            "abbreviation": "TECH",
            "label": "Total Technical Fouls"
          },
          {
            "name": "flagrantFouls",
            "displayValue": "0",
            "abbreviation": "FLAG",
            "label": "Flagrant Fouls"
          },
          {
            "name": "turnoverPoints",
            "displayValue": "10",
            "abbreviation": "Points Conceded Off Turnovers",
            "label": "Points Conceded Off Turnovers"
          },
          {
            "name": "fastBreakPoints",
            "displayValue": "18",
            "abbreviation": "FBPs",
            "label": "Fast Break Points"
          },
          {
            "name": "pointsInPaint",
            "displayValue": "48",
            "abbreviation": "PIP",
            "label": "Points in Paint"
          },
          {
            "name": "fouls",
            "displayValue": "15",
            "abbreviation": "PF",
            "label": "Fouls"
          },
          {
            "name": "largestLead",
            "displayValue": "7",
            "abbreviation": "LL",
            "label": "Largest Lead"
          }
        ],
        "displayOrder": 1,
        "homeAway": "away"
      },
      {
        "team": {
          "id": "9",
          "uid": "s:40~l:46~t:9",
          "slug": "golden-state-warriors",
          "location": "Golden State",
          "name": "Warriors",
          "abbreviation": "GS",
          "displayName": "Golden State Warriors",
          "shortDisplayName": "Warriors",
          "color": "00275D",
          "alternateColor": "1d428a",
          "logo": "https://a.espncdn.com/i/teamlogos/nba/500/gs.png"
        },
        "statistics": [
          {
            "name": "fieldGoalsMade-fieldGoalsAttempted",
            "displayValue": "32-83",
            "label": "FG"
          },
          {
            "name": "fieldGoalPct",
            "displayValue": "38.6",
            "abbreviation": "FG%",
            "label": "Field Goal %"
          },
          {
            "name": "threePointFieldGoalsMade-threePointFieldGoalsAttempted",
            "displayValue": "15-41",
            "label": "3PT"
          },
          {
            "name": "threePointFieldGoalPct",
            "displayValue": "36.6",
            "abbreviation": "3P%",
            "label": "Three Point %"
          },
          {
            "name": "freeThrowsMade-freeThrowsAttempted",
            "displayValue": "10-13",
            "label": "FT"
          },
          {
            "name": "freeThrowPct",
            "displayValue": "76.9",
            "abbreviation": "FT%",
            "label": "Free Throw %"
          },
          {
            "name": "totalRebounds",
            "displayValue": "48",
            "abbreviation": "REB",
            "label": "Rebounds"
          },
          {
            "name": "offensiveRebounds",
            "displayValue": "7",
            "abbreviation": "OR",
            "label": "Offensive Rebounds"
          },
          {
            "name": "defensiveRebounds",
            "displayValue": "32",
            "abbreviation": "DR",
            "label": "Defensive Rebounds"
          },
          {
            "name": "assists",
            "displayValue": "22",
            "abbreviation": "AST",
            "label": "Assists"
          },
          {
            "name": "steals",
            "displayValue": "7",
            "abbreviation": "STL",
            "label": "Steals"
          },
          {
            "name": "blocks",
            "displayValue": "5",
            "abbreviation": "BLK",
            "label": "Blocks"
          },
          {
            "name": "turnovers",
            "displayValue": "10",
            "abbreviation": "TO",
            "label": "Turnovers"
          },
          {
            "name": "teamTurnovers",
            "displayValue": "0",
            "abbreviation": "TTO",
            "label": "Team Turnovers"
          },
          {
            "name": "totalTurnovers",
            "displayValue": "10",
            "abbreviation": "ToTO",
            "label": "Total Turnovers"
          },
          {
            "name": "technicalFouls",
            "displayValue": "0",
            "abbreviation": "TECH",
            "label": "Technical Fouls"
          },
          {
            "name": "totalTechnicalFouls",
            "displayValue": "0",
            "abbreviation": "TECH",
            "label": "Total Technical Fouls"
          },
          {
            "name": "flagrantFouls",
            "displayValue": "0",
            "abbreviation": "FLAG",
            "label": "Flagrant Fouls"
          },
          {
            "name": "turnoverPoints",
            "displayValue": "16",
            "abbreviation": "Points Conceded Off Turnovers",
            "label": "Points Conceded Off Turnovers"
          },
          {
            "name": "fastBreakPoints",
            "displayValue": "7",
            "abbreviation": "FBPs",
            "label": "Fast Break Points"
          },
          {
            "name": "pointsInPaint",
            "displayValue": "28",
            "abbreviation": "PIP",
            "label": "Points in Paint"
          },
          {
            "name": "fouls",
            "displayValue": "23",
            "abbreviation": "PF",
            "label": "Fouls"
          },
          {
            "name": "largestLead",
            "displayValue": "8",
            "abbreviation": "LL",
            "label": "Largest Lead"
          }
        ],
        "displayOrder": 2,
        "homeAway": "home"
      }
    ]
  },
  "format": {
    "regulation": {
      "periods": 4,
      "displayName": "Quarter",
      "slug": "quarter",
      "clock": 720
    },
    "overtime": {
      "clock": 300
    }
  },
  "gameInfo": {
    "venue": {
      "id": "2465",
      "guid": "37dd5843-ceb6-382e-a56e-5f236c4ead2b",
      "fullName": "Oracle Arena",
      "shortName": "ORACLE Arena",
      "address": {
        "city": "Oakland",
        "state": "CA",
        "zipCode": "94621"
      },
      "grass": false,
      "images": [
        {
          "href": "https://a.espncdn.com/i/venues/nba/day/2465.jpg",
          "width": 2000,
          "height": 1125,
          "alt": "",
          "rel": ["full", "day"]
        }
      ]
    },
    "attendance": 19596,
    "officials": [
      {
        "fullName": "Mike Callahan",
        "displayName": "Mike Callahan",
        "position": {
          "name": "Referee",
          "displayName": "Referee",
          "id": "40"
        },
        "order": 1
      },
      {
        "fullName": "Dan Crawford",
        "displayName": "Dan Crawford",
        "position": {
          "name": "Referee",
          "displayName": "Referee",
          "id": "40"
        },
        "order": 2
      },
      {
        "fullName": "Monty McCutchen",
        "displayName": "Monty McCutchen",
        "position": {
          "name": "Referee",
          "displayName": "Referee",
          "id": "40"
        },
        "order": 3
      }
    ]
  },
  "pickcenter": [
    {
      "provider": {
        "id": "1004",
        "name": "consensus",
        "priority": 0
      },
      "details": "GS -4.5",
      "spread": -4.5,
      "awayTeamOdds": {
        "winPercentage": 49,
        "favorite": false,
        "underdog": true,
        "current": {
          "pointSpread": {
            "alternateDisplayValue": "+4.5",
            "american": "+4.5"
          }
        },
        "team": {
          "$ref": "http://sports.core.api.espn.pvt/v2/sports/basketball/leagues/nba/seasons/2016/teams/5?lang=en&region=us"
        },
        "teamId": "5"
      },
      "homeTeamOdds": {
        "winPercentage": 51,
        "favorite": true,
        "underdog": false,
        "current": {
          "pointSpread": {
            "alternateDisplayValue": "-4.5",
            "american": "-4.5"
          }
        },
        "team": {
          "$ref": "http://sports.core.api.espn.pvt/v2/sports/basketball/leagues/nba/seasons/2016/teams/9?lang=en&region=us"
        },
        "teamId": "9"
      }
    },
    {
      "provider": {
        "id": "1003",
        "name": "numberfire",
        "priority": 0
      },
      "details": "GS -5",
      "overUnder": 205,
      "spread": -5,
      "overOdds": 45.25,
      "underOdds": 52.83,
      "awayTeamOdds": {
        "averageScore": 99.18,
        "winPercentage": 31.73,
        "favorite": false,
        "underdog": true,
        "moneyLine": 160,
        "moneyLineOdds": 31.73,
        "spreadOdds": 49.07,
        "spreadReturn": -0.063,
        "current": {
          "pointSpread": {
            "alternateDisplayValue": "+5",
            "american": "+5"
          },
          "spread": {
            "alternateDisplayValue": "+49",
            "american": "+49"
          },
          "moneyLine": {
            "alternateDisplayValue": "+160",
            "american": "+160"
          }
        },
        "team": {
          "$ref": "http://sports.core.api.espn.pvt/v2/sports/basketball/leagues/nba/seasons/2016/teams/5?lang=en&region=us"
        },
        "teamId": "5"
      },
      "homeTeamOdds": {
        "averageScore": 104.22,
        "winPercentage": 68.27,
        "favorite": true,
        "underdog": false,
        "moneyLine": -180,
        "moneyLineOdds": 68.27,
        "spreadOdds": 46.27,
        "spreadReturn": -0.117,
        "current": {
          "pointSpread": {
            "alternateDisplayValue": "-5",
            "american": "-5"
          },
          "spread": {
            "alternateDisplayValue": "+46",
            "american": "+46"
          },
          "moneyLine": {
            "alternateDisplayValue": "-180",
            "american": "-180"
          }
        },
        "team": {
          "$ref": "http://sports.core.api.espn.pvt/v2/sports/basketball/leagues/nba/seasons/2016/teams/9?lang=en&region=us"
        },
        "teamId": "9"
      },
      "current": {
        "over": {
          "alternateDisplayValue": "+45",
          "american": "+45"
        },
        "under": {
          "alternateDisplayValue": "+53",
          "american": "+53"
        },
        "total": {
          "alternateDisplayValue": "205",
          "american": "205"
        }
      }
    },
    {
      "provider": {
        "id": "1002",
        "name": "teamrankings",
        "priority": 0
      },
      "details": "GS -5",
      "overUnder": 205,
      "spread": -5,
      "overOdds": 102,
      "underOdds": -113,
      "awayTeamOdds": {
        "averageScore": 99.7,
        "favorite": false,
        "underdog": true,
        "moneyLine": 169,
        "spreadRecord": {
          "wins": 43,
          "losses": 39,
          "pushes": 4,
          "summary": "43-39-4"
        },
        "spreadOdds": -107,
        "current": {
          "pointSpread": {
            "alternateDisplayValue": "+5",
            "american": "+5"
          },
          "spread": {
            "alternateDisplayValue": "-107",
            "american": "-107"
          },
          "moneyLine": {
            "alternateDisplayValue": "+169",
            "american": "+169"
          }
        },
        "team": {
          "$ref": "http://sports.core.api.espn.pvt/v2/sports/basketball/leagues/nba/seasons/2016/teams/5?lang=en&region=us"
        },
        "teamId": "5"
      },
      "homeTeamOdds": {
        "averageScore": 104.4,
        "favorite": true,
        "underdog": false,
        "moneyLine": -188,
        "spreadRecord": {
          "wins": 44,
          "losses": 49,
          "pushes": 1,
          "summary": "44-49-1"
        },
        "spreadOdds": -103,
        "current": {
          "pointSpread": {
            "alternateDisplayValue": "-5",
            "american": "-5"
          },
          "spread": {
            "alternateDisplayValue": "-103",
            "american": "-103"
          },
          "moneyLine": {
            "alternateDisplayValue": "-188",
            "american": "-188"
          }
        },
        "team": {
          "$ref": "http://sports.core.api.espn.pvt/v2/sports/basketball/leagues/nba/seasons/2016/teams/9?lang=en&region=us"
        },
        "teamId": "9"
      },
      "current": {
        "over": {
          "alternateDisplayValue": "+102",
          "american": "+102"
        },
        "under": {
          "alternateDisplayValue": "-113",
          "american": "-113"
        },
        "total": {
          "alternateDisplayValue": "205",
          "american": "205"
        }
      }
    }
  ],
  "againstTheSpread": [
    {
      "team": {
        "id": "5",
        "uid": "s:40~l:46~t:5",
        "displayName": "Cleveland Cavaliers",
        "abbreviation": "CLE",
        "links": [
          {
            "href": "https://www.espn.com/nba/team/_/name/cle/cleveland-cavaliers",
            "text": "Clubhouse"
          },
          {
            "href": "https://www.espn.com/nba/team/schedule/_/name/cle",
            "text": "Schedule"
          }
        ],
        "logo": "https://a.espncdn.com/i/teamlogos/nba/500/cle.png",
        "logos": [
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500/cle.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "default"],
            "lastUpdated": "2024-06-25T21:17Z"
          },
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500-dark/cle.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "dark"],
            "lastUpdated": "2024-06-25T21:13Z"
          },
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500/scoreboard/cle.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "scoreboard"],
            "lastUpdated": "2024-06-25T21:18Z"
          },
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500-dark/scoreboard/cle.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "scoreboard", "dark"],
            "lastUpdated": "2024-06-25T21:13Z"
          }
        ]
      },
      "records": []
    },
    {
      "team": {
        "id": "9",
        "uid": "s:40~l:46~t:9",
        "displayName": "Golden State Warriors",
        "abbreviation": "GS",
        "links": [
          {
            "href": "https://www.espn.com/nba/team/_/name/gs/golden-state-warriors",
            "text": "Clubhouse"
          },
          {
            "href": "https://www.espn.com/nba/team/schedule/_/name/gs",
            "text": "Schedule"
          }
        ],
        "logo": "https://a.espncdn.com/i/teamlogos/nba/500/gs.png",
        "logos": [
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500/gs.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "default"],
            "lastUpdated": "2024-06-25T21:17Z"
          },
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500-dark/gs.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "dark"],
            "lastUpdated": "2024-06-25T21:13Z"
          },
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500/scoreboard/gs.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "scoreboard"],
            "lastUpdated": "2024-06-25T21:18Z"
          },
          {
            "href": "https://a.espncdn.com/i/teamlogos/nba/500-dark/scoreboard/gs.png",
            "width": 500,
            "height": 500,
            "alt": "",
            "rel": ["full", "scoreboard", "dark"],
            "lastUpdated": "2024-06-25T21:14Z"
          }
        ]
      },
      "records": []
    }
  ],
  "meta": {
    "gp_topic": "gp-basketball-nba-400878160",
    "gameSwitcherEnabled": true,
    "picker_topic": "picker-basketball-nba",
    "lastUpdatedAt": "2016-06-20T02:38:48Z",
    "firstPlayWallClock": "2016-06-20T00:10:56Z",
    "lastPlayWallClock": "2016-06-20T02:38:48Z",
    "gameState": "post",
    "syncUrl": "https://client.espncdn.com/fauxcast/stats/46/400878160/en/us/"
  }
}

How to Explore More Data

To grab more games, just swap out the event ID in the URL. For example:

  • Change /basketball/nba/ to /football/nfl/ for NFL data.
  • Replace the event=400878160 with another game’s ID.

Tip: You can find event IDs just by browsing ESPN game pages and checking the URLs.

Why This Matters

Sports APIs usually require paid subscriptions, API keys, or limited free tiers. But ESPN is (intentionally or not) giving developers free, open access to world-class sports data.

Whether you’re building a fantasy sports tool, a live stats dashboard, or running data analysis, this API can save you time and money.

Final Thoughts

The ESPN API is one of the easiest ways to get high-quality, real-time sports data, without credentials or paywalls. By leveraging simple GET requests, you can extract detailed stats, play-by-play logs, and game summaries for NBA, NFL, and more.

If you’re into sports analytics or app development, it’s worth experimenting with.

Looking for More Than ESPN?

While ESPN’s API is a fun hidden gem, it’s limited to what they expose on their own site. If you need serious scale or access to other platforms, check out Scrape Creators.

Scrape Creators gives you:

  • Ready-made APIs for TikTok, Instagram, YouTube, Twitter (X), Reddit, and more.
  • Pay-as-you-go pricing, no expensive contracts.
  • Fast support from real developers (not bots).
  • Billions of profiles and posts available via clean JSON.

Instead of reverse engineering APIs one by one, you can plug into Scrape Creators and start pulling the data you need today.

Try Scrape Creators, your shortcut to reliable social media data.

Frequently Asked Questions

It's data that can be accessed publicly, without logging in, and according to Meta Vs Brightdata, public data is a-ok to collect.
Yes, ESPN’s site API is public (for now) and can be accessed for free with simple GET requests. You don’t need an API key or subscription.
You can fetch scores, play-by-play data, player stats, box scores, schedules, rosters, and more for NBA, NFL, and other sports.
Open an ESPN game page, check the URL (e.g., gameId/400878160), and use that ID in your API request.
Yes, you can change the sport path in the URL (e.g., /basketball/nba/, /football/nfl/) to pull data from different leagues.
Yes, developers use it for apps, dashboards, and sports analytics. But you might wanna check ESPN’s terms of service before using it commercially.

Try the ScrapeCreators API

Get 100 free API requests

No credit card required. Instant access.

Start building with real-time social media data in minutes. Join thousands of developers and businesses using ScrapeCreators.