curl --request GET \
--url https://api.hooper.gg/v1/sessions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hooper.gg/v1/sessions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hooper.gg/v1/sessions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "sess_18234",
"object": "session",
"created": 1756224000,
"status": "queued",
"group": "grp_412",
"source": {
"type": "upload",
"url": "<string>"
},
"metadata": {},
"branding": {
"cover": true,
"logo": true
},
"teams": {
"recording": {
"name": "Acme Varsity",
"metadata": {}
},
"opponent": {
"name": "Acme Varsity",
"metadata": {}
}
},
"run_version": 123,
"duration_seconds": 5412,
"cost_cents": 752,
"highlights": {
"object": "list",
"has_more": true,
"total_count": 123,
"data": [
{
"id": "hl_9f2c…",
"object": "highlight",
"shot": "shot_a1b2…",
"shot_index": 123,
"length_seconds": 8.5,
"is_lowlight": true,
"is_manual": true,
"player": "plr_5",
"video": {
"default": "<string>",
"horizontal": "<string>",
"1080p": "<string>",
"720p": "<string>",
"480p": "<string>",
"360p": "<string>",
"240p": "<string>",
"144p": "<string>"
},
"preview": {
"default": "<string>",
"horizontal": "<string>"
},
"created": 123
}
],
"url": "/v1/sessions/sess_18234/highlights"
},
"shots": {
"object": "list",
"has_more": true,
"total_count": 123,
"data": [
{
"id": "shot_a1b2…",
"object": "shot",
"index": 123,
"start_seconds": 123,
"end_seconds": 123,
"made": true,
"points": 123,
"type": "fieldgoal",
"is_three_point": true,
"is_free_throw": true,
"is_fouled": true,
"location": {
"shot_image_normed": [
123
],
"shot_world_normed": [
123
],
"hoop_image_normed": [
123
]
},
"excitement_score": 123,
"players": {
"scorer": "plr_5",
"assister": "<string>",
"rebounder": "<string>"
},
"highlight": "hl_9f2c…"
}
],
"url": "/v1/sessions/sess_18234/highlights"
},
"players": {
"object": "list",
"has_more": true,
"total_count": 123,
"data": [
{
"id": "plr_5",
"object": "player",
"name": "<string>",
"jersey": "<string>",
"user_id": "<string>",
"team_id": 123,
"team_name": "Acme Varsity",
"metadata": {
"player_id": "lg-4821"
},
"stats": {
"points": 123,
"fg_2pt_att": 123,
"fg_2pt_make": 123,
"fg_3pt_att": 123,
"fg_3pt_make": 123,
"ft_att": 123,
"ft_make": 123,
"assist": 123,
"rebound": 123
}
}
],
"url": "/v1/sessions/sess_18234/highlights"
},
"totals": {
"points": 123,
"fg_2pt_att": 123,
"fg_2pt_make": 123,
"fg_3pt_att": 123,
"fg_3pt_make": 123,
"ft_att": 123,
"ft_make": 123,
"assist": 123,
"rebound": 123
},
"video": {
"url": "<string>",
"preview_url": "<string>",
"1080p": "<string>",
"720p": "<string>",
"360p": "<string>",
"width": 123,
"height": 123,
"fps": 123
},
"artifacts": {
"actions": "<string>",
"balls": "<string>",
"hoops": "<string>",
"clusters": "<string>"
},
"error": {
"code": "no_shots",
"param": "branding.cover",
"message": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "<string>",
"param": "source.url"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "<string>",
"param": "source.url"
}
}Retrieve a session
curl --request GET \
--url https://api.hooper.gg/v1/sessions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hooper.gg/v1/sessions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hooper.gg/v1/sessions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "sess_18234",
"object": "session",
"created": 1756224000,
"status": "queued",
"group": "grp_412",
"source": {
"type": "upload",
"url": "<string>"
},
"metadata": {},
"branding": {
"cover": true,
"logo": true
},
"teams": {
"recording": {
"name": "Acme Varsity",
"metadata": {}
},
"opponent": {
"name": "Acme Varsity",
"metadata": {}
}
},
"run_version": 123,
"duration_seconds": 5412,
"cost_cents": 752,
"highlights": {
"object": "list",
"has_more": true,
"total_count": 123,
"data": [
{
"id": "hl_9f2c…",
"object": "highlight",
"shot": "shot_a1b2…",
"shot_index": 123,
"length_seconds": 8.5,
"is_lowlight": true,
"is_manual": true,
"player": "plr_5",
"video": {
"default": "<string>",
"horizontal": "<string>",
"1080p": "<string>",
"720p": "<string>",
"480p": "<string>",
"360p": "<string>",
"240p": "<string>",
"144p": "<string>"
},
"preview": {
"default": "<string>",
"horizontal": "<string>"
},
"created": 123
}
],
"url": "/v1/sessions/sess_18234/highlights"
},
"shots": {
"object": "list",
"has_more": true,
"total_count": 123,
"data": [
{
"id": "shot_a1b2…",
"object": "shot",
"index": 123,
"start_seconds": 123,
"end_seconds": 123,
"made": true,
"points": 123,
"type": "fieldgoal",
"is_three_point": true,
"is_free_throw": true,
"is_fouled": true,
"location": {
"shot_image_normed": [
123
],
"shot_world_normed": [
123
],
"hoop_image_normed": [
123
]
},
"excitement_score": 123,
"players": {
"scorer": "plr_5",
"assister": "<string>",
"rebounder": "<string>"
},
"highlight": "hl_9f2c…"
}
],
"url": "/v1/sessions/sess_18234/highlights"
},
"players": {
"object": "list",
"has_more": true,
"total_count": 123,
"data": [
{
"id": "plr_5",
"object": "player",
"name": "<string>",
"jersey": "<string>",
"user_id": "<string>",
"team_id": 123,
"team_name": "Acme Varsity",
"metadata": {
"player_id": "lg-4821"
},
"stats": {
"points": 123,
"fg_2pt_att": 123,
"fg_2pt_make": 123,
"fg_3pt_att": 123,
"fg_3pt_make": 123,
"ft_att": 123,
"ft_make": 123,
"assist": 123,
"rebound": 123
}
}
],
"url": "/v1/sessions/sess_18234/highlights"
},
"totals": {
"points": 123,
"fg_2pt_att": 123,
"fg_2pt_make": 123,
"fg_3pt_att": 123,
"fg_3pt_make": 123,
"ft_att": 123,
"ft_make": 123,
"assist": 123,
"rebound": 123
},
"video": {
"url": "<string>",
"preview_url": "<string>",
"1080p": "<string>",
"720p": "<string>",
"360p": "<string>",
"width": 123,
"height": 123,
"fps": 123
},
"artifacts": {
"actions": "<string>",
"balls": "<string>",
"hoops": "<string>",
"clusters": "<string>"
},
"error": {
"code": "no_shots",
"param": "branding.cover",
"message": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "<string>",
"param": "source.url"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "<string>",
"param": "source.url"
}
}Authorizations
API key issued by Hooper for your organization. Keys are environment-tagged: hk_prod_ keys work against production, hk_stg_ keys against staging.
Path Parameters
"sess_18234"
Response
OK
One submitted game. The same shape everywhere it appears — single read, list item, webhook payload. Highlights, shots and players are embedded (first 100 of each); their url pages the rest.
"sess_18234"
"session"1756224000
queued, processing, processed, failed "grp_412"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Which branding images this session carries. Set when the session is submitted.
Show child attributes
Show child attributes
The two sides of the session, always present. players[].team_id 1 is recording, 2 is opponent.
Show child attributes
Show child attributes
5412
752
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Raw model output (JSONL) behind the shots and highlights.
Show child attributes
Show child attributes
Set when status is failed.
Show child attributes
Show child attributes