Push Feeds
The NFL API's Push feeds stream data to you as it is entered, over a long-lived HTTP connection, removing the need to poll during live windows. Push complements the REST feeds rather than replacing them: there is no stateful session, so after any disconnection the matching REST feed fills the gap.
The Push Feeds
| Feed | What it streams |
|---|---|
| Push Events | Every play and game event as it lands, with the game header and situation context |
| Push Statistics | Team and player statistic lines updated as plays are entered |
| Push Pulse | A lightweight scoring pulse for score-and-clock use cases |
Opening a Connection
Subscribe with a single GET; follow redirects and keep the connection open:
GET https://api.sportradar.com/nfl/official/{access_level}/stream/{language_code}/events/subscribeGET https://api.sportradar.com/nfl/official/{access_level}/stream/{language_code}/statistics/subscribeFiltering the Stream
By default a connection carries every live game. Query string parameters narrow the stream:
| Parameter | Purpose |
|---|---|
event_category | Event families such as redzone, two_minute, scoring_play, big_play, turnover |
event_type | Specific event types such as timeout, two_minute_warning, period_end, game_over |
match | A single game |
team | A single team's games |
status | inprogress or created |
locale | Language code (en) |
The Push Events reference page carries the full parameter list with examples.
Reading the Stream
Messages arrive one JSON object per line. Heartbeats confirm the connection every five seconds:
{
"heartbeat": {
"interval": 5000
}
}An event message pairs the game header with the event itself (trimmed to scalar fields):
{
"payload": {
"game": {
"id": "8e5c2ec7-7a64-4095-84dc-1aaf6ab964bb",
"title": "Monday Night Football",
"status": "inprogress",
"coverage": "full",
"game_type": "regular",
"scheduled": "2025-10-28T00:15:00+00:00",
"entry_mode": "LDE",
"wx_temp": 54,
"wx_humidity": 86,
"wx_wind_speed": 5,
"wx_wind_direction": "E",
"wx_condition": "Overcast",
"weather": "Overcast Temp: 54 F, Humidity: 86%, Wind: E 5 mph",
"quarter": 1,
"clock": "14:52",
"conference_game": false,
"sr_id": "sr:match:60575123"
},
"event": {
"type": "play",
"id": "d39d3a70-b38e-11f0-a6de-413cdae9e49d",
"sequence": 1761610592006,
"clock": "15:00",
"home_points": 0,
"away_points": 0,
"created_at": "2025-10-28T00:16:32+00:00",
"updated_at": "2025-10-28T00:16:33+00:00",
"play_type": "kickoff",
"wall_clock": "2025-10-28T00:16:14+00:00",
"source": "SRUS",
"official": true,
"fake_punt": false,
"fake_field_goal": false,
"screen_pass": false,
"play_action": false,
"run_pass_option": false,
"description": "H.Butker kicks 60 yards from KC 35 to the WAS 5. L.McCaffrey returns the kickoff. Tackled by KC at WAS 43."
}
},
"locale": "en",
"metadata": {
"league": "nfl",
"match": "sd:match:8e5c2ec7-7a64-4095-84dc-1aaf6ab964bb,sr:match:60575123",
"status": "inprogress",
"event_type": "kickoff",
"event_category": "",
"locale": "en",
"operation": "update",
"version": "v7",
"team": "sd:team:6680d28d-d4d2-49f6-aace-5292d3ec02c2,sr:competitor:4422"
}
}Messages arrive ahead of the television picture. Broadcast integrations commonly hold the display of push data back so it lands with their video feed; apply that offset in the presentation layer and keep ingestion immediate.
Statistics Messages
Statistics messages carry the team context and the updated statistic lines (trimmed):
{
"payload": {
"name": "Chiefs",
"market": "Kansas City",
"alias": "KC",
"id": "8e5c2ec7-7a64-4095-84dc-1aaf6ab964bb",
"title": "Monday Night Football",
"status": "inprogress",
"coverage": "full",
"game_type": "regular",
"scheduled": "2025-10-28T00:15:00+00:00",
"entry_mode": "LDE",
"wx_temp": 54,
"wx_humidity": 86,
"wx_wind_speed": 5,
"wx_wind_direction": "E",
"wx_condition": "Overcast",
"weather": "Overcast Temp: 54 F, Humidity: 86%, Wind: E 5 mph",
"quarter": 1,
"clock": "14:52",
"conference_game": false,
"sr_id": "sr:match:60575123",
"team": {
"name": "Chiefs",
"market": "Kansas City",
"alias": "KC",
"id": "6680d28d-d4d2-49f6-aace-5292d3ec02c2",
"sr_id": "sr:competitor:4422"
}
},
"locale": "en",
"metadata": {
"league": "nfl",
"match": "sd:match:8e5c2ec7-7a64-4095-84dc-1aaf6ab964bb,sr:match:60575123",
"status": "inprogress",
"participant": "sd:team:6680d28d-d4d2-49f6-aace-5292d3ec02c2,sr:competitor:4422",
"locale": "en",
"operation": "update",
"version": "v7"
}
}Metadata and Routing
Every payload closes with a metadata block: the league, the game, the game status, the operation, and the event type or participant the message concerns. Comma-delimited values pair the sd:-prefixed GUID with the sr: URN for the same entity, so read them as an array:
"match": "sd:match:8e5c2ec7-...,sr:match:60575123"is one game under both ID families- Event messages name the team in
teamand statistics messages name the team or player inparticipant, each paired the same way (sd:team:...,sr:competitor:4422) - Route messages by
metadata.matchbefore parsing the payload when you track several games on one connection - Filter high-interest moments client-side with
event_typeandevent_category, which carry the same values the query string parameters accept
Recovering from Disconnections
If you are disconnected, resubscribe and use the corresponding RESTful feed to catch up: request the Game Play-by-Play to recover missed plays, and the Game Statistics feed to refresh statistic lines. Design the catch-up path first; live streams should always have a REST fallback.
Testing Push
You can use our API Simulations to open a continuous Push simulation of a NFL game. Simulations replay past games as if they were live, over both REST and Push, so connection handling, parsing, and recovery can be exercised at any time of year.
Updated 12 days ago
