MENU navbar-image

⚽ Football (Soccer)

Football (soccer) API for live scores, fixtures, and season stats worldwide.

tournamentId, teamId, playerId, and matchId are FotMob ids. Use search, tournaments, and matches to find them.

General

Countries, tournaments, search, league standings, and transfers. Use these to find the FotMob ids the other endpoints take.

GET /v1/countries

requires authentication

Get every country (plus International) that has competitions, with its country code and number of tournaments.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/countries'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/countries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/countries"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/countries" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "total": 95
    },
    "body": [
        {
            "countryCode": "INT",
            "name": "International",
            "totalTournaments": 127
        },
        {
            "countryCode": "ALB",
            "name": "Albania",
            "totalTournaments": 3
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/countries

Headers

Authorization Bearer {YOUR_AUTH_KEY}

GET /v1/tournaments

requires authentication

Get all tournaments grouped by country. tournamentId is the id the league, stats, and transfers endpoints take (Premier League is 47).

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/tournaments'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/tournaments';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/tournaments"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/tournaments" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "totalCountries": 95,
        "totalTournaments": 558
    },
    "body": [
        {
            "countryCode": "INT",
            "name": "International",
            "tournaments": [
                {
                    "tournamentId": 42,
                    "name": "Champions League",
                    "logo": "https://images.fotmob.com/image_resources/logo/leaguelogo/42.png"
                },
                {
                    "tournamentId": 73,
                    "name": "Europa League",
                    "logo": "https://images.fotmob.com/image_resources/logo/leaguelogo/73.png"
                }
            ]
        },
        {
            "countryCode": "ALB",
            "name": "Albania",
            "tournaments": [
                {
                    "tournamentId": 260,
                    "name": "Kategoria Superiore",
                    "logo": "https://images.fotmob.com/image_resources/logo/leaguelogo/260.png"
                },
                {
                    "tournamentId": 9173,
                    "name": "Superiore Qualification",
                    "logo": "https://images.fotmob.com/image_resources/logo/leaguelogo/9173.png"
                }
            ]
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/tournaments

Headers

Authorization Bearer {YOUR_AUTH_KEY}

requires authentication

Search players, teams, and leagues by name to get their ids.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/search'
params = {
  'search': 'arsenal',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/search';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'search' => 'arsenal',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/search"
);

const params = {
    "search": "arsenal",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/search?search=arsenal" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "search": "man",
        "total": 6
    },
    "body": {
        "players": [
            {
                "playerId": 1035614,
                "name": "Manuel Ugarte",
                "teamId": 10260,
                "teamName": "Manchester United",
                "isCoach": false
            },
            {
                "playerId": 27299,
                "name": "Manuel Neuer",
                "teamId": 9823,
                "teamName": "Bayern München",
                "isCoach": false
            }
        ],
        "teams": [
            {
                "teamId": 10260,
                "name": "Manchester United",
                "tournamentId": 47,
                "tournamentName": "Premier League"
            },
            {
                "teamId": 8456,
                "name": "Manchester City",
                "tournamentId": 47,
                "tournamentName": "Premier League"
            }
        ],
        "leagues": []
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

GET /v1/league

requires authentication

Get a league's current season id and name plus one tab: the standings table (default), the season's fixtures, or recent transfers.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/league'
params = {
  'tournamentId': '47',
  'tab': 'table',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/league';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentId' => '47',
            'tab' => 'table',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/league"
);

const params = {
    "tournamentId": "47",
    "tab": "table",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/league?tournamentId=47&tab=table" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "tournamentId": 47,
        "tab": "table",
        "total": 1
    },
    "body": {
        "tournamentId": 47,
        "name": "Premier League",
        "countryCode": "ENG",
        "logo": "https://images.fotmob.com/image_resources/logo/leaguelogo/47.png",
        "seasonId": 36781,
        "seasonName": "2026/2027",
        "seasons": [
            "2026/2027",
            "2025/2026"
        ],
        "table": [
            {
                "name": "Premier League",
                "rows": [
                    {
                        "position": 1,
                        "teamId": 8456,
                        "name": "Manchester City",
                        "shortName": "Man City",
                        "played": 5,
                        "wins": 5,
                        "draws": 0,
                        "losses": 0,
                        "goalsFor": 13,
                        "goalsAgainst": 5,
                        "goalDifference": 8,
                        "points": 15,
                        "deduction": null,
                        "qualification": "Champions League"
                    },
                    {
                        "position": 2,
                        "teamId": 9825,
                        "name": "Arsenal",
                        "shortName": "Arsenal",
                        "played": 5,
                        "wins": 4,
                        "draws": 0,
                        "losses": 1,
                        "goalsFor": 8,
                        "goalsAgainst": 4,
                        "goalDifference": 4,
                        "points": 12,
                        "deduction": null,
                        "qualification": "Champions League"
                    }
                ]
            }
        ]
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/league

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentId required integer

The tournament id. Example: 47

tab optional string

One of table, fixtures, transfers. Defaults to table. Example: table

GET /v1/transfers

requires authentication

Get the latest transfers worldwide, for one league, or in and out of one team.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/transfers'
params = {
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/transfers';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/transfers"
);

const params = {
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/transfers?page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalResults": 460,
        "tournamentId": "47",
        "teamId": null
    },
    "body": [
        {
            "playerId": 656495,
            "name": "David Akintola",
            "position": "RW",
            "transferDate": "2026-09-10T10:43:54Z",
            "from": {
                "teamId": 8667,
                "name": "Hull City"
            },
            "to": {
                "teamId": 8044,
                "name": "Omonia Nicosia"
            },
            "fee": null,
            "feeEuro": null,
            "marketValue": 1126673,
            "type": "contract",
            "onLoan": false,
            "contractUntil": "2028-06-29T22:00:00Z"
        },
        {
            "playerId": 1816803,
            "name": "Taha Majni",
            "position": "RB",
            "transferDate": "2026-09-09T19:41:31Z",
            "from": {
                "teamId": 320835,
                "name": "Union Touarga Sport"
            },
            "to": {
                "teamId": 9826,
                "name": "Crystal Palace"
            },
            "fee": "fee",
            "feeEuro": null,
            "marketValue": null,
            "type": "contract",
            "onLoan": false,
            "contractUntil": null
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/transfers

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentId optional integer

Only transfers involving this league.

teamId optional integer

Only transfers in and out of this team. Cannot be combined with tournamentId.

page optional integer

Page number. Example: 1

Matches

Live scores, fixtures, and results by date, plus the full detail of a single match: lineups, events, team stats, shotmap, preview, head-to-head, and prediction poll.

GET /v1/matches-live

requires authentication

Get matches in play right now, grouped by league. The body is an empty list when nothing is in play.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/matches-live'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/matches-live';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/matches-live"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/matches-live" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "date": "20261001",
        "timezone": "America/New_York",
        "totalLeagues": 3,
        "totalMatches": 6
    },
    "body": [
        {
            "tournamentId": 114,
            "name": "Friendlies",
            "parentName": null,
            "countryCode": "INT",
            "matches": [
                {
                    "matchId": 6280450,
                    "tournamentId": 114,
                    "startTime": "2026-10-01T14:00:00.000Z",
                    "status": "live",
                    "statusDetail": null,
                    "minute": "18",
                    "score": "0 - 1",
                    "home": {
                        "teamId": 5899,
                        "name": "Maldives",
                        "score": 0
                    },
                    "away": {
                        "teamId": 5897,
                        "name": "Lebanon",
                        "score": 1
                    }
                },
                {
                    "matchId": 6280451,
                    "tournamentId": 114,
                    "startTime": "2026-10-01T14:00:00.000Z",
                    "status": "live",
                    "statusDetail": null,
                    "minute": "18",
                    "score": "0 - 0",
                    "home": {
                        "teamId": 8700,
                        "name": "Uzbekistan",
                        "score": 0
                    },
                    "away": {
                        "teamId": 6320,
                        "name": "Syria",
                        "score": 0
                    }
                }
            ]
        },
        {
            "tournamentId": 13287,
            "name": "FIFA ASEAN Cup Premier Division Grp. A",
            "parentName": "FIFA ASEAN Cup",
            "countryCode": "INT",
            "matches": [
                {
                    "matchId": 6232982,
                    "tournamentId": 13287,
                    "startTime": "2026-10-01T12:30:00.000Z",
                    "status": "live",
                    "statusDetail": null,
                    "minute": "85",
                    "score": "7 - 1",
                    "home": {
                        "teamId": 6324,
                        "name": "Indonesia",
                        "score": 7
                    },
                    "away": {
                        "teamId": 95797,
                        "name": "Bangladesh",
                        "score": 1
                    }
                },
                {
                    "matchId": 6232983,
                    "tournamentId": 13287,
                    "startTime": "2026-10-01T12:30:00.000Z",
                    "status": "live",
                    "statusDetail": null,
                    "minute": "86",
                    "score": "4 - 0",
                    "home": {
                        "teamId": 5823,
                        "name": "Malaysia",
                        "score": 4
                    },
                    "away": {
                        "teamId": 5825,
                        "name": "Singapore",
                        "score": 0
                    }
                }
            ]
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/matches-live

Headers

Authorization Bearer {YOUR_AUTH_KEY}

GET /v1/matches-upcoming

requires authentication

Get today's matches that have not kicked off yet, grouped by league.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/matches-upcoming'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/matches-upcoming';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/matches-upcoming"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/matches-upcoming" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "date": "20261001",
        "timezone": "America/New_York",
        "totalLeagues": 30,
        "totalMatches": 55
    },
    "body": [
        {
            "tournamentId": 9806,
            "name": "UEFA Nations League A Grp. 2",
            "parentName": "UEFA Nations League A",
            "countryCode": "INT",
            "matches": [
                {
                    "matchId": 5181829,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 8570,
                        "name": "Germany",
                        "score": null
                    },
                    "away": {
                        "teamId": 8205,
                        "name": "Serbia",
                        "score": null
                    }
                },
                {
                    "matchId": 5181830,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 6383,
                        "name": "Greece",
                        "score": null
                    },
                    "away": {
                        "teamId": 6708,
                        "name": "Netherlands",
                        "score": null
                    }
                }
            ]
        },
        {
            "tournamentId": 9806,
            "name": "UEFA Nations League A Grp. 4",
            "parentName": "UEFA Nations League A",
            "countryCode": "INT",
            "matches": [
                {
                    "matchId": 5181865,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 8238,
                        "name": "Denmark",
                        "score": null
                    },
                    "away": {
                        "teamId": 8361,
                        "name": "Portugal",
                        "score": null
                    }
                },
                {
                    "matchId": 5181866,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 5790,
                        "name": "Wales",
                        "score": null
                    },
                    "away": {
                        "teamId": 8492,
                        "name": "Norway",
                        "score": null
                    }
                }
            ]
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/matches-upcoming

Headers

Authorization Bearer {YOUR_AUTH_KEY}

GET /v1/matches

requires authentication

Get every football match on a date, grouped by league. Each match has its status (live, upcoming, finished, postponed, cancelled), score, and the minute when live.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/matches'
params = {
  'date': '20261001',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/matches';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'date' => '20261001',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/matches"
);

const params = {
    "date": "20261001",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/matches?date=20261001" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "date": "20261001",
        "timezone": "America/New_York",
        "totalLeagues": 32,
        "totalMatches": 63
    },
    "body": [
        {
            "tournamentId": 9806,
            "name": "UEFA Nations League A Grp. 2",
            "parentName": "UEFA Nations League A",
            "countryCode": "INT",
            "matches": [
                {
                    "matchId": 5181829,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 8570,
                        "name": "Germany",
                        "score": null
                    },
                    "away": {
                        "teamId": 8205,
                        "name": "Serbia",
                        "score": null
                    }
                },
                {
                    "matchId": 5181830,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 6383,
                        "name": "Greece",
                        "score": null
                    },
                    "away": {
                        "teamId": 6708,
                        "name": "Netherlands",
                        "score": null
                    }
                }
            ]
        },
        {
            "tournamentId": 9806,
            "name": "UEFA Nations League A Grp. 4",
            "parentName": "UEFA Nations League A",
            "countryCode": "INT",
            "matches": [
                {
                    "matchId": 5181865,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 8238,
                        "name": "Denmark",
                        "score": null
                    },
                    "away": {
                        "teamId": 8361,
                        "name": "Portugal",
                        "score": null
                    }
                },
                {
                    "matchId": 5181866,
                    "tournamentId": 9806,
                    "startTime": "2026-10-01T18:45:00.000Z",
                    "status": "upcoming",
                    "statusDetail": null,
                    "minute": null,
                    "score": null,
                    "home": {
                        "teamId": 5790,
                        "name": "Wales",
                        "score": null
                    },
                    "away": {
                        "teamId": 8492,
                        "name": "Norway",
                        "score": null
                    }
                }
            ]
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/matches

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
date optional string

Matches on this date, format YYYYMMDD, in America/New_York time. Defaults to today. Example: 20261001

GET /v1/match-prediction

requires authentication

Get FotMob's own pre-match prediction content: the poll questions (who will win, both teams to score, over 2.5 goals) with their supporting fact, both teams' recent form, and the short insight list. Nothing is calculated by this API.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-prediction'
params = {
  'matchId': '5795465',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-prediction';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795465',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-prediction"
);

const params = {
    "matchId": "5795465",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-prediction?matchId=5795465" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "matchId": 5795465
    },
    "body": {
        "match": {
            "matchId": 5795465,
            "startTime": "2026-10-10T11:30:00.000Z",
            "status": "upcoming",
            "statusDetail": null,
            "minute": null,
            "score": null,
            "home": {
                "teamId": 9825,
                "name": "Arsenal",
                "score": null,
                "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/9825.png"
            },
            "away": {
                "teamId": 8463,
                "name": "Leeds United",
                "score": null,
                "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/8463.png"
            },
            "tournament": {
                "tournamentId": 47,
                "name": "Premier League",
                "round": "6"
            },
            "venue": {
                "name": "Emirates Stadium",
                "city": "London",
                "country": "England",
                "capacity": 60704,
                "surface": "grass"
            },
            "referee": {
                "refereeId": null,
                "name": "",
                "country": ""
            },
            "attendance": null
        },
        "poll": [
            {
                "market": "1x2",
                "question": "Who will win?",
                "options": [
                    "1",
                    "x"
                ],
                "fact": "Arsenal have won the previous 4 matches against Leeds United."
            },
            {
                "market": "bts",
                "question": "Will both teams score?",
                "options": [
                    "yes",
                    "no"
                ],
                "fact": "Arsenal have scored in their last 6 home matches."
            }
        ],
        "form": {
            "home": [
                {
                    "result": "W",
                    "score": "2 - 1",
                    "date": "2026-09-06T15:30:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 9825,
                        "name": "Arsenal"
                    },
                    "away": {
                        "teamId": 8455,
                        "name": "Chelsea"
                    }
                },
                {
                    "result": "W",
                    "score": "0 - 1",
                    "date": "2026-09-09T19:00:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 9875,
                        "name": "Napoli"
                    },
                    "away": {
                        "teamId": 9825,
                        "name": "Arsenal"
                    }
                }
            ],
            "away": [
                {
                    "result": "D",
                    "score": "1 - 1",
                    "date": "2026-08-30T13:00:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 8463,
                        "name": "Leeds United"
                    },
                    "away": {
                        "teamId": 9937,
                        "name": "Brentford"
                    }
                },
                {
                    "result": "D",
                    "score": "1 - 1",
                    "date": "2026-09-05T14:00:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 10204,
                        "name": "Brighton & Hove Albion"
                    },
                    "away": {
                        "teamId": 8463,
                        "name": "Leeds United"
                    }
                }
            ]
        },
        "insights": [
            {
                "type": "team",
                "teamId": 9825,
                "playerId": null,
                "text": "Have scored 14 goals in their last 5 matches"
            },
            {
                "type": "team",
                "teamId": 9825,
                "playerId": null,
                "text": "Have kept the most clean sheets in the competition (3)"
            }
        ]
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-prediction

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795465

GET /v1/match

requires authentication

Get one match: score, status, live minute, competition and round, venue, referee, and attendance.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match'
params = {
  'matchId': '5795459',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795459',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match"
);

const params = {
    "matchId": "5795459",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match?matchId=5795459" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "matchId": 5795459
    },
    "body": {
        "matchId": 5795459,
        "startTime": "2026-09-20T15:30:00.000Z",
        "status": "finished",
        "statusDetail": "Full-Time",
        "minute": null,
        "score": "1 - 1",
        "home": {
            "teamId": 9879,
            "name": "Fulham",
            "score": 1,
            "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/9879.png"
        },
        "away": {
            "teamId": 10260,
            "name": "Manchester United",
            "score": 1,
            "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/10260.png"
        },
        "tournament": {
            "tournamentId": 47,
            "name": "Premier League",
            "round": "5"
        },
        "venue": {
            "name": "Craven Cottage",
            "city": "London",
            "country": "England",
            "capacity": 29589,
            "surface": "grass"
        },
        "referee": {
            "refereeId": 1001079673,
            "name": "Peter Bankes",
            "country": "England"
        },
        "attendance": 27563
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id from the matches endpoints. Example: 5795459

GET /v1/match-lineup

requires authentication

Get both teams' formation, starting eleven, bench, coach, and unavailable players. Player ratings are filled in once the match has started.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-lineup'
params = {
  'matchId': '5795459',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-lineup';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795459',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-lineup"
);

const params = {
    "matchId": "5795459",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-lineup?matchId=5795459" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "matchId": 5795459,
        "lineupType": "standard"
    },
    "body": {
        "home": {
            "teamId": 9879,
            "name": "Fulham",
            "formation": "4-2-3-1",
            "coach": {
                "coachId": 37442,
                "name": "Álvaro Arbeloa"
            },
            "starters": [
                {
                    "playerId": 215168,
                    "name": "Bernd Leno",
                    "shirtNumber": "1",
                    "positionId": 11,
                    "country": "Germany",
                    "rating": 7.4
                },
                {
                    "playerId": 465750,
                    "name": "Timothy Castagne",
                    "shirtNumber": "21",
                    "positionId": 32,
                    "country": "Belgium",
                    "rating": 6.4
                }
            ],
            "bench": [
                {
                    "playerId": 1403691,
                    "name": "César Palacios",
                    "shirtNumber": "8",
                    "positionId": 3,
                    "country": "Spain",
                    "rating": 6.5
                },
                {
                    "playerId": 1318400,
                    "name": "Kevin",
                    "shirtNumber": "11",
                    "positionId": 3,
                    "country": "Brazil",
                    "rating": 6.4
                }
            ],
            "unavailable": []
        },
        "away": {
            "teamId": 10260,
            "name": "Manchester United",
            "formation": "4-2-3-1",
            "coach": {
                "coachId": 34944,
                "name": "Michael Carrick"
            },
            "starters": [
                {
                    "playerId": 1178602,
                    "name": "Senne Lammens",
                    "shirtNumber": "1",
                    "positionId": 11,
                    "country": "Belgium",
                    "rating": 8.3
                },
                {
                    "playerId": 751550,
                    "name": "Diogo Dalot",
                    "shirtNumber": "2",
                    "positionId": 32,
                    "country": "Portugal",
                    "rating": 7.3
                }
            ],
            "bench": [
                {
                    "playerId": 950830,
                    "name": "Joshua Zirkzee",
                    "shirtNumber": "11",
                    "positionId": 3,
                    "country": "Netherlands",
                    "rating": 6.1
                },
                {
                    "playerId": 750032,
                    "name": "Mason Mount",
                    "shirtNumber": "7",
                    "positionId": 2,
                    "country": "England",
                    "rating": 6.1
                }
            ],
            "unavailable": []
        }
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-lineup

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795459

GET /v1/match-events

requires authentication

Get goals, cards, and substitutions in minute order. The body is an empty list before kick-off.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-events'
params = {
  'matchId': '5795459',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-events';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795459',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-events"
);

const params = {
    "matchId": "5795459",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-events?matchId=5795459" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": "finished",
        "copywrite": "https://steadyapi.com",
        "matchId": 5795459,
        "total": 13
    },
    "body": [
        {
            "minute": 45,
            "addedTime": null,
            "type": "card",
            "side": "home",
            "teamId": 9879,
            "player": {
                "playerId": 1422593,
                "name": "Joshua King"
            },
            "card": "Yellow"
        },
        {
            "minute": 50,
            "addedTime": null,
            "type": "card",
            "side": "home",
            "teamId": 9879,
            "player": {
                "playerId": 465750,
                "name": "Timothy Castagne"
            },
            "card": "Yellow"
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-events

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795459

GET /v1/match-stats

requires authentication

Get team stat pairs (home vs away) for the whole match and each half, the shotmap with expected goals per shot, and the momentum series. Sections are empty before kick-off.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-stats'
params = {
  'matchId': '5795459',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-stats';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795459',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-stats"
);

const params = {
    "matchId": "5795459",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-stats?matchId=5795459" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": "finished",
        "copywrite": "https://steadyapi.com",
        "matchId": 5795459
    },
    "body": {
        "home": {
            "teamId": 9879,
            "name": "Fulham",
            "score": 1,
            "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/9879.png"
        },
        "away": {
            "teamId": 10260,
            "name": "Manchester United",
            "score": 1,
            "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/10260.png"
        },
        "stats": {
            "all": [
                {
                    "group": "Top stats",
                    "stats": [
                        {
                            "key": "BallPossesion",
                            "title": "Ball possession",
                            "home": 42,
                            "away": 58
                        },
                        {
                            "key": "expected_goals",
                            "title": "Expected goals (xG)",
                            "home": "1.62",
                            "away": "1.60"
                        }
                    ]
                },
                {
                    "group": "Shots",
                    "stats": [
                        {
                            "key": "total_shots",
                            "title": "Total shots",
                            "home": 12,
                            "away": 29
                        },
                        {
                            "key": "ShotsOffTarget",
                            "title": "Shots off target",
                            "home": 5,
                            "away": 10
                        }
                    ]
                }
            ],
            "firstHalf": [
                {
                    "group": "Top stats",
                    "stats": [
                        {
                            "key": "BallPossesion",
                            "title": "Ball possession",
                            "home": 44,
                            "away": 56
                        },
                        {
                            "key": "expected_goals",
                            "title": "Expected goals (xG)",
                            "home": "1.49",
                            "away": "1.06"
                        }
                    ]
                },
                {
                    "group": "Shots",
                    "stats": [
                        {
                            "key": "total_shots",
                            "title": "Total shots",
                            "home": 9,
                            "away": 17
                        },
                        {
                            "key": "ShotsOffTarget",
                            "title": "Shots off target",
                            "home": 5,
                            "away": 7
                        }
                    ]
                }
            ],
            "secondHalf": [
                {
                    "group": "Top stats",
                    "stats": [
                        {
                            "key": "BallPossesion",
                            "title": "Ball possession",
                            "home": 40,
                            "away": 60
                        },
                        {
                            "key": "expected_goals",
                            "title": "Expected goals (xG)",
                            "home": "0.13",
                            "away": "0.54"
                        }
                    ]
                },
                {
                    "group": "Shots",
                    "stats": [
                        {
                            "key": "total_shots",
                            "title": "Total shots",
                            "home": 3,
                            "away": 12
                        },
                        {
                            "key": "ShotsOffTarget",
                            "title": "Shots off target",
                            "home": 0,
                            "away": 3
                        }
                    ]
                }
            ]
        },
        "shotmap": [
            {
                "shotId": 2973089661,
                "teamId": 9879,
                "playerId": 1413847,
                "playerName": "Gonzalo García",
                "minute": 4,
                "addedTime": null,
                "eventType": "Miss",
                "situation": "RegularPlay",
                "shotType": "RightFoot",
                "x": 92.4,
                "y": 45.1918471296,
                "expectedGoals": 0.05115020275115967,
                "expectedGoalsOnTarget": 0,
                "isOnTarget": false,
                "isBlocked": false,
                "isOwnGoal": false
            },
            {
                "shotId": 2973096017,
                "teamId": 10260,
                "playerId": 422685,
                "playerName": "Bruno Fernandes",
                "minute": 9,
                "addedTime": null,
                "eventType": "AttemptSaved",
                "situation": "RegularPlay",
                "shotType": "Header",
                "x": 99.3070175438,
                "y": 29.211428570000002,
                "expectedGoals": 0.08917082101106644,
                "expectedGoalsOnTarget": 0,
                "isOnTarget": true,
                "isBlocked": true,
                "isOwnGoal": false
            }
        ],
        "momentum": [
            {
                "minute": 0,
                "value": 0
            },
            {
                "minute": 1,
                "value": -5
            }
        ]
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-stats

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795459

GET /v1/match-preview

requires authentication

Get the pre-match picture: both teams' recent form, their rows in the league table, and a head-to-head summary with the last five meetings.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-preview'
params = {
  'matchId': '5795465',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-preview';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795465',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-preview"
);

const params = {
    "matchId": "5795465",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-preview?matchId=5795465" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "matchId": 5795465
    },
    "body": {
        "match": {
            "matchId": 5795465,
            "startTime": "2026-10-10T11:30:00.000Z",
            "status": "upcoming",
            "statusDetail": null,
            "minute": null,
            "score": null,
            "home": {
                "teamId": 9825,
                "name": "Arsenal",
                "score": null,
                "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/9825.png"
            },
            "away": {
                "teamId": 8463,
                "name": "Leeds United",
                "score": null,
                "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/8463.png"
            },
            "tournament": {
                "tournamentId": 47,
                "name": "Premier League",
                "round": "6"
            },
            "venue": {
                "name": "Emirates Stadium",
                "city": "London",
                "country": "England",
                "capacity": 60704,
                "surface": "grass"
            },
            "referee": {
                "refereeId": null,
                "name": "",
                "country": ""
            },
            "attendance": null
        },
        "form": {
            "home": [
                {
                    "result": "W",
                    "score": "2 - 1",
                    "date": "2026-09-06T15:30:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 9825,
                        "name": "Arsenal"
                    },
                    "away": {
                        "teamId": 8455,
                        "name": "Chelsea"
                    }
                },
                {
                    "result": "W",
                    "score": "0 - 1",
                    "date": "2026-09-09T19:00:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 9875,
                        "name": "Napoli"
                    },
                    "away": {
                        "teamId": 9825,
                        "name": "Arsenal"
                    }
                }
            ],
            "away": [
                {
                    "result": "D",
                    "score": "1 - 1",
                    "date": "2026-08-30T13:00:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 8463,
                        "name": "Leeds United"
                    },
                    "away": {
                        "teamId": 9937,
                        "name": "Brentford"
                    }
                },
                {
                    "result": "D",
                    "score": "1 - 1",
                    "date": "2026-09-05T14:00:00.000Z",
                    "tournament": null,
                    "home": {
                        "teamId": 10204,
                        "name": "Brighton & Hove Albion"
                    },
                    "away": {
                        "teamId": 8463,
                        "name": "Leeds United"
                    }
                }
            ]
        },
        "table": {
            "tournamentId": 47,
            "name": "Premier League",
            "seasonName": "2026/2027",
            "rows": [
                {
                    "position": 2,
                    "teamId": 9825,
                    "name": "Arsenal",
                    "shortName": "Arsenal",
                    "played": 5,
                    "wins": 4,
                    "draws": 0,
                    "losses": 1,
                    "goalsFor": 8,
                    "goalsAgainst": 4,
                    "goalDifference": 4,
                    "points": 12,
                    "deduction": null,
                    "qualification": "Champions League"
                },
                {
                    "position": 5,
                    "teamId": 8463,
                    "name": "Leeds United",
                    "shortName": "Leeds",
                    "played": 5,
                    "wins": 2,
                    "draws": 3,
                    "losses": 0,
                    "goalsFor": 7,
                    "goalsAgainst": 3,
                    "goalDifference": 4,
                    "points": 9,
                    "deduction": null,
                    "qualification": "Europa League"
                }
            ]
        },
        "headToHead": {
            "summary": {
                "homeWins": 11,
                "draws": 2,
                "awayWins": 0
            },
            "lastMeetings": [
                {
                    "matchId": 4813608,
                    "round": null,
                    "tournament": {
                        "tournamentId": 47,
                        "name": "Premier League"
                    },
                    "startTime": "2026-01-31T15:00:00.000Z",
                    "status": "finished",
                    "statusDetail": "Full-Time",
                    "score": "0 - 4",
                    "home": {
                        "teamId": 8463,
                        "name": "Leeds United"
                    },
                    "away": {
                        "teamId": 9825,
                        "name": "Arsenal"
                    }
                },
                {
                    "matchId": 4813386,
                    "round": null,
                    "tournament": {
                        "tournamentId": 47,
                        "name": "Premier League"
                    },
                    "startTime": "2025-08-23T16:30:00.000Z",
                    "status": "finished",
                    "statusDetail": "Full-Time",
                    "score": "5 - 0",
                    "home": {
                        "teamId": 9825,
                        "name": "Arsenal"
                    },
                    "away": {
                        "teamId": 8463,
                        "name": "Leeds United"
                    }
                }
            ]
        }
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-preview

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795465

GET /v1/match-betting

requires authentication

Get bookmaker odds for a match, one row per market. Upcoming and live matches list every market the bookmaker offers. Finished matches keep only the full-time result market, with winner set. The body is an empty list when the source has no odds for the match.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-betting'
params = {
  'matchId': '5795465',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-betting';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795465',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-betting"
);

const params = {
    "matchId": "5795465",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-betting?matchId=5795465" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "matchId": 5181853,
        "bookmaker": "Bet365",
        "total": 3
    },
    "body": [
        {
            "bookmaker": "Bet365",
            "category": "Bets",
            "market": "Full Time Result",
            "selections": [
                {
                    "name": "1",
                    "value": null,
                    "oddsDecimal": "4.75",
                    "oddsAmerican": "+375",
                    "oddsFraction": "15/4"
                },
                {
                    "name": "X",
                    "value": null,
                    "oddsDecimal": "4.00",
                    "oddsAmerican": "+300",
                    "oddsFraction": "3/1"
                },
                {
                    "name": "2",
                    "value": null,
                    "oddsDecimal": "1.70",
                    "oddsAmerican": "-143",
                    "oddsFraction": "7/10"
                }
            ],
            "winner": null
        },
        {
            "bookmaker": "Bet365",
            "category": "Bets",
            "market": "Handicap Result",
            "selections": [
                {
                    "name": "1",
                    "value": "+1",
                    "oddsDecimal": "2.10",
                    "oddsAmerican": "+110",
                    "oddsFraction": "11/10"
                },
                {
                    "name": "X",
                    "value": "-1",
                    "oddsDecimal": "3.75",
                    "oddsAmerican": "+275",
                    "oddsFraction": "11/4"
                },
                {
                    "name": "2",
                    "value": "-1",
                    "oddsDecimal": "2.75",
                    "oddsAmerican": "+175",
                    "oddsFraction": "7/4"
                }
            ],
            "winner": null
        },
        {
            "bookmaker": "Bet365",
            "category": "Bets",
            "market": "First Team to Score",
            "selections": [
                {
                    "name": "1",
                    "value": null,
                    "oddsDecimal": "2.50",
                    "oddsAmerican": "+150",
                    "oddsFraction": "6/4"
                },
                {
                    "name": "X",
                    "value": null,
                    "oddsDecimal": "15.00",
                    "oddsAmerican": "+1400",
                    "oddsFraction": "14/1"
                },
                {
                    "name": "2",
                    "value": null,
                    "oddsDecimal": "1.53",
                    "oddsAmerican": "-188",
                    "oddsFraction": "8/15"
                }
            ],
            "winner": null
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-betting

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795465

GET /v1/match-headtohead

requires authentication

Get previous meetings between the two teams, newest first, with the win/draw/loss summary from the home team's point of view.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/match-headtohead'
params = {
  'matchId': '5795465',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/match-headtohead';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'matchId' => '5795465',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/match-headtohead"
);

const params = {
    "matchId": "5795465",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/match-headtohead?matchId=5795465" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "matchId": 5795465,
        "total": 13
    },
    "body": {
        "home": {
            "teamId": 9825,
            "name": "Arsenal",
            "score": null,
            "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/9825.png"
        },
        "away": {
            "teamId": 8463,
            "name": "Leeds United",
            "score": null,
            "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/8463.png"
        },
        "summary": {
            "homeWins": 11,
            "draws": 2,
            "awayWins": 0
        },
        "matches": [
            {
                "matchId": 4813608,
                "round": null,
                "tournament": {
                    "tournamentId": 47,
                    "name": "Premier League"
                },
                "startTime": "2026-01-31T15:00:00.000Z",
                "status": "finished",
                "statusDetail": "Full-Time",
                "score": "0 - 4",
                "home": {
                    "teamId": 8463,
                    "name": "Leeds United"
                },
                "away": {
                    "teamId": 9825,
                    "name": "Arsenal"
                }
            },
            {
                "matchId": 4813386,
                "round": null,
                "tournament": {
                    "tournamentId": 47,
                    "name": "Premier League"
                },
                "startTime": "2025-08-23T16:30:00.000Z",
                "status": "finished",
                "statusDetail": "Full-Time",
                "score": "5 - 0",
                "home": {
                    "teamId": 9825,
                    "name": "Arsenal"
                },
                "away": {
                    "teamId": 8463,
                    "name": "Leeds United"
                }
            }
        ]
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/match-headtohead

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
matchId required integer

The match id. Example: 5795465

All Teams' Stats

Season leaderboards for teams. Each request returns one stat (chosen with sort) for one or more leagues; filter to specific teams with teamIds. Home and away splits are not available.

GET /v1/team-summary

requires authentication

Rank teams in a league's current season by one headline stat: rating, goals, possession, expected goals, clean sheets, cards, and more. Each row has the team, its rank, and the stat value; meta names the stat and season.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/team-summary'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/team-summary';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/team-summary"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/team-summary?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 1,
        "resultsPerPage": 20,
        "totalResults": 20,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "rating",
        "stat": "rating_team",
        "statTitle": "FotMob rating",
        "subStatTitle": null,
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "teamId": 8456,
            "name": "Manchester City",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/8456.png",
            "value": 7.41
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "teamId": 10204,
            "name": "Brighton & Hove Albion",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/10204.png",
            "value": 7.16
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/team-summary

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob team rating
  • goal: Goals per match
  • goals-conceded: Goals conceded per match
  • possession: Average possession
  • expected-goals: Expected goals (xG)
  • accurate-passes: Accurate passes per match
  • clean-sheets: Clean sheets
  • yellow-card: Yellow cards
  • red-card: Red cards
  • attendance: Average home attendance. Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/team-defensive

requires authentication

Rank teams in a league's current season by one defensive stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/team-defensive'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/team-defensive';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/team-defensive"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/team-defensive?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 1,
        "resultsPerPage": 20,
        "totalResults": 20,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "tackles",
        "stat": "total_tackle_team",
        "statTitle": "Tackles per match",
        "subStatTitle": "Total tackles",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "teamId": 9826,
            "name": "Crystal Palace",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/9826.png",
            "value": 22.4,
            "subValue": 112
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "teamId": 8586,
            "name": "Tottenham Hotspur",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/8586.png",
            "value": 18.6,
            "subValue": 93
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/team-defensive

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob team rating
  • goals-conceded: Goals conceded per match
  • expected-goals-conceded: Expected goals conceded (xGA)
  • tackles: Tackles per match
  • interception: Interceptions per match
  • clearances: Clearances per match
  • possession-won-final-third: Possession won in the final third per match
  • saves: Saves per match
  • clean-sheets: Clean sheets
  • penalties-conceded: Penalties conceded
  • set-piece-goals-conceded: Goals conceded from set pieces
  • fouls: Fouls committed per match. Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/team-offensive

requires authentication

Rank teams in a league's current season by one attacking stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/team-offensive'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/team-offensive';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/team-offensive"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/team-offensive?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 1,
        "resultsPerPage": 20,
        "totalResults": 20,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "big-chances",
        "stat": "big_chance_team",
        "statTitle": "Big chances",
        "subStatTitle": "Total goals",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "teamId": 10204,
            "name": "Brighton & Hove Albion",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/10204.png",
            "value": 22,
            "subValue": 16
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "teamId": 8472,
            "name": "Sunderland",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/8472.png",
            "value": 20,
            "subValue": 6
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/team-offensive

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob team rating
  • shot-on-tgt: Shots on target per match
  • big-chances: Big chances per match
  • big-chances-missed: Big chances missed
  • accurate-passes: Accurate passes per match
  • accurate-long-balls: Accurate long balls per match
  • accurate-crosses: Accurate crosses per match
  • touches-in-opp-box: Touches in the opposition box per match
  • corners: Corners per match
  • penalties-won: Penalties won. Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/team-goals

requires authentication

Rank teams in a league's current season by one goals or expected-goals stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/team-goals'
params = {
  'tournamentIds': '47',
  'sort': 'expectedGoals',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/team-goals';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'expectedGoals',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/team-goals"
);

const params = {
    "tournamentIds": "47",
    "sort": "expectedGoals",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/team-goals?tournamentIds=47&sort=expectedGoals&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 1,
        "resultsPerPage": 20,
        "totalResults": 20,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "expectedGoals",
        "stat": "expected_goals_team",
        "statTitle": "Expected goals",
        "subStatTitle": "Goals",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "teamId": 10204,
            "name": "Brighton & Hove Albion",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/10204.png",
            "value": 11.5,
            "subValue": 16
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "teamId": 8456,
            "name": "Manchester City",
            "teamLogo": "https://images.fotmob.com/image_resources/logo/teamlogo/8456.png",
            "value": 10.5,
            "subValue": 13
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/team-goals

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob team rating
  • goals: Goals per match
  • expectedGoals: Expected goals (xG)
  • expected-goals-difference: xG difference
  • goals-conceded: Goals conceded per match
  • expected-goals-conceded: Expected goals conceded (xGA)
  • set-piece-goals: Goals from set pieces
  • big-chances-missed: Big chances missed. Example: expectedGoals
page optional integer

Page number, 20 rows per page. Example: 1

All Players' Stats

Season leaderboards for players. Each request returns one stat (chosen with sort) for one or more leagues; filter with teamIds or playerId. Home/away splits and single-match filters are not available here; use the match endpoints for one match.

GET /v1/player-summary

requires authentication

Rank players in a league's current season by one headline stat: rating, goals, assists, minutes, shots, cards, and more. Each row has the player, team, rank, and stat value; meta names the stat and season.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/player-summary'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/player-summary';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/player-summary"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/player-summary?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 5,
        "resultsPerPage": 20,
        "totalResults": 90,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "goal",
        "stat": "goals",
        "statTitle": "Top scorer",
        "subStatTitle": "Penalty goals",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "playerId": 737066,
            "name": "Erling Haaland",
            "teamId": 8456,
            "teamName": "Manchester City",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/737066.png",
            "value": 5,
            "subValue": 0
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "playerId": 690107,
            "name": "Alexander Isak",
            "teamId": 8650,
            "teamName": "Liverpool",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/690107.png",
            "value": 4,
            "subValue": 0
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/player-summary

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

playerId optional integer

Keep only this player.

matchId optional integer

Not supported on season stats; returns 422.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob player rating
  • goal: Goals
  • assists: Assists
  • goals-and-assists: Goals plus assists
  • minutes-played: Minutes played
  • shots-per-game: Shots per 90 minutes
  • accurate-passes-per-90: Accurate passes per 90 minutes
  • yellow-card: Yellow cards
  • red-card: Red cards. Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/player-defensive

requires authentication

Rank players in a league's current season by one defensive or goalkeeping stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/player-defensive'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/player-defensive';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/player-defensive"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/player-defensive?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 13,
        "resultsPerPage": 20,
        "totalResults": 256,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "tackles",
        "stat": "total_tackle",
        "statTitle": "Tackles per 90",
        "subStatTitle": "Total tackles",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "playerId": 1174672,
            "name": "João Gomes",
            "teamId": 10252,
            "teamName": "Aston Villa",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/1174672.png",
            "value": 6.2,
            "subValue": 9
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "playerId": 966027,
            "name": "Conor Gallagher",
            "teamId": 8586,
            "teamName": "Tottenham Hotspur",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/966027.png",
            "value": 5.4,
            "subValue": 8
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/player-defensive

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

playerId optional integer

Keep only this player.

matchId optional integer

Not supported on season stats; returns 422.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob player rating
  • tackles: Tackles per 90
  • interceptions: Interceptions per 90
  • clearances: Clearances per 90
  • blocks: Blocks per 90
  • recoveries: Recoveries per 90
  • defensive-actions: Defensive actions per 90
  • possession-won-final-third: Possession won in the final third per 90
  • fouls: Fouls committed per 90
  • penalties-conceded: Penalties conceded
  • minutes-played: Minutes played
  • clean-sheets: Clean sheets (goalkeepers)
  • saves: Saves per 90 (goalkeepers)
  • save-percentage: Save percentage (goalkeepers)
  • goals-prevented: Goals prevented (goalkeepers)
  • goals-conceded: Goals conceded per 90 (goalkeepers). Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/player-offensive

requires authentication

Rank players in a league's current season by one attacking stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/player-offensive'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/player-offensive';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/player-offensive"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/player-offensive?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 14,
        "resultsPerPage": 20,
        "totalResults": 272,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "key-passes-per-game",
        "stat": "total_att_assist",
        "statTitle": "Chances created",
        "subStatTitle": "Chances created per 90",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "playerId": 167008,
            "name": "Pascal Groß",
            "teamId": 10204,
            "teamName": "Brighton & Hove Albion",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/167008.png",
            "value": 15,
            "subValue": 3
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "playerId": 789502,
            "name": "Morgan Gibbs-White",
            "teamId": 10203,
            "teamName": "Nottingham Forest",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/789502.png",
            "value": 14,
            "subValue": 2.8
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/player-offensive

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

playerId optional integer

Keep only this player.

matchId optional integer

Not supported on season stats; returns 422.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob player rating
  • goals: Goals
  • assists: Assists
  • minutes-played: Minutes played
  • shots-per-game: Shots per 90
  • shots-on-target-per-90: Shots on target per 90
  • key-passes-per-game: Chances created
  • big-chances-created: Big chances created
  • big-chances-missed: Big chances missed
  • dribble-won: Successful dribbles per 90
  • penalties-won: Penalties won
  • expected-goals: Expected goals (xG)
  • expected-assists: Expected assists (xA). Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/player-passing

requires authentication

Rank players in a league's current season by one passing or chance-creation stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/player-passing'
params = {
  'tournamentIds': '47',
  'sort': 'rating',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/player-passing';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'rating',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/player-passing"
);

const params = {
    "tournamentIds": "47",
    "sort": "rating",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/player-passing?tournamentIds=47&sort=rating&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 15,
        "resultsPerPage": 20,
        "totalResults": 287,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "accurate-passes-per-90",
        "stat": "accurate_pass",
        "statTitle": "Accurate passes per 90",
        "subStatTitle": "Pass success",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "playerId": 201690,
            "name": "Lewis Dunk",
            "teamId": 10204,
            "teamName": "Brighton & Hove Albion",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/201690.png",
            "value": 90,
            "subValue": 92.3
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "playerId": 1089691,
            "name": "Elliot Anderson",
            "teamId": 8456,
            "teamName": "Manchester City",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/1089691.png",
            "value": 86.1,
            "subValue": 90
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/player-passing

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds optional string

Up to 10 comma-separated tournament ids. Defaults to 47 (Premier League). Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

playerId optional integer

Keep only this player.

matchId optional integer

Not supported on season stats; returns 422.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob player rating
  • assists: Assists
  • minutes-played: Minutes played
  • key-passes-per-game: Chances created
  • accurate-passes-per-90: Accurate passes per 90
  • accurate-long-balls-per-90: Accurate long balls per 90
  • line-breaking-passes-per-90: Line-breaking passes per 90
  • big-chances-created: Big chances created
  • expected-assists: Expected assists (xA)
  • expected-assists-per-90: Expected assists per 90. Example: rating
page optional integer

Page number, 20 rows per page. Example: 1

GET /v1/player-goals

requires authentication

Rank players in a league's current season by one goals, shooting, or expected-goals stat.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/player-goals'
params = {
  'tournamentIds': '47',
  'sort': 'goals',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/player-goals';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'tournamentIds' => '47',
            'sort' => 'goals',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/player-goals"
);

const params = {
    "tournamentIds": "47",
    "sort": "goals",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/player-goals?tournamentIds=47&sort=goals&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "currentPage": 1,
        "totalPages": 16,
        "resultsPerPage": 20,
        "totalResults": 302,
        "firstRecordIndex": 1,
        "lastRecordIndex": 20,
        "sort": "expectedGoals",
        "stat": "expected_goals",
        "statTitle": "Expected goals (xG)",
        "subStatTitle": "Goals",
        "field": "both",
        "tournamentIds": "47",
        "teamIds": null,
        "playerId": null,
        "seasons": [
            {
                "tournamentId": 47,
                "tournamentName": "Premier League",
                "seasonId": 36781,
                "seasonName": "2026/2027"
            }
        ]
    },
    "body": [
        {
            "rank": 1,
            "tournamentId": 47,
            "playerId": 737066,
            "name": "Erling Haaland",
            "teamId": 8456,
            "teamName": "Manchester City",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/737066.png",
            "value": 4.4,
            "subValue": 5
        },
        {
            "rank": 2,
            "tournamentId": 47,
            "playerId": 690107,
            "name": "Alexander Isak",
            "teamId": 8650,
            "teamName": "Liverpool",
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/690107.png",
            "value": 3.5,
            "subValue": 4
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (403, Unauthorized):


{
    "message": "This action is unauthorized."
}
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Resource Not Found"
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/player-goals

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
tournamentIds required string

Up to 10 comma-separated tournament ids. Example: 47

teamIds optional string

Up to 10 comma-separated team ids to keep.

playerId optional integer

Keep only this player.

matchId optional integer

Not supported on season stats; returns 422.

field optional string

Only both is supported; home or away returns 422.

sort optional string

One stat per request. Defaults to rating. Values:

  • rating: FotMob player rating
  • goals: Goals
  • goals-per-90: Goals per 90
  • expectedGoals: Expected goals (xG)
  • expectedGoals-per-game: Expected goals per 90
  • expected-goals-on-target: Expected goals on target (xGOT)
  • shots-per-game: Shots per 90
  • shots-on-target-per-90: Shots on target per 90
  • big-chances-missed: Big chances missed
  • goals-and-assists: Goals plus assists
  • penalties-won: Penalties won
  • minutes-played: Minutes played. Example: goals
page optional integer

Page number, 20 rows per page. Example: 1

Teams and Players

Profiles for one team or one player, and a team's full squad.

GET /v1/team

requires authentication

Get a team's profile: country, main league, venue, coach, recent form, and last and next match.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/team'
params = {
  'teamId': '9825',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/team';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'teamId' => '9825',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/team"
);

const params = {
    "teamId": "9825",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/team?teamId=9825" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "teamId": 9825
    },
    "body": {
        "teamId": 9825,
        "name": "Arsenal",
        "shortName": "Arsenal",
        "countryCode": "ENG",
        "gender": "male",
        "logo": "https://images.fotmob.com/image_resources/logo/teamlogo/9825.png",
        "primaryTournament": {
            "tournamentId": 47,
            "name": "Premier League"
        },
        "season": "2026/2027",
        "venue": {
            "name": "Emirates Stadium",
            "city": "London",
            "capacity": 60704,
            "surface": "Grass",
            "opened": 2006
        },
        "coach": {
            "coachId": 24011,
            "name": "Mikel Arteta",
            "country": "Spain",
            "age": 44
        },
        "form": [
            {
                "result": "W",
                "score": "2 - 1",
                "date": "2026-09-06T15:30:00.000Z",
                "tournament": "Premier League",
                "home": {
                    "teamId": 9825,
                    "name": "Arsenal"
                },
                "away": {
                    "teamId": 8455,
                    "name": "Chelsea"
                }
            },
            {
                "result": "W",
                "score": "0 - 1",
                "date": "2026-09-09T19:00:00.000Z",
                "tournament": "Champions League",
                "home": {
                    "teamId": 9875,
                    "name": "Napoli"
                },
                "away": {
                    "teamId": 9825,
                    "name": "Arsenal"
                }
            }
        ],
        "lastMatch": {
            "matchId": 5795457,
            "startTime": "2026-09-19T14:00:00.000Z",
            "status": "finished",
            "score": "3 - 0",
            "tournament": {
                "tournamentId": 47,
                "name": "Premier League"
            },
            "home": {
                "teamId": 10204,
                "name": "Brighton"
            },
            "away": {
                "teamId": 9825,
                "name": "Arsenal"
            }
        },
        "nextMatch": {
            "matchId": 5795465,
            "startTime": "2026-10-10T11:30:00.000Z",
            "status": "upcoming",
            "score": null,
            "tournament": {
                "tournamentId": 47,
                "name": "Premier League"
            },
            "home": {
                "teamId": 9825,
                "name": "Arsenal"
            },
            "away": {
                "teamId": 8463,
                "name": "Leeds"
            }
        }
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/team

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
teamId required integer

The team id. Example: 9825

GET /v1/team-squad

requires authentication

Get a team's squad with player ids, positions, shirt numbers, age, and market value. The coach is in meta.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/team-squad'
params = {
  'teamId': '9825',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/team-squad';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'teamId' => '9825',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/team-squad"
);

const params = {
    "teamId": "9825",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/team-squad?teamId=9825" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "teamId": 9825,
        "teamName": "Arsenal",
        "coach": {
            "coachId": 24011,
            "name": "Mikel Arteta",
            "country": "Spain",
            "age": 44
        },
        "total": 24
    },
    "body": [
        {
            "playerId": 562727,
            "name": "David Raya",
            "shirtNumber": 1,
            "positionGroup": "keepers",
            "position": "GK",
            "country": "Spain",
            "age": 31,
            "dateOfBirth": "1995-09-15",
            "height": 183,
            "marketValue": 20017019,
            "injury": null,
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/562727.png"
        },
        {
            "playerId": 317564,
            "name": "Kepa Arrizabalaga",
            "shirtNumber": 13,
            "positionGroup": "keepers",
            "position": "GK",
            "country": "Spain",
            "age": 31,
            "dateOfBirth": "1994-10-03",
            "height": 189,
            "marketValue": 2950140,
            "injury": null,
            "playerImage": "https://images.fotmob.com/image_resources/playerimages/317564.png"
        }
    ]
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/team-squad

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
teamId required integer

The team id. Example: 9825

GET /v1/player

requires authentication

Get a player's profile: age, height, foot, country, market value, contract, team, positions, injury, and stats for the current season in their main league.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/football/player'
params = {
  'playerId': '737066',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/football/player';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
        ],
        'query' => [
            'playerId' => '737066',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api.steadyapi.com/v1/football/player"
);

const params = {
    "playerId": "737066",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
curl --request GET \
    --get "https://api.steadyapi.com/v1/football/player?playerId=737066" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}"

Example response (200, Success):


{
    "meta": {
        "version": "v1.0",
        "status": 200,
        "copywrite": "https://steadyapi.com",
        "playerId": 737066
    },
    "body": {
        "playerId": 737066,
        "name": "Erling Haaland",
        "birthDate": "2000-07-21T00:00:00.000Z",
        "age": "26",
        "height": "195 cm",
        "shirtNumber": 9,
        "preferredFoot": "Left",
        "country": "Norway",
        "marketValue": "€98.8m",
        "contractEnd": "2034-06-30T00:00:00.000Z",
        "isCaptain": false,
        "status": "active",
        "playerImage": "https://images.fotmob.com/image_resources/playerimages/737066.png",
        "team": {
            "teamId": 8456,
            "name": "Manchester City",
            "onLoan": false
        },
        "position": {
            "primary": "Striker",
            "others": []
        },
        "injury": null,
        "seasonStats": {
            "tournamentId": 47,
            "tournamentName": "Premier League",
            "season": "2026/2027",
            "stats": [
                {
                    "title": "Goals",
                    "value": 5
                },
                {
                    "title": "Assists",
                    "value": 0
                }
            ]
        }
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (422, Error Validations):


{
    "message": "The ticker field is required.",
    "errors": {
        "ticker": [
            "The ticker field is required."
        ]
    }
}
 

Request      

GET v1/football/player

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
playerId required integer

The player id. Example: 737066