My Court Score Developer Platform

Conecta tus aplicaciones al tenis en directo

Una API REST versionada para partidos, marcadores en directo, jugadores, clubes y torneos.

Importante: cada recurso pertenece a la clave API que lo creó

La propiedad se comprueba con la clave API exacta, no solo con la cuenta de desarrollador o la cuenta My Court Score vinculada.

Ejemplo: la clave A crea el partido 125. Solo la clave A puede modificarlo, añadir un punto o eliminarlo. La clave B será rechazada.

Mantén una clave estable por integración y entorno. Revocarla o perderla elimina el acceso de escritura a los recursos que creó. resource_owned_by_another_api_key · resource_not_created_by_api_key

API para desarrolladores

Create a separate developer identity, then link it to the player or club account whose data the integration may manage.
Nuevo desarrollador

Crear una cuenta de desarrollador

Crea tu espacio de desarrollador para generar y administrar tus claves API.

Inicio rápido

JSON over HTTPS. All protected calls use a bearer key.
Descargar OpenAPI JSON
Base URLhttps://mycourtscore.com/api/v1
AuthenticationAuthorization: Bearer mcs_live_...
Formatapplication/json · UTF-8 · OpenAPI 3.1

Read your API identity

curl "https://mycourtscore.com/api/v1/me" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Create a match without duplicate risk

curl -X POST "https://mycourtscore.com/api/v1/matches" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: match-2026-09-27-001" \
  -d '{"player1":"Lucas Martin","player2":"Nathan Smith","sets_to_win":2}'

Write requests may use an Idempotency-Key header to prevent duplicate resources or actions after a network retry. Responses include X-Request-Id and rate-limit headers.

Propiedad estricta: un recurso solo puede modificarse, eliminarse o utilizarse en una acción de escritura con la misma clave API que lo creó.

Webhooks are not included in this first version.

Catálogo de endpoints

27 resource paths. Write operations enforce both scopes and data ownership.

System

GET /health Check API availability Public
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

No se requieren parámetros.

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/health"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "status": "ok",
        "version": "v1",
        "time": "2026-09-27T14:12:08+00:00"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /me Read the developer key identity and linked account authenticated
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/me" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "developer": {
            "id": 7,
            "name": "Example Integration",
            "email": "developer@example.com"
        },
        "api_key": {
            "id": 12,
            "name": "Production backend",
            "prefix": "mcs_live_ab12",
            "scopes": [
                "matches:read",
                "matches:write"
            ],
            "rate_limit_per_minute": 120
        },
        "linked_account": {
            "type": "club",
            "id": 18
        }
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}

Matches

GET /matches List matches visible to the API key matches:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOpcionalPage number, starting at 1.1
per_pagequeryintegerOpcionalItems per page, from 1 to 100.25
statusquerystringOpcionalFilter by match status.enum: active, finishedactive
qquerystringOpcionalSearch by player, title, court or match number.Lucas
updated_sincequerystringOpcionalOnly matches updated since this ISO 8601 date and time.2026-09-27T12:00:00Z

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/matches?page=1&per_page=25&status=active&q=Lucas&updated_since=2026-09-27T12%3A00%3A00Z" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 125,
            "number": 125,
            "title": "Club championship",
            "type": "Singles",
            "court_name": "Court 1",
            "status": "active",
            "winner_player": 0,
            "winner_name": "",
            "quick_result": false,
            "public_access": "open",
            "players": [
                {
                    "side": 1,
                    "name": "Lucas Martin",
                    "player_id": 42,
                    "club_id": 18,
                    "sets": 1,
                    "games": 3,
                    "points": "30",
                    "serving": true
                },
                {
                    "side": 2,
                    "name": "Nathan Smith",
                    "player_id": 57,
                    "club_id": 18,
                    "sets": 0,
                    "games": 2,
                    "points": "15",
                    "serving": false
                }
            ],
            "score": {
                "current_set": 2,
                "is_tiebreak": false,
                "is_super_tiebreak": false,
                "sets": [
                    {
                        "set": 1,
                        "p1": 6,
                        "p2": 4
                    }
                ]
            },
            "rules": {
                "sets_to_win": 2,
                "games_to_win_set": 6,
                "tie_break_enabled": true,
                "tie_break_at_games": 6,
                "tie_break_points": 7,
                "final_set_rule": "regular_tiebreak",
                "final_set_tiebreak_points": 10,
                "no_ad_scoring": false,
                "advanced_point_mode": true
            },
            "audience": {
                "total_viewers": 84,
                "watching_now": 12
            },
            "links": {
                "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
                "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
            },
            "created_at": "2026-09-27 13:30:00",
            "updated_at": "2026-09-27 14:12:08",
            "finished_at": null
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123",
        "pagination": {
            "page": 1,
            "per_page": 25,
            "total": 1,
            "total_pages": 1
        }
    }
}
POST /matches Create a match matches:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 201

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
titlestringOpcionalMatch title.Club championship
typestringOpcionalMatch category.Singles
court_namestringOpcionalCourt 1
player1stringObligatorioDisplayed name for player 1. Required when player1_id is not supplied.Lucas Martin
player2stringObligatorioDisplayed name for player 2. Required when player2_id is not supplied.Nathan Smith
player1_idintegerOpcionalOptional official player identifier.42
player2_idintegerOpcionalOptional official player identifier.57
player1_club_idintegerOpcional18
player2_club_idintegerOpcional18
sets_to_winintegerOpcionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOpcionaldefault: truetrue
tie_break_at_gamesintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOpcionalmin: 3 · max: 30 · default: 77
final_set_rulestringOpcionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOpcionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOpcionaldefault: falsefalse
advanced_point_modebooleanOpcionaldefault: falsefalse
livechat_enabledbooleanOpcionaldefault: falsefalse
initial_serverintegerOpcionalenum: 1, 2 · default: 11
public_accessstringOpcionalenum: open, password, hidden · default: openopen
public_passwordstringOpcionalRequired only when public_access is password.minLength: 4string

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/matches" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "player1": "Player One", "player2": "Player Two", "title": "API test match", "type": "Singles", "sets_to_win": 2, "games_to_win_set": 6 }'

Ejemplo de respuesta · HTTP 201

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /matches/{matchId} Read a match and its current score matches:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/matches/125" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /matches/{matchId} Update match information and rules matches:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

Supply only the match fields that need to change.

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
titlestringOpcionalMatch title.Club championship
typestringOpcionalMatch category.Singles
court_namestringOpcionalCourt 1
player1stringOpcionalDisplayed name for player 1. Required when player1_id is not supplied.Lucas Martin
player2stringOpcionalDisplayed name for player 2. Required when player2_id is not supplied.Nathan Smith
player1_idintegerOpcionalOptional official player identifier.42
player2_idintegerOpcionalOptional official player identifier.57
player1_club_idintegerOpcional18
player2_club_idintegerOpcional18
sets_to_winintegerOpcionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOpcionaldefault: truetrue
tie_break_at_gamesintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOpcionalmin: 3 · max: 30 · default: 77
final_set_rulestringOpcionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOpcionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOpcionaldefault: falsefalse
advanced_point_modebooleanOpcionaldefault: falsefalse
livechat_enabledbooleanOpcionaldefault: falsefalse
initial_serverintegerOpcionalenum: 1, 2 · default: 11
public_accessstringOpcionalenum: open, password, hidden · default: openopen
public_passwordstringOpcionalRequired only when public_access is password.minLength: 4string

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/matches/125" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "title": "Updated match title", "court_name": "Court 1" }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
DELETE /matches/{matchId} Delete an eligible unstarted match matches:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Ejemplo de solicitud

curl -X DELETE "https://mycourtscore.com/api/v1/matches/125" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: request-unique-id"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}

Live scoring

GET /matches/{matchId}/score Read the live score payload matches:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/matches/125/score" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /matches/{matchId}/events List scoring and administration events matches:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125
limitqueryintegerOpcionalMaximum number of recent events, from 1 to 200.50

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/matches/125/events?limit=50" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 9001,
            "match_id": 125,
            "event_type": "point",
            "player_no": 1,
            "label": "Point for Lucas Martin",
            "point_reason": "winner",
            "responsible_player": 1,
            "created_at": "2026-09-27 14:12:08"
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /matches/{matchId}/points Award a point to player 1 or player 2 score:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
winnerintegerObligatorioenum: 1, 21
reasonstringOpcionalenum: normal, ace, winner, forced_error, unforced_error, double_fault, out, netnormal
responsible_playerintegerOpcionalenum: 0, 1, 20

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/matches/125/points" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "winner": 1, "reason": "normal", "responsible_player": 0 }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /matches/{matchId}/undo Undo the last point score:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

No hay campos JSON. Envía {} cuando se requiera un cuerpo.

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/matches/125/undo" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{}'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /matches/{matchId}/server Change the serving player score:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
serverintegerObligatorioenum: 1, 21

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/matches/125/server" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "server": 1 }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /matches/{matchId}/reset Reset the complete score score:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

No hay campos JSON. Envía {} cuando se requiera un cuerpo.

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/matches/125/reset" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{}'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /matches/{matchId}/finish Finish a match with a declared winner score:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
winnerintegerObligatorioenum: 1, 21

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/matches/125/finish" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "winner": 1 }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "finished",
        "winner_player": 1,
        "winner_name": "Lucas Martin",
        "quick_result": true,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": "2026-09-27 15:42:00"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /matches/{matchId}/reopen Reopen a finished match score:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
matchIdpathintegerObligatorioMy Court Score match identifier.min: 1125

Campos del cuerpo JSON

No hay campos JSON. Envía {} cuando se requiera un cuerpo.

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/matches/125/reopen" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{}'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 125,
        "number": 125,
        "title": "Club championship",
        "type": "Singles",
        "court_name": "Court 1",
        "status": "active",
        "winner_player": 0,
        "winner_name": "",
        "quick_result": false,
        "public_access": "open",
        "players": [
            {
                "side": 1,
                "name": "Lucas Martin",
                "player_id": 42,
                "club_id": 18,
                "sets": 1,
                "games": 3,
                "points": "30",
                "serving": true
            },
            {
                "side": 2,
                "name": "Nathan Smith",
                "player_id": 57,
                "club_id": 18,
                "sets": 0,
                "games": 2,
                "points": "15",
                "serving": false
            }
        ],
        "score": {
            "current_set": 2,
            "is_tiebreak": false,
            "is_super_tiebreak": false,
            "sets": [
                {
                    "set": 1,
                    "p1": 6,
                    "p2": 4
                }
            ]
        },
        "rules": {
            "sets_to_win": 2,
            "games_to_win_set": 6,
            "tie_break_enabled": true,
            "tie_break_at_games": 6,
            "tie_break_points": 7,
            "final_set_rule": "regular_tiebreak",
            "final_set_tiebreak_points": 10,
            "no_ad_scoring": false,
            "advanced_point_mode": true
        },
        "audience": {
            "total_viewers": 84,
            "watching_now": 12
        },
        "links": {
            "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
            "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
        },
        "created_at": "2026-09-27 13:30:00",
        "updated_at": "2026-09-27 14:12:08",
        "finished_at": null
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}

Players

GET /players Search official players or list linked players players:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOpcionalPage number, starting at 1.1
per_pagequeryintegerOpcionalItems per page, from 1 to 100.25
qquerystringOpcionalSearch by name or club.Lucas
minequerybooleanOpcionalOnly return the linked primary and secondary players.true
club_idqueryintegerOpcionalFilter by club.18

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/players?page=1&per_page=25&q=Lucas&mine=true&club_id=18" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 42,
            "name": "Lucas Martin",
            "first_name": "Lucas",
            "last_name": "Martin",
            "official": true,
            "country": "Belgium",
            "city": "Brussels",
            "club_id": 18,
            "club_name": "Central Tennis Club",
            "avatar_url": "https://mycourtscore.com/uploads/avatars/player-42.jpg",
            "is_secondary_player": false
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123",
        "pagination": {
            "page": 1,
            "per_page": 25,
            "total": 1,
            "total_pages": 1
        }
    }
}
POST /players Create the primary player account or a secondary player players:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 201

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id

Campos del cuerpo JSON

For an unlinked developer account, email and password are conditionally required to create and link a primary player account. For a developer already linked to a player, this creates a secondary player.

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
first_namestringObligatorioPlayer first name.Lucas
last_namestringObligatorioPlayer last name.Martin
emailstring (email)OpcionalRequired when creating the primary player account.lucas@example.com
passwordstring (password)OpcionalRequired when creating the primary player account.minLength: 8ChangeMe-2026
club_idintegerOpcional18
club_namestringOpcionalCentral Tennis Club
federation_numberstringOpcionalBE-123456
birth_datestring (date)Opcional2008-04-12
phonestringOpcionalstring
mobilestringOpcionalstring
citystringOpcionalBrussels
countrystringOpcionalBelgium
notesstringOpcionalstring
langstringOpcionalenum: fr, en, nl, de, es, it · default: enen

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/players" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "first_name": "Alex", "last_name": "Martin", "country": "Belgium", "lang": "en" }'

Ejemplo de respuesta · HTTP 201

{
    "data": {
        "id": 42,
        "name": "Lucas Martin",
        "first_name": "Lucas",
        "last_name": "Martin",
        "official": true,
        "country": "Belgium",
        "city": "Brussels",
        "club_id": 18,
        "club_name": "Central Tennis Club",
        "avatar_url": "https://mycourtscore.com/uploads/avatars/player-42.jpg",
        "is_secondary_player": false
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /players/{playerId} Read a permitted player profile players:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
playerIdpathintegerObligatorioOfficial or secondary player identifier.min: 142

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/players/42" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 42,
        "name": "Lucas Martin",
        "first_name": "Lucas",
        "last_name": "Martin",
        "official": true,
        "country": "Belgium",
        "city": "Brussels",
        "club_id": 18,
        "club_name": "Central Tennis Club",
        "avatar_url": "https://mycourtscore.com/uploads/avatars/player-42.jpg",
        "is_secondary_player": false
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /players/{playerId} Update a linked player profile players:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
playerIdpathintegerObligatorioOfficial or secondary player identifier.min: 142

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
first_namestringOpcionalstring
last_namestringOpcionalstring
club_idintegerOpcional1
federation_numberstringOpcionalstring
birth_datestring (date)Opcional2026-09-27
phonestringOpcionalstring
mobilestringOpcionalstring
citystringOpcionalstring
countrystringOpcionalstring
notesstringOpcionalstring

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/players/42" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "city": "Brussels", "country": "Belgium" }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 42,
        "name": "Lucas Martin",
        "first_name": "Lucas",
        "last_name": "Martin",
        "official": true,
        "country": "Belgium",
        "city": "Brussels",
        "club_id": 18,
        "club_name": "Central Tennis Club",
        "avatar_url": "https://mycourtscore.com/uploads/avatars/player-42.jpg",
        "is_secondary_player": false
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
DELETE /players/{playerId} Delete a linked secondary player players:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
playerIdpathintegerObligatorioOfficial or secondary player identifier.min: 142

Ejemplo de solicitud

curl -X DELETE "https://mycourtscore.com/api/v1/players/42" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: request-unique-id"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 42,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}

Clubs

GET /clubs List and search active clubs clubs:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOpcionalPage number, starting at 1.1
per_pagequeryintegerOpcionalItems per page, from 1 to 100.25
qquerystringOpcionalSearch by club name, city or country.Central

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/clubs?page=1&per_page=25&q=Central" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 18,
            "name": "Central Tennis Club",
            "short_name": "CTC",
            "slug": "central-tennis-club",
            "description": "Tennis club",
            "public_email": "contact@example.com",
            "phone": "+32 2 000 00 00",
            "city": "Brussels",
            "region": "Brussels",
            "country": "Belgium",
            "website": "https://example.com",
            "court_count": 4,
            "timezone": "Europe/Brussels",
            "status": "active",
            "live_url": "https://mycourtscore.com/club_live?club=PUBLIC_TOKEN"
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123",
        "pagination": {
            "page": 1,
            "per_page": 25,
            "total": 1,
            "total_pages": 1
        }
    }
}
POST /clubs Create a club and link the developer account clubs:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 201

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
club_namestringObligatorioOfficial club name.Central Tennis Club
short_namestringOpcionalCTC
descriptionstringOpcionalstring
contact_personstringOpcionalstring
emailstring (email)Obligatorioclub@example.com
passwordstring (password)ObligatoriominLength: 8ChangeMe-2026
public_emailstring (email)Opcionaldeveloper@example.com
phonestringOpcionalstring
mobilestringOpcionalstring
address_line1stringOpcionalstring
address_line2stringOpcionalstring
postal_codestringOpcionalstring
citystringOpcionalBrussels
regionstringOpcionalstring
countrystringOpcionalBelgium
websitestring (uri)Opcionalstring
federation_namestringOpcionalstring
registration_numberstringOpcionalstring
timezonestringOpcionalValid IANA timezone.Europe/Brussels
court_countintegerOpcionalmin: 0 · max: 5004
langstringOpcionalenum: fr, en, nl, de, es, it · default: enen

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/clubs" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "club_name": "API Test Club", "email": "developer@example.com", "password": "ChangeMe-2026", "timezone": "Europe/Brussels", "lang": "en" }'

Ejemplo de respuesta · HTTP 201

{
    "data": {
        "id": 18,
        "name": "Central Tennis Club",
        "short_name": "CTC",
        "slug": "central-tennis-club",
        "description": "Tennis club",
        "public_email": "contact@example.com",
        "phone": "+32 2 000 00 00",
        "city": "Brussels",
        "region": "Brussels",
        "country": "Belgium",
        "website": "https://example.com",
        "court_count": 4,
        "timezone": "Europe/Brussels",
        "status": "active",
        "live_url": "https://mycourtscore.com/club_live?club=PUBLIC_TOKEN"
    },
    "meta": {
        "developer_account_linked": true,
        "request_id": "req_01HXYZ123"
    }
}
GET /clubs/{clubId} Read public club information clubs:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
clubIdpathintegerObligatorioClub identifier.min: 118

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/clubs/18" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 18,
        "name": "Central Tennis Club",
        "short_name": "CTC",
        "slug": "central-tennis-club",
        "description": "Tennis club",
        "public_email": "contact@example.com",
        "phone": "+32 2 000 00 00",
        "city": "Brussels",
        "region": "Brussels",
        "country": "Belgium",
        "website": "https://example.com",
        "court_count": 4,
        "timezone": "Europe/Brussels",
        "status": "active",
        "live_url": "https://mycourtscore.com/club_live?club=PUBLIC_TOKEN"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /clubs/{clubId} Update the linked club profile clubs:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
clubIdpathintegerObligatorioClub identifier.min: 118

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
club_namestringOpcionalstring
short_namestringOpcionalstring
descriptionstringOpcionalstring
logo_urlstring (uri)Opcionalstring
contact_personstringOpcionalstring
public_emailstring (email)Opcionaldeveloper@example.com
phonestringOpcionalstring
mobilestringOpcionalstring
address_line1stringOpcionalstring
address_line2stringOpcionalstring
postal_codestringOpcionalstring
citystringOpcionalstring
regionstringOpcionalstring
countrystringOpcionalstring
websitestring (uri)Opcionalstring
federation_namestringOpcionalstring
registration_numberstringOpcionalstring
timezonestringOpcionalEurope/Brussels
court_countintegerOpcionalmin: 0 · max: 5001
live_match_visibilitystringOpcionalenum: forever, until_finished, same_dayforever

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/clubs/18" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "city": "Brussels", "timezone": "Europe/Brussels", "court_count": 4 }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 18,
        "name": "Central Tennis Club",
        "short_name": "CTC",
        "slug": "central-tennis-club",
        "description": "Tennis club",
        "public_email": "contact@example.com",
        "phone": "+32 2 000 00 00",
        "city": "Brussels",
        "region": "Brussels",
        "country": "Belgium",
        "website": "https://example.com",
        "court_count": 4,
        "timezone": "Europe/Brussels",
        "status": "active",
        "live_url": "https://mycourtscore.com/club_live?club=PUBLIC_TOKEN"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /clubs/{clubId}/matches List matches owned by the linked club matches:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
clubIdpathintegerObligatorioClub identifier.min: 118
pagequeryintegerOpcionalPage number, starting at 1.1
per_pagequeryintegerOpcionalItems per page, from 1 to 100.25
statusquerystringOpcionalFilter by match status.enum: active, finishedactive
qquerystringOpcionalSearch by player, title or court.Lucas
updated_sincequerystringOpcionalOnly matches updated since this ISO 8601 date and time.2026-09-27T12:00:00Z

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/clubs/18/matches?page=1&per_page=25&status=active&q=Lucas&updated_since=2026-09-27T12%3A00%3A00Z" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 125,
            "number": 125,
            "title": "Club championship",
            "type": "Singles",
            "court_name": "Court 1",
            "status": "active",
            "winner_player": 0,
            "winner_name": "",
            "quick_result": false,
            "public_access": "open",
            "players": [
                {
                    "side": 1,
                    "name": "Lucas Martin",
                    "player_id": 42,
                    "club_id": 18,
                    "sets": 1,
                    "games": 3,
                    "points": "30",
                    "serving": true
                },
                {
                    "side": 2,
                    "name": "Nathan Smith",
                    "player_id": 57,
                    "club_id": 18,
                    "sets": 0,
                    "games": 2,
                    "points": "15",
                    "serving": false
                }
            ],
            "score": {
                "current_set": 2,
                "is_tiebreak": false,
                "is_super_tiebreak": false,
                "sets": [
                    {
                        "set": 1,
                        "p1": 6,
                        "p2": 4
                    }
                ]
            },
            "rules": {
                "sets_to_win": 2,
                "games_to_win_set": 6,
                "tie_break_enabled": true,
                "tie_break_at_games": 6,
                "tie_break_points": 7,
                "final_set_rule": "regular_tiebreak",
                "final_set_tiebreak_points": 10,
                "no_ad_scoring": false,
                "advanced_point_mode": true
            },
            "audience": {
                "total_viewers": 84,
                "watching_now": 12
            },
            "links": {
                "score": "https://mycourtscore.com/tennis_score?view=PUBLIC_TOKEN",
                "court_display": "https://mycourtscore.com/court_display?display=PUBLIC_TOKEN"
            },
            "created_at": "2026-09-27 13:30:00",
            "updated_at": "2026-09-27 14:12:08",
            "finished_at": null
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123",
        "pagination": {
            "page": 1,
            "per_page": 25,
            "total": 1,
            "total_pages": 1
        }
    }
}

Tournaments

GET /tournaments List public or linked-club tournaments tournaments:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOpcionalPage number, starting at 1.1
per_pagequeryintegerOpcionalItems per page, from 1 to 100.25
statusquerystringOpcionalFilter by tournament status.enum: draft, published, in_progress, finishedpublished
qquerystringOpcionalSearch by name, category or venue.Weekend Open

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/tournaments?page=1&per_page=25&status=published&q=Weekend%20Open" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 8,
            "club_id": 18,
            "name": "Weekend Open",
            "description": "Club tournament",
            "category": "Open",
            "format": "group_divisions",
            "entry_type": "team",
            "status": "published",
            "registration_open": true,
            "max_participants": 16,
            "group_count": 4,
            "qualifiers_per_group": 2,
            "division_count": 2,
            "start_date": "2026-09-27",
            "end_date": "2026-09-28",
            "venue": "Central Tennis Club",
            "timezone": "Europe/Brussels",
            "minimum_rest_minutes": 30,
            "public_url": "https://mycourtscore.com/tournament?t=PUBLIC_TOKEN",
            "created_at": "2026-09-01 10:00:00",
            "updated_at": "2026-09-27 12:00:00"
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123",
        "pagination": {
            "page": 1,
            "per_page": 25,
            "total": 1,
            "total_pages": 1
        }
    }
}
POST /tournaments Create a club tournament tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 201

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
namestringObligatorioTournament name.Weekend Open
descriptionstringOpcionalstring
categorystringOpcionalOpen
formatstringOpcionalenum: single_elimination, round_robin, group_knockout, group_divisions · default: single_eliminationsingle_elimination
entry_typestringOpcionalenum: player, team · default: playerplayer
start_datestring (date)Obligatorio2026-09-27
end_datestring (date)Obligatorio2026-09-28
venuestringOpcionalCentral Tennis Club
timezonestringOpcionalEurope/Brussels
registration_openbooleanOpcionaldefault: falsefalse
max_participantsintegerOpcionalmin: 2 · max: 128 · default: 3232
group_countintegerOpcionalmin: 1 · max: 32 · default: 11
qualifiers_per_groupintegerOpcionalmin: 1 · max: 8 · default: 22
division_countintegerOpcionalmin: 1 · max: 81
sets_to_winintegerOpcionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOpcionaldefault: truetrue
tie_break_at_gamesintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOpcionalmin: 3 · max: 30 · default: 77
final_set_rulestringOpcionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOpcionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOpcionaldefault: falsefalse
group_sets_to_winintegerOpcionalmin: 1 · max: 3 · default: 11
group_games_to_win_setintegerOpcionalmin: 1 · max: 12 · default: 66
group_tie_break_enabledbooleanOpcionaldefault: truetrue
group_tie_break_at_gamesintegerOpcionalmin: 1 · max: 12 · default: 66
group_tie_break_pointsintegerOpcionalmin: 3 · max: 30 · default: 77
group_no_ad_scoringbooleanOpcionaldefault: falsefalse
minimum_rest_minutesintegerOpcionalmin: 0 · max: 1440 · default: 3030
estimated_match_minutesintegerOpcionalmin: 10 · max: 1440 · default: 6060
schedule_slot_minutesintegerOpcionalmin: 5 · max: 720 · default: 3030
ranking_rulesarray<string>Opcional[ "match_wins", "head_to_head", "set_ratio", "game_ratio" ]

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/tournaments" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "name": "API Test Tournament", "start_date": "2026-09-27", "end_date": "2026-09-28", "format": "single_elimination", "entry_type": "player", "max_participants": 8 }'

Ejemplo de respuesta · HTTP 201

{
    "data": {
        "id": 8,
        "club_id": 18,
        "name": "Weekend Open",
        "description": "Club tournament",
        "category": "Open",
        "format": "group_divisions",
        "entry_type": "team",
        "status": "published",
        "registration_open": true,
        "max_participants": 16,
        "group_count": 4,
        "qualifiers_per_group": 2,
        "division_count": 2,
        "start_date": "2026-09-27",
        "end_date": "2026-09-28",
        "venue": "Central Tennis Club",
        "timezone": "Europe/Brussels",
        "minimum_rest_minutes": 30,
        "public_url": "https://mycourtscore.com/tournament?t=PUBLIC_TOKEN",
        "created_at": "2026-09-01 10:00:00",
        "updated_at": "2026-09-27 12:00:00"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId} Read tournament configuration and counts tournaments:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/tournaments/8" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 8,
        "club_id": 18,
        "name": "Weekend Open",
        "description": "Club tournament",
        "category": "Open",
        "format": "group_divisions",
        "entry_type": "team",
        "status": "published",
        "registration_open": true,
        "max_participants": 16,
        "group_count": 4,
        "qualifiers_per_group": 2,
        "division_count": 2,
        "start_date": "2026-09-27",
        "end_date": "2026-09-28",
        "venue": "Central Tennis Club",
        "timezone": "Europe/Brussels",
        "minimum_rest_minutes": 30,
        "public_url": "https://mycourtscore.com/tournament?t=PUBLIC_TOKEN",
        "created_at": "2026-09-01 10:00:00",
        "updated_at": "2026-09-27 12:00:00",
        "counts": {
            "participants": 16,
            "courts": 4,
            "matches": 24
        }
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /tournaments/{tournamentId} Update tournament configuration tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Campos del cuerpo JSON

Supply only the tournament fields that need to change.

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
namestringOpcionalTournament name.Weekend Open
descriptionstringOpcionalstring
categorystringOpcionalOpen
formatstringOpcionalenum: single_elimination, round_robin, group_knockout, group_divisions · default: single_eliminationsingle_elimination
entry_typestringOpcionalenum: player, team · default: playerplayer
start_datestring (date)Opcional2026-09-27
end_datestring (date)Opcional2026-09-28
venuestringOpcionalCentral Tennis Club
timezonestringOpcionalEurope/Brussels
registration_openbooleanOpcionaldefault: falsefalse
max_participantsintegerOpcionalmin: 2 · max: 128 · default: 3232
group_countintegerOpcionalmin: 1 · max: 32 · default: 11
qualifiers_per_groupintegerOpcionalmin: 1 · max: 8 · default: 22
division_countintegerOpcionalmin: 1 · max: 81
sets_to_winintegerOpcionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOpcionaldefault: truetrue
tie_break_at_gamesintegerOpcionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOpcionalmin: 3 · max: 30 · default: 77
final_set_rulestringOpcionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOpcionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOpcionaldefault: falsefalse
group_sets_to_winintegerOpcionalmin: 1 · max: 3 · default: 11
group_games_to_win_setintegerOpcionalmin: 1 · max: 12 · default: 66
group_tie_break_enabledbooleanOpcionaldefault: truetrue
group_tie_break_at_gamesintegerOpcionalmin: 1 · max: 12 · default: 66
group_tie_break_pointsintegerOpcionalmin: 3 · max: 30 · default: 77
group_no_ad_scoringbooleanOpcionaldefault: falsefalse
minimum_rest_minutesintegerOpcionalmin: 0 · max: 1440 · default: 3030
estimated_match_minutesintegerOpcionalmin: 10 · max: 1440 · default: 6060
schedule_slot_minutesintegerOpcionalmin: 5 · max: 720 · default: 3030
ranking_rulesarray<string>Opcional[ "match_wins", "head_to_head", "set_ratio", "game_ratio" ]
statusstringOpcionalenum: draft, published, in_progress, finisheddraft

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/tournaments/8" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "venue": "Central Tennis Club", "registration_open": true }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 8,
        "club_id": 18,
        "name": "Weekend Open",
        "description": "Club tournament",
        "category": "Open",
        "format": "group_divisions",
        "entry_type": "team",
        "status": "published",
        "registration_open": true,
        "max_participants": 16,
        "group_count": 4,
        "qualifiers_per_group": 2,
        "division_count": 2,
        "start_date": "2026-09-27",
        "end_date": "2026-09-28",
        "venue": "Central Tennis Club",
        "timezone": "Europe/Brussels",
        "minimum_rest_minutes": 30,
        "public_url": "https://mycourtscore.com/tournament?t=PUBLIC_TOKEN",
        "created_at": "2026-09-01 10:00:00",
        "updated_at": "2026-09-27 12:00:00"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
DELETE /tournaments/{tournamentId} Delete and archive a tournament tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Ejemplo de solicitud

curl -X DELETE "https://mycourtscore.com/api/v1/tournaments/8" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: request-unique-id"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 8,
        "deleted": true,
        "deletion_archive_id": 3
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/participants List tournament participants tournaments:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/participants" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 64,
            "tournament_id": 8,
            "player_id": 42,
            "display_name": "Lucas Martin",
            "member1_name": "",
            "member2_name": "",
            "seed": 1,
            "group": 1,
            "manual_rank": 0,
            "status": "accepted",
            "source": "api"
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /tournaments/{tournamentId}/participants Add a participant or team tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 201

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Campos del cuerpo JSON

Supply display_name or a valid player_id.

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
player_idintegerOpcional42
display_namestringOpcionalLucas Martin
member1_namestringOpcionalstring
member2_namestringOpcionalstring
member1_player_idintegerOpcional1
member2_player_idintegerOpcional1
emailstring (email)Opcionaldeveloper@example.com
seedintegerOpcionalmin: 0 · max: 1281
groupintegerOpcionalmin: 0 · max: 321
manual_rankintegerOpcional1
statusstringOpcionalenum: pending, accepted, rejected · default: acceptedaccepted

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/tournaments/8/participants" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "display_name": "Player One", "status": "accepted", "seed": 1 }'

Ejemplo de respuesta · HTTP 201

{
    "data": {
        "id": 64,
        "tournament_id": 8,
        "player_id": 42,
        "display_name": "Lucas Martin",
        "member1_name": "",
        "member2_name": "",
        "seed": 1,
        "group": 1,
        "manual_rank": 0,
        "status": "accepted",
        "source": "api"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /tournaments/{tournamentId}/participants/{participantId} Update a participant, seed or group tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18
participantIdpathintegerObligatorioTournament participant identifier.min: 164

Campos del cuerpo JSON

Supply only the participant fields that need to change.

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
player_idintegerOpcional42
display_namestringOpcionalLucas Martin
member1_namestringOpcionalstring
member2_namestringOpcionalstring
member1_player_idintegerOpcional1
member2_player_idintegerOpcional1
emailstring (email)Opcionaldeveloper@example.com
seedintegerOpcionalmin: 0 · max: 1281
groupintegerOpcionalmin: 0 · max: 321
manual_rankintegerOpcional1
statusstringOpcionalenum: pending, accepted, rejected · default: acceptedaccepted

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/tournaments/8/participants/64" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "seed": 2, "group": 1, "status": "accepted" }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 64,
        "tournament_id": 8,
        "player_id": 42,
        "display_name": "Lucas Martin",
        "member1_name": "",
        "member2_name": "",
        "seed": 1,
        "group": 1,
        "manual_rank": 0,
        "status": "accepted",
        "source": "api"
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
DELETE /tournaments/{tournamentId}/participants/{participantId} Remove a participant before draw generation tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18
participantIdpathintegerObligatorioTournament participant identifier.min: 164

Ejemplo de solicitud

curl -X DELETE "https://mycourtscore.com/api/v1/tournaments/8/participants/64" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: request-unique-id"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 64,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/courts List tournament courts tournaments:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/courts" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 5,
            "tournament_id": 8,
            "name": "Court 1",
            "sort_order": 1
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /tournaments/{tournamentId}/courts Add a tournament court tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 201

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
namestringObligatorioCourt 1
sort_orderintegerOpcionalmin: 0 · max: 10001

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/tournaments/8/courts" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "name": "Court 1", "sort_order": 1 }'

Ejemplo de respuesta · HTTP 201

{
    "data": {
        "id": 5,
        "tournament_id": 8,
        "name": "Court 1",
        "sort_order": 1
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /tournaments/{tournamentId}/courts/{courtId} Rename or reorder a court tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18
courtIdpathintegerObligatorioTournament court identifier.min: 15

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
namestringObligatorioCourt 1
sort_orderintegerOpcionalmin: 0 · max: 10001

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/tournaments/8/courts/5" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "name": "Court 1", "sort_order": 1 }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 5,
        "tournament_id": 8,
        "name": "Court 1",
        "sort_order": 1
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
DELETE /tournaments/{tournamentId}/courts/{courtId} Delete an unused tournament court tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18
courtIdpathintegerObligatorioTournament court identifier.min: 15

Ejemplo de solicitud

curl -X DELETE "https://mycourtscore.com/api/v1/tournaments/8/courts/5" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: request-unique-id"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 5,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/matches List draw and scheduled matches tournaments:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/matches" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 91,
            "tournament_id": 8,
            "round_name": "Quarterfinal",
            "round_no": 1,
            "position_no": 1,
            "player1_participant_id": 64,
            "player2_participant_id": 65,
            "player1_name": "Lucas Martin",
            "player2_name": "Nathan Smith",
            "court_id": 5,
            "scheduled_at": "2026-09-27 14:30:00",
            "status": "scheduled",
            "winner_participant_id": 0
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
PATCH /tournaments/{tournamentId}/matches/{tournamentMatchId} Schedule a match, update its state or declare an outcome tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18
tournamentMatchIdpathintegerObligatorioTournament match identifier.min: 191

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
court_idintegerOpcional1
scheduled_atstringOpcionalLocal time in the tournament timezone. Send an empty string to unschedule.2026-09-27 14:30
duration_minutesintegerOpcionalmin: 15 · max: 3601
forcebooleanOpcionalAllow scheduling despite reported conflicts.false
commentstringOpcionalstring
statusstringOpcionalenum: ready, scheduled, called, warmup, live, suspended, postponed, finished, walkover, retired, no_show, disqualified, cancelledready
winner_participant_idintegerOpcional1
outcome_notestringOpcionalstring

Ejemplo de solicitud

curl -X PATCH "https://mycourtscore.com/api/v1/tournaments/8/matches/91" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '{ "court_id": 1, "scheduled_at": "2026-09-27 14:30", "duration_minutes": 60, "comment": "Scheduled through API" }'

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "id": 91,
        "tournament_id": 8,
        "round_name": "Quarterfinal",
        "round_no": 1,
        "position_no": 1,
        "player1_participant_id": 64,
        "player2_participant_id": 65,
        "player1_name": "Lucas Martin",
        "player2_name": "Nathan Smith",
        "court_id": 5,
        "scheduled_at": "2026-09-27 14:30:00",
        "status": "scheduled",
        "winner_participant_id": 0
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/standings Read group standings and tie-break details tournaments:read
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Ejemplo de solicitud

curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/standings" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta · HTTP 200

{
    "data": {
        "groups": [
            {
                "group": 1,
                "rows": [
                    {
                        "rank": 1,
                        "participant_id": 64,
                        "display_name": "Lucas Martin",
                        "played": 3,
                        "won": 3,
                        "lost": 0,
                        "points": 6,
                        "qualified": true
                    }
                ]
            }
        ]
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
POST /tournaments/{tournamentId}/generate-draw Generate group matches or an elimination draw tournaments:write
Propiedad: clave API exacta
Parámetros y ejemplosRespuesta correcta · HTTP 200

Parámetros de la solicitud

ParámetroUbicaciónTypeObligatorioDescripciónRestriccionesEjemplo
AuthorizationheaderstringObligatorioClave API Bearer para autenticar la solicitud.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatorioFormato JSON del cuerpo de la solicitud.application/jsonapplication/json
Idempotency-KeyheaderstringOpcionalValor único recomendado para evitar duplicados tras un reintento de red.request-unique-id
tournamentIdpathintegerObligatorioTournament identifier.min: 18

Campos del cuerpo JSON

ParámetroTypeObligatorioDescripciónRestriccionesEjemplo
slotsarray<integer>OpcionalOptional ordered participant IDs for manual knockout placement.[]

Ejemplo de solicitud

curl -X POST "https://mycourtscore.com/api/v1/tournaments/8/generate-draw" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: request-unique-id" \
  -d '[]'

Ejemplo de respuesta · HTTP 200

{
    "data": [
        {
            "id": 91,
            "tournament_id": 8,
            "round_name": "Quarterfinal",
            "round_no": 1,
            "position_no": 1,
            "player1_participant_id": 64,
            "player2_participant_id": 65,
            "player1_name": "Lucas Martin",
            "player2_name": "Nathan Smith",
            "court_id": 5,
            "scheduled_at": "2026-09-27 14:30:00",
            "status": "scheduled",
            "winner_participant_id": 0
        }
    ],
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}