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.
Your API key
Leave empty to test with the shared free key. Paste a Premium key to run every “Try it” below as Premium.
Stored only in this browser.
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/everythingFULL FETCH — one request returns every match (live, upcoming, ended) with HLS streams, live TV channels, news, highlights and your IPTV playlist URL.
Query parameters
| Name | Type | Description |
|---|---|---|
channels | boolean | Set to false to omit the TV channel list. |
streams | boolean | Set to false to omit match stream URLs. |
limitChannels | number | Cap the channel list. Free keys are capped at 200; Premium gets all. |
Response fields
| Field | Type | Description |
|---|---|---|
plan | "free" | "premium" | Plan of the key that made the call. |
counts | object | Totals for matches, live, upcoming, ended, channels, news, highlights. |
matches[] | Match[] | Same shape as /matches. |
channels[] | { id, name, logo, country, resolve } | Live TV channels. Call `resolve` with your key for a playable HLS URL. |
news[] | News[] | Latest sports news. |
highlights[] | Highlight[] | Recent highlight clips. |
iptv.playlist | string (URL) | M3U playlist URL for VLC / TiviMate / Smarters. |
GET /api/public/v1/everything/api/public/v1/channelsAll live TV channels with logos and categories.
Query parameters
| Name | Type | Description |
|---|---|---|
limit | number | Max channels to return. |
q | string | Search channels by name. |
Response fields
| Field | Type | Description |
|---|---|---|
channels[].id | number | Channel id (use with /channels/:id). |
channels[].name | string | Channel name. |
channels[].logo | string (URL) | Channel logo. |
GET /api/public/v1/channels?limit=10/api/public/v1/channels/:cidResolve a channel into a playable, proxied HLS URL (short-lived).
Query parameters
| Name | Type | Description |
|---|---|---|
:cidrequired | number | Channel id from /channels. |
delay | number | Seconds behind live (0-300, default 60). |
Response fields
| Field | Type | Description |
|---|---|---|
stream | string (URL) | Same-origin HLS .m3u8 playlist. |
expiresIn | number | Seconds until the URL expires. |
GET /api/public/v1/channels/:cid/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.