Docs
Pricing Log in
Documentation

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.

MethodEndpointAuthDescription
POST/forms/{form}/submissionspublicSubmit a form
GET/forms/{form}/submissionsAPI keyList all submissions on a form
GET/forms/{form}/submissions/identifier/{respondent_identifier}API keyFind submission(s) by a respondent identifier
GET/forms/{form}/submissions/{submission}API keyGet a single submission
DELETE/forms/{form}/submissions/{submission}API keyDelete a submission
POST /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.

FieldTypeRules
respondent_identifierstringOptional, max 255 — a string you choose to represent one of your end-users, purely for your own lookup. Never used to block a resubmission.
answersarrayRequired (can be empty if every field is optional)
answers[].field_idintegerRequired, must belong to this form
answers[].valuevariesRequired unless the field is optional — shape depends on the field's type
captcha_tokenstringRequired 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.
REQUEST — NO API KEY
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 }
    ]
  }'
201 CREATED
{
  "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.

If the form has 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.
If the form is closed — 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.
GET /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.

REQUEST
curl -H "X-API-Key: qna_..." https://qnaapi.com/api/v1/forms/1/submissions
DELETE /forms/{form}/submissions/{submission} API key

Delete a submission

REQUEST
curl -X DELETE -H "X-API-Key: qna_..." https://qnaapi.com/api/v1/forms/1/submissions/1

204 No Content on success.