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
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 }>;
}| Field | Type | Description |
|---|---|---|
id | string | Opaque StreamCenter match ID. |
title | string | Authoritative stored event title. |
category | string | Sport ID used in match routes. |
date | number | Unix epoch milliseconds. |
poster | string? | Extensionless local poster path when artwork is cached. |
popular | boolean | Whether the event is marked popular. |
teams | object? | Team-game home/away entries only; omitted for non-team events. |
sources | array | Advertised 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
curl --fail-with-body --silent --show-error \
"https://streamcenter.st/api/matches/live"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
[
{
"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.