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 themanifest — 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

Each endpoint has a reference page with every field, its type, and worked examples in curl, JavaScript, and Python.

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 carryisPostseason: 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.