← API overview

teams.json

/api/v1/teams.json

Team directory — the canonical abbreviation, name, and colors for every team in league history.

Response

Every endpoint returns the same envelope. Your data is indata — data is the array itself — there is no wrapper object inside it.

{
  "schemaVersion": "1.0",
  "generatedAt": "2026-06-23T14:03:13.152995-04:00",
  "league": "PUL",
  "data": [ ... ]
}

generatedAt is a nullable ISO-8601 timestamp that may or may not carry a UTC offset — parse leniently. It is null for 2022 and 2023, which predate the pipeline that records it.

Fields

FieldTypeMeaning
abbrevstringCanonical abbreviation. This is the join key used by every other endpoint.
namestringFull team name.
colors.primarystringPrimary team color as a hex string, e.g. "#7AC5BE".
colors.secondarystringSecondary team color as a hex string.

Dotted names are nested — colors.primary means{ colors: { primary } }. When the parent is a list of objects (like seasons on the manifest),seasons.season means each entry in that array has its ownseason field — access it as seasons[i].season, not seasons.season.

Examples

curl
curl -s https://pul-stats-hub.pages.dev/api/v1/teams.json
JavaScript
// Abbreviation -> name lookup, for joining against other endpoints
const res = await fetch('https://pul-stats-hub.pages.dev/api/v1/teams.json');
const { data } = await res.json();

const names = Object.fromEntries(data.map((t) => [t.abbrev, t.name]));
console.log(names.ATL); // "Atlanta Soul"
Python
# Team colors, for charting
import json, urllib.request

URL = "https://pul-stats-hub.pages.dev/api/v1/teams.json"
with urllib.request.urlopen(URL) as response:
    teams = json.load(response)["data"]

for team in teams:
    print(team["abbrev"], team["colors"]["primary"])

Worth knowing

  • Includes teams that no longer compete — this is all of league history, not the current season. Use a season's standings endpoint for who played that year.
  • Source data sometimes spells abbreviations differently across seasons (INDY/IND, MINN/MIN). Everything the API returns is already normalized to the canonical form listed here.

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