curl -X PUT "https://api.fitsociety.io/public/v1/workout/plans/{id}" \
-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({
name: [
{lang: 'en', value: 'Full Body Strength'},
{lang: 'nl', value: 'Full Body Kracht'}
],
description: [
{lang: 'en', value: 'Full Body Strength'},
{lang: 'nl', value: 'Full Body Kracht'}
]
})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/{id}', 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/{id}"
payload = {
"name": [
{
"lang": "en",
"value": "Full Body Strength"
},
{
"lang": "nl",
"value": "Full Body Kracht"
}
],
"description": [
{
"lang": "en",
"value": "Full Body Strength"
},
{
"lang": "nl",
"value": "Full Body Kracht"
}
]
}
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 v2 plan
Updates a workout plan in place. Accepts either application/json or multipart/form-data. In multipart requests, send structured arrays and objects as JSON strings, use imageFiles and videoFiles for uploads, and note that the legacy binary aliases images and videos are still accepted by the backend.
Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/:id 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/{id}" \
-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({
name: [
{lang: 'en', value: 'Full Body Strength'},
{lang: 'nl', value: 'Full Body Kracht'}
],
description: [
{lang: 'en', value: 'Full Body Strength'},
{lang: 'nl', value: 'Full Body Kracht'}
]
})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/{id}', 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/{id}"
payload = {
"name": [
{
"lang": "en",
"value": "Full Body Strength"
},
{
"lang": "nl",
"value": "Full Body Kracht"
}
],
"description": [
{
"lang": "en",
"value": "Full Body Strength"
},
{
"lang": "nl",
"value": "Full Body Kracht"
}
]
}
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"
Body
1Show child attributes
Show child attributes
[
{
"lang": "en",
"value": "Full Body Strength"
},
{ "lang": "nl", "value": "Full Body Kracht" }
]
1Show child attributes
Show child attributes
[
{
"lang": "en",
"value": "Full Body Strength"
},
{ "lang": "nl", "value": "Full Body Kracht" }
]
Agility & Speed, Strength, Hypertrophy, Strength - Dynamic, Strength - Explosive, Strength - Static, Cardio, Cardio - Duration, Cardio - Interval, HIIT, Crossfit, Mobility, Stretching, Core, Coordination & Balance, Movement Prep, Functional Training, Recovery, Sports, Martial Arts, Yoga, Other, GROUP_WORKOUT_TEMPLATE, Plyometric, Cycling, Cardio - interval, Mobilisation, Stabilisation, Daily Living, Target zone, Respiration, Breathing, Massage, Outdoor sports, Indoor sports, Dance, Group Lessons, Martial arts, Material Arts, Fight skills, Mind and body, , default "Strength"
Weight Loss, Hypertrophy, Endurance, Flexibility, General Fitness, Strength "Strength"
Linear, Non-Linear, Block, Undulating, None "Linear"
Beginner, Intermediate, Advanced "Intermediate"
Low, Medium, High "Medium"
Everyone, Company, Fitsociety "Company"
Active, Inactive, Draft "Draft"
Template, Assigned "Template"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Whether new exercises use the plan-level defaults. When false, defaultExerciseValues must be null.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
Workout plan updated. Runtime still returns the standard response envelope without a data property.