API reference · Live games
Get a game
GET/v1/sports/games/{game}
One game with its Kalshi and Polymarket links and its score and status changes, oldest first, each with the league's own time and Langbot's detection time.
On this page
Auth. None. Without a token the call is served as Free (the Free delay and request budget, shared per IP); send Authorization: Bearer lb_… for your plan's.
Limits. Counts against your plan's API requests (60, 600 or 3,000 a minute on Free, Builder and Standard). Served at your plan's delay (+60 s Free, +10 s Builder, +2 s Standard).
Parameters
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
game | string | yes | The game's id (nhl_2026020276) or event_id (ev_sports_nhl_2026020276). |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
since | integer | no | Events with t_spoken from this ms epoch (default a day before the start); next_since pages. |
types | string | no | Comma-separated: score_changed, game_status. |
limit | integer | no | Page size. 1 to 2000. Default 500. |
Request
curl "https://api.langbot.ai/v1/sports/games/nhl_2026020276?types=score_changed"from langbot import LangbotClient
async with LangbotClient() as lb:
g = await lb.sports_game("nhl_2026020276", types=["score_changed"])
for e in g.events:
print(e.t_detected, e.facts["scoring_team"], e.facts["away_score"], e.facts["home_score"])import { LangbotClient } from "@langbotai/sdk";
const lb = new LangbotClient();
const g = await lb.sportsGame("nhl_2026020276", { types: ["score_changed"] });
for (const e of g.events) console.log(e.t_detected, e.facts.scoring_team);Response
200 OK
{
"ts": 1794113400000,
"delay_ms": 0,
"rights": "restricted",
"game": {"id": "nhl_2026020276", "league": "nhl", "game_id": "2026020276", "event_id": "ev_sports_nhl_2026020276", "date": "2026-11-07", "start_time": 1794106800000, "title": "VAN @ EDM", "away": {"code": "VAN", "name": "Vancouver Canucks", "score": 1}, "home": {"code": "EDM", "name": "Edmonton Oilers", "score": 1}, "status": "live", "status_detail": null, "period": 3, "period_type": "REG", "clock": "14:21", "score_at": 1794110943512, "markets": {"kalshi": 9, "polymarket": 1}, "linked": null},
"links": [
{"venue": "kalshi", "venue_event": "KXNHLGAME-26NOV07VANEDM", "series": "KXNHLGAME", "kind": "game", "title": "Vancouver vs Edmonton", "market_tickers": ["KXNHLGAME-26NOV07VANEDM-EDM", "KXNHLGAME-26NOV07VANEDM-VAN"], "method": "ticker", "linked_at": 1794112003000}
],
"events": [
{
"id": "evt_1V2C8QK8YJ8B0D8R1N3W6XH0ZM",
"type": "score_changed",
"t_spoken": 1794110943512,
"t_detected": 1794110943512,
"t_emitted": 1794110943540,
"hash": "9a41c0e2d7…",
"chain_seq": 18,
"market_refs": ["KXNHLGAME-26NOV07VANEDM-EDM", "KXNHLGAME-26NOV07VANEDM-VAN"],
"facts": {"league": "nhl", "game": "nhl_2026020276", "away": "VAN", "home": "EDM", "away_score": 1, "home_score": 1, "prev_away_score": 1, "prev_home_score": 0, "scoring_team": "VAN", "points": 1, "correction": false, "period": 2, "period_type": "REG", "clock": "8:03", "play_id": "512", "play_kind": "goal", "league_time": null, "via": "pbp"}
}
],
"next_since": null,
"timeline": "/v1/sim/events/ev_sports_nhl_2026020276/timeline",
"plays": null
}Each event is a feed event on the same clock as the venues' trades and books: t_detected is when Langbot saw the change, t_spoken the league's own time of the play when its feed publishes one (NBA, MLB; for NHL it equals t_detected), t_emitted when the feed sent it; id is the event id, so Get a receipt verifies it. facts.correction is true when a score was taken back on review. links are the venue events Langbot linked to the game: Kalshi per-game event tickers (<SERIES>-<YYMONDD><AWAY><HOME>) with their market tickers, and the game's Polymarket event. timeline replays the game with those markets' recorded order books in Sim; the event study takes score <team> (or score) as trigger words. The leagues' play-by-play text is not served.
Errors
| Status | code | When |
|---|---|---|
| 404 | not_found | No game with that id. |
| 422 | validation_error | An unknown type. |
| 401 | token_invalid | A token was sent and not recognised. Send a valid one, or none to call anonymously. |
| 429 | rate_limited | Over your request budget; wait Retry-After seconds. |
Every error body is {"detail": …, "code": "…"}; branch on code. All codes: Errors.