EmbedSportex API › Streams
GET
/api/streams
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
Access-Control-Allow-Origin: *
Recommended Poll
Every 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.

GET https://api.embedsportex.site/api/streams
No query parameters are required. You may append ?cache=TIMESTAMP to 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 every 30 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 on endTime).

GET /api/streams
Query Parameters
ParameterTypeDescription
cache integer Optional. 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
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.
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
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.
Timezone note: All kickoff and endTime values are in WIB (UTC+7). Parse with: new Date(kickoff.replace(' ', 'T') + '+07:00')
Iframe / Server Object

Each match has an iframes array with one entry per available stream server. Use the url to embed directly into an <iframe> element.

FieldTypeDescription
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#...
Common Server Labels
AUTOAUTO/iOS SD/iOSSD1/iOSSD2/iOS HD/iOSHD1/iOSHD2/iOS FHD/iOSVIP/iOS SkyF1/iOSTNTBein SPOTVZiggoF1TV C1C1+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#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":      []
}
Code Examples

Fetch all matches and render football with iframe embed:

JavaScript (fetch)
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
Python (requests)
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
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.

GET Live 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 use Fetch directly from browser-side JS on any site. CORS is fully open.
Allowed — Server-side with caching Backend usage is allowed with sensible caching to avoid aggressive polling.
Not allowed — Bypassing ads Modifying embed behavior, sandboxing iframes, or bypassing ad/integration rules.
Not allowed — Aggressive polling Do 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 like iframes[0] gracefully.
Contact

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

Visit embedsportex.site or embedsportex.pages.dev to get in touch. API access is free for standard use per the policy above.
Copied!