Live Tennis API · Schema

Player

CompanySportsDataReal-timeAPITennis

Properties

Name Type Description
id integer
name string
tour stringnull The circuit the player is filed under: atp | wta | null (normalised 2026-09-24 — the capitalised and level values no longer appear). Not the competition level (use the match's tier) and not the draw (
country stringnull
ranking integernull Official singles ranking POSITION (the ordinal: 1, 25, 100) — never points, seed, race, UTR, Elo or a doubles rank. Men from the official ATP table, women from the WTA table, chosen by the player (a C
ranking_points integernull Points on the same official table, refreshed with `ranking`.
ranking_status stringnull What the last reconcile against the published ATP/WTA singles tables found (added 2026-09-23). `ranked` = on the table (`ranking` is that row). `unranked` = the full table was fetched and the player w
ranking_checked_at stringnull When that reconcile ran, UTC (added 2026-09-23).
ranking_movement stringnull
itf_ranking objectnull Added 2026-10-12, paid tiers (BASIC, PRO, ULTRA), null on a FREE key. The player's CURRENT rank on the ITF's own published World Tennis Tour ranking — the rank most ITF and junior players hold while t
hand stringnull
backhand integernull
birthday stringnull
height_cm integernull Added 2026-10-22. Single-player read (`/players/{playerId}`) only; paid tiers (BASIC, PRO, ULTRA), null on a FREE key. Height in centimetres from the results archive's record of the same person. Null
doubles_ranking objectnull Added 2026-10-22. Single-player read (`/players/{playerId}`) only; paid tiers (BASIC, PRO, ULTRA), null on a FREE key. The current position on the official ATP/WTA doubles table, from our weekly refre
itf_id integernull ULTRA only (added 2026-09-24). The player's identifier in the ITF ranking tables we publish under `system=itf_*` — the `itf_jt` / `itf_mt` / `itf_wt` rows of `/rankings` are linked to this player by i
is_doubles_team boolean
profile_restated_at stringnull When the published PROFILE of this player was LAST corrected (UTC), added 2026-10-05 — the player twin of `result_restated_at`. A correction is a change to a published profile field after it was first
profile_version integer 1 plus the number of corrections to the published profile (added 2026-10-05), the player twin of `result_version`. 1 = the profile stands as first published. Record it with the profile you hold and co
archive_player_id integernull The player's person id in the results archive (added 2026-09-23) — the id `/history/archive/players` publishes as `id` and archive match rows carry as `winner.player_id` / `loser.player_id`. Scoped by
data_completeness object How much biographical detail is known for this player, so a consumer can distinguish "never published" from "not yet filled in" without probing. Present on every player in a match payload. Lower tours
stats object Single-player endpoint only
View JSON Schema on GitHub

JSON Schema

livetennisapi-com-player-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/livetennisapi-com/json-schema/livetennisapi-com-player-schema.json",
  "title": "Player",
  "x-generated": "2026-10-28",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/livetennisapi-com-openapi.yaml#/components/schemas/Player",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    },
    "tour": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "atp",
        "wta",
        null
      ],
      "description": "The circuit the player is filed under: atp | wta | null (normalised 2026-09-24 — the capitalised and level values no longer appear). Not the competition level (use the match's tier) and not the draw (use the match's draw). A doubles team filed under a circuit of its own carries that circuit; one filed under a level word or nothing falls back to the circuit both its members are filed under, and is null when they disagree or either is unknown. null means not filed, never a guess. Distinct from the match-level tour, whose vocabulary is the tour-group filter's (atp | wta | challenger | itf | juniors)."
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "ranking": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Official singles ranking POSITION (the ordinal: 1, 25, 100) — never points, seed, race, UTR, Elo or a doubles rank. Men from the official ATP table, women from the WTA table, chosen by the player (a Challenger or ITF man who holds an ATP ranking carries it here). Refreshed from the standings ahead of each match the player has with us; a player who has not played recently keeps their last refreshed position. `null` when no ranking is held (doubles teams, most ITF/junior-only players). Always the CURRENT record, even on historical matches — use `/rankings?as_of=` for the rank in force on a date."
    },
    "ranking_points": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Points on the same official table, refreshed with `ranking`."
    },
    "ranking_status": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "ranked",
        "unranked",
        "unverified",
        null
      ],
      "description": "What the last reconcile against the published ATP/WTA singles tables found (added 2026-09-23). `ranked` = on the table (`ranking` is that row). `unranked` = the full table was fetched and the player was not on it (a `ranking` here is the last value held, not current). `unverified` = could not be checked (no id, a name mismatch, or never checked). Null on doubles teams."
    },
    "ranking_checked_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "When that reconcile ran, UTC (added 2026-09-23)."
    },
    "ranking_movement": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "up",
        "down",
        "same",
        null
      ]
    },
    "itf_ranking": {
      "type": [
        "object",
        "null"
      ],
      "description": "Added 2026-10-12, paid tiers (BASIC, PRO, ULTRA), null on a FREE key. The player's CURRENT rank on the ITF's own published World Tennis Tour ranking — the rank most ITF and junior players hold while they have no ATP/WTA one. `system` names the circuit (`itf_mt` men's pro, `itf_wt` women's pro, `itf_jt` juniors); a player ranked on a pro circuit and the junior one carries the pro rank. `rank_date` is the ITF's publication date of that row (weekly), so a stale rank is visible as such. NOT comparable with `ranking` (a circuit rank 1 is tens of points) and never written into it. Joined by the same exact ITF id `itf_id` exposes at ULTRA, never by name. Null when no ITF link is held, when that id is held by more than one roster row, when no published row exists, and on doubles teams. The weekly history of these ranks stays at `/rankings?system=itf_*` (ULTRA).",
      "properties": {
        "system": {
          "type": "string",
          "enum": [
            "itf_mt",
            "itf_wt",
            "itf_jt"
          ]
        },
        "rank": {
          "type": "integer"
        },
        "points": {
          "type": [
            "number",
            "null"
          ]
        },
        "rank_date": {
          "type": "string",
          "format": "date"
        }
      },
      "required": [
        "system",
        "rank",
        "points",
        "rank_date"
      ]
    },
    "hand": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "R",
        "L",
        null
      ]
    },
    "backhand": {
      "type": [
        "integer",
        "null"
      ],
      "enum": [
        1,
        2,
        null
      ]
    },
    "birthday": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "height_cm": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Added 2026-10-22. Single-player read (`/players/{playerId}`) only; paid tiers (BASIC, PRO, ULTRA), null on a FREE key. Height in centimetres from the results archive's record of the same person. Null when the player has no archive record or the archive holds no height. Never inferred."
    },
    "doubles_ranking": {
      "type": [
        "object",
        "null"
      ],
      "description": "Added 2026-10-22. Single-player read (`/players/{playerId}`) only; paid tiers (BASIC, PRO, ULTRA), null on a FREE key. The current position on the official ATP/WTA doubles table, from our weekly refresh of the published tables. `observed_on` is the UTC date that refresh last found the player on the table. Null when the player is not on the table or the last sighting is more than 21 days old. Never copied into `ranking`, which stays the singles position.",
      "properties": {
        "rank": {
          "type": "integer"
        },
        "points": {
          "type": [
            "integer",
            "null"
          ]
        },
        "observed_on": {
          "type": "string",
          "format": "date"
        }
      }
    },
    "itf_id": {
      "type": [
        "integer",
        "null"
      ],
      "description": "ULTRA only (added 2026-09-24). The player's identifier in the ITF ranking tables we publish under `system=itf_*` — the `itf_jt` / `itf_mt` / `itf_wt` rows of `/rankings` are linked to this player by it (an id join, never a name match). One human's id across singles and doubles rows, so a join key, not a per-row primary key. Null when no ITF link is held and on doubles teams. Absent, not null, below ULTRA."
    },
    "is_doubles_team": {
      "type": "boolean"
    },
    "profile_restated_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "When the published PROFILE of this player was LAST corrected (UTC), added 2026-10-05 — the player twin of `result_restated_at`. A correction is a change to a published profile field after it was first published; today that is the name (where the held name was another person's, from 2026-10-06) or the birth date, corrected to the results archive's record of the same person where the two disagreed. Null while the profile stands as first published. Poll `GET /players?restated_since=` to find corrections."
    },
    "profile_version": {
      "type": "integer",
      "description": "1 plus the number of corrections to the published profile (added 2026-10-05), the player twin of `result_version`. 1 = the profile stands as first published. Record it with the profile you hold and compare on re-read — a higher number means a field you hold was superseded."
    },
    "archive_player_id": {
      "type": [
        "integer",
        "null"
      ],
      "description": "The player's person id in the results archive (added 2026-09-23) — the id `/history/archive/players` publishes as `id` and archive match rows carry as `winner.player_id` / `loser.player_id`. Scoped by `tour` (men and women are numbered independently). Set by a tour-scoped link built offline from names and birth dates; null where none exists. Measured 2026-09-23: 35 of 5,914 links (0.6%) pointed at a differently named person; all 35 repaired on 2026-09-24. Confirm with name and birthday where identity matters."
    },
    "data_completeness": {
      "type": "object",
      "description": "How much biographical detail is known for this player, so a consumer can distinguish \"never published\" from \"not yet filled in\" without probing. Present on every player in a match payload. Lower tours carry far less of it than main tour.",
      "properties": {
        "known": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Fields populated, of `of`. NULL on a doubles team, where per-player biography does not apply — distinct from `0`, which means the fields apply and none are known. Do not decode this into a non-nullable integer."
        },
        "of": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Fields considered. NULL on a doubles team, as for `known`."
        },
        "missing": {
          "type": "array",
          "description": "Names of the unpopulated fields, e.g. [\"backhand\", \"hand\"].",
          "items": {
            "type": "string"
          }
        },
        "note": {
          "type": "string",
          "description": "Present only when the object is not applicable, explaining why (e.g. a doubles team)."
        }
      }
    },
    "stats": {
      "type": "object",
      "description": "Single-player endpoint only",
      "properties": {
        "ratings": {
          "type": [
            "object",
            "null"
          ]
        },
        "ratings_as_of": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "The date (UTC) the `ratings` block was last refreshed (added 2026-09-10). The current Elo is refreshed every week from the published rating tables; read this before treating a rating as this week's. Null when there is no rating."
        },
        "season": {
          "type": [
            "array",
            "null"
          ]
        }
      }
    }
  }
}

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.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/livetennisapi-com-player"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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.