List forms

GET/api/public/forms

List forms (questionnaires) created by the coach. Returns each form's metadata only; the questions are NOT included here. To read the questions of a form, call GET /forms/{formId}. Use type=registration for the intake questionnaire trainees fill in when they join, and type=update for recurring check-in forms.

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.

Query parameters

Query parameters
NameTypeDescription
typestring

Filter by form kind. "registration" is the join-time intake questionnaire; "update" is a recurring check-in form. Omit for both.

Allowed values: registration update

pageinteger

Page number (1-based, default 1)

Minimum: 1

limitinteger

Number of items to return (default 25, max 500)

Minimum: 1

Maximum: 500

Request examples

cURL
curl --request GET \
  --url 'https://api.coach-platform.com/api/public/forms' \
  --header 'Authorization: Bearer cp_live_...'
JavaScript (fetch)
const response = await fetch('https://api.coach-platform.com/api/public/forms', {
  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>"
    }
  ],
  "pagination": {
    "page": 123,
    "limit": 123,
    "total": 123,
    "hasMore": true,
    "truncated": true
  }
}
Response fields (24)
Response fields
NameTypeDescription
dataobject[]
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>
paginationobject
pagination.pagenumber
pagination.limitnumber
pagination.totalnumber | null

Total number of matching items. null when the underlying source cannot report an exact count for this page; use hasMore to keep paging.

pagination.hasMoreboolean
pagination.truncatedboolean

Present and true when the result set exceeded the in-memory scan cap and was truncated. Narrow your filters to page through all items.

Error responses

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 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.