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=1The 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,competitionTwo 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=broadcastsClient 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
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.