Gym Profiles reference
List, save and delete the equipment each of the user's gyms has, and choose the default profile.
The DailyGoal API is not available on the Free plan. It works with a paid plan or during a free trial. See plans.
Operations
list_gym_profiles: List gym profilessave_gym_profile: Save gym profileset_default_gym_profile: Set default gym profiledelete_gym_profile: Delete gym profile
list_gym_profiles
GET https://api.dailygoal.fit/v1/gym-profiles
MCP tool list_gym_profiles · Read-only
List the user's gym profiles: the bars, plates, dumbbells, kettlebells and cable and machine increments each gym has, and which profile is the default. The list is empty until the user opens workouts in the app or saves a profile. Use get_context for the user's preferred units.
Input
This operation takes no input.
Output
| Field | Type | Description |
|---|---|---|
| profiles | object[] | Every profile, oldest first. |
| profiles[].id | string | Gym profile id for save_gym_profile, delete_gym_profile and set_default_gym_profile. |
| profiles[].name | string | |
| profiles[].isDefault | boolean | True for the profile new workouts use. Exactly one profile is the default. |
| profiles[].unitSystem | "kg" | "lb" | The unit the profile's equipment is weighed in. The default profile's unit is the user's strength unit. |
| profiles[].bars | object[] | |
| profiles[].bars[].value | number | |
| profiles[].bars[].unit | "kg" | "lb" | |
| profiles[].bars[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].bars[].labeloptional | string | |
| profiles[].plates | object[] | |
| profiles[].plates[].value | number | |
| profiles[].plates[].unit | "kg" | "lb" | |
| profiles[].plates[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].plates[].labeloptional | string | |
| profiles[].dumbbells | object[] | |
| profiles[].dumbbells[].value | number | |
| profiles[].dumbbells[].unit | "kg" | "lb" | |
| profiles[].dumbbells[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].dumbbells[].labeloptional | string | |
| profiles[].kettlebells | object[] | |
| profiles[].kettlebells[].value | number | |
| profiles[].kettlebells[].unit | "kg" | "lb" | |
| profiles[].kettlebells[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].kettlebells[].labeloptional | string | |
| profiles[].fixedBars | object[] | |
| profiles[].fixedBars[].value | number | |
| profiles[].fixedBars[].unit | "kg" | "lb" | |
| profiles[].fixedBars[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].fixedBars[].labeloptional | string | |
| profiles[].cableIncrement | object | The step between cable stack loads. |
| profiles[].cableIncrement.value | number | |
| profiles[].cableIncrement.unit | "kg" | "lb" | |
| profiles[].cableIncrement.countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].cableIncrement.labeloptional | string | |
| profiles[].machineIncrement | object | The step between machine stack loads. |
| profiles[].machineIncrement.value | number | |
| profiles[].machineIncrement.unit | "kg" | "lb" | |
| profiles[].machineIncrement.countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profiles[].machineIncrement.labeloptional | string |
Example request
curl "https://api.dailygoal.fit/v1/gym-profiles" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_gym_profiles",
"arguments": {}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"profiles": [
{
"id": "kg71q3w6e9r2t5y8u1i4o7p0a3s6d9f2",
"name": "Home gym",
"isDefault": true,
"unitSystem": "kg",
"bars": [
{
"value": 20,
"unit": "kg",
"count": 1,
"label": "Olympic bar"
}
],
"plates": [
{
"value": 20,
"unit": "kg",
"count": 8
},
{
"value": 10,
"unit": "kg",
"count": 4
},
{
"value": 5,
"unit": "kg",
"count": 4
}
],
"dumbbells": [
{
"value": 5,
"unit": "kg",
"count": 2
},
{
"value": 10,
"unit": "kg",
"count": 2
},
{
"value": 15,
"unit": "kg",
"count": 2
},
{
"value": 20,
"unit": "kg",
"count": 2
},
{
"value": 25,
"unit": "kg",
"count": 2
}
],
"kettlebells": [
{
"value": 16,
"unit": "kg",
"count": 1
}
],
"fixedBars": [],
"cableIncrement": {
"value": 5,
"unit": "kg"
},
"machineIncrement": {
"value": 5,
"unit": "kg"
}
}
]
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)internal_error(500)
save_gym_profile
POST https://api.dailygoal.fit/v1/gym-profiles
MCP tool save_gym_profile · Changes data · Destructive · Accepts Idempotency-Key
Create a gym profile stocked with standard equipment, or update one by passing its id. On update, fields you omit keep their value. A user's first profile becomes the default; to switch the default use set_default_gym_profile.
Input
| Field | Type | Description |
|---|---|---|
| idoptional | string | The profile to update. Omit it to create a profile. |
| name | string | |
| unitSystemoptional | "kg" | "lb" | A new profile defaults to the user's strength unit. Changing an existing profile's unit restocks it with that unit's standard equipment before the other fields apply. |
| platesoptional | number[] | Plate weights the gym has, in the profile's unit. Each must be a standard plate: 25, 20, 15, 10, 5, 2.5, 1.25 kg, or 45, 35, 25, 10, 5, 2.5 lb. Standard counts are stocked. |
| dumbbellMaxoptional | number | Heaviest dumbbell, in the profile's unit: 25, 40, 50, 60 kg or 50, 75, 100, 150 lb. Lighter standard dumbbells are stocked up to it. |
| cableIncrementoptional | 5 | 10 | Cable stack step, in the profile's unit. |
| machineIncrementoptional | 5 | 10 | Machine stack step, in the profile's unit. |
| idempotency_keyoptional | string | Optional. A unique value for this create, for example a UUID. Retrying with the same key and arguments within 24 hours returns the first result instead of creating a duplicate. |
Output
| Field | Type | Description |
|---|---|---|
| created | boolean | True when this call created the profile, false when it updated one. |
| profile | object | |
| profile.id | string | Gym profile id for save_gym_profile, delete_gym_profile and set_default_gym_profile. |
| profile.name | string | |
| profile.isDefault | boolean | True for the profile new workouts use. Exactly one profile is the default. |
| profile.unitSystem | "kg" | "lb" | The unit the profile's equipment is weighed in. The default profile's unit is the user's strength unit. |
| profile.bars | object[] | |
| profile.bars[].value | number | |
| profile.bars[].unit | "kg" | "lb" | |
| profile.bars[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.bars[].labeloptional | string | |
| profile.plates | object[] | |
| profile.plates[].value | number | |
| profile.plates[].unit | "kg" | "lb" | |
| profile.plates[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.plates[].labeloptional | string | |
| profile.dumbbells | object[] | |
| profile.dumbbells[].value | number | |
| profile.dumbbells[].unit | "kg" | "lb" | |
| profile.dumbbells[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.dumbbells[].labeloptional | string | |
| profile.kettlebells | object[] | |
| profile.kettlebells[].value | number | |
| profile.kettlebells[].unit | "kg" | "lb" | |
| profile.kettlebells[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.kettlebells[].labeloptional | string | |
| profile.fixedBars | object[] | |
| profile.fixedBars[].value | number | |
| profile.fixedBars[].unit | "kg" | "lb" | |
| profile.fixedBars[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.fixedBars[].labeloptional | string | |
| profile.cableIncrement | object | The step between cable stack loads. |
| profile.cableIncrement.value | number | |
| profile.cableIncrement.unit | "kg" | "lb" | |
| profile.cableIncrement.countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.cableIncrement.labeloptional | string | |
| profile.machineIncrement | object | The step between machine stack loads. |
| profile.machineIncrement.value | number | |
| profile.machineIncrement.unit | "kg" | "lb" | |
| profile.machineIncrement.countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.machineIncrement.labeloptional | string |
Example request
curl -X POST "https://api.dailygoal.fit/v1/gym-profiles" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN" \
-H "Idempotency-Key: 3f1c9a52-7d4e-4b8a-9e21-5c6d7e8f9a01" \
-H "Content-Type: application/json" \
-d '{"name":"Home gym","plates":[20,10,5],"dumbbellMax":25,"cableIncrement":5}'{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "save_gym_profile",
"arguments": {
"name": "Home gym",
"plates": [
20,
10,
5
],
"dumbbellMax": 25,
"cableIncrement": 5
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"created": true,
"profile": {
"id": "kg71q3w6e9r2t5y8u1i4o7p0a3s6d9f2",
"name": "Home gym",
"isDefault": true,
"unitSystem": "kg",
"bars": [
{
"value": 20,
"unit": "kg",
"count": 1,
"label": "Olympic bar"
}
],
"plates": [
{
"value": 20,
"unit": "kg",
"count": 8
},
{
"value": 10,
"unit": "kg",
"count": 4
},
{
"value": 5,
"unit": "kg",
"count": 4
}
],
"dumbbells": [
{
"value": 5,
"unit": "kg",
"count": 2
},
{
"value": 10,
"unit": "kg",
"count": 2
},
{
"value": 15,
"unit": "kg",
"count": 2
},
{
"value": 20,
"unit": "kg",
"count": 2
},
{
"value": 25,
"unit": "kg",
"count": 2
}
],
"kettlebells": [
{
"value": 16,
"unit": "kg",
"count": 1
}
],
"fixedBars": [],
"cableIncrement": {
"value": 5,
"unit": "kg"
},
"machineIncrement": {
"value": 5,
"unit": "kg"
}
}
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)validation_failed(400)not_found(404)idempotency_conflict(409)limit_exceeded(409)internal_error(500)
set_default_gym_profile
PUT https://api.dailygoal.fit/v1/gym-profiles/default
MCP tool set_default_gym_profile · Changes data
Make one gym profile the default that new workouts use. The user's strength unit becomes the profile's unit. To change a profile's equipment use save_gym_profile.
Input
| Field | Type | Description |
|---|---|---|
| id | string | Gym profile id from list_gym_profiles. |
Output
| Field | Type | Description |
|---|---|---|
| profile | object | |
| profile.id | string | Gym profile id for save_gym_profile, delete_gym_profile and set_default_gym_profile. |
| profile.name | string | |
| profile.isDefault | boolean | True for the profile new workouts use. Exactly one profile is the default. |
| profile.unitSystem | "kg" | "lb" | The unit the profile's equipment is weighed in. The default profile's unit is the user's strength unit. |
| profile.bars | object[] | |
| profile.bars[].value | number | |
| profile.bars[].unit | "kg" | "lb" | |
| profile.bars[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.bars[].labeloptional | string | |
| profile.plates | object[] | |
| profile.plates[].value | number | |
| profile.plates[].unit | "kg" | "lb" | |
| profile.plates[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.plates[].labeloptional | string | |
| profile.dumbbells | object[] | |
| profile.dumbbells[].value | number | |
| profile.dumbbells[].unit | "kg" | "lb" | |
| profile.dumbbells[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.dumbbells[].labeloptional | string | |
| profile.kettlebells | object[] | |
| profile.kettlebells[].value | number | |
| profile.kettlebells[].unit | "kg" | "lb" | |
| profile.kettlebells[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.kettlebells[].labeloptional | string | |
| profile.fixedBars | object[] | |
| profile.fixedBars[].value | number | |
| profile.fixedBars[].unit | "kg" | "lb" | |
| profile.fixedBars[].countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.fixedBars[].labeloptional | string | |
| profile.cableIncrement | object | The step between cable stack loads. |
| profile.cableIncrement.value | number | |
| profile.cableIncrement.unit | "kg" | "lb" | |
| profile.cableIncrement.countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.cableIncrement.labeloptional | string | |
| profile.machineIncrement | object | The step between machine stack loads. |
| profile.machineIncrement.value | number | |
| profile.machineIncrement.unit | "kg" | "lb" | |
| profile.machineIncrement.countoptional | integer | How many the gym has. Plates count every plate, not pairs. |
| profile.machineIncrement.labeloptional | string |
Example request
curl -X PUT "https://api.dailygoal.fit/v1/gym-profiles/default" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"kg71q3w6e9r2t5y8u1i4o7p0a3s6d9f2"}'{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "set_default_gym_profile",
"arguments": {
"id": "kg71q3w6e9r2t5y8u1i4o7p0a3s6d9f2"
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"profile": {
"id": "kg71q3w6e9r2t5y8u1i4o7p0a3s6d9f2",
"name": "Home gym",
"isDefault": true,
"unitSystem": "kg",
"bars": [
{
"value": 20,
"unit": "kg",
"count": 1,
"label": "Olympic bar"
}
],
"plates": [
{
"value": 20,
"unit": "kg",
"count": 8
},
{
"value": 10,
"unit": "kg",
"count": 4
},
{
"value": 5,
"unit": "kg",
"count": 4
}
],
"dumbbells": [
{
"value": 5,
"unit": "kg",
"count": 2
},
{
"value": 10,
"unit": "kg",
"count": 2
},
{
"value": 15,
"unit": "kg",
"count": 2
},
{
"value": 20,
"unit": "kg",
"count": 2
},
{
"value": 25,
"unit": "kg",
"count": 2
}
],
"kettlebells": [
{
"value": 16,
"unit": "kg",
"count": 1
}
],
"fixedBars": [],
"cableIncrement": {
"value": 5,
"unit": "kg"
},
"machineIncrement": {
"value": 5,
"unit": "kg"
}
}
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)validation_failed(400)not_found(404)internal_error(500)
delete_gym_profile
DELETE https://api.dailygoal.fit/v1/gym-profiles
MCP tool delete_gym_profile · Changes data · Destructive
Delete one gym profile. It fails with conflict for the user's only profile. Deleting the default makes the oldest remaining profile the default. Finished workouts keep the equipment they were logged with. To change the equipment instead, use save_gym_profile.
Input
| Field | Type | Description |
|---|---|---|
| id | string | Gym profile id from list_gym_profiles. |
Output
| Field | Type | Description |
|---|---|---|
| id | string | |
| deleted | true | |
| defaultProfileIdoptional | string | Present when the deleted profile was the default: the profile that replaced it. |
Example request
curl -X DELETE "https://api.dailygoal.fit/v1/gym-profiles?id=kg72w4e7r0t3y6u9i2o5p8a1s4d7f0g3" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_gym_profile",
"arguments": {
"id": "kg72w4e7r0t3y6u9i2o5p8a1s4d7f0g3"
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"id": "kg72w4e7r0t3y6u9i2o5p8a1s4d7f0g3",
"deleted": true
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)validation_failed(400)not_found(404)conflict(409)internal_error(500)