Developer API
Free, no key required. Fixtures, live scores and a ready-to-use embed URL for every match.
Match metadata and an embed_url
per event. Playback happens inside our player, so you never handle streams, tokens or geo issues —
drop in an iframe and it works. Direct stream URLs are not part of the public API.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/schedule |
Fixtures. ?date=YYYY-MM-DD, ?watchable=1 for
matches with a channel, ?live=1 for in-play only. |
| GET | /api/v1/events/{id} | One fixture + its channels + embed url. |
| GET | /api/v1/live | Everything in play, with the current minute. |
| GET | /api/v1/channels | Channels we index. |
Example
curl "https://matchora.to/api/v1/schedule?watchable=1"
{
"events": [{
"id": "2511759",
"home": "St Pauli", "away": "Kaiserslautern",
"league": "German 2. Bundesliga",
"kickoff": 1788104000, "status": "1H", "minute": "22", "score": "0-0", "live": true,
"channel_count": 7,
"embed_url": "https://matchora.to/embed/match/2511759"
}]
}
Embedding
Works on any domain. No key, no registration.
<iframe src="https://matchora.to/embed/match/{event_id}"
width="100%" height="480" frameborder="0"
allowfullscreen allow="autoplay; fullscreen"></iframe>
Also available per channel: /embed/channel/{channel_id}.
Add ?ch={channel_id} to a match embed to preselect a broadcaster.
Embedding with a backup domain
Some countries' internet providers block our domains (Italy, Spain and the UAE do). This code loads the player from the first of matchora.to, matchora.pro, es.matchora.pro that answers your visitor, so those visitors still get the match. Use it instead of the plain iframe.
<div data-matchora="/embed/match/{event_id}"></div>
<script>
(function(s){
var hosts=["https://matchora.to","https://matchora.pro","https://es.matchora.pro"], box=s.previousElementSibling, ok=[], done=false, n=hosts.length-1;
function show(h){ if(done)return; done=true; var f=document.createElement("iframe"); f.src=h+box.getAttribute("data-matchora");
f.width="100%"; f.height="480"; f.setAttribute("frameborder","0");
f.allowFullscreen=true; f.allow="autoplay; fullscreen"; box.appendChild(f); }
function pick(){ for(var i=0;i<n;i++){ if(ok[i])return show(hosts[i]); if(ok[i]!==false)return; } show(hosts[n]); }
function set(i,v){ if(ok[i]===undefined){ ok[i]=v; pick(); } }
if(!n)return show(hosts[0]);
hosts.slice(0,n).forEach(function(h,i){
var t=setTimeout(function(){ set(i,false); },4000);
fetch(h+"/front-health",{mode:"no-cors",cache:"no-store"}).then(function(){ clearTimeout(t); set(i,true); },
function(){ clearTimeout(t); set(i,false); });
});
})(document.currentScript);
</script>
Fair use
Rate limited per IP. The embed carries our advertising, which is what keeps the API free — please don't strip or overlay it.