Progress
Exercises
The exercises a client has logged, with their personal records and every time they did one.
The exercises a client has logged, with their best results and each time they did one.

Attributes
- exerciseIdstring
The same as
exerciseIdon the exercises of a completed workout. Use it to get the exercise's history. - namestring
When the client last logged sets for it.
nullif they never entered any.- personalRecordsobject
The client's best results on this exercise, in
weightUnit. Each isnulluntil the client logs a weight for it.Show 3 child attributesHide child attributes
The heaviest set.
The most weight times reps added up over the exercise's sets in one workout.
The highest one-rep max HubFit estimates from a set's weight and reps (the Epley formula).
- weightUnitenum
The unit of every weight here, which is the client's unit setting. Weights aren't converted, the way amounts come with their currency. HubFit doesn't record the unit each workout was logged in, so a client who changed their setting may have older workouts logged in the other unit.
Known valueskglb
{
"exerciseId": "6ad6afb311a359b211a1c6b1",
"name": "Barbell bench press",
"lastLoggedAt": "2026-10-26T14:32:05.000Z",
"personalRecords": {
"maxWeight": 205,
"maxVolume": 4920,
"estimatedOneRepMax": 231
},
"weightUnit": "lb"
}Attributes
- workoutobject
The completed workout this was logged in. Pass its
idtoGET /completed-workouts/{workoutId}for the rest of it. - completedAttimestamp
- isAlternativeboolean
Whether the client did this exercise as an alternative to the planned one.
- notestring
The client's note on the exercise that time. Empty if none.
- setsarray of objects
One set, with a value for each thing the exercise tracks, or
nullwhen the client left it blank.weightis inweightUnitanddurationSecondsin seconds; other values are as the client entered them. - newPersonalRecordsarray of objects
The personal records the client set on the exercise that time.
Show 3 child attributesHide child attributes
- typeenum
max_weightfor the heaviest set,max_volumefor the most weight times reps added up over the exercise's sets in one workout,estimated_one_rep_maxfor the one-rep max HubFit estimates from a set's weight and reps (the Epley formula). New record types can appear.Known valuesmax_weightmax_volumeestimated_one_rep_max - valuenumber
The new record, in
weightUnit. - improvementPercentnumber
How much it beat the previous record by, as a percentage. 100 when the previous record was 0, such as when earlier sessions had no weight entered (HubFit doesn't keep the previous value, so this can't be told apart from doubling it).
- weightUnitenum
The unit of every weight here, which is the client's unit setting. Weights aren't converted, the way amounts come with their currency. HubFit doesn't record the unit each workout was logged in, so a client who changed their setting may have older workouts logged in the other unit.
Known valueskglb
{
"workout": {
"id": "6ad6af9c607c3e9d607dd19a",
"name": "Upper body A"
},
"completedAt": "2026-10-26T14:32:05.000Z",
"isAlternative": false,
"note": "",
"sets": [
{
"reps": 8,
"weight": 185,
"rpe": 8
}
],
"newPersonalRecords": [
{
"type": "max_weight",
"value": 182.4,
"improvementPercent": 4.2
}
],
"weightUnit": "lb"
}https://api.hubfit.com/v1/clients/{clientId}/exercisesEvery exercise the client has logged, most recently logged first, with their best results. Requires clients:read.
curl -G https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises \
-H "Authorization: Bearer $HUBFIT_API_KEY" \
-d search=benchconst response = await fetch("https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises?search=bench", {
headers: {
Authorization: `Bearer ${process.env.HUBFIT_API_KEY}`,
},
});
const { data, nextCursor } = await response.json();import os
import requests
response = requests.get(
"https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises",
headers={"Authorization": f"Bearer {os.environ['HUBFIT_API_KEY']}"},
params={
"search": "bench",
},
)
page = response.json()
data, next_cursor = page["data"], page["nextCursor"]{
"data": [
{
"exerciseId": "6ad6afb311a359b211a1c6b1",
"name": "Barbell bench press",
"lastLoggedAt": "2026-10-26T14:32:05.000Z",
"personalRecords": {
"maxWeight": 205,
"maxVolume": 4920,
"estimatedOneRepMax": 231
},
"weightUnit": "lb"
}
],
"nextCursor": "eyJpZCI6IjZhZDZhZjNmMjljNTk3ZjE1In0",
"totalCount": 48
}https://api.hubfit.com/v1/clients/{clientId}/exercises/{exerciseId}/historyEach time the client logged the exercise, most recent first, with the sets they did. totalCount is how many times they've logged it (within the dates you pass). 404 if the client has never logged it. Requires clients:read.
Path parameters
The client's
id.An
exerciseIdfromGET /clients/{clientId}/exercises.
Query parameters
- startDatedate
Only workouts from this day, included, as
YYYY-MM-DD, in your own calendar (the timezone in your HubFit settings), as the app shows workouts to you. - endDatedate
Only workouts up to this day, included, as
YYYY-MM-DD, in your own calendar. - limitinteger
How many results to return, from 1 to 100.
Default25 - cursorstring
The
nextCursorfrom the previous page.
Returns
A page of the exercise's history.
curl -G https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises/6ad6afb311a359b211a1c6b1/history \
-H "Authorization: Bearer $HUBFIT_API_KEY" \
-d startDate=2026-09-01const response = await fetch("https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises/6ad6afb311a359b211a1c6b1/history?startDate=2026-09-01", {
headers: {
Authorization: `Bearer ${process.env.HUBFIT_API_KEY}`,
},
});
const { data, nextCursor } = await response.json();import os
import requests
response = requests.get(
"https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises/6ad6afb311a359b211a1c6b1/history",
headers={"Authorization": f"Bearer {os.environ['HUBFIT_API_KEY']}"},
params={
"startDate": "2026-09-01",
},
)
page = response.json()
data, next_cursor = page["data"], page["nextCursor"]{
"data": [
{
"workout": {
"id": "6ad6af9c607c3e9d607dd19a",
"name": "Upper body A"
},
"completedAt": "2026-10-26T14:32:05.000Z",
"isAlternative": false,
"note": "",
"sets": [
{
"reps": 8,
"weight": 185,
"rpe": 8
}
],
"newPersonalRecords": [
{
"type": "max_weight",
"value": 182.4,
"improvementPercent": 4.2
}
],
"weightUnit": "lb"
}
],
"nextCursor": "eyJpZCI6IjZhZDZhZjNmMjljNTk3ZjE1In0",
"totalCount": 48
}