Form Submissions
Submitting a form is public — no API key required. Unlike votes and quiz attempts, respondents are anonymous and unlimited by default.
respondent_identifier is optional, and unlike Votes/Quiz attempts, the same respondent (or no identity at all) can submit as many times as they want — matching how feedback forms and surveys are normally used.
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /forms/{form}/submissions | public | Submit a form |
| GET | /forms/{form}/submissions | API key | List all submissions on a form |
| GET | /forms/{form}/submissions/identifier/{respondent_identifier} | API key | Find submission(s) by a respondent identifier |
| GET | /forms/{form}/submissions/{submission} | API key | Get a single submission |
| DELETE | /forms/{form}/submissions/{submission} | API key | Delete a submission |
/forms/{form}/submissions
Public
Submit a form
answers needs an entry for every required field (optional fields may be omitted entirely); no unknown or duplicate field_ids. Each value is validated against its own field's type — a string for text/textarea, a number for number, a real address for email, a parseable date string for date, one of the field's options for single_choice, a non-empty array of unique options for multi_choice, or an integer 1-5 for rating.
| Field | Type | Rules |
|---|---|---|
| respondent_identifier | string | Optional, max 255 — a string you choose to represent one of your end-users, purely for your own lookup. Never used to block a resubmission. |
| answers | array | Required (can be empty if every field is optional) |
| answers[].field_id | integer | Required, must belong to this form |
| answers[].value | varies | Required unless the field is optional — shape depends on the field's type |
| captcha_token | string | Required only if this form has requires_captcha: true (see Forms) — a token from your embedded Cloudflare Turnstile widget, verified server-side before the submission is accepted. |
curl -X POST https://qnaapi.com/api/v1/forms/1/submissions \
-H "Content-Type: application/json" \
-d '{
"respondent_identifier": "visitor-42",
"answers": [
{ "field_id": 1, "value": "Ada Lovelace" },
{ "field_id": 3, "value": "Friend" },
{ "field_id": 4, "value": 5 }
]
}'{
"data": {
"id": 1,
"form_id": 1,
"respondent_identifier": "visitor-42",
"answers": [
{ "field_id": 1, "value": "Ada Lovelace" },
{ "field_id": 3, "value": "Friend" },
{ "field_id": 4, "value": 5 }
],
"created_at": "2026-08-20T15:05:00.000000Z"
}
}Rate-limited to 30 requests/minute/IP, same as votes and quiz attempts.
requires_captcha: true, a missing, invalid, or Cloudflare-rejected captcha_token returns 422 Unprocessable Entity with a validation error on captcha_token. See Error Responses.
is_closed: true, or its response_limit has been reached — a submission is rejected with 422 Unprocessable Entity and a validation error on closed. Check is_accepting_responses on the form (see Forms) before showing your form to avoid this.
/forms/{form}/submissions, .../submissions/{submission}, .../submissions/identifier/{respondent_identifier}
API key
Read submissions
Requires your API key, scoped to your own forms — same shape as the submission response above, as a single object or a list.
curl -H "X-API-Key: qna_..." https://qnaapi.com/api/v1/forms/1/submissions
/forms/{form}/submissions/{submission}
API key
Delete a submission
curl -X DELETE -H "X-API-Key: qna_..." https://qnaapi.com/api/v1/forms/1/submissions/1
204 No Content on success.