# Weightlifting

## Create a New Video Processing Session

> This endpoint allows an \*\*admin\*\* (or sub-admin) to upload a \*\*video file\*\* for processing and create a new "session" resource \*\*on behalf of another user\*\*. The server will return a \`session\_id\` that can be used to poll or retrieve the session details/results.\
> \
> \### Request Body (Multipart/Form-Data)\
> \
> You must supply the following fields:\
> \
> \- \*\*user\_id\*\* \*(string, required)\*: The ID of the user on whose behalf this session is created.\
> \- \*\*video\*\* \*(file, required)\*: The raw video file to be processed.\
> \- \*\*session\_name\*\* \*(string, optional)\*: A human-readable name/title for the session.\
> \- \*\*exercise\_name\*\* \*(string, required)\*: The name of the exercise. Choose one of the following: 'snatch', 'clean', or 'clean\_and\_jerk'.\
> \- \*\*barbell\_mass\*\* \*(string, optional)\*: The mass of the barbell used (numeric string). Defaults to 100 kg (or 220 lb) if not provided.\
> \- \*\*body\_joint\_angles\*\* \*(array\[string], optional)\*: A comma-separated list of joint names (e.g. 'elbow, knee, ankle'). Defaults to \['all'] if not provided.\
> \
> \### Response Structure\
> \
> On success (HTTP 200), the response is a JSON object with:\
> \
> \- \*\*session\_id\*\* \*(string)\*: A unique identifier for the created session.\
> \- \*\*title\*\* \*(string)\*: The session title (defaults to a fallback if \`session\_name\` was not provided).\
> \
> \### Workflow\
> 1\. \*\*POST\*\* a multipart/form-data request containing the required fields \`user\_id\` and \`video\`, plus any optional fields.\
> 2\. Provide A valid API-KEY token in the \`Authorization\` header.\
> 3\. The caller must have admin privileges to successfully create a session for another user.\
> 4\. If successful, the server responds with \`session\_id\` and \`title\`.\
> 5\. If an error occurs (e.g., missing fields, lack of permissions), a JSON object with an \`error\` key is returned.\
> \
> \#### Example cURL:\
> \
> \`\`\`bash\
> curl -X POST \\\
> &#x20;    -H 'Content-Type: multipart/form-data' \\\
> &#x20;    -H 'Authorization: API-KEY \<YOUR\_ADMIN\_TOKEN>' \\\
> &#x20;    -F 'user\_id=someUserId123' \\\
> &#x20;    -F 'video=@/path/to/video.mp4' \\\
> &#x20;    -F 'session\_name=Custom Session' \\\
> &#x20;    -F 'exercise\_name=clean' \\\
> &#x20;    -F 'barbell\_mass=30' \\\
> &#x20;    -F 'body\_joint\_angles=elbow, knee, ankle' \\\
> &#x20;    https\://\<backend-link>/weightlifting/management/sessions/\
> \`\`\`<br>

````json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/":{"post":{"operationId":"weightlifting_sessions_create","summary":"Create a New Video Processing Session","description":"This endpoint allows an **admin** (or sub-admin) to upload a **video file** for processing and create a new \"session\" resource **on behalf of another user**. The server will return a `session_id` that can be used to poll or retrieve the session details/results.\n\n### Request Body (Multipart/Form-Data)\n\nYou must supply the following fields:\n\n- **user_id** *(string, required)*: The ID of the user on whose behalf this session is created.\n- **video** *(file, required)*: The raw video file to be processed.\n- **session_name** *(string, optional)*: A human-readable name/title for the session.\n- **exercise_name** *(string, required)*: The name of the exercise. Choose one of the following: 'snatch', 'clean', or 'clean_and_jerk'.\n- **barbell_mass** *(string, optional)*: The mass of the barbell used (numeric string). Defaults to 100 kg (or 220 lb) if not provided.\n- **body_joint_angles** *(array[string], optional)*: A comma-separated list of joint names (e.g. 'elbow, knee, ankle'). Defaults to ['all'] if not provided.\n\n### Response Structure\n\nOn success (HTTP 200), the response is a JSON object with:\n\n- **session_id** *(string)*: A unique identifier for the created session.\n- **title** *(string)*: The session title (defaults to a fallback if `session_name` was not provided).\n\n### Workflow\n1. **POST** a multipart/form-data request containing the required fields `user_id` and `video`, plus any optional fields.\n2. Provide A valid API-KEY token in the `Authorization` header.\n3. The caller must have admin privileges to successfully create a session for another user.\n4. If successful, the server responds with `session_id` and `title`.\n5. If an error occurs (e.g., missing fields, lack of permissions), a JSON object with an `error` key is returned.\n\n#### Example cURL:\n\n```bash\ncurl -X POST \\\n     -H 'Content-Type: multipart/form-data' \\\n     -H 'Authorization: API-KEY <YOUR_ADMIN_TOKEN>' \\\n     -F 'user_id=someUserId123' \\\n     -F 'video=@/path/to/video.mp4' \\\n     -F 'session_name=Custom Session' \\\n     -F 'exercise_name=clean' \\\n     -F 'barbell_mass=30' \\\n     -F 'body_joint_angles=elbow, knee, ankle' \\\n     https://<backend-link>/weightlifting/management/sessions/\n```\n","responses":{"200":{"description":"Video processing session created successfully (HTTP 200).","content":{"application/json":{"schema":{"required":["session_id","title"],"type":"object","properties":{"session_id":{"description":"The unique identifier for the created session.","type":"string"},"title":{"description":"The session title (defaults if not provided).","type":"string"}}}}}},"400":{"description":"Bad Request - Possibly due to missing `user_id`, missing `video`, or invalid form data.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Detailed error message.","type":"string"}}}}}},"401":{"description":"Unauthorized - Missing or invalid access token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating a missing or invalid token.","type":"string"}}}}}},"403":{"description":"Forbidden - The user does not have admin permission to create sessions for others.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating insufficient privileges.","type":"string"}}}}}},"404":{"description":"Not Found - Indicates business logic issues or resource limitations (e.g., session limit).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message describing the issue.","type":"string"}}}}}},"500":{"description":"Internal Server Error - Unexpected error occurred on the server.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Detailed error message indicating a server-side failure.","type":"string"}}}}}}},"tags":["weightlifting"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user_id":{"type":"string","description":"**Required.** The ID of the user for whom this session is created (form field: text)."},"video":{"type":"string","description":"**Required.** The raw video file to be processed (form field type: file)."},"session_name":{"type":"string","description":"**Optional.** A descriptive name for the session (form field: text)."},"exercise_name":{"type":"string","description":"**Required.** The name of the exercise. Choose one of the following: 'snatch', 'clean', or 'clean_and_jerk'."},"barbell_mass":{"type":"string","description":"**Optional.** The mass of the barbell used (numeric string). Defaults to 100 kg (or 220 lb) if not provided."},"body_joint_angles":{"type":"array","description":"**Optional.** A comma-separated list of joint names. Available values: `'ankle'`, `'knee'`, `'elbow'`, `'hip'`, `'shoulder'`. Example: `ankle,knee,hip`"}},"required":["user_id","video","exercise_name"]}}}}}}}}
````

## Retrieve Weightlifting Session Details

> Retrieves the details of a weightlifting session specified by its \`session\_id\`. The returned data includes URLs to the original and analyzed videos, session creation timestamp, exercise type, user information, metrics, angles, report metrics, and timestamps. \
> \
> \### Path Parameter\
> \- \*\*session\_id\*\* \*(string, required)\*: The unique identifier of the session to retrieve.\
> \
> \### Query Parameter\
> \- \*\*demo\*\* \*(boolean, optional)\*: Set to \`true\` to retrieve a pre-generated demo session instead of a real one.\
> \
> \### Response Structure (HTTP 200)\
> \
> On success, the response is a JSON object with the following properties:\
> \
> \- \*\*analyzed\_video\_url\*\* \*(string, URI)\*: Public URL of the analyzed video.\
> \- \*\*video\_url\*\* \*(string, URI)\*: Public URL of the original video.\
> \- \*\*created\_at\*\* \*(object)\*: A dictionary with:\
> &#x20;   \- \*\*date\*\* \*(string)\*: Creation date in \`DD/MM/YYYY\` format.\
> &#x20;   \- \*\*time\*\* \*(string)\*: Creation time in \`HH:MM AM/PM\` format.\
> \- \*\*exercise\*\* \*(string)\*: The exercise performed (e.g., 'snatch').\
> \- \*\*user\_name\*\* \*(string)\*: The name of the user associated with the session.\
> \- \*\*activity\*\* \*(string)\*: The activity type (should be 'Weightlifting').\
> \- \*\*title\*\* \*(string)\*: The title of the session.\
> \- \*\*metrics\*\* \*(object)\*: A dictionary of numeric metric values (e.g., speed, power). Each key maps to a number.\
> \- \*\*angles\*\* \*(object)\*: A dictionary where each key maps to an array of numeric values representing angles.\
> \- \*\*report\_metrics\*\* \*(object)\*: A dictionary where each key maps to an array of numeric values representing report-specific metrics.\
> \- \*\*all\_timestamps\*\* \*(array\[number])\*: An array of timestamps (e.g., in seconds) for the session data.\
> \
> \### Error Handling\
> \
> \- \*\*400 Bad Request\*\*: Invalid parameters (e.g., invalid admin UID).\
> \- \*\*401 Unauthorized\*\*: Missing or invalid access token.\
> \- \*\*403 Forbidden\*\*: Insufficient privileges.\
> \- \*\*404 Not Found\*\*: Session not found or the activity is not Weightlifting.\
> \- \*\*500 Internal Server Error\*\*: An unexpected error occurred on the server.\
> \
> \### Security\
> \
> A valid API-KEY token must be provided in the \`Authorization\` header.

```json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/":{"get":{"operationId":"weightlifting_sessions_read","summary":"Retrieve Weightlifting Session Details","description":"Retrieves the details of a weightlifting session specified by its `session_id`. The returned data includes URLs to the original and analyzed videos, session creation timestamp, exercise type, user information, metrics, angles, report metrics, and timestamps. \n\n### Path Parameter\n- **session_id** *(string, required)*: The unique identifier of the session to retrieve.\n\n### Query Parameter\n- **demo** *(boolean, optional)*: Set to `true` to retrieve a pre-generated demo session instead of a real one.\n\n### Response Structure (HTTP 200)\n\nOn success, the response is a JSON object with the following properties:\n\n- **analyzed_video_url** *(string, URI)*: Public URL of the analyzed video.\n- **video_url** *(string, URI)*: Public URL of the original video.\n- **created_at** *(object)*: A dictionary with:\n    - **date** *(string)*: Creation date in `DD/MM/YYYY` format.\n    - **time** *(string)*: Creation time in `HH:MM AM/PM` format.\n- **exercise** *(string)*: The exercise performed (e.g., 'snatch').\n- **user_name** *(string)*: The name of the user associated with the session.\n- **activity** *(string)*: The activity type (should be 'Weightlifting').\n- **title** *(string)*: The title of the session.\n- **metrics** *(object)*: A dictionary of numeric metric values (e.g., speed, power). Each key maps to a number.\n- **angles** *(object)*: A dictionary where each key maps to an array of numeric values representing angles.\n- **report_metrics** *(object)*: A dictionary where each key maps to an array of numeric values representing report-specific metrics.\n- **all_timestamps** *(array[number])*: An array of timestamps (e.g., in seconds) for the session data.\n\n### Error Handling\n\n- **400 Bad Request**: Invalid parameters (e.g., invalid admin UID).\n- **401 Unauthorized**: Missing or invalid access token.\n- **403 Forbidden**: Insufficient privileges.\n- **404 Not Found**: Session not found or the activity is not Weightlifting.\n- **500 Internal Server Error**: An unexpected error occurred on the server.\n\n### Security\n\nA valid API-KEY token must be provided in the `Authorization` header.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"The unique identifier of the weightlifting session to retrieve.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Set to `true` to retrieve a pre-generated demo session instead of a real one.","required":false}],"responses":{"200":{"description":"Weightlifting session details retrieved successfully.","content":{"application/json":{"schema":{"required":["analyzed_video_url","video_url","created_at","exercise","user_name","activity","title","metrics","angles","report_metrics","all_timestamps"],"type":"object","properties":{"analyzed_video_url":{"description":"Public URL of the analyzed video.","type":"string","format":"uri"},"video_url":{"description":"Public URL of the original video.","type":"string","format":"uri"},"created_at":{"description":"Session creation timestamp.","required":["date","time"],"type":"object","properties":{"date":{"description":"Date in DD/MM/YYYY format.","type":"string"},"time":{"description":"Time in HH:MM AM/PM format.","type":"string"}}},"exercise":{"description":"The exercise performed (e.g., 'snatch').","type":"string"},"user_name":{"description":"Name of the user associated with the session.","type":"string"},"activity":{"description":"Activity type, expected to be 'Weightlifting'.","type":"string"},"title":{"description":"The title of the session.","type":"string"},"metrics":{"description":"A dictionary of numeric metrics.","type":"object","additionalProperties":{"type":"number"}},"angles":{"description":"A dictionary where keys map to arrays of angle values.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"report_metrics":{"description":"A dictionary where keys map to arrays of report metric values.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"all_timestamps":{"description":"List of timestamps corresponding to session data.","type":"array","items":{"type":"number"}}}}}}},"400":{"description":"Bad Request - Invalid parameters or admin UID.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Detailed error message for invalid requests.","type":"string"}}}}}},"401":{"description":"Unauthorized - Missing or invalid access token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Access token is missing or invalid.","type":"string"}}}}}},"403":{"description":"Forbidden - Insufficient privileges.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"User is not permitted to access this data.","type":"string"}}}}}},"404":{"description":"Not Found - Session not found or invalid activity.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message indicating that the session was not found.","type":"string"}}}}}},"500":{"description":"Internal Server Error - An unexpected error occurred.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message indicating a server-side failure.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
```

## Export Weightlifting Session Data

> Retrieves a user's weightlifting session data from Firestore, including keypoints, angles, and timestamps. The session's activity must be 'Weightlifting'.\
> \
> \### Path Parameter\
> \- \*\*session\_id\*\* \*(string, required)\*: The unique identifier of the session to export data for.\
> \
> \### Query Parameter\
> \- \*\*demo\*\* \*(boolean, optional)\*: Set to \`true\` to retrieve a pre-generated demo session instead of a real one.\
> \
> \### Response Structure (HTTP 200)\
> \
> On success, the response is a JSON object containing:\
> \- \*\*keypoints\*\* \*(object)\*: A dictionary where each key (e.g., 'lknev', 'lknex', etc.) maps to an array of numbers representing keypoint data.\
> \- \*\*angles\*\* \*(object)\*: A dictionary where each key (e.g., 'lank\_angle', 'lkne\_angle', etc.) maps to an array of numbers representing angle measurements.\
> \- \*\*all\_timestamps\*\* \*(array\[number])\*: An array of timestamps corresponding to the session data.\
> \- \*\*metrics\*\* \*(object)\*: A dictionary of numeric metric values (e.g., max\_GRF, max\_bar\_speed). Each key maps to a number.\
> \- \*\*activity\*\* \*(string)\*: The session activity, expected to be 'Weightlifting'.\
> \
> \### Error Handling\
> \
> \- \*\*400 Bad Request\*\*: Invalid parameters (e.g., admin UID error).\
> \- \*\*401 Unauthorized\*\*: Missing or invalid access token.\
> \- \*\*403 Forbidden\*\*: Insufficient privileges.\
> \- \*\*404 Not Found\*\*: Session not found or invalid activity.\
> \- \*\*500 Internal Server Error\*\*: An unexpected server-side error occurred.\
> \
> \### Security\
> \
> A valid API-KEY token must be provided in the \`Authorization\` header.

```json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/export/":{"get":{"operationId":"weightlifting_sessions_export_list","summary":"Export Weightlifting Session Data","description":"Retrieves a user's weightlifting session data from Firestore, including keypoints, angles, and timestamps. The session's activity must be 'Weightlifting'.\n\n### Path Parameter\n- **session_id** *(string, required)*: The unique identifier of the session to export data for.\n\n### Query Parameter\n- **demo** *(boolean, optional)*: Set to `true` to retrieve a pre-generated demo session instead of a real one.\n\n### Response Structure (HTTP 200)\n\nOn success, the response is a JSON object containing:\n- **keypoints** *(object)*: A dictionary where each key (e.g., 'lknev', 'lknex', etc.) maps to an array of numbers representing keypoint data.\n- **angles** *(object)*: A dictionary where each key (e.g., 'lank_angle', 'lkne_angle', etc.) maps to an array of numbers representing angle measurements.\n- **all_timestamps** *(array[number])*: An array of timestamps corresponding to the session data.\n- **metrics** *(object)*: A dictionary of numeric metric values (e.g., max_GRF, max_bar_speed). Each key maps to a number.\n- **activity** *(string)*: The session activity, expected to be 'Weightlifting'.\n\n### Error Handling\n\n- **400 Bad Request**: Invalid parameters (e.g., admin UID error).\n- **401 Unauthorized**: Missing or invalid access token.\n- **403 Forbidden**: Insufficient privileges.\n- **404 Not Found**: Session not found or invalid activity.\n- **500 Internal Server Error**: An unexpected server-side error occurred.\n\n### Security\n\nA valid API-KEY token must be provided in the `Authorization` header.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"The session ID for which to export weightlifting data.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Set to `true` to retrieve a pre-generated demo session instead of a real one.","required":false}],"responses":{"200":{"description":"Weightlifting session data retrieved successfully.","content":{"application/json":{"schema":{"required":["keypoints","angles","all_timestamps","metrics","activity"],"type":"object","properties":{"keypoints":{"description":"A dictionary of keypoints. Each key maps to an array of numeric values.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"angles":{"description":"A dictionary of angles. Each key maps to an array of numeric values.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"all_timestamps":{"description":"An array of timestamps (in seconds) for the session data.","type":"array","items":{"type":"number"}},"metrics":{"description":"A dictionary of numeric metrics. Each key maps to a number.","type":"object","additionalProperties":{"type":"number"}},"activity":{"description":"The session activity (expected to be 'Weightlifting').","type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters or admin UID error.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message describing the invalid request.","type":"string"}}}}}},"401":{"description":"Unauthorized - Missing or invalid access token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Token is missing or invalid.","type":"string"}}}}}},"403":{"description":"Forbidden - User does not have sufficient privileges.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"User is not authorized to access this data.","type":"string"}}}}}},"404":{"description":"Not Found - The session was not found or its activity is not 'Weightlifting'.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message indicating the session was not found.","type":"string"}}}}}},"500":{"description":"Internal Server Error - An unexpected error occurred on the server.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Detailed error message indicating a server-side failure.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
```

## Analyze Weightlifting Lift

> Runs a full biomechanical analysis of a weight-lifting session (\`snatch\`, \`clean\`, etc.).\
> \
> \### Path parameter\
> \- \*\*session\_id\*\* \*(string, required)\* – Unique ID of the weight-lifting session.\
> \
> \### Query Parameter (Optional)\
> \- \*\*demo\*\* \*(boolean)\* – Set to \`true\` to return a pre-generated demo lift analysis session.\
> \
> \### Response structure (\`HTTP 200\`)\
> Returns a JSON report containing sectioned, frame-by-frame metrics, phase timing and user info.\
> \
> \`\`\`json\
> {\
> &#x20; "exercise": "snatch",\
> &#x20; "key\_metrics": {\
> &#x20;   "power\_output":           \[ 2350, 2425, 2510, 2600, 2705 ],\
> &#x20;   "ground\_reaction\_force":  \[ 1120, 1180, 1215, 1260, 1300 ],\
> &#x20;   "barbell\_velocity":       \[ 0.90, 1.05, 1.28, 1.55, 2.02 ]\
> &#x20; },\
> &#x20; "body\_positioning": {\
> &#x20;   "hip\_velocity": \[ 0.45, 0.52, 0.60 ],\
> &#x20;   "shin\_angle":   \[ 75.0, 72.5, 70.2 ],\
> &#x20;   "hip\_height":   \[ 450, 455, 468 ],\
> &#x20;   "torso\_angle":  \[ 40.0, 38.5, 36.8 ]\
> &#x20; },\
> &#x20; "joint\_angles": {\
> &#x20;   "hip\_angle":  \[ 165, 159, 152 ],\
> &#x20;   "knee\_angle": \[ 155, 147, 138 ]\
> &#x20; },\
> &#x20; "barbell\_positioning": {\
> &#x20;   "bar\_height":              \[ 120, 385, 610 ],\
> &#x20;   "barbell\_trajectory":      \[ 0, -8, -2 ],\
> &#x20;   "vertical\_shoulder\_height":\[ 1380, 1400, 1440 ]\
> &#x20; },\
> &#x20; "phase\_data": {\
> &#x20;   "start\_of\_lifting":        { "image\_url": "<https://storage.googleapis.com>..." },\
> &#x20;   "first\_pull\_end":   { "image\_url": "<https://storage.googleapis.com>..." }\
> &#x20; },\
> &#x20; "chart\_data": {\
> &#x20;   "setup":       { "start": 0,    "end": 536 },\
> &#x20;   "first\_pull":  { "start": 536,  "end": 952 }\
> &#x20; },\
> &#x20; "user\_information": {\
> &#x20;   "display\_name": "Ahror Jabborov",\
> &#x20;   "age": 28,\
> &#x20;   "weight": 75,\
> &#x20;   "height": 178\
> &#x20; },\
> &#x20; "session\_date": "18/05/2025",\
> &#x20; "comments": {}\
> }\
> \`\`\`\
> \
> \### Error codes\
> \- \*\*400 Bad Request\*\* – Invalid parameters.\
> \- \*\*401 Unauthorized\*\* – Missing/invalid token.\
> \- \*\*403 Forbidden\*\* – User lacks valid payment plan.\
> \- \*\*404 Not Found\*\* – Session does not exist.\
> \- \*\*500 Internal Server Error\*\* – Unexpected failure.\
> \
> \### Security\
> Requires A valid API-KEY token in the \`Authorization\` header.

````json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/lift-analysis/":{"post":{"operationId":"weightlifting_sessions_lift-analysis_create","summary":"Analyze Weightlifting Lift","description":"Runs a full biomechanical analysis of a weight-lifting session (`snatch`, `clean`, etc.).\n\n### Path parameter\n- **session_id** *(string, required)* – Unique ID of the weight-lifting session.\n\n### Query Parameter (Optional)\n- **demo** *(boolean)* – Set to `true` to return a pre-generated demo lift analysis session.\n\n### Response structure (`HTTP 200`)\nReturns a JSON report containing sectioned, frame-by-frame metrics, phase timing and user info.\n\n```json\n{\n  \"exercise\": \"snatch\",\n  \"key_metrics\": {\n    \"power_output\":           [ 2350, 2425, 2510, 2600, 2705 ],\n    \"ground_reaction_force\":  [ 1120, 1180, 1215, 1260, 1300 ],\n    \"barbell_velocity\":       [ 0.90, 1.05, 1.28, 1.55, 2.02 ]\n  },\n  \"body_positioning\": {\n    \"hip_velocity\": [ 0.45, 0.52, 0.60 ],\n    \"shin_angle\":   [ 75.0, 72.5, 70.2 ],\n    \"hip_height\":   [ 450, 455, 468 ],\n    \"torso_angle\":  [ 40.0, 38.5, 36.8 ]\n  },\n  \"joint_angles\": {\n    \"hip_angle\":  [ 165, 159, 152 ],\n    \"knee_angle\": [ 155, 147, 138 ]\n  },\n  \"barbell_positioning\": {\n    \"bar_height\":              [ 120, 385, 610 ],\n    \"barbell_trajectory\":      [ 0, -8, -2 ],\n    \"vertical_shoulder_height\":[ 1380, 1400, 1440 ]\n  },\n  \"phase_data\": {\n    \"start_of_lifting\":        { \"image_url\": \"https://storage.googleapis.com...\" },\n    \"first_pull_end\":   { \"image_url\": \"https://storage.googleapis.com...\" }\n  },\n  \"chart_data\": {\n    \"setup\":       { \"start\": 0,    \"end\": 536 },\n    \"first_pull\":  { \"start\": 536,  \"end\": 952 }\n  },\n  \"user_information\": {\n    \"display_name\": \"Ahror Jabborov\",\n    \"age\": 28,\n    \"weight\": 75,\n    \"height\": 178\n  },\n  \"session_date\": \"18/05/2025\",\n  \"comments\": {}\n}\n```\n\n### Error codes\n- **400 Bad Request** – Invalid parameters.\n- **401 Unauthorized** – Missing/invalid token.\n- **403 Forbidden** – User lacks valid payment plan.\n- **404 Not Found** – Session does not exist.\n- **500 Internal Server Error** – Unexpected failure.\n\n### Security\nRequires A valid API-KEY token in the `Authorization` header.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Identifier of the session to analyze.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Set to `true` to retrieve the pre-generated demo lift analysis instead of a real one.","required":false}],"responses":{"200":{"description":"Lift analysis report generated successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"exercise":{"type":"string"},"key_metrics":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"body_positioning":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"joint_angles":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"barbell_positioning":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"phase_data":{"type":"object","additionalProperties":{"type":"object","properties":{"average_time_ms":{"type":"integer"}}}},"chart_data":{"type":"object","additionalProperties":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}}},"user_information":{"type":"object","additionalProperties":{"type":"string"}},"session_date":{"type":"string","format":"date"},"comments":{"type":"object"}}}}}},"400":{"description":"Bad Request - Invalid token or parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message describing the invalid request.","type":"string"}}}}}},"401":{"description":"Unauthorized - Token is invalid or expired.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating that the token is missing or invalid.","type":"string"}}}}}},"403":{"description":"Forbidden - Admin access is required.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating that admin privileges are required.","type":"string"}}}}}},"404":{"description":"Not Found - Session not found or user does not have a valid payment plan.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message indicating that the session was not found or payment plan is invalid.","type":"string"}}}}}},"500":{"description":"Internal Server Error - An unexpected error occurred.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message indicating a server-side failure.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
````

## Get Summary of a Weightlifting Session

> Retrieve a detailed summary of a weightlifting session using its unique \`session\_id\`. The summary combines quantitative lift metrics with optional GenAI commentary.\
> \
> \*\*Usage Instructions:\*\*\
> 1\. Send a \*\*GET\*\* request with the \`session\_id\` in the path.\
> 2\. The endpoint replies with a structured JSON object (see below).\
> \
> \### Query Parameter\
> \- \*\*demo\*\* \*(boolean, optional)\* – Set to \`true\` to retrieve a pre-generated demo summary.\
> \
> \*\*Response Structure:\*\*\
> \
> \- \*\*summary\_text\*\* \*(object, optional)\* - GenAI commentary. Keys may include:\
> &#x20;   \- \*\*velocity\*\* - Insights on bar velocity.\
> &#x20;   \- \*\*power\*\* - Observations on force & power output.\
> &#x20;   \- \*\*stability\*\* - Notes on bar path / control.\
> &#x20;   \- \*\*final\_summary\*\* - Overall coaching summary.\
> \
> \- \*\*exercise\_type\*\* \*(string)\* - The lift performed (e.g. \*Snatch\*).\
> \
> \- \*\*velocity\*\* \*(object)\*:\
> &#x20;   \- \*\*bar\_velocity\*\* - \`{ min, max, values\[] }\` (m/s).\
> \
> \- \*\*power\*\* \*(object)\*:\
> &#x20;   \- \*\*ground\_reaction\_force\*\* - \`{ min, max, values\[] }\` (N).\
> &#x20;   \- \*\*power\*\* - \`{ min, max, values\[] }\` (W).\
> \
> \- \*\*stability\*\* \*(object)\*:\
> &#x20;   \- \*\*total\_time\*\* \*(number)\* - Lift duration (s).\
> &#x20;   \- \*\*bar\_height\*\* - \`{ max, values\[] }\` (m).\
> \
> &#x20;   \- \*\*bar\_trajectory\*\* \*(object)\* - \`{ xAxis\[], yAxis\[] }\` (m).\
> \
> \- \*\*user\_information\*\* \*(object)\* - Same keys as running summaries (weight, height, etc.).\
> \- \*\*session\_date\*\* \*(string)\* - Formatted date (e.g. \`07/04/2025\`).\
> \
> \*\*Note:\*\* \`summary\_text\` appears only after GenAI feedback has been generated.

```json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/summary/":{"get":{"operationId":"weightlifting_sessions_summary_list","summary":"Get Summary of a Weightlifting Session","description":"Retrieve a detailed summary of a weightlifting session using its unique `session_id`. The summary combines quantitative lift metrics with optional GenAI commentary.\n\n**Usage Instructions:**\n1. Send a **GET** request with the `session_id` in the path.\n2. The endpoint replies with a structured JSON object (see below).\n\n### Query Parameter\n- **demo** *(boolean, optional)* – Set to `true` to retrieve a pre-generated demo summary.\n\n**Response Structure:**\n\n- **summary_text** *(object, optional)* - GenAI commentary. Keys may include:\n    - **velocity** - Insights on bar velocity.\n    - **power** - Observations on force & power output.\n    - **stability** - Notes on bar path / control.\n    - **final_summary** - Overall coaching summary.\n\n- **exercise_type** *(string)* - The lift performed (e.g. *Snatch*).\n\n- **velocity** *(object)*:\n    - **bar_velocity** - `{ min, max, values[] }` (m/s).\n\n- **power** *(object)*:\n    - **ground_reaction_force** - `{ min, max, values[] }` (N).\n    - **power** - `{ min, max, values[] }` (W).\n\n- **stability** *(object)*:\n    - **total_time** *(number)* - Lift duration (s).\n    - **bar_height** - `{ max, values[] }` (m).\n\n    - **bar_trajectory** *(object)* - `{ xAxis[], yAxis[] }` (m).\n\n- **user_information** *(object)* - Same keys as running summaries (weight, height, etc.).\n- **session_date** *(string)* - Formatted date (e.g. `07/04/2025`).\n\n**Note:** `summary_text` appears only after GenAI feedback has been generated.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Unique identifier of the session","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Set to `true` to retrieve a pre-generated demo summary for this weightlifting session.","required":false}],"responses":{"200":{"description":"Successfully retrieved weightlifting session summary","content":{"application/json":{"schema":{"required":["exercise_type","velocity","power","stability","user_information","session_date"],"type":"object","properties":{"summary_text":{"description":"Optional GenAI commentary on the lift.","type":"object","properties":{"velocity":{"description":"Narrative on bar velocity performance.","type":"string"},"power":{"description":"Narrative on force & power production.","type":"string"},"stability":{"description":"Narrative on bar path stability & control.","type":"string"},"final_summary":{"description":"Overall coaching remarks.","type":"string"}}},"exercise_type":{"description":"Type of lift/exercise performed.","type":"string"},"velocity":{"type":"object","properties":{"bar_velocity":{"type":"object","properties":{"min":{"description":"Minimum bar velocity (m/s).","type":"number"},"max":{"description":"Maximum bar velocity (m/s).","type":"number"},"values":{"description":"Array of bar velocity samples (m/s).","type":"array","items":{"type":"number"}}}}}},"power":{"type":"object","properties":{"ground_reaction_force":{"type":"object","properties":{"min":{"description":"Minimum ground reaction force (N).","type":"number"},"max":{"description":"Maximum ground reaction force (N).","type":"number"},"values":{"description":"Array of force samples (N).","type":"array","items":{"type":"number"}}}},"power":{"type":"object","properties":{"min":{"description":"Minimum power output (W).","type":"number"},"max":{"description":"Maximum power output (W).","type":"number"},"values":{"description":"Array of instantaneous power samples (W).","type":"array","items":{"type":"number"}}}}}},"stability":{"type":"object","properties":{"total_time":{"description":"Total lift duration (s).","type":"number"},"bar_height":{"type":"object","properties":{"max":{"description":"Maximum bar height (m).","type":"number"},"values":{"description":"Array of bar height samples (m).","type":"array","items":{"type":"number"}}}},"bar_trajectory":{"type":"object","properties":{"xAxis":{"description":"Bar trajectory on the x-axis (m).","type":"array","items":{"type":"number"}},"yAxis":{"description":"Bar trajectory on the y-axis (m).","type":"array","items":{"type":"number"}}}}}},"user_information":{"description":"Detailed user profile at the time of session.","type":"object","properties":{"weight":{"description":"Weight (kg)","type":"number"},"height":{"description":"Height (cm)","type":"number"},"age":{"description":"Age","type":"string"},"gender":{"description":"Gender","type":"string"},"email":{"description":"Email address","type":"string"},"display_name":{"description":"Display name","type":"string"}}},"session_date":{"description":"Date of the session (e.g. '07/04/2025').","type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Detailed error message.","type":"string"}}}}}},"401":{"description":"Unauthorized - Token missing or expired.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Authentication error message.","type":"string"}}}}}},"403":{"description":"Forbidden - User lacks a valid payment plan.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Payment-plan error message.","type":"string"}}}}}},"404":{"description":"Not Found - Session not located.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Not-found error message.","type":"string"}}}}}},"500":{"description":"Internal Server Error.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Server-side failure message.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
```

## Generate Summary for a WeightLifting Session

> \### Generate Summary Threads\
> \
> This endpoint generates summary threads for a given session based on predefined summary blocks and metrics.\
> \
> \*\*Usage Example:\*\*\
> Send a \`POST\` request to \`/weightlifting/sessions/{session\_id}/summary/\` where \`{session\_id}\` is the unique identifier of the session.\
> \
> \*\*Parameters:\*\*\
> \- \`session\_id\` \*(string, required)\*: The unique identifier of the session for which summary threads are to be generated.\
> \
> \*\*Response Structure:\*\*\
> Upon a successful request, the endpoint returns a JSON object mapping each block name to its corresponding thread ID.\
> \
> \*\*Example Response:\*\*\
> \`\`\`json\
> {\
> &#x20;   "velocity": "thread\_thread\_id",\
> &#x20;   "power": "thread\_thread\_id",\
> &#x20;   "stability": "thread\_thread\_id",\
> &#x20;   "final\_summary": "thread\_thread\_id",\
> }\
> \`\`\`\
> \
> \*\*Notes:\*\*\
> \- Ensure that the \`session\_id\` provided is valid and corresponds to an existing session in the system.\
> \- The user must have the necessary permissions to generate summary threads.

````json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/summary/":{"post":{"operationId":"weightlifting_sessions_summary_create","summary":"Generate Summary for a WeightLifting Session","description":"### Generate Summary Threads\n\nThis endpoint generates summary threads for a given session based on predefined summary blocks and metrics.\n\n**Usage Example:**\nSend a `POST` request to `/weightlifting/sessions/{session_id}/summary/` where `{session_id}` is the unique identifier of the session.\n\n**Parameters:**\n- `session_id` *(string, required)*: The unique identifier of the session for which summary threads are to be generated.\n\n**Response Structure:**\nUpon a successful request, the endpoint returns a JSON object mapping each block name to its corresponding thread ID.\n\n**Example Response:**\n```json\n{\n    \"velocity\": \"thread_thread_id\",\n    \"power\": \"thread_thread_id\",\n    \"stability\": \"thread_thread_id\",\n    \"final_summary\": \"thread_thread_id\",\n}\n```\n\n**Notes:**\n- Ensure that the `session_id` provided is valid and corresponds to an existing session in the system.\n- The user must have the necessary permissions to generate summary threads.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"The unique identifier of the session","required":true},{"schema":{"type":"string","enum":["metric","imperial"]},"name":"measurement_system","in":"query","description":"Measurement system: 'metric' or 'imperial'","required":false}],"responses":{"201":{"description":"Summary threads generated successfully.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"description":"Thread ID corresponding to a summary block","type":"string"}}}}},"400":{"description":"Bad Request - Invalid token or parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message describing the invalid request.","type":"string"}}}}}},"401":{"description":"Unauthorized - Token is invalid or expired.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating that the token is missing or invalid.","type":"string"}}}}}},"403":{"description":"Forbidden - Admin access is required.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating that admin privileges are required.","type":"string"}}}}}},"404":{"description":"Not Found - Session not found or user does not have a valid payment plan.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message indicating that the session was not found or payment plan is invalid.","type":"string"}}}}}},"500":{"description":"Internal Server Error - An unexpected error occurred.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message indicating a server-side failure.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
````

## Generate lift-analysis comment threads for a Weightlifting Session

> \### Generate Lift-analysis Comment Threads\
> \
> Creates one GenAI thread per lift-analysis metric (power, force, bar velocity, joint angles, etc.) so that the assistant can return concise coaching comments for each.\
> \
> \*\*Usage Example:\*\*\
> \`POST /weightlifting/sessions/{session\_id}/recommendation/\`\
> \
> \*\*Parameters:\*\*\
> \- \`session\_id\` \*(string, required)\* – Identifier of the weightlifting session to analyse.\
> \- \`measurement\_system\` \*(query, optional)\* – \`'metric'\` (default) or \`'imperial'\`; determines the units embedded in each prompt.\
> \
> \*\*Response Structure:\*\*\
> A JSON object that maps every requested metric to the ID of the GenAI thread created for it.\
> \
> \*\*Example Response:\*\*\
> \`\`\`json\
> {\
> &#x20; "power\_output":           "thread\_a12b34",\
> &#x20; "ground\_reaction\_force":  "thread\_c56d78",\
> &#x20; "barbell\_velocity":       "thread\_e90f12",\
> &#x20; "hip\_velocity":           "thread\_g34h56",\
> &#x20; "shin\_angle":             "thread\_i78j90",\
> &#x20; "hip\_height":             "thread\_k12l34",\
> &#x20; "torso\_angle":            "thread\_m56n78",\
> &#x20; "hip\_angle":              "thread\_o90p12",\
> &#x20; "knee\_angle":             "thread\_q34r56",\
> &#x20; "bar\_height":             "thread\_s78t90",\
> &#x20; "barbell\_trajectory":     "thread\_u12v34",\
> &#x20; "vertical\_shoulder\_height":"thread\_w56x78"\
> }\
> \`\`\`\
> \
> \*\*Notes:\*\*\
> \- \`session\_id\` must reference an existing weight-lifting session.\
> \- The caller needs appropriate permissions (valid token & payment plan).\
> \- Use the returned thread IDs to poll / retrieve the generated comments later.

````json
{"openapi":"3.1.1","info":{"title":"AIKYNETIX WEB API","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Enter your bearer token (Firebase auth) in the format: Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Enter your API key in the header: API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/recommendation/":{"post":{"operationId":"weightlifting_sessions_recommendation_create","summary":"Generate lift-analysis comment threads for a Weightlifting Session","description":"### Generate Lift-analysis Comment Threads\n\nCreates one GenAI thread per lift-analysis metric (power, force, bar velocity, joint angles, etc.) so that the assistant can return concise coaching comments for each.\n\n**Usage Example:**\n`POST /weightlifting/sessions/{session_id}/recommendation/`\n\n**Parameters:**\n- `session_id` *(string, required)* – Identifier of the weightlifting session to analyse.\n- `measurement_system` *(query, optional)* – `'metric'` (default) or `'imperial'`; determines the units embedded in each prompt.\n\n**Response Structure:**\nA JSON object that maps every requested metric to the ID of the GenAI thread created for it.\n\n**Example Response:**\n```json\n{\n  \"power_output\":           \"thread_a12b34\",\n  \"ground_reaction_force\":  \"thread_c56d78\",\n  \"barbell_velocity\":       \"thread_e90f12\",\n  \"hip_velocity\":           \"thread_g34h56\",\n  \"shin_angle\":             \"thread_i78j90\",\n  \"hip_height\":             \"thread_k12l34\",\n  \"torso_angle\":            \"thread_m56n78\",\n  \"hip_angle\":              \"thread_o90p12\",\n  \"knee_angle\":             \"thread_q34r56\",\n  \"bar_height\":             \"thread_s78t90\",\n  \"barbell_trajectory\":     \"thread_u12v34\",\n  \"vertical_shoulder_height\":\"thread_w56x78\"\n}\n```\n\n**Notes:**\n- `session_id` must reference an existing weight-lifting session.\n- The caller needs appropriate permissions (valid token & payment plan).\n- Use the returned thread IDs to poll / retrieve the generated comments later.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Unique identifier of the session","required":true},{"schema":{"type":"string","enum":["metric","imperial"]},"name":"measurement_system","in":"query","description":"Measurement system used inside the prompts","required":false}],"responses":{"201":{"description":"Threads created successfully.","content":{"application/json":{"schema":{"description":"Dictionary mapping lift metrics to thread IDs.","required":["power_output","ground_reaction_force","barbell_velocity","hip_velocity","shin_angle","hip_height","torso_angle","hip_angle","knee_angle","bar_height","barbell_trajectory","vertical_shoulder_height"],"type":"object","properties":{"power_output":{"description":"Thread ID for power output.","type":"string"},"ground_reaction_force":{"description":"Thread ID for GRF.","type":"string"},"barbell_velocity":{"description":"Thread ID for barbell velocity.","type":"string"},"hip_velocity":{"description":"Thread ID for hip velocity.","type":"string"},"shin_angle":{"description":"Thread ID for shin angle.","type":"string"},"hip_height":{"description":"Thread ID for hip height.","type":"string"},"torso_angle":{"description":"Thread ID for torso angle.","type":"string"},"hip_angle":{"description":"Thread ID for hip joint angle.","type":"string"},"knee_angle":{"description":"Thread ID for knee joint angle.","type":"string"},"bar_height":{"description":"Thread ID for max bar height.","type":"string"},"barbell_trajectory":{"description":"Thread ID for bar path.","type":"string"},"vertical_shoulder_height":{"description":"Thread ID for shoulder height.","type":"string"}}}}}},"400":{"description":"Bad Request - Invalid token or parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message describing the invalid request.","type":"string"}}}}}},"401":{"description":"Unauthorized - Token is invalid or expired.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating that the token is missing or invalid.","type":"string"}}}}}},"403":{"description":"Forbidden - Admin access is required.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error indicating that admin privileges are required.","type":"string"}}}}}},"404":{"description":"Not Found - Session not found or user does not have a valid payment plan.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Error message indicating that the session was not found or payment plan is invalid.","type":"string"}}}}}},"500":{"description":"Internal Server Error - An unexpected error occurred.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"A detailed error message indicating a server-side failure.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
````


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aikynetix.app/api-documentation/developer-resources-and-api-reference/api-reference/weightlifting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
