Skip to main content

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.

Clients log each set as they train in the app.
In the HubFit appClients log each set as they train in the app.

Attributes

  • The same as exerciseId on the exercises of a completed workout. Use it to get the exercise's history.

  • namestring
  • lastLoggedAttimestampnullable

    When the client last logged sets for it. null if they never entered any.

  • The client's best results on this exercise, in weightUnit. Each is null until the client logs a weight for it.

    Show 3 child attributes
    • maxWeightnumbernullable

      The heaviest set.

    • maxVolumenumbernullable

      The most weight times reps added up over the exercise's sets in one workout.

    • estimatedOneRepMaxnumbernullable

      The highest one-rep max HubFit estimates from a set's weight and reps (the Epley formula).

  • 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
Exercise object
{
  "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 id to GET /completed-workouts/{workoutId} for the rest of it.

    Show 2 child attributes
    • idstringnullable

      null if HubFit didn't record which workout it was.

    • namestring
  • completedAttimestamp
  • 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 null when the client left it blank. weight is in weightUnit and durationSeconds in 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 attributes
    • typeenum

      max_weight for the heaviest set, max_volume for the most weight times reps added up over the exercise's sets in one workout, estimated_one_rep_max for 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.

    • 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).

  • 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
Exercise history entry object
{
  "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"
}
GET/v1/clients/{clientId}/exercises

Every exercise the client has logged, most recently logged first, with their best results. Requires clients:read.

Path parameters

Query parameters

  • limitinteger

    How many results to return, from 1 to 100.

    Default 25
  • cursorstring

    The nextCursor from the previous page.

Returns

A page of exercises.

GET /v1/clients/{clientId}/exercises
curl -G https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises \
  -H "Authorization: Bearer $HUBFIT_API_KEY" \
  -d search=bench
Response200 OK
{
  "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
}
GET/v1/clients/{clientId}/exercises/{exerciseId}/history

Each 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

  • clientIdstringRequired

    The client's id.

  • exerciseIdstringRequired

    An exerciseId from GET /clients/{clientId}/exercises.

Query parameters

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

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

    Default 25
  • cursorstring

    The nextCursor from the previous page.

Returns

A page of the exercise's history.

GET /v1/clients/{clientId}/exercises/{exerciseId}/history
curl -G https://api.hubfit.com/v1/clients/6ad6af41d3199442d31b2743/exercises/6ad6afb311a359b211a1c6b1/history \
  -H "Authorization: Bearer $HUBFIT_API_KEY" \
  -d startDate=2026-09-01
Response200 OK
{
  "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
}