← Back to docs

Migrating to v2

Same power. Cleaner design. More endpoints.

⚠️ v1 sunsets 01 January 2027

If you built your integration on v1, this guide is everything you need to move to v2. Same authentication. Same pricing. Better data.

What changes

v1v2
Coverage1,234 leagues300+ leagues (growing daily)
League IDs39, 140"en.1", "es.1"
Response enveloperesponse / resultsdata / count
Paginationpaging.currentpage / totalPages
ImagesProxy pass-throughWebP, responsive sizing, cached
New endpointsOdds, Transfers, Injuries, H2H, Top Scorers
StatusDeprecatedActive

Step 1 — League IDs

Integer IDs (39) become string codes ("en.1").

v1 IDv2 CodeCompetition
39en.1Premier League
140es.1La Liga
78de.1Bundesliga
135it.1Serie A
61fr.1Ligue 1
88nl.1Eredivisie
GET /api/v2/leaguesFull catalog

Step 2 — Endpoint paths

# Before (v1)
GET  /api/v1/fixtures?league=39&season=2024
GET  /api/v1/fixtures/1234567
GET  /api/v1/standings?league=39&season=2024
GET  /api/v1/teams?league=39&season=2024
GET  /api/v1/players?league=39&season=2024
GET  /api/v1/predictions?fixture=1234567

# After (v2)
GET  /api/v2/fixtures?league=en.1&season=2024
GET  /api/v2/fixtures/fx_a1b2c3d4
GET  /api/v2/standings?league=en.1&season=2024
GET  /api/v2/teams?league=en.1
GET  /api/v2/players?team=t_arsenal
GET  /api/v2/insights?fixture=fx_a1b2c3d4

# New endpoints (v2 only)
GET  /api/v2/odds?league=en.1
GET  /api/v2/transfers?league=en.1
GET  /api/v2/injuries?league=en.1
GET  /api/v2/topscorers?league=en.1&season=2024
GET  /api/v2/topassists?league=en.1&season=2024
GET  /api/v2/headtohead?team1=t_arsenal&team2=t_chelsea

Step 3 — Response format

// v1 response
{ "response": [ ... ],
  "results": 10,
  "paging": { "current": 1, "total": 1 } }

// v2 response
{ "data": [ ... ],
  "count": 10,
  "page": 1,
  "totalPages": 1 }

Fixture object shape

// v1 fixture
{ "fixture": { "id": 1234567 },
  "teams": {
    "home": { "id": 40, "name": "Liverpool" },
    "away": { "id": 33, "name": "Man United" }
  },
  "goals": { "home": 2, "away": 1 },
  "league": { "id": 39, "name": "Premier League" } }
// v2 fixture
{ "id": "fx_a1b2c3d4",
  "homeTeam": { "id": "t_liverpool", "name": "Liverpool", "logo": "https://..." },
  "awayTeam": { "id": "t_manchester-united", "name": "Manchester United", "logo": "https://..." },
  "homeScore": 2,
  "awayScore": 1,
  "league": { "id": "en.1", "name": "Premier League", "logo": "https://..." },
  "date": "2024-08-15T19:00:00Z",
  "status": "finished" }

Step 4 — Images

All team, player, and league images are served as WebP and respond to sizing parameters:

https://api.kickoffapi.com/images/team/en.1/arsenal?size=256&format=png
                                                   ───┬───  ───┬───
                                               size: 32|64|128|256|512    format: webp(default)|png
Pro tip: Wrap league IDs in your code once, then reuse everywhere.
const LEAGUE_IDS = {
  premier_league: 'en.1',
  la_liga:       'es.1',
  bundesliga:    'de.1',
  serie_a:       'it.1',
  ligue_1:       'fr.1',
} as const;

Migración checklist

  1. Replace v1v2 in all paths
  2. Replace integer league IDs with string codes
  3. Parse data instead of response, count instead of results
  4. Update fixture shape: teams.home.namehomeTeam.name, etc.
  5. Test with one league first (en.1)
  6. Monitor responses — contact support if you see gaps in leagues you need
  7. Add the new endpoints (odds, transfers, H2H) to your app