StudioTraining / StudioTrainingPlanExercise
Returns a list of StudioTrainingPlanExercise objects
GET/api/crm/studio_training/plan_exercise
Query parameters
idstring | |
deletedboolean | This property is used to mark an entity as deleted / archived | Default value: false |
planDaystring | |
presetstring | |
devicestring | Optional concrete machine for this exercise |
circuitGroupstring | Exercises of the same day sharing this key form a superset / circuit block |
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Returns a list of StudioTrainingPlanExercise objectsarray<StudioTrainingPlanExercise>
Show fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
Show fields (11)
idintegerPrimary key of the plan day. Internal ID.
planStudioTrainingPlanPlan the day belongs to.
namestringName of the plan day.
descriptionstringDescription of the plan day.
day_of_weekintegerOptional fixed weekday (1 = Monday ... 7 = Sunday) if the plan is bound to weekdays
roundsintegerNumber of rounds if the day is executed as a circuit (Zirkeltraining)
round_rest_secondsintegerPause between circuit rounds in seconds
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
presetStudioTrainingPresetTraining preset of the exercise.
Show fields (25)
idintegerPrimary key of the training preset. Internal ID.
namestringName of the exercise.
descriptionstringDescription of the exercise.
imageAttachment10Image of the exercise.
videoAttachment10Video of the exercise.
durationintegerTypical duration of the exercise in seconds.
muscle_groupsarray<StudioTrainingMuscleGroup>Primarily trained muscle groups
secondary_muscle_groupsarray<StudioTrainingMuscleGroup>Secondarily trained muscle groups
exercise_typestringCategory of the exercise, e.g. strength, cardio, mobility, rehab
equipmentstringRequired equipment as free text, e.g. barbell, cable machine, bodyweight
execution_notesstringExecution cues and safety notes for the member
default_setsintegerDefault prescription proposed when the preset is added to a plan
default_repetitionsintegerDefault number of repetitions.
default_rest_secondsintegerDefault rest time in seconds.
content_sourcestringOne of the CONTENT_SOURCE_* constants
content_source_namestringName of the catalogue the entry was seeded from, e.g. wger
licensestringLicence of the imported content, e.g. CC-BY-SA 4.0
license_authorstringAuthor that has to be named to fulfil the licence attribution
license_author_urlstringLink to the author of the image or video license.
review_statusstringOne of the REVIEW_STATUS_* constants, used to keep generated or imported exercise instructions under human control before they are published
reviewed_atstring (date-time)Time the exercise was reviewed.
reviewed_bystringName of the reviewer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
deviceStudioDeviceOptional concrete machine for this exercise
Show fields (10)
idintegerPrimary key of the studio device. Internal ID.
namestringName of the device.
descriptionstringDescription of the device.
manufacturerstringManufacturer of the device.
modelstringModel of the device.
device_typestringType of the device, for example treadmill or bike.
identifierstringIdentifier of the device at the manufacturer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
curl --request GET \
--url https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/studio_training_plan_exercise_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await StudioTrainingPlanExerciseController.getAll();
if (result.success) {
print(result.data);
}[
{
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true,
"order": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1,
"exercise_type": "string",
"equipment": "string",
"execution_notes": "string",
"default_sets": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string",
"identifier": "42",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"sets": 1,
"repetitions": 1,
"repetitions_to": 1,
"weight": 1.5,
"weight_unit": "string"
}
]Create a single StudioTrainingPlanExercise
POST/api/crm/studio_training/plan_exercise
Request body application/json
dataStudioTrainingPlanExerciseShow fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
presetStudioTrainingPresetTraining preset of the exercise.
deviceStudioDeviceOptional concrete machine for this exercise
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
Responses
200Create a single StudioTrainingPlanExerciseStudioTrainingPlanExercise
Show fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
Show fields (11)
idintegerPrimary key of the plan day. Internal ID.
planStudioTrainingPlanPlan the day belongs to.
namestringName of the plan day.
descriptionstringDescription of the plan day.
day_of_weekintegerOptional fixed weekday (1 = Monday ... 7 = Sunday) if the plan is bound to weekdays
roundsintegerNumber of rounds if the day is executed as a circuit (Zirkeltraining)
round_rest_secondsintegerPause between circuit rounds in seconds
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
presetStudioTrainingPresetTraining preset of the exercise.
Show fields (25)
idintegerPrimary key of the training preset. Internal ID.
namestringName of the exercise.
descriptionstringDescription of the exercise.
imageAttachment10Image of the exercise.
videoAttachment10Video of the exercise.
durationintegerTypical duration of the exercise in seconds.
muscle_groupsarray<StudioTrainingMuscleGroup>Primarily trained muscle groups
secondary_muscle_groupsarray<StudioTrainingMuscleGroup>Secondarily trained muscle groups
exercise_typestringCategory of the exercise, e.g. strength, cardio, mobility, rehab
equipmentstringRequired equipment as free text, e.g. barbell, cable machine, bodyweight
execution_notesstringExecution cues and safety notes for the member
default_setsintegerDefault prescription proposed when the preset is added to a plan
default_repetitionsintegerDefault number of repetitions.
default_rest_secondsintegerDefault rest time in seconds.
content_sourcestringOne of the CONTENT_SOURCE_* constants
content_source_namestringName of the catalogue the entry was seeded from, e.g. wger
licensestringLicence of the imported content, e.g. CC-BY-SA 4.0
license_authorstringAuthor that has to be named to fulfil the licence attribution
license_author_urlstringLink to the author of the image or video license.
review_statusstringOne of the REVIEW_STATUS_* constants, used to keep generated or imported exercise instructions under human control before they are published
reviewed_atstring (date-time)Time the exercise was reviewed.
reviewed_bystringName of the reviewer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
deviceStudioDeviceOptional concrete machine for this exercise
Show fields (10)
idintegerPrimary key of the studio device. Internal ID.
namestringName of the device.
descriptionstringDescription of the device.
manufacturerstringManufacturer of the device.
modelstringModel of the device.
device_typestringType of the device, for example treadmill or bike.
identifierstringIdentifier of the device at the manufacturer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
curl --request POST \
--url https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
id: 42,
name: 'Beispiel',
plan_day: {
id: 42,
name: 'Beispiel',
description: 'Text',
day_of_week: 1,
rounds: 1,
round_rest_seconds: 1
},
preset: {
id: 42,
name: 'Beispiel',
description: 'Text',
content_source_name: 'Beispiel',
license_author_url: 'https://vynst.de',
duration: 1
},
device: {
id: 42,
name: 'Beispiel',
description: 'Text',
manufacturer: 'string',
model: 'string',
device_type: 'string'
},
sets: 1
}
})
};
fetch('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise"
payload = { "data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise', [
'body' => '{"data":{"id":42,"name":"Beispiel","plan_day":{"id":42,"name":"Beispiel","description":"Text","day_of_week":1,"rounds":1,"round_rest_seconds":1},"preset":{"id":42,"name":"Beispiel","description":"Text","content_source_name":"Beispiel","license_author_url":"https://vynst.de","duration":1},"device":{"id":42,"name":"Beispiel","description":"Text","manufacturer":"string","model":"string","device_type":"string"},"sets":1}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise"
payload := strings.NewReader("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/studio_training_plan_exercise_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/studio_training_plan_exercise.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await StudioTrainingPlanExerciseController.post(StudioTrainingPlanExercise.fromJson({
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"plan": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"times_per_week": 1,
"status": "string",
"is_template": true,
"valid_from": "2026-10-15T09:30:00+02:00",
"valid_until": "2026-10-15T09:30:00+02:00",
"review_date": "2026-10-15T09:30:00+02:00",
"training_goal": "string"
},
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"image": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"video": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"duration": 1,
"exercise_type": "string",
"equipment": "string"
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string",
"identifier": "42",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"sets": 1,
"repetitions": 1,
"repetitions_to": 1,
"weight": 1.5,
"weight_unit": "string"
}Returns a single StudioTrainingPlanExercise
GET/api/crm/studio_training/plan_exercise/{identifier}
Path parameters
identifierrequiredstring |
Responses
200Returns a single StudioTrainingPlanExerciseStudioTrainingPlanExercise
Show fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
Show fields (11)
idintegerPrimary key of the plan day. Internal ID.
planStudioTrainingPlanPlan the day belongs to.
namestringName of the plan day.
descriptionstringDescription of the plan day.
day_of_weekintegerOptional fixed weekday (1 = Monday ... 7 = Sunday) if the plan is bound to weekdays
roundsintegerNumber of rounds if the day is executed as a circuit (Zirkeltraining)
round_rest_secondsintegerPause between circuit rounds in seconds
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
presetStudioTrainingPresetTraining preset of the exercise.
Show fields (25)
idintegerPrimary key of the training preset. Internal ID.
namestringName of the exercise.
descriptionstringDescription of the exercise.
imageAttachment10Image of the exercise.
videoAttachment10Video of the exercise.
durationintegerTypical duration of the exercise in seconds.
muscle_groupsarray<StudioTrainingMuscleGroup>Primarily trained muscle groups
secondary_muscle_groupsarray<StudioTrainingMuscleGroup>Secondarily trained muscle groups
exercise_typestringCategory of the exercise, e.g. strength, cardio, mobility, rehab
equipmentstringRequired equipment as free text, e.g. barbell, cable machine, bodyweight
execution_notesstringExecution cues and safety notes for the member
default_setsintegerDefault prescription proposed when the preset is added to a plan
default_repetitionsintegerDefault number of repetitions.
default_rest_secondsintegerDefault rest time in seconds.
content_sourcestringOne of the CONTENT_SOURCE_* constants
content_source_namestringName of the catalogue the entry was seeded from, e.g. wger
licensestringLicence of the imported content, e.g. CC-BY-SA 4.0
license_authorstringAuthor that has to be named to fulfil the licence attribution
license_author_urlstringLink to the author of the image or video license.
review_statusstringOne of the REVIEW_STATUS_* constants, used to keep generated or imported exercise instructions under human control before they are published
reviewed_atstring (date-time)Time the exercise was reviewed.
reviewed_bystringName of the reviewer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
deviceStudioDeviceOptional concrete machine for this exercise
Show fields (10)
idintegerPrimary key of the studio device. Internal ID.
namestringName of the device.
descriptionstringDescription of the device.
manufacturerstringManufacturer of the device.
modelstringModel of the device.
device_typestringType of the device, for example treadmill or bike.
identifierstringIdentifier of the device at the manufacturer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
curl --request GET \
--url https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/studio_training_plan_exercise_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await StudioTrainingPlanExerciseController.get('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"plan": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"times_per_week": 1,
"status": "string",
"is_template": true,
"valid_from": "2026-10-15T09:30:00+02:00",
"valid_until": "2026-10-15T09:30:00+02:00",
"review_date": "2026-10-15T09:30:00+02:00",
"training_goal": "string"
},
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"image": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"video": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"duration": 1,
"exercise_type": "string",
"equipment": "string"
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string",
"identifier": "42",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"sets": 1,
"repetitions": 1,
"repetitions_to": 1,
"weight": 1.5,
"weight_unit": "string"
}Update a single StudioTrainingPlanExercise
PUT/api/crm/studio_training/plan_exercise/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataStudioTrainingPlanExerciseShow fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
presetStudioTrainingPresetTraining preset of the exercise.
deviceStudioDeviceOptional concrete machine for this exercise
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
Responses
200Update a single StudioTrainingPlanExerciseStudioTrainingPlanExercise
Show fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
Show fields (11)
idintegerPrimary key of the plan day. Internal ID.
planStudioTrainingPlanPlan the day belongs to.
namestringName of the plan day.
descriptionstringDescription of the plan day.
day_of_weekintegerOptional fixed weekday (1 = Monday ... 7 = Sunday) if the plan is bound to weekdays
roundsintegerNumber of rounds if the day is executed as a circuit (Zirkeltraining)
round_rest_secondsintegerPause between circuit rounds in seconds
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
presetStudioTrainingPresetTraining preset of the exercise.
Show fields (25)
idintegerPrimary key of the training preset. Internal ID.
namestringName of the exercise.
descriptionstringDescription of the exercise.
imageAttachment10Image of the exercise.
videoAttachment10Video of the exercise.
durationintegerTypical duration of the exercise in seconds.
muscle_groupsarray<StudioTrainingMuscleGroup>Primarily trained muscle groups
secondary_muscle_groupsarray<StudioTrainingMuscleGroup>Secondarily trained muscle groups
exercise_typestringCategory of the exercise, e.g. strength, cardio, mobility, rehab
equipmentstringRequired equipment as free text, e.g. barbell, cable machine, bodyweight
execution_notesstringExecution cues and safety notes for the member
default_setsintegerDefault prescription proposed when the preset is added to a plan
default_repetitionsintegerDefault number of repetitions.
default_rest_secondsintegerDefault rest time in seconds.
content_sourcestringOne of the CONTENT_SOURCE_* constants
content_source_namestringName of the catalogue the entry was seeded from, e.g. wger
licensestringLicence of the imported content, e.g. CC-BY-SA 4.0
license_authorstringAuthor that has to be named to fulfil the licence attribution
license_author_urlstringLink to the author of the image or video license.
review_statusstringOne of the REVIEW_STATUS_* constants, used to keep generated or imported exercise instructions under human control before they are published
reviewed_atstring (date-time)Time the exercise was reviewed.
reviewed_bystringName of the reviewer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
deviceStudioDeviceOptional concrete machine for this exercise
Show fields (10)
idintegerPrimary key of the studio device. Internal ID.
namestringName of the device.
descriptionstringDescription of the device.
manufacturerstringManufacturer of the device.
modelstringModel of the device.
device_typestringType of the device, for example treadmill or bike.
identifierstringIdentifier of the device at the manufacturer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
curl --request PUT \
--url https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
id: 42,
name: 'Beispiel',
plan_day: {
id: 42,
name: 'Beispiel',
description: 'Text',
day_of_week: 1,
rounds: 1,
round_rest_seconds: 1
},
preset: {
id: 42,
name: 'Beispiel',
description: 'Text',
content_source_name: 'Beispiel',
license_author_url: 'https://vynst.de',
duration: 1
},
device: {
id: 42,
name: 'Beispiel',
description: 'Text',
manufacturer: 'string',
model: 'string',
device_type: 'string'
},
sets: 1
}
})
};
fetch('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
payload = { "data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', [
'body' => '{"data":{"id":42,"name":"Beispiel","plan_day":{"id":42,"name":"Beispiel","description":"Text","day_of_week":1,"rounds":1,"round_rest_seconds":1},"preset":{"id":42,"name":"Beispiel","description":"Text","content_source_name":"Beispiel","license_author_url":"https://vynst.de","duration":1},"device":{"id":42,"name":"Beispiel","description":"Text","manufacturer":"string","model":"string","device_type":"string"},"sets":1}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42")
.put(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
payload := strings.NewReader("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.put(
Uri.parse('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
}
}),
);
print(response.body);{
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"plan": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"times_per_week": 1,
"status": "string",
"is_template": true,
"valid_from": "2026-10-15T09:30:00+02:00",
"valid_until": "2026-10-15T09:30:00+02:00",
"review_date": "2026-10-15T09:30:00+02:00",
"training_goal": "string"
},
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"image": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"video": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"duration": 1,
"exercise_type": "string",
"equipment": "string"
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string",
"identifier": "42",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"sets": 1,
"repetitions": 1,
"repetitions_to": 1,
"weight": 1.5,
"weight_unit": "string"
}Update a single StudioTrainingPlanExercise
PATCH/api/crm/studio_training/plan_exercise/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataStudioTrainingPlanExerciseShow fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
presetStudioTrainingPresetTraining preset of the exercise.
deviceStudioDeviceOptional concrete machine for this exercise
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
Responses
200Update a single StudioTrainingPlanExerciseStudioTrainingPlanExercise
Show fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
Show fields (11)
idintegerPrimary key of the plan day. Internal ID.
planStudioTrainingPlanPlan the day belongs to.
namestringName of the plan day.
descriptionstringDescription of the plan day.
day_of_weekintegerOptional fixed weekday (1 = Monday ... 7 = Sunday) if the plan is bound to weekdays
roundsintegerNumber of rounds if the day is executed as a circuit (Zirkeltraining)
round_rest_secondsintegerPause between circuit rounds in seconds
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
presetStudioTrainingPresetTraining preset of the exercise.
Show fields (25)
idintegerPrimary key of the training preset. Internal ID.
namestringName of the exercise.
descriptionstringDescription of the exercise.
imageAttachment10Image of the exercise.
videoAttachment10Video of the exercise.
durationintegerTypical duration of the exercise in seconds.
muscle_groupsarray<StudioTrainingMuscleGroup>Primarily trained muscle groups
secondary_muscle_groupsarray<StudioTrainingMuscleGroup>Secondarily trained muscle groups
exercise_typestringCategory of the exercise, e.g. strength, cardio, mobility, rehab
equipmentstringRequired equipment as free text, e.g. barbell, cable machine, bodyweight
execution_notesstringExecution cues and safety notes for the member
default_setsintegerDefault prescription proposed when the preset is added to a plan
default_repetitionsintegerDefault number of repetitions.
default_rest_secondsintegerDefault rest time in seconds.
content_sourcestringOne of the CONTENT_SOURCE_* constants
content_source_namestringName of the catalogue the entry was seeded from, e.g. wger
licensestringLicence of the imported content, e.g. CC-BY-SA 4.0
license_authorstringAuthor that has to be named to fulfil the licence attribution
license_author_urlstringLink to the author of the image or video license.
review_statusstringOne of the REVIEW_STATUS_* constants, used to keep generated or imported exercise instructions under human control before they are published
reviewed_atstring (date-time)Time the exercise was reviewed.
reviewed_bystringName of the reviewer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
deviceStudioDeviceOptional concrete machine for this exercise
Show fields (10)
idintegerPrimary key of the studio device. Internal ID.
namestringName of the device.
descriptionstringDescription of the device.
manufacturerstringManufacturer of the device.
modelstringModel of the device.
device_typestringType of the device, for example treadmill or bike.
identifierstringIdentifier of the device at the manufacturer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
id: 42,
name: 'Beispiel',
plan_day: {
id: 42,
name: 'Beispiel',
description: 'Text',
day_of_week: 1,
rounds: 1,
round_rest_seconds: 1
},
preset: {
id: 42,
name: 'Beispiel',
description: 'Text',
content_source_name: 'Beispiel',
license_author_url: 'https://vynst.de',
duration: 1
},
device: {
id: 42,
name: 'Beispiel',
description: 'Text',
manufacturer: 'string',
model: 'string',
device_type: 'string'
},
sets: 1
}
})
};
fetch('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
payload = { "data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', [
'body' => '{"data":{"id":42,"name":"Beispiel","plan_day":{"id":42,"name":"Beispiel","description":"Text","day_of_week":1,"rounds":1,"round_rest_seconds":1},"preset":{"id":42,"name":"Beispiel","description":"Text","content_source_name":"Beispiel","license_author_url":"https://vynst.de","duration":1},"device":{"id":42,"name":"Beispiel","description":"Text","manufacturer":"string","model":"string","device_type":"string"},"sets":1}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42")
.patch(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
payload := strings.NewReader("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"plan_day\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"day_of_week\":1,\"rounds\":1,\"round_rest_seconds\":1},\"preset\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"content_source_name\":\"Beispiel\",\"license_author_url\":\"https://vynst.de\",\"duration\":1},\"device\":{\"id\":42,\"name\":\"Beispiel\",\"description\":\"Text\",\"manufacturer\":\"string\",\"model\":\"string\",\"device_type\":\"string\"},\"sets\":1}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"duration": 1
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string"
},
"sets": 1
}
}),
);
print(response.body);{
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"plan": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"times_per_week": 1,
"status": "string",
"is_template": true,
"valid_from": "2026-10-15T09:30:00+02:00",
"valid_until": "2026-10-15T09:30:00+02:00",
"review_date": "2026-10-15T09:30:00+02:00",
"training_goal": "string"
},
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"image": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"video": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"duration": 1,
"exercise_type": "string",
"equipment": "string"
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string",
"identifier": "42",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"sets": 1,
"repetitions": 1,
"repetitions_to": 1,
"weight": 1.5,
"weight_unit": "string"
}Delete a single StudioTrainingPlanExercise (soft delete)
DELETE/api/crm/studio_training/plan_exercise/{identifier}
Path parameters
identifierrequiredstring |
Responses
200Delete a single StudioTrainingPlanExerciseStudioTrainingPlanExercise
Show fields (21)
idintegerPrimary key of the plan exercise. Internal ID.
plan_dayStudioTrainingPlanDayPlan day the exercise belongs to.
Show fields (11)
idintegerPrimary key of the plan day. Internal ID.
planStudioTrainingPlanPlan the day belongs to.
namestringName of the plan day.
descriptionstringDescription of the plan day.
day_of_weekintegerOptional fixed weekday (1 = Monday ... 7 = Sunday) if the plan is bound to weekdays
roundsintegerNumber of rounds if the day is executed as a circuit (Zirkeltraining)
round_rest_secondsintegerPause between circuit rounds in seconds
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
presetStudioTrainingPresetTraining preset of the exercise.
Show fields (25)
idintegerPrimary key of the training preset. Internal ID.
namestringName of the exercise.
descriptionstringDescription of the exercise.
imageAttachment10Image of the exercise.
videoAttachment10Video of the exercise.
durationintegerTypical duration of the exercise in seconds.
muscle_groupsarray<StudioTrainingMuscleGroup>Primarily trained muscle groups
secondary_muscle_groupsarray<StudioTrainingMuscleGroup>Secondarily trained muscle groups
exercise_typestringCategory of the exercise, e.g. strength, cardio, mobility, rehab
equipmentstringRequired equipment as free text, e.g. barbell, cable machine, bodyweight
execution_notesstringExecution cues and safety notes for the member
default_setsintegerDefault prescription proposed when the preset is added to a plan
default_repetitionsintegerDefault number of repetitions.
default_rest_secondsintegerDefault rest time in seconds.
content_sourcestringOne of the CONTENT_SOURCE_* constants
content_source_namestringName of the catalogue the entry was seeded from, e.g. wger
licensestringLicence of the imported content, e.g. CC-BY-SA 4.0
license_authorstringAuthor that has to be named to fulfil the licence attribution
license_author_urlstringLink to the author of the image or video license.
review_statusstringOne of the REVIEW_STATUS_* constants, used to keep generated or imported exercise instructions under human control before they are published
reviewed_atstring (date-time)Time the exercise was reviewed.
reviewed_bystringName of the reviewer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
deviceStudioDeviceOptional concrete machine for this exercise
Show fields (10)
idintegerPrimary key of the studio device. Internal ID.
namestringName of the device.
descriptionstringDescription of the device.
manufacturerstringManufacturer of the device.
modelstringModel of the device.
device_typestringType of the device, for example treadmill or bike.
identifierstringIdentifier of the device at the manufacturer.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringOverrides the preset name when the trainer renamed the exercise for this plan
setsintegerNumber of sets.
repetitionsintegerNumber of repetitions per set.
repetitions_tointegerUpper bound if the prescription is a repetition range (e.g. 8 - 12)
weightnumber (float)Weight per repetition.
weight_unitstringUnit of the weight, for example kg.
duration_secondsintegerDuration of one set in seconds for time based exercises
rest_secondsintegerPause between sets in seconds
tempostringMovement tempo notation, e.g. "2-0-2-0"
intensity_percentnumber (float)Target intensity in percent of the one repetition maximum
rpenumber (float)Rate of perceived exertion / reps in reserve target
circuit_groupstringExercises of the same day sharing this key form a superset / circuit block
notesstringNotes on the exercise.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
orderintegerPosition of the entity in the order.
curl --request DELETE \
--url https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/crm/studio_training/plan_exercise/42"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/studio_training_plan_exercise_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await StudioTrainingPlanExerciseController.delete('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"plan_day": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"plan": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"times_per_week": 1,
"status": "string",
"is_template": true,
"valid_from": "2026-10-15T09:30:00+02:00",
"valid_until": "2026-10-15T09:30:00+02:00",
"review_date": "2026-10-15T09:30:00+02:00",
"training_goal": "string"
},
"day_of_week": 1,
"rounds": 1,
"round_rest_seconds": 1,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"preset": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"content_source_name": "Beispiel",
"license_author_url": "https://vynst.de",
"image": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"video": {
"id": 42,
"ocr_from_name": "Beispiel",
"ocr_from_email": "lena.hartmann@example.org",
"ocr_from_phone": "+49 511 123456",
"ocr_to_name": "Beispiel",
"ocr_to_email": "lena.hartmann@example.org",
"ocr_to_phone": "+49 511 123456",
"filename": "string",
"filesize": "string",
"mimetype": "string"
},
"duration": 1,
"exercise_type": "string",
"equipment": "string"
},
"device": {
"id": 42,
"name": "Beispiel",
"description": "Text",
"manufacturer": "string",
"model": "string",
"device_type": "string",
"identifier": "42",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00",
"deleted": true
},
"sets": 1,
"repetitions": 1,
"repetitions_to": 1,
"weight": 1.5,
"weight_unit": "string"
}