A versioned REST API for matches, live scoring, players, clubs and tournaments.
Ownership is checked against the exact API key, not only the developer account or linked My Court Score account.
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
https://mycourtscore.com/api/v1curl "https://mycourtscore.com/api/v1/me" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
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.
/health
Check API availability
Public
No parameter is required.
curl -X GET "https://mycourtscore.com/api/v1/health"{
"data": {
"status": "ok",
"version": "v1",
"time": "2026-09-27T14:12:08+00:00"
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/me
Read the developer key identity and linked account
authenticated
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
curl -X GET "https://mycourtscore.com/api/v1/me" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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
List matches visible to the API key
matches:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
page | query | integer | Optional | Page number, starting at 1. | 1 | |
per_page | query | integer | Optional | Items per page, from 1 to 100. | 25 | |
status | query | string | Optional | Filter by match status. | enum: active, finished | active |
q | query | string | Optional | Search by player, title, court or match number. | Lucas | |
updated_since | query | string | Optional | Only matches updated since this ISO 8601 date and time. | 2026-09-27T12:00:00Z |
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"{
"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
}
}
}/matches
Create a match
matches:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
title | string | Optional | Match title. | Club championship | |
type | string | Optional | Match category. | Singles | |
court_name | string | Optional | Court 1 | ||
player1 | string | Required | Displayed name for player 1. Required when player1_id is not supplied. | Lucas Martin | |
player2 | string | Required | Displayed name for player 2. Required when player2_id is not supplied. | Nathan Smith | |
player1_id | integer | Optional | Optional official player identifier. | 42 | |
player2_id | integer | Optional | Optional official player identifier. | 57 | |
player1_club_id | integer | Optional | 18 | ||
player2_club_id | integer | Optional | 18 | ||
sets_to_win | integer | Optional | min: 1 · max: 3 · default: 2 | 2 | |
games_to_win_set | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_enabled | boolean | Optional | default: true | true | |
tie_break_at_games | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_points | integer | Optional | min: 3 · max: 30 · default: 7 | 7 | |
final_set_rule | string | Optional | enum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreak | regular_tiebreak | |
final_set_tiebreak_points | integer | Optional | min: 3 · max: 30 · default: 10 | 10 | |
no_ad_scoring | boolean | Optional | default: false | false | |
advanced_point_mode | boolean | Optional | default: false | false | |
livechat_enabled | boolean | Optional | default: false | false | |
initial_server | integer | Optional | enum: 1, 2 · default: 1 | 1 | |
public_access | string | Optional | enum: open, password, hidden · default: open | open | |
public_password | string | Optional | Required only when public_access is password. | minLength: 4 | string |
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 }'{
"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"
}
}/matches/{matchId}
Read a match and its current score
matches:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
curl -X GET "https://mycourtscore.com/api/v1/matches/125" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/matches/{matchId}
Update match information and rules
matches:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
Supply only the match fields that need to change.
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
title | string | Optional | Match title. | Club championship | |
type | string | Optional | Match category. | Singles | |
court_name | string | Optional | Court 1 | ||
player1 | string | Optional | Displayed name for player 1. Required when player1_id is not supplied. | Lucas Martin | |
player2 | string | Optional | Displayed name for player 2. Required when player2_id is not supplied. | Nathan Smith | |
player1_id | integer | Optional | Optional official player identifier. | 42 | |
player2_id | integer | Optional | Optional official player identifier. | 57 | |
player1_club_id | integer | Optional | 18 | ||
player2_club_id | integer | Optional | 18 | ||
sets_to_win | integer | Optional | min: 1 · max: 3 · default: 2 | 2 | |
games_to_win_set | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_enabled | boolean | Optional | default: true | true | |
tie_break_at_games | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_points | integer | Optional | min: 3 · max: 30 · default: 7 | 7 | |
final_set_rule | string | Optional | enum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreak | regular_tiebreak | |
final_set_tiebreak_points | integer | Optional | min: 3 · max: 30 · default: 10 | 10 | |
no_ad_scoring | boolean | Optional | default: false | false | |
advanced_point_mode | boolean | Optional | default: false | false | |
livechat_enabled | boolean | Optional | default: false | false | |
initial_server | integer | Optional | enum: 1, 2 · default: 1 | 1 | |
public_access | string | Optional | enum: open, password, hidden · default: open | open | |
public_password | string | Optional | Required only when public_access is password. | minLength: 4 | string |
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" }'{
"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"
}
}/matches/{matchId}
Delete an eligible unstarted match
matches:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
curl -X DELETE "https://mycourtscore.com/api/v1/matches/125" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: request-unique-id"{
"data": {
"id": 125,
"deleted": true
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/matches/{matchId}/score
Read the live score payload
matches:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
curl -X GET "https://mycourtscore.com/api/v1/matches/125/score" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/matches/{matchId}/events
List scoring and administration events
matches:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
limit | query | integer | Optional | Maximum number of recent events, from 1 to 200. | 50 |
curl -X GET "https://mycourtscore.com/api/v1/matches/125/events?limit=50" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/matches/{matchId}/points
Award a point to player 1 or player 2
score:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
winner | integer | Required | enum: 1, 2 | 1 | |
reason | string | Optional | enum: normal, ace, winner, forced_error, unforced_error, double_fault, out, net | normal | |
responsible_player | integer | Optional | enum: 0, 1, 2 | 0 |
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 }'{
"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"
}
}/matches/{matchId}/undo
Undo the last point
score:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
No JSON fields. Send an empty {} object when a body is required.
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 '{}'{
"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"
}
}/matches/{matchId}/server
Change the serving player
score:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
server | integer | Required | enum: 1, 2 | 1 |
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 }'{
"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"
}
}/matches/{matchId}/reset
Reset the complete score
score:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
No JSON fields. Send an empty {} object when a body is required.
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 '{}'{
"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"
}
}/matches/{matchId}/finish
Finish a match with a declared winner
score:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
winner | integer | Required | enum: 1, 2 | 1 |
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 }'{
"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"
}
}/matches/{matchId}/reopen
Reopen a finished match
score:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
matchId | path | integer | Required | My Court Score match identifier. | min: 1 | 125 |
No JSON fields. Send an empty {} object when a body is required.
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 '{}'{
"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
Search official players or list linked players
players:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
page | query | integer | Optional | Page number, starting at 1. | 1 | |
per_page | query | integer | Optional | Items per page, from 1 to 100. | 25 | |
q | query | string | Optional | Search by name or club. | Lucas | |
mine | query | boolean | Optional | Only return the linked primary and secondary players. | true | |
club_id | query | integer | Optional | Filter by club. | 18 |
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"{
"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
}
}
}/players
Create the primary player account or a secondary player
players:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id |
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.
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
first_name | string | Required | Player first name. | Lucas | |
last_name | string | Required | Player last name. | Martin | |
email | string (email) | Optional | Required when creating the primary player account. | lucas@example.com | |
password | string (password) | Optional | Required when creating the primary player account. | minLength: 8 | ChangeMe-2026 |
club_id | integer | Optional | 18 | ||
club_name | string | Optional | Central Tennis Club | ||
federation_number | string | Optional | BE-123456 | ||
birth_date | string (date) | Optional | 2008-04-12 | ||
phone | string | Optional | string | ||
mobile | string | Optional | string | ||
city | string | Optional | Brussels | ||
country | string | Optional | Belgium | ||
notes | string | Optional | string | ||
lang | string | Optional | enum: fr, en, nl, de, es, it · default: en | en |
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" }'{
"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"
}
}/players/{playerId}
Read a permitted player profile
players:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
playerId | path | integer | Required | Official or secondary player identifier. | min: 1 | 42 |
curl -X GET "https://mycourtscore.com/api/v1/players/42" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/players/{playerId}
Update a linked player profile
players:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
playerId | path | integer | Required | Official or secondary player identifier. | min: 1 | 42 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
first_name | string | Optional | string | ||
last_name | string | Optional | string | ||
club_id | integer | Optional | 1 | ||
federation_number | string | Optional | string | ||
birth_date | string (date) | Optional | 2026-09-27 | ||
phone | string | Optional | string | ||
mobile | string | Optional | string | ||
city | string | Optional | string | ||
country | string | Optional | string | ||
notes | string | Optional | string |
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" }'{
"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"
}
}/players/{playerId}
Delete a linked secondary player
players:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
playerId | path | integer | Required | Official or secondary player identifier. | min: 1 | 42 |
curl -X DELETE "https://mycourtscore.com/api/v1/players/42" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: request-unique-id"{
"data": {
"id": 42,
"deleted": true
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/clubs
List and search active clubs
clubs:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
page | query | integer | Optional | Page number, starting at 1. | 1 | |
per_page | query | integer | Optional | Items per page, from 1 to 100. | 25 | |
q | query | string | Optional | Search by club name, city or country. | Central |
curl -X GET "https://mycourtscore.com/api/v1/clubs?page=1&per_page=25&q=Central" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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
}
}
}/clubs
Create a club and link the developer account
clubs:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
club_name | string | Required | Official club name. | Central Tennis Club | |
short_name | string | Optional | CTC | ||
description | string | Optional | string | ||
contact_person | string | Optional | string | ||
email | string (email) | Required | club@example.com | ||
password | string (password) | Required | minLength: 8 | ChangeMe-2026 | |
public_email | string (email) | Optional | developer@example.com | ||
phone | string | Optional | string | ||
mobile | string | Optional | string | ||
address_line1 | string | Optional | string | ||
address_line2 | string | Optional | string | ||
postal_code | string | Optional | string | ||
city | string | Optional | Brussels | ||
region | string | Optional | string | ||
country | string | Optional | Belgium | ||
website | string (uri) | Optional | string | ||
federation_name | string | Optional | string | ||
registration_number | string | Optional | string | ||
timezone | string | Optional | Valid IANA timezone. | Europe/Brussels | |
court_count | integer | Optional | min: 0 · max: 500 | 4 | |
lang | string | Optional | enum: fr, en, nl, de, es, it · default: en | en |
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" }'{
"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"
}
}/clubs/{clubId}
Read public club information
clubs:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
clubId | path | integer | Required | Club identifier. | min: 1 | 18 |
curl -X GET "https://mycourtscore.com/api/v1/clubs/18" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/clubs/{clubId}
Update the linked club profile
clubs:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
clubId | path | integer | Required | Club identifier. | min: 1 | 18 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
club_name | string | Optional | string | ||
short_name | string | Optional | string | ||
description | string | Optional | string | ||
logo_url | string (uri) | Optional | string | ||
contact_person | string | Optional | string | ||
public_email | string (email) | Optional | developer@example.com | ||
phone | string | Optional | string | ||
mobile | string | Optional | string | ||
address_line1 | string | Optional | string | ||
address_line2 | string | Optional | string | ||
postal_code | string | Optional | string | ||
city | string | Optional | string | ||
region | string | Optional | string | ||
country | string | Optional | string | ||
website | string (uri) | Optional | string | ||
federation_name | string | Optional | string | ||
registration_number | string | Optional | string | ||
timezone | string | Optional | Europe/Brussels | ||
court_count | integer | Optional | min: 0 · max: 500 | 1 | |
live_match_visibility | string | Optional | enum: forever, until_finished, same_day | forever |
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 }'{
"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"
}
}/clubs/{clubId}/matches
List matches owned by the linked club
matches:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
clubId | path | integer | Required | Club identifier. | min: 1 | 18 |
page | query | integer | Optional | Page number, starting at 1. | 1 | |
per_page | query | integer | Optional | Items per page, from 1 to 100. | 25 | |
status | query | string | Optional | Filter by match status. | enum: active, finished | active |
q | query | string | Optional | Search by player, title or court. | Lucas | |
updated_since | query | string | Optional | Only matches updated since this ISO 8601 date and time. | 2026-09-27T12:00:00Z |
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"{
"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
List public or linked-club tournaments
tournaments:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
page | query | integer | Optional | Page number, starting at 1. | 1 | |
per_page | query | integer | Optional | Items per page, from 1 to 100. | 25 | |
status | query | string | Optional | Filter by tournament status. | enum: draft, published, in_progress, finished | published |
q | query | string | Optional | Search by name, category or venue. | Weekend Open |
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"{
"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
}
}
}/tournaments
Create a club tournament
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
name | string | Required | Tournament name. | Weekend Open | |
description | string | Optional | string | ||
category | string | Optional | Open | ||
format | string | Optional | enum: single_elimination, round_robin, group_knockout, group_divisions · default: single_elimination | single_elimination | |
entry_type | string | Optional | enum: player, team · default: player | player | |
start_date | string (date) | Required | 2026-09-27 | ||
end_date | string (date) | Required | 2026-09-28 | ||
venue | string | Optional | Central Tennis Club | ||
timezone | string | Optional | Europe/Brussels | ||
registration_open | boolean | Optional | default: false | false | |
max_participants | integer | Optional | min: 2 · max: 128 · default: 32 | 32 | |
group_count | integer | Optional | min: 1 · max: 32 · default: 1 | 1 | |
qualifiers_per_group | integer | Optional | min: 1 · max: 8 · default: 2 | 2 | |
division_count | integer | Optional | min: 1 · max: 8 | 1 | |
sets_to_win | integer | Optional | min: 1 · max: 3 · default: 2 | 2 | |
games_to_win_set | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_enabled | boolean | Optional | default: true | true | |
tie_break_at_games | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_points | integer | Optional | min: 3 · max: 30 · default: 7 | 7 | |
final_set_rule | string | Optional | enum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreak | regular_tiebreak | |
final_set_tiebreak_points | integer | Optional | min: 3 · max: 30 · default: 10 | 10 | |
no_ad_scoring | boolean | Optional | default: false | false | |
group_sets_to_win | integer | Optional | min: 1 · max: 3 · default: 1 | 1 | |
group_games_to_win_set | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
group_tie_break_enabled | boolean | Optional | default: true | true | |
group_tie_break_at_games | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
group_tie_break_points | integer | Optional | min: 3 · max: 30 · default: 7 | 7 | |
group_no_ad_scoring | boolean | Optional | default: false | false | |
minimum_rest_minutes | integer | Optional | min: 0 · max: 1440 · default: 30 | 30 | |
estimated_match_minutes | integer | Optional | min: 10 · max: 1440 · default: 60 | 60 | |
schedule_slot_minutes | integer | Optional | min: 5 · max: 720 · default: 30 | 30 | |
ranking_rules | array<string> | Optional | [
"match_wins",
"head_to_head",
"set_ratio",
"game_ratio"
] |
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 }'{
"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"
}
}/tournaments/{tournamentId}
Read tournament configuration and counts
tournaments:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
curl -X GET "https://mycourtscore.com/api/v1/tournaments/8" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/tournaments/{tournamentId}
Update tournament configuration
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
Supply only the tournament fields that need to change.
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
name | string | Optional | Tournament name. | Weekend Open | |
description | string | Optional | string | ||
category | string | Optional | Open | ||
format | string | Optional | enum: single_elimination, round_robin, group_knockout, group_divisions · default: single_elimination | single_elimination | |
entry_type | string | Optional | enum: player, team · default: player | player | |
start_date | string (date) | Optional | 2026-09-27 | ||
end_date | string (date) | Optional | 2026-09-28 | ||
venue | string | Optional | Central Tennis Club | ||
timezone | string | Optional | Europe/Brussels | ||
registration_open | boolean | Optional | default: false | false | |
max_participants | integer | Optional | min: 2 · max: 128 · default: 32 | 32 | |
group_count | integer | Optional | min: 1 · max: 32 · default: 1 | 1 | |
qualifiers_per_group | integer | Optional | min: 1 · max: 8 · default: 2 | 2 | |
division_count | integer | Optional | min: 1 · max: 8 | 1 | |
sets_to_win | integer | Optional | min: 1 · max: 3 · default: 2 | 2 | |
games_to_win_set | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_enabled | boolean | Optional | default: true | true | |
tie_break_at_games | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
tie_break_points | integer | Optional | min: 3 · max: 30 · default: 7 | 7 | |
final_set_rule | string | Optional | enum: regular_tiebreak, no_tiebreak, super_tiebreak · default: regular_tiebreak | regular_tiebreak | |
final_set_tiebreak_points | integer | Optional | min: 3 · max: 30 · default: 10 | 10 | |
no_ad_scoring | boolean | Optional | default: false | false | |
group_sets_to_win | integer | Optional | min: 1 · max: 3 · default: 1 | 1 | |
group_games_to_win_set | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
group_tie_break_enabled | boolean | Optional | default: true | true | |
group_tie_break_at_games | integer | Optional | min: 1 · max: 12 · default: 6 | 6 | |
group_tie_break_points | integer | Optional | min: 3 · max: 30 · default: 7 | 7 | |
group_no_ad_scoring | boolean | Optional | default: false | false | |
minimum_rest_minutes | integer | Optional | min: 0 · max: 1440 · default: 30 | 30 | |
estimated_match_minutes | integer | Optional | min: 10 · max: 1440 · default: 60 | 60 | |
schedule_slot_minutes | integer | Optional | min: 5 · max: 720 · default: 30 | 30 | |
ranking_rules | array<string> | Optional | [
"match_wins",
"head_to_head",
"set_ratio",
"game_ratio"
] | ||
status | string | Optional | enum: draft, published, in_progress, finished | draft |
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 }'{
"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"
}
}/tournaments/{tournamentId}
Delete and archive a tournament
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
curl -X DELETE "https://mycourtscore.com/api/v1/tournaments/8" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: request-unique-id"{
"data": {
"id": 8,
"deleted": true,
"deletion_archive_id": 3
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/tournaments/{tournamentId}/participants
List tournament participants
tournaments:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/participants" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/tournaments/{tournamentId}/participants
Add a participant or team
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
Supply display_name or a valid player_id.
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
player_id | integer | Optional | 42 | ||
display_name | string | Optional | Lucas Martin | ||
member1_name | string | Optional | string | ||
member2_name | string | Optional | string | ||
member1_player_id | integer | Optional | 1 | ||
member2_player_id | integer | Optional | 1 | ||
email | string (email) | Optional | developer@example.com | ||
seed | integer | Optional | min: 0 · max: 128 | 1 | |
group | integer | Optional | min: 0 · max: 32 | 1 | |
manual_rank | integer | Optional | 1 | ||
status | string | Optional | enum: pending, accepted, rejected · default: accepted | accepted |
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 }'{
"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"
}
}/tournaments/{tournamentId}/participants/{participantId}
Update a participant, seed or group
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
participantId | path | integer | Required | Tournament participant identifier. | min: 1 | 64 |
Supply only the participant fields that need to change.
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
player_id | integer | Optional | 42 | ||
display_name | string | Optional | Lucas Martin | ||
member1_name | string | Optional | string | ||
member2_name | string | Optional | string | ||
member1_player_id | integer | Optional | 1 | ||
member2_player_id | integer | Optional | 1 | ||
email | string (email) | Optional | developer@example.com | ||
seed | integer | Optional | min: 0 · max: 128 | 1 | |
group | integer | Optional | min: 0 · max: 32 | 1 | |
manual_rank | integer | Optional | 1 | ||
status | string | Optional | enum: pending, accepted, rejected · default: accepted | accepted |
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" }'{
"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"
}
}/tournaments/{tournamentId}/participants/{participantId}
Remove a participant before draw generation
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
participantId | path | integer | Required | Tournament participant identifier. | min: 1 | 64 |
curl -X DELETE "https://mycourtscore.com/api/v1/tournaments/8/participants/64" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: request-unique-id"{
"data": {
"id": 64,
"deleted": true
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/tournaments/{tournamentId}/courts
List tournament courts
tournaments:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/courts" \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": [
{
"id": 5,
"tournament_id": 8,
"name": "Court 1",
"sort_order": 1
}
],
"meta": {
"request_id": "req_01HXYZ123"
}
}/tournaments/{tournamentId}/courts
Add a tournament court
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
name | string | Required | Court 1 | ||
sort_order | integer | Optional | min: 0 · max: 1000 | 1 |
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 }'{
"data": {
"id": 5,
"tournament_id": 8,
"name": "Court 1",
"sort_order": 1
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/tournaments/{tournamentId}/courts/{courtId}
Rename or reorder a court
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
courtId | path | integer | Required | Tournament court identifier. | min: 1 | 5 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
name | string | Required | Court 1 | ||
sort_order | integer | Optional | min: 0 · max: 1000 | 1 |
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 }'{
"data": {
"id": 5,
"tournament_id": 8,
"name": "Court 1",
"sort_order": 1
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/tournaments/{tournamentId}/courts/{courtId}
Delete an unused tournament court
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
courtId | path | integer | Required | Tournament court identifier. | min: 1 | 5 |
curl -X DELETE "https://mycourtscore.com/api/v1/tournaments/8/courts/5" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: request-unique-id"{
"data": {
"id": 5,
"deleted": true
},
"meta": {
"request_id": "req_01HXYZ123"
}
}/tournaments/{tournamentId}/matches
List draw and scheduled matches
tournaments:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/matches" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/tournaments/{tournamentId}/matches/{tournamentMatchId}
Schedule a match, update its state or declare an outcome
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
tournamentMatchId | path | integer | Required | Tournament match identifier. | min: 1 | 91 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
court_id | integer | Optional | 1 | ||
scheduled_at | string | Optional | Local time in the tournament timezone. Send an empty string to unschedule. | 2026-09-27 14:30 | |
duration_minutes | integer | Optional | min: 15 · max: 360 | 1 | |
force | boolean | Optional | Allow scheduling despite reported conflicts. | false | |
comment | string | Optional | string | ||
status | string | Optional | enum: ready, scheduled, called, warmup, live, suspended, postponed, finished, walkover, retired, no_show, disqualified, cancelled | ready | |
winner_participant_id | integer | Optional | 1 | ||
outcome_note | string | Optional | string |
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" }'{
"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"
}
}/tournaments/{tournamentId}/standings
Read group standings and tie-break details
tournaments:read
| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
curl -X GET "https://mycourtscore.com/api/v1/tournaments/8/standings" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"
}
}/tournaments/{tournamentId}/generate-draw
Generate group matches or an elimination draw
tournaments:write| Parameter | Location | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|---|
Authorization | header | string | Required | Bearer API key used to authenticate the request. | Bearer mcs_live_... | Bearer YOUR_API_KEY |
Content-Type | header | string | Required | JSON request body format. | application/json | application/json |
Idempotency-Key | header | string | Optional | Recommended unique value to prevent duplicates after a network retry. | request-unique-id | |
tournamentId | path | integer | Required | Tournament identifier. | min: 1 | 8 |
| Parameter | Type | Required | Description | Constraints | Example |
|---|---|---|---|---|---|
slots | array<integer> | Optional | Optional ordered participant IDs for manual knockout placement. | [] |
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 '[]'{
"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"
}
}