⚽ Football (Soccer)
Football (soccer) API for live scores, fixtures, and season stats worldwide.
- Live, upcoming, and finished matches
- Lineups, events, stats, shotmaps, previews, and head-to-head
- League tables and tournaments
- Teams, squads, players, and transfers
- Season leaderboards for teams and players
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/search
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
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."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.