Events and filters
Available for: Concierge API · Enterprise API
Specify the event families your application actually consumes. Omitted or empty eventTypes currently defaults to market_line_update only; it does not subscribe you to every event family.
Subscription request
{
"eventTypes": ["market_line_update", "event_update"],
"leagueIds": [5],
"eventIds": [],
"marketTypeIds": [1],
"marketSourceIds": [7],
"betTypeIds": [1, 2, 3],
"includeSnapshot": false
}
These are sample IDs, not a current list of available leagues or books. Use GET /league, GET /market-type, GET /bettype, GET /event/{league}/upcoming, and GET /market/{league}/{marketType}/sources to discover the data you need.
| Field | Type | Behavior |
|---|---|---|
eventTypes |
string[] |
Event families to deliver; defaults to market_line_update. Use exact names below. |
leagueIds |
int[] |
Limits league-scoped messages. Concierge API remains restricted to its five professional U.S. sports. |
eventIds |
long[] |
Limits individual lines within market-line updates and market-line snapshots by market.eventId. It does not filter every event family. |
marketTypeIds |
int[] |
Limits market-line updates and snapshots by market type. |
marketSourceIds |
long[] |
Limits source-scoped messages and the lines/alternates within market-line updates and snapshots. |
betTypeIds |
long[] |
Limits market-line updates and snapshots, and market metadata updates. |
includeSnapshot |
boolean |
Requests initial market-line snapshot chunks when the server snapshot feature is enabled; defaults to false. |
Omitted or empty dimension arrays request no additional client filter within your API tier's data coverage. The server can narrow requested filters to that coverage. An empty resulting set is not an all-data wildcard.
Unknown league, market type, market source, or bet type values can return 400. A valid subscription can also receive no messages when no available data matches. Check your API tier after a 403; widening filters or repeating requests does not change the tier's coverage.
eventIds currently narrows market-line data only. If you also request event_update, market_update, or model events, filter those payloads by their own event IDs in your application. A sportsbook filter does not filter scores or the game clock.
Event names and JSON roots
Data event payloads use a data envelope with a camel-case root. Snapshot completion and gap notices use the smaller control shapes shown below.
| SSE event | JSON root | Purpose and availability |
|---|---|---|
market_line_update |
data.marketLineUpdate |
Changes to prices, points, availability, liquidity, alternate lines, and line metadata. Concierge API and Enterprise API within scope. |
event_update |
data.eventUpdate |
Event state, clock, scores, timing, and metadata. Concierge API and Enterprise API within scope. |
market_update |
data.marketUpdate |
Market lifecycle and metadata. Concierge API and Enterprise API within scope. |
market_source_update |
data.marketSourceUpdate |
Sportsbook or market-source metadata. Concierge API and Enterprise API within scope. |
in_game_fair_price_update |
data.inGameFairPriceUpdate |
NFL model state. Enterprise API. |
event_lineup |
data.eventLineup |
Lineup update. Enterprise API. |
player_news |
data.playerNews |
Player-news update. Enterprise API. |
player_percent_to_play |
data.playerPercentToPlay |
Player availability update. Enterprise API. |
play_by_play |
data.playByPlay |
Play-by-play state. Enterprise API. |
market_line_snapshot |
data.marketLineUpdate |
Requested initial market-line snapshot chunk; same line shape as a market-line update. |
market_line_snapshot_complete |
top-level lineCount, sequence, ready |
Initial snapshot completion/readiness control frame. |
gap |
top-level droppedEvents |
The current connection discarded queued events because the consumer fell behind. Repair state from REST. |
The control event names cannot be used as ordinary subscription event types. Request includeSnapshot to ask for snapshots; listen for gap on every connection. Do not infer commercial feature availability just because an event name exists in the protocol.
Filter applicability
| Family | League | Event ID | Market type | Market source | Bet type |
|---|---|---|---|---|---|
| Market-line updates and snapshots | Yes | Yes, within lines | Yes | Yes, within lines and alternates | Yes, within lines |
| Event updates | Yes | No | No | No | No |
| Market updates | Yes | No | No | No | Yes |
| Market-source updates | No | No | No | Yes | No |
| NFL in-game fair-price updates | Yes | No | No | No | No |
| Lineups, player news, percent-to-play, play-by-play | League-scoped where metadata is present | No | No | No | No |
Your API tier's data coverage applies even to event families without a user-specified filter dimension. A metadata notification does not expand that coverage.
Market-line updates
One frame can contain multiple lines:
{
"data": {
"marketLineUpdate": {
"marketSourceGroup": "STANDARD",
"leagueId": 5,
"marketTypeId": 1,
"correlationId": null,
"messageId": "33a224985bed44849a4641ba9fdba59b0",
"marketLines": [
{
"marketId": 308238780,
"marketLineId": 17971985415,
"marketSourceId": 7,
"points": null,
"price": 135,
"sourcePrice": 135.0,
"sourceFormat": 1,
"liquidity": null,
"statusId": 1,
"disabled": false,
"sequenceNumber": 1788207551574,
"freshnessExpiresAt": null,
"modifiedOn": "2026-10-01T15:00:00Z",
"bestAltPrice": null,
"bestAltPoints": null,
"alternateLines": [],
"marketLineKey": "illustrative.path.to.a.line",
"market": {
"eventId": 110845,
"marketTypeId": 1,
"betTypeId": 1,
"teamId": 56,
"sideIndex": 0,
"periodTypeId": 20,
"personId": null,
"live": false,
"modifiedOn": "2026-10-01T15:00:00Z"
}
}
]
}
}
}
This is illustrative sample output. Fields depend on the line and your API tier's datasets; additional fields may appear.
- Identify a source line by
marketLineId. UsemarketSourceIdand market metadata to associate it with the correct book and selection. - Use
marketLineKeyas a location hint into the REST hierarchy; do not parse its segments to derive league, book, or betting semantics. - Reject stale line updates using
sequenceNumberand/ormodifiedOn. Neither the SSE frameidnormessageIdis a numeric ordering value. - Apply
disabled,statusId,freshnessExpiresAt, liquidity, and alternate-line changes even when price and points remain unchanged. - A streaming
nullcan explicitly clear a field. Do not drop all null-valued fields while merging. - Preserve unrelated REST-only metadata. Retain a
deepLinkfor price or status changes only when the selection's points remain unchanged. If points change, invalidate and refetch its link; apply this rule to each alternate too. The stream does not resend deep links with updates.
Market-line status is a protocol enum: 1 Available, 2 Unavailable, 3 PriceUnknown. disabled: true also means the line should not be offered as an available wager. freshnessExpiresAt, when present, is a UTC freshness boundary for the line; stop presenting an expired quote as current. This is separate from NFL model state transitions.
Alternate lines and liquidity
An update may carry alternate or milestone values while the top-level points and price are null. Inspect alternateLines before deciding that no actionable values exist.
{
"marketLineId": 17971985469,
"marketSourceId": 7,
"points": null,
"price": null,
"alternateLines": [
{
"marketLineId": 17971985470,
"marketSourceId": 7,
"points": -1.0,
"price": 119,
"sourcePrice": 119.0,
"sourceFormat": 1,
"liquidity": 5000.0,
"alternateNumber": 1,
"statusId": 1,
"disabled": false,
"sequenceNumber": 1788207551574,
"freshnessExpiresAt": null,
"modifiedOn": "2026-10-01T15:00:00Z"
}
]
}
Match alternates by marketLineId, retain their own ordering fields, and process liquidity independently of prices. Do not assume the outer line is always the line currently displayed to your users.
Event and metadata updates
Event updates
data.eventUpdate contains leagueId, change, event, correlationId, and messageId. The embedded event can contain eventId, status, start/end times, period, game clock, and eventTeams with scores. Exact fields vary by league and game state.
{
"data": {
"eventUpdate": {
"leagueId": 5,
"change": "updated",
"event": {
"eventId": 110845,
"leagueId": 5,
"statusId": 2,
"statusName": "Live",
"eventStart": "2026-10-01T14:00:00Z",
"gameClock": "05:32",
"eventTeams": [
{"teamId": 56, "score": 3, "sideIndex": 0},
{"teamId": 34, "score": 4, "sideIndex": 1}
],
"modifiedOn": "2026-10-01T15:00:00Z"
},
"correlationId": null,
"messageId": "33a224985bed44849a4641ba9fdba59b0"
}
}
}
Identify the event by eventId and reject older modifiedOn values when available. An eventIds subscription filter does not currently narrow this family; filter locally if you only need one game.
Market and source metadata
data.marketUpdate contains leagueId, updateType, and market, plus message/correlation IDs. Use the identifiers inside market to locate its event and selection; preserve the documented lifecycle state rather than assuming every message means a new active market.
data.marketSourceUpdate contains marketSource, plus message/correlation IDs. Use marketSource.id as the stable book/source identifier. Changes can include active state or separate straight, props, and futures availability.
Next: Connect with a complete sample or handle snapshots and reconnects.