DataSportsAPI · Schema
Fixture
A single match. Every endpoint and every WebSocket snapshot returns it in this same shape.
SportsLive DataReal-TimeJSON
Properties
| Name | Type | Description |
|---|---|---|
| id | integer | The fixture’s DataSportsAPI id. |
| sport | string | Slug of the sport, matching the values listed by /v2/sports. |
| status | object | Current state of the match. |
| startTime | object | Kick-off time. Holds the scheduled start until the source logs the actual kick-off, which then takes its place (the live feed delivers it a few minutes after play begins). Identical across all endpoin |
| league | object | Competition the fixture belongs to. It is null if the source places the fixture in a competition that has no matching league (observed in minor regional football, e.g. South Africa’s National Second D |
| season | object | Season the fixture is part of. |
| round | object | Round of the fixture, for competitions organised in rounds. |
| home | object | The home team. Null until that slot is settled, e.g. while the source still shows a placeholder like "WQF1" (winner of quarter-final 1). |
| away | object | The away team. Null until that slot is settled (for instance a "WQF1" placeholder from the source). |
| homeScore | object | Score of the home team. |
| awayScore | object | Score of the away team. |
| winner | object | Stays null until status.type is finished, and also when a fight ends as a no contest (`fightResult.method` noContest). When penalties decide the match, this is always the shoot-out winner regardless o |
| venue | object | Where the match is played, if known (frequently null in lower divisions). Populated on /fixtures/{id}, and in date lists when the source provides it. Round, team, player and live lists never include a |
| clock | object | The match clock. Null if the source keeps no clock for this fixture, and after the match ends. |
| firstToServe | object | Deprecated (2026-10-23); mirrors `serving`. Because the source refreshes it each game / leg, it reflects who is serving (throwing) at the moment, not who served first. Use `serving` instead. |
| serving | object | Tennis, darts and other sports with a serve: which side is currently serving (throwing), refreshed by the source every game / leg. Null if the source gives no indication. |
| servedFirst | object | Darts: which side threw the opening dart of the match (`serving` is whoever is throwing now). Fixed for the whole match once play begins; null before that, when the source does not say, and in every o |
| homeSeed | object | For seeded events such as tennis draws or playoff brackets (basketball, …): the seed of the home side ("1", "12") or its entry status ("WC" wild card, "Q" qualifier, "LL" lucky loser, "PR" protected r |
| awaySeed | object | Seed or entry status of the away side; see homeSeed. |
| note | object | Cricket: the match note supplied by the source, which becomes the result line at the end ("Pakistan beat Sri Lanka by 37 runs"). Intended for display only. |
| battingSide | object | Cricket: which side is currently at the crease. Null outside a live innings and in every other sport. |
| fightResult | object | MMA / boxing: how, in which round and at what time the fight ended. Null before status.type reaches finished, and when the source supplies no method. |
| fightDiscipline | object | Combat sports: the bout’s discipline, when the source labels it (the `mma` sport includes boxing, kickboxing and Muay Thai cards as well). Only some cards are labelled (ONE, Queensbury, certain OKTAGO |
| referee | object | Match official, if the source names one (football and a few other sports; in cricket, the match referee). Present on /fixtures/{id}; always null in lists, where it is omitted. |
| homeManager | object | Manager or head coach of the home side for this match, if the source names one. Present on /fixtures/{id}; null in lists. |
| awayManager | object | Manager or head coach of the away side; behaves like homeManager. |
| surface | object | Tennis: the surface the match is played on. Present on /fixtures/{id} and in live lists; null in other sports. |
| discipline | object | Tennis: whether it is singles or doubles. Present on every fixture endpoint, in lists and in WebSocket snapshots; null in other sports and when the source specifies neither. Since 2026-11-11. |
| toss | object | Cricket: the toss result, after it has taken place. Present on /fixtures/{id}; null in other sports. |
| umpires | object | Cricket: the on-field umpires, named as the source writes them (frequently with a country code, e.g. "Asif Yaqoob (PAK)"). Null when none are listed and in other sports. |
| tvUmpire | object | Cricket: the TV (third) umpire, formatted as for umpires. |
| previousLegFixtureId | object | Two-legged ties and playoff series: the DataSportsAPI id of the preceding leg / game, when the source links the two. Look that id up on /fixtures/{id} to get the first-leg score. |
| aggregateWinner | object | Once the return leg of a two-legged tie is over: the side that went through. Taken from the source’s verdict when available; otherwise from `aggregated` (the higher total advances) or, if the aggregat |
| fightCard | object | MMA / boxing: the bout’s section of the card, its running order and its weight class, if the source lists them. |
| attendance | object | Crowd figure, if the source reports one (observed for NBA and MLB games, frequently only after the game has started). Present on /fixtures/{id}; omitted (null) in lists. |
| matchFormat | object | Darts and esports: the format of the match (best of N sets / legs / games), if the source states it. Null in other sports. |
| inningState | object | Baseball: the live game situation — inning, half, balls, strikes, outs and runners on base. Null when the game is not in progress or interrupted, and in other sports. Delivered live via WebSocket delt |
| timeouts | object | Basketball: timeouts each side has left. Null outside an in-progress or interrupted game, and whenever the source does not track them. Delivered live via WebSocket deltas. |
| downAndDistance | object | American football: the current down, distance and field position. Null when the game is not in progress or interrupted, and in other sports. Delivered live via WebSocket deltas. Available since 2026-1 |
| varCheck | object | Football: an ongoing VAR review. Null when no review is under way, outside play and in other sports. Delivered live via WebSocket deltas. Available since 2026-11-09. |
| bonus | object | Basketball: whether each side is in the bonus. Null outside an in-progress or interrupted game, and whenever the source does not report it. The source’s live feed never carries it, so it appears in RE |
| finalResultOnly | boolean | True if the source provides only the final result for this fixture, with no live score, clock or events during play (available since 2026-11-09). |
| durations | object | Sports played in sets or rounds: the length of every finished period (available since 2026-11-04). Null for sports the source does not time by period (football, basketball, …) and until the first peri |
| lineupsAvailable | object | Becomes true when the source publishes lineups for the fixture, whether predicted or official (check `confirmed` on /v2/fixtures/{id}/lineups to tell them apart), and false if they are withdrawn. We s |
| lineupsConfirmed | object | Becomes true when the official lineups are released (matching `confirmed` on /v2/fixtures/{id}/lineups); otherwise behaves like lineupsAvailable, with null meaning we have no information. Delivered li |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/datasportsapi/json-schema/datasportsapi-fixture-schema.json",
"title": "Fixture",
"description": "A single match. Every endpoint and every WebSocket snapshot returns it in this same shape.",
"x-generated": "2026-11-12",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/datasportsapi-openapi.json#/components/schemas/Fixture",
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The fixture’s DataSportsAPI id."
},
"sport": {
"type": "string",
"description": "Slug of the sport, matching the values listed by /v2/sports."
},
"status": {
"$ref": "#/$defs/Status",
"description": "Current state of the match."
},
"startTime": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"description": "Kick-off time. Holds the scheduled start until the source logs the actual kick-off, which then takes its place (the live feed delivers it a few minutes after play begins). Identical across all endpoints and WebSocket deltas."
},
"league": {
"anyOf": [
{
"$ref": "#/$defs/LeagueRef"
},
{
"type": "null"
}
],
"description": "Competition the fixture belongs to. It is null if the source places the fixture in a competition that has no matching league (observed in minor regional football, e.g. South Africa’s National Second Division on 2026-10-23); in that case season and round are null as well."
},
"season": {
"anyOf": [
{
"$ref": "#/$defs/Season"
},
{
"type": "null"
}
],
"description": "Season the fixture is part of."
},
"round": {
"anyOf": [
{
"$ref": "#/$defs/Round"
},
{
"type": "null"
}
],
"description": "Round of the fixture, for competitions organised in rounds."
},
"home": {
"anyOf": [
{
"$ref": "#/$defs/TeamRef"
},
{
"type": "null"
}
],
"description": "The home team. Null until that slot is settled, e.g. while the source still shows a placeholder like \"WQF1\" (winner of quarter-final 1)."
},
"away": {
"anyOf": [
{
"$ref": "#/$defs/TeamRef"
},
{
"type": "null"
}
],
"description": "The away team. Null until that slot is settled (for instance a \"WQF1\" placeholder from the source)."
},
"homeScore": {
"$ref": "#/$defs/ScoreSide",
"description": "Score of the home team."
},
"awayScore": {
"$ref": "#/$defs/ScoreSide",
"description": "Score of the away team."
},
"winner": {
"anyOf": [
{
"$ref": "#/$defs/Winner"
},
{
"type": "null"
}
],
"description": "Stays null until status.type is finished, and also when a fight ends as a no contest (`fightResult.method` noContest). When penalties decide the match, this is always the shoot-out winner regardless of the source (which, on a second leg, reports the team that won the 90 minutes). If the source omits the winner, or declares a draw in a sport where draws are impossible (finishes in regular time or overtime; cricket excluded), we derive it from the score."
},
"venue": {
"anyOf": [
{
"$ref": "#/$defs/Venue"
},
{
"type": "null"
}
],
"description": "Where the match is played, if known (frequently null in lower divisions). Populated on /fixtures/{id}, and in date lists when the source provides it. Round, team, player and live lists never include a venue, so a null there means \"omitted\" rather than \"unknown\" — fetch /fixtures/{id} to get it."
},
"clock": {
"anyOf": [
{
"$ref": "#/$defs/Clock"
},
{
"type": "null"
}
],
"description": "The match clock. Null if the source keeps no clock for this fixture, and after the match ends."
},
"firstToServe": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Deprecated (2026-10-23); mirrors `serving`. Because the source refreshes it each game / leg, it reflects who is serving (throwing) at the moment, not who served first. Use `serving` instead."
},
"serving": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Tennis, darts and other sports with a serve: which side is currently serving (throwing), refreshed by the source every game / leg. Null if the source gives no indication."
},
"servedFirst": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Darts: which side threw the opening dart of the match (`serving` is whoever is throwing now). Fixed for the whole match once play begins; null before that, when the source does not say, and in every other sport (only darts data carries it). Since 2026-11-11."
},
"homeSeed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "For seeded events such as tennis draws or playoff brackets (basketball, …): the seed of the home side (\"1\", \"12\") or its entry status (\"WC\" wild card, \"Q\" qualifier, \"LL\" lucky loser, \"PR\" protected ranking, …), exactly as shown in the draw. Null for an unseeded side."
},
"awaySeed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Seed or entry status of the away side; see homeSeed."
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Cricket: the match note supplied by the source, which becomes the result line at the end (\"Pakistan beat Sri Lanka by 37 runs\"). Intended for display only."
},
"battingSide": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Cricket: which side is currently at the crease. Null outside a live innings and in every other sport."
},
"fightResult": {
"anyOf": [
{
"$ref": "#/$defs/FightResult"
},
{
"type": "null"
}
],
"description": "MMA / boxing: how, in which round and at what time the fight ended. Null before status.type reaches finished, and when the source supplies no method."
},
"fightDiscipline": {
"anyOf": [
{
"$ref": "#/$defs/FightDiscipline"
},
{
"type": "null"
}
],
"description": "Combat sports: the bout’s discipline, when the source labels it (the `mma` sport includes boxing, kickboxing and Muay Thai cards as well). Only some cards are labelled (ONE, Queensbury, certain OKTAGON fights; never UFC or PFL), so a null value does not imply MMA."
},
"referee": {
"anyOf": [
{
"$ref": "#/$defs/Referee"
},
{
"type": "null"
}
],
"description": "Match official, if the source names one (football and a few other sports; in cricket, the match referee). Present on /fixtures/{id}; always null in lists, where it is omitted."
},
"homeManager": {
"anyOf": [
{
"$ref": "#/$defs/ManagerRef"
},
{
"type": "null"
}
],
"description": "Manager or head coach of the home side for this match, if the source names one. Present on /fixtures/{id}; null in lists."
},
"awayManager": {
"anyOf": [
{
"$ref": "#/$defs/ManagerRef"
},
{
"type": "null"
}
],
"description": "Manager or head coach of the away side; behaves like homeManager."
},
"surface": {
"anyOf": [
{
"$ref": "#/$defs/Surface"
},
{
"type": "null"
}
],
"description": "Tennis: the surface the match is played on. Present on /fixtures/{id} and in live lists; null in other sports."
},
"discipline": {
"anyOf": [
{
"$ref": "#/$defs/MatchDiscipline"
},
{
"type": "null"
}
],
"description": "Tennis: whether it is singles or doubles. Present on every fixture endpoint, in lists and in WebSocket snapshots; null in other sports and when the source specifies neither. Since 2026-11-11."
},
"toss": {
"anyOf": [
{
"$ref": "#/$defs/CricketToss"
},
{
"type": "null"
}
],
"description": "Cricket: the toss result, after it has taken place. Present on /fixtures/{id}; null in other sports."
},
"umpires": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Cricket: the on-field umpires, named as the source writes them (frequently with a country code, e.g. \"Asif Yaqoob (PAK)\"). Null when none are listed and in other sports."
},
"tvUmpire": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Cricket: the TV (third) umpire, formatted as for umpires."
},
"previousLegFixtureId": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Two-legged ties and playoff series: the DataSportsAPI id of the preceding leg / game, when the source links the two. Look that id up on /fixtures/{id} to get the first-leg score."
},
"aggregateWinner": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Once the return leg of a two-legged tie is over: the side that went through. Taken from the source’s verdict when available; otherwise from `aggregated` (the higher total advances) or, if the aggregate is level, from the shoot-out. Null in every other case, including a level aggregate the source leaves unresolved (an away-goals rule). Compare `winner`, which refers to this match alone: when a second leg goes to penalties both fields name the shoot-out winner, but otherwise they can disagree (a side may win the second leg yet be eliminated). Filled on /fixtures/{id}; in lists and live snapshots it can be null."
},
"fightCard": {
"anyOf": [
{
"$ref": "#/$defs/FightCard"
},
{
"type": "null"
}
],
"description": "MMA / boxing: the bout’s section of the card, its running order and its weight class, if the source lists them."
},
"attendance": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Crowd figure, if the source reports one (observed for NBA and MLB games, frequently only after the game has started). Present on /fixtures/{id}; omitted (null) in lists."
},
"matchFormat": {
"anyOf": [
{
"$ref": "#/$defs/MatchFormat"
},
{
"type": "null"
}
],
"description": "Darts and esports: the format of the match (best of N sets / legs / games), if the source states it. Null in other sports."
},
"inningState": {
"anyOf": [
{
"$ref": "#/$defs/InningState"
},
{
"type": "null"
}
],
"description": "Baseball: the live game situation — inning, half, balls, strikes, outs and runners on base. Null when the game is not in progress or interrupted, and in other sports. Delivered live via WebSocket deltas."
},
"timeouts": {
"anyOf": [
{
"$ref": "#/$defs/Timeouts"
},
{
"type": "null"
}
],
"description": "Basketball: timeouts each side has left. Null outside an in-progress or interrupted game, and whenever the source does not track them. Delivered live via WebSocket deltas."
},
"downAndDistance": {
"anyOf": [
{
"$ref": "#/$defs/DownAndDistance"
},
{
"type": "null"
}
],
"description": "American football: the current down, distance and field position. Null when the game is not in progress or interrupted, and in other sports. Delivered live via WebSocket deltas. Available since 2026-11-09."
},
"varCheck": {
"anyOf": [
{
"$ref": "#/$defs/VarCheck"
},
{
"type": "null"
}
],
"description": "Football: an ongoing VAR review. Null when no review is under way, outside play and in other sports. Delivered live via WebSocket deltas. Available since 2026-11-09."
},
"bonus": {
"anyOf": [
{
"$ref": "#/$defs/BasketballBonus"
},
{
"type": "null"
}
],
"description": "Basketball: whether each side is in the bonus. Null outside an in-progress or interrupted game, and whenever the source does not report it. The source’s live feed never carries it, so it appears in REST responses and lists only. Available since 2026-11-09."
},
"finalResultOnly": {
"type": "boolean",
"description": "True if the source provides only the final result for this fixture, with no live score, clock or events during play (available since 2026-11-09)."
},
"durations": {
"anyOf": [
{
"$ref": "#/$defs/Durations"
},
{
"type": "null"
}
],
"description": "Sports played in sets or rounds: the length of every finished period (available since 2026-11-04). Null for sports the source does not time by period (football, basketball, …) and until the first period is over. Delivered live via WebSocket deltas."
},
"lineupsAvailable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Becomes true when the source publishes lineups for the fixture, whether predicted or official (check `confirmed` on /v2/fixtures/{id}/lineups to tell them apart), and false if they are withdrawn. We set it the moment the source’s live feed announces lineups, or when a lineup we fetch contains players. Null means we have no information yet (no announcement observed, nothing fetched). WebSocket deltas carry it live — on fixture:{id} from before kick-off, and on the list channels once play starts. Available since 2026-11-04."
},
"lineupsConfirmed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Becomes true when the official lineups are released (matching `confirmed` on /v2/fixtures/{id}/lineups); otherwise behaves like lineupsAvailable, with null meaning we have no information. Delivered live via WebSocket deltas. Available since 2026-11-04."
}
},
"required": [
"id",
"sport",
"status",
"startTime",
"league",
"season",
"round",
"home",
"away",
"homeScore",
"awayScore",
"winner",
"venue",
"clock",
"firstToServe",
"serving",
"servedFirst",
"homeSeed",
"awaySeed",
"note",
"battingSide",
"fightResult",
"fightDiscipline",
"referee",
"homeManager",
"awayManager",
"surface",
"discipline",
"toss",
"umpires",
"tvUmpire",
"previousLegFixtureId",
"aggregateWinner",
"fightCard",
"attendance",
"matchFormat",
"inningState",
"timeouts",
"downAndDistance",
"varCheck",
"bonus",
"finalResultOnly",
"durations",
"lineupsAvailable",
"lineupsConfirmed"
],
"$defs": {
"Bases": {
"type": "object",
"description": "Baseball: occupancy of each base.",
"properties": {
"first": {
"type": "boolean",
"description": "True when first base is occupied."
},
"second": {
"type": "boolean",
"description": "True when second base is occupied."
},
"third": {
"type": "boolean",
"description": "True when third base is occupied."
}
},
"required": [
"first",
"second",
"third"
]
},
"BasketballBonus": {
"type": "object",
"description": "Basketball: bonus (penalty situation) status for each side, as reported by the source (available since 2026-11-09).",
"properties": {
"home": {
"type": "boolean",
"description": "True when the home side is in the bonus, so the away side’s next team foul awards it free throws."
},
"away": {
"type": "boolean",
"description": "True when the away side is in the bonus."
}
},
"required": [
"home",
"away"
]
},
"Clock": {
"type": "object",
"description": "Timing data for a match. Running clocks (football, rugby, …): compute elapsed = periodOffsetSeconds + (now − periodStartedAt) and minute = floor(elapsed / 60) + 1; once periodEndSeconds is passed, display periodEndSeconds / 60 followed by \"+\" and the extra minutes. This applies only while status.phase is inprogress. Stop clocks (basketball, handball, ice hockey, …): playedSeconds is the value at playedAt and advances only while `running` is true. Tennis, table tennis, badminton and esports (set / map sports) carry only `periodStartedAt` (start of the current set or map), and only if the source sends it — the clock as a whole is frequently null. A field is null whenever the source does not provide it for that sport; the entire clock is null when no clock exists and after the match ends. Lists other than /fixtures/{id} may include fewer clock fields (static values such as periodLengthSeconds can be null there).",
"properties": {
"periodStartedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"description": "Moment the clock for the current period was started."
},
"periodOffsetSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Running clock: seconds already on the clock at the start of the period (2700 for the second half in football). Unit: seconds."
},
"periodEndSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Running clock: clock reading, in seconds, at which regulation time for the period runs out (2700 for the first half in football). Unit: seconds."
},
"maxExtraSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Running clock: upper bound on the added time the source’s display permits after periodEndSeconds. Unit: seconds."
},
"injuryTimeMinutes": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stoppage time announced for the current period. Unit: minutes."
},
"playedSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stop clock: time played in seconds, valid at `playedAt`. Unit: seconds."
},
"playedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"description": "Timestamp at which `playedSeconds` was captured."
},
"running": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Stop clock: true while the game clock is ticking."
},
"runningUpdatedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"description": "Time of the most recent change to `running`."
},
"periodLengthSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stop clock: duration of a single regulation period. Unit: seconds."
},
"overtimeLengthSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Duration of a single overtime period. Unit: seconds."
},
"periodCount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "How many regulation periods the match has (in combat sports, the scheduled rounds)."
},
"lastPeriodEndedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"description": "End time of the latest completed period. During a break (half-time, between periods) this marks when the break started, so the break has lasted now − lastPeriodEndedAt. Used with football-style running clocks; null if the source sends nothing (before the first break, in other sports, or for data stored before 2026-11-04). Available since 2026-11-04."
}
},
"required": [
"periodStartedAt",
"periodOffsetSeconds",
"periodEndSeconds",
"maxExtraSeconds",
"injuryTimeMinutes",
"playedSeconds",
"playedAt",
"running",
"runningUpdatedAt",
"periodLengthSeconds",
"overtimeLengthSeconds",
"periodCount",
"lastPeriodEndedAt"
]
},
"Country": {
"type": "object",
"description": "A country record.",
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Two-letter code supplied by the source. ISO 3166-1 alpha-2, apart from XK for Kosovo and four codes for the UK home nations (England EN, Scotland SX, Wales WA, Northern Ireland NX). Null if unknown."
},
"name": {
"type": "string",
"description": "Country name in English."
},
"flag": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Flag image (PNG) hosted on our CDN. Null when there is no code or the image has not been uploaded yet. Available since 2026-11-04."
}
},
"required": [
"code",
"name",
"flag"
]
},
"CricketInnings": {
"type": "object",
"description": "A single cricket innings played by one side.",
"properties": {
"runs": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Total runs made."
},
"wickets": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Number of wickets that have fallen."
},
"overs": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Overs delivered, in cricket notation (49.5 means 49 overs plus 5 balls)."
},
"runRate": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Average runs scored per over."
},
"targetRunRate": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Run rate the chasing side needs to reach its target."
}
},
"required": [
"runs",
"wickets",
"overs",
"runRate",
"targetRunRate"
]
},
"CricketToss": {
"type": "object",
"description": "Cricket: outcome of the coin toss.",
"properties": {
"winner": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Toss winner; null if the team the source names matches neither participant."
},
"decision": {
"anyOf": [
{
"$ref": "#/$defs/TossDecision"
},
{
"type": "null"
}
],
"description": "The choice the toss winner made."
}
},
"required": [
"winner",
"decision"
]
},
"DownAndDistance": {
"type": "object",
"description": "American football: current down, distance and field position as tracked by the source (available since 2026-11-09). The live feed pushes an update after every play; fields not included in an update keep their previous value.",
"properties": {
"down": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "The down in play (1–4); null on a kickoff and on the try that follows a touchdown."
},
"yardsToGo": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Yards needed for a first down (or to the goal line when goalToGo); null when there is no down."
},
"possession": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Side in possession of the ball."
},
"ballOn": {
"anyOf": [
{
"$ref": "#/$defs/Side"
},
{
"type": "null"
}
],
"description": "Half of the field the ball is in; combined with yardLine, \"home 35\" means the home side’s 35-yard line."
},
"yardLine": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Yard line within that half (50 is midfield)."
},
"goalToGo": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "True if the goal line is the line to gain (the source calls it isGoalPossession)."
},
"playType": {
"anyOf": [
{
"$ref": "#/$defs/DownPlayType"
},
{
"type": "null"
}
],
"description": "Kind of play the ball is set up for: scrimmage play, kickoff or try."
}
},
"required": [
"down",
"yardsToGo",
"possession",
"ballOn",
"yardLine",
"goalToGo",
"playType"
]
},
"DownPlayType": {
"type": "string",
"enum": [
"scrimmage",
"kickoff",
"conversion",
"other"
],
"description": "American football: what type of play the ball is spotted for.",
"x-enumDescriptions": {
"scrimmage": "A scrimmage play, for which downs count.",
"kickoff": "A kickoff, which uses no down.",
"conversion": "The try after a touchdown — a kick for the extra point or a two-point attempt — with no down in play.",
"other": "Any play type missing from this list."
}
},
"Durations": {
"type": "object",
"description": "Period lengths for sports played in sets or rounds (tennis, table tennis, badminton, volleyball, MMA, …), as timed by our data source.",
"properties": {
"periods": {
"type": "object",
"propertyNames": {
"$ref": "#/$defs/PeriodKey"
},
"additionalProperties": {
"type": "number"
},
"description": "Duration in seconds of every COMPLETED period, using the same keys as ScoreSide.periods (in tennis period1 is the first set; in MMA / boxing the keys are the rounds). The period under way is excluded; its start is clock.periodStartedAt."
},
"totalSeconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Adds up `periods`: once the match has ended this is its playing time, not counting breaks between periods. Null when `periods` is empty. Unit: seconds."
}
},
"required": [
"periods",
"totalSeconds"
]
},
"FightCard": {
"type": "object",
"description": "MMA / boxing: a bout’s placement on the event card.",
"properties": {
"section": {
"anyOf": [
{
"$ref": "#/$defs/FightCardSection"
},
{
"type": "null"
}
],
"description": "The part of the card (main card, prelims, …), if the source specifies it."
},
"order": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Position of the bout in the source’s numbering of the card; larger numbers come later, and the main event carries the largest."
},
"weightClass": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Weight class of the bout, using the source’s naming (\"light\", \"bantam\", \"feather\", …)."
}
},
"required": [
"section",
"order",
"weightClass"
]
},
"FightCardSection": {
"type": "string",
"enum": [
"mainCard",
"prelims",
"earlyPrelims",
"other"
],
"description": "Which section of a fight card a bout belongs to.",
"x-enumDescriptions": {
"mainCard": "Part of the main card.",
"prelims": "Part of the preliminary card.",
"earlyPrelims": "Part of the early preliminary card.",
"other": "A section without a mapping yet; we log the
# --- truncated at 32 KB (68 KB total) ---
# Full source: https://artifacts.apis.io/datasportsapi/json-schema/datasportsapi-fixture-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/datasportsapi-fixture"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.