Get a form with its questions

GET/api/public/forms/{formId}

Get one form including its full question set. Questions are grouped into steps: each entry of steps[] has a title and a fields[] array, and each field carries its label, fieldType, whether it is required, and its options where relevant. This is the endpoint that tells you what a trainee was actually asked; GET /forms only lists metadata.

Authentication

Requires an API key, sent as Authorization: Bearer cp_live_....

API keys carry scopes. Get the catalog of scopes and webhook events lists every scope.

Path parameters

Path parameters
NameTypeDescription
formIdrequiredstring

Request examples

cURL
curl --request GET \
  --url 'https://api.coach-platform.com/api/public/forms/<formId>' \
  --header 'Authorization: Bearer cp_live_...'
JavaScript (fetch)
const response = await fetch('https://api.coach-platform.com/api/public/forms/<formId>', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer cp_live_...',
  },
});

const data = await response.json();

Responses

200 OK

Successful response

Example body (application/json)
{
  "data": {
    "id": "<string>",
    "coach": "<string>",
    "title": "<string>",
    "description": "<string>",
    "type": "registration",
    "isActive": true,
    "registrationOrder": 123,
    "openAt": {
      "date": "<date-time>",
      "recurrence": "weekly",
      "openDays": 123
    },
    "target": "allTrainees",
    "targetLabels": [
      {
        "id": "<string>",
        "text": "<string>",
        "color": "<string>"
      }
    ],
    "createdAt": "<date-time>",
    "steps": [
      {
        "fields": [
          {
            "id": "<string>",
            "label": "<string>",
            "fieldType": "<string>",
            "isRequired": true,
            "placeholder": "<string>",
            "options": [
              "<string>"
            ],
            "multiple": true
          }
        ]
      }
    ]
  }
}
Response fields (27)
Response fields
NameTypeDescription
dataobject

A single form including its questions. Questions live under steps[].fields[], not at the top level.

data.idstring
data.coachstring
data.titlestring
data.descriptionstring
data.typestring

registration = the join-time intake questionnaire. update = a recurring check-in form.

Allowed values: registration update

data.isActiveboolean
data.registrationOrderinteger

Order this form is presented in during registration, when several registration forms exist.

data.openAtobject

When and how often the form opens for trainees.

data.openAt.datestring<date-time>
data.openAt.recurrencestring

How often the form reopens.

Allowed values: weekly bi-weekly tri-weekly monthly

data.openAt.openDaysinteger

How many days the form stays open once it opens.

data.targetstring

Who the form is shown to. byLabels targets trainees carrying at least one of targetLabels.

Allowed values: allTrainees males females byLabels

data.targetLabelsobject[]

Labels this form targets. Only present when target is byLabels.

data.targetLabels[].idstring
data.targetLabels[].textstring
data.targetLabels[].colorstring
data.createdAtstring<date-time>
data.stepsobject[]

The form’s pages, in order. Each holds the questions asked on that page.

data.steps[].fieldsobject[]
data.steps[].fields[].idstring
data.steps[].fields[].labelstring

The question text shown to the trainee.

data.steps[].fields[].fieldTypestring

How the question is answered, e.g. text, textarea, number, date, dropdown, checkbox, rating, slider, file, signature, weight, height, measurements, bodyFat, gender, dateOfBirth, activityLevel. contentBlock is not a question but static copy shown to the trainee.

data.steps[].fields[].isRequiredboolean
data.steps[].fields[].placeholderstring
data.steps[].fields[].optionsstring[]

Selectable values, for dropdown and similar field types.

data.steps[].fields[].multipleboolean

Error responses

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 409 Conflict
  • 429 Too Many Requests
  • 500 Internal Server Error

These statuses share the same response body.

Example body (application/json)
{
  "error": {
    "code": "<string>",
    "message": "<string>",
    "fix": "<string>",
    "details": {},
    "retryAfterMs": 123
  }
}
Error fields (6)
Error fields
NameTypeDescription
errorobject
error.codestring
error.messagestring
error.fixstring | null
error.detailsobject | null
error.retryAfterMsnumber | null

This page is also available as Markdown. Browse it in the interactive explorer or download the OpenAPI spec.