Moving from v2 to v3
The response shape is unchanged. v3 keeps the v2 JSON contract on purpose, so an existing integration does not need rewriting — in most cases only the base URL changes.
The one change most callers need
- https://api.sportsrc.org/v2/
+ https://api.sportsrc.org/v3/ Field names, nesting and the status vocabulary are identical. Your parser, your types and your UI keep working.
Removed in v3
Four v2 endpoints are gone. Three of them have no replacement, and it is better to say so than to leave you discovering it in production.
channels Removed Channel listing for a match.
Instead: Use detail. Its sources array carries a finished embedUrl per source, so there is nothing left to assemble.
shotmap Removed Shot coordinates and expected goals.
Instead: No replacement. The upstream provider behind v3 does not expose shot-level coordinates.
graph Removed Momentum graph points over the match.
Instead: No replacement, for the same reason.
highlights Removed Video highlight clips.
Instead: No replacement. has_highlights still travels with each match, so a UI built on it keeps working and simply never turns the flag on.
Why: v3 runs on a different upstream provider, and shot coordinates, momentum points and highlight clips are not part of what it publishes. Pretending otherwise with empty arrays would be worse than removing them.
Added in v3
team_stats New Season-long form and statistics for both teams: fixtures won, goals, clean sheets, penalties, cards and preferred line-ups.
New fields on existing responses
All additive. Nothing was renamed or removed, so ignoring them is safe.
| Field | On | What it tells you |
|---|---|---|
| has_stream | match | Whether a playable source exists. Per match, and it changes around kick-off. |
| has_stats | match | Whether line-ups, statistics and incidents exist for this match. |
| has_standings | league | Whether the competition has a table at all. |
| has_odds | league | Whether odds are offered for the competition. |
| timer | match | Display clock while in play, e.g. 67’. |
| period_start | match | Unix time the current period began, for a clock you run yourself. |
| agg_score | match | Aggregate score over two legs, where it applies. |
The four has_* flags are the ones worth
adopting first — they let you decide which tabs to render before you
spend a request finding out.
How to use them.
Also worth checking
- matches vs scores.
matcheslists only fixtures that have a stream. For the full daily fixture list usescores. The difference in detail. - Plan tiers moved. These endpoints are premium only in v3: scores, lineups, stats, incidents, h2h, standing, odds, votes, team_stats, last_matches. If you were on a free v2 key using them, check your plan before switching.
- Match ids are signed and opaque. Pass through exactly what you receive. Do not parse, re-encode or construct them — a tampered id is rejected.
- Status is a fixed vocabulary.
Switch on these exact strings:
notstarted,inprogress,finished,canceled. - Rate limits are per key
and reset at 00:00 UTC. Every response carries
X-RateLimit-Remaining, so you can log it rather than guess.
A migration you can do in an afternoon
- 1. Point your base URL at
https://api.sportsrc.org/v3/in a staging build. - 2. Grep your code for
channels,shotmap,graphandhighlights. Those are the only calls that will fail. - 3. Swap
channelsfordetailand readsources[].embedUrl; remove or hide the other three features. - 4. Run both versions side by side for a day and diff the output for the same fixtures.
- 5. Adopt the
has_*flags once you are live. Optional, but it removes the empty tabs.
Open the v3 reference Ask on Telegram
v2 stays online. Existing keys keep working, so nothing forces you to move on a deadline.