List matches
const url = 'https://api.krkplaystennis.example/v1/matches?limit=20&cursor=bWF0XzJ2YjZucDRrdGY&player_id=plr_2b7xq9mhk4&competition_id=cmp_6tw2hn8rxe&status=completed&rating_status=pending&played_after=2026-10-01T00%3A00%3A00%2B02%3A00&played_before=2026-11-01T00%3A00%3A00%2B01%3A00';const options = {method: 'GET', headers: {'X-API-Key': '<X-API-Key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.krkplaystennis.example/v1/matches?limit=20&cursor=bWF0XzJ2YjZucDRrdGY&player_id=plr_2b7xq9mhk4&competition_id=cmp_6tw2hn8rxe&status=completed&rating_status=pending&played_after=2026-10-01T00%3A00%3A00%2B02%3A00&played_before=2026-11-01T00%3A00%3A00%2B01%3A00' \ --header 'X-API-Key: <X-API-Key>'Returns matches ordered by played_at, newest first. Combine filters to narrow the results.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Maximum number of items to return.
The next_cursor value from the previous page. Omit it to get the first page.
Example
bWF0XzJ2YjZucDRrdGYA player ID. Starts with plr_.
Returns only matches this player took part in.
A competition ID. Starts with cmp_.
Returns only matches in this competition.
How the match ended:
completed: the match was played to the end.retired: a player stopped during the match. The match is rated on the games completed.walkover: a player didn’t show up or withdrew before the match. The match isn’t rated.
Returns only matches with this status.
Whether the match has affected ratings:
pending: the result is recorded, and the rating update hasn’t run yet.rated: both players’ ratings are updated.not_rated: the match doesn’t affect ratings, for example a walkover.
Returns only matches with this rating status.
Returns only matches played at or after this time.
Example
2026-10-01T00:00:00+02:00Returns only matches played before this time.
Example
2026-11-01T00:00:00+01:00Responses
Section titled “Responses”A page of matches.
object
object
A match ID. Starts with mat_.
A competition ID. Starts with cmp_.
A venue ID. Starts with ven_.
The court number at the venue. null if the organizer didn’t send it.
When the match started.
The two players. Every score pair uses this order.
How the match ended:
completed: the match was played to the end.retired: a player stopped during the match. The match is rated on the games completed.walkover: a player didn’t show up or withdrew before the match. The match isn’t rated.
The score, set by set. Every pair of numbers is in the same order as player_ids.
Valid set scores depend on the competition’s match_format.games_per_set. When match_format.final_set is match_tiebreak, a match tiebreak replaces the third set. In a retired match, the last set can be unfinished.
object
object
Two non-negative integers, in the same order as player_ids.
Tiebreak points, only for a set that ended 7-6.
Match tiebreak points, only when the competition’s match_format.final_set is match_tiebreak.
A player ID. Starts with plr_.
Whether the match has affected ratings:
pending: the result is recorded, and the rating update hasn’t run yet.rated: both players’ ratings are updated.not_rated: the match doesn’t affect ratings, for example a walkover.
When the result was submitted.
Pass this value as cursor to get the next page. null means this is the last page.
Examples
Recent matches in the Kraków Autumn League
{ "data": [ { "id": "mat_4nc8xq2vbt", "competition_id": "cmp_6tw2hn8rxe", "venue_id": "ven_7hk2p9wq4m", "court_number": 2, "played_at": "2026-10-10T18:00:00+02:00", "player_ids": [ "plr_2b7xq9mhk4", "plr_9fz3tr6wn1" ], "status": "completed", "score": { "sets": [ { "games": [ 6, 4 ] }, { "games": [ 3, 6 ] } ], "match_tiebreak": [ 10, 7 ] }, "winner_id": "plr_2b7xq9mhk4", "retired_player_id": null, "rating_status": "rated", "created_at": "2026-10-10T20:41:00Z" }, { "id": "mat_7rk3mw9zse", "competition_id": "cmp_6tw2hn8rxe", "venue_id": "ven_3xr8tn5cva", "court_number": 1, "played_at": "2026-10-08T19:00:00+02:00", "player_ids": [ "plr_5jd8vk2lc7", "plr_8mq4ws1yd6" ], "status": "retired", "score": { "sets": [ { "games": [ 6, 2 ] }, { "games": [ 2, 1 ] } ] }, "winner_id": "plr_5jd8vk2lc7", "retired_player_id": "plr_8mq4ws1yd6", "rating_status": "rated", "created_at": "2026-10-08T21:12:00Z" }, { "id": "mat_2vb6np4ktf", "competition_id": "cmp_6tw2hn8rxe", "venue_id": "ven_7hk2p9wq4m", "court_number": null, "played_at": "2026-10-05T10:00:00+02:00", "player_ids": [ "plr_9fz3tr6wn1", "plr_5jd8vk2lc7" ], "status": "walkover", "score": null, "winner_id": "plr_9fz3tr6wn1", "retired_player_id": null, "rating_status": "not_rated", "created_at": "2026-10-05T10:20:00Z" } ], "next_cursor": "bWF0XzJ2YjZucDRrdGY"}The request is malformed, for example a query parameter has the wrong type.
An error, as RFC 9457 problem details.
object
A URL that identifies the error type and links to its documentation.
A short summary of the error type. It’s the same for every error of this type.
The HTTP status code.
An explanation of this occurrence of the error.
The request path that caused the error.
One item per invalid field or parameter. Only for invalid-request, invalid-score, and validation-failed.
object
A JSON Pointer to the invalid field in the request body, or #/ followed by the name of an invalid query parameter.
What’s wrong with the field and how to fix it.
Examples
Limit out of range
{ "type": "https://saverio-cirillo.com/krk-plays-tennis-api/errors/#invalid-request", "title": "Invalid request", "status": 400, "detail": "The request has 1 invalid parameter.", "instance": "/v1/players", "errors": [ { "pointer": "#/limit", "detail": "limit must be between 1 and 100." } ]}The credentials are missing, invalid, or expired.
An error, as RFC 9457 problem details.
object
A URL that identifies the error type and links to its documentation.
A short summary of the error type. It’s the same for every error of this type.
The HTTP status code.
An explanation of this occurrence of the error.
The request path that caused the error.
One item per invalid field or parameter. Only for invalid-request, invalid-score, and validation-failed.
object
A JSON Pointer to the invalid field in the request body, or #/ followed by the name of an invalid query parameter.
What’s wrong with the field and how to fix it.
Examples
Missing API key
{ "type": "https://saverio-cirillo.com/krk-plays-tennis-api/errors/#unauthenticated", "title": "Authentication required", "status": 401, "detail": "Send a valid API key in the X-API-Key header.", "instance": "/v1/players/plr_2b7xq9mhk4"}You sent too many requests. Wait for the number of seconds in Retry-After, then retry.
An error, as RFC 9457 problem details.
object
A URL that identifies the error type and links to its documentation.
A short summary of the error type. It’s the same for every error of this type.
The HTTP status code.
An explanation of this occurrence of the error.
The request path that caused the error.
One item per invalid field or parameter. Only for invalid-request, invalid-score, and validation-failed.
object
A JSON Pointer to the invalid field in the request body, or #/ followed by the name of an invalid query parameter.
What’s wrong with the field and how to fix it.
Examples
Rate limit reached
{ "type": "https://saverio-cirillo.com/krk-plays-tennis-api/errors/#rate-limited", "title": "Rate limit reached", "status": 429, "detail": "This API key is limited to 60 requests per minute. Retry after 30 seconds.", "instance": "/v1/matches"}Headers
Section titled “Headers”Number of seconds to wait before you retry.
Example
30© 2026 Saverio Cirillo · KRKplaysTennis is a fictional API · Built with Starlight