My Court Score Developer Platform

Connectez vos applications au tennis en direct

Une API REST versionnée pour gérer les matchs, les scores live, les joueurs, les clubs et les tournois.

Important : chaque ressource appartient à la clé API qui l’a créée

La propriété est vérifiée sur la clé API exacte, et pas uniquement sur le compte développeur ou le compte My Court Score lié.

Exemple : la clé A crée le match 125. Seule la clé A peut ensuite modifier ce match, ajouter un point ou le supprimer. La clé B sera refusée.

Conservez une clé stable par intégration et par environnement. Révoquer ou perdre cette clé retire l’accès en écriture aux ressources qu’elle a créées. resource_owned_by_another_api_key · resource_not_created_by_api_key

API pour développeurs

Créez une identité développeur séparée, puis liez-la au compte joueur ou club dont votre intégration doit gérer les données.
Nouveau développeur

Créer un compte développeur

Créez votre espace développeur pour générer et administrer vos clés API.

Démarrage rapide

Échanges JSON via HTTPS. Toutes les routes protégées utilisent une clé Bearer.
Télécharger OpenAPI JSON
URL de basehttps://mycourtscore.com/api/v1
AuthentificationAuthorization: Bearer mcs_live_...
Formatapplication/json · UTF-8 · OpenAPI 3.1

Lire l’identité de la clé API

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

Créer un match sans risque de doublon

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.

Propriété stricte : une ressource créée par une clé API ne peut être modifiée, supprimée ou utilisée par une action d’écriture qu’avec cette même clé. Une autre clé du même compte sera refusée.

Les webhooks ne sont pas inclus dans cette première version.

Catalogue des endpoints

27 chemins de ressources. Les écritures contrôlent la permission et le propriétaire des données.

System

GET /health Check API availability Public
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

Aucun paramètre à transmettre.

Exemple de requête

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

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY

Exemple de requête

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

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerFacultatifPage number, starting at 1.1
per_pagequeryintegerFacultatifItems per page, from 1 to 100.25
statusquerystringFacultatifFilter by match status.enum: active, finishedactive
qquerystringFacultatifSearch by player, title, court or match number.Lucas
updated_sincequerystringFacultatifOnly matches updated since this ISO 8601 date and time.2026-09-27T12:00:00Z

Exemple de requête

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"

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 201

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
titlestringFacultatifMatch title.Club championship
typestringFacultatifMatch category.Singles
court_namestringFacultatifCourt 1
player1stringObligatoireDisplayed name for player 1. Required when player1_id is not supplied.Lucas Martin
player2stringObligatoireDisplayed name for player 2. Required when player2_id is not supplied.Nathan Smith
player1_idintegerFacultatifOptional official player identifier.42
player2_idintegerFacultatifOptional official player identifier.57
player1_club_idintegerFacultatif18
player2_club_idintegerFacultatif18
sets_to_winintegerFacultatifmin: 1 · max: 3 · default: 22
games_to_win_setintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanFacultatifdefault: truetrue
tie_break_at_gamesintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_pointsintegerFacultatifmin: 3 · max: 30 · default: 77
final_set_rulestringFacultatifenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerFacultatifmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanFacultatifdefault: falsefalse
advanced_point_modebooleanFacultatifdefault: falsefalse
livechat_enabledbooleanFacultatifdefault: falsefalse
initial_serverintegerFacultatifenum: 1, 2 · default: 11
public_accessstringFacultatifenum: open, password, hidden · default: openopen
public_passwordstringFacultatifRequired only when public_access is password.minLength: 4string

Exemple de requête

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 }'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

Supply only the match fields that need to change.

ParamètreTypeObligatoireDescriptionContraintesExemple
titlestringFacultatifMatch title.Club championship
typestringFacultatifMatch category.Singles
court_namestringFacultatifCourt 1
player1stringFacultatifDisplayed name for player 1. Required when player1_id is not supplied.Lucas Martin
player2stringFacultatifDisplayed name for player 2. Required when player2_id is not supplied.Nathan Smith
player1_idintegerFacultatifOptional official player identifier.42
player2_idintegerFacultatifOptional official player identifier.57
player1_club_idintegerFacultatif18
player2_club_idintegerFacultatif18
sets_to_winintegerFacultatifmin: 1 · max: 3 · default: 22
games_to_win_setintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanFacultatifdefault: truetrue
tie_break_at_gamesintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_pointsintegerFacultatifmin: 3 · max: 30 · default: 77
final_set_rulestringFacultatifenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerFacultatifmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanFacultatifdefault: falsefalse
advanced_point_modebooleanFacultatifdefault: falsefalse
livechat_enabledbooleanFacultatifdefault: falsefalse
initial_serverintegerFacultatifenum: 1, 2 · default: 11
public_accessstringFacultatifenum: open, password, hidden · default: openopen
public_passwordstringFacultatifRequired only when public_access is password.minLength: 4string

Exemple de requête

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" }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Exemple de requête

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

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Exemple de requête

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

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125
limitqueryintegerFacultatifMaximum number of recent events, from 1 to 200.50

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
winnerintegerObligatoireenum: 1, 21
reasonstringFacultatifenum: normal, ace, winner, forced_error, unforced_error, double_fault, out, netnormal
responsible_playerintegerFacultatifenum: 0, 1, 20

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

Aucun champ JSON. Envoyez un objet vide {} lorsque le corps est requis.

Exemple de requête

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 '{}'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
serverintegerObligatoireenum: 1, 21

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

Aucun champ JSON. Envoyez un objet vide {} lorsque le corps est requis.

Exemple de requête

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 '{}'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
winnerintegerObligatoireenum: 1, 21

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
matchIdpathintegerObligatoireMy Court Score match identifier.min: 1125

Champs du corps JSON

Aucun champ JSON. Envoyez un objet vide {} lorsque le corps est requis.

Exemple de requête

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 '{}'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerFacultatifPage number, starting at 1.1
per_pagequeryintegerFacultatifItems per page, from 1 to 100.25
qquerystringFacultatifSearch by name or club.Lucas
minequerybooleanFacultatifOnly return the linked primary and secondary players.true
club_idqueryintegerFacultatifFilter by club.18

Exemple de requête

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"

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 201

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id

Champs du corps 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.

ParamètreTypeObligatoireDescriptionContraintesExemple
first_namestringObligatoirePlayer first name.Lucas
last_namestringObligatoirePlayer last name.Martin
emailstring (email)FacultatifRequired when creating the primary player account.lucas@example.com
passwordstring (password)FacultatifRequired when creating the primary player account.minLength: 8ChangeMe-2026
club_idintegerFacultatif18
club_namestringFacultatifCentral Tennis Club
federation_numberstringFacultatifBE-123456
birth_datestring (date)Facultatif2008-04-12
phonestringFacultatifstring
mobilestringFacultatifstring
citystringFacultatifBrussels
countrystringFacultatifBelgium
notesstringFacultatifstring
langstringFacultatifenum: fr, en, nl, de, es, it · default: enen

Exemple de requête

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" }'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
playerIdpathintegerObligatoireOfficial or secondary player identifier.min: 142

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
playerIdpathintegerObligatoireOfficial or secondary player identifier.min: 142

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
first_namestringFacultatifstring
last_namestringFacultatifstring
club_idintegerFacultatif1
federation_numberstringFacultatifstring
birth_datestring (date)Facultatif2026-09-27
phonestringFacultatifstring
mobilestringFacultatifstring
citystringFacultatifstring
countrystringFacultatifstring
notesstringFacultatifstring

Exemple de requête

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" }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
playerIdpathintegerObligatoireOfficial or secondary player identifier.min: 142

Exemple de requête

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

Exemple de réponse · HTTP 200

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

Clubs

GET /clubs List and search active clubs clubs:read
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerFacultatifPage number, starting at 1.1
per_pagequeryintegerFacultatifItems per page, from 1 to 100.25
qquerystringFacultatifSearch by club name, city or country.Central

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 201

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
club_namestringObligatoireOfficial club name.Central Tennis Club
short_namestringFacultatifCTC
descriptionstringFacultatifstring
contact_personstringFacultatifstring
emailstring (email)Obligatoireclub@example.com
passwordstring (password)ObligatoireminLength: 8ChangeMe-2026
public_emailstring (email)Facultatifdeveloper@example.com
phonestringFacultatifstring
mobilestringFacultatifstring
address_line1stringFacultatifstring
address_line2stringFacultatifstring
postal_codestringFacultatifstring
citystringFacultatifBrussels
regionstringFacultatifstring
countrystringFacultatifBelgium
websitestring (uri)Facultatifstring
federation_namestringFacultatifstring
registration_numberstringFacultatifstring
timezonestringFacultatifValid IANA timezone.Europe/Brussels
court_countintegerFacultatifmin: 0 · max: 5004
langstringFacultatifenum: fr, en, nl, de, es, it · default: enen

Exemple de requête

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" }'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
clubIdpathintegerObligatoireClub identifier.min: 118

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
clubIdpathintegerObligatoireClub identifier.min: 118

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
club_namestringFacultatifstring
short_namestringFacultatifstring
descriptionstringFacultatifstring
logo_urlstring (uri)Facultatifstring
contact_personstringFacultatifstring
public_emailstring (email)Facultatifdeveloper@example.com
phonestringFacultatifstring
mobilestringFacultatifstring
address_line1stringFacultatifstring
address_line2stringFacultatifstring
postal_codestringFacultatifstring
citystringFacultatifstring
regionstringFacultatifstring
countrystringFacultatifstring
websitestring (uri)Facultatifstring
federation_namestringFacultatifstring
registration_numberstringFacultatifstring
timezonestringFacultatifEurope/Brussels
court_countintegerFacultatifmin: 0 · max: 5001
live_match_visibilitystringFacultatifenum: forever, until_finished, same_dayforever

Exemple de requête

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 }'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
clubIdpathintegerObligatoireClub identifier.min: 118
pagequeryintegerFacultatifPage number, starting at 1.1
per_pagequeryintegerFacultatifItems per page, from 1 to 100.25
statusquerystringFacultatifFilter by match status.enum: active, finishedactive
qquerystringFacultatifSearch by player, title or court.Lucas
updated_sincequerystringFacultatifOnly matches updated since this ISO 8601 date and time.2026-09-27T12:00:00Z

Exemple de requête

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"

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerFacultatifPage number, starting at 1.1
per_pagequeryintegerFacultatifItems per page, from 1 to 100.25
statusquerystringFacultatifFilter by tournament status.enum: draft, published, in_progress, finishedpublished
qquerystringFacultatifSearch by name, category or venue.Weekend Open

Exemple de requête

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"

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 201

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
namestringObligatoireTournament name.Weekend Open
descriptionstringFacultatifstring
categorystringFacultatifOpen
formatstringFacultatifenum: single_elimination, round_robin, group_knockout, group_divisions · default: single_eliminationsingle_elimination
entry_typestringFacultatifenum: player, team · default: playerplayer
start_datestring (date)Obligatoire2026-09-27
end_datestring (date)Obligatoire2026-09-28
venuestringFacultatifCentral Tennis Club
timezonestringFacultatifEurope/Brussels
registration_openbooleanFacultatifdefault: falsefalse
max_participantsintegerFacultatifmin: 2 · max: 128 · default: 3232
group_countintegerFacultatifmin: 1 · max: 32 · default: 11
qualifiers_per_groupintegerFacultatifmin: 1 · max: 8 · default: 22
division_countintegerFacultatifmin: 1 · max: 81
sets_to_winintegerFacultatifmin: 1 · max: 3 · default: 22
games_to_win_setintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanFacultatifdefault: truetrue
tie_break_at_gamesintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_pointsintegerFacultatifmin: 3 · max: 30 · default: 77
final_set_rulestringFacultatifenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerFacultatifmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanFacultatifdefault: falsefalse
group_sets_to_winintegerFacultatifmin: 1 · max: 3 · default: 11
group_games_to_win_setintegerFacultatifmin: 1 · max: 12 · default: 66
group_tie_break_enabledbooleanFacultatifdefault: truetrue
group_tie_break_at_gamesintegerFacultatifmin: 1 · max: 12 · default: 66
group_tie_break_pointsintegerFacultatifmin: 3 · max: 30 · default: 77
group_no_ad_scoringbooleanFacultatifdefault: falsefalse
minimum_rest_minutesintegerFacultatifmin: 0 · max: 1440 · default: 3030
estimated_match_minutesintegerFacultatifmin: 10 · max: 1440 · default: 6060
schedule_slot_minutesintegerFacultatifmin: 5 · max: 720 · default: 3030
ranking_rulesarray<string>Facultatif[ "match_wins", "head_to_head", "set_ratio", "game_ratio" ]

Exemple de requête

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 }'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Champs du corps JSON

Supply only the tournament fields that need to change.

ParamètreTypeObligatoireDescriptionContraintesExemple
namestringFacultatifTournament name.Weekend Open
descriptionstringFacultatifstring
categorystringFacultatifOpen
formatstringFacultatifenum: single_elimination, round_robin, group_knockout, group_divisions · default: single_eliminationsingle_elimination
entry_typestringFacultatifenum: player, team · default: playerplayer
start_datestring (date)Facultatif2026-09-27
end_datestring (date)Facultatif2026-09-28
venuestringFacultatifCentral Tennis Club
timezonestringFacultatifEurope/Brussels
registration_openbooleanFacultatifdefault: falsefalse
max_participantsintegerFacultatifmin: 2 · max: 128 · default: 3232
group_countintegerFacultatifmin: 1 · max: 32 · default: 11
qualifiers_per_groupintegerFacultatifmin: 1 · max: 8 · default: 22
division_countintegerFacultatifmin: 1 · max: 81
sets_to_winintegerFacultatifmin: 1 · max: 3 · default: 22
games_to_win_setintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanFacultatifdefault: truetrue
tie_break_at_gamesintegerFacultatifmin: 1 · max: 12 · default: 66
tie_break_pointsintegerFacultatifmin: 3 · max: 30 · default: 77
final_set_rulestringFacultatifenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerFacultatifmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanFacultatifdefault: falsefalse
group_sets_to_winintegerFacultatifmin: 1 · max: 3 · default: 11
group_games_to_win_setintegerFacultatifmin: 1 · max: 12 · default: 66
group_tie_break_enabledbooleanFacultatifdefault: truetrue
group_tie_break_at_gamesintegerFacultatifmin: 1 · max: 12 · default: 66
group_tie_break_pointsintegerFacultatifmin: 3 · max: 30 · default: 77
group_no_ad_scoringbooleanFacultatifdefault: falsefalse
minimum_rest_minutesintegerFacultatifmin: 0 · max: 1440 · default: 3030
estimated_match_minutesintegerFacultatifmin: 10 · max: 1440 · default: 6060
schedule_slot_minutesintegerFacultatifmin: 5 · max: 720 · default: 3030
ranking_rulesarray<string>Facultatif[ "match_wins", "head_to_head", "set_ratio", "game_ratio" ]
statusstringFacultatifenum: draft, published, in_progress, finisheddraft

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Exemple de requête

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

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 201

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Champs du corps JSON

Supply display_name or a valid player_id.

ParamètreTypeObligatoireDescriptionContraintesExemple
player_idintegerFacultatif42
display_namestringFacultatifLucas Martin
member1_namestringFacultatifstring
member2_namestringFacultatifstring
member1_player_idintegerFacultatif1
member2_player_idintegerFacultatif1
emailstring (email)Facultatifdeveloper@example.com
seedintegerFacultatifmin: 0 · max: 1281
groupintegerFacultatifmin: 0 · max: 321
manual_rankintegerFacultatif1
statusstringFacultatifenum: pending, accepted, rejected · default: acceptedaccepted

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18
participantIdpathintegerObligatoireTournament participant identifier.min: 164

Champs du corps JSON

Supply only the participant fields that need to change.

ParamètreTypeObligatoireDescriptionContraintesExemple
player_idintegerFacultatif42
display_namestringFacultatifLucas Martin
member1_namestringFacultatifstring
member2_namestringFacultatifstring
member1_player_idintegerFacultatif1
member2_player_idintegerFacultatif1
emailstring (email)Facultatifdeveloper@example.com
seedintegerFacultatifmin: 0 · max: 1281
groupintegerFacultatifmin: 0 · max: 321
manual_rankintegerFacultatif1
statusstringFacultatifenum: pending, accepted, rejected · default: acceptedaccepted

Exemple de requête

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" }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18
participantIdpathintegerObligatoireTournament participant identifier.min: 164

Exemple de requête

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

Exemple de réponse · HTTP 200

{
    "data": {
        "id": 64,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/courts List tournament courts tournaments:read
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 201

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
namestringObligatoireCourt 1
sort_orderintegerFacultatifmin: 0 · max: 10001

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18
courtIdpathintegerObligatoireTournament court identifier.min: 15

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
namestringObligatoireCourt 1
sort_orderintegerFacultatifmin: 0 · max: 10001

Exemple de requête

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 }'

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18
courtIdpathintegerObligatoireTournament court identifier.min: 15

Exemple de requête

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

Exemple de réponse · HTTP 200

{
    "data": {
        "id": 5,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/matches List draw and scheduled matches tournaments:read
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18
tournamentMatchIdpathintegerObligatoireTournament match identifier.min: 191

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
court_idintegerFacultatif1
scheduled_atstringFacultatifLocal time in the tournament timezone. Send an empty string to unschedule.2026-09-27 14:30
duration_minutesintegerFacultatifmin: 15 · max: 3601
forcebooleanFacultatifAllow scheduling despite reported conflicts.false
commentstringFacultatifstring
statusstringFacultatifenum: ready, scheduled, called, warmup, live, suspended, postponed, finished, walkover, retired, no_show, disqualified, cancelledready
winner_participant_idintegerFacultatif1
outcome_notestringFacultatifstring

Exemple de requête

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" }'

Exemple de réponse · 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
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Exemple de requête

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

Exemple de réponse · 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
Propriété : clé API exacte
Paramètres et exemplesRéponse réussie · HTTP 200

Paramètres de la requête

ParamètreEmplacementTypeObligatoireDescriptionContraintesExemple
AuthorizationheaderstringObligatoireClé API Bearer utilisée pour authentifier la requête.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringObligatoireFormat JSON du corps de la requête.application/jsonapplication/json
Idempotency-KeyheaderstringFacultatifValeur unique recommandée pour éviter un doublon lors d’une nouvelle tentative réseau.request-unique-id
tournamentIdpathintegerObligatoireTournament identifier.min: 18

Champs du corps JSON

ParamètreTypeObligatoireDescriptionContraintesExemple
slotsarray<integer>FacultatifOptional ordered participant IDs for manual knockout placement.[]

Exemple de requête

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 '[]'

Exemple de réponse · 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"
    }
}