Developer portal

Public JSON feeds, one schema

API keys, consistent envelopes, and rate limits that match the plan. Poll standings, schedule, and box scores without scraping a scoreboard.

Authentication

Create a key in the league office under API Feeds. Send it on every request. Never put keys in query strings.

Authorization: Bearer usf_live_…
X-Api-Key: usf_live_…

Rate limits

  • ▸ Free — 60 req/min, 5,000 / month
  • ▸ Starter — 120 / min, 50,000 / month
  • ▸ League — 300 / min, 250,000 / month
  • ▸ Pro — 600 / min, 1,000,000 / month
  • ▸ 429 includes Retry-After and X-RateLimit-* headers

Endpoints

Canonical prefix /api/v1/feeds. Aliases: /api/v1/leagues/{id}/standings, /teams, /schedule, /api/v1/games/{id}/boxscore.

GET /api/v1/feeds/leagues/{league_id}

League profile, sport, current season, team and game counts.

GET /api/v1/feeds/leagues/{league_id}/teams

Every team: id, name, abbreviation.

GET /api/v1/feeds/leagues/{league_id}/standings

Table as of the last final. Rank, W-L-T, points for/against.

GET /api/v1/feeds/leagues/{league_id}/schedule

Games with scores, venue, and status. Filter with ?status=live&from=&to=.

GET /api/v1/feeds/games/{game_id}/boxscore

One game: score, period, clock, linescore, sport stats.

curl

curl https://sports-feed.totalaisports.com/api/v1/feeds/leagues/{league_id}/standings \
  -H "Authorization: Bearer usf_live_…" \
  -H "Accept: application/json"

Envelope

Every feed returns object, league, data, and meta.generated_at.

Example: standings

{
  "object": "list",
  "league": {
    "id": "efaeba7b-2103-44ba-bc53-83cf79fa2c36",
    "name": "Saskatoon Tuesday Softball",
    "sport": "softball",
    "sport_name": "Fastpitch Softball",
    "timezone": "America/Chicago"
  },
  "data": [
    {
      "rank": 1,
      "team": { "id": "…", "name": "Saskatoon Storm", "abbrev": "SS" },
      "played": 1,
      "wins": 1,
      "losses": 0,
      "ties": 0,
      "points": 2,
      "points_for": 8,
      "points_against": 3,
      "point_diff": 5
    }
  ],
  "meta": { "generated_at": "2026-08-23T20:00:00+00:00", "resource": "standings" }
}

Errors

  • 401 — missing or revoked key
  • 403 — key does not cover that league
  • 404 — league or game not found
  • 429 — honor Retry-After

Usage

Hits are counted per league and per endpoint. League owners see the last 30 days on the API Feeds page.