Web Scraping 3 min read

How to Access ESPN's Hidden API for Free Sports Data

Discover how to access ESPN’s hidden API and pull live sports data for free with simple GET requests.

by
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.

FAQ

Frequently asked
questions

Can't find what you're looking for? Email me.

Adrian Horning

Written by

Adrian Horning

Founder of ScrapeCreators. I write about social data APIs, scraper reliability, and turning public creator data into useful products.

Connect

ScrapeCreatorsScrapeCreators

Social Media Scraping API
for Developers

Real-time data from TikTok, Instagram, YouTube, X, Facebook, Reddit, and more.

Real-time Data

Fresh, accurate, always up-to-date.

No Proxies

We handle the infrastructure.

Developer First

Simple API. Powerful results.

TikTok logoInstagram logoYouTube logoX logoFacebook logoReddit logo
{200 OK
"platform": "youtube",
"type": "video",
"title": "Never Gonna Give You Up",
"views": 12504321,
"transcript": "We're no strangers to love...",
}
Success124ms
Purple gift box representing 100 free ScrapeCreators credits

Get 100 credits on us - instantly.

No credit card required. Start building for free.

Try the API, on us.

New developers get 100 free credits automatically when they sign up. No credit card required.

Get started free
Trusted by 10,000+ developers
99.9% uptime
Secure API access