GET /api/v1/forms/{formId}/responses/{responseId}
state=submitted (default) returns immutable final answers, qualification suggestion and human triage. state=incomplete returns identity, frozen definition, saved answers, revision and saved dates. Only the requested form can expose the response.
Use x-api-key with an active organization-bound API key. Its holder keeps their current Organization, CASL and resource permissions.
| Role in the organization | Access |
|---|---|
| OWNER | Allowed |
| ADMIN | Allowed |
| MEMBER | Refused — 403 |
| Requirement | Rule |
|---|---|
| Business role | None; additional setter/closer roles do not grant access |
| Resource scope | Organization bound to the verified key |
| Participation | None |
| Resource state | Published valid draft for publication; otherwise the command determines state |
| Parameter | Type | Required | Description |
|---|---|---|---|
| formId | UUID | yes | Form in the key’s organization |
| responseId | UUID | yes | Response under that form |
state: submitted (default) or incomplete.
curl -X GET "https://your-school.cohorte.app/api/v1/forms/{formId}/responses/{responseId}" \
-H "x-api-key: YOUR_API_KEY"Success: 200. 400 invalid_request for malformed input or missing key; 401 unauthorized for invalid authentication; 403 forbidden for permission refusal; 404 not_found for missing or other-organization resources; 409 conflict for a conflicting state; 500 internal_error for an unexpected failure.
The envelope has success, data, and correlationId. data contains the chosen submitted or incomplete response. Neither exposes a resume credential.
{
"success": true,
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"candidateName": "Local Candidate",
"candidateEmail": "candidate@example.test",
"submittedAt": "2026-10-13T09:00:00.000Z",
"formId": "00000000-0000-4000-8000-000000000001",
"formTitle": "Applications",
"formVersion": 1,
"answersEarlierVersion": false,
"status": "untreated",
"score": null,
"followUpAt": null,
"followUpOverdue": false,
"decisionReason": null,
"qualification": null,
"answers": [
{
"questionKey": "goal",
"questionLabel": "Your goal",
"questionType": "long_text",
"position": 0,
"value": "Learn with an agent"
}
],
"siblings": [],
"notes": []
},
"correlationId": "00000000-0000-4000-8000-000000000002"
}state=submitted (default) returns immutable final answers, qualification suggestion and human triage. state=incomplete returns identity, frozen definition, saved answers, revision and saved dates. Only the requested form can expose the response.