Progress
Client summaries
One row per client adding up their workouts, nutrition, habits, metrics, health data and check-ins over a period.
One row per client you can reach, adding up what they did over a period (their workouts, nutrition, habits, metrics, health data and check-ins), to compare clients (who trained fewer than 3 times this week, who is under their protein target, who lost weight this month) without fetching every record.
Endpoints
Attributes
- clientobject
- workoutsobject
The workouts the client completed in the period.
Show 5 child attributesHide child attributes
- workoutCountinteger
How many workouts the client completed in the period.
When the client last completed a workout at all, which can be after the period.
nullif they never have.- totalsobject
Added up over the workouts in the period.
- newPersonalRecordCountinteger
How many personal records the workouts in the period set.
- 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
- nutritionobject
A day counts toward
loggedDayCountand the averages once it has food in it. Clients who track in Cronometer have no logs here.Show 4 child attributesHide child attributes
- loggedDayCountinteger
How many days in the period the client logged food.
The last day the client logged anything (food, a photo or a note), which can be after the period.
nullif they never have.The daily average over the days logged.
nullif the client logged no food in the period.Show 9 child attributesHide child attributes
- caloriesnumber
- proteinGramsnumber
- carbsGramsnumber
- fatGramsnumber
- fiberGramsnumber
- sugarGramsnumber
- saturatedFatGramsnumber
- monounsaturatedFatGramsnumber
- polyunsaturatedFatGramsnumber
The average of the days logged's targets, each value over the days it was set.
nullif none of those days had a target.Show 4 child attributesHide child attributes
- habitsarray of objects
Each habit that was running in the period, up to today. Empty if the client had none, or the coach turned habits off for them.
Show 6 child attributesHide child attributes
- idstring
Its unique ID.
- namestring
- emojistring
- goalobject
Show 4 child attributesHide child attributes
- typeenum
numericwhen the client logs an amount (steps, litres),completionwhen they tick it off.Known valuesnumericcompletion The amount to reach each period. For a
completionhabit, how many ticks (1 a day, or 1 to 7 a week).The unit the coach picked, like
steps,kmorcups.nullfor acompletionhabit.- periodenum
Whether the goal is for each day, each Monday-to-Sunday week, or each month.
Known valuesdayweekmonth
- completedPeriodCountinteger
How many of the
expectedPeriodCountdays, weeks or months the client met the goal, as the app records it. - expectedPeriodCountinteger
The habit's days, weeks or months (its goal's
period) in the period while it was running, up to today. A week counts when any of it falls in the period.
- metricsarray of objects
Each of the client's metrics, or the one named with
metricName, in the order the coach added them. Empty if the client has none, or the coach turned metrics off for them.Show 7 child attributesHide child attributes
- idstring
Its unique ID.
- namestring
- entryCountinteger
The entries in the period.
The period's earliest entry.
nullif it has none.The period's latest entry, picked the same way as a metric's
lastEntry.nullif it has none.The mean of the period's entries, to 1 decimal place, as the app shows it.
nullwith no entries.
- healthobject
From Apple Health or Health Connect, each average over the days that have it.
sourceisnullfor a client who hasn't connected either.Show 7 child attributesHide child attributes
Where the data comes from, or
nullif the client hasn't connected Apple Health or Health Connect. New sources can appear.Known valuesapple_healthhealth_connect- recordedDayCountinteger
How many days in the period have any data.
- checkInsarray of objects
One entry per check-in form the client submitted for a day in the period, latest first. Empty if they submitted none. A check-in counts on the day it's for (
checkInDate), the client's own day or the day they backdated it to. For submissions waiting for your review, useGET /check-in-submissions?status=awaiting_review.Show 4 child attributesHide child attributes
- namestring
The form's name on its latest submission in the period. Forms are told apart by the form itself, so a renamed form is one entry.
- submissionCountinteger
- lastSubmittedAttimestamp
- lastSubmissionIdstring
The latest submission, to read with
GET /check-in-submissions/{submissionId}.
{
"client": {
"id": "6ad6af41d3199442d31b2743",
"name": "Jordan Miller"
},
"workouts": {
"workoutCount": 4,
"lastCompletedAt": "2026-10-26T14:32:05.000Z",
"totals": {
"setCount": 18,
"reps": 142,
"volume": 18450
},
"newPersonalRecordCount": 1,
"weightUnit": "lb"
},
"nutrition": {
"loggedDayCount": 6,
"lastLoggedDate": "2026-10-26",
"averageNutrients": {
"calories": 2350,
"proteinGrams": 180,
"carbsGrams": 240,
"fatGrams": 70,
"fiberGrams": 32,
"sugarGrams": 45,
"saturatedFatGrams": 22,
"monounsaturatedFatGrams": 28,
"polyunsaturatedFatGrams": 14
},
"averageTarget": {
"calories": 2350,
"proteinGrams": 180,
"carbsGrams": 240,
"fatGrams": 70
}
},
"habits": [
{
"id": "6ad6af3f8234ff3e82336c41",
"name": "10,000 steps a day",
"emoji": "🚶",
"goal": {
"type": "numeric",
"value": 10000,
"unit": "steps",
"period": "day"
},
"completedPeriodCount": 5,
"expectedPeriodCount": 7
}
],
"metrics": [
{
"id": "6ad6af776298037662967079",
"name": "Weight",
"unit": "lb",
"entryCount": 24,
"firstEntry": {
"id": "6ad6af5ec77bd15dc77a3e5c",
"date": "2026-09-28",
"value": 186.2
},
"lastEntry": {
"id": "6ad6af4305c6094205c47641",
"date": "2026-10-26",
"value": 182.4
},
"average": 184.1
}
],
"health": {
"source": "apple_health",
"lastSyncedAt": "2026-10-26T14:32:05.000Z",
"recordedDayCount": 7,
"averageSteps": 9120,
"averageActiveCalories": 540,
"averageSleepSeconds": 26100,
"averageRestingHeartRateBpm": 58
},
"checkIns": [
{
"name": "Weekly check-in",
"submissionCount": 4,
"lastSubmittedAt": "2026-10-26T14:32:05.000Z",
"lastSubmissionId": "6ad6af38570dcf37570c3c3a"
}
]
}https://api.hubfit.com/v1/client-summariesFor each client you can reach (team members with the Standard role only see their assigned clients), or one with clientId, what they did over a period, in the sections you name in include. Clients come newest first, as in GET /clients, including those who logged nothing. Requires clients:read.
Query parameters
The sections each row has, comma-separated, such as
workouts,nutrition. Ask only for the ones you need, since each one adds to every row.One ofworkoutsnutritionhabitsmetricshealthcheckIns- clientIdstring
Only this client's summary. A client you can't reach is a 404, and an archived one a 409.
- clientIdsarray of strings
Only these clients, up to 25, comma-separated. A filter like the rest, so a client you can't reach or who is archived is left out. Compare
totalCountwith how many you asked for. Not withclientId. The first day of the period, included, as
YYYY-MM-DD. Workouts count on their day in your own calendar (the timezone in your HubFit settings), as the app shows them to you; the other sections count the client's own days.The last day of the period, included, as
YYYY-MM-DD. The period is at most 31 days, counting both ends, or 366 whenincludeis onlymetrics.- metricNamestring
Only the metric with this name, ignoring case, as the app matches names.
weightfindsWeightbut notBody weight. Needsmetricsininclude. - limitinteger
How many clients a page holds. At most 25, fewer than other lists, as a row with every section is about 600 tokens.
Default25 - cursorstring
The
nextCursorfrom the previous page.
Returns
A page of summaries, one per client.
curl -G https://api.hubfit.com/v1/client-summaries \
-H "Authorization: Bearer $HUBFIT_API_KEY" \
-d include=workouts%2Cnutrition \
-d startDate=2026-10-20 \
-d endDate=2026-10-26const response = await fetch("https://api.hubfit.com/v1/client-summaries?include=workouts%2Cnutrition&startDate=2026-10-20&endDate=2026-10-26", {
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/client-summaries",
headers={"Authorization": f"Bearer {os.environ['HUBFIT_API_KEY']}"},
params={
"include": "workouts,nutrition",
"startDate": "2026-10-20",
"endDate": "2026-10-26",
},
)
page = response.json()
data, next_cursor = page["data"], page["nextCursor"]{
"data": [
{
"client": {
"id": "6ad6af41d3199442d31b2743",
"name": "Jordan Miller"
},
"workouts": {
"workoutCount": 4,
"lastCompletedAt": "2026-10-26T14:32:05.000Z",
"totals": {
"setCount": 18,
"reps": 142,
"volume": 18450
},
"newPersonalRecordCount": 1,
"weightUnit": "lb"
},
"nutrition": {
"loggedDayCount": 6,
"lastLoggedDate": "2026-10-26",
"averageNutrients": {
"calories": 2350,
"proteinGrams": 180,
"carbsGrams": 240,
"fatGrams": 70,
"fiberGrams": 32,
"sugarGrams": 45,
"saturatedFatGrams": 22,
"monounsaturatedFatGrams": 28,
"polyunsaturatedFatGrams": 14
},
"averageTarget": {
"calories": 2350,
"proteinGrams": 180,
"carbsGrams": 240,
"fatGrams": 70
}
},
"habits": [
{
"id": "6ad6af3f8234ff3e82336c41",
"name": "10,000 steps a day",
"emoji": "🚶",
"goal": {
"type": "numeric",
"value": 10000,
"unit": "steps",
"period": "day"
},
"completedPeriodCount": 5,
"expectedPeriodCount": 7
}
],
"metrics": [
{
"id": "6ad6af776298037662967079",
"name": "Weight",
"unit": "lb",
"entryCount": 24,
"firstEntry": {
"id": "6ad6af5ec77bd15dc77a3e5c",
"date": "2026-09-28",
"value": 186.2
},
"lastEntry": {
"id": "6ad6af4305c6094205c47641",
"date": "2026-10-26",
"value": 182.4
},
"average": 184.1
}
],
"health": {
"source": "apple_health",
"lastSyncedAt": "2026-10-26T14:32:05.000Z",
"recordedDayCount": 7,
"averageSteps": 9120,
"averageActiveCalories": 540,
"averageSleepSeconds": 26100,
"averageRestingHeartRateBpm": 58
},
"checkIns": [
{
"name": "Weekly check-in",
"submissionCount": 4,
"lastSubmittedAt": "2026-10-26T14:32:05.000Z",
"lastSubmissionId": "6ad6af38570dcf37570c3c3a"
}
]
}
],
"nextCursor": "eyJpZCI6IjZhZDZhZjNmMjljNTk3ZjE1In0",
"totalCount": 48
}