Workouts reference
List, read, log, replace and delete finished workouts with their exercises and sets.
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_workouts: List workoutsget_workout: Get workoutlog_workout: Log workoutreplace_workout: Replace workoutdelete_workout: Delete workout
list_workouts
GET https://api.dailygoal.fit/v1/workouts
MCP tool list_workouts · Read-only
List finished workouts as summaries, newest first, with pagination. Omit from and to to list every workout, or give either to bound the date window. Summaries have no sets; use get_workout for one workout's exercises and sets.
Input
| Field | Type | Description |
|---|---|---|
| fromoptional | string (YYYY-MM-DD) | First Activity Day to include, YYYY-MM-DD. Omit for no lower bound. |
| tooptional | string (YYYY-MM-DD) | Last Activity Day to include, YYYY-MM-DD, inclusive. Omit for no upper bound. |
| limitoptional | integer | Page size. Defaults to 50. |
| cursoroptional | string | nextCursor from the previous page, with the same from and to. |
Output
| Field | Type | Description |
|---|---|---|
| workouts | object[] | |
| workouts[].id | string | Workout id for get_workout, replace_workout and delete_workout. |
| workouts[].name | string | |
| workouts[].date | string (YYYY-MM-DD) | Activity Day the workout counts toward, YYYY-MM-DD. |
| workouts[].startTimeoptional | string | ISO 8601 timestamp. |
| workouts[].endTimeoptional | string | ISO 8601 timestamp. |
| workouts[].durationSecondsoptional | integer | |
| workouts[].notesoptional | string | |
| workouts[].estimatedCaloriesoptional | number | Estimated kcal burned. Absent when the user has no known body weight. |
| workouts[].exerciseCount | integer | |
| hasMore | boolean | True when more workouts match. Pass nextCursor to get them. |
| nextCursor | string | null |
Example request
curl "https://api.dailygoal.fit/v1/workouts?from=2026-09-08&to=2026-09-14&limit=20" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_workouts",
"arguments": {
"from": "2026-09-08",
"to": "2026-09-14",
"limit": 20
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"workouts": [
{
"id": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t",
"name": "Push day",
"date": "2026-09-14",
"startTime": "2026-09-14T17:30:00.000Z",
"endTime": "2026-09-14T18:25:00.000Z",
"durationSeconds": 3300,
"notes": "Bench felt strong.",
"estimatedCalories": 310,
"exerciseCount": 2
},
{
"id": "m1775l3k0j7h4g1f8d5s2a9p6o3i0u7y",
"name": "Easy run",
"date": "2026-09-12",
"startTime": "2026-09-12T08:05:00.000Z",
"endTime": "2026-09-12T08:41:00.000Z",
"durationSeconds": 2160,
"estimatedCalories": 420,
"exerciseCount": 1
}
],
"hasMore": false,
"nextCursor": null
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)validation_failed(400)internal_error(500)
get_workout
GET https://api.dailygoal.fit/v1/workouts/detail
MCP tool get_workout · Read-only
Get one finished workout with every exercise and set. Use list_workouts to browse workouts by date.
Input
| Field | Type | Description |
|---|---|---|
| id | string | Workout id from list_workouts or log_workout. |
Output
| Field | Type | Description |
|---|---|---|
| id | string | Workout id for get_workout, replace_workout and delete_workout. |
| name | string | |
| date | string (YYYY-MM-DD) | Activity Day the workout counts toward, YYYY-MM-DD. |
| startTimeoptional | string | ISO 8601 timestamp. |
| endTimeoptional | string | ISO 8601 timestamp. |
| durationSecondsoptional | integer | |
| notesoptional | string | |
| estimatedCaloriesoptional | number | Estimated kcal burned. Absent when the user has no known body weight. |
| exercises | object[] | |
| exercises[].exerciseId | string | |
| exercises[].name | string | |
| exercises[].sets | object[] | |
| exercises[].sets[].setNumber | integer | |
| exercises[].sets[].setType | "warmup" | "working" | |
| exercises[].sets[].weightoptional | object | Load in the user's preferred strength unit. |
| exercises[].sets[].weight.value | number | |
| exercises[].sets[].weight.unit | "kg" | "lb" | |
| exercises[].sets[].weightKgoptional | number | Canonical load in kilograms. |
| exercises[].sets[].repsoptional | integer | |
| exercises[].sets[].durationSecondsoptional | number | |
| exercises[].sets[].distanceMetersoptional | number | |
| exercises[].sets[].holdSecondsoptional | number | |
| exercises[].sets[].intensityoptional | number | Effort from 0 to 10. |
Example request
curl "https://api.dailygoal.fit/v1/workouts/detail?id=m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_workout",
"arguments": {
"id": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t"
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"id": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t",
"name": "Push day",
"date": "2026-09-14",
"startTime": "2026-09-14T17:30:00.000Z",
"endTime": "2026-09-14T18:25:00.000Z",
"durationSeconds": 3300,
"notes": "Bench felt strong.",
"estimatedCalories": 310,
"exercises": [
{
"exerciseId": "jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3",
"name": "Barbell Bench Press",
"sets": [
{
"setNumber": 1,
"setType": "warmup",
"weight": {
"value": 40,
"unit": "kg"
},
"weightKg": 40,
"reps": 10
},
{
"setNumber": 2,
"setType": "working",
"weight": {
"value": 70,
"unit": "kg"
},
"weightKg": 70,
"reps": 8,
"intensity": 7
},
{
"setNumber": 3,
"setType": "working",
"weight": {
"value": 70,
"unit": "kg"
},
"weightKg": 70,
"reps": 8,
"intensity": 8
}
]
},
{
"exerciseId": "jx73e6r9t2y5u8i1o4p7a0s3d6f9g2h5",
"name": "Overhead Press",
"sets": [
{
"setNumber": 1,
"setType": "working",
"weight": {
"value": 40,
"unit": "kg"
},
"weightKg": 40,
"reps": 8,
"intensity": 7
},
{
"setNumber": 2,
"setType": "working",
"weight": {
"value": 40,
"unit": "kg"
},
"weightKg": 40,
"reps": 7,
"intensity": 9
}
]
}
]
}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)
log_workout
POST https://api.dailygoal.fit/v1/workouts
MCP tool log_workout · Changes data · Accepts Idempotency-Key
Log a workout that is already finished, with its exercises and sets. Get exercise ids from search_exercises. Each call adds a new workout; to correct an existing one use replace_workout.
Input
| Field | Type | Description |
|---|---|---|
| name | string | |
| durationSecondsoptional | integer | Length of the whole session in seconds. Optional. Record a run's or set's own time on the set's durationSeconds. |
| notesoptional | string | |
| exercises | object[] | |
| exercises[].exerciseIdoptional | string | Exercise id from search_exercises. Preferred. |
| exercises[].nameoptional | string | Exact catalogue name, used when exerciseId is absent. |
| exercises[].sets | object[] | |
| exercises[].sets[].setTypeoptional | "warmup" | "working" | Defaults to working. |
| exercises[].sets[].weightoptional | object | A load with its unit. Stored as kilograms. |
| exercises[].sets[].weight.value | number | |
| exercises[].sets[].weight.unit | "kg" | "lb" | |
| exercises[].sets[].loadIntentoptional | "bar_total" | "per_hand" | "plates_each_side" | "assistance" | "added_bodyweight" | "machine_stack" | "custom" | What the weight means, for example per_hand for dumbbells. Omit for a plain total load. |
| exercises[].sets[].repsoptional | integer | |
| exercises[].sets[].durationSecondsoptional | number | Time this set took, in seconds. For a timed effort such as 5 km in 28 minutes, put 1680 here with distanceMeters 5000. |
| exercises[].sets[].distanceMetersoptional | number | |
| exercises[].sets[].holdSecondsoptional | number | |
| exercises[].sets[].intensityoptional | number | Effort from 0 to 10. |
| dateoptional | string (YYYY-MM-DD) | Activity Day, YYYY-MM-DD. Defaults to today in the user's timezone. |
| 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 |
|---|---|---|
| id | string | |
| date | string (YYYY-MM-DD) | The Activity Day the workout was saved to. |
| timezone | string | IANA timezone that defines that Activity Day. |
| estimatedCaloriesoptional | number |
Example request
curl -X POST "https://api.dailygoal.fit/v1/workouts" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN" \
-H "Idempotency-Key: 3f1c9a52-7d4e-4b8a-9e21-5c6d7e8f9a01" \
-H "Content-Type: application/json" \
-d '{"name":"Push day","date":"2026-09-14","durationSeconds":3300,"notes":"Bench felt strong.","exercises":[{"exerciseId":"jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3","sets":[{"setType":"warmup","weight":{"value":40,"unit":"kg"},"reps":10},{"weight":{"value":70,"unit":"kg"},"reps":8,"intensity":7},{"weight":{"value":70,"unit":"kg"},"reps":8,"intensity":8}]},{"exerciseId":"jx73e6r9t2y5u8i1o4p7a0s3d6f9g2h5","sets":[{"weight":{"value":40,"unit":"kg"},"reps":8,"intensity":7},{"weight":{"value":40,"unit":"kg"},"reps":7,"intensity":9}]}]}'{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "log_workout",
"arguments": {
"name": "Push day",
"date": "2026-09-14",
"durationSeconds": 3300,
"notes": "Bench felt strong.",
"exercises": [
{
"exerciseId": "jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3",
"sets": [
{
"setType": "warmup",
"weight": {
"value": 40,
"unit": "kg"
},
"reps": 10
},
{
"weight": {
"value": 70,
"unit": "kg"
},
"reps": 8,
"intensity": 7
},
{
"weight": {
"value": 70,
"unit": "kg"
},
"reps": 8,
"intensity": 8
}
]
},
{
"exerciseId": "jx73e6r9t2y5u8i1o4p7a0s3d6f9g2h5",
"sets": [
{
"weight": {
"value": 40,
"unit": "kg"
},
"reps": 8,
"intensity": 7
},
{
"weight": {
"value": 40,
"unit": "kg"
},
"reps": 7,
"intensity": 9
}
]
}
]
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"id": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t",
"date": "2026-09-14",
"timezone": "Europe/London",
"estimatedCalories": 310
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)validation_failed(400)idempotency_conflict(409)internal_error(500)
replace_workout
PUT https://api.dailygoal.fit/v1/workouts
MCP tool replace_workout · Changes data · Destructive
Replace a finished workout's name, date, duration, notes and its whole list of exercises and sets in one call. Exercises and sets you leave out are removed, and omitted notes are cleared. To add a new workout use log_workout.
Input
| Field | Type | Description |
|---|---|---|
| id | string | Workout id to replace. |
| name | string | |
| durationSecondsoptional | integer | Length of the whole session in seconds. Optional. Record a run's or set's own time on the set's durationSeconds. |
| notesoptional | string | |
| exercises | object[] | |
| exercises[].exerciseIdoptional | string | Exercise id from search_exercises. Preferred. |
| exercises[].nameoptional | string | Exact catalogue name, used when exerciseId is absent. |
| exercises[].sets | object[] | |
| exercises[].sets[].setTypeoptional | "warmup" | "working" | Defaults to working. |
| exercises[].sets[].weightoptional | object | A load with its unit. Stored as kilograms. |
| exercises[].sets[].weight.value | number | |
| exercises[].sets[].weight.unit | "kg" | "lb" | |
| exercises[].sets[].loadIntentoptional | "bar_total" | "per_hand" | "plates_each_side" | "assistance" | "added_bodyweight" | "machine_stack" | "custom" | What the weight means, for example per_hand for dumbbells. Omit for a plain total load. |
| exercises[].sets[].repsoptional | integer | |
| exercises[].sets[].durationSecondsoptional | number | Time this set took, in seconds. For a timed effort such as 5 km in 28 minutes, put 1680 here with distanceMeters 5000. |
| exercises[].sets[].distanceMetersoptional | number | |
| exercises[].sets[].holdSecondsoptional | number | |
| exercises[].sets[].intensityoptional | number | Effort from 0 to 10. |
| dateoptional | string (YYYY-MM-DD) | Activity Day, YYYY-MM-DD. Defaults to the workout's current date. |
Output
| Field | Type | Description |
|---|---|---|
| id | string | |
| date | string (YYYY-MM-DD) | The Activity Day the workout was saved to. |
| timezone | string | IANA timezone that defines that Activity Day. |
| estimatedCaloriesoptional | number |
Example request
curl -X PUT "https://api.dailygoal.fit/v1/workouts" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t","name":"Push day","durationSeconds":3600,"notes":"Added a last bench set.","exercises":[{"exerciseId":"jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3","sets":[{"setType":"warmup","weight":{"value":40,"unit":"kg"},"reps":10},{"weight":{"value":70,"unit":"kg"},"reps":8,"intensity":7},{"weight":{"value":70,"unit":"kg"},"reps":8,"intensity":8}]},{"exerciseId":"jx73e6r9t2y5u8i1o4p7a0s3d6f9g2h5","sets":[{"weight":{"value":40,"unit":"kg"},"reps":8,"intensity":7},{"weight":{"value":40,"unit":"kg"},"reps":7,"intensity":9}]}]}'{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "replace_workout",
"arguments": {
"id": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t",
"name": "Push day",
"durationSeconds": 3600,
"notes": "Added a last bench set.",
"exercises": [
{
"exerciseId": "jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3",
"sets": [
{
"setType": "warmup",
"weight": {
"value": 40,
"unit": "kg"
},
"reps": 10
},
{
"weight": {
"value": 70,
"unit": "kg"
},
"reps": 8,
"intensity": 7
},
{
"weight": {
"value": 70,
"unit": "kg"
},
"reps": 8,
"intensity": 8
}
]
},
{
"exerciseId": "jx73e6r9t2y5u8i1o4p7a0s3d6f9g2h5",
"sets": [
{
"weight": {
"value": 40,
"unit": "kg"
},
"reps": 8,
"intensity": 7
},
{
"weight": {
"value": 40,
"unit": "kg"
},
"reps": 7,
"intensity": 9
}
]
}
]
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"id": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t",
"date": "2026-09-14",
"timezone": "Europe/London",
"estimatedCalories": 335
}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)
delete_workout
DELETE https://api.dailygoal.fit/v1/workouts
MCP tool delete_workout · Changes data · Destructive
Delete a finished workout with all its exercises and sets. This cannot be undone. To correct a workout instead, use replace_workout.
Input
| Field | Type | Description |
|---|---|---|
| id | string | Workout id from list_workouts or log_workout. |
Output
| Field | Type | Description |
|---|---|---|
| id | string | |
| deleted | true | |
| date | string (YYYY-MM-DD) | The Activity Day the workout was on. |
| timezone | string |
Example request
curl -X DELETE "https://api.dailygoal.fit/v1/workouts?id=m1775l3k0j7h4g1f8d5s2a9p6o3i0u7y" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_workout",
"arguments": {
"id": "m1775l3k0j7h4g1f8d5s2a9p6o3i0u7y"
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"id": "m1775l3k0j7h4g1f8d5s2a9p6o3i0u7y",
"deleted": true,
"date": "2026-09-12",
"timezone": "Europe/London"
}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)