SportLensSign in →

TV Broadcasts API

Which TV station shows which match, per country — Romania first. Broadcast rows ride on fixtures through the standard include= system, each with the channel and country names embedded, a confidence score, and the provenance of the TV-guide sources that back it. See the general API reference for the envelope, pagination, and every other resource — and the TV Listings guide for the RAW guide layer: every staged listing (any sport), including programs with no fixture to link to yet.

Authentication

Every request carries your API key as a Bearer token

Create a key on the API Tokens page (shown once — we store only its hash). Keys are metered and rate-limited per your plan.

curl -H "Authorization: Bearer sl_live_YOUR_KEY" \
  "https://www.sportlensapi.com/v3/football/fixtures?per_page=1"

All future matches with their TV stations

The one query an EPG-style consumer needs

status=scheduled + date_from=today selects everything upcoming; include=broadcasts attaches the TV stations to each fixture. has_broadcast_country=RO keeps only fixtures that already have a published broadcast in that country (ISO alpha-2), so you page through what matters instead of the global fixture list. Add competition_id or team_id to narrow, and date_to to bound the window. Results are paginated (per_page up to 100; walk page until meta.total is covered).

GET /v3/football/fixtures
    ?status=scheduled
    &date_from=2026-07-05        # today -> everything in the future
    &order=asc                   # soonest kickoff first
    &has_broadcast_country=RO    # ONLY fixtures with a Romanian broadcast
    &include=broadcasts,home_team,away_team,competition
    &per_page=50&page=1

The response (abridged — every value in the envelope carries confidence + provenance):

{
  "data": [
    {
      "id": "0197…",
      "kickoff_at": "2026-07-05T20:00:00.000Z",
      "status": "scheduled",
      "home_team": { "name": "Brazil" },
      "away_team": { "name": "Norway" },
      "competition": { "name": "FIFA World Cup" },
      "broadcasts": [
        {
          "tv_channel_id": "0197…",
          "tv_channel_name": "Antena 1",
          "country_id": "0197…",
          "country_name": "Romania",
          "is_streaming": false,
          "is_official_source": true,
          "source_count": 1,
          "confidence": 700,
          "provenance": {
            "decided_by": "single_source",
            "sources": ["antena1"],
            "is_derived": false,
            "reconciled_at": "2026-07-06T09:12:44.000Z"
          }
        }
      ]
    }
  ],
  "meta": { "page": 1, "per_page": 50, "total": 128, "includes": ["broadcasts", "…"] }
}

Incremental sync

Poll deltas, not the whole window

Broadcast schedules publish ~6–8 days ahead and firm up as kickoff approaches, so a consumer re-polls. updated_since (ISO 8601) returns only fixtures whose row — or any of whose broadcasts— changed at/after that instant: a newly confirmed broadcaster surfaces its fixture even when the fixture itself didn't change. Store the time you started each successful sync and pass it on the next one; combined with has_broadcast_country a cron cycle is typically a single small page.

GET /v3/football/fixtures
    ?status=scheduled
    &has_broadcast_country=RO
    &updated_since=2026-07-05T12:00:00Z   # your last successful sync
    &include=broadcasts,home_team,away_team,competition

Two honest caveats. The delta may over-include: re-verifying an unchanged broadcast re-publishes it, so a fixture can reappear with identical data (treat your sync as an upsert and this costs nothing). And it will not surface a full retraction — a fixture whose broadcasts were all withdrawn with none re-confirmed keeps its last state on your side. If you display countdown-critical data, also refresh fixtures inside ~24h of kickoff with a plain windowed query.

Reading a broadcast row

Field reference

tv_channel_name / country_name— display-ready names (“Antena 1”, “Romania”); the ids are stable canonical references. source_count — how many independent official broadcaster sites agree on this broadcast; confidence (0–1000) starts at the official-source tier (a single official site ≈ 700) and rises when a second independent site corroborates the same channel claim. provenance.sources — which sites backed it (official broadcaster pages only: antena1, antena3, digisport, primaplay, protv). is_official_source — true when at least one backing source is an official rights-holder page rather than only third-party fallbacks; for venue-critical display (a bar tuning the right channel) prefer rows where it is true or source_count >= 2. is_streaming — an OTT service rather than a linear channel. Filter on country_name === "Romania" when other countries come online (or just query with has_broadcast_country=RO).

Honesty rules worth knowing: a broadcast only exists when a real TV-guide page listed the match AND it resolved to exactly one fixture (or a human approved the link) — nothing is guessed. Reruns and replays are never published as broadcasts. A match with no broadcast rows simply has no verified Romanian airing yet; schedules publish ~6–8 days ahead, so the window fills as the import re-runs.

Single fixture

The same include on one resource

GET /v3/football/fixtures/{id}?include=broadcasts

Client example

Copy-paste starting point for your app

// Node / browser example: today's and future matches with their Romanian TV stations
const res = await fetch(
  "https://www.sportlensapi.com/v3/football/fixtures" +
    "?status=scheduled&order=asc&date_from=" + new Date().toISOString().slice(0, 10) +
    "&include=broadcasts,home_team,away_team,competition&per_page=50",
  { headers: { Authorization: "Bearer " + process.env.SPORTLENS_API_KEY } },
);
const { data } = await res.json();

for (const fixture of data) {
  const romanianTv = (fixture.broadcasts ?? [])
    .filter((b) => b.country_name === "Romania" && b.tv_channel_name)
    .map((b) => b.tv_channel_name);
  if (romanianTv.length > 0) {
    console.log(
      `${fixture.home_team.name} vs ${fixture.away_team.name}`,
      "on", romanianTv.join(", "),
      "at", fixture.kickoff_at,
    );
  }
}

Romanian channels covered

The stations the import currently tracks — read live from the import itself

Antena 1Antena 3 CNNDigi Sport 1Digi Sport 2Digi Sport 3Digi Sport 4Eurosport (HBO Max)Eurosport 1Eurosport 2Prima Sport 1Prima Sport 2Prima Sport 3Prima Sport 4Prima Sport 5Prima TVPro ArenaPro TVTVR 1TVR 2TVR Sport

Every station comes from an official broadcaster site, verified one scraper at a time; more join as their scrapers are verified. Sport coverage today: football broadcasts link to fixtures end to end. Listings for other sports (tennis, rugby, motorsport…) are already captured with their day and hour — browse them raw, fixture or not, on the TV Listings endpoint — and will attach to fixtures automatically as those sports gain them.