curl -X PATCH "https://api.fitsociety.io/public/v1/workout/plans/template/{planId}/weeks/{weekNumber}/days/{weekday}/items/{itemId}/move" \
-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({toWeekday: 3})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/template/{planId}/weeks/{weekNumber}/days/{weekday}/items/{itemId}/move', 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/template/{planId}/weeks/{weekNumber}/days/{weekday}/items/{itemId}/move"
payload = { "toWeekday": 3 }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"data": {
"planId": "67f1234567890abcdef1234",
"templateType": "Template",
"weekNumber": 1,
"itemId": "67f1234567890abcdef1234",
"fromWeekday": 1,
"toWeekday": 3,
"destinationDayCreated": false,
"from": {
"weekday": 1,
"isRestDay": false,
"itemCount": 2,
"items": [
{
"_id": "67f1234567890abcdef1234",
"order": 1,
"startTime": "08:30",
"plannedDurationMinutes": 45,
"status": "today",
"plannedDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"source": "programme",
"clientAdjustment": {
"action": "moved",
"occurrenceDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"changedAt": null
},
"canClientRestore": true,
"type": "workout",
"planMomentId": "67f1234567890abcdef1234"
}
]
},
"to": {
"weekday": 3,
"isRestDay": false,
"itemCount": 4,
"items": [
{
"_id": "67f1234567890abcdef1234",
"order": 1,
"startTime": "08:30",
"plannedDurationMinutes": 45,
"status": "today",
"plannedDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"source": "programme",
"clientAdjustment": {
"action": "moved",
"occurrenceDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"changedAt": null
},
"canClientRestore": true,
"type": "workout",
"planMomentId": "67f1234567890abcdef1234"
}
]
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
},
"idempotency": {
"replayed": false
}
}
}Move one item to another weekday of the same week
Move ONE item — a workout or an activity — from one weekday of a calendar plan week to ANOTHER weekday of the SAME week.
The item travels whole: its _id and every type-specific field are carried over untouched — planMomentId for a workout, and activityType / name / description / targetDistanceMeters for an activity, plus startTime and plannedDurationMinutes. Only order changes, because order is a position WITHIN a day and the item is now in a different one.
Both days are left consistent. The SOURCE keeps its remaining items in their existing relative order and is renumbered 1..n, closing the gap the moved item left behind. The DESTINATION appends the item LAST, at order n+1, so nothing already on that day shifts position.
A destination weekday that is not authored yet is CREATED as a normal (non-rest) day holding just this item — days[] is stored sparsely, so an empty weekday simply has no entry. The response flags this as destinationDayCreated.
A destination marked as a REST day is refused (WORKOUTPLAN_ITEM_MOVE_REST_DAY) rather than silently un-resting it. Like the day-item reorder, this is NOT restricted to multi_week.
Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/template/:planId/weeks/:weekNumber/days/:weekday/items/:itemId/move 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 PATCH "https://api.fitsociety.io/public/v1/workout/plans/template/{planId}/weeks/{weekNumber}/days/{weekday}/items/{itemId}/move" \
-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({toWeekday: 3})
};
fetch('https://api.fitsociety.io/public/v1/workout/plans/template/{planId}/weeks/{weekNumber}/days/{weekday}/items/{itemId}/move', 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/template/{planId}/weeks/{weekNumber}/days/{weekday}/items/{itemId}/move"
payload = { "toWeekday": 3 }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"data": {
"planId": "67f1234567890abcdef1234",
"templateType": "Template",
"weekNumber": 1,
"itemId": "67f1234567890abcdef1234",
"fromWeekday": 1,
"toWeekday": 3,
"destinationDayCreated": false,
"from": {
"weekday": 1,
"isRestDay": false,
"itemCount": 2,
"items": [
{
"_id": "67f1234567890abcdef1234",
"order": 1,
"startTime": "08:30",
"plannedDurationMinutes": 45,
"status": "today",
"plannedDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"source": "programme",
"clientAdjustment": {
"action": "moved",
"occurrenceDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"changedAt": null
},
"canClientRestore": true,
"type": "workout",
"planMomentId": "67f1234567890abcdef1234"
}
]
},
"to": {
"weekday": 3,
"isRestDay": false,
"itemCount": 4,
"items": [
{
"_id": "67f1234567890abcdef1234",
"order": 1,
"startTime": "08:30",
"plannedDurationMinutes": 45,
"status": "today",
"plannedDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"source": "programme",
"clientAdjustment": {
"action": "moved",
"occurrenceDate": "2026-09-08",
"scheduledDate": "2026-09-08",
"changedAt": null
},
"canClientRestore": true,
"type": "workout",
"planMomentId": "67f1234567890abcdef1234"
}
]
}
},
"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 plan id (Template or Assigned).
"67f1234567890abcdef1234"
The 1-based week of the calendar schedule.
x >= 11
The weekday the item is currently on (1 = Monday … 7 = Sunday).
1 <= x <= 71
The item _id to move.
"67f1234567890abcdef1234"
Body
The destination weekday. Must differ from weekday.
1 <= x <= 73