{"openapi":"3.1.0","info":{"title":"Vitruve Partner API","description":"Read-only API for integration partners: shared customers’ people, workouts and catalogs. Full documentation: https://vitruve-docs-prod.web.app/partners/","version":"1.0.0"},"servers":[{"url":"https://api-integrations-next.vitruve.fit/v1"}],"security":[{"CustomerKey":[],"PartnerSecret":[]}],"paths":{"/organization":{"get":{"summary":"Get your organization","description":"Returns the organization that owns the API key. Use it to confirm a key works and which organization it is scoped to.","operationId":"getOrganization","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","name":"Northgate Performance","category":"professional-team","measurementSystem":"metric","phoneNumber":null,"createdAt":"2025-06-10T09:00:00.000Z","updatedAt":"2026-01-21T15:40:12.000Z","deletedAt":null}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/athletes":{"get":{"summary":"List athletes","description":"Active athletes of your organization, ordered by surname, then name. Each athlete carries their membership and the ids of their teams.","operationId":"getAthletes","parameters":[{"name":"search","in":"query","required":false,"description":"Case-insensitive. Every word must match the name, surname or email, so a full name such as `Ana García` works.","schema":{"type":"string"}},{"name":"teamId","in":"query","required":false,"description":"Only athletes in this team.","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","name":"Marta","surname":"Ibáñez","email":"marta.ibanez@example.com","isVerified":true,"profession":"athlete","gender":"female","measurementSystem":"metric","avatarPath":null,"height":172,"weight":64,"birthDate":"1998-04-12T00:00:00.000Z","dominantSide":"right","createdAt":"2025-09-02T08:14:31.402Z","updatedAt":"2026-03-18T10:22:05.117Z","deletedAt":null,"organizationsToUsers":[{"id":"0d2f6b8e-5a17-4c93-b4e1-93a7c0d58f21","userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","roleId":"dc82d01f-1136-4fcb-97dc-11a8b2203d98","createdAt":"2025-09-02T08:14:31.402Z","updatedAt":"2025-09-02T08:14:31.402Z","deletedAt":null}],"teams":[{"id":"9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"}]}],"meta":{"limit":2,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/athletes/{id}":{"get":{"summary":"Get an athlete","description":"One athlete of your organization.","operationId":"getAthletesId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","name":"Marta","surname":"Ibáñez","email":"marta.ibanez@example.com","isVerified":true,"profession":"athlete","gender":"female","measurementSystem":"metric","avatarPath":null,"height":172,"weight":64,"birthDate":"1998-04-12T00:00:00.000Z","dominantSide":"right","createdAt":"2025-09-02T08:14:31.402Z","updatedAt":"2026-03-18T10:22:05.117Z","deletedAt":null,"organizationsToUsers":[{"id":"0d2f6b8e-5a17-4c93-b4e1-93a7c0d58f21","userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","roleId":"dc82d01f-1136-4fcb-97dc-11a8b2203d98","createdAt":"2025-09-02T08:14:31.402Z","updatedAt":"2025-09-02T08:14:31.402Z","deletedAt":null}],"teams":[{"id":"9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"}]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/athletes/{id}/profile":{"get":{"summary":"Get an athlete’s sport profile","description":"The athlete’s sport profile with its dated `versions`. The version with `validTo: null` is the current one.","operationId":"getAthletesIdProfile","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"6e0b9d41-c2a8-4f35-8b17-d5a3e92c0f68","userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","revision":2,"createdAt":"2025-09-02T08:20:00.000Z","updatedAt":"2026-02-01T09:00:00.000Z","deletedAt":null,"versions":[{"id":"b3a8d5f0-71e2-4c69-90a4-e1c7f2d83b56","profileId":"6e0b9d41-c2a8-4f35-8b17-d5a3e92c0f68","validFrom":"2026-02-01T00:00:00.000Z","validTo":null,"sport":"basketball","position":"guard","competitionLevel":"professional","squad":"first-team","strengthTrainingStartedYear":2016,"recordedAt":"2026-02-01T09:00:00.000Z","recordedByUserId":"5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47"}]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/coaches":{"get":{"summary":"List coaches","description":"Owners and coaches of your organization, with their membership.","operationId":"getCoaches","parameters":[{"name":"search","in":"query","required":false,"description":"Case-insensitive. Every word must match the name, surname or email, so a full name such as `Ana García` works.","schema":{"type":"string"}},{"name":"roleId","in":"query","required":false,"description":"Only owners (`4aa018e6-8b22-40b1-8d07-ab4f1af51330`) or only coaches (`ef736bad-c98e-410e-bf26-af834332153b`).","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47","name":"Daniel","surname":"Okafor","email":"daniel.okafor@northgate.example","isVerified":true,"profession":"coach","organizationsToUsers":[{"id":"9c4e1a73-d085-4b2f-a6e8-31f7b5d02c94","userId":"5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","roleId":"ef736bad-c98e-410e-bf26-af834332153b","deletedAt":null}]}],"meta":{"limit":25,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/coaches/{id}":{"get":{"summary":"Get a coach","description":"One owner or coach of your organization.","operationId":"getCoachesId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47","name":"Daniel","surname":"Okafor","email":"daniel.okafor@northgate.example","isVerified":true,"profession":"coach","organizationsToUsers":[{"userId":"5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","roleId":"ef736bad-c98e-410e-bf26-af834332153b"}]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/coaches/{id}/athletes":{"get":{"summary":"List a coach's athletes","description":"The ids of the athletes a coach is assigned to: every athlete of your organization except those unassigned from them. The owner’s id answers every athlete: the owner is never unassigned.","operationId":"getCoachesIdAthletes","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"athleteIds":["3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/teams":{"get":{"summary":"List teams","description":"Teams of your organization, ordered by name, each with the ids of its athletes.","operationId":"getTeams","parameters":[{"name":"search","in":"query","required":false,"description":"Case-insensitive match on the team name.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64","name":"First team","avatarPath":null,"organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","createdAt":"2025-09-01T10:00:00.000Z","updatedAt":"2025-09-01T10:00:00.000Z","deletedAt":null,"users":[{"id":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"},{"id":"c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"}]}],"meta":{"limit":10,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/teams/{id}":{"get":{"summary":"Get a team","description":"One team with the ids of its athletes.","operationId":"getTeamsId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64","name":"First team","avatarPath":null,"organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","users":[{"id":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"},{"id":"c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"}]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/workouts":{"get":{"summary":"List workouts","description":"Athlete workouts of your organization, without their content. Templates are excluded; they are served by `/templates/workouts`. Fetch a workout’s blocks, sets and metrics with `GET /workouts/{id}`.","operationId":"getWorkouts","parameters":[{"name":"userId","in":"query","required":false,"description":"Only workouts of this athlete.","schema":{"type":"string","format":"uuid"}},{"name":"exerciseId","in":"query","required":false,"description":"Only workouts with at least one prescription of this exercise.","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"description":"`completed` for performed workouts, `pending` for assigned workouts not yet performed.","schema":{"type":"string","enum":["completed","pending"]}},{"name":"trainingType","in":"query","required":false,"description":"Only workouts with at least one prescription of this training type.","schema":{"type":"string","enum":["vbt","jump","sprint","reaction"]}},{"name":"from","in":"query","required":false,"description":"Inclusive lower bound: `YYYY-MM-DD` or an ISO 8601 datetime. A bare date starts at 00:00 in `timezone`, or at the change on a day whose midnight a daylight-saving change skips.","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"Inclusive upper bound: `YYYY-MM-DD` or an ISO 8601 datetime. A bare date covers that whole day in `timezone`.","schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"description":"IANA time zone, such as `Europe/Madrid`. A bare `from` / `to` date covers that whole day in it, and a datetime without an offset is a wall-clock time in it. Datetimes with `Z` or an offset are taken as given.","schema":{"type":"string","default":"UTC"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35","name":"Lower body strength A","isTemplate":false,"rpe":8,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","scheduledWorkoutId":null,"completedAt":"2026-03-17T10:41:52.318Z","startedAt":"2026-03-17T09:58:04.902Z","createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-17T10:41:52.877Z","deletedAt":null,"testType":null},{"id":"5a0e7c3d-91b4-4f26-8d58-c3e2a1f6b097","name":"Upper body power","isTemplate":false,"rpe":7,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","scheduledWorkoutId":null,"completedAt":"2026-03-14T17:32:10.441Z","startedAt":"2026-03-14T16:55:47.019Z","createdAt":"2026-03-14T16:55:46.870Z","updatedAt":"2026-03-14T17:32:10.902Z","deletedAt":null,"testType":null}],"meta":{"limit":2,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/workouts/{id}":{"get":{"summary":"Get a workout","description":"One athlete workout with its full tree: blocks → prescriptions groups → prescriptions → serie prescriptions and series, each series with its values, set-level metrics and repetitions. Templates return 404 here; use `GET /templates/workouts/{id}`.","operationId":"getWorkoutsId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35","name":"Lower body strength A","isTemplate":false,"rpe":8,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","scheduledWorkoutId":null,"completedAt":"2026-03-17T10:41:52.318Z","startedAt":"2026-03-17T09:58:04.902Z","createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-17T10:41:52.877Z","deletedAt":null,"testType":null,"blocks":[{"id":"0b6d3a9e-7f21-4c58-9d14-e82a5f3c6b79","name":"Main lifts","isTemplate":false,"order":0,"workoutId":"f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-10T16:20:11.004Z","deletedAt":null,"prescriptionsGroups":[{"id":"4d1e8c75-2a93-4f06-b8e7-39c0a6d5f142","name":"Back squat","isTemplate":false,"order":0,"blockId":"0b6d3a9e-7f21-4c58-9d14-e82a5f3c6b79","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-10T16:20:11.004Z","deletedAt":null,"prescriptions":[{"id":"a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","prescriptionsGroupId":"4d1e8c75-2a93-4f06-b8e7-39c0a6d5f142","name":"Back squat","order":0,"note":"Stop the set if mean velocity drops below 0.55 m/s.","isTemplate":false,"isVbt":true,"trainingType":"vbt","trainingAlgorithm":null,"createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-10T16:20:11.004Z","deletedAt":null,"seriePrescriptions":[{"id":"e3b72d05-6a1c-4f98-b4e3-1d8c9a5f0726","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","prescriptionId":"a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8","prescriptionTypeId":"3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05","unitId":"fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78","order":0,"isRange":false,"isTopMode":false,"createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-10T16:20:11.004Z","deletedAt":null},{"id":"9d4f1b68-c2e7-4a05-93d1-7b6e0f2a8c34","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","prescriptionId":"a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8","prescriptionTypeId":"62c8a0f4-3d19-4e7b-a5c2-f0b9d14e8a63","unitId":"b7e05a92-4f3c-4d18-86a1-2c9e7d3b5f40","order":1,"isRange":false,"isTopMode":false,"createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-10T16:20:11.004Z","deletedAt":null}],"series":[{"id":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","prescriptionId":"a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8","order":0,"completedAt":"2026-03-17T10:06:30.512Z","createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-17T10:06:30.512Z","deletedAt":null,"serieValues":[{"id":"0f6d2b84-a7e1-4c39-b05d-e9a3c8f1724b","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","seriePrescriptionId":"e3b72d05-6a1c-4f98-b4e3-1d8c9a5f0726","valuePrescriptedInf":null,"valuePrescriptedSup":null,"valuePrescripted":100,"valueExecuted":100,"createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-17T10:06:30.512Z","deletedAt":null},{"id":"c5a19e37-04bd-4f62-8e7a-3b2d6f0c9a18","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","seriePrescriptionId":"9d4f1b68-c2e7-4a05-93d1-7b6e0f2a8c34","valuePrescriptedInf":null,"valuePrescriptedSup":null,"valuePrescripted":5,"valueExecuted":5,"createdAt":"2026-03-10T16:20:11.004Z","updatedAt":"2026-03-17T10:06:30.512Z","deletedAt":null}],"metricValues":[{"id":"71e4c0a9-5d36-4b82-a1f7-9c8e2b4d0563","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","metricId":"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63","value":0.61,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","repetitionId":null,"serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","createdAt":"2026-03-17T10:06:30.512Z","updatedAt":"2026-03-17T10:06:30.512Z","deletedAt":null}],"repetitions":[{"id":"e19a4d83-5b60-4c27-a8f1-0d7c3e52b946","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","type":"concentric","repNumber":1,"repIndex":0,"createdAt":"2026-03-17T10:05:58.140Z","updatedAt":"2026-03-17T10:05:58.140Z","deletedAt":null,"metricValues":[{"id":"86a1c4e7-3b05-4d9f-92e8-5f1d7c0a3b94","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","metricId":"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63","value":0.64,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","repetitionId":"e19a4d83-5b60-4c27-a8f1-0d7c3e52b946","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","createdAt":"2026-03-17T10:05:58.140Z","updatedAt":"2026-03-17T10:05:58.140Z","deletedAt":null},{"id":"3c7e9b20-a5f1-4d86-b2c4-71d0e8f3a659","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","metricId":"2a9c6e41-b0d8-4f73-9e15-84d3c7a0b2f6","value":1.12,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","repetitionId":"e19a4d83-5b60-4c27-a8f1-0d7c3e52b946","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","createdAt":"2026-03-17T10:05:58.140Z","updatedAt":"2026-03-17T10:05:58.140Z","deletedAt":null}]},{"id":"48b3f6d1-e2a0-4c95-b7d8-06f1a9c3e5b2","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","type":"concentric","repNumber":2,"repIndex":1,"createdAt":"2026-03-17T10:06:03.377Z","updatedAt":"2026-03-17T10:06:03.377Z","deletedAt":null,"metricValues":[{"id":"d9c2a5e0-8b17-4f4d-a36e-5e0b7c1f9d84","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","metricId":"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63","value":0.62,"userId":"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","repetitionId":"48b3f6d1-e2a0-4c95-b7d8-06f1a9c3e5b2","serieId":"68c2e5b1-0d47-4a93-9f6e-b13a7d84c250","createdAt":"2026-03-17T10:06:03.377Z","updatedAt":"2026-03-17T10:06:03.377Z","deletedAt":null}]}]}]}]}]}]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/exercises":{"get":{"summary":"List exercises","description":"Vitruve’s global exercise library plus the exercises your organization created, ordered by name. Each exercise carries its primary and secondary muscles and your organization’s `exerciseMetadata`.","operationId":"getExercises","parameters":[{"name":"search","in":"query","required":false,"description":"Case-insensitive match on the exercise name.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Exact, case-sensitive match on `category`, e.g. `strength` or `plyometrics`.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"`global` returns only Vitruve’s library, `organization` only your own exercises, `all` both.","schema":{"type":"string","enum":["all","global","organization"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","name":"Back Squat","organizationId":null,"isMain":true,"isJump":false,"isReaction":false,"isSprint":false,"equipment":"barbell","force":"push","level":"intermediate","mechanic":"compound","instructions":"Set the bar across your upper back and unrack it with feet shoulder-width apart. Bend at the hips and knees until the thighs are at least parallel, then drive up through the whole foot to stand.","category":"strength","youtubeUrl":"https://www.youtube.com/results?search_query=how%20to%20do%20Back%20Squat","googleUrl":"https://www.google.com/search?q=how%20to%20do%20Back%20Squat","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null,"primaryMuscles":[{"id":"5c8f2d06-a931-4e7b-96d4-0b3e8a1f7c52","name":"quadriceps","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null}],"secondaryMuscles":[{"id":"2b7e4f19-c6a3-4d80-9e51-a8d3f0c7b264","name":"glutes","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null},{"id":"e6a09c3d-5f72-4b18-8d4e-17c9b2a6f035","name":"hamstrings","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null}],"exerciseMetadata":[{"id":"9d5c2a71-e4f8-4b36-8c0d-6a1e3f7b9c52","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","videoUrl":"https://videos.northgate.example/back-squat.mp4","createdAt":"2025-10-03T11:12:40.000Z","updatedAt":"2025-10-03T11:12:40.000Z"}]}],"meta":{"limit":2,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/exercises/{id}":{"get":{"summary":"Get an exercise","description":"One global exercise or one of your organization’s exercises, with its muscles and your organization’s `exerciseMetadata`.","operationId":"getExercisesId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","name":"Back Squat","organizationId":null,"isMain":true,"isJump":false,"isReaction":false,"isSprint":false,"equipment":"barbell","force":"push","level":"intermediate","mechanic":"compound","instructions":"Set the bar across your upper back and unrack it with feet shoulder-width apart. Bend at the hips and knees until the thighs are at least parallel, then drive up through the whole foot to stand.","category":"strength","youtubeUrl":"https://www.youtube.com/results?search_query=how%20to%20do%20Back%20Squat","googleUrl":"https://www.google.com/search?q=how%20to%20do%20Back%20Squat","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null,"primaryMuscles":[{"id":"5c8f2d06-a931-4e7b-96d4-0b3e8a1f7c52","name":"quadriceps","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null}],"secondaryMuscles":[{"id":"2b7e4f19-c6a3-4d80-9e51-a8d3f0c7b264","name":"glutes","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null},{"id":"e6a09c3d-5f72-4b18-8d4e-17c9b2a6f035","name":"hamstrings","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null}],"exerciseMetadata":[{"id":"9d5c2a71-e4f8-4b36-8c0d-6a1e3f7b9c52","exerciseId":"1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7","organizationId":"7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10","videoUrl":"https://videos.northgate.example/back-squat.mp4","createdAt":"2025-10-03T11:12:40.000Z","updatedAt":"2025-10-03T11:12:40.000Z"}]}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/muscles":{"get":{"summary":"List muscles","description":"Every muscle exercises can reference (see `primaryMuscleIds` / `secondaryMuscleIds`), ordered by name. Names are lowercase, e.g. `quadriceps`, `lower back`.","operationId":"getMuscles","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"2b7e4f19-c6a3-4d80-9e51-a8d3f0c7b264","name":"glutes","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null},{"id":"e6a09c3d-5f72-4b18-8d4e-17c9b2a6f035","name":"hamstrings","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null}],"meta":{"limit":2,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/muscles/{id}":{"get":{"summary":"Get a muscle","description":"One muscle.","operationId":"getMusclesId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"5c8f2d06-a931-4e7b-96d4-0b3e8a1f7c52","name":"quadriceps","updatedAt":"2026-05-04T07:30:00.000Z","createdAt":"2024-01-15T09:00:00.000Z","deletedAt":null}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/metrics":{"get":{"summary":"List metrics","description":"Metric definitions, ordered by `order`. Use them to name and unit the values inside workouts.","operationId":"getMetrics","parameters":[{"name":"group","in":"query","required":false,"description":"Only metrics in this group. Exact, case-sensitive match.","schema":{"type":"string","enum":["General","Weight","Time","Distance","Velocity","Fatigue","Percentage","Power","Force","Acceleration","Scale","Heart Rate","Temperature","Pressure","Energy","Volume","Pace","Oxygen Consumption","Concentration"]}},{"name":"isRepetitionMetric","in":"query","required":false,"description":"Only metrics recorded per repetition (`true`) or not (`false`).","schema":{"type":"boolean"}},{"name":"isSerieMetric","in":"query","required":false,"description":"Only metrics recorded per set (`true`) or not (`false`).","schema":{"type":"boolean"}},{"name":"isUserMetric","in":"query","required":false,"description":"Only athlete metrics such as body weight (`true`) or not (`false`).","schema":{"type":"boolean"}},{"name":"isEquationMetric","in":"query","required":false,"description":"Only metrics usable in equations (`true`) or not (`false`).","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63","name":"Mean Propulsive Velocity","key":"mean-propulsive-velocity","group":"Velocity","dimension":null,"unitId":"fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78","order":0,"isMainVelocityMetric":true,"isRepetitionMetric":true,"isSerieMetric":false,"isQuickStartMetric":true,"isEquationMetric":true,"isUserMetric":false,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null}],"meta":{"limit":1,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/metrics/{id}":{"get":{"summary":"Get a metric","description":"One metric definition.","operationId":"getMetricsId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63","name":"Mean Propulsive Velocity","key":"mean-propulsive-velocity","group":"Velocity","dimension":null,"unitId":"fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78","order":0,"isMainVelocityMetric":true,"isRepetitionMetric":true,"isSerieMetric":false,"isQuickStartMetric":true,"isEquationMetric":true,"isUserMetric":false,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/prescription-types":{"get":{"summary":"List prescription types","description":"The parameters a coach can prescribe for a set (weight, repetitions, velocity targets, fatigue limits…), ordered by name. Use them to read `seriePrescriptions` in workouts, programs and templates.","operationId":"getPrescriptionTypes","parameters":[{"name":"group","in":"query","required":false,"description":"Only prescription types in this group. Exact, case-sensitive match.","schema":{"type":"string","enum":["General","VBT","Velocity","Jump","Sprint","Reaction","Time","Test","Other"]}},{"name":"trainingModality","in":"query","required":false,"description":"Only prescription types for this modality. Types that apply to any modality have none and are left out.","schema":{"type":"string","enum":["vbt","jump","sprint","reaction"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"b8d24f6a-0c97-4e35-a1f8-5d3e9c7b2a16","name":"Fatigue [MPV]","label":"Fatigue [MPV]","metricId":"4c9e7b20-d1a5-4f83-b6e2-a07f3d58c914","primaryMetricId":"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63","group":"VBT","prescriptionGroup":null,"trainingModality":"vbt","valueType":"int","placeholder":"0","formatRegex":"^(100|\\d{0,2})?$","hasRange":false,"hasTopMode":false,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null},{"id":"3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05","name":"Weight","label":"Weight","metricId":"62f0d8a4-b3c9-4e17-8a5d-0e4c7f1b9d28","primaryMetricId":null,"group":"General","prescriptionGroup":null,"trainingModality":null,"valueType":"float","placeholder":"0","formatRegex":"^\\d{0,5}(\\.\\d{0,2})?$","hasRange":true,"hasTopMode":false,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null}],"meta":{"limit":2,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/prescription-types/{id}":{"get":{"summary":"Get a prescription type","description":"One prescription type.","operationId":"getPrescriptionTypesId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05","name":"Weight","label":"Weight","metricId":"62f0d8a4-b3c9-4e17-8a5d-0e4c7f1b9d28","primaryMetricId":null,"group":"General","prescriptionGroup":null,"trainingModality":null,"valueType":"float","placeholder":"0","formatRegex":"^\\d{0,5}(\\.\\d{0,2})?$","hasRange":true,"hasTopMode":false,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/units":{"get":{"summary":"List units","description":"Units of measure, ordered by name. Each unit converts to its base unit with `conversionFactor`: `base = value × conversionFactor`. For pounds the factor is `0.45359237`, so 100 lb is 45.359237 kg.","operationId":"getUnits","parameters":[{"name":"dimension","in":"query","required":false,"description":"Only units of this physical quantity. Exact, case-sensitive match.","schema":{"type":"string","enum":["Acceleration","Cadence","Distance","Energy","Force","Frequency","Heart Rate","Oxygen Consumption","Pace","Power","Pressure","Temperature","Time","Velocity","Volume","Weight"]}},{"name":"measurementSystem","in":"query","required":false,"description":"Only metric or only imperial units.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"`meta.nextCursor` from the previous page. Omit it to get the first page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":[{"id":"09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246","name":"Kilograms","dimension":"Weight","measurementSystem":"metric","label":"kg","baseUnitId":"09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246","pairUnitId":"7b13e9c5-48d2-4a06-b9f1-c2e8a5d4f317","conversionFactor":1,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null,"prescriptionTypeId":null},{"id":"7b13e9c5-48d2-4a06-b9f1-c2e8a5d4f317","name":"Pounds","dimension":"Weight","measurementSystem":"imperial","label":"lb","baseUnitId":"09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246","pairUnitId":"09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246","conversionFactor":0.45359237,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null,"prescriptionTypeId":null}],"meta":{"limit":50,"hasMore":true,"nextCursor":"ZTU2M2ZlYzMtM2IxYy00…"}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}},"/units/{id}":{"get":{"summary":"Get a unit","description":"One unit, with `conversionFactor` as a number.","operationId":"getUnitsId","parameters":[{"name":"id","in":"path","required":true,"description":"Resource id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"ok":true,"timestamp":1738247125207,"data":{"id":"fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78","name":"Meters per Second","dimension":"Velocity","measurementSystem":"metric","label":"m/s","baseUnitId":"fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78","pairUnitId":null,"conversionFactor":1,"createdAt":"2024-01-15T09:00:00.000Z","updatedAt":"2026-05-04T07:30:00.000Z","deletedAt":null,"prescriptionTypeId":null}}}}},"400":{"description":"The request was understood but a parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Invalid query parameters: 'limit': Number must be less than or equal to 100"}}}},"401":{"description":"The customer key or your partner secret is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Missing X-API-Key header"}}}},"403":{"description":"The key is valid but this access is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Your plan no longer includes API access"}}}},"404":{"description":"The resource does not exist in the customer’s organization, or the route does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Athlete not found"}}}},"429":{"description":"A customer key exceeded 30 requests per minute, or authentication failed too often.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Rate limit of 30 requests per minute exceeded"}}}},"500":{"description":"Something failed on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Internal server error"}}}},"503":{"description":"The service is temporarily unable to serve requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"timestamp":1738247125207,"message":"Service temporarily unavailable"}}}}}}}},"components":{"securitySchemes":{"CustomerKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"The customer’s integration key, created for your platform in Settings → Integrations (example: CUSTOMER_INTEGRATION_KEY)."},"PartnerSecret":{"type":"apiKey","in":"header","name":"X-Partner-Secret","description":"Your partner secret, issued by Vitruve and only accepted from your registered IP addresses (example: YOUR_PARTNER_SECRET)."}},"schemas":{"Error":{"type":"object","required":["ok","timestamp","message"],"properties":{"ok":{"type":"boolean","const":false},"timestamp":{"type":"integer","description":"Unix milliseconds."},"message":{"type":"string"}}}}}}