KICKOFFAPI / SWITCH / THESPORTSDB

Switch from TheSportsDB to KickoffAPI

A call-for-call migration map. We lead with TheSportsDB v1 because their v2 is premium-only, and three rows below are marked UNKNOWN — that means we could not find the answer in their documentation, not that the answer is "no".

THEIR CALL → OUR CALL

Endpoints side by side

NeedTheSportsDBKickoffAPI
Fixtures by league + season v1 GET /api/v1/json/{key}/eventsseason.php?id={idLeague}&s={strSeason} (free limit 15 rows)
v2 GET /api/v2/json/schedule/league/{idLeague}/{season} (limit 3000, premium)
GET /api/v2/fixtures?league={lg_… or int}&season={YYYY}
Fixtures by date v1 GET /api/v1/json/{key}/eventsday.php?d=YYYY-MM-DD (free limit 3 rows)
v2 UNKNOWN — no events-by-date path found in the v2 docs or OpenAPI (only TV listings and livescore routes)
GET /api/v2/fixtures?date=YYYY-MM-DD (range: from + to)
Standings v1 GET /api/v1/json/{key}/lookuptable.php?l={idLeague}&s={strSeason} (free limit 5 rows; documented as limited to featured soccer leagues)
v2 UNKNOWN — no standings path in the v2 OpenAPI or docs page
GET /api/v2/standings?league=…&season=… (both required)
Teams v1 GET /api/v1/json/{key}/search_all_teams.php?l={strLeague} · single team lookupteam.php?id={idTeam} (free limit 10)
v2 GET /api/v2/json/list/teams/{idLeague} · lookup/team/{idTeam}
GET /api/v1/teams?league=…&season=… (v1 — v2's /api/v2/teams filters by country only)
Head-to-head UNKNOWN — no head-to-head endpoint documented in either version. (v1 searchevents.php?e=Arsenal_vs_Chelsea searches an event by name, not by two team ids, so it is not an H2H route.) GET /api/v2/headtohead?h2h={tm_1-tm_2} (or team1 + team2)
Authentication v1: key in the URL path — /123/ (free) or /YOUR_API_KEY/
v2: header X-API-KEY, premium-only
header x-api-key

Their column was read from thesportsdb.com's documentation and both OpenAPI files (v1 and v2, fetched 1 October 2026); ours from KickoffAPI's published OpenAPI specs and v2 reference. UNKNOWN means "not found in their documentation", never "none". Product names are trademarks of their respective owners.

THEIR CALL — THESPORTSDB V1, FIXTURES BY LEAGUE + SEASON
curl "https://www.thesportsdb.com/api/v1/json/123/eventsseason.php?id=4328&s=2014-2015"
OUR CALL — KICKOFFAPI V2, FIXTURES BY LEAGUE + SEASON
curl -G "https://api.kickoffapi.com/api/v2/fixtures" \
  -d "league=39&season=2025&limit=25" \
  -H "x-api-key: YOUR_KEY"
READ THIS BEFORE YOU MIGRATE

What is different

SHAPES THAT CHANGE IN YOUR CODE

Envelope, types, auth, paging

Envelope. Their v1 responses wrap rows in { events: [ … ] } (v2 uses { lookup: [ … ] } for the same record). Ours is one envelope everywhere: { data, meta } with the cursor always in the same place.

Types. Their ids and scores are strings — "idEvent": "441613", "intHomeScore": "4" — with the date split across dateEvent and strTime (UTC per the site's own footer). Ours carry numeric scores and a single ISO date field, plus prefixed ids (fx_, lg_, tm_).

Auth. Their v1 key sits in the URL path (/api/v1/json/123/…), so it shows up in logs and referrers; their v2 uses an X-API-KEY header but is premium-only — a v2 call with the free key 123 returned "Invalid Premium API key" when we fetched it on 1 October 2026. Ours is one header, x-api-key, on every endpoint.

Free-tier row caps. Their free tier caps rows per call — 15 for a season's fixtures, 3 for a day, 5 for a table, 10 for a team list — so long seasons mean stitching pages together by hand. Ours paginate with limit and meta.nextCursor.

MAPPING NOTES & OPEN QUESTIONS

Where the two do not match up

Three UNKNOWNs. Head-to-head, fixtures-by-date on v2, and standings on v2 are marked UNKNOWN above because neither their documentation page nor either OpenAPI file lists them. We would rather write UNKNOWN than guess — check with them before you build on any of the three.

Rate limits disagree in their own docs. Their documentation page says 30 requests/minute for free users (100/min premium, 120/min business); their v2 OpenAPI description says "1000 requests per day for free users". Both are quoted here rather than reconciled — take the stricter one when you plan capacity.

Standings scope. Their v1 table endpoint is documented as limited to featured soccer leagues, with a free limit of 5 rows. If you need tables beyond that, expect a paid tier on their side; our standings call is /api/v2/standings on every plan.

What this page does not claim. It maps calls, nothing else. We have not benchmarked TheSportsDB for coverage, latency or uptime, and nothing here should be read as a reliability claim about them — judge that from your own traffic.

Sources: thesportsdb.com/documentation (v1 and v2 auth, schedule/table/team endpoints, rate limits) and the published OpenAPI files at /api/spec/v1/openapi.yaml and /api/spec/v2/openapi.yaml; KickoffAPI's own reference. Retrieved 1 October 2026. Anything their documentation did not answer is written as UNKNOWN rather than guessed.

Get on the wire

One header, one envelope, every league on the free tier. Your key takes 30 seconds.