Submit a form (public)
Public submission endpoint.
Backend enforces required fields, disabled fields, and type-based validation.
For “select”, “multi-select”, and “multi-checkbox”, values must be taken from form options[].value.
If a field has relation, submitted values must be related submission ids from the target form.
one-to-one and many-to-one accept a single id string.
one-to-many and many-to-many accept an array of id strings.
Requires the x-tenant-id header (publicRoutes) and a valid x-service-status header
(enforceTenantStatus, otherwise 400/423/403). checkLimits("formSubmissions") applies the
tenant’s seat limit and rejects with 426 once the limit is reached. Status is always stored
as pending on this route; only /forms/{id}/internal-submit honours a body status.
Authorizations
Path Parameters
24-char hex identifier of the target form.
^[a-fA-F0-9]{24}$"{{objectId}}"
Body
Language code for storing this submission (e.g., "en"). Not validated against the form’s title keys by the service; use a configured code.
Key-value map where keys are form fields[].name. Validation rules per field type:
- email: valid email
- tel: international phone pattern
- number: numeric value
- checkbox/switch: boolean
- multi-checkbox/multi-select: array
- select: one of options[].value
CAPTCHA token received on the client from provider widget. Required only if the form has captcha.enabled=true.
Response
Submitted

