curl -X GET "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/library/template/{templateId}" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/library/template/{templateId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/library/template/{templateId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"_id": "67f1234567890abcdef1234",
"name": "4-Day Strength Block",
"description": "Progressive upper/lower split.",
"media": [
{
"type": "image",
"url": "https://cdn.example.com/exercises/bench-press.jpg",
"platform": null,
"videoId": null,
"thumbnail": null,
"duration": null,
"width": 1280,
"height": 720
}
],
"difficulty": "Intermediate",
"intensity": "High",
"category": "Strength",
"goal": "Strength",
"duration": {
"startDate": "2026-04-15",
"endDate": "2026-06-15",
"hasEndDate": true
},
"scheduleMode": "multi_week",
"days": [
{
"_id": "67f1234567890abcdef1234",
"name": "Day 1 – Lower Body",
"description": "",
"order": 0,
"exercises": [
{
"_id": "67f1234567890abcdef1234",
"exerciseId": "67f1234567890abcdef1234",
"exerciseName": "Barbell Squat",
"thumbnail": "https://cdn.example.com/exercises/barbell-squat.jpg",
"primaryMuscle": "Quadriceps",
"equipment": [
"Barbell",
"Rack"
],
"sets": 4,
"minReps": 6,
"maxReps": 10,
"rest": 90,
"intensity": "High",
"difficulty": "Intermediate",
"notes": "",
"isFavourite": false
}
],
"exerciseCount": 5
}
],
"weeks": [
{
"weekNumber": 1,
"dayCount": 4,
"workoutCount": 5,
"activityCount": 7,
"restDayCount": 2,
"totalTimeMinutes": 150,
"totalTimeSeconds": 9000
}
],
"totalDays": 4,
"totalExercises": 20,
"isTemplateFavourite": false
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 400,
"key": "request.invalid",
"message": "The request is invalid."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 404,
"key": "resource.not_found",
"message": "The requested Public API resource was not found."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 500,
"key": "server.internal_error",
"message": "An unexpected Public API server error occurred."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}Get workout template detail
Client-only. Returns the full workout template including all days (planMoments) and their exercises. Each exercise entry is enriched with data from the Exercise collection and includes isFavourite for the requesting client. Days are ordered by their order field; only non-deleted days and exercises are included.
weeks[] carries one summary card per week and is populated ONLY when scheduleMode is multi_week; a recurring plan returns an empty array and is rendered from days instead. The field is always present, so a client can branch on scheduleMode or simply on weeks.length.
Requires the workout_client_plans:read scope. This operation maps to /app/v1/workout/client/library/template/:templateId and retains its Workout V2 permission, feature-flag, and resource-scope checks.
The clientId path parameter identifies the client represented by the request context.
curl -X GET "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/library/template/{templateId}" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/library/template/{templateId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/library/template/{templateId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"_id": "67f1234567890abcdef1234",
"name": "4-Day Strength Block",
"description": "Progressive upper/lower split.",
"media": [
{
"type": "image",
"url": "https://cdn.example.com/exercises/bench-press.jpg",
"platform": null,
"videoId": null,
"thumbnail": null,
"duration": null,
"width": 1280,
"height": 720
}
],
"difficulty": "Intermediate",
"intensity": "High",
"category": "Strength",
"goal": "Strength",
"duration": {
"startDate": "2026-04-15",
"endDate": "2026-06-15",
"hasEndDate": true
},
"scheduleMode": "multi_week",
"days": [
{
"_id": "67f1234567890abcdef1234",
"name": "Day 1 – Lower Body",
"description": "",
"order": 0,
"exercises": [
{
"_id": "67f1234567890abcdef1234",
"exerciseId": "67f1234567890abcdef1234",
"exerciseName": "Barbell Squat",
"thumbnail": "https://cdn.example.com/exercises/barbell-squat.jpg",
"primaryMuscle": "Quadriceps",
"equipment": [
"Barbell",
"Rack"
],
"sets": 4,
"minReps": 6,
"maxReps": 10,
"rest": 90,
"intensity": "High",
"difficulty": "Intermediate",
"notes": "",
"isFavourite": false
}
],
"exerciseCount": 5
}
],
"weeks": [
{
"weekNumber": 1,
"dayCount": 4,
"workoutCount": 5,
"activityCount": 7,
"restDayCount": 2,
"totalTimeMinutes": 150,
"totalTimeSeconds": 9000
}
],
"totalDays": 4,
"totalExercises": 20,
"isTemplateFavourite": false
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 400,
"key": "request.invalid",
"message": "The request is invalid."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 404,
"key": "resource.not_found",
"message": "The requested Public API resource was not found."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 500,
"key": "server.internal_error",
"message": "An unexpected Public API server error occurred."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}Authorizations
Public API access token issued by /public/v1/oauth/token. Example: Authorization: Bearer fspt_.... Each resource request rechecks the token company's current provider access. Disabling access blocks existing tokens with 403 auth.provider_unavailable.
Path Parameters
Workout template plan id.
"67f1234567890abcdef1234"
Client in the company bound to the Public API token.
^[a-fA-F0-9]{24}$