API

Free · read-only · no key required

PUL Stats Hub publishes its stats as plain JSON. No API key, no sign-up, no rate limit. Fetch a file, use the data. Start with the manifest — it lists every endpoint that currently exists.

Every response has the same shape: { schemaVersion, generatedAt, league, data }. Your data is in data. generatedAt tells you how fresh it is, and is null for older seasons we have no timestamp for.

Endpoints

  • /api/v1/index.json
    Manifest — every available endpoint, per season, with status and last-updated.
  • /api/v1/games.json
    Every completed game, all seasons, with final scores.
  • /api/v1/teams.json
    Team directory — abbreviation, name, colors.
  • /api/v1/{season}/standings.json
    Win/loss, points for/against, point differential, division.
  • /api/v1/{season}/schedule.json
    All games including unplayed ones (null scores), with venue and stream links. Cancelled games are flagged cancelled: true, so you can tell them apart from games not yet played.
  • /api/v1/{season}/teams.json
    Team season totals. Absent for seasons without game stats.

Things worth knowing

This is a snapshot, not an event log. Values change retroactively — scores get corrected and stats get reprocessed as we fix data. Check generatedAt if freshness matters to you.

If an endpoint isn't in the manifest, it doesn't exist. We'd rather 404 than hand you an empty array that looks like real data. Seasons without game stats have no team-totals endpoint at all.

Player stats aren't here yet. Players will get a stable ID before they get an endpoint — we're not publishing an identifier we'd have to change later.

Postseason games carry isPostseason: true and weeks 98 (semifinals) / 99 (finals). Filter on the boolean, not the number.

Stability. Within /api/v1/ changes are additive only — new fields may appear, but existing fields won't change name, type, or meaning. Anything breaking gets a new /api/v2/, and v1 keeps working for at least six months after. Data values changing (a corrected score) isn't a breaking change — that's the snapshot note above.

Using it

Free to use with attribution to PUL Stats Hub. If you build something, we'd love to know — get in touch. It also helps us warn you before anything changes.

Help us grow the archive! We're looking for volunteers to collect stats from historical game footage.