EmbedSportex API

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.

Base URL
https://api.embedsportex.site
Protocol
HTTPS only
Format
JSON
Auth Required
None
CORS
Open: *
Recommended Poll
30–60 seconds
Timezone Source
WIB (UTC+7)
Endpoints

All endpoints are accessible via the primary domain. The API is deployed on Cloudflare Pages for global low-latency delivery.

GEThttps://api.embedsportex.site/api/streams
No query parameters are required. You may append?cache=TIMESTAMPto bust browser/CDN caches during polling (e.g.?cache=1776943275).
Authentication

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.

Public API— fetch directly from frontend code. No headers, tokens, or server proxies needed.
Rate Limits

There is no hard rate limit enforced. However, please follow these guidelines to avoid being throttled or blocked:

Poll at most once every30 seconds. Aggressive polling (sub-5s) may trigger Cloudflare WAF rules and result in temporary blocks.

GET /api/streams

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 onendTime).

GET/api/streams
Query Parameters
ParameterTypeDescription
cacheintegerOptional. Unix timestamp to bust cache.
e.g.?cache=1776943275

Root Response Object

The top-level JSON object contains metadata fields and one key per sport category.

FieldTypeDescription
successalwaysbooleanIndicates whether the request was processed successfully.
timestampintegerUnix timestamp of when the response was generated.
READ_MEstringInformational note for API users.
footballarray<Match>Football / soccer matches.
basketballarray<Match>Basketball matches (NBA, etc.).
amfootballarray<Match>American football matches (NFL, etc.).
baseballarray<Match>Baseball matches (MLB, etc.).
badmintonarray<Match>Badminton events (BWF tours, etc.).
volleyballarray<Match>Volleyball matches.
tennisarray<Match>Tennis tournaments.
racearray<Match>Motorsport events (F1, MotoGP, WRC, Formula E).
fightarray<Match>Combat sports / wrestling events.
otherarray<Match>Miscellaneous sports not in the above categories.
Categories with no active or upcoming matches will return an empty array[]— the key is always present in the response.
Sport Category Keys

Each sport key maps to an array of Match objects. Iterate all keys or pick specific ones.

football
Soccer / Football
🏀
basketball
Basketball
🏈
amfootball
American Football
baseball
Baseball
🏸
badminton
Badminton
🏐
volleyball
Volleyball
🎾
tennis
Tennis
🏁
race
Motorsport
🥊
fight
Combat / Wrestling
🎯
other
Other
Match Object

Each item inside a sport category array is a Match object.

FieldTypeDescription
slugkeystringURL-friendly unique identifier for the match.
e.g."malut-surabaya"
tagstringHuman-readable match title / event name.
e.g."Malut United vs Persebaya Surabaya"
kickoffstringMatch start time inWIB (UTC+7)using formatYYYY-MM-DD HH:mm.
Always add+07:00offset when parsing to a Date object.
endTimestringEstimated match end time, same format and timezone askickoff.
Used to determine live/ended status. May cross midnight (check date carefully).
leaguestringCompetition or league name.
e.g."BRI Super League","NBA","Formula 1"
iframesarray<Iframe>One or more stream server objects for this match. See Iframe Object below.
Always check length ≥ 1 before accessing index 0.
Timezone note:AllkickoffandendTimevalues are in WIB (UTC+7). Parse with:new Date(kickoff.replace(' ', 'T') + '+07:00')
Iframe / Server Object

Each match has aniframesarray with one entry per available stream server. Use theurlto embed directly into an<iframe>element.

FieldTypeDescription
serverstringDisplay label for the server / quality.
Common patterns:SD/iOS,HD/iOS,FHD/iOS,AUTO,VIP
urlstringFull embeddable URL. Set as thesrcof an<iframe>element to stream.
URLs point tohttps://api.embedsportex.site/player#...
Common Server Labels
AUTOAUTO/iOSSD/iOSSD1/iOSSD2/iOSHD/iOSHD1/iOSHD2/iOSFHD/iOSVIP/iOSSkyF1/iOSTNTBeinSPOTVZiggoF1TVC1C1+C2

Example Response

Abbreviated real response from the API showing one football match and one basketball match.

JSON
// 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#c2VydmVyMQ=="}, {"server":"VN1/iOS","url":"https://api.embedsportex.site/player#c2VydmVyMg=="}, {"server":"VIP/iOS","url":"https://api.embedsportex.site/player#c2VydmVyMw=="} ] } ],"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#c2VydmVyMQ=="}, {"server":"FHD/iOS","url":"https://api.embedsportex.site/player#c2VydmVyMg=="} ] } ],"amfootball": [/* ... */],"baseball": [/* ... */],"badminton": [/* ... */],"volleyball": [/* ... */],"tennis": [/* ... */],"race": [/* ... */],"fight": [/* ... */],"other": [] }
Code Examples

Fetch all matches and render football with iframe embed:

JavaScript (fetch)
constAPI ='https://api.embedsportex.site/api/streams';async functionloadMatches() {constres =awaitfetch(`${API}?cache=${Date.now()}`);constdata =awaitres.json();// Parse timestamp, determine live/upcomingfunctiongetStatus(kickoff, endTime) {constnow = Date.now();conststart =newDate(kickoff.replace(' ','T') +'+07:00').getTime();constend =newDate(endTime.replace(' ','T') +'+07:00').getTime();if(now < start)return'upcoming';if(now <= end)return'live';return'ended'; }// Render football matchesdata.football.forEach(match =>{conststatus = getStatus(match.kickoff, match.endTime);constfirstUrl = match.iframes[0]?.url; console.log(`[${status.toUpperCase()}] ${match.tag} — ${match.league}`);// Embed first server as iframeif(firstUrl) {constiframe = 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
Python (requests)
importrequestsfromdatetimeimportdatetime, timezone, timedelta API ="https://api.embedsportex.site/api/streams"WIB = timezone(timedelta(hours=7)) res = requests.get(API, timeout=10) data = res.json()forsport, matchesindata.items():if notisinstance(matches, list)or notmatches:continueprint(f"\n=== {sport.upper()} ===")forminmatches: kickoff = datetime.fromisoformat(m['kickoff']).replace(tzinfo=WIB) servers = [s['server']forsinm['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
curl -s "https://api.embedsportex.site/api/streams" \ -H "Accept: application/json" | python3 -m json.tool
Try It Live

Send a live request to the API and see the raw JSON response.

GETLive Request
// Click "Send Request" to fetch live data from the API...

Usage & Limits

Please follow these rules to ensure reliable access for all users.

Allowed — Frontend useFetch directly from browser-side JS on any site. CORS is fully open.
Allowed — Server-side with cachingBackend usage is allowed with sensible caching to avoid aggressive polling.
Not allowed — Bypassing adsModifying embed behavior, sandboxing iframes, or bypassing ad/integration rules.
Not allowed — Aggressive pollingDo not poll more frequently than once every 30 seconds. Violations may be blocked.
Implementation note:Timestamps are in WIB (UTC+7). Handle timezone conversion client-side. Cache responses where possible. Always handle missing optional fields likeiframes[0]gracefully.
Contact

Interested in using this API commercially, integrating into a larger product, or need extended access? Reach out via the EmbedSportex website.

Visitembedsportex.siteorembedsportex.pages.devto get in touch. API access is free for standard use per the policy above.
Copied!