curl -X GET "https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}', 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/performance/sessions/{sessionId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"data": {
"session": {
"id": "67f1234567890abcdef1234",
"planId": null,
"programmeScheduleItemId": null,
"plannedDate": "2026-09-08",
"locationId": null,
"planMomentId": null,
"status": "in_progress",
"startedAt": "2026-04-12T10:00:00.000Z",
"endedAt": null,
"rating": 8,
"difficulty": "Moderate",
"emojiRating": "Energized",
"notes": "Session felt good overall.",
"showSetRpe": true,
"activeExerciseId": null,
"activePerformanceId": null,
"activeExerciseUpdatedAt": null,
"provenance": {
"origin": "coach",
"startedByActorType": "coach",
"startedByClientId": null,
"startedByCoachId": null,
"executedByCoachId": null,
"completedByActorType": "",
"completedByClientId": null,
"completedByCoachId": null,
"endedByActorType": "",
"endedByClientId": null,
"endedByCoachId": null,
"lastUpdatedByActorType": "coach",
"lastUpdatedByClientId": null,
"lastUpdatedByCoachId": null
},
"planMoment": {
"id": "67f1234567890abcdef1234",
"name": "Day 1",
"description": "Upper body push.",
"date": "2026-04-15",
"order": 0,
"scoring": {
"scoringType": "forTime",
"descriptionOnly": true,
"acceptsManualResult": true,
"targetValue": null,
"timeDomain": {
"windowSeconds": null,
"timeCapSeconds": 900,
"rounds": 3,
"intervalSeconds": null,
"intervalCount": null,
"workSeconds": null,
"restSeconds": null
},
"scoreValidation": {
"timeCapSeconds": 900,
"maxReps": null,
"expectedIntervals": null
},
"result": {
"roundsCompleted": 5,
"repsPerRound": 30,
"extraReps": 12,
"totalReps": 162,
"intervalReps": [
12,
11,
10
],
"elapsedSeconds": 742,
"finishedBeforeCap": true,
"timeCapSeconds": 900,
"maxLoadKg": 120
}
}
}
},
"medicalInfo": {
"anyInjuries": {
"showCheck": true,
"value": "Knee replacement L (2023)"
},
"anyMedications": {
"showCheck": true,
"value": "Metformin 500mg"
},
"anyAllergies": {
"showCheck": false,
"value": ""
},
"anyHeartProblem": true,
"anyBloodPressureIssue": true,
"approvedPhysicalActivities": true
},
"performances": [
{
"id": "67f1234567890abcdef1234",
"sessionId": "67f1234567890abcdef1234",
"planId": null,
"planMomentId": null,
"exerciseId": "67f1234567890abcdef1234",
"planExerciseId": null,
"source": "plan",
"name": "Barbell Bench Press",
"template": {
"exerciseId": "67f1234567890abcdef1234",
"planExerciseId": null,
"sets": 3,
"minReps": 8,
"maxReps": 10,
"metric": "45 sec",
"rest": 75,
"rpe": 7,
"notes": "Keep shoulder blades pinned.",
"description": "Flat horizontal press with controlled tempo.",
"order": 0
},
"libraryExercise": {
"primaryMuscle": "Chest",
"description": "Flat horizontal press with controlled tempo.",
"secondaryMuscles": [
"Shoulders",
"Triceps"
],
"primaryJoint": "Shoulder",
"difficulty": "Intermediate",
"intensity": "Above Average",
"equipment": [
"Barbell",
"Bench"
],
"images": [
{
"url": "https://cdn.example.com/workouts/plan-cover.jpg",
"width": 1280,
"height": 720
}
],
"videos": [
{
"url": "https://cdn.example.com/workouts/demo.mp4",
"platform": "s3",
"videoId": "",
"thumbnail": "https://cdn.example.com/workouts/demo-thumb.jpg",
"duration": 84,
"width": 1920,
"height": 1080
}
],
"defaultType": "reps"
},
"order": 0,
"isActive": true,
"isCompleted": false,
"date": "2026-04-12T10:00:00.000Z",
"startedAt": null,
"endedAt": null,
"groupId": "super-a",
"totals": {
"totalReps": 24,
"totalTimeSeconds": 0,
"totalDistanceMeters": 0,
"totalVolume": 1680,
"maxWeight": 75,
"estimated1RM": 95,
"averageRPE": 8.2
},
"sets": [
{
"setNumber": 1,
"setType": "N",
"displayNumber": 1,
"displayLabel": "1",
"previous": "12 × 22kg",
"reps": 8,
"weight": 50,
"timeSeconds": null,
"distanceMeters": null,
"rpe": 8,
"rest": 60,
"restSeconds": 60,
"completed": true,
"targetReps": "8",
"targetWeight": 50,
"targetTimeSeconds": null,
"targetDistanceMeters": null,
"targetRestSeconds": 60,
"repsPlaceholderCoach": 12,
"weightPlaceholderCoach": 40,
"timeSecondsPlaceholderCoach": null,
"distanceMetersPlaceholderCoach": null,
"rpePlaceholderCoach": 7,
"restSecondsPlaceholderCoach": 90,
"repsPlaceholder": 12,
"weightPlaceholder": 40,
"timeSecondsPlaceholder": null,
"distanceMetersPlaceholder": null,
"rpePlaceholder": 7,
"restSecondsPlaceholder": 90,
"repsActual": 30,
"weightActual": 42,
"timeSecondsActual": null,
"distanceMetersActual": null,
"rpeActual": 8,
"restSecondsActual": 90
}
],
"notes": "Last set close to failure.",
"nextSessionTarget": {
"reps": "5-8",
"weight": 80,
"weightUnit": "kg",
"timeSeconds": null,
"distanceMeters": null,
"restSeconds": 120,
"rpe": 8,
"notes": "Control the descent.",
"sets": [
{}
]
},
"targetSnapshot": {
"exerciseType": "reps",
"todayTarget": {
"reps": "5-8",
"weight": 80,
"weightUnit": "kg",
"timeSeconds": null,
"distanceMeters": null,
"restSeconds": 120,
"rpe": 8,
"notes": "Control the descent.",
"sets": [
{}
]
},
"lastSessionTarget": {
"reps": "5-8",
"weight": 80,
"weightUnit": "kg",
"timeSeconds": null,
"distanceMeters": null,
"restSeconds": 120,
"rpe": 8,
"notes": "Control the descent.",
"sets": [
{}
]
},
"personalRecord": {
"metric": "weight",
"value": 82.5,
"unit": "kg",
"reps": 6,
"performedAt": null,
"sessionId": null,
"performanceId": null
},
"todaySetupValues": {},
"lastSetupValues": {},
"sourceSessionId": null,
"sourcePerformanceId": null
},
"setupFields": [
{
"key": "seat",
"label": "Seat",
"type": "text",
"unit": "",
"options": [
"1",
"2",
"3",
"4"
],
"order": 1,
"required": false,
"enabled": true,
"defaultValue": 3
}
],
"setupValues": {
"seat": "4",
"backrest": "2"
},
"nextSetupValues": {
"seat": "5"
},
"showSetRpe": true,
"setupSettingsEnabled": true,
"hasMachineSettings": true,
"isMachineSetting": true,
"provenance": {
"recordedByActorType": "coach",
"recordedByClientId": null,
"recordedByCoachId": null,
"lastUpdatedByActorType": "coach",
"lastUpdatedByClientId": null,
"lastUpdatedByCoachId": null
},
"type": "reps",
"metrics": {
"totalVolume": 1680,
"maxWeight": 75,
"totalReps": 24
},
"isPersonalBest": true
}
],
"summary": {
"totalVolume": 1680,
"totalReps": 24,
"totalPersonalBests": 1,
"muscleActivation": {
"raw": {
"chest": 18,
"shoulders": 12,
"triceps": 8
},
"normalized": {
"chest": 18,
"shoulders": 12,
"triceps": 8
},
"maxValue": 18,
"topMuscles": [
{
"muscle": "chest",
"value": 18
}
]
}
}
}
},
"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 session detail
Recent performance history uses date, start time, creation time and performance ID descending, so equal timestamps remain deterministic before the history limit is applied. Booked participants are authorized within their lesson and session regardless of home location; the coach must have access to the lesson location. Unbooked additions and manual workouts retain normal member access. Full session detail bundle (performances + aggregate summary). For plan exercises with perSetTrackingEnabled, the coach’s prescribed per-set rows are prefilled only until the client logs; once logged, sets reflects exactly the client’s saved rows and client-deleted sets are never re-padded back to the prescribed count on refresh. Historical maximum weight and personal-record metrics share one aggregate read; slow-request diagnostics record the main session-loading phases.
Requires the workout_sessions:read scope and the corresponding Workout features and permissions.
curl -X GET "https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}', 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/performance/sessions/{sessionId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"data": {
"session": {
"id": "67f1234567890abcdef1234",
"planId": null,
"programmeScheduleItemId": null,
"plannedDate": "2026-09-08",
"locationId": null,
"planMomentId": null,
"status": "in_progress",
"startedAt": "2026-04-12T10:00:00.000Z",
"endedAt": null,
"rating": 8,
"difficulty": "Moderate",
"emojiRating": "Energized",
"notes": "Session felt good overall.",
"showSetRpe": true,
"activeExerciseId": null,
"activePerformanceId": null,
"activeExerciseUpdatedAt": null,
"provenance": {
"origin": "coach",
"startedByActorType": "coach",
"startedByClientId": null,
"startedByCoachId": null,
"executedByCoachId": null,
"completedByActorType": "",
"completedByClientId": null,
"completedByCoachId": null,
"endedByActorType": "",
"endedByClientId": null,
"endedByCoachId": null,
"lastUpdatedByActorType": "coach",
"lastUpdatedByClientId": null,
"lastUpdatedByCoachId": null
},
"planMoment": {
"id": "67f1234567890abcdef1234",
"name": "Day 1",
"description": "Upper body push.",
"date": "2026-04-15",
"order": 0,
"scoring": {
"scoringType": "forTime",
"descriptionOnly": true,
"acceptsManualResult": true,
"targetValue": null,
"timeDomain": {
"windowSeconds": null,
"timeCapSeconds": 900,
"rounds": 3,
"intervalSeconds": null,
"intervalCount": null,
"workSeconds": null,
"restSeconds": null
},
"scoreValidation": {
"timeCapSeconds": 900,
"maxReps": null,
"expectedIntervals": null
},
"result": {
"roundsCompleted": 5,
"repsPerRound": 30,
"extraReps": 12,
"totalReps": 162,
"intervalReps": [
12,
11,
10
],
"elapsedSeconds": 742,
"finishedBeforeCap": true,
"timeCapSeconds": 900,
"maxLoadKg": 120
}
}
}
},
"medicalInfo": {
"anyInjuries": {
"showCheck": true,
"value": "Knee replacement L (2023)"
},
"anyMedications": {
"showCheck": true,
"value": "Metformin 500mg"
},
"anyAllergies": {
"showCheck": false,
"value": ""
},
"anyHeartProblem": true,
"anyBloodPressureIssue": true,
"approvedPhysicalActivities": true
},
"performances": [
{
"id": "67f1234567890abcdef1234",
"sessionId": "67f1234567890abcdef1234",
"planId": null,
"planMomentId": null,
"exerciseId": "67f1234567890abcdef1234",
"planExerciseId": null,
"source": "plan",
"name": "Barbell Bench Press",
"template": {
"exerciseId": "67f1234567890abcdef1234",
"planExerciseId": null,
"sets": 3,
"minReps": 8,
"maxReps": 10,
"metric": "45 sec",
"rest": 75,
"rpe": 7,
"notes": "Keep shoulder blades pinned.",
"description": "Flat horizontal press with controlled tempo.",
"order": 0
},
"libraryExercise": {
"primaryMuscle": "Chest",
"description": "Flat horizontal press with controlled tempo.",
"secondaryMuscles": [
"Shoulders",
"Triceps"
],
"primaryJoint": "Shoulder",
"difficulty": "Intermediate",
"intensity": "Above Average",
"equipment": [
"Barbell",
"Bench"
],
"images": [
{
"url": "https://cdn.example.com/workouts/plan-cover.jpg",
"width": 1280,
"height": 720
}
],
"videos": [
{
"url": "https://cdn.example.com/workouts/demo.mp4",
"platform": "s3",
"videoId": "",
"thumbnail": "https://cdn.example.com/workouts/demo-thumb.jpg",
"duration": 84,
"width": 1920,
"height": 1080
}
],
"defaultType": "reps"
},
"order": 0,
"isActive": true,
"isCompleted": false,
"date": "2026-04-12T10:00:00.000Z",
"startedAt": null,
"endedAt": null,
"groupId": "super-a",
"totals": {
"totalReps": 24,
"totalTimeSeconds": 0,
"totalDistanceMeters": 0,
"totalVolume": 1680,
"maxWeight": 75,
"estimated1RM": 95,
"averageRPE": 8.2
},
"sets": [
{
"setNumber": 1,
"setType": "N",
"displayNumber": 1,
"displayLabel": "1",
"previous": "12 × 22kg",
"reps": 8,
"weight": 50,
"timeSeconds": null,
"distanceMeters": null,
"rpe": 8,
"rest": 60,
"restSeconds": 60,
"completed": true,
"targetReps": "8",
"targetWeight": 50,
"targetTimeSeconds": null,
"targetDistanceMeters": null,
"targetRestSeconds": 60,
"repsPlaceholderCoach": 12,
"weightPlaceholderCoach": 40,
"timeSecondsPlaceholderCoach": null,
"distanceMetersPlaceholderCoach": null,
"rpePlaceholderCoach": 7,
"restSecondsPlaceholderCoach": 90,
"repsPlaceholder": 12,
"weightPlaceholder": 40,
"timeSecondsPlaceholder": null,
"distanceMetersPlaceholder": null,
"rpePlaceholder": 7,
"restSecondsPlaceholder": 90,
"repsActual": 30,
"weightActual": 42,
"timeSecondsActual": null,
"distanceMetersActual": null,
"rpeActual": 8,
"restSecondsActual": 90
}
],
"notes": "Last set close to failure.",
"nextSessionTarget": {
"reps": "5-8",
"weight": 80,
"weightUnit": "kg",
"timeSeconds": null,
"distanceMeters": null,
"restSeconds": 120,
"rpe": 8,
"notes": "Control the descent.",
"sets": [
{}
]
},
"targetSnapshot": {
"exerciseType": "reps",
"todayTarget": {
"reps": "5-8",
"weight": 80,
"weightUnit": "kg",
"timeSeconds": null,
"distanceMeters": null,
"restSeconds": 120,
"rpe": 8,
"notes": "Control the descent.",
"sets": [
{}
]
},
"lastSessionTarget": {
"reps": "5-8",
"weight": 80,
"weightUnit": "kg",
"timeSeconds": null,
"distanceMeters": null,
"restSeconds": 120,
"rpe": 8,
"notes": "Control the descent.",
"sets": [
{}
]
},
"personalRecord": {
"metric": "weight",
"value": 82.5,
"unit": "kg",
"reps": 6,
"performedAt": null,
"sessionId": null,
"performanceId": null
},
"todaySetupValues": {},
"lastSetupValues": {},
"sourceSessionId": null,
"sourcePerformanceId": null
},
"setupFields": [
{
"key": "seat",
"label": "Seat",
"type": "text",
"unit": "",
"options": [
"1",
"2",
"3",
"4"
],
"order": 1,
"required": false,
"enabled": true,
"defaultValue": 3
}
],
"setupValues": {
"seat": "4",
"backrest": "2"
},
"nextSetupValues": {
"seat": "5"
},
"showSetRpe": true,
"setupSettingsEnabled": true,
"hasMachineSettings": true,
"isMachineSetting": true,
"provenance": {
"recordedByActorType": "coach",
"recordedByClientId": null,
"recordedByCoachId": null,
"lastUpdatedByActorType": "coach",
"lastUpdatedByClientId": null,
"lastUpdatedByCoachId": null
},
"type": "reps",
"metrics": {
"totalVolume": 1680,
"maxWeight": 75,
"totalReps": 24
},
"isPersonalBest": true
}
],
"summary": {
"totalVolume": 1680,
"totalReps": 24,
"totalPersonalBests": 1,
"muscleActivation": {
"raw": {
"chest": 18,
"shoulders": 12,
"triceps": 8
},
"normalized": {
"chest": 18,
"shoulders": 12,
"triceps": 8
},
"maxValue": 18,
"topMuscles": [
{
"muscle": "chest",
"value": 18
}
]
}
}
}
},
"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 session id.
"67f1234567890abcdef1234"