curl -X POST "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/my-exercises" \
-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>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
page: 1,
limit: 20,
search: '',
favourites: false,
levels: ['Beginner'],
muscleGroups: ['Chest'],
equipments: ['barbell'],
categories: ['Strength']
})
};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/my-exercises', 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/clients/{clientId}/my-exercises"
payload = {
"page": 1,
"limit": 20,
"search": "",
"favourites": False,
"levels": ["Beginner"],
"muscleGroups": ["Chest"],
"equipments": ["barbell"],
"categories": ["Strength"]
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"exercises": [
{
"_id": "67f1234567890abcdef1234",
"name": "Barbell Bench Press",
"thumbnail": "https://cdn.example.com/exercises/bench.jpg",
"type": "s3",
"media": [
{
"type": "image",
"url": "https://cdn.example.com/exercises/bench.jpg",
"platform": null,
"videoId": null,
"thumbnail": null,
"duration": null,
"width": 1080,
"height": 1920
}
],
"primaryMuscle": "Chest",
"secondaryMuscles": [
"Shoulders",
"Triceps"
],
"targetedMuscles": [
"Chest",
"Shoulders",
"Triceps"
],
"difficulty": "Intermediate",
"category": "Strength",
"equipment": [
"Barbell",
"Bench"
],
"exerciseType": "personal",
"isFavourite": false,
"hasHistory": true
}
],
"availableFilters": {
"favourites": [
true,
false
],
"muscleGroups": [
"Chest",
"Back",
"Lats"
],
"equipments": [
{
"value": "barbell",
"label": "Barbell"
}
],
"categories": [
"Agility & Speed",
"Strength",
"Hypertrophy"
],
"levels": [
"Beginner",
"Intermediate",
"Advance"
]
},
"selectedFilters": {
"favourites": false,
"muscleGroups": [],
"equipments": [],
"categories": [],
"levels": [],
"search": ""
},
"pagination": {
"page": 1,
"limit": 20,
"totalItems": 12,
"totalPages": 1
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
},
"idempotency": {
"replayed": false
}
}
}List the client's own created exercises (My Exercise)
Returns a paginated list of exercises created by the authenticated client (addedBy = client, addedByRole: Client) — the ‘My Exercise’ screen. Same filter set as /app/v1/workout/client/exercises minus the coaches filter (these are always the client’s own exercises, so exerciseType is always personal). All filters are optional and sent in the request body. Results are ordered newest-first. Each item also returns a media array (images + videos, same shape as getExerciseHistory), targetedMuscles (primary + secondary, de-duplicated), and hasHistory (whether the exercise has viewable completed-session history).
Requires the workout_client_plans:read scope. This operation maps to /app/v1/workout/client/my-exercises and retains its Workout V2 permission, feature-flag, and resource-scope checks.
The clientId path parameter identifies the client represented by the request context.
curl -X POST "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/my-exercises" \
-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>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
page: 1,
limit: 20,
search: '',
favourites: false,
levels: ['Beginner'],
muscleGroups: ['Chest'],
equipments: ['barbell'],
categories: ['Strength']
})
};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/my-exercises', 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/clients/{clientId}/my-exercises"
payload = {
"page": 1,
"limit": 20,
"search": "",
"favourites": False,
"levels": ["Beginner"],
"muscleGroups": ["Chest"],
"equipments": ["barbell"],
"categories": ["Strength"]
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"exercises": [
{
"_id": "67f1234567890abcdef1234",
"name": "Barbell Bench Press",
"thumbnail": "https://cdn.example.com/exercises/bench.jpg",
"type": "s3",
"media": [
{
"type": "image",
"url": "https://cdn.example.com/exercises/bench.jpg",
"platform": null,
"videoId": null,
"thumbnail": null,
"duration": null,
"width": 1080,
"height": 1920
}
],
"primaryMuscle": "Chest",
"secondaryMuscles": [
"Shoulders",
"Triceps"
],
"targetedMuscles": [
"Chest",
"Shoulders",
"Triceps"
],
"difficulty": "Intermediate",
"category": "Strength",
"equipment": [
"Barbell",
"Bench"
],
"exerciseType": "personal",
"isFavourite": false,
"hasHistory": true
}
],
"availableFilters": {
"favourites": [
true,
false
],
"muscleGroups": [
"Chest",
"Back",
"Lats"
],
"equipments": [
{
"value": "barbell",
"label": "Barbell"
}
],
"categories": [
"Agility & Speed",
"Strength",
"Hypertrophy"
],
"levels": [
"Beginner",
"Intermediate",
"Advance"
]
},
"selectedFilters": {
"favourites": false,
"muscleGroups": [],
"equipments": [],
"categories": [],
"levels": [],
"search": ""
},
"pagination": {
"page": 1,
"limit": 20,
"totalItems": 12,
"totalPages": 1
}
},
"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
Client in the company bound to the Public API token.
^[a-fA-F0-9]{24}$Body
x >= 11
1 <= x <= 10020
"bench press"
false
Filter by difficulty. Values: Beginner, Intermediate, Advance.
"Beginner,Intermediate"
Matches on primaryMuscle OR secondaryMuscles. Allowed values: Chest, Back, Lats, Traps, Shoulders …
"Chest,Shoulders"
Equipment key values from availableFilters.equipments.
"barbell,dumbbell"
Filters on primaryCategory. Allowed values: Agility & Speed, Strength, Hypertrophy, Strength - Dynamic, Strength - Explosive …
"Strength,Cardio"