curl -X POST "https://api.fitsociety.io/public/v1/workout/plans/moments/{planId}/weeks/{weekNumber}/duplicate" \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: <stable_request_key>" \
-H "Content-Type: application/json" \
-d '{}'const options = {
method: 'POST',
headers: {'Idempotency-Key': '<idempotency-key>', Authorization: 'Bearer <token>'}
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/moments/{planId}/weeks/{weekNumber}/duplicate', 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/{planId}/weeks/{weekNumber}/duplicate"
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)Duplicate a complete workout v2 programme week
For templates, sequence and calendar programmes remain supported. Assigned plans are supported only when they are multi-week calendar programmes. For sequence templates, each active flat session whose flat week number matches the source is copied into the next active flat week. For calendar plans, the schedule week is authoritative: each unique workout reference is duplicated once, activity items and rest or empty days are copied, and chronological weekday and item order determines duplicated flat session order. The server appends the target week and generates fresh embedded moment, exercise, and schedule item ids. A bounded assigned plan is extended through the duplicated week’s Sunday. Execution and performance records are never copied. This endpoint intentionally accepts an empty request body.
Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/moments/:planId/weeks/:weekNumber/duplicate 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 POST "https://api.fitsociety.io/public/v1/workout/plans/moments/{planId}/weeks/{weekNumber}/duplicate" \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: <stable_request_key>" \
-H "Content-Type: application/json" \
-d '{}'const options = {
method: 'POST',
headers: {'Idempotency-Key': '<idempotency-key>', Authorization: 'Bearer <token>'}
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/moments/{planId}/weeks/{weekNumber}/duplicate', 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/{planId}/weeks/{weekNumber}/duplicate"
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, 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 template plan id.
"67f1234567890abcdef1234"
Active programme week to duplicate.
x >= 11