curl -X PUT "https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}" \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: <stable_request_key>" \
-H "Content-Type: application/json" \
-d '{}'const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({exerciseId: '67f1234567890abcdef1234', type: 'reps', sets: 4})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}', 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/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}"
payload = {
"exerciseId": "67f1234567890abcdef1234",
"type": "reps",
"sets": 4
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)Update a workout exercise inside a workout v2 plan moment
Updates the future prescription even after the day has been completed. Existing recorded sets, tracking type, targets and exercise identity remain intact. Only untouched active-session placeholders may adopt the new prescription. Logging a performance does not overwrite plan targets.
Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/moments/exercises/:planId/:planMomentId/:exerciseId 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 PUT "https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}" \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: <stable_request_key>" \
-H "Content-Type: application/json" \
-d '{}'const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({exerciseId: '67f1234567890abcdef1234', type: 'reps', sets: 4})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}', 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/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}"
payload = {
"exerciseId": "67f1234567890abcdef1234",
"type": "reps",
"sets": 4
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)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 plan id.
"67f1234567890abcdef1234"
Embedded workout plan-moment id.
"67f1234567890abcdef1234"
Embedded workout-exercise id.
"67f1234567890abcdef1234"
Body
"67f1234567890abcdef1234"
reps, time, distance "reps"
4
6
8
"Pause 1 second on the chest."
"kg"
120
Low, Medium, High "High"
Beginner, Intermediate, Advanced "Intermediate"
"super-a"
8
75
"3010"
true
Master RPE switch for this plan exercise. False hides current targets and inputs without clearing prescriptions or recorded history. Missing legacy values retain RPE when an exercise target or per-set preference exists. Independent from showSetRpe.
false
Stored per-set RPE preference. Live input is visible only when RPE is enabled; authoring retains this preference while rpeEnabled is false.
true
Show child attributes
Show child attributes
Enables the exercise-level machine or equipment setup settings block.
true
8Show child attributes
Show child attributes
0
Response
Embedded workout exercise updated. Runtime still returns the standard response envelope without a data property.