Skip to main content

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.

A check-in form, as clients fill it in.
In the HubFit appA check-in form, as clients fill it in.

Attributes

  • idstring

    Its unique ID.

  • namestring

    The check-in's title in the app, such as Weekly check-in.

  • statusenum
    Known valuesawaiting_reviewreviewed
  • clientobject
    Show 2 child attributes
    • idstring

      Its unique ID.

    • namestring
  • submittedAttimestampnullable

    When the submission arrived. The submittedAfter and submittedBefore filters use this.

  • checkInDatedatenullable

    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.

  • reviewedAttimestampnullable
  • reviewedByobjectnullable

    The coach who reviewed it. null until it's reviewed.

    Show 2 child attributes
    • idstring

      Its unique ID.

    • namestringnullable

      The coach's name. null if their account no longer exists.

  • The review comment sent to the client. Empty if none.

  • answersarray of objects

    One shape per question type, told apart by type. answer is the answer as text, empty if there's none, as for uploads and signatures. New question types can appear, and one not listed here has question, type and answer.

    Show 10 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
    • valuenumbernullable

      The answer as a number, or null if it isn't one. Only when type is number, one_to_ten, star_rating, metric.

    • unitstringnullable

      null if the metric has no unit. Only when type is metric.

    • metricIdstringnullable

      The metric the answer was saved to, for GET /metrics/{metricId}/entries. null if it wasn't saved, as with a blank answer. Only when type is metric.

    • answeredYesbooleannullable

      null if unanswered. Only when type is yes_no.

    • selectedOptionsarray of strings

      Only when type is multiple_choice.

    • fileCountinteger

      How many files the client uploaded. Only when type is progress_photos, media.

    • signedboolean

      Only when type is signature.

Check-in submission object
{
  "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
  • 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.

Review result object
{
  "id": "6ad6af9094a2ea9194a47d8e",
  "status": "reviewed",
  "reviewedAt": "2026-10-26T14:32:05.000Z",
  "clientNotified": true
}
GET/v1/check-in-submissions

Check-in submissions, most recently submitted first. By default only those awaiting your review. Requires clients:read.

Query parameters

  • statusenum
    One ofawaiting_reviewreviewedallDefault awaiting_review
  • clientIdstring

    Only this client's submissions.

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

  • Only submissions received before this time.

  • limitinteger

    How many results to return, from 1 to 100.

    Default 25
  • cursorstring

    The nextCursor from the previous page.

Returns

A page of submissions, without their answers.

GET /v1/check-in-submissions
curl -G https://api.hubfit.com/v1/check-in-submissions \
  -H "Authorization: Bearer $HUBFIT_API_KEY" \
  -d status=awaiting_review
Response200 OK
{
  "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
}
GET/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.

Path parameters

Returns

The submission.

GET /v1/check-in-submissions/{submissionId}
curl https://api.hubfit.com/v1/check-in-submissions/6ad6af25540e6a26540ffd23 \
  -H "Authorization: Bearer $HUBFIT_API_KEY"
Response200 OK
{
  "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
      }
    ]
  }
}
POST/v1/check-in-submissions/{submissionId}/review

Marks 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

  • 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

Body parameters

  • commentstring

    Your review comment, sent to the client. Can't be blank.

Returns

The submission is now reviewed.

POST /v1/check-in-submissions/{submissionId}/review
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."
  }'
Response200 OK
{
  "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.