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 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

FieldTypeDescription
activityDaystring (YYYY-MM-DD)Today's Activity Day in the user's timezone.
timezonestringIANA timezone that defines the Activity Day.
currentStreakintegerConsecutive days with at least one logged activity, as the apps show it.
longestStreakintegerThe longest run of consecutive active days the user has had.
lastActivityDatestring (YYYY-MM-DD) | nullThe most recent day with logged activity, or null when there is none.
activeTodaybooleanWhether today already counts toward the streak.
nextMilestoneinteger | nullThe next streak milestone in days (7, 30, 100 or 365), or null past the last one.

Example request

REST
curl "https://api.dailygoal.fit/v1/progress/streak" \
  -H "Authorization: Bearer $DAILYGOAL_API_TOKEN"
MCP tools/call
{
  "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.

json
{
  "activityDay": "2026-09-14",
  "timezone": "Europe/London",
  "currentStreak": 12,
  "longestStreak": 31,
  "lastActivityDate": "2026-09-14",
  "activeToday": true,
  "nextMilestone": 30
}

Errors

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

FieldTypeDescription
earnedCountinteger
badgesobject[]Every badge in the catalogue, earned or not, in the apps' order.
badges[].keystringStable badge key, for example nutrition_bronze or explorer_first_workout.
badges[].titlestringThe badge name the apps show.
badges[].categorystringWhat the badge counts, for example nutrition, strength, hydration, streak or explorer.
badges[].tier"bronze" | "silver" | "gold" | "platinum" | "diamond" | "explorer"
badges[].earnedboolean
badges[].earnedAtoptionalstringISO 8601 timestamp of the unlock. Present when earned.
badges[].revokedoptionaltruePresent when the badge was taken back; it cannot be earned again.
badges[].progressintegerThe count toward the threshold, in the category's unit.
badges[].thresholdintegerThe count that unlocks the badge.
badges[].progressTextstringThe progress line the apps show, for example '12 of 25 logs' or 'Gold earned'.

Example request

REST
curl "https://api.dailygoal.fit/v1/progress/badges" \
  -H "Authorization: Bearer $DAILYGOAL_API_TOKEN"
MCP tools/call
{
  "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.

json
{
  "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

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

FieldTypeDescription
exerciseIdstringExercise id from get_workout or search_exercises.
fromoptionalstring (YYYY-MM-DD)First day to include, YYYY-MM-DD. Omit for the exercise's whole history, up to the session limit.

Output

FieldTypeDescription
exerciseobject
exercise.idstring
exercise.namestring
unit"kg" | "lb"The user's strength unit; every load in the response uses it.
fromoptionalstring (YYYY-MM-DD)The requested first day, echoed.
sessionsobject[]One entry per workout with completed sets of the exercise, oldest first.
sessions[].datestring (YYYY-MM-DD)
sessions[].workoutIdstringWorkout id for get_workout.
sessions[].workoutNamestring
sessions[].estimatedOneRepMaxnumberBest estimated one-rep max among the session's working sets, in `unit`. 0 when no set had both load and reps.
sessions[].heaviestWeightnumberHeaviest working-set load, in `unit`.
sessions[].volumenumberTotal load times reps across the session's sets, in `unit`.
bestoptionalobjectThe highest estimated one-rep max in the range.
best.estimatedOneRepMaxnumber
best.datestring (YYYY-MM-DD)
changeoptionalobjectPresent when at least two sessions have an estimated one-rep max.
change.estimatedOneRepMaxnumberLatest minus earliest estimated one-rep max, in `unit`. Negative is a drop.
change.percentnumber
isTruncatedbooleanTrue when older sessions were left out: one call returns at most 365 sessions from the user's recent workouts. Narrow the range with `from`.
historyLimitedbooleanTrue when the user's plan held back older sessions.

Example request

REST
curl "https://api.dailygoal.fit/v1/progress/strength?exerciseId=jx71q4w7e0r3t6y9u2i5o8p1a4s7d0f3&from=2026-09-01" \
  -H "Authorization: Bearer $DAILYGOAL_API_TOKEN"
MCP tools/call
{
  "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.

json
{
  "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

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

FieldTypeDescription
windowDaysoptional3 | 7 | 14 | 30Days to look back: 3, 7, 14, 30. Defaults to 7.

Output

FieldTypeDescription
windowDaysinteger
musclesobject[]Muscles the window's workouts trained, most worked first. Recent sets count more than older ones.
muscles[].musclestring
muscles[].namestring
muscles[].scoreinteger0 to 100, relative to the most-worked muscle in the window, which scores 100.
untrainedMusclesstring[]Names of the muscles no set in the window trained.
systemsobject[]Body systems trained, such as cardiovascular.
systems[].systemstring
systems[].scoreinteger0 to 100, relative to the most-worked muscle in the window, which scores 100.
unknownExercisesstring[]Exercises the focus model could not map to muscles. They are left out of the scores.

Example request

REST
curl "https://api.dailygoal.fit/v1/progress/recent-focus?windowDays=7" \
  -H "Authorization: Bearer $DAILYGOAL_API_TOKEN"
MCP tools/call
{
  "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.

json
{
  "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