Get a form response
GET/api/public/forms/{formId}/response/{responseId}
Get a single submitted form response with its answers. Each answer carries the question label and field type alongside the value, so this alone shows what was asked and what was replied; questions the trainee skipped are absent, so compare with GET /forms/{formId} to see what went unanswered. Trainee personal details and phone number are included only when the key also has trainees:read.
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
| Name | Type | Description |
|---|---|---|
formIdrequired | string | |
responseIdrequired | string |
Request examples
curl --request GET \
--url 'https://api.coach-platform.com/api/public/forms/<formId>/response/<responseId>' \
--header 'Authorization: Bearer cp_live_...'const response = await fetch('https://api.coach-platform.com/api/public/forms/<formId>/response/<responseId>', {
method: 'GET',
headers: {
Authorization: 'Bearer cp_live_...',
},
});
const data = await response.json();Responses
200 OK
Successful response
{
"data": {
"id": "<string>",
"form": {
"id": "<string>",
"title": "<string>",
"type": "<string>"
},
"trainee": {
"id": "<string>",
"fullName": "<string>"
},
"responses": [
{
"field": "<string>",
"label": "<string>",
"fieldType": "<string>"
}
],
"status": "Pending",
"type": "update",
"createdAt": "<date-time>",
"updatedAt": "<date-time>"
}
}Response fields (17)
| Name | Type | Description |
|---|---|---|
data | object | A submitted form response. Trainee personal details and phone number are included only when the key also has trainees:read; coach private notes are never returned. |
data.id | string | |
data.form | object | The form this response belongs to. |
data.form.id | string | |
data.form.title | string | |
data.form.type | string | |
data.trainee | object | The trainee who submitted the response. |
data.trainee.id | string | |
data.trainee.fullName | string | |
data.responses | object[] | The submitted answers, one entry per form field. |
data.responses[].field | string | Field id from the form definition. |
data.responses[].label | string | Field label shown to the trainee. |
data.responses[].fieldType | string | Field type, e.g. text, number, file. |
data.status | string | Whether the coach has handled this response. |
data.type | string | Whether this is a periodic update or a registration submission. |
data.createdAt | string<date-time> | |
data.updatedAt | string<date-time> |
Error responses
400Bad Request401Unauthorized403Forbidden404Not Found409Conflict429Too Many Requests500Internal Server Error
These statuses share the same response body.
{
"error": {
"code": "<string>",
"message": "<string>",
"fix": "<string>",
"details": {},
"retryAfterMs": 123
}
}Error fields (6)
| Name | Type | Description |
|---|---|---|
error | object | |
error.code | string | |
error.message | string | |
error.fix | string | null | |
error.details | object | null | |
error.retryAfterMs | number | null |
More Forms endpoints
This page is also available as Markdown. Browse it in the interactive explorer or download the OpenAPI spec.