curl -X PUT "https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}/note" \
-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({
notes: 'Maintain a slow, 3-second descent. Sit back into your hips and drive through your heels.'
})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}/note', 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}/note"
payload = { "notes": "Maintain a slow, 3-second descent. Sit back into your hips and drive through your heels." }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)Upsert the coach note for an exercise across a plan
Upserts the coach note on every active occurrence of the same catalog exercise in the assigned plan, so the note remains available when the client advances to another plan moment. Send "" to clear it across those occurrences. note is accepted as an alias for notes. The caller must own the plan.
Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/moments/exercises/:planId/:planMomentId/:exerciseId/note 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}/note" \
-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({
notes: 'Maintain a slow, 3-second descent. Sit back into your hips and drive through your heels.'
})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/moments/exercises/{planId}/{planMomentId}/{exerciseId}/note', 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}/note"
payload = { "notes": "Maintain a slow, 3-second descent. Sit back into your hips and drive through your heels." }
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 (day) id.
"67f1234567890abcdef1234"
Embedded workout-exercise subdocument id.
"67f1234567890abcdef1234"
Body
Coach note text. Send "" to clear. Alias: note.
"(SUBSTITUTED: \"Barbell Back Squat (Tempo 3-1-1)\" to \"Barbell Squat\") Maintain a slow, 3-second descent to improve control."