The EmbedSportex API provides a public JSON endpoint exposing live and upcoming sports match data — organized by sport category — with embeddable iframe URLs for each available stream server. It's designed for frontend integration: fetch once, render a match schedule, embed player iframes directly.
All endpoints are accessible via the primary domain. The API is deployed on Cloudflare Pages for global low-latency delivery.
?cache=TIMESTAMP to bust browser/CDN caches during polling (e.g. ?cache=1776943275).This endpoint is publicly accessible — no API key or authentication token is required. CORS is open (Access-Control-Allow-Origin: *), so you can call it directly from browser-side JavaScript.
There is no hard rate limit enforced. However, please follow these guidelines to avoid being throttled or blocked:
Returns all available sport categories with their match list and stream server options. Data is filtered to show only currently live or upcoming matches (matches that haven't ended yet based on endTime).
| Parameter | Type | Description |
|---|---|---|
| cache | integer | Optional. Unix timestamp to bust cache. e.g. ?cache=1776943275 |
The top-level JSON object contains metadata fields and one key per sport category.
| Field | Type | Description |
|---|---|---|
| successalways | boolean | Indicates whether the request was processed successfully. |
| timestamp | integer | Unix timestamp of when the response was generated. |
| READ_ME | string | Informational note for API users. |
| football | array<Match> | Football / soccer matches. |
| basketball | array<Match> | Basketball matches (NBA, etc.). |
| amfootball | array<Match> | American football matches (NFL, etc.). |
| baseball | array<Match> | Baseball matches (MLB, etc.). |
| badminton | array<Match> | Badminton events (BWF tours, etc.). |
| volleyball | array<Match> | Volleyball matches. |
| tennis | array<Match> | Tennis tournaments. |
| race | array<Match> | Motorsport events (F1, MotoGP, WRC, Formula E). |
| fight | array<Match> | Combat sports / wrestling events. |
| other | array<Match> | Miscellaneous sports not in the above categories. |
[] — the key is always present in the response.Each sport key maps to an array of Match objects. Iterate all keys or pick specific ones.
Each item inside a sport category array is a Match object.
| Field | Type | Description |
|---|---|---|
| slugkey | string | URL-friendly unique identifier for the match. e.g. "malut-surabaya" |
| tag | string | Human-readable match title / event name. e.g. "Malut United vs Persebaya Surabaya" |
| kickoff | string | Match start time in WIB (UTC+7) using format YYYY-MM-DD HH:mm.Always add +07:00 offset when parsing to a Date object. |
| endTime | string | Estimated match end time, same format and timezone as kickoff.Used to determine live/ended status. May cross midnight (check date carefully). |
| league | string | Competition or league name. e.g. "BRI Super League", "NBA", "Formula 1" |
| iframes | array<Iframe> | One or more stream server objects for this match. See Iframe Object below. Always check length ≥ 1 before accessing index 0. |
kickoff and endTime values are in WIB (UTC+7). Parse with: new Date(kickoff.replace(' ', 'T') + '+07:00')Each match has an iframes array with one entry per available stream server. Use the url to embed directly into an <iframe> element.
| Field | Type | Description |
|---|---|---|
| server | string | Display label for the server / quality.
Common patterns:
SD/iOS, HD/iOS, FHD/iOS, AUTO, VIP |
| url | string | Full embeddable URL. Set as the src of an <iframe> element to stream.
URLs point to
https://api.embedsportex.site/player#... |
Abbreviated real response from the API showing one football match and one basketball match.
// GET https://api.embedsportex.site/api/streams { "success": true, "timestamp": 1776943275, "READ_ME": "Interested in using our API? Contact us for more information.", "football": [ { "slug": "malut-surabaya", "tag": "Malut United vs Persebaya Surabaya", "kickoff": "2026-04-23 19:00", // WIB (UTC+7) "endTime": "2026-04-23 21:15", // WIB (UTC+7) "league": "BRI Super League", "iframes": [ { "server": "AUTO/iOS", "url": "https://api.embedsportex.site/player#xo/liga3" }, { "server": "VN1/iOS", "url": "https://api.embedsportex.site/player#tc/liga3" }, { "server": "VIP/iOS", "url": "https://api.embedsportex.site/player#v2/liga3" } ] } ], "basketball": [ { "slug": "knicks-hawks", "tag": "New York Knicks vs Atlanta Hawks", "kickoff": "2026-04-24 06:00", "endTime": "2026-04-24 09:00", "league": "NBA", "iframes": [ { "server": "SD1/iOS", "url": "https://api.embedsportex.site/player#sce/ch65" }, { "server": "FHD/iOS", "url": "https://api.embedsportex.site/player#ppv/nba1" } ] } ], "amfootball": [ /* ... */ ], "baseball": [ /* ... */ ], "badminton": [ /* ... */ ], "volleyball": [ /* ... */ ], "tennis": [ /* ... */ ], "race": [ /* ... */ ], "fight": [ /* ... */ ], "other": [] }
Fetch all matches and render football with iframe embed:
const API = 'https://api.embedsportex.site/api/streams'; async function loadMatches() { const res = await fetch(`${API}?cache=${Date.now()}`); const data = await res.json(); // Parse timestamp, determine live/upcoming function getStatus(kickoff, endTime) { const now = Date.now(); const start = new Date(kickoff.replace(' ', 'T') + '+07:00').getTime(); const end = new Date(endTime.replace(' ', 'T') + '+07:00').getTime(); if (now < start) return 'upcoming'; if (now <= end) return 'live'; return 'ended'; } // Render football matches data.football.forEach(match => { const status = getStatus(match.kickoff, match.endTime); const firstUrl = match.iframes[0]?.url; console.log(`[${status.toUpperCase()}] ${match.tag} — ${match.league}`); // Embed first server as iframe if (firstUrl) { const iframe = document.createElement('iframe'); iframe.src = firstUrl; iframe.width = '100%'; iframe.height = '400'; iframe.allowFullscreen = true; document.body.appendChild(iframe); } }); } loadMatches(); setInterval(loadMatches, 30000); // poll every 30s
import requests from datetime import datetime, timezone, timedelta API = "https://api.embedsportex.site/api/streams" WIB = timezone(timedelta(hours=7)) res = requests.get(API, timeout=10) data = res.json() for sport, matches in data.items(): if not isinstance(matches, list) or not matches: continue print(f"\n=== {sport.upper()} ===") for m in matches: kickoff = datetime.fromisoformat(m['kickoff']).replace(tzinfo=WIB) servers = [s['server'] for s in m['iframes']] print(f" {m['tag']} [{m['league']}]") print(f" Kickoff : {kickoff.strftime('%d %b %Y %H:%M')} WIB") print(f" Servers : {', '.join(servers)}") print(f" URL : {m['iframes'][0]['url']}")
curl -s "https://api.embedsportex.site/api/streams" \ -H "Accept: application/json" | python3 -m json.tool
Send a live request to the API and see the raw JSON response.
Please follow these rules to ensure reliable access for all users.
iframes[0] gracefully.Interested in using this API commercially, integrating into a larger product, or need extended access? Reach out via the EmbedSportex website.