Progress reference
Read the user's activity streak, badges, strength progress per exercise and recent muscle focus.
The DailyGoal API is not available on the Free plan. It works with a paid plan or during a free trial. See plans.
Operations
get_streak: Get streaklist_badges: List badgesget_strength_progress: Get strength progressget_recent_focus: Get recent focus
get_streak
GET https://api.dailygoal.fit/v1/progress/streak
MCP tool get_streak · Read-only
Get the user's activity streak: consecutive days with any logged food, workout, body metric, water or completed goal, their longest streak, and whether today counts yet. For badges, including streak badges, use list_badges.
Input
This operation takes no input.
Output
| Field | Type | Description |
|---|---|---|
| activityDay | string (YYYY-MM-DD) | Today's Activity Day in the user's timezone. |
| timezone | string | IANA timezone that defines the Activity Day. |
| currentStreak | integer | Consecutive days with at least one logged activity, as the apps show it. |
| longestStreak | integer | The longest run of consecutive active days the user has had. |
| lastActivityDate | string (YYYY-MM-DD) | null | The most recent day with logged activity, or null when there is none. |
| activeToday | boolean | Whether today already counts toward the streak. |
| nextMilestone | integer | null | The next streak milestone in days (7, 30, 100 or 365), or null past the last one. |
Example request
curl "https://api.dailygoal.fit/v1/progress/streak" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_streak",
"arguments": {}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"activityDay": "2026-09-14",
"timezone": "Europe/London",
"currentStreak": 12,
"longestStreak": 31,
"lastActivityDate": "2026-09-14",
"activeToday": true,
"nextMilestone": 30
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)internal_error(500)
list_badges
GET https://api.dailygoal.fit/v1/progress/badges
MCP tool list_badges · Read-only
List every badge with whether the user earned it, when, and their progress toward the ones still locked. Badges are private to the user. For the current streak in days, use get_streak.
Input
This operation takes no input.
Output
| Field | Type | Description |
|---|---|---|
| earnedCount | integer | |
| badges | object[] | Every badge in the catalogue, earned or not, in the apps' order. |
| badges[].key | string | Stable badge key, for example nutrition_bronze or explorer_first_workout. |
| badges[].title | string | The badge name the apps show. |
| badges[].category | string | What the badge counts, for example nutrition, strength, hydration, streak or explorer. |
| badges[].tier | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "explorer" | |
| badges[].earned | boolean | |
| badges[].earnedAtoptional | string | ISO 8601 timestamp of the unlock. Present when earned. |
| badges[].revokedoptional | true | Present when the badge was taken back; it cannot be earned again. |
| badges[].progress | integer | The count toward the threshold, in the category's unit. |
| badges[].threshold | integer | The count that unlocks the badge. |
| badges[].progressText | string | The progress line the apps show, for example '12 of 25 logs' or 'Gold earned'. |
Example request
curl "https://api.dailygoal.fit/v1/progress/badges" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_badges",
"arguments": {}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"earnedCount": 2,
"badges": [
{
"key": "strength_bronze",
"title": "Strength · Bronze",
"category": "strength",
"tier": "bronze",
"earned": true,
"earnedAt": "2026-08-03T18:20:00.000Z",
"progress": 14,
"threshold": 1,
"progressText": "Bronze earned"
},
{
"key": "strength_silver",
"title": "Strength · Silver",
"category": "strength",
"tier": "silver",
"earned": true,
"earnedAt": "2026-09-10T18:05:00.000Z",
"progress": 14,
"threshold": 10,
"progressText": "Silver earned"
},
{
"key": "strength_gold",
"title": "Strength · Gold",
"category": "strength",
"tier": "gold",
"earned": false,
"progress": 14,
"threshold": 50,
"progressText": "14 of 50 workouts"
}
]
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)internal_error(500)
get_strength_progress
GET https://api.dailygoal.fit/v1/progress/strength
MCP tool get_strength_progress · Read-only
Get one exercise's strength progress from the user's finished workouts: per session, the best estimated one-rep max (Brzycki formula, reps capped at 12), heaviest load and volume, plus the best and the change over the range, in the user's strength unit. Returns up to 365 sessions, oldest first. Get the exercise id from get_workout or search_exercises. For every set of one workout, use get_workout; for which muscles recent training worked, use get_recent_focus.
Input
| Field | Type | Description |
|---|---|---|
| exerciseId | string | Exercise id from get_workout or search_exercises. |
| fromoptional | string (YYYY-MM-DD) | First day to include, YYYY-MM-DD. Omit for the exercise's whole history, up to the session limit. |
Output
| Field | Type | Description |
|---|---|---|
| exercise | object | |
| exercise.id | string | |
| exercise.name | string | |
| unit | "kg" | "lb" | The user's strength unit; every load in the response uses it. |
| fromoptional | string (YYYY-MM-DD) | The requested first day, echoed. |
| sessions | object[] | One entry per workout with completed sets of the exercise, oldest first. |
| sessions[].date | string (YYYY-MM-DD) | |
| sessions[].workoutId | string | Workout id for get_workout. |
| sessions[].workoutName | string | |
| sessions[].estimatedOneRepMax | number | Best estimated one-rep max among the session's working sets, in `unit`. 0 when no set had both load and reps. |
| sessions[].heaviestWeight | number | Heaviest working-set load, in `unit`. |
| sessions[].volume | number | Total load times reps across the session's sets, in `unit`. |
| bestoptional | object | The highest estimated one-rep max in the range. |
| best.estimatedOneRepMax | number | |
| best.date | string (YYYY-MM-DD) | |
| changeoptional | object | Present when at least two sessions have an estimated one-rep max. |
| change.estimatedOneRepMax | number | Latest minus earliest estimated one-rep max, in `unit`. Negative is a drop. |
| change.percent | number | |
| isTruncated | boolean | True when older sessions were left out: one call returns at most 365 sessions from the user's recent workouts. Narrow the range with `from`. |
| historyLimited | boolean | True when the user's plan held back older sessions. |
Example request
curl "https://api.dailygoal.fit/v1/progress/strength?exerciseId=jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3&from=2026-09-01" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_strength_progress",
"arguments": {
"exerciseId": "jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3",
"from": "2026-09-01"
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"exercise": {
"id": "jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3",
"name": "Barbell Bench Press"
},
"unit": "kg",
"from": "2026-09-01",
"sessions": [
{
"date": "2026-09-07",
"workoutId": "m1776m4l1k8j5h2g9f6d3s0a7p4o1i8u",
"workoutName": "Push day",
"estimatedOneRepMax": 87.2,
"heaviestWeight": 77.5,
"volume": 1163
},
{
"date": "2026-09-14",
"workoutId": "m1774k2j9h6g3f0d7s4a1p8o5i2u9y6t",
"workoutName": "Push day",
"estimatedOneRepMax": 90,
"heaviestWeight": 80,
"volume": 1200
}
],
"best": {
"estimatedOneRepMax": 90,
"date": "2026-09-14"
},
"change": {
"estimatedOneRepMax": 2.8,
"percent": 3.2
},
"isTruncated": false,
"historyLimited": false
}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)
get_recent_focus
GET https://api.dailygoal.fit/v1/progress/recent-focus
MCP tool get_recent_focus · Read-only
Get which muscles the user's finished workouts trained over the last few days, scored 0 to 100 against the most-worked muscle, and which muscles went untrained. It is the Recent Focus heatmap in the apps. For load progress on one exercise, use get_strength_progress; for the workouts themselves, use list_workouts.
Input
| Field | Type | Description |
|---|---|---|
| windowDaysoptional | 3 | 7 | 14 | 30 | Days to look back: 3, 7, 14, 30. Defaults to 7. |
Output
| Field | Type | Description |
|---|---|---|
| windowDays | integer | |
| muscles | object[] | Muscles the window's workouts trained, most worked first. Recent sets count more than older ones. |
| muscles[].muscle | string | |
| muscles[].name | string | |
| muscles[].score | integer | 0 to 100, relative to the most-worked muscle in the window, which scores 100. |
| untrainedMuscles | string[] | Names of the muscles no set in the window trained. |
| systems | object[] | Body systems trained, such as cardiovascular. |
| systems[].system | string | |
| systems[].score | integer | 0 to 100, relative to the most-worked muscle in the window, which scores 100. |
| unknownExercises | string[] | Exercises the focus model could not map to muscles. They are left out of the scores. |
Example request
curl "https://api.dailygoal.fit/v1/progress/recent-focus?windowDays=7" \
-H "Authorization: Bearer $DAILYGOAL_API_TOKEN"{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_recent_focus",
"arguments": {
"windowDays": 7
}
}
}Example response
Synthetic data. REST returns this object as the body; MCP returns it as structuredContent.
{
"windowDays": 7,
"muscles": [
{
"muscle": "chest",
"name": "Chest",
"score": 100
},
{
"muscle": "triceps",
"name": "Triceps",
"score": 64
},
{
"muscle": "front_delts",
"name": "Front delts",
"score": 58
}
],
"untrainedMuscles": [
"Lats",
"Upper back",
"Quads",
"Hamstrings",
"Glutes",
"Calves"
],
"systems": [
{
"system": "cardiovascular",
"score": 100
}
],
"unknownExercises": []
}Errors
unauthorized(401)origin_not_allowed(403)misdirected_request(421)subscription_required(403)rate_limited(429)validation_failed(400)internal_error(500)