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.