curl -X GET "https://api.fitsociety.io/public/v1/workout/groups/events/{eventId}/start-preview" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/groups/events/{eventId}/start-preview', 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/groups/events/{eventId}/start-preview"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"eventId": "67f1234567890abcdef1234",
"calendarOccurrenceStartDate": "2026-04-12T10:00:00.000Z",
"companyStartDefaults": {
"fallbackSource": "freestyle",
"fallbackTemplateId": "67f1234567890abcdef1234",
"fallbackPlanMomentId": "67f1234567890abcdef1234",
"fallbackOptions": [
{
"source": "freestyle",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234"
}
],
"requireReviewForFallback": true
},
"clients": [
{
"clientId": "67f1234567890abcdef1234",
"status": "ready",
"messageKey": "WORKOUT_READY",
"workoutSource": "auto_assigned_plan",
"sourceLabel": "Strength plan - Day 2",
"sourceKey": "plan:...:...",
"reason": "membership_assignment",
"defaultedBy": "client_assignment",
"requiresCoachSelection": false,
"requiresReview": false,
"fallbackOptions": [
{
"source": "freestyle",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234"
}
],
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234",
"templateId": "67f1234567890abcdef1234",
"assignmentId": "67f1234567890abcdef1234",
"assignmentStrategy": "next_in_sequence",
"sessionsPerWeek": 2,
"exerciseCount": 8,
"lastCompletedSession": {
"sessionId": "67f1234567890abcdef1234",
"startedAt": "2026-04-12T10:00:00.000Z",
"endedAt": "2026-04-12T10:00:00.000Z",
"workoutSource": "auto_assigned_plan",
"sourceKey": "string",
"sourceLabel": "Strength plan - Day 1",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234"
}
}
],
"counts": {
"total": 6,
"ready": 5,
"warning": 1,
"blocked": 0,
"bySource": {
"auto_assigned_plan": 5,
"freestyle": 1
}
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 403,
"key": "scopes.insufficient",
"message": "The access token does not include the required scope.",
"details": {
"requiredScopes": [
"required:scope"
]
}
},
"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
}
}
}Preview resolved workouts before starting a group workout
Returns the workout that each selected calendar-event participant would start, using the same assignment and company fallback rules as the start endpoint. This endpoint is read-only and scopes recurring events by instanceStart.
Requires the workout_groups:read scope. This operation maps to /app/v1/coach/workout/group/events/:eventId/start-preview and retains its Workout V2 permission, feature-flag, and resource-scope checks.
The clientId path parameter is resolved inside the company bound to the Public API token when present.
curl -X GET "https://api.fitsociety.io/public/v1/workout/groups/events/{eventId}/start-preview" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/groups/events/{eventId}/start-preview', 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/groups/events/{eventId}/start-preview"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"eventId": "67f1234567890abcdef1234",
"calendarOccurrenceStartDate": "2026-04-12T10:00:00.000Z",
"companyStartDefaults": {
"fallbackSource": "freestyle",
"fallbackTemplateId": "67f1234567890abcdef1234",
"fallbackPlanMomentId": "67f1234567890abcdef1234",
"fallbackOptions": [
{
"source": "freestyle",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234"
}
],
"requireReviewForFallback": true
},
"clients": [
{
"clientId": "67f1234567890abcdef1234",
"status": "ready",
"messageKey": "WORKOUT_READY",
"workoutSource": "auto_assigned_plan",
"sourceLabel": "Strength plan - Day 2",
"sourceKey": "plan:...:...",
"reason": "membership_assignment",
"defaultedBy": "client_assignment",
"requiresCoachSelection": false,
"requiresReview": false,
"fallbackOptions": [
{
"source": "freestyle",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234"
}
],
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234",
"templateId": "67f1234567890abcdef1234",
"assignmentId": "67f1234567890abcdef1234",
"assignmentStrategy": "next_in_sequence",
"sessionsPerWeek": 2,
"exerciseCount": 8,
"lastCompletedSession": {
"sessionId": "67f1234567890abcdef1234",
"startedAt": "2026-04-12T10:00:00.000Z",
"endedAt": "2026-04-12T10:00:00.000Z",
"workoutSource": "auto_assigned_plan",
"sourceKey": "string",
"sourceLabel": "Strength plan - Day 1",
"planId": "67f1234567890abcdef1234",
"planMomentId": "67f1234567890abcdef1234"
}
}
],
"counts": {
"total": 6,
"ready": 5,
"warning": 1,
"blocked": 0,
"bySource": {
"auto_assigned_plan": 5,
"freestyle": 1
}
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 403,
"key": "scopes.insufficient",
"message": "The access token does not include the required scope.",
"details": {
"requiredScopes": [
"required:scope"
]
}
},
"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
Calendar event id.
"67f1234567890abcdef1234"
Query Parameters
Optional comma-separated subset of booked client ids to preview.
Optional occurrence start date for recurring calendar events. When no explicit clientIds are provided, default booked clients are scoped to this occurrence.
"2026-04-12T10:00:00.000Z"