You need an API to fetch competition details fast—names, IDs, and metadata like standings availability—so you can wire it into your fixtures page, league picker, or ingestion pipeline this week. By the end of this article, you’ll be able to query football competitions by country and sport, parse the response you need, and optionally enrich the UI with player details from the same source.
What this API does and when to use it
The 365Scores API on Zyla API Hub exposes structured sports data. For competitions, it returns a list of competitions for a given sport and country, alongside useful metadata such as whether they have standings, statistics, live standings, and the current season number. Typical use cases:
- Populate a country’s competition directory (e.g., show all Portugal football leagues).
- Drive dropdowns for league selection by sport and country.
- Store league identifiers to request related data later (e.g., standings or stats in your own systems).
- Enrich team or player pages with cross-links to competitions they participate in.
You can also pull player-focused data (highlight stats, matches, and full profiles) from the same API to surface context around a competition.
Getting started on Zyla API Hub
Open the 365Scores API listing on Zyla API Hub and subscribe. The Hub runs on a subscription + quota model (not pay-per-call). For new users, the first API typically offers a 7-day trial or 50 requests; check the listing for what’s active right now. Once subscribed, you’ll receive an API key. All requests use the header Authorization: Bearer YOUR_API_KEY.
Start 7-day trial on 365Scores API
Endpoint: Get competitions
This endpoint returns competitions for a given sport and country, along with supporting arrays for sports and countries. It’s a read-only GET on the Zyla API Hub. Include your API key via Authorization: Bearer YOUR_API_KEY.
HTTP method and URL
GET https://zylalabs.com/api/13503/365scores-api/29728/get-competitions
Required query parameters
- sportId: numeric sport identifier (example below uses football: 1)
- countryId: numeric country identifier
- langId: language ID
- timezone: Olson timezone (e.g., Europe/Berlin). URL-encode the slash.
Official cURL example
curl -s -X GET "https://zylalabs.com/api/13503/365scores-api/29728/get-competitions?sportId=1&countryId=11&langId=1&timezone=Europe%2FBerlin" \
-H "Authorization: Bearer YOUR_API_KEY"
Official JSON response
{
"sports": [
{
"id": 1,
"name": "Football",
"nameForURL": "football",
"drawSupport": true,
"imageVersion": 1
}
],
"countries": [
{
"id": 11,
"name": "Portugal",
"nameForURL": "portugal",
"sportTypes": [
2,
8,
1
],
"imageVersion": 1,
"isInternational": false
}
],
"competitions": [
{
"id": 73,
"countryId": 11,
"sportId": 1,
"name": "Liga Portugal",
"longName": "Portuguese Primeira Liga",
"hasStandings": true,
"hasBrackets": false,
"hasStats": true,
"hasTransfers": true,
"hasLiveStandings": false,
"hasStandingsGroups": false,
"hasBets": false,
"totalGames": 0,
"liveGames": 0,
"nameForURL": "liga-portugal",
"popularityRank": 10055229,
"tableName": "Standings",
"currentSeasonNum": 94,
"currentStageNum": 1,
"color": "#000925",
"competitorsType": 1,
"imageVersion": 7,
"hideOnCatalog": false,
"hideOnSearch": false,
"hasCurrentStageStandings": true,
"hasHistory": true,
"isActive": true
},
{
"id": 74,
"countryId": 11,
"sportId": 1,
"name": "Liga Portugal 2",
"shortName": "Liga Pro",
"hasStandings": true,
"hasBrackets": false,
"hasStats": true,
"hasTransfers": true,
"hasLiveStandings": false,
"hasStandingsGroups": false,
"hasBets": false,
"totalGames": 0,
"liveGames": 0,
"nameForURL": "liga-portugal-2",
"popularityRank": 650667,
"tableName": "Standings",
"currentSeasonNum": 38,
"currentStageNum": 1,
"color": "#186839",
"competitorsType": 1,
"imageVersion": 5,
"hideOnCatalog": false,
"hideOnSearch": false,
"hasCurrentStageStandings": true,
"hasHistory": true,
"isActive": true
},
{
"id": 75,
"countryId": 11,
"sportId"…
What you’ll actually use:
- competitions[].id: stable identifier for the competition (store this).
- competitions[].name / longName / nameForURL: display label and SEO-friendly slug.
- competitions[].hasStandings / hasStats / hasTransfers / hasLiveStandings: toggle UI modules.
- competitions[].currentSeasonNum and currentStageNum: context for your season-state display.
- sports[] and countries[]: the resolved sport and country used for your current query.
Timezones: pass a valid timezone (e.g., Europe/Berlin) to ensure date and time fields—when present in other endpoints—are localized as expected. In this endpoint, timezone is still required even though the competition records above do not include formatted dates.
Python example: fetch competitions by country and sport
The snippet below calls the same endpoint and prints the competition IDs, names, and a couple of flags you’re likely to surface in a UI toggle. It uses the exact query string shown in the official cURL so you can copy-paste it and swap your values later.
import requests
API_KEY = "YOUR_API_KEY"
url = "https://zylalabs.com/api/13503/365scores-api/29728/get-competitions"
params = {
"sportId": "1",
"countryId": "11",
"langId": "1",
"timezone": "Europe/Berlin"
}
headers = {"Authorization": f"Bearer {API_KEY}"}
resp = requests.get(url, params=params, headers=headers, timeout=20)
resp.raise_for_status()
data = resp.json()
# Basic validation
competitions = data.get("competitions", [])
for comp in competitions:
cid = comp.get("id")
name = comp.get("name")
has_standings = comp.get("hasStandings")
has_stats = comp.get("hasStats")
print(f"{cid}: {name} | standings={has_standings} stats={has_stats}")
Notes that save time:
- Authorization header is required: Authorization: Bearer YOUR_API_KEY.
- Cache stable lists (competitions) in your app for at least a few minutes to reduce latency.
- Always URL-encode the timezone slash if you assemble the URL manually.
Additional endpoints you can pair with competitions
Beyond competitions, the 365Scores API also lets you fetch player-focused data. These endpoints help when you want to link competitions to player profiles or recent performances. Use the same Authorization header and provide the required query parameters exactly as shown.
Get player details
Returns full details (bio, career, trophies, transfers) about a specific player.
Method: GET
URL: https://zylalabs.com/api/13503/365scores-api/29748/get-player-details
Required params:
- playerId: 153026
- langId: 1
- timezone: Europe/Berlin
The response includes a top-level athletes array with objects that contain profile details such as age, nationalityName, position, formationPosition, shortBio, and highlightStats.
Get player matches
Returns the recent and upcoming matches for a specific player.
Method: GET
URL: https://zylalabs.com/api/13503/365scores-api/29749/get-player-matches
Required params:
- playerId: 153026
- langId: 1
- timezone: Europe/Berlin
The response includes athletes plus supporting arrays for sports and countries. Use this to show a player’s current club and upcoming fixtures alongside competition context.
Get player stats
Returns highlight and career statistics for a specific player.
Method: GET
URL: https://zylalabs.com/api/13503/365scores-api/29750/get-player-stats
Required params:
- playerId: 153026
- langId: 1
- timezone: Europe/Berlin
The response contains athletes with highlightStats that tie stats to competitions (e.g., competitionId and a name such as “Copa do Brasil”). This is useful to cross-reference competition IDs you received earlier.
Putting it together: practical integration patterns
- Country league directory: call Get competitions for your target country and sport to render a list of leagues. Store competitions[].id for downstream usage.
- Competition-aware player pages: when a user navigates to a player page, fetch Get player stats and display stats grouped by competition name. Use competitionId to link back to your league directory.
- Quick filters: filter competitions client-side by flags such as hasStandings or hasStats to expose the right UI modules only when relevant.
- SEO URLs: use nameForURL from competitions to build consistent URL paths (keep your own routing rules; do not assume slugs are unique across all countries).
Call from AI agents via MCP
Every API on Zyla API Hub is callable via the MCP endpoint, which works with MCP-compatible developer tools (e.g., Claude Code, Cursor, Windsurf). Point your client to the MCP endpoint and pass your key as a query parameter:
https://mcp.zylalabs.com/mcp?apikey=YOUR_API_KEY
From there, you can orchestrate tool calls that hit the same Hub endpoints you’ve seen above. For setup details and client-specific configuration, see MCP.
Operational tips
- Authentication: all requests require Authorization: Bearer YOUR_API_KEY.
- Trial and quotas: Zyla uses subscription + quota. The first API typically offers a 7-day trial or 50 requests; check the item page to confirm what’s active.
- Localization: pass langId and timezone consistently across requests so list labels and any time-sensitive fields align in your UI.
- Caching: competitions do not change frequently; cache results to reduce request volume and improve UX.
FAQ
Which parameters are required to list competitions?
Provide sportId, countryId, langId, and timezone on GET https://zylalabs.com/api/13503/365scores-api/29728/get-competitions.
How do I authenticate?
Send Authorization: Bearer YOUR_API_KEY in the request header.
Can I get the current season and whether standings exist?
Yes. The competitions array includes fields like currentSeasonNum and hasStandings to guide your UI.
How do I relate player statistics to a specific competition?
Use Get player stats. It returns highlightStats objects that contain competitionId and name, which you can match to the IDs from Get competitions.
Is there a free plan?
There is no Free Plan. The marketplace uses a subscription + quota model. Check the 365Scores API page for current access options; the first API typically offers a 7-day trial or 50 requests.
Ready to ship your integration? Subscribe and get your key on the listing: Start 7-day trial on 365Scores API. Build on Zyla API Hub’s catalog of more than 10,000 public APIs with one account, one key, and consistent MCP access.
Official API response
{
"sports": [
{
"id": 1,
"name": "Football",
"nameForURL": "football",
"drawSupport": true,
"imageVersion": 1
}
],
"countries": [
{
"id": 11,
"name": "Portugal",
"nameForURL": "portugal",
"sportTypes": [
2,
8,
1
],
"imageVersion": 1,
"isInternational": false
}
],
"competitions": [
{
"id": 73,
"countryId": 11,
"sportId": 1,
"name": "Liga Portugal",
"longName": "Portuguese Primeira Liga",
"hasStandings": true,
"hasBrackets": false,
"hasStats": true,
"hasTransfers": true,
"hasLiveStandings": false,
"hasStandingsGroups": false,
"hasBets": false,
"totalGames": 0,
"liveGames": 0,
"nameForURL": "liga-portugal",
"popularityRank": 10055229,
"tableName": "Standings",
"currentSeasonNum": 94,
"currentStageNum": 1,
"color": "#000925",
"competitorsType": 1,
"imageVersion": 7,
"hideOnCatalog": false,
"hideOnSearch": false,
"hasCurrentStageStandings": true,
"hasHistory": true,
"isActive": true
},
{
"id": 74,
"countryId": 11,
"sportId": 1,
"name": "Liga Portugal 2",
"shortName": "Liga Pro",
"hasStandings": true,
"hasBrackets": false,
"hasStats": true,
"hasTransfers": true,
"hasLiveStandings": false,
"hasStandingsGroups": false,
"hasBets": false,
"totalGames": 0,
"liveGames": 0,
"nameForURL": "liga-portugal-2",
"popularityRank": 650667,
"tableName": "Standings",
"currentSeasonNum": 38,
"currentStageNum": 1,
"color": "#186839",
"competitorsType": 1,
"imageVersion": 5,
"hideOnCatalog": false,
"hideOnSearch": false,
"hasCurrentStageStandings": true,
"hasHistory": true,
"isActive": true
},
{
"id": 75,
"countryId": 11,
"sportId"…
Official API response
{
"sports": [
{
"id": 1,
"name": "Football",
"nameForURL": "football",
"drawSupport": true,
"imageVersion": 1
}
],
"countries": [
{
"id": 11,
"name": "Portugal",
"nameForURL": "portugal",
"sportTypes": [
2,
8,
1
],
"imageVersion": 1,
"isInternational": false
}
],
"competitions": [
{
"id": 73,
"countryId": 11,
"sportId": 1,
"name": "Liga Portugal",
"longName": "Portuguese Primeira Liga",
"hasStandings": true,
"hasBrackets": false,
"hasStats": true,
"hasTransfers": true,
"hasLiveStandings": false,
"hasStandingsGroups": false,
"hasBets": false,
"totalGames": 0,
"liveGames": 0,
"nameForURL": "liga-portugal",
"popularityRank": 10055229,
"tableName": "Standings",
"currentSeasonNum": 94,
"currentStageNum": 1,
"color": "#000925",
"competitorsType": 1,
"imageVersion": 7,
"hideOnCatalog": false,
"hideOnSearch": false,
"hasCurrentStageStandings": true,
"hasHistory": true,
"isActive": true
},
{
"id": 74,
"countryId": 11,
"sportId": 1,
"name": "Liga Portugal 2",
"shortName": "Liga Pro",
"hasStandings": true,
"hasBrackets": false,
"hasStats": true,
"hasTransfers": true,
"hasLiveStandings": false,
"hasStandingsGroups": false,
"hasBets": false,
"totalGames": 0,
"liveGames": 0,
"nameForURL": "liga-portugal-2",
"popularityRank": 650667,
"tableName": "Standings",
"currentSeasonNum": 38,
"currentStageNum": 1,
"color": "#186839",
"competitorsType": 1,
"imageVersion": 5,
"hideOnCatalog": false,
"hideOnSearch": false,
"hasCurrentStageStandings": true,
"hasHistory": true,
"isActive": true
},
{
"id": 75,
"countryId": 11,
"sportId"…