---
updatedAt: 2026-09-09T06:50:11.000Z
agentTools:
  siteIndex: https://developer.sportradar.com/llms.txt
  projectIndex: https://developer.sportradar.com/football/llms.txt
---

# 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. <br />

***

## The Push Feeds

| Feed                                                                                                    | What it streams                                                                   |
| ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| <Anchor label="Push Events" target="_blank" href="ref:nfl-push-events">Push Events</Anchor>             | Every play and game event as it lands, with the game header and situation context |
| <Anchor label="Push Statistics" target="_blank" href="ref:nfl-push-statistics">Push Statistics</Anchor> | Team and player statistic lines updated as plays are entered                      |
| <Anchor label="Push Pulse" target="_blank" href="ref:nfl-push-pulse">Push Pulse</Anchor>                | A lightweight scoring pulse for score-and-clock use cases                         |

<br />

***

## Opening a Connection

Subscribe with a single GET; follow redirects and keep the connection open:

```http Push Events
GET https://api.sportradar.com/nfl/official/{access_level}/stream/{language_code}/events/subscribe
```
```http Push Statistics
GET https://api.sportradar.com/nfl/official/{access_level}/stream/{language_code}/statistics/subscribe
```

<div style={{border: "1px solid #C5CAE9", borderRadius: "12px", overflow: "hidden", margin: "4px 0 8px"}}>
<div style={{background: "linear-gradient(90deg, #1A237E 0%, #283593 60%, #3949AB 100%)", color: "#FFFFFF", padding: "10px 18px", display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: "4px 12px"}}><span style={{fontWeight: 700, fontSize: "14px", letterSpacing: "0.02em"}}>PUSH CONNECTION LIFECYCLE</span><span style={{fontSize: "12px", opacity: 0.8}}>one connection covers every live NFL game</span></div>
<div style={{padding: "12px 18px", background: "#FFFFFF", display: "flex", flexDirection: "column", gap: "10px"}}>
<div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}><span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>1. Subscribe</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>GET /stream/en/events/subscribe</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#FAFAFA", color: "#374151", fontSize: "12px"}}>the connection redirects, then stays open</span></div>
<div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}><span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>2. Stream</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>chunked messages</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#FAFAFA", color: "#374151", fontSize: "12px"}}>one JSON message per line; heartbeats every 5 seconds confirm a healthy connection</span></div>
<div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}><span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>3. Apply</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>replace by id</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#FAFAFA", color: "#374151", fontSize: "12px"}}>each message carries full current state for its entity; newer replaces older</span></div>
<div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}><span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>4. Reconnect</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>resubscribe + REST catch-up</span><span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#FAFAFA", color: "#374151", fontSize: "12px"}}>on a drop, open a new connection and refill the gap from the matching REST feeds</span></div>
</div>
<div style={{padding: "8px 14px", borderTop: "1px solid #E8EAF6", fontSize: "12px", color: "#6B7280", background: "#FAFAFA"}}>Push complements the REST feeds; it does not replace them.</div>
</div>

<br />

***

## Filtering 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 <Anchor label="Push Events" target="_blank" href="ref:nfl-push-events">Push Events</Anchor> reference page carries the full parameter list with examples. <br />

***

## Reading the Stream

Messages arrive one JSON object per line. Heartbeats confirm the connection every five seconds:

```json Heartbeat
{
    "heartbeat": {
        "interval": 5000
    }
}
```

An event message pairs the game header with the event itself (trimmed to scalar fields):

```json Push Events message
{
    "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.

<br />

***

## Statistics Messages

Statistics messages carry the team context and the updated statistic lines (trimmed):

```json Push Statistics message
{
    "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"
    }
}
```

<br />

***

## 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 `team` and statistics messages name the team or player in `participant`, each paired the same way (`sd:team:...,sr:competitor:4422`)
* Route messages by `metadata.match` before parsing the payload when you track several games on one connection
* Filter high-interest moments client-side with `event_type` and `event_category`, which carry the same values the query string parameters accept

<br />

***

## Recovering from Disconnections

If you are disconnected, resubscribe and use the corresponding RESTful feed to catch up: request the <Anchor label="Game Play-by-Play" target="_blank" href="ref:nfl-play-by-play">Game Play-by-Play</Anchor> to recover missed plays, and the <Anchor label="Game Statistics" target="_blank" href="ref:nfl-game-statistics">Game Statistics</Anchor> feed to refresh statistic lines. Design the catch-up path first; live streams should always have a REST fallback. <br />

***

## Testing Push

You can use our [API Simulations](https://developer.sportradar.com/getting-started/docs/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.

<br />

***