My Court Score Developer Platform

Connect your applications to live tennis

A versioned REST API for matches, live scoring, players, clubs and tournaments.

Important: every resource belongs to the API key that created it

Ownership is checked against the exact API key, not only the developer account or linked My Court Score account.

Example: key A creates match 125. Only key A can later update it, add a point or delete it. Key B is rejected.

Keep one stable key per integration and environment. Revoking or losing that key removes write access to the resources it created. resource_owned_by_another_api_key · resource_not_created_by_api_key

Developer API

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

Create a developer account

Create your developer workspace to generate and manage your API keys.

Quick start

JSON over HTTPS. All protected calls use a bearer key.
Download 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.

Strict ownership: a resource created by an API key can only be updated, deleted or targeted by another write action using that exact same key. Another key from the same account is rejected.

Webhooks are not included in this first version.

Endpoint catalog

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

System

GET /health Check API availability Public
Parameters and examplesSuccessful response · HTTP 200

Request parameters

No parameter is required.

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOptionalPage number, starting at 1.1
per_pagequeryintegerOptionalItems per page, from 1 to 100.25
statusquerystringOptionalFilter by match status.enum: active, finishedactive
qquerystringOptionalSearch by player, title, court or match number.Lucas
updated_sincequerystringOptionalOnly matches updated since this ISO 8601 date and time.2026-09-27T12:00:00Z

Request example

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"

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 201

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
titlestringOptionalMatch title.Club championship
typestringOptionalMatch category.Singles
court_namestringOptionalCourt 1
player1stringRequiredDisplayed name for player 1. Required when player1_id is not supplied.Lucas Martin
player2stringRequiredDisplayed name for player 2. Required when player2_id is not supplied.Nathan Smith
player1_idintegerOptionalOptional official player identifier.42
player2_idintegerOptionalOptional official player identifier.57
player1_club_idintegerOptional18
player2_club_idintegerOptional18
sets_to_winintegerOptionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOptionaldefault: truetrue
tie_break_at_gamesintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOptionalmin: 3 · max: 30 · default: 77
final_set_rulestringOptionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOptionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOptionaldefault: falsefalse
advanced_point_modebooleanOptionaldefault: falsefalse
livechat_enabledbooleanOptionaldefault: falsefalse
initial_serverintegerOptionalenum: 1, 2 · default: 11
public_accessstringOptionalenum: open, password, hidden · default: openopen
public_passwordstringOptionalRequired only when public_access is password.minLength: 4string

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

Supply only the match fields that need to change.

ParameterTypeRequiredDescriptionConstraintsExample
titlestringOptionalMatch title.Club championship
typestringOptionalMatch category.Singles
court_namestringOptionalCourt 1
player1stringOptionalDisplayed name for player 1. Required when player1_id is not supplied.Lucas Martin
player2stringOptionalDisplayed name for player 2. Required when player2_id is not supplied.Nathan Smith
player1_idintegerOptionalOptional official player identifier.42
player2_idintegerOptionalOptional official player identifier.57
player1_club_idintegerOptional18
player2_club_idintegerOptional18
sets_to_winintegerOptionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOptionaldefault: truetrue
tie_break_at_gamesintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOptionalmin: 3 · max: 30 · default: 77
final_set_rulestringOptionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOptionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOptionaldefault: falsefalse
advanced_point_modebooleanOptionaldefault: falsefalse
livechat_enabledbooleanOptionaldefault: falsefalse
initial_serverintegerOptionalenum: 1, 2 · default: 11
public_accessstringOptionalenum: open, password, hidden · default: openopen
public_passwordstringOptionalRequired only when public_access is password.minLength: 4string

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125
limitqueryintegerOptionalMaximum number of recent events, from 1 to 200.50

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
winnerintegerRequiredenum: 1, 21
reasonstringOptionalenum: normal, ace, winner, forced_error, unforced_error, double_fault, out, netnormal
responsible_playerintegerOptionalenum: 0, 1, 20

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

No JSON fields. Send an empty {} object when a body is required.

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
serverintegerRequiredenum: 1, 21

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

No JSON fields. Send an empty {} object when a body is required.

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
winnerintegerRequiredenum: 1, 21

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
matchIdpathintegerRequiredMy Court Score match identifier.min: 1125

JSON body fields

No JSON fields. Send an empty {} object when a body is required.

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOptionalPage number, starting at 1.1
per_pagequeryintegerOptionalItems per page, from 1 to 100.25
qquerystringOptionalSearch by name or club.Lucas
minequerybooleanOptionalOnly return the linked primary and secondary players.true
club_idqueryintegerOptionalFilter by club.18

Request example

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"

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 201

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id

JSON body fields

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.

ParameterTypeRequiredDescriptionConstraintsExample
first_namestringRequiredPlayer first name.Lucas
last_namestringRequiredPlayer last name.Martin
emailstring (email)OptionalRequired when creating the primary player account.lucas@example.com
passwordstring (password)OptionalRequired when creating the primary player account.minLength: 8ChangeMe-2026
club_idintegerOptional18
club_namestringOptionalCentral Tennis Club
federation_numberstringOptionalBE-123456
birth_datestring (date)Optional2008-04-12
phonestringOptionalstring
mobilestringOptionalstring
citystringOptionalBrussels
countrystringOptionalBelgium
notesstringOptionalstring
langstringOptionalenum: fr, en, nl, de, es, it · default: enen

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
playerIdpathintegerRequiredOfficial or secondary player identifier.min: 142

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
playerIdpathintegerRequiredOfficial or secondary player identifier.min: 142

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
first_namestringOptionalstring
last_namestringOptionalstring
club_idintegerOptional1
federation_numberstringOptionalstring
birth_datestring (date)Optional2026-09-27
phonestringOptionalstring
mobilestringOptionalstring
citystringOptionalstring
countrystringOptionalstring
notesstringOptionalstring

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
playerIdpathintegerRequiredOfficial or secondary player identifier.min: 142

Request example

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

Response example · HTTP 200

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

Clubs

GET /clubs List and search active clubs clubs:read
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOptionalPage number, starting at 1.1
per_pagequeryintegerOptionalItems per page, from 1 to 100.25
qquerystringOptionalSearch by club name, city or country.Central

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 201

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
club_namestringRequiredOfficial club name.Central Tennis Club
short_namestringOptionalCTC
descriptionstringOptionalstring
contact_personstringOptionalstring
emailstring (email)Requiredclub@example.com
passwordstring (password)RequiredminLength: 8ChangeMe-2026
public_emailstring (email)Optionaldeveloper@example.com
phonestringOptionalstring
mobilestringOptionalstring
address_line1stringOptionalstring
address_line2stringOptionalstring
postal_codestringOptionalstring
citystringOptionalBrussels
regionstringOptionalstring
countrystringOptionalBelgium
websitestring (uri)Optionalstring
federation_namestringOptionalstring
registration_numberstringOptionalstring
timezonestringOptionalValid IANA timezone.Europe/Brussels
court_countintegerOptionalmin: 0 · max: 5004
langstringOptionalenum: fr, en, nl, de, es, it · default: enen

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
clubIdpathintegerRequiredClub identifier.min: 118

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
clubIdpathintegerRequiredClub identifier.min: 118

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
club_namestringOptionalstring
short_namestringOptionalstring
descriptionstringOptionalstring
logo_urlstring (uri)Optionalstring
contact_personstringOptionalstring
public_emailstring (email)Optionaldeveloper@example.com
phonestringOptionalstring
mobilestringOptionalstring
address_line1stringOptionalstring
address_line2stringOptionalstring
postal_codestringOptionalstring
citystringOptionalstring
regionstringOptionalstring
countrystringOptionalstring
websitestring (uri)Optionalstring
federation_namestringOptionalstring
registration_numberstringOptionalstring
timezonestringOptionalEurope/Brussels
court_countintegerOptionalmin: 0 · max: 5001
live_match_visibilitystringOptionalenum: forever, until_finished, same_dayforever

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
clubIdpathintegerRequiredClub identifier.min: 118
pagequeryintegerOptionalPage number, starting at 1.1
per_pagequeryintegerOptionalItems per page, from 1 to 100.25
statusquerystringOptionalFilter by match status.enum: active, finishedactive
qquerystringOptionalSearch by player, title or court.Lucas
updated_sincequerystringOptionalOnly matches updated since this ISO 8601 date and time.2026-09-27T12:00:00Z

Request example

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"

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
pagequeryintegerOptionalPage number, starting at 1.1
per_pagequeryintegerOptionalItems per page, from 1 to 100.25
statusquerystringOptionalFilter by tournament status.enum: draft, published, in_progress, finishedpublished
qquerystringOptionalSearch by name, category or venue.Weekend Open

Request example

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"

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 201

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
namestringRequiredTournament name.Weekend Open
descriptionstringOptionalstring
categorystringOptionalOpen
formatstringOptionalenum: single_elimination, round_robin, group_knockout, group_divisions · default: single_eliminationsingle_elimination
entry_typestringOptionalenum: player, team · default: playerplayer
start_datestring (date)Required2026-09-27
end_datestring (date)Required2026-09-28
venuestringOptionalCentral Tennis Club
timezonestringOptionalEurope/Brussels
registration_openbooleanOptionaldefault: falsefalse
max_participantsintegerOptionalmin: 2 · max: 128 · default: 3232
group_countintegerOptionalmin: 1 · max: 32 · default: 11
qualifiers_per_groupintegerOptionalmin: 1 · max: 8 · default: 22
division_countintegerOptionalmin: 1 · max: 81
sets_to_winintegerOptionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOptionaldefault: truetrue
tie_break_at_gamesintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOptionalmin: 3 · max: 30 · default: 77
final_set_rulestringOptionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOptionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOptionaldefault: falsefalse
group_sets_to_winintegerOptionalmin: 1 · max: 3 · default: 11
group_games_to_win_setintegerOptionalmin: 1 · max: 12 · default: 66
group_tie_break_enabledbooleanOptionaldefault: truetrue
group_tie_break_at_gamesintegerOptionalmin: 1 · max: 12 · default: 66
group_tie_break_pointsintegerOptionalmin: 3 · max: 30 · default: 77
group_no_ad_scoringbooleanOptionaldefault: falsefalse
minimum_rest_minutesintegerOptionalmin: 0 · max: 1440 · default: 3030
estimated_match_minutesintegerOptionalmin: 10 · max: 1440 · default: 6060
schedule_slot_minutesintegerOptionalmin: 5 · max: 720 · default: 3030
ranking_rulesarray<string>Optional[ "match_wins", "head_to_head", "set_ratio", "game_ratio" ]

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerRequiredTournament identifier.min: 18

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18

JSON body fields

Supply only the tournament fields that need to change.

ParameterTypeRequiredDescriptionConstraintsExample
namestringOptionalTournament name.Weekend Open
descriptionstringOptionalstring
categorystringOptionalOpen
formatstringOptionalenum: single_elimination, round_robin, group_knockout, group_divisions · default: single_eliminationsingle_elimination
entry_typestringOptionalenum: player, team · default: playerplayer
start_datestring (date)Optional2026-09-27
end_datestring (date)Optional2026-09-28
venuestringOptionalCentral Tennis Club
timezonestringOptionalEurope/Brussels
registration_openbooleanOptionaldefault: falsefalse
max_participantsintegerOptionalmin: 2 · max: 128 · default: 3232
group_countintegerOptionalmin: 1 · max: 32 · default: 11
qualifiers_per_groupintegerOptionalmin: 1 · max: 8 · default: 22
division_countintegerOptionalmin: 1 · max: 81
sets_to_winintegerOptionalmin: 1 · max: 3 · default: 22
games_to_win_setintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_enabledbooleanOptionaldefault: truetrue
tie_break_at_gamesintegerOptionalmin: 1 · max: 12 · default: 66
tie_break_pointsintegerOptionalmin: 3 · max: 30 · default: 77
final_set_rulestringOptionalenum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreakregular_tiebreak
final_set_tiebreak_pointsintegerOptionalmin: 3 · max: 30 · default: 1010
no_ad_scoringbooleanOptionaldefault: falsefalse
group_sets_to_winintegerOptionalmin: 1 · max: 3 · default: 11
group_games_to_win_setintegerOptionalmin: 1 · max: 12 · default: 66
group_tie_break_enabledbooleanOptionaldefault: truetrue
group_tie_break_at_gamesintegerOptionalmin: 1 · max: 12 · default: 66
group_tie_break_pointsintegerOptionalmin: 3 · max: 30 · default: 77
group_no_ad_scoringbooleanOptionaldefault: falsefalse
minimum_rest_minutesintegerOptionalmin: 0 · max: 1440 · default: 3030
estimated_match_minutesintegerOptionalmin: 10 · max: 1440 · default: 6060
schedule_slot_minutesintegerOptionalmin: 5 · max: 720 · default: 3030
ranking_rulesarray<string>Optional[ "match_wins", "head_to_head", "set_ratio", "game_ratio" ]
statusstringOptionalenum: draft, published, in_progress, finisheddraft

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerRequiredTournament identifier.min: 18

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 201

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18

JSON body fields

Supply display_name or a valid player_id.

ParameterTypeRequiredDescriptionConstraintsExample
player_idintegerOptional42
display_namestringOptionalLucas Martin
member1_namestringOptionalstring
member2_namestringOptionalstring
member1_player_idintegerOptional1
member2_player_idintegerOptional1
emailstring (email)Optionaldeveloper@example.com
seedintegerOptionalmin: 0 · max: 1281
groupintegerOptionalmin: 0 · max: 321
manual_rankintegerOptional1
statusstringOptionalenum: pending, accepted, rejected · default: acceptedaccepted

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18
participantIdpathintegerRequiredTournament participant identifier.min: 164

JSON body fields

Supply only the participant fields that need to change.

ParameterTypeRequiredDescriptionConstraintsExample
player_idintegerOptional42
display_namestringOptionalLucas Martin
member1_namestringOptionalstring
member2_namestringOptionalstring
member1_player_idintegerOptional1
member2_player_idintegerOptional1
emailstring (email)Optionaldeveloper@example.com
seedintegerOptionalmin: 0 · max: 1281
groupintegerOptionalmin: 0 · max: 321
manual_rankintegerOptional1
statusstringOptionalenum: pending, accepted, rejected · default: acceptedaccepted

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18
participantIdpathintegerRequiredTournament participant identifier.min: 164

Request example

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

Response example · HTTP 200

{
    "data": {
        "id": 64,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/courts List tournament courts tournaments:read
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerRequiredTournament identifier.min: 18

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 201

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
namestringRequiredCourt 1
sort_orderintegerOptionalmin: 0 · max: 10001

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18
courtIdpathintegerRequiredTournament court identifier.min: 15

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
namestringRequiredCourt 1
sort_orderintegerOptionalmin: 0 · max: 10001

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18
courtIdpathintegerRequiredTournament court identifier.min: 15

Request example

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

Response example · HTTP 200

{
    "data": {
        "id": 5,
        "deleted": true
    },
    "meta": {
        "request_id": "req_01HXYZ123"
    }
}
GET /tournaments/{tournamentId}/matches List draw and scheduled matches tournaments:read
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerRequiredTournament identifier.min: 18

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18
tournamentMatchIdpathintegerRequiredTournament match identifier.min: 191

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
court_idintegerOptional1
scheduled_atstringOptionalLocal time in the tournament timezone. Send an empty string to unschedule.2026-09-27 14:30
duration_minutesintegerOptionalmin: 15 · max: 3601
forcebooleanOptionalAllow scheduling despite reported conflicts.false
commentstringOptionalstring
statusstringOptionalenum: ready, scheduled, called, warmup, live, suspended, postponed, finished, walkover, retired, no_show, disqualified, cancelledready
winner_participant_idintegerOptional1
outcome_notestringOptionalstring

Request example

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

Response example · 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
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
tournamentIdpathintegerRequiredTournament identifier.min: 18

Request example

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

Response example · 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
Ownership: exact API key
Parameters and examplesSuccessful response · HTTP 200

Request parameters

ParameterLocationTypeRequiredDescriptionConstraintsExample
AuthorizationheaderstringRequiredBearer API key used to authenticate the request.Bearer mcs_live_...Bearer YOUR_API_KEY
Content-TypeheaderstringRequiredJSON request body format.application/jsonapplication/json
Idempotency-KeyheaderstringOptionalRecommended unique value to prevent duplicates after a network retry.request-unique-id
tournamentIdpathintegerRequiredTournament identifier.min: 18

JSON body fields

ParameterTypeRequiredDescriptionConstraintsExample
slotsarray<integer>OptionalOptional ordered participant IDs for manual knockout placement.[]

Request example

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

Response example · 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"
    }
}