Get your submission endpoint
- Create or open a contact form in Nautilus.
- Configure its fields, connected contact list, consent text, and notifications.
- Publish the form.
- Open Share, then Use your own form.
- Copy the endpoint and generated HTML. You can also copy the optional JavaScript for an in-page confirmation.
Email are not submission keys unless they are also the saved field IDs.
Use native HTML
Start with the HTML from Share so you keep the correct fields, required values, and consent text. A minimal example looks like this:FORM_ID and EMAIL_FIELD_ID with your saved IDs. Include every required field from your form. The browser displays the configured success title and message after an accepted submission.
Return to your website
To send visitors to a thank-you page, add this inside the form:303 redirect. Missing Origin headers and destinations on a different origin are rejected before saving.
For example, a form on https://www.example.com/contact can redirect to https://www.example.com/thank-you. It cannot redirect to https://example.com/thank-you or https://another.example/thank-you.
Submit with JavaScript or React
The optional sharing script submits the generated HTML withfetch, prevents concurrent submissions, captures campaign parameters, and displays errors or a confirmation in your page.
For a custom frontend, send a flat JSON object. Put each answer under its saved field ID; do not wrap answers in a data property.
new FormData(form) instead of JSON. Set Accept: application/json, omit the Content-Type header, and let the browser supply the multipart boundary. Only text values are supported.
JSON bodies always receive JSON. Other request formats receive JSON unless Accept requests HTML without also requesting JSON. With a JSON response, _redirect becomes redirectUrl; your frontend decides when to navigate.
Authentication and signup flows
Public submissions do not require an API key or a staff session. The published form ID permits submitting answers. It does not grant access to saved submissions or customer data. Password-protected forms also require_password in the request body. The sharing panel generates an empty password input; it does not embed the saved password.
Keep tenant API keys on your server. The public submission route supports cross-origin requests and
OPTIONS preflights without cookies or an Authorization header.
You can place a headless form alongside other steps in your own frontend. A submission does not sign the visitor in, create an authentication session, or verify their email or phone. Use the hosted flow for forms that require verification or POS enrollment; this endpoint does not provide separate verification steps that you can combine into a signup flow.
Map your answers
Nautilus validates answers against the saved form. Unknown field IDs and nested answer objects are rejected.
Phone normalization removes non-digits and keeps the last ten digits when the number is longer. For example,
+1 (202) 555-0123 is saved as 2025550123 in answers and downstream form data.
For a required checkbox group, select at least one option. Do not put native required on every checkbox in the group: the browser would require every option. The generated sharing HTML leaves this group check to the server.
Conditional visibility is evaluated on the server. Answers for fields hidden by those conditions are discarded. Your frontend must implement the corresponding show/hide behavior. Hidden input values are still client-controlled; do not use them as proof of identity or authorization.
Preserve attribution
Add tracking keys alongside your answers in the same flat request body:_utm_source, _utm_medium, _utm_campaign, _utm_term, _utm_content, _gclid, _gbraid, _wbraid, _fbclid, _referrer, and _landing_url.
They populate the existing attribution columns. They do not become form answers, and headless intake does not read Nautilus attribution cookies.
Tracking strings are trimmed to 450 characters when stored. Empty or malformed optional values are ignored individually without rejecting valid answers. The complete request must still fit within the 64 KiB body limit.
For example, add the current page and referrer to your request:
FormData before submitting.
Spam protection and limits
- Every request must include
_gotchaas a string. Keep this hidden bot-trap field empty for real visitors. - A filled trap receives an ordinary acknowledgment without a
submissionId. It creates no submission, contact, notification, or automation trigger. - The complete request body is limited to 64 KiB (65,536 bytes), including multipart overhead.
- File bodies and nested answer objects are not accepted.
- The form’s configured per-contact submission limit still applies.
Handle confirmation and retries
A saved submission returns a receipt such as:submissionId confirms that the submission was saved. Contacts, automation startup, fleet intake, and notifications use the existing processing behavior; the receipt does not guarantee that every downstream action completed or that an email reached an inbox.
Notifications are scheduled after confirmation, so a slow email provider does not hold up your receipt. Network failures can still leave the result unknown. Do not automatically retry: this endpoint has no request idempotency key. Check the form’s saved submissions before repeating an uncertain request.
Forms that need the hosted flow
The endpoint returns409 hosted_form_required for forms requiring email verification, POS enrollment, file uploads, or an unsupported saved field definition. Use the hosted link when Share indicates that headless submission is unavailable.
Null optional field settings are treated as omitted. For example, placeholder: null does not make a form unsupported. Malformed field definitions and comparison rules are still rejected.
The headless receipt does not reproduce hosted completion features such as voucher display, survey-incentive completion, or Meta/Dub browser conversion events. Use the hosted flow when you need those features, or implement the corresponding frontend integration where one is available.
Handle errors
JSON errors haveok: false, a code, an error message, and optional fieldErrors keyed by saved field ID. Native HTML submissions display an error page.
See Submit a form for request formats and response examples, or the API introduction for authenticated read access.

