matchora Install Discord

Developer API

Free, no key required. Fixtures, live scores and a ready-to-use embed URL for every match.

What you get

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

MethodPathDescription
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/liveEverything in play, with the current minute.
GET/api/v1/channelsChannels 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.