curl -X PATCH "https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}/status" \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: <stable_request_key>" \
-H "Content-Type: application/json" \
-d '{}'const options = {
method: 'PATCH',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({status: 'paused'})
};
fetch('https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}/status', 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}/status"
payload = { "status": "paused" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"data": {
"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
}
}
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
},
"idempotency": {
"replayed": false
}
}
}Update a workout session status
Only an active, nondeleted session owned by the caller can be paused or resumed. Completed, stopped, and cancelled sessions cannot be reopened through this endpoint. A pending restart confirmation blocks resume, including when it appears during the request; pause remains allowed. Concurrent terminal or ownership changes reject the update without changing session state.
Requires the workout_sessions:write scope and the corresponding Workout features and permissions.
curl -X PATCH "https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}/status" \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: <stable_request_key>" \
-H "Content-Type: application/json" \
-d '{}'const options = {
method: 'PATCH',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({status: 'paused'})
};
fetch('https://api.fitsociety.io/public/v1/workout/performance/sessions/{sessionId}/status', 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}/status"
payload = { "status": "paused" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"data": {
"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
}
}
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
},
"idempotency": {
"replayed": false
}
}
}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.
Headers
Required for Public API write requests. Reusing the same key with the same method, path, and body replays the stored successful response; reusing it with a different request returns 409 idempotency.conflict.
1 - 200"booking-create-20260714-001"
Path Parameters
Workout session id.
"67f1234567890abcdef1234"
Body
paused, in_progress "paused"