> ## Documentation Index
> Fetch the complete documentation index at: https://formcarry.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# What every form needs

> The endpoint applies the same rules to every submission, whatever sent it.

The endpoint applies the same rules to every submission. Every framework and builder page can assume them.

## Field names

Every field needs a `name`. Formcarry stores the value under that name, as sent. A field without a `name` is not sent by the browser at all.

Six names are read and not stored: `_gotcha` and `_next` (described in the Hidden inputs section), `submit`, and the captcha tokens `g-recaptcha-response`, `h-captcha-response` and `cf-turnstile-response`.

A submission with no fields, or only empty ones, is refused with a `403` that says "Form data can not be empty".

## The visitor's email

Name the visitor's address field `email`. Formcarry takes the first field whose name contains the word email or mail and whose value is an address, and uses it three times:

* as the reply to address of your notification email,
* as the recipient of the auto response, and
* as a signal for the spam filter.

Name it `email` rather than `contact` or `your address`, otherwise formcarry may not find it: the auto response *will not send* and replying to a notification goes nowhere.

## Hidden inputs

`_gotcha` is a honeypot. Add it hidden and leave it empty. Any submission that fills it is marked as spam:

```html theme={null}
<input type="text" name="_gotcha" style="display:none" tabindex="-1" autocomplete="off">
```

<Note>
  The `_next` field is for paid plans only.
</Note>

`_next` redirects the user to a specific page after they submit, just for this one submission form. It applies only when the form's thank you URL in the dashboard is empty, otherwise the dashboard URL wins:

```html theme={null}
<input type="hidden" name="_next" value="https://example.com/thanks">
```

## Files

<Note>
  Behavior varies depending on your plan. Free plans drop the files and stores the rest of the submission. Paid plans store files, up to the plan's file storage limit.
</Note>

To send files, set `enctype="multipart/form-data"` on the form. A field can carry several files. From JSON, a field whose value is a data URL, such as `data:image/png;base64,...`, is stored as a file.

## Limits

* 50 MB per request, files included.
* 1 submission per 15 seconds, per form, per IP address. Requests beyond that limit get a `429` with the message “Wait 15 seconds before making another request”.
* Over the plan's monthly submissions, formcarry holds the extra submissions aside until the first day of the next month and shows the visitor the thank you page as usual. Upgrading before then moves them into the form. The free plan holds up to 1,900 this way, paid plans hold up to 10,000. For anything beyond that limit, the endpoint answers `401` until the new month begins.

## Responses

With `Accept: application/json` every answer has the same shape: `code`, `status`, `title` and `message`. The HTTP status matches `code`.

| Status | When                                                                                        | What to do                                                                                            |
| ------ | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| `200`  | Stored.                                                                                     | Nothing.                                                                                              |
| `400`  | The hCaptcha or Turnstile token was rejected.                                               | Render the widget again and resend the token.                                                         |
| `401`  | Wrong form id, a paused form, a deactivated team, or the held submissions are at their cap. | Check the endpoint against the form's Setup page.                                                     |
| `403`  | No fields, or the reCAPTCHA token was rejected.                                             | Send at least one field with a value.                                                                 |
| `422`  | A validation rule failed. `errors` names each field with a message.                         | Show `errors[field].message` next to the field.                                                       |
| `429`  | A second submission within 15 seconds from the same address.                                | Wait 15 seconds, then send again.                                                                     |
| `500`  | A fault on formcarry's side.                                                                | Send again. If it repeats, write to [help@formcarry.com](mailto:help@formcarry.com) with the form id. |

<Warning>
  Without the header, visitors see formcarry's default message or your failure URL, if you set one.
</Warning>

## What's next

* [Thank you pages](/docs/features/thank-you-pages): show a branded confirmation message after every form submission.
* [Spam protection](/docs/features/spam-protection): the blocker, the filter and the honeypot.
* [File uploads](/docs/features/file-uploads): storage per plan and what a stored file looks like.

Stuck? Write to [help@formcarry.com](mailto:help@formcarry.com). Include the form id.


## Related topics

- [Framer](/docs/builders/framer.md)
- [Squarespace](/docs/builders/squarespace.md)
- [Webflow](/docs/builders/webflow.md)
- [Wix](/docs/builders/wix.md)
- [WordPress](/docs/builders/wordpress.md)
