How do I reply to someone who used the contact form?
Open the submission in the inbox and use the reply link. It opens a pre-addressed message in your own mail client, so the reply comes from your address and stays in your sent mail.
A contact form is only finished when someone answers it. This endpoint validates the address before accepting the message, keeps the thread in a private inbox, opens the reply in your own mail client, and can email you the moment one arrives.
A contact form usually collects a name, an address, and a message. Only two of those are enforced, because the address is what makes a reply possible.
{
"name": "Ada Lovelace",
"email": "ada@example.com",
"company": "Analytical Engines",
"message": "Could you send availability for a short call?"
}| Field | Rule |
|---|---|
| Required. Must contain a name, an @, and a dotted domain. | |
| message | Required. At least 3 characters after trimming. |
| Any other field | Optional. Stored as sent, trimmed, up to 5,000 characters. |
| website, _gotcha | Honeypots. If either is filled the submission is accepted and discarded. |
| _redirect | Optional. A URL on the submitting origin or the allow-list to return the browser to. |
The address is checked on the server, so a page that skips the type="email" attribute still cannot store an unreachable address. A message shorter than 3 characters is refused for the same reason: a contact form that captures "hi" and no way to answer is worse than one that captures nothing.
The reply comes from you, not from the form product, so it lands in the sender's inbox as an ordinary message with your address on it.
A contact endpoint is a public URL. The allow-list decides which sites a browser may post to it from.
https://example.com
https://www.example.comWith the list set, a post from any other site is refused with 403 before validation runs. Leave it empty while you are testing, then fill it in before you publish the form.
Be clear about what this does and does not do: browsers send an Origin header on cross-site form posts, so the list stops another site from using your endpoint. It is not authentication, and a direct server-to-server request that sends no Origin is not blocked by it.
A submission is stored first and notified second. If the notification cannot be sent, the submission is still in the inbox and the response says notificationSent: false — you never lose the message because an email failed.
If storage itself fails the endpoint answers 503 and says so, rather than returning a success for something it did not keep.
Nothing here comes with a service level attached: availability is not guaranteed and neither is the arrival of a notification email. For anything urgent or safety-critical, publish a monitored address alongside the form.
| Response | Meaning | When you get it |
|---|---|---|
| 201 Created | Accepted | The submission passed validation. The JSON body reports whether it was stored and includes an X-RateLimit-Remaining header. |
| 422 Unprocessable Content | Validation failed | A field limit was exceeded, a field name was unusable, or email and message did not pass their checks. The error string is safe to show a visitor. |
| 503 Service Unavailable | Storage unavailable | The submission was valid but the configuration lookup or the write did not complete. Nothing was silently dropped. |
A contact form should always say something back. Show the error sentence for a 422, ask the visitor to try again shortly for a 429 or 503, and thank them for anything else.
Worth reading before you build on it. These limits apply today.
Open the submission in the inbox and use the reply link. It opens a pre-addressed message in your own mail client, so the reply comes from your address and stays in your sent mail.
Yes. Set a notification address on the project and each stored submission is emailed to it. The submission response reports whether that email actually went.
Add your site's origins to the project allow-list. Browser posts from any other origin are refused with 403. It restricts sites, not servers — a request with no Origin header is not blocked.