curl --request POST \
--url https://partner-api.ochy-prod.com/analysis/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form video='@example-file' \
--form analysis_type=side_view \
--form 'subject_id=<string>' \
--form height=1.75 \
--form weight=68 \
--form pace=05:30 \
--form language=en \
--form treadmill=false \
--form notify_via_webhook=falseimport requests
url = "https://partner-api.ochy-prod.com/analysis/start"
files = { "video": ("example-file", open("example-file", "rb")) }
payload = {
"analysis_type": "side_view",
"subject_id": "<string>",
"height": "1.75",
"weight": "68",
"pace": "05:30",
"language": "en",
"treadmill": "false",
"notify_via_webhook": "false"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('video', '<string>');
form.append('analysis_type', 'side_view');
form.append('subject_id', '<string>');
form.append('height', '1.75');
form.append('weight', '68');
form.append('pace', '05:30');
form.append('language', 'en');
form.append('treadmill', 'false');
form.append('notify_via_webhook', 'false');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://partner-api.ochy-prod.com/analysis/start', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"message": "Analysis started for ID: 3dde3402-94d7-462e-a784-9306207108dd",
"video_id": "3dde3402-94d7-462e-a784-9306207108dd"
}{
"detail": "Video duration (15s) exceeds maximum allowed duration of 10s"
}{
"detail": "API Key is missing"
}{
"detail": "Invalid API Key"
}{
"detail": "File size exceeds the maximum allowed limit of 30 MB",
"code": "file_too_large"
}{
"detail": "Insufficient API credits to perform analysis",
"code": "insufficient_api_credits"
}{
"detail": "Internal server error",
"code": "insufficient_api_credits"
}Start analysis
Upload a video file and start a biomechanical analysis. Returns a unique video_id
that you use to poll for results.
Video requirements:
- Maximum file size: 30 MB
- Maximum duration: 10 seconds
- Accepted formats: MP4, MOV, AVI, WEBM
See example videos for sample input and output recordings.
Analysis types:
side_view— Running gait from the side. Produces biomechanical scores, metrics, joint angles, foot landing, and running style.back_view— Running gait from behind. Produces pronation/supination, pelvic drop, knee adduction, and gait cycle data.
Link to a subject:
Pass an optional subject_id to associate this analysis with a runner profile.
You can then retrieve all analyses for that subject via
GET /analysis/subjects/{subject_id}.
See subject management for the full workflow.
Webhooks (optional): Set notify_via_webhook=true to receive progress and completion
events on the HTTPS URL you registered with PUT /webhook.
Defaults to false. When true, a valid partner webhook must be configured and enabled.
See API keys and webhooks for event types and payload format.
One analysis credit is consumed per request.
curl --request POST \
--url https://partner-api.ochy-prod.com/analysis/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form video='@example-file' \
--form analysis_type=side_view \
--form 'subject_id=<string>' \
--form height=1.75 \
--form weight=68 \
--form pace=05:30 \
--form language=en \
--form treadmill=false \
--form notify_via_webhook=falseimport requests
url = "https://partner-api.ochy-prod.com/analysis/start"
files = { "video": ("example-file", open("example-file", "rb")) }
payload = {
"analysis_type": "side_view",
"subject_id": "<string>",
"height": "1.75",
"weight": "68",
"pace": "05:30",
"language": "en",
"treadmill": "false",
"notify_via_webhook": "false"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('video', '<string>');
form.append('analysis_type', 'side_view');
form.append('subject_id', '<string>');
form.append('height', '1.75');
form.append('weight', '68');
form.append('pace', '05:30');
form.append('language', 'en');
form.append('treadmill', 'false');
form.append('notify_via_webhook', 'false');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://partner-api.ochy-prod.com/analysis/start', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"message": "Analysis started for ID: 3dde3402-94d7-462e-a784-9306207108dd",
"video_id": "3dde3402-94d7-462e-a784-9306207108dd"
}{
"detail": "Video duration (15s) exceeds maximum allowed duration of 10s"
}{
"detail": "API Key is missing"
}{
"detail": "Invalid API Key"
}{
"detail": "File size exceeds the maximum allowed limit of 30 MB",
"code": "file_too_large"
}{
"detail": "Insufficient API credits to perform analysis",
"code": "insufficient_api_credits"
}{
"detail": "Internal server error",
"code": "insufficient_api_credits"
}Authorizations
Recommended. Pass your API key as a Bearer token in the Authorization header: Authorization: Bearer YOUR_API_KEY.
Body
Video file to analyze (max 30 MB, 10 seconds).
Type of analysis to perform.
side_view, back_view "side_view"
Optional subject ID to link this analysis to. See subject management to create subjects.
Runner height in meters.
1.75
Runner weight in kilograms.
68
Running pace in MM:SS format. Required when treadmill=true.
Optional when treadmill=false (pace is calculated automatically for overground running).
^[0-9]{2}:[0-9]{2}$"05:30"
Language for analysis results and recommendations.
en, fr, de, zh, ko, pt, es, it, ja "en"
Whether the runner is on a treadmill (true) or running outdoors (false).
false
When true, send progress and completion events for this analysis to the
partner webhook URL configured via PUT /webhook. Requires a valid, enabled
webhook. When false or omitted, no webhook events are sent for this analysis.
false