Skip to content

Overview

Live scoring platform for tennis and padel.

Beta: This API is under active development. Endpoints and response shapes may change. Rate limits: 10 req/min (public) · 100 req/min (authenticated). Use authenticated requests wherever possible.

Quick Start

graph LR
  App[Your App] -->|REST + JWT| API[MyScore API]
  App -->|Socket.io| API

1. Authenticate via Clerk — send JWT as Authorization: Bearer <token> 2. Fetch data — most read endpoints are public (no auth needed)

Your user profile and player identity are created automatically on your first authenticated request.

Data Model

graph TD
  T[Tournament] --> D[Draw / Bracket]
  D --> M[Match]
  T --> C[Club / Venue]
  C --> CT[Court]
  M --> CT
  M --> P[Player]
ConceptWhat it is
TournamentAn event (e.g. “Summer Open 2026”) with status: draft → registration → live → completed
DrawA bracket within a tournament (e.g. “Men’s Singles”, size 8/16/32/64)
MatchA game between two players, with sets [{ h: 6, g: 4 }, { h: 3, g: 6 }]
ClubA venue with courts
PlayerA participant — can exist without an account, claimable via POST /players/:id/claim

Common Use Cases

Show live matches (no auth required):

  • GET /live/matches — all in-progress matches
  • GET /live/matches?tournamentId=abc — filtered by tournament
  • GET /live/courts/:courtId — what’s playing on a specific court (QR scan)

Browse tournaments & results:

  • GET /tournaments — list tournaments (filter by status, search)
  • GET /tournaments/:id — tournament detail with host clubs
  • GET /draws/:id — full bracket tree with all matches
  • GET /matches/:id — match detail with players and scores

Browse players & clubs:

  • GET /players — search players
  • GET /players/:id/matches — player match history
  • GET /clubs — list clubs
  • GET /clubs/:id/courts — courts at a club

Real-Time Scores (WebSocket)

Connect via Socket.io to receive live score updates:

SubscribeEventPayload
subscribe-matchmatch:scoreUpdate{ matchId, data: { sets }, timestamp }
subscribe-matchmatch:statusUpdated{ matchId, data: { status }, timestamp }
subscribe-tournamenttournament:updated{ tournamentId, data, timestamp }

Tip: Combine WebSocket for instant updates with REST polling as fallback.

Errors

All errors: { statusCode, message, error } — Codes: 401 (auth), 403 (forbidden), 409 (conflict), 422 (validation), 429 (rate limit exceeded)

Try It — Copy & Paste Examples

All examples below work without authentication. Base URL: https://internal.myscore.live/api/v1


List tournaments

curl -s 'https://internal.myscore.live/api/v1/tournaments?perPage=2'
{
  "data": [
    { "id": "1efccb9a-...", "name": "Regional Championship", "status": "upcoming", "sport": "tennis", "surface": "Clay", "startDate": "2024-06-29" },
    { "id": "93ab69fc-...", "name": "Challenger Series", "status": "upcoming", "sport": "tennis", "surface": "Hard Court", "startDate": "2024-03-15" }
  ],
  "meta": { "total": 20, "page": 1, "perPage": 2, "totalPages": 10, "hasNextPage": true }
}

List clubs

curl -s 'https://internal.myscore.live/api/v1/clubs?perPage=2'
{
  "data": [
    { "id": "QUEENS", "name": "Queens Club", "address": "Palliser Road, West Kensington, London W14 9EQ" },
    { "id": "WIMBLEDON", "name": "All England Lawn Tennis Club", "address": "Church Road, Wimbledon, London SW19 5AE" }
  ],
  "meta": { "total": 10, "page": 1, "perPage": 2, "hasNextPage": true }
}

Courts at a club

curl -s 'https://internal.myscore.live/api/v1/clubs/WIMBLEDON/courts'
[
  { "id": "crt_003", "clubId": "WIMBLEDON", "name": "Court 1", "surface": "clay" },
  { "id": "crt_041", "clubId": "WIMBLEDON", "name": "Court 7", "surface": "grass" }
]

Search players

curl -s 'https://internal.myscore.live/api/v1/players?perPage=2'
{
  "data": [
    { "id": "9c385b1c-...", "name": "Ackeem Louth", "nationality": "AUS" },
    { "id": "6871ec37-...", "name": "Alanda Nakamura", "nationality": "MEX" }
  ],
  "meta": { "total": 105, "page": 1, "perPage": 2, "hasNextPage": true }
}

Get a match with scores

curl -s 'https://internal.myscore.live/api/v1/matches?perPage=1'
{
  "data": [
    {
      "id": "mtch_005",
      "status": "completed",
      "sets": [{ "home": 1, "guest": 0 }, { "home": 1, "guest": 4 }],
      "winnerSide": "guest",
      "players": {
        "home": [{ "id": "6b50ef1c-...", "name": "Shellsea Theiler" }],
        "guest": [{ "id": "c0fceeea-...", "name": "Ayleen Keeth" }]
      }
    }
  ],
  "meta": { "total": 58, "page": 1, "perPage": 1 }
}

Live matches (in progress right now)

curl -s 'https://internal.myscore.live/api/v1/live/matches'
{
  "matches": [
    {
      "id": "mtch_006",
      "sets": [{ "home": 6, "guest": 5 }, { "home": 3, "guest": 1 }],
      "home": { "id": "4f5c6951-...", "name": "Alphonsa Defenbaugh" },
      "guest": { "id": "34d20bd1-...", "name": "Raiden Fudala" },
      "status": "in_progress"
    }
  ]
}

Advanced

Tournament management (creating tournaments, draws, scoring, board hardware) is documented in the full Developer Guide.

Information

Enter your Clerk JWT token

Security scheme type: http

Bearer format: JWT