Developer resources

StreamCenter API

Matches API

Read the bounded, authoritative public match catalog. A match describes discovery metadata only; embed URLs are available exclusively through its advertised stream groups.

Base URL: https://streamcenter.st

“Match” is the stable v1 resource name for any watchable event, including team games, head-to-head contests, fight cards, race sessions, tournaments, and multi-competitor events. Non-team events omit teams; clients must not assume home and away sides.

Match structure

TypeScript
interface APIMatchTeam {
  name: string;
  badge: string;
}

interface APIMatch {
  id: string;
  title: string;
  category: string;
  date: number;
  poster?: string;
  popular: boolean;
  teams?: {
    home?: APIMatchTeam;
    away?: APIMatchTeam;
  };
  sources: Array<{ source: string; id: string }>;
}
Public match fields
FieldTypeDescription
idstringOpaque StreamCenter match ID.
titlestringAuthoritative stored event title.
categorystringSport ID used in match routes.
datenumberUnix epoch milliseconds.
posterstring?Extensionless local poster path when artwork is cached.
popularbooleanWhether the event is marked popular.
teamsobject?Team-game home/away entries only; omitted for non-team events.
sourcesarrayAdvertised provider groups. IDs are match/group IDs, not stream-row IDs.

Endpoints

GET /api/matches/{sport}

Filter the canonical catalog by a sport ID from the Sports API.

GET /api/matches/all

Return the canonical all-sports catalog, bounded to 200 matches.

GET /api/matches/all-today

Return matches starting from 00:00 UTC inclusive through the next 00:00 UTC exclusive.

GET /api/matches/live

Return matches whose authoritative status is currently live.

GET /api/matches/{selector}/popular

Append /popular to any selector above. Popular filtering happens after the base selection and preserves order.

Fetch live matches

Shell
curl --fail-with-body --silent --show-error \
  "https://streamcenter.st/api/matches/live"
JavaScript
const response = await fetch("https://streamcenter.st/api/matches/live");
if (!response.ok) {
  throw new Error(`Matches request failed: ${response.status}`);
}

const matches = await response.json();
for (const match of matches) {
  console.log(match.title, new Date(match.date).toLocaleString());
  if (match.teams?.home) console.log("Home:", match.teams.home.name);
  if (match.teams?.away) console.log("Away:", match.teams.away.name);
  console.log("Sources:", match.sources.map((group) => group.source));
}

Example response

JSON
[
  {
    "id": "match-123",
    "title": "North City vs. South United",
    "category": "football",
    "date": 1784822400000,
    "poster": "/api/images/poster/4f5f2f7d",
    "popular": true,
    "teams": {
      "home": {
        "name": "North City",
        "badge": "home-badge-id"
      },
      "away": {
        "name": "South United",
        "badge": "away-badge-id"
      }
    },
    "sources": [
      {
        "source": "example-source",
        "id": "match-123"
      }
    ]
  }
]

Continue with the Streams API guide to resolve a returned source group.