MCSports Sports Data API
Real-time live matches, HLS stream URLs, news, and highlights — JSON over HTTPS. Free, public, and unlimited. Upgrade to Premium for custom endpoints built for your app.
Free
- One shared public key — baked into the client below
- Unlimited requests, CORS open, works from any site
- All endpoints: matches, streams, news, highlights
- Same JSON shape as Premium
curl -H "x-api-key: mcs_public_34757c97d2f5420905996dd57065a57f36d03e7b" \
https://mcsports.live/api/public/v1/feedPremium
- Everything in Free, plus:
- Custom API endpoints — tailored to your app
- Priority Telegram support
- Lifetime key — one-time payment
Need a custom API?
Premium customers can request custom endpoints — filtered leagues, custom response shapes, extra fields, league-specific feeds, webhooks, and more. Tell us what your app needs and we'll build it.
See premium plans →Authentication
Every request to /api/public/v1/* requires an API key. Free users share one public key (baked into the downloadable client below). Premium customers get their own key. Pass it in any one of these ways:
- HTTP header (recommended):
x-api-key: YOUR_KEY - Authorization header:
Authorization: Bearer YOUR_KEY - Query string:
?api_key=YOUR_KEY
Missing or invalid keys return 401 Unauthorized. Check the tier field in the response to confirm Free vs Premium.
JavaScript / fetch
// Free (shared public key)
const res = await fetch(
"https://mcsports.live/api/public/v1/feed",
{ headers: { "x-api-key": "mcs_public_34757c97d2f5420905996dd57065a57f36d03e7b" } }
).then(r => r.json());
console.log(res.tier); // "free"curl
# Free curl -H "x-api-key: mcs_public_34757c97d2f5420905996dd57065a57f36d03e7b" \ https://mcsports.live/api/public/v1/feed # Premium (your own key) curl -H "x-api-key: YOUR_KEY" \ https://mcsports.live/api/public/v1/feed
Endpoints
All endpoints return JSON, include tier and updatedAt, and ship with permissive CORS headers.
/api/public/v1/feedEverything in one shot: live + upcoming matches, latest news, and highlights.
Response fields
| Field | Type | Description |
|---|---|---|
tier | "free" | "premium" | Which tier served this response. |
updatedAt | string (ISO date) | Server time of the snapshot. |
counts.matches | number | Total matches returned. |
counts.live | number | Currently live matches. |
counts.upcoming | number | Scheduled / upcoming matches. |
counts.news | number | Number of news items. |
counts.highlights | number | Number of highlight clips. |
matches[] | Match[] | See /matches for the Match shape. |
news[] | News[] | See /news for the News shape. |
highlights[] | Highlight[] | See /highlights for the Highlight shape. |
GET /api/public/v1/feed/api/public/v1/matchesAll live + upcoming matches with HLS stream URLs.
Query parameters
| Name | Type | Description |
|---|---|---|
status | LIVE | UPCOMING | Filter by match status. |
sport | string | Filter by sport (e.g. Soccer, Basketball). |
streams | boolean | Set to false to omit stream URLs. Default true. |
Response fields
| Field | Type | Description |
|---|---|---|
matches[].id | string | Stable match id (use with /matches/:id). |
matches[].league | string | League / competition name. |
matches[].sport | string | Sport name. |
matches[].status | LIVE | UPCOMING | FINISHED | Match state. |
matches[].time | string | Clock or kickoff label. |
matches[].home | { name, logo, score } | Home team. |
matches[].away | { name, logo, score } | Away team. |
matches[].stream | string | null | Primary HLS .m3u8 URL (proxied, CORS-enabled). |
matches[].streams | string[] | All known HLS sources for this match. |
GET /api/public/v1/matches?status=LIVE/api/public/v1/matches/:idSingle match detail by id.
Query parameters
| Name | Type | Description |
|---|---|---|
:idrequired | string | Match id from /matches. |
Response fields
| Field | Type | Description |
|---|---|---|
match | Match | Same shape as items in /matches. |
GET /api/public/v1/matches/:id/api/public/v1/newsLatest sports news headlines.
Response fields
| Field | Type | Description |
|---|---|---|
news[].id | string | Unique news item id. |
news[].title | string | Headline. |
news[].summary | string | Short article summary. |
news[].image | string (URL) | Cover image. |
news[].source | string | Publisher name. |
news[].date | string (ISO date) | Published date. |
news[].url | string (URL) | Original article URL. |
GET /api/public/v1/news/api/public/v1/highlightsRecent video highlights with thumbnail and duration.
Response fields
| Field | Type | Description |
|---|---|---|
highlights[].id | string | Unique highlight id. |
highlights[].title | string | Clip title. |
highlights[].thumbnail | string (URL) | Preview image. |
highlights[].videoUrl | string (URL) | Playable video URL. |
highlights[].duration | string | Duration label (e.g. '2:14'). |
highlights[].league | string | League / competition name. |
GET /api/public/v1/highlightsCaching & rate limits
Responses are served fresh on every request. There are no hard rate limits — polling once every 10–30s is plenty for live data.
Why Premium?
Premium unlocks custom endpoints built for your app and priority support — one-time payment, lifetime key. See plans on the upgrade page.