Progress
Check-in submissions
Read your clients' check-ins with their answers, and review them with a comment.
A check-in submission is one completed check-in form, with the client's answers. To compare clients' check-ins over a period, use GET /client-summaries with include=checkIns.

Attributes
- idstring
Its unique ID.
- namestring
The check-in's title in the app, such as
Weekly check-in. - statusenumKnown values
awaiting_reviewreviewed - clientobject
When the submission arrived. The
submittedAfterandsubmittedBeforefilters use this.The day this check-in is for, as a calendar date. A client can fill in a missed check-in up to 14 days late and mark it for the day it was due; otherwise it's the day it was submitted, in the client's time zone. It's the date coaches see in the app.
The coach who reviewed it.
nulluntil it's reviewed.- reviewCommentstring
The review comment sent to the client. Empty if none.
- answersarray of objects
One shape per question type, told apart by
type.answeris the answer as text, empty if there's none, as for uploads and signatures. New question types can appear, and one not listed here hasquestion,typeandanswer.Show 10 child attributesHide child attributes
- questionstring
- typeenum
The kind of question, which decides the other fields. New types can appear.
Known valuestextnumberone_to_tenstar_ratingmetricyes_nodatemultiple_choiceprogress_photosmediasignature - answerstring
The answer as a number, or
nullif it isn't one. Only whentypeisnumber,one_to_ten,star_rating,metric.nullif the metric has no unit. Only whentypeismetric.The metric the answer was saved to, for
GET /metrics/{metricId}/entries.nullif it wasn't saved, as with a blank answer. Only whentypeismetric.nullif unanswered. Only whentypeisyes_no.- selectedOptionsarray of strings
Only when
typeismultiple_choice. - fileCountinteger
How many files the client uploaded. Only when
typeisprogress_photos,media. - signedboolean
Only when
typeissignature.
{
"id": "6ad6af25540e6a26540ffd23",
"name": "Weekly check-in",
"status": "awaiting_review",
"client": {
"id": "6ad6af41d3199442d31b2743",
"name": "Jordan Miller"
},
"submittedAt": "2026-10-26T14:32:05.000Z",
"checkInDate": "2026-10-26",
"reviewedAt": null,
"reviewedBy": null,
"reviewComment": "",
"answers": [
{
"question": "What went well this week?",
"type": "text",
"answer": "Hit every session and slept better."
},
{
"question": "How would you rate your energy, from 1 to 10?",
"type": "one_to_ten",
"answer": "8",
"value": 8
},
{
"question": "Your weight this morning",
"type": "metric",
"answer": "182.4",
"value": 182.4,
"unit": "lb",
"metricId": "6ad6af776298037662967079"
},
{
"question": "Did you hit your protein target every day?",
"type": "yes_no",
"answer": "Yes",
"answeredYes": true
}
]
}Attributes
- idstring
Its unique ID.
- statusstring
Always
reviewed. - reviewedAttimestamp
- clientNotifiedboolean
Whether the client was emailed your comment. False without a comment, or when the email failed; the comment is saved and shows in the client's app either way.
{
"id": "6ad6af9094a2ea9194a47d8e",
"status": "reviewed",
"reviewedAt": "2026-10-26T14:32:05.000Z",
"clientNotified": true
}https://api.hubfit.com/v1/check-in-submissionsCheck-in submissions, most recently submitted first. By default only those awaiting your review. Requires clients:read.
Query parameters
- statusenumOne of
awaiting_reviewreviewedallDefaultawaiting_review - clientIdstring
Only this client's submissions.
- submittedAftertimestamp
Only submissions received after this time, e.g.
2026-10-05T00:00:00Z(encode a+offset as%2B). To fetch what's new since your last run, pass the time of that run. - submittedBeforetimestamp
Only submissions received before this time.
- limitinteger
How many results to return, from 1 to 100.
Default25 - cursorstring
The
nextCursorfrom the previous page.
Returns
A page of submissions, without their answers.
curl -G https://api.hubfit.com/v1/check-in-submissions \
-H "Authorization: Bearer $HUBFIT_API_KEY" \
-d status=awaiting_reviewconst response = await fetch("https://api.hubfit.com/v1/check-in-submissions?status=awaiting_review", {
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/check-in-submissions",
headers={"Authorization": f"Bearer {os.environ['HUBFIT_API_KEY']}"},
params={
"status": "awaiting_review",
},
)
page = response.json()
data, next_cursor = page["data"], page["nextCursor"]{
"data": [
{
"id": "6ad6af25540e6a26540ffd23",
"name": "Weekly check-in",
"status": "awaiting_review",
"client": {
"id": "6ad6af41d3199442d31b2743",
"name": "Jordan Miller"
},
"submittedAt": "2026-10-26T14:32:05.000Z",
"checkInDate": "2026-10-26",
"reviewedAt": null,
"reviewedBy": null
}
],
"nextCursor": "eyJpZCI6IjZhZDZhZjNmMjljNTk3ZjE1In0",
"totalCount": 48
}https://api.hubfit.com/v1/check-in-submissions/{submissionId}A submission with its questions and answers. Answers are written by the client. Uploads are counted (fileCount) and a signature says whether the client signed (signed). None are linked. Requires clients:read.
curl https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23 \
-H "Authorization: Bearer $HUBFIT_API_KEY"const response = await fetch("https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23", {
headers: {
Authorization: `Bearer ${process.env.HUBFIT_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23",
headers={"Authorization": f"Bearer {os.environ['HUBFIT_API_KEY']}"},
)
data = response.json()["data"]{
"data": {
"id": "6ad6af25540e6a26540ffd23",
"name": "Weekly check-in",
"status": "awaiting_review",
"client": {
"id": "6ad6af41d3199442d31b2743",
"name": "Jordan Miller"
},
"submittedAt": "2026-10-26T14:32:05.000Z",
"checkInDate": "2026-10-26",
"reviewedAt": null,
"reviewedBy": null,
"reviewComment": "",
"answers": [
{
"question": "What went well this week?",
"type": "text",
"answer": "Hit every session and slept better."
},
{
"question": "How would you rate your energy, from 1 to 10?",
"type": "one_to_ten",
"answer": "8",
"value": 8
},
{
"question": "Your weight this morning",
"type": "metric",
"answer": "182.4",
"value": 182.4,
"unit": "lb",
"metricId": "6ad6af776298037662967079"
},
{
"question": "Did you hit your protein target every day?",
"type": "yes_no",
"answer": "Yes",
"answeredYes": true
}
]
}
}https://api.hubfit.com/v1/check-in-submissions/{submissionId}/reviewMarks a submission as reviewed. If you include a comment, the client receives it by email and push notification, exactly as when you review in the app. A submission can be reviewed once; reviewing it again returns 409 already_reviewed. An archived client's submissions can't be reviewed (409 client_archived). Requires check-ins:review.
Headers
- Idempotency-Keystring
Any unique string, such as a UUID, up to 255 characters. Retrying with the same key within 24 hours returns the first response instead of repeating the write. See Idempotency.
Path parameters
The submission's
id.
Body parameters
- commentstring
Your review comment, sent to the client. Can't be blank.
Returns
The submission is now reviewed.
curl -X POST https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23/review \
-H "Authorization: Bearer $HUBFIT_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"comment": "Great week, Jordan. Keep the step count up."
}'const response = await fetch("https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23/review", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HUBFIT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
comment: "Great week, Jordan. Keep the step count up.",
}),
});
const { data } = await response.json();import os
import uuid
import requests
response = requests.post(
"https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23/review",
headers={"Authorization": f"Bearer {os.environ['HUBFIT_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"comment": "Great week, Jordan. Keep the step count up.",
},
)
data = response.json()["data"]{
"data": {
"id": "6ad6af9094a2ea9194a47d8e",
"status": "reviewed",
"reviewedAt": "2026-10-26T14:32:05.000Z",
"clientNotified": true
}
}Subscribe a webhook endpoint to hear about these as they happen, instead of polling. An event carries the record's id and its clientId, not the record: fetch it with your key. See Webhooks.
- check_in_submission.createdA client submitted a check-in.
