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 but no valid, enabled webhook is configured, the analysis still starts, with notifications disabled.
See API keys and webhooks for event types and payload format.
One analysis credit is consumed per request.
Safe retries: send an Idempotency-Key header to retry this request without creating a
duplicate analysis or consuming another credit if you did not receive the response. See
limits and reliability.
Limits: 100 requests per minute per API key and 500 requests per minute per IP, applied as throttling. There is no per-account cap on concurrent or pending analyses. See rate limits.
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.
Headers
Unique key (1 to 255 printable ASCII characters, for example a UUID) identifying this
submission. Retrying with the same key within 24 hours returns the original video_id
with the response header Idempotent-Replayed: true, without creating a new analysis
or debiting another credit. The retry must still include the video.
1 - 255Body
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. When false or omitted, no
webhook events are sent for this analysis. If no valid, enabled webhook is
configured, the request is not rejected: the analysis starts with
notifications disabled. Delivery is a single attempt per event, without retry.
false
Response
Analysis started. When the request replays an earlier one with the same
Idempotency-Key, the original video_id is returned and no credit is debited.