Bookmark Mirrors @ STRMFREE.LINK | Join Our Discord | VIP (IPTV) now only $4.49 FIND OUT MORE
Don't lose us
Bookmark strmfree.link so you can always find us if this domain goes down.

StreamFree API

No account or API key needed.

Embedding a stream

Every stream can be dropped straight into an iframe pointed at /embed/{category}/{stream_key}, like this:

<iframe
    src="https://streamfree.top/embed/soccer/ghana-vs-england"
    width="100%"
    height="480"
    allow="fullscreen; picture-in-picture"
    allowfullscreen
    frameborder="0">
</iframe>

Don't try to sandbox it.

Finding what's live

If you don't want to hardcode stream keys, GET /api/v1/streams returns everything that's currently up. Each one carries a sources list that always includes the FHD (1080p) and SD (540p) embeds (they start playing on their own once the stream goes live) plus any other live variant. Every entry is an object with a quality label (SD, HD, FHD or 4K), the embed url, and live, which is true when that source is live. Add ?category=soccer to filter it down to one category:

fetch("https://streamfree.top/api/v1/streams?category=soccer")
    .then(r => r.json())
    .then(data => {
        data.streams.forEach(stream => {
            console.log(stream.name, stream.sources);
        });
    });
{
  "count": 1,
  "streams": [
    {
      "name": "Ghana vs England",
      "category": "soccer",
      "league": "FIFA World Cup",
      "stream_key": "ghana-vs-england",
      "match_timestamp": 1782244800,
      "sources": [
        { "quality": "FHD", "url": "https://strmfree.st/embed/soccer/ghana-vs-england1080p", "live": true },
        { "quality": "SD", "url": "https://strmfree.st/embed/soccer/ghana-vs-england540p", "live": false }
      ],
      "thumbnail_url": "https://streamfree.top/thumbnails/soccer_ghana-vs-england"
    }
  ]
}

Already know the key you're looking for? GET /api/v1/streams/{stream_key} does the same thing for a single stream, and returns a 404 if it's not live:

fetch("https://streamfree.top/api/v1/streams/ghana-vs-england")
    .then(r => r.json())
    .then(stream => console.log(stream.sources));
{
  "name": "Ghana vs England",
  "category": "soccer",
  "league": "FIFA World Cup",
  "stream_key": "ghana-vs-england",
  "match_timestamp": 1782244800,
  "sources": [
    { "quality": "FHD", "url": "https://strmfree.st/embed/soccer/ghana-vs-england1080p", "live": true },
    { "quality": "SD", "url": "https://strmfree.st/embed/soccer/ghana-vs-england540p", "live": false }
  ],
  "thumbnail_url": "https://streamfree.top/thumbnails/soccer_ghana-vs-england"
}

Just need the playable variants and nothing else? GET /api/v1/sources/{stream_key} returns only the source list — light enough to poll, and exactly what our own player uses to keep its quality and source controls in sync. If no entry has "live": true, nothing is live yet; a 404 means the key isn't a real stream:

fetch("https://streamfree.top/api/v1/sources/ghana-vs-england")
    .then(r => r.json())
    .then(data => console.log(data.sources));
{
  "stream_key": "ghana-vs-england",
  "sources": [
    { "quality": "FHD", "url": "https://strmfree.st/embed/soccer/ghana-vs-england1080p", "live": true },
    { "quality": "SD", "url": "https://strmfree.st/embed/soccer/ghana-vs-england540p", "live": false }
  ]
}

And if you just need the list of category names to filter by, that's GET /api/v1/categories:

fetch("https://streamfree.top/api/v1/categories")
    .then(r => r.json())
    .then(data => console.log(data.categories));
{
  "categories": ["soccer", "basketball", "hockey", "combat", "baseball", "football", "racing", "tennis", "cricket"]
}

A couple of notes

match_timestamp is a unix timestamp. A stream goes up shortly before it and comes back down once the event ends, so a stream that embedded fine yesterday might 404 today. Also please don't poll this on every page load, cache it for a bit on your end, my server will thank you.