Report Title: ESPN NFL Game Weather Conditions Public API Comprehensive Research
Version: 1.0
Author: Goldmann LLC Research Team
Date: January 2025
Status: ✅ Complete Research Reference
Focus: NFL Game Weather Conditions, Temperature, Wind, Stadium Conditions
This comprehensive research report documents ESPN's public API for NFL game weather conditions data. ESPN does not officially document or support a public API, but weather information is embedded within game data responses through the site.api.espn.com domain without authentication.
Key Finding: Weather data is not a standalone endpoint but rather embedded within game event data (scoreboard, event summary). Weather information is primarily available for outdoor games and may not be present for indoor/dome stadiums. The weather object appears in both scoreboard and event summary endpoints.
Primary Domain: site.api.espn.com
Base URL: https://site.api.espn.com
API Version: v2
Sport/League Path: /apis/site/v2/sports/football/nfl
Base Pattern: /apis/site/v2/sports/football/nfl/{endpoint}
Weather Data Location: Weather data is embedded within game event responses, not a separate endpoint.
| Endpoint | Weather Location | Availability |
|---|---|---|
/scoreboard |
events[].weather or events[].competitions[].weather |
✅ Embedded |
/summary?event={eventId} |
gameInfo.weather |
✅ Embedded |
/teams/{teamId}/schedule |
events[].weather |
✅ Embedded |
Note: Weather data is not a standalone endpoint - it's included as part of game event responses.
Outdoor Stadiums:
- ✅ Weather data typically available
- Includes: temperature, condition, wind
- Updated close to game time
Indoor/Dome Stadiums:
⚠️ Weather data may be absent or minimal- May show "Dome" or "Indoor" condition
- No temperature/wind data typically provided
Retractable Roof Stadiums:
- ✅ Weather data available if roof is open
- May vary based on roof status
- Condition may reflect indoor vs outdoor
Location in Scoreboard Response:
{
"events": [
{
"id": "401220339",
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1",
"link": {
"$ref": "http://www.espn.com/nfl/weather"
}
}
}
]
}Location in Event Summary Response:
{
"gameInfo": {
"venue": {
"id": "4246",
"fullName": "M&T Bank Stadium",
"address": {
"city": "Baltimore",
"state": "MD"
}
},
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1",
"windSpeed": 5,
"windDirection": "NE"
}
}
}| Field | Type | Description | Example |
|---|---|---|---|
displayName |
string | Human-readable weather condition | "Sunny", "Partly Cloudy", "Rain", "Snow" |
temperature |
number | Current temperature in Fahrenheit | 78 |
highTemperature |
number | High temperature for the day | 82 |
conditionId |
string | Weather condition identifier | "1", "2", "3" |
windSpeed |
number | Wind speed in MPH (optional) | 5 |
windDirection |
string | Wind direction abbreviation (optional) | "NE", "SW", "N" |
link |
object | Link to weather details (optional) | {"$ref": "..."} |
Note: Not all fields may be present in all responses. Fields may vary by endpoint and game status.
Endpoint: /apis/site/v2/sports/football/nfl/scoreboard
Description: Returns daily/weekly NFL games with scores, statuses, and weather information embedded in each event.
HTTP Method: GET
Query Parameters:
dates(optional): Date range in YYYYMMDD format (e.g.,20251017)seasontype(optional): 2 (regular season), 3 (playoffs)week(optional): Week number (1-18 for regular season)
Example Request:
GET https://site.api.espn.com/apis/site/v2/sports/football/nfl/scoreboard?dates=20251017
Response Structure with Weather:
{
"leagues": [...],
"events": [
{
"id": "401220339",
"uid": "s:20~l:28~e:401220339",
"date": "2025-09-07T17:00:00Z",
"name": "Kansas City Chiefs at Baltimore Ravens",
"shortName": "KC @ BAL",
"competitions": [
{
"id": "401220339",
"uid": "s:20~l:28~e:401220339~c:401220339",
"date": "2025-09-07T17:00:00Z",
"attendance": 71008,
"venue": {
"id": "4246",
"fullName": "M&T Bank Stadium",
"address": {
"city": "Baltimore",
"state": "MD"
}
},
"competitors": [...],
"status": {...}
}
],
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1"
},
"links": [...],
"status": {...}
}
]
}Weather Data Location:
- Weather appears at the
eventlevel (top level of each event object) - Also may appear within
competitionsarray in some responses
Endpoint: /apis/site/v2/sports/football/nfl/summary?event={eventId}
Description: Returns comprehensive game summary including weather information in the gameInfo object.
HTTP Method: GET
Parameters:
event(required, query): Event ID (e.g.,401220339)
Example Request:
GET https://site.api.espn.com/apis/site/v2/sports/football/nfl/summary?event=401220339
Response Structure with Weather:
{
"header": {
"id": "401220339",
"competitions": [...],
"status": {...}
},
"boxscore": {
"teams": [...],
"players": [...]
},
"gameInfo": {
"venue": {
"id": "4246",
"fullName": "M&T Bank Stadium",
"address": {
"city": "Baltimore",
"state": "MD"
}
},
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1",
"windSpeed": 5,
"windDirection": "NE"
},
"attendance": 71008
},
"drives": [...],
"plays": [...]
}Weather Data Location:
- Weather appears in
gameInfo.weatherobject - More detailed than scoreboard weather (includes wind data)
- Available for completed, in-progress, and scheduled games
Endpoint: /apis/site/v2/sports/football/nfl/teams/{teamId}/schedule
Description: Returns complete schedule for a team with weather information embedded in each event.
HTTP Method: GET
Parameters:
teamId(path, required): NFL team identifierseason(query, optional): Year (e.g.,2025)seasontype(query, optional): 2 (regular season), 3 (playoffs)
Example Request:
GET https://site.api.espn.com/apis/site/v2/sports/football/nfl/teams/12/schedule?season=2025
Response Structure with Weather:
{
"team": {
"id": "12",
"name": "Kansas City Chiefs"
},
"events": [
{
"id": "401220339",
"date": "2025-09-07T17:00:00Z",
"name": "Kansas City Chiefs at Baltimore Ravens",
"competitions": [...],
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1"
},
"status": {...}
}
]
}Weather Data Location:
- Weather appears at the
eventlevel (top level of each event object) - Same structure as scoreboard weather data
Based on displayName field:
| Condition | Description | Typical Conditions |
|---|---|---|
| "Sunny" | Clear skies | Temperature range: 60-85°F |
| "Partly Cloudy" | Partial cloud cover | Temperature range: 55-80°F |
| "Cloudy" | Overcast skies | Temperature range: 50-75°F |
| "Rain" | Precipitation | Temperature: 35-65°F |
| "Snow" | Snowfall | Temperature: <32°F |
| "Dome" / "Indoor" | Indoor stadium | No temperature/wind |
| "Clear" | Clear conditions | Similar to Sunny |
Note: Condition names may vary. Always check the actual displayName value.
Common Condition IDs:
| Condition ID | Condition Type |
|---|---|
| "1" | Clear/Sunny |
| "2" | Partly Cloudy |
| "3" | Cloudy |
| "4" | Rain |
| "5" | Snow |
| "6" | Dome/Indoor |
Note: Condition IDs may vary and may not be consistently used across all responses.
Temperature Fields:
| Field | Type | Unit | Description |
|---|---|---|---|
temperature |
number | Fahrenheit (°F) | Current temperature at game time |
highTemperature |
number | Fahrenheit (°F) | High temperature for the day |
Temperature Format:
- Integer or decimal number
- Fahrenheit scale (not Celsius)
- May be missing for indoor games
Example:
{
"temperature": 78,
"highTemperature": 82
}Wind Fields:
| Field | Type | Unit | Description |
|---|---|---|---|
windSpeed |
number | MPH | Wind speed in miles per hour |
windDirection |
string | Cardinal | Wind direction abbreviation (N, NE, E, SE, S, SW, W, NW) |
Wind Data Availability:
⚠️ Wind data may not always be present- More commonly available in
gameInfo.weatherthan in scoreboard weather - May be absent for indoor games
Example:
{
"windSpeed": 5,
"windDirection": "NE"
}Wind Direction Abbreviations:
N- NorthNE- NortheastE- EastSE- SoutheastS- SouthSW- SouthwestW- WestNW- Northwest
Display Name Format:
- Human-readable string
- Short descriptive text
- Examples: "Sunny", "Partly Cloudy", "Rain", "Snow"
Example:
{
"displayName": "Sunny"
}Characteristics:
- Weather data typically available
- Includes temperature, condition, wind
- Data updated close to game time
- Reflects actual outdoor conditions
Example Outdoor Stadiums:
- Lambeau Field (Green Bay Packers)
- Soldier Field (Chicago Bears)
- Gillette Stadium (New England Patriots)
- Heinz Field (Pittsburgh Steelers)
Weather Data Availability: ✅ Full weather data available
Characteristics:
- Weather data may be minimal or absent
- May show "Dome" or "Indoor" as condition
- No temperature/wind data typically provided
- Controlled environment
Example Indoor Stadiums:
- Mercedes-Benz Stadium (Atlanta Falcons) - Retractable
- Lucas Oil Stadium (Indianapolis Colts) - Retractable
- AT&T Stadium (Dallas Cowboys) - Retractable
- Ford Field (Detroit Lions) - Fixed dome
Weather Data Availability:
Characteristics:
- Weather data depends on roof status
- May show indoor or outdoor conditions
- Temperature/wind data if roof is open
- Condition may reflect roof position
Example Retractable Roof Stadiums:
- State Farm Stadium (Arizona Cardinals)
- NRG Stadium (Houston Texans)
- Mercedes-Benz Stadium (Atlanta Falcons)
Weather Data Availability: ✅ Weather data available when roof is open
Availability:
- Weather data available for scheduled games
- Forecast-based (may change closer to game time)
- Updated as game time approaches
Typical Update Schedule:
- 24-48 hours before: Initial forecast
- 6-12 hours before: Updated forecast
- 1-2 hours before: Final forecast
- Game time: Current conditions
Availability:
- Weather data may be updated during game
- Reflects current conditions at stadium
- Real-time updates possible (not confirmed)
Availability:
- Weather data remains in historical records
- Final game-time conditions preserved
- Available in event summary for completed games
Outdoor Game:
{
"events": [
{
"id": "401220339",
"name": "Kansas City Chiefs at Baltimore Ravens",
"date": "2025-09-07T17:00:00Z",
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1"
}
}
]
}Indoor Game:
{
"events": [
{
"id": "401220340",
"name": "New Orleans Saints at Atlanta Falcons",
"date": "2025-09-08T13:00:00Z",
"weather": {
"displayName": "Dome",
"conditionId": "6"
}
}
]
}Note: Indoor games may have minimal or no weather data.
Detailed Weather Data:
{
"gameInfo": {
"venue": {
"id": "4246",
"fullName": "M&T Bank Stadium",
"address": {
"city": "Baltimore",
"state": "MD"
}
},
"weather": {
"displayName": "Sunny",
"temperature": 78,
"highTemperature": 82,
"conditionId": "1",
"windSpeed": 5,
"windDirection": "NE"
},
"attendance": 71008
}
}Cold Weather Example:
{
"weather": {
"displayName": "Partly Cloudy",
"temperature": 28,
"highTemperature": 35,
"conditionId": "2",
"windSpeed": 12,
"windDirection": "NW"
}
}Snow Example:
{
"weather": {
"displayName": "Snow",
"temperature": 22,
"highTemperature": 30,
"conditionId": "5",
"windSpeed": 8,
"windDirection": "N"
}
}Python Example:
import requests
def get_game_weather_scoreboard(date="20251017"):
"""Extract weather data from scoreboard endpoint."""
url = f"https://site.api.espn.com/apis/site/v2/sports/football/nfl/scoreboard?dates={date}"
response = requests.get(url)
data = response.json()
weather_data = []
for event in data.get("events", []):
event_id = event.get("id")
weather = event.get("weather", {})
weather_data.append({
"event_id": event_id,
"game_name": event.get("name"),
"temperature": weather.get("temperature"),
"high_temperature": weather.get("highTemperature"),
"condition": weather.get("displayName"),
"condition_id": weather.get("conditionId"),
"wind_speed": weather.get("windSpeed"),
"wind_direction": weather.get("windDirection")
})
return weather_data
# Usage
weather = get_game_weather_scoreboard("20251017")
for game_weather in weather:
print(f"{game_weather['game_name']}: {game_weather['temperature']}°F, {game_weather['condition']}")Python Example:
import requests
def get_game_weather_summary(event_id):
"""Extract weather data from event summary endpoint."""
url = f"https://site.api.espn.com/apis/site/v2/sports/football/nfl/summary?event={event_id}"
response = requests.get(url)
data = response.json()
game_info = data.get("gameInfo", {})
weather = game_info.get("weather", {})
venue = game_info.get("venue", {})
return {
"event_id": event_id,
"venue": venue.get("fullName"),
"city": venue.get("address", {}).get("city"),
"state": venue.get("address", {}).get("state"),
"temperature": weather.get("temperature"),
"high_temperature": weather.get("highTemperature"),
"condition": weather.get("displayName"),
"condition_id": weather.get("conditionId"),
"wind_speed": weather.get("windSpeed"),
"wind_direction": weather.get("windDirection")
}
# Usage
weather = get_game_weather_summary("401220339")
print(f"Venue: {weather['venue']}")
print(f"Weather: {weather['temperature']}°F, {weather['condition']}")
print(f"Wind: {weather['wind_speed']} mph {weather['wind_direction']}")Python Example:
def filter_outdoor_games(weather_data):
"""Filter games with outdoor weather conditions."""
outdoor_games = []
for game in weather_data:
condition = game.get("condition", "").lower()
# Exclude indoor/dome games
if "dome" not in condition and "indoor" not in condition:
# Check if temperature is available (indicates outdoor)
if game.get("temperature") is not None:
outdoor_games.append(game)
return outdoor_games
# Usage
all_games = get_game_weather_scoreboard("20251017")
outdoor_games = filter_outdoor_games(all_games)
print(f"Outdoor games: {len(outdoor_games)}")Common Issues:
⚠️ Weather data may not be available for all games⚠️ Indoor games typically lack weather data⚠️ Weather data may be missing for games far in the future⚠️ Weather data may not update in real-time during games⚠️ Field structure may vary between endpoints
Recommendations:
- Always check if weather object exists before accessing
- Handle missing weather data gracefully
- Provide fallback for indoor games
- Cache weather data appropriately
Considerations:
- Weather data is forecast-based for future games
- Actual conditions may differ from forecast
- Data sourced from ESPN's weather providers
- Cross-reference with official weather sources for critical applications
Best Practices:
- Verify accuracy with official weather services for critical use cases
- Consider data freshness when displaying weather
- Note that data is forecast for future games
OpenWeatherMap:
- URL: https://openweathermap.org/
- Features: Current weather, forecasts, historical data
- Pricing: Free tier available
- Status: ✅ Officially supported
National Weather Service (NWS) API:
- URL: https://www.weather.gov/documentation/services-web-api
- Features: Official U.S. government weather data
- Pricing: Free
- Status: ✅ Official government API
Weather.com API:
- URL: https://weather.com/
- Features: Comprehensive weather data
- Pricing: Commercial license required
- Status: ✅ Commercial API
SportsDataIO:
- URL: https://sportsdata.io/
- Features: NFL game weather forecasts included in game data
- Pricing: Paid service
- Status: ✅ Commercial API
Sportradar:
- URL: https://developer.sportradar.com/
- Features: Weather information in NFL schedules
- Pricing: Paid service
- Status: ✅ Commercial API
GitHub Weather Data Repository:
- URL: https://github.com/ThompsonJamesBliss/WeatherData
- Features: NFL weather data 2000-2020
- Pricing: Free (open source)
- Status: ✅ Available
NFLWeather.com:
- URL: https://www.nflweather.com/
- Features: Historical NFL game weather archives
- Pricing: Free
- Status: ✅ Available
Pattern:
- Get game schedule from ESPN API
- Extract venue location (city, state)
- Get game date/time
- Fetch weather from third-party weather API
- Combine data for comprehensive game info
Python Example:
import requests
from openweathermap import OpenWeatherMap # Example
def get_game_with_weather(event_id):
"""Combine ESPN game data with third-party weather API."""
# 1. Get game data from ESPN
espn_url = f"https://site.api.espn.com/apis/site/v2/sports/football/nfl/summary?event={event_id}"
espn_response = requests.get(espn_url)
game_data = espn_response.json()
# 2. Extract venue info
game_info = game_data.get("gameInfo", {})
venue = game_info.get("venue", {})
address = venue.get("address", {})
city = address.get("city")
state = address.get("state")
# 3. Get game date
header = game_data.get("header", {})
game_date = header.get("date")
# 4. Get detailed weather from third-party API
weather_api = OpenWeatherMap(api_key="YOUR_API_KEY")
detailed_weather = weather_api.get_weather(city=city, state=state, date=game_date)
# 5. Combine data
return {
"game": {
"id": event_id,
"name": header.get("name"),
"venue": venue.get("fullName"),
"date": game_date
},
"espn_weather": game_info.get("weather", {}),
"detailed_weather": detailed_weather
}Recommended Approach:
def get_weather_safely(event_data):
"""Safely extract weather data with error handling."""
try:
weather = event_data.get("weather", {})
if not weather:
return None
return {
"temperature": weather.get("temperature"),
"high_temperature": weather.get("highTemperature"),
"condition": weather.get("displayName"),
"wind_speed": weather.get("windSpeed"),
"wind_direction": weather.get("windDirection")
}
except (KeyError, TypeError, AttributeError) as e:
print(f"Error extracting weather: {e}")
return NoneRecommended Cache Settings:
- TTL: 30 minutes (future games - forecast updates)
- TTL: 5 minutes (current games - conditions change)
- TTL: 1 hour (completed games - historical data)
Cache Keys:
cache_key = f"nfl_weather:{event_id}:{timestamp}"
Schema Validation Example (Pydantic):
from pydantic import BaseModel
from typing import Optional
class WeatherData(BaseModel):
displayName: Optional[str] = None
temperature: Optional[int] = None
highTemperature: Optional[int] = None
conditionId: Optional[str] = None
windSpeed: Optional[int] = None
windDirection: Optional[str] = None
class GameWeather(BaseModel):
event_id: str
weather: Optional[WeatherData] = NoneUse Case: Display current weather conditions for all games
Implementation:
- Fetch scoreboard for current date
- Extract weather for each game
- Display in dashboard format
- Update periodically (every 5-15 minutes)
Use Case: Analyze how weather affects game outcomes
Implementation:
- Fetch historical game data
- Extract weather conditions from event summaries
- Correlate weather with game statistics
- Identify weather impact patterns
Use Case: Provide weather conditions for fantasy football decisions
Implementation:
- Get player game schedules
- Fetch weather for each game
- Provide weather impact recommendations
- Highlight extreme weather conditions
Use Case: Display weather forecasts for upcoming games
Implementation:
- Get team schedules
- Extract game dates and venues
- Fetch weather from scoreboard or combine with weather API
- Display forecast for each game
Data Limitations:
⚠️ Weather data may not be available for all games⚠️ Indoor games lack detailed weather data⚠️ Forecast accuracy varies with lead time⚠️ Real-time updates not guaranteed⚠️ Wind data may be missing
API Limitations:
⚠️ No dedicated weather endpoint⚠️ Weather embedded in game responses⚠️ Must fetch full game data to get weather⚠️ Structure may vary between endpoints
For Production Applications:
- Consider using third-party weather APIs for more reliable data
- Implement fallback mechanisms for missing weather data
- Cross-reference with official weather sources for critical use cases
- Cache weather data appropriately to reduce API calls
- Handle missing weather data gracefully in UI
For Research/Analysis:
- Use ESPN API for historical game weather data
- Supplement with third-party weather APIs for detailed conditions
- Consider historical weather repositories for long-term analysis
- Validate data accuracy with official sources
ESPN's public API provides weather condition data for NFL games embedded within game event responses. While not a dedicated endpoint, weather information is available through:
- Scoreboard endpoint (
/scoreboard) - Event summary endpoint (
/summary?event={eventId}) - Team schedule endpoint (
/teams/{teamId}/schedule)
Key Findings:
- Weather data is embedded, not a standalone endpoint
- Available primarily for outdoor games
- Includes temperature, condition, and sometimes wind data
- Forecast-based for future games, actual conditions for completed games
- Data structure may vary between endpoints
Recommended Approach:
- Use ESPN API for basic weather data embedded in game responses
- Supplement with third-party weather APIs for detailed/forecast data
- Implement robust error handling for missing weather data
- Cache weather data appropriately to reduce API calls
-
ESPN API Documentation (Community):
-
Alternative Weather APIs:
- OpenWeatherMap: https://openweathermap.org/
- National Weather Service: https://www.weather.gov/documentation/services-web-api
- SportsDataIO: https://sportsdata.io/
-
Historical Weather Data:
- GitHub Weather Data: https://github.com/ThompsonJamesBliss/WeatherData
- NFLWeather.com: https://www.nflweather.com/
-
Model Context Protocol:
| Endpoint | Weather Location | Wind Data |
|---|---|---|
/scoreboard |
events[].weather |
|
/summary?event={id} |
gameInfo.weather |
✅ Often |
/teams/{id}/schedule |
events[].weather |
| Field | Always Present | Typical Values |
|---|---|---|
displayName |
✅ | "Sunny", "Rain", "Snow" |
temperature |
20-85°F | |
highTemperature |
30-90°F | |
conditionId |
"1", "2", "3" | |
windSpeed |
❌ Rarely | 0-25 MPH |
windDirection |
❌ Rarely | "N", "NE", "E", etc. |
| Condition | Description | Typical Temperature |
|---|---|---|
| "Sunny" | Clear skies | 60-85°F |
| "Partly Cloudy" | Partial clouds | 55-80°F |
| "Cloudy" | Overcast | 50-75°F |
| "Rain" | Precipitation | 35-65°F |
| "Snow" | Snowfall | <32°F |
| "Dome" | Indoor stadium | N/A |
End of Report
Last Updated: January 2025 For questions or updates, refer to community resources or ESPN's official channels.