---
title: "Submit stage 1 of a public form"
method: POST
path: "/public/forms/{org}/{form}/submit"
---

# Submit stage 1 of a public form

`POST /public/forms/{org}/{form}/submit`

## Request

- Base URL: `https://applytovolunteer.com`
- URL: `https://applytovolunteer.com/public/forms/{org}/{form}/submit`
- Auth: none required

Public stage-1 submit. No org API key. Anonymous calls need a Turnstile token in production. A failed check is 400 with error turnstile. A missing Turnstile configuration is 503. Dev and test skip verification. Keyless agents should use /mcp or POST /a2a instead of calling this route without a token. This route does not submit through /mcp or /a2a.

## Path parameters

- `org` string, required: Organization slug.
- `form` string, required: Form slug.

## Request body

- object: JSON object. turnstileToken is required in production. An org API key is not accepted in place of that token.
  - `answers` object[]: Answers for the stage. Omitted answers are treated as an empty list. Required fields on the stage still fail validation.
    - `fieldId` string, required: Field id on the published version.
    - `value` union, required: String, number, boolean, array of strings, object, or null.
      - string
      - number
      - boolean
      - string[]
      - object
  - `honeypot` string: Omit this. A non-empty string returns { ok: true } and does not save the application.
  - `turnstileToken` string, required: Cloudflare Turnstile token. Required in production. Dev and test (ENVIRONMENT exactly dev or test) skip verification. A failed check is 400 with error turnstile. A missing Turnstile configuration is 503 with error turnstile_misconfigured. This token is not an org API key.
  - `applicantEmail` string: Applicant email. Checked when the stage requires an email field or a value is present.
  - `applicantName` string: Applicant name. Checked when the stage requires a name field.
  - `source` string: Pass "embed" for an embedded form. Any other value is stored as hosted.
  - `stageId` string: Stage to submit. Omitted uses the first stage.
  - `submissionId` string: Optional idempotency key. A string of 8 to 64 letters, numbers, underscores, or hyphens is stored. Any other value is ignored and does not fail the request. 32 or more characters can rotate a continue link when the same submission is retried.

## Response `200`

Public stage-1 submit

## Other responses

- `400`: The body, query, or input failed validation.
- `403`: The organization is still a demo, or the form is not published. Submissions stay off until the organization is claimed.
- `404`: The resource does not exist, or it is hidden from this caller. Several organization routes return 404 instead of 401 when the key is missing or the row is in another organization.
- `409`: The write conflicts with the current state.
- `413`: The body is larger than 256 KiB.
- `429`: Too many requests from this network or organization.
- `503`: Turnstile is not configured, or a required parser is unavailable.

---

[API](https://skmtc.dev/applytovolunteer/apis/apply2volunteer-api.md) · [All operations](https://skmtc.dev/applytovolunteer/apis/apply2volunteer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/applytovolunteer/apis/apply2volunteer-api/revisions/23df1ec8c88d?raw)
