curl --request GET \
--url https://app.framesports.ai/api/v1/fixtures/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.framesports.ai/api/v1/fixtures/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.framesports.ai/api/v1/fixtures/{id}', 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://app.framesports.ai/api/v1/fixtures/{id}",
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://app.framesports.ai/api/v1/fixtures/{id}"
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://app.framesports.ai/api/v1/fixtures/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.framesports.ai/api/v1/fixtures/{id}")
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": "fxt_Ex4mpLeF1xtur31d34567890",
"name": "Sunnybank v Wests | 2nd Grade | Round 3",
"recorded_at": "2023-11-07T05:31:56Z",
"competition": {
"id": 42,
"name": "Queensland Premier Rugby 2026"
},
"sides": [
{
"team": {
"id": "team_Ex4mpLeTe4m1d4567890abc",
"name": "Wests Senior 2nd Team Men's",
"abbreviated_name": "WST",
"gender": "Men's",
"age": "Senior",
"level": "1st Team",
"club": {
"name": "Wests Rugby"
}
},
"jersey_description": "Green and yellow",
"data_source": "analyzed",
"stats": {
"minutes_played": 123,
"involvement_count": 123,
"work_rate": 123,
"work_rate_per_minute": 123,
"player_count": 123,
"ball_in_play_ms": 123,
"positive_tackles": 123,
"negative_tackles": 123,
"tackle_assists": 123,
"tackles_missed": 123,
"positive_carries": 123,
"negative_carries": 123,
"passes": 123,
"offloads": 123,
"turnovers_won_clean": 123,
"turnovers_won_penalty": 123,
"turnovers_lost": 123,
"knock_ons": 123,
"infringements": 123,
"tries": 123,
"successful_conversions": 123,
"missed_conversions": 123,
"successful_penalty_kicks": 123,
"missed_penalty_kicks": 123,
"successful_drop_kicks": 123,
"missed_drop_kicks": 123,
"points_scored": 123,
"kicks": 123,
"kick_distance": 123,
"ruck_arrivals": 123,
"ruck_count": 123,
"average_ruck_duration": 123,
"scrums_won": 123,
"scrums_lost": 123,
"scrums_reset": 123,
"lineouts_won": 123,
"lineouts_lost": 123,
"lineouts_reset": 123,
"twenty_two_meter_entries": 123,
"restart_receives_won": 123,
"restart_receives_lost": 123,
"mauls": 123,
"average_phases_built": 123,
"phase_counts": [
123
],
"try_progress_ratios": [
0.5
],
"points_per_twenty_two_meter_entry": 123,
"twenty_two_meter_conversion_percentage": 123,
"dominant_tackle_percent": 123,
"tackle_success_percent": 123,
"dominant_carry_percent": 123,
"set_piece_success_percent": 123
},
"players": [
{
"id": "pgi_Ex4mpLePG1nv0Lv3m3nt4aa",
"player_id": "pl_Ex4mpLePL4y3r1d4567890abc",
"name": "Hamish Ward",
"jersey_number": 1,
"stats": {
"minutes_played": 123,
"involvement_count": 123,
"work_rate_per_minute": 123,
"positive_tackles_made": 123,
"negative_tackles_made": 123,
"tackle_assists": 123,
"tackles_missed": 123,
"positive_carries": 123,
"negative_carries": 123,
"passes": 123,
"offloads": 123,
"turnovers_won_clean": 123,
"turnovers_won_penalty": 123,
"turnovers_lost": 123,
"knock_ons": 123,
"infringements": 123,
"tries": 123,
"successful_conversions": 123,
"missed_conversions": 123,
"successful_penalty_kicks": 123,
"missed_penalty_kicks": 123,
"successful_drop_kicks": 123,
"missed_drop_kicks": 123,
"points_scored": 123,
"kicks": 123,
"kick_distance": 123,
"ruck_arrivals": 123
}
}
]
}
]
}Get a single fixture
Returns the fixture along with both sides. Each side includes:
- the team that played (id, name, jersey description, club),
- the full set of team-level stats (tackles, carries, points, lineouts, scrums, rucks, etc.),
- every player who took the field (
players), keyed by jersey number, with per-game player stats attached.
Stats may be null on an inferred side (a side whose own game has not
been analysed separately — we derive the stats we can from the other
side’s events, but e.g. phase_counts is not invertible). Consumers
should treat absent stat keys as “not available” rather than zero.
curl --request GET \
--url https://app.framesports.ai/api/v1/fixtures/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.framesports.ai/api/v1/fixtures/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.framesports.ai/api/v1/fixtures/{id}', 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://app.framesports.ai/api/v1/fixtures/{id}",
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://app.framesports.ai/api/v1/fixtures/{id}"
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://app.framesports.ai/api/v1/fixtures/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.framesports.ai/api/v1/fixtures/{id}")
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": "fxt_Ex4mpLeF1xtur31d34567890",
"name": "Sunnybank v Wests | 2nd Grade | Round 3",
"recorded_at": "2023-11-07T05:31:56Z",
"competition": {
"id": 42,
"name": "Queensland Premier Rugby 2026"
},
"sides": [
{
"team": {
"id": "team_Ex4mpLeTe4m1d4567890abc",
"name": "Wests Senior 2nd Team Men's",
"abbreviated_name": "WST",
"gender": "Men's",
"age": "Senior",
"level": "1st Team",
"club": {
"name": "Wests Rugby"
}
},
"jersey_description": "Green and yellow",
"data_source": "analyzed",
"stats": {
"minutes_played": 123,
"involvement_count": 123,
"work_rate": 123,
"work_rate_per_minute": 123,
"player_count": 123,
"ball_in_play_ms": 123,
"positive_tackles": 123,
"negative_tackles": 123,
"tackle_assists": 123,
"tackles_missed": 123,
"positive_carries": 123,
"negative_carries": 123,
"passes": 123,
"offloads": 123,
"turnovers_won_clean": 123,
"turnovers_won_penalty": 123,
"turnovers_lost": 123,
"knock_ons": 123,
"infringements": 123,
"tries": 123,
"successful_conversions": 123,
"missed_conversions": 123,
"successful_penalty_kicks": 123,
"missed_penalty_kicks": 123,
"successful_drop_kicks": 123,
"missed_drop_kicks": 123,
"points_scored": 123,
"kicks": 123,
"kick_distance": 123,
"ruck_arrivals": 123,
"ruck_count": 123,
"average_ruck_duration": 123,
"scrums_won": 123,
"scrums_lost": 123,
"scrums_reset": 123,
"lineouts_won": 123,
"lineouts_lost": 123,
"lineouts_reset": 123,
"twenty_two_meter_entries": 123,
"restart_receives_won": 123,
"restart_receives_lost": 123,
"mauls": 123,
"average_phases_built": 123,
"phase_counts": [
123
],
"try_progress_ratios": [
0.5
],
"points_per_twenty_two_meter_entry": 123,
"twenty_two_meter_conversion_percentage": 123,
"dominant_tackle_percent": 123,
"tackle_success_percent": 123,
"dominant_carry_percent": 123,
"set_piece_success_percent": 123
},
"players": [
{
"id": "pgi_Ex4mpLePG1nv0Lv3m3nt4aa",
"player_id": "pl_Ex4mpLePL4y3r1d4567890abc",
"name": "Hamish Ward",
"jersey_number": 1,
"stats": {
"minutes_played": 123,
"involvement_count": 123,
"work_rate_per_minute": 123,
"positive_tackles_made": 123,
"negative_tackles_made": 123,
"tackle_assists": 123,
"tackles_missed": 123,
"positive_carries": 123,
"negative_carries": 123,
"passes": 123,
"offloads": 123,
"turnovers_won_clean": 123,
"turnovers_won_penalty": 123,
"turnovers_lost": 123,
"knock_ons": 123,
"infringements": 123,
"tries": 123,
"successful_conversions": 123,
"missed_conversions": 123,
"successful_penalty_kicks": 123,
"missed_penalty_kicks": 123,
"successful_drop_kicks": 123,
"missed_drop_kicks": 123,
"points_scored": 123,
"kicks": 123,
"kick_distance": 123,
"ruck_arrivals": 123
}
}
]
}
]
}Authorizations
Create a token on Settings → API tokens in Framesports. It is shown once, when you create it.
Headers
Prefix ID of the account to scope this request to. Settings → API tokens
shows it next to each token. If omitted, the server uses the club the
token was made for (then the session account, then the newest account).
Must be Account-Id: X-Account-Id is not read.
"acct_Ex4mpLeAcc0unt1d567890"
Path Parameters
Response
Fixture with both sides.
A single rugby match, with both sides and all stats.