Skip to main content

Progress

Questionnaire submissions

Read a questionnaire a client filled in, such as an intake form, with their answers.

A questionnaire submission is one questionnaire a client filled in, such as an intake form, with their answers. Check-ins, which repeat on a schedule, are separate: see Check-in submissions.

Attributes

  • idstring

    Its unique ID.

  • namestring

    The questionnaire's name, as it was when the client filled it in.

  • clientobject
    Show 2 child attributes
    • idstring

      Its unique ID.

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

Questionnaire submission object
{
  "id": "6ad6af70a4050c71a4069f72",
  "name": "New client questionnaire",
  "client": {
    "id": "6ad6af41d3199442d31b2743",
    "name": "Jordan Miller"
  },
  "submittedAt": "2026-10-26T14:32:05.000Z",
  "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
    }
  ]
}
GET/v1/questionnaire-submissions/{submissionId}

One questionnaire a client filled in, with every answer, such as the one a questionnaire_submission.created webhook names. Requires clients:read.

Path parameters

Returns

The questionnaire submission.

GET /v1/questionnaire-submissions/{submissionId}
curl https://api.hubfit.com/v1/questionnaire-submissions/6ad6af70a4050c71a4069f72 \
  -H "Authorization: Bearer $HUBFIT_API_KEY"
Response200 OK
{
  "data": {
    "id": "6ad6af70a4050c71a4069f72",
    "name": "New client questionnaire",
    "client": {
      "id": "6ad6af41d3199442d31b2743",
      "name": "Jordan Miller"
    },
    "submittedAt": "2026-10-26T14:32:05.000Z",
    "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
      }
    ]
  }
}

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.