curl -X GET "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/training-section" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/training-section', 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}/training-section"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"accessControl": {
"pageEnabled": true,
"sections": {
"trainingPlanAssignedSection": true,
"muscleActivation": true,
"workoutPlanLibrary": true,
"videoLibrary": true,
"freestyleWorkout": true,
"performanceSummary": true,
"dailyTrainingNotes": true
}
},
"workoutOfTheDay": {
"enabled": true,
"hidden": false,
"state": "resume",
"wod": {
"id": "67f1234567890abcdef1234",
"title": "Fat Burn Program",
"description": "",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234",
"planName": "Fat Burn Program",
"thumbnail": "https://cdn.example.com/wod.jpg",
"scheduledDate": "2026-07-13T00:00:00.000Z",
"scoringType": "amrap",
"sourceType": "template",
"participantCount": 12,
"completionCount": 5,
"sessionId": "6670aa11bb22cc33dd44ee55",
"sessionStatus": "in_progress",
"summary": {
"totalSets": 12,
"completedSets": 4,
"elapsedMinutes": 18,
"expectedDurationMinutes": 110,
"volumeKg": 27,
"reps": 48
},
"startedBy": {
"avatars": [
{
"clientId": "67f1234567890abcdef1234",
"image": "https://cdn.example.com/clients/a1.jpg",
"name": "Kaylynn Lubin"
}
],
"totalCount": 14,
"othersCount": 12
},
"myWorkoutRank": {
"scoreType": "totalReps",
"rank": 4,
"value": 124,
"displayScore": 124,
"totalParticipants": 14
}
}
},
"weeklyRanking": {
"enabled": true,
"hidden": false,
"resetLabel": "Reset in 4 days - Sunday Midnight",
"weekStart": "2026-07-12T00:00:00.000Z",
"weekEnd": "2026-07-19T00:00:00.000Z",
"data": [
{
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"anonymousAvatar": false,
"isCurrentUser": true
}
],
"currentUser": {
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"nextRank": 3,
"nextRankValue": 4500,
"xpToNextRank": 605,
"progressToNextRank": 0.8656,
"participating": true,
"inTop5": true,
"isCurrentUser": true
},
"avatars": [
{
"clientId": "67f1234567890abcdef1234",
"image": "https://cdn.example.com/clients/a1.jpg",
"name": "Kaylynn Lubin"
}
],
"totalCount": 50,
"othersCount": 47
},
"trainingPlanAssignedSection": [
{
"_id": "67f1234567890abcdef1234",
"name": "12-Week Strength Program",
"description": "Progressive overload strength block.",
"images": [
{
"url": "https://cdn.example.com/workouts/plan-cover.jpg"
}
],
"thumbnail": "https://cdn.example.com/workouts/plan-cover.jpg",
"difficulty": "Intermediate",
"intensity": "High",
"category": "Strength",
"status": "Active",
"duration": {
"startDate": "2026-04-15",
"endDate": "2026-06-15",
"hasEndDate": true
},
"schedule": {
"mode": "multi_week",
"releasePolicy": "weekly_from_start",
"startDate": "2026-09-08",
"timeZone": "Europe/Amsterdam",
"totalWeeks": 4,
"layout": "calendar_week",
"weeks": [
{
"weekNumber": 1,
"days": [
{
"weekday": 1,
"isRestDay": false,
"items": [
{
"_id": "67f1234567890abcdef1234",
"order": 1,
"startTime": "08:30",
"plannedDurationMinutes": 45,
"status": "today",
"plannedDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"source": "programme",
"clientAdjustment": {
"action": "moved",
"occurrenceDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"changedAt": null
},
"canClientRestore": true,
"type": "workout",
"planMomentId": "67f1234567890abcdef1234"
}
]
}
]
}
]
},
"scheduleMode": "multi_week",
"planWeeks": [
{
"weekNumber": 1,
"startDate": "2026-09-14",
"endDate": "2026-09-20",
"isCurrentWeek": true
},
{
"weekNumber": 2,
"startDate": "2026-09-21",
"endDate": "2026-09-27",
"isCurrentWeek": false
}
],
"progress": {
"total": 4,
"completed": 2,
"progressPercentage": 50,
"isCompleted": false
},
"createdAt": "2026-04-12T10:00:00.000Z",
"updatedAt": "2026-04-12T10:00:00.000Z"
}
],
"programmeCalendarData": {
"date": "2026-09-22",
"month": "2026-09",
"dayLabel": "Tue",
"dayName": "Tuesday",
"dayOfMonth": 22,
"isToday": true,
"programmeMonthCalendar": {
"month": "2026-09",
"monthLabel": "September 2026",
"monthStart": "2026-09-01",
"monthEnd": "2026-09-30",
"gridStart": "2026-08-31",
"gridEnd": "2026-10-04",
"planIds": [
"67f1234567890abcdef1234"
],
"dates": [
{
"date": "2026-09-22",
"dayOfMonth": 22,
"weekday": 2,
"isCurrentMonth": true,
"isToday": true,
"isRestDay": false,
"itemCount": 3,
"statuses": [
"completed",
"in_process",
"not_started"
]
}
]
},
"programmes": [
{}
]
},
"freestyleWorkout": {
"state": "continue",
"sessionId": "67f1234567890abcdef1234",
"planId": null,
"planMomentId": null,
"status": "in_progress",
"startedAt": "2026-06-01T09:00:00.000Z"
},
"muscleActivation": {
"range": {
"startDate": "2026-05-18T00:00:00.000Z",
"endDate": "2026-05-24T23:59:59.999Z",
"days": 7
},
"total": {
"raw": {
"quadriceps": 120,
"chest": 80,
"hamstrings": 60
},
"normalized": {
"quadriceps": 1,
"chest": 0.67,
"hamstrings": 0.5
},
"maxValue": 120,
"topMuscles": [
{
"muscle": "quadriceps",
"value": 120
}
]
}
},
"workoutPlanLibrary": [
{
"_id": "67f1234567890abcdef1234",
"name": "4-Day Strength Block",
"description": "Progressive upper/lower split.",
"thumbnail": "https://cdn.example.com/workouts/plan-cover.jpg",
"difficulty": "Intermediate",
"intensity": "High",
"category": "Strength",
"scheduleMode": "recurring",
"categoryName": "Strength Programs"
}
],
"videoLibrary": [
{
"_id": "67f1234567890abcdef1234",
"title": "Full-Body HIIT Workout",
"description": "45-minute high intensity session.",
"url": "https://cdn.example.com/videos/hiit-thumb.jpg",
"platform": "s3",
"type": "video",
"duration": 2700,
"language": "en",
"level": "Intermediate",
"category": "Cardio",
"categoryName": "HIIT Collection",
"isFavorite": false,
"progress": {
"watchedDuration": 245,
"progressPercentage": 62.5,
"isCompleted": false
}
}
],
"performanceSummary": {
"sessionsTotal": 81,
"sessionsCompleted": 56,
"averageRating": 7.8,
"maxWeight": 109,
"averageVolumePerSession": 3895.1,
"distinctExercises": 59,
"totalReps": 1128,
"totalTimeSeconds": 331200,
"totalVolume": 218130.5,
"totalActiveWorkout": 3
},
"dailyTrainingNotes": "Felt strong today, increased squat weight.",
"notesExists": true
},
"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": 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 client training section data
Returns all sections needed to render the client training home page in a single request. Sections are fetched in parallel. Most sections are independently guarded by client.trainingSectionsAccess — a disabled section returns its empty/null default without failing the entire response. When both muscle activation and performance summary are disabled, their shared history scope is not queried. Muscle activation reads only exercise identity and repetition inputs, preserving the existing date fallback rules. Two sections have their OWN gating, independent of trainingSectionsAccess: workoutOfTheDay (WOD feature system) and weeklyRanking (leaderboard config) — each self-reports enabled/hidden and either can be off while the other is on. When the entire page is disabled (pageEnabled: false) all sections are empty/null and the request returns immediately without hitting any data sources. programmeCalendarData is the full day view for the selected date (day header, month dot grid, and that date’s programme cards) — the SAME object GET /app/v1/workout/client/programme-day returns — selected with ?date=; it is gated by the trainingPlanAssignedSection flag, being that list’s calendar view. A section that FAILS also degrades to its empty/null default rather than failing the request, so an empty section is indistinguishable from a broken one in the payload — the server logs which section failed.
Requires the workout_client_plans:read scope. This operation maps to /app/v1/workout/client/training-section 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}/training-section" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/training-section', 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}/training-section"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"accessControl": {
"pageEnabled": true,
"sections": {
"trainingPlanAssignedSection": true,
"muscleActivation": true,
"workoutPlanLibrary": true,
"videoLibrary": true,
"freestyleWorkout": true,
"performanceSummary": true,
"dailyTrainingNotes": true
}
},
"workoutOfTheDay": {
"enabled": true,
"hidden": false,
"state": "resume",
"wod": {
"id": "67f1234567890abcdef1234",
"title": "Fat Burn Program",
"description": "",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234",
"planName": "Fat Burn Program",
"thumbnail": "https://cdn.example.com/wod.jpg",
"scheduledDate": "2026-07-13T00:00:00.000Z",
"scoringType": "amrap",
"sourceType": "template",
"participantCount": 12,
"completionCount": 5,
"sessionId": "6670aa11bb22cc33dd44ee55",
"sessionStatus": "in_progress",
"summary": {
"totalSets": 12,
"completedSets": 4,
"elapsedMinutes": 18,
"expectedDurationMinutes": 110,
"volumeKg": 27,
"reps": 48
},
"startedBy": {
"avatars": [
{
"clientId": "67f1234567890abcdef1234",
"image": "https://cdn.example.com/clients/a1.jpg",
"name": "Kaylynn Lubin"
}
],
"totalCount": 14,
"othersCount": 12
},
"myWorkoutRank": {
"scoreType": "totalReps",
"rank": 4,
"value": 124,
"displayScore": 124,
"totalParticipants": 14
}
}
},
"weeklyRanking": {
"enabled": true,
"hidden": false,
"resetLabel": "Reset in 4 days - Sunday Midnight",
"weekStart": "2026-07-12T00:00:00.000Z",
"weekEnd": "2026-07-19T00:00:00.000Z",
"data": [
{
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"anonymousAvatar": false,
"isCurrentUser": true
}
],
"currentUser": {
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"nextRank": 3,
"nextRankValue": 4500,
"xpToNextRank": 605,
"progressToNextRank": 0.8656,
"participating": true,
"inTop5": true,
"isCurrentUser": true
},
"avatars": [
{
"clientId": "67f1234567890abcdef1234",
"image": "https://cdn.example.com/clients/a1.jpg",
"name": "Kaylynn Lubin"
}
],
"totalCount": 50,
"othersCount": 47
},
"trainingPlanAssignedSection": [
{
"_id": "67f1234567890abcdef1234",
"name": "12-Week Strength Program",
"description": "Progressive overload strength block.",
"images": [
{
"url": "https://cdn.example.com/workouts/plan-cover.jpg"
}
],
"thumbnail": "https://cdn.example.com/workouts/plan-cover.jpg",
"difficulty": "Intermediate",
"intensity": "High",
"category": "Strength",
"status": "Active",
"duration": {
"startDate": "2026-04-15",
"endDate": "2026-06-15",
"hasEndDate": true
},
"schedule": {
"mode": "multi_week",
"releasePolicy": "weekly_from_start",
"startDate": "2026-09-08",
"timeZone": "Europe/Amsterdam",
"totalWeeks": 4,
"layout": "calendar_week",
"weeks": [
{
"weekNumber": 1,
"days": [
{
"weekday": 1,
"isRestDay": false,
"items": [
{
"_id": "67f1234567890abcdef1234",
"order": 1,
"startTime": "08:30",
"plannedDurationMinutes": 45,
"status": "today",
"plannedDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"source": "programme",
"clientAdjustment": {
"action": "moved",
"occurrenceDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"changedAt": null
},
"canClientRestore": true,
"type": "workout",
"planMomentId": "67f1234567890abcdef1234"
}
]
}
]
}
]
},
"scheduleMode": "multi_week",
"planWeeks": [
{
"weekNumber": 1,
"startDate": "2026-09-14",
"endDate": "2026-09-20",
"isCurrentWeek": true
},
{
"weekNumber": 2,
"startDate": "2026-09-21",
"endDate": "2026-09-27",
"isCurrentWeek": false
}
],
"progress": {
"total": 4,
"completed": 2,
"progressPercentage": 50,
"isCompleted": false
},
"createdAt": "2026-04-12T10:00:00.000Z",
"updatedAt": "2026-04-12T10:00:00.000Z"
}
],
"programmeCalendarData": {
"date": "2026-09-22",
"month": "2026-09",
"dayLabel": "Tue",
"dayName": "Tuesday",
"dayOfMonth": 22,
"isToday": true,
"programmeMonthCalendar": {
"month": "2026-09",
"monthLabel": "September 2026",
"monthStart": "2026-09-01",
"monthEnd": "2026-09-30",
"gridStart": "2026-08-31",
"gridEnd": "2026-10-04",
"planIds": [
"67f1234567890abcdef1234"
],
"dates": [
{
"date": "2026-09-22",
"dayOfMonth": 22,
"weekday": 2,
"isCurrentMonth": true,
"isToday": true,
"isRestDay": false,
"itemCount": 3,
"statuses": [
"completed",
"in_process",
"not_started"
]
}
]
},
"programmes": [
{}
]
},
"freestyleWorkout": {
"state": "continue",
"sessionId": "67f1234567890abcdef1234",
"planId": null,
"planMomentId": null,
"status": "in_progress",
"startedAt": "2026-06-01T09:00:00.000Z"
},
"muscleActivation": {
"range": {
"startDate": "2026-05-18T00:00:00.000Z",
"endDate": "2026-05-24T23:59:59.999Z",
"days": 7
},
"total": {
"raw": {
"quadriceps": 120,
"chest": 80,
"hamstrings": 60
},
"normalized": {
"quadriceps": 1,
"chest": 0.67,
"hamstrings": 0.5
},
"maxValue": 120,
"topMuscles": [
{
"muscle": "quadriceps",
"value": 120
}
]
}
},
"workoutPlanLibrary": [
{
"_id": "67f1234567890abcdef1234",
"name": "4-Day Strength Block",
"description": "Progressive upper/lower split.",
"thumbnail": "https://cdn.example.com/workouts/plan-cover.jpg",
"difficulty": "Intermediate",
"intensity": "High",
"category": "Strength",
"scheduleMode": "recurring",
"categoryName": "Strength Programs"
}
],
"videoLibrary": [
{
"_id": "67f1234567890abcdef1234",
"title": "Full-Body HIIT Workout",
"description": "45-minute high intensity session.",
"url": "https://cdn.example.com/videos/hiit-thumb.jpg",
"platform": "s3",
"type": "video",
"duration": 2700,
"language": "en",
"level": "Intermediate",
"category": "Cardio",
"categoryName": "HIIT Collection",
"isFavorite": false,
"progress": {
"watchedDuration": 245,
"progressPercentage": 62.5,
"isCompleted": false
}
}
],
"performanceSummary": {
"sessionsTotal": 81,
"sessionsCompleted": 56,
"averageRating": 7.8,
"maxWeight": 109,
"averageVolumePerSession": 3895.1,
"distinctExercises": 59,
"totalReps": 1128,
"totalTimeSeconds": 331200,
"totalVolume": 218130.5,
"totalActiveWorkout": 3
},
"dailyTrainingNotes": "Felt strong today, increased squat weight.",
"notesExists": true
},
"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": 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
Client in the company bound to the Public API token.
^[a-fA-F0-9]{24}$Query Parameters
Only required when the caller is a coach/admin. Client users are resolved from the auth token automatically.
"67f1234567890abcdef1234"
Which day programmeCalendarData resolves to, as YYYY-MM-DD (same contract as GET /app/v1/workout/client/programme-day). Omit for today in the company's timezone. Anything else → 400 INVALID_DATE_FORMAT.
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$"2026-09-22"