curl --request GET \
--url https://padelapi.org/api/matches/{match} \
--header 'Authorization: Bearer <token>'import requests
url = "https://padelapi.org/api/matches/{match}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://padelapi.org/api/matches/{match}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://padelapi.org/api/matches/{match}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://padelapi.org/api/matches/{match}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://padelapi.org/api/matches/{match}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://padelapi.org/api/matches/{match}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": 123,
"self": "<string>",
"name": "<string>",
"url": "<string>",
"category": "men",
"draw": "main",
"watchability": 123,
"round": 123,
"round_name": "<string>",
"index": 123,
"seeds": "<string>",
"played_at": "<string>",
"schedule_label": "<string>",
"scheduled_at": "<string>",
"scheduled_at_local": "<string>",
"court": "<string>",
"court_order": 123,
"status": "scheduled",
"score": "<string>",
"winner": "<string>",
"started_time": "<string>",
"started_time_local": "<string>",
"duration": "<string>",
"players": {
"team_1": [
{
"id": 123,
"self": "<string>",
"name": "<string>",
"side": "drive",
"connections": "<string>"
}
],
"team_2": [
{
"id": 123,
"self": "<string>",
"name": "<string>",
"side": "drive",
"connections": "<string>"
}
]
},
"updated_at": "<string>",
"connections": "<string>",
"tournament": {
"id": 123,
"self": "<string>",
"name": "<string>",
"url": "<string>",
"photo_url": "<string>",
"location": "<string>",
"venue": {
"name": "<string>",
"address": "<string>"
},
"country": "<string>",
"timezone": "<string>",
"level": "major",
"status": "pending",
"court_type": "indoor",
"prize": {
"amount": 123,
"currency": "<string>"
},
"start_date": "<string>",
"end_date": "<string>",
"winners": {},
"links": "<string>",
"updated_at": "<string>",
"connections": "<string>"
}
}{
"message": "<string>"
}{
"message": "Subscription required."
}{
"message": "<string>"
}Show Match
Endpoint to retrieve details of a specific match including teams, scores, and result. Use related endpoints for stats or point-by-point data.
Merged matches return a 302 redirect to the canonical resource — see the Data Synchronization guide for handling redirects.
curl --request GET \
--url https://padelapi.org/api/matches/{match} \
--header 'Authorization: Bearer <token>'import requests
url = "https://padelapi.org/api/matches/{match}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://padelapi.org/api/matches/{match}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://padelapi.org/api/matches/{match}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://padelapi.org/api/matches/{match}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://padelapi.org/api/matches/{match}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://padelapi.org/api/matches/{match}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": 123,
"self": "<string>",
"name": "<string>",
"url": "<string>",
"category": "men",
"draw": "main",
"watchability": 123,
"round": 123,
"round_name": "<string>",
"index": 123,
"seeds": "<string>",
"played_at": "<string>",
"schedule_label": "<string>",
"scheduled_at": "<string>",
"scheduled_at_local": "<string>",
"court": "<string>",
"court_order": 123,
"status": "scheduled",
"score": "<string>",
"winner": "<string>",
"started_time": "<string>",
"started_time_local": "<string>",
"duration": "<string>",
"players": {
"team_1": [
{
"id": 123,
"self": "<string>",
"name": "<string>",
"side": "drive",
"connections": "<string>"
}
],
"team_2": [
{
"id": 123,
"self": "<string>",
"name": "<string>",
"side": "drive",
"connections": "<string>"
}
]
},
"updated_at": "<string>",
"connections": "<string>",
"tournament": {
"id": 123,
"self": "<string>",
"name": "<string>",
"url": "<string>",
"photo_url": "<string>",
"location": "<string>",
"venue": {
"name": "<string>",
"address": "<string>"
},
"country": "<string>",
"timezone": "<string>",
"level": "major",
"status": "pending",
"court_type": "indoor",
"prize": {
"amount": 123,
"currency": "<string>"
},
"start_date": "<string>",
"end_date": "<string>",
"winners": {},
"links": "<string>",
"updated_at": "<string>",
"connections": "<string>"
}
}{
"message": "<string>"
}{
"message": "Subscription required."
}{
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
MatchResource
Unique identifier of the match. Stable across requests, use it to reference the match from your own data.
Path to this match's endpoint, relative to https://padelapi.org.
Surnames of both teams, in the form Surname/Surname - Surname/Surname. Convenience label for display, not a stable identifier.
Public match page. null when the match has no page.
Gender category the match belongs to. Men's and women's competitions run in parallel at the same tournament, so pair this with round to place a match.
men, women Draw the match belongs to: main for the main draw, qualy for the qualification draw. Listings return the main draw unless you ask for ?draw=qualy or ?draw=all, which return qualification matches and require a paid plan: on the free plan any request for qualification matches responds with a 402, whether you filter a listing or fetch one by id.
main, qualy Padel API Watchability Index of the match, from 0 to 100: how much the match is expected to be worth watching. null until both pairs are known. On the free plan this field returns hidden_free_plan; paid plans include it for every match. See the Match Watchability Index guide for how it is built and how to read it.
Stage of the draw as the number of matches in that round: 1 for the final, 2 semifinals, 4 quarterfinals, 8 round of 16, and so on. Lower values are later stages, so sorting ascending walks the draw backwards from the final.
Human-readable form of round (e.g. Finals, Semifinals, Quarter, Round of 16). Match on round rather than on this field.
Zero-based position of the match within its round, counted from the top of the draw. Together with round and category it identifies a slot in the bracket.
Each team's draw marker as a string: seed number (e.g. "1"), or entry code ("WC"/"Q"/"LL"/"ALT") for unseeded special entries; null when entered by ranking unseeded. Always a {team_1, team_2} object.
Day the match is played, as YYYY-MM-DD, in the tournament's local date. Use this for day-level filtering and scheduled_at for the exact time.
Human-readable form of scheduled_at, including how firm the time is: announced by the tournament ("Starting at 9:00 AM", "Not before 4:00 PM") or, for matches without an announced time, estimated from the court's order of play ("Estimated around 12:30 PM") and recalculated hourly. See the schedule estimates guide for how estimates are built and how accurate they are.
Expected start of the match in server timezone (Europe/Madrid), whether the time was announced by the tournament or estimated. Sort and compare on this field.
Same instant as scheduled_at, serialized in the tournament's timezone.
Name of the court the match is played on, as announced by the tournament (e.g. Centre Court). null when the court has not been assigned.
Position of the match in the order of play for its court that day, starting at 1. Sort by this field to follow a court's schedule. null when the order of play has not been published.
Current state of the match. See the statuses reference for the full list, including which values are permanent and which still change.
scheduled, live, ended, finished, retired, walkover, bye Final score of the match, as one {team_1, team_2} object per set played, in order. Games are strings, and a tiebreak set carries the points in parentheses (e.g. "7(5)"). null before the match has a result. On the free plan, matches played more than 6 months ago return hidden_free_plan; paid plans include the full historical archive.
Winning team (team_1 or team_2). On the free plan, matches played more than 6 months ago return hidden_free_plan; paid plans include the full historical archive.
Actual start of play (first tracked point, after warm-up), in server timezone (Europe/Madrid). Distinct from scheduled_at, which is the expected start time. On the free plan this field returns hidden_free_plan; paid plans include it for every match.
Same instant as started_time, serialized in the tournament's timezone. On the free plan this field returns hidden_free_plan; paid plans include it for every match.
Time on court as HH:MM (e.g. 01:25), measured from the first tracked point to the last. null for matches without live tracking or still in progress. On the free plan this field returns hidden_free_plan; paid plans include it for every match.
The two pairs facing each other. team_1 and team_2 are fixed for the match, so winner, score and seeds all refer to these same keys.
Show child attributes
Show child attributes
ISO 8601 timestamp of the last change to any field of this match, including score and schedule. Poll on this field to pick up only what has moved, as described in the data synchronization guide.
Related endpoints for this match. prev and next chain the order of play on the same court, not the progression through the draw, and are absent at either end of the day. video appears when there is footage, and stats and live are only present for tournaments with detailed coverage.
Tournament this match belongs to, embedded in full. Only present on MCP requests; on the REST API use connections.tournament instead.
Show child attributes
Show child attributes