---
title: "Lists archived games with scores and the number of odds, props and player-stat rows held for each."
method: GET
path: "/api/v1/history/games"
tags: ["Historical data"]
---

# Lists archived games with scores and the number of odds, props and player-stat rows held for each.

`GET /api/v1/history/games`

## Request

- Base URL: `https://api.owlsinsight.com`
- URL: `https://api.owlsinsight.com/api/v1/history/games`
- Auth: HTTP bearer

Lists archived games with scores and the number of odds, props and player-stat rows held for each.

At least one of sport, season, team or startDate is required.

commenceTime is the scheduled start in UTC. Present when recorded; /history/odds rows with recordedAt before it are pre-game.

homeScore and awayScore are present when the final score was captured at archive, absent otherwise; periodScores, when present, lists each period by label (Q1, OT1, or the inning or period number) with both sides.

homeTeamId and awayTeamId are the roster ids the odds endpoints use (home_team_id, away_team_id); absent when a name is not on our roster.

oddsSnapshots counts every stored row, including rows /history/odds filters out for unusable prices, so it can exceed what that endpoint returns.

playerStats: rows on /history/stats. gradedResults (live-archived games): graded results on /api/v1/{sport}/props/results?game_id=.

Historical endpoints share a per-key in-flight limit that is lower than the general concurrent-request limit. A request beyond it returns 429 with a Retry-After header giving the delay in seconds; wait that long and resend.

503 with a Retry-After header means the archive could not serve that request: the query was too expensive to run in one request, or the archive read path was busy. Wait the indicated seconds before resending; if it repeats, narrow the request with the filters this endpoint accepts.

Page one event at a time with limit and offset and stop when a page comes back shorter than limit. Do not fan out one request per book or market in parallel.

## Query parameters

- `sport` string
- `season` string
- `team` string
- `gameType` string
- `startDate` string
- `endDate` string
- `limit` string
- `offset` string

## Response `200`

OK

- HistoryGamesResponse
  - `data` object
    - `games` ArchivedGame[]
      - `archivedAt` string
      - `awayScore` number, double
      - `awayTeam` string
      - `awayTeamId` string: Stable roster id for `awayTeam`; same rules.
      - `commenceTime` string: Scheduled start of the game. Cut `recordedAt` against this to separate pre-game odds from in-play ones exactly, rather than by date. Absent whenever the start time was not captured: every game archived before 2026-09-20, and any game since whose start we could not resolve. Treat its absence as "unknown", never as a start of midnight.
      - `eventId` string
      - `gameDate` string: The DATE the game is filed under, which is a UTC date and not the start time.
      - `gameType` string
      - `homeScore` number, double: Final score, absent when the archive did not capture one.
      - `homeTeam` string
      - `homeTeamId` string: Stable roster id for `homeTeam`, absent when the name is not on a roster we carry. Note the casing: camelCase here, `home_team_id` on `/odds`.
      - `oddsSnapshots` number, double, nullable: Stored odds rows for the eventId, both team orderings. `null` when the count could not be taken when the game was archived ("not counted", never a false 0); a later recount fills it.
      - `periodScores` object[]: Per-period scores, absent when none were captured. `period` is a label, not an index: `"Q1"`..`"Q4"` then `"OT1"`, `"OT2"` for the quarter sports (nba, wnba, nfl, ncaaf), and the plain period or inning number for everything else. A bare `"OT"` is never sent.
        - `away` number, double
        - `home` number, double
        - `period` string
      - `playerStats` number, double
      - `propsSnapshots` number, double, nullable: Stored props rows for the eventId; `null` when not counted (as oddsSnapshots).
      - `season` string
      - `source` string: How the row got here: the live pipeline, or a backfill run.
      - `sport` string
      - `venue` string
    - `pagination` object
      - `hasMore` boolean
      - `limit` number, double
      - `offset` number, double
      - `total` number, double
  - `success` boolean

---

[API](https://skmtc.dev/owlsinsight/apis/owls-insight-api.md) · [All operations](https://skmtc.dev/owlsinsight/apis/owls-insight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/owlsinsight/apis/owls-insight-api/revisions/76c1ea016ff1?raw)
