CPL Analytics API

Canadian Premier League Open Data

Free REST API - No authentication required

309
Matches
7
Seasons
8
Teams
--
Odds (Coming Soon)
2019-25
Coverage

Features

📊

Historical Data

309+ matches from 2019-2025 with full results and venue information

💰

Closing Odds Coming Soon

Historical betting odds - limited sample data available for the 2024 playoffs.

Official Standings

2025 standings sourced directly from official CanPL API

🏡

Team Metadata

Stadium coordinates, surface type, and founding year for all teams

🔗

RESTful JSON API

Clean REST endpoints returning structured JSON data

🔓

No Auth Required

Free and open access - no API keys or registration needed

📄

CC-BY-4.0 License

Open data license - use freely with attribution

API Endpoints

GET /api/matches

Get CPL match results with optional filtering by season, team, and pagination.

season Filter by season year (e.g., 2024)
team Filter by team name (e.g., Forge)
limit Max results to return (default: 100)
offset Skip first N results for pagination (default: 0)
GET /api/standings

Get league standings for a season. 2025 uses official CanPL data; other seasons are calculated from match results.

season Season year (omit for all seasons)
GET /api/teams

Get all CPL teams with metadata including city, stadium, coordinates, and surface type.

active_only Set to true to exclude inactive teams (FC Edmonton, York United)

Note: Coordinates, stadium, and surface data are curated metadata, not from the official API.

GET /api/match-stats

Get detailed statistics for a specific match including shots, possession, xG estimates, and referee data.

match_id *required Full CPL match ID (get from /api/matches)

Returns: score, shots, shots on target, possession, estimated xG, referee info. Stats available for finished matches 2019-2025.

Quick Start

# Get all 2024 matches
import requests
import pandas as pd

response = requests.get('https://canadasoccerapi.com/api/matches?season=2024')
df = pd.DataFrame(response.json()['matches'])

# Analyze home vs away performance
print(df.groupby('home_team')['home_goals'].mean())
// Fetch current standings
fetch('https://canadasoccerapi.com/api/standings?season=2025')
  .then(res => res.json())
  .then(data => {
    console.log('Top team:', data.standings[0].team);
    console.log('Points:', data.standings[0].points);
  });
# Get Forge FC matches
curl "https://canadasoccerapi.com/api/matches?team=Forge&limit=10"

# Get 2025 standings
curl "https://canadasoccerapi.com/api/standings?season=2025"

# Get all active teams
curl "https://canadasoccerapi.com/api/teams?active_only=true"

2025 Standings

# Team P W D L GD Pts
Loading...

Source: Official CanPL API (regular season only)

Documentation