Skip to content

Read back a stored clip probe

GET
/api/sessions/probe/{session_id}/
curl --request GET \
--url http://localhost:8000/api/sessions/probe/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/ \
--header 'Authorization: Bearer <token>'

The companion to the POST, and the reason it exists is timing. The vision read runs on a background queue, so POST /api/sessions/probe/ answers with the pose read alone and the vision block lands on the row a few seconds later. Poll this while vision_pending is true.

vision_pending is false the moment there is nothing more coming — the block has arrived, the read failed, or the feature is switched off on this deployment. A caller cannot tell those apart and does not need to: all three mean stop polling.

Costs no quota, like the POST, and shares its rate limit.

session_id
required
string format: uuid
Media typeapplication/json
object
vision
object
model
required
string
frames
required
integer
activity
required
string
activity_confidence
required
number format: double
exercise
required
string
nullable
exercise_confidence
required
number format: double
camera_view
required
string
nullable
exercise_candidates
Array<object>
object
name
required
string
confidence
required
number format: double
person_present
required
boolean
stored
required
boolean
pose_unread
boolean
vision_pending
required
boolean
detection_ratio
number format: double
frames_sampled
integer
plane
string
nullable
plane_confidence
number format: double
facing
string
nullable
hip_translation
number format: double
vertical_travel
number format: double
direction_changes
integer
camera_motion
number format: double
content_blocked
boolean

Examples

The vision read has landed

{
"person_present": true,
"stored": true,
"vision_pending": false,
"detection_ratio": 1,
"frames_sampled": 24,
"plane": "side",
"plane_confidence": 0.9,
"hip_translation": 2.1,
"vertical_travel": 1.2,
"camera_motion": 0.002,
"vision": {
"model": "deepseek-v4-flash-vision-exp",
"frames": 3,
"activity": "jump",
"activity_confidence": 0.9,
"exercise": "Countermovement Jump",
"exercise_confidence": 0.8,
"camera_view": "side",
"usage": {
"prompt_tokens": 3702,
"completion_tokens": 96,
"total_tokens": 3798
}
}
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}
Media typeapplication/json
object
detail
required

Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).

string

Example generated

{
"detail": "example"
}