Skip to main content

Browser mode and server mode

A form accepts requests in one way or both, on the Security tab:

ModeSwitchWho sends it
Browser modeAccept submissions from browsersThe visitor's browser sends the form. This covers the embed snippet, the hosted page, and your own frontend posting to the desk.
Server modeAccept signed submissions from serversYour backend sends the request, signed with a secret. Use it when the request comes from your own app, so you can include facts the requester can't change, such as their user ID or plan. These arrive on the case under Data from the integration.

The desk tells the two apart by the request: one with signature headers or a bearer key is a server request, any other is a browser request.

Every submission goes through the checks of its mode before it becomes a case:

Submitted → Checks → Case created → Rules run → Confirmation sent
Checks → Refused: a check failed; the submission log says why
Case created → Held for review: the unit holds requests from people who aren't known contacts

Protecting browser mode​

SettingWhat it doesAt first
Allowed websitesOne origin per line, such as https://example.com. Only these sites can load and send the form; on others the snippet doesn't render. The hosted page on the desk is always allowed.
Cloudflare TurnstileAn invisible bot check. It needs the Turnstile keys under Settings → Installation (Bot protection).On
Honeypot fieldA hidden field that people don't see and bots fill in.On
Minimum time to fill inSubmissions sent faster than this (in seconds, 0 to 120) are treated as bots. With a minimum time set, a page left open for more than a day has to be reloaded before sending.2 seconds

[!WARNING] Without the Turnstile keys, every submission to a form with the check turned on is refused.

Protecting server mode​

  • Signing secrets: Create secret makes the first one. It starts with fsk_; the desk shows only its first and last characters afterwards. Rotate secret makes a new one; the previous one keeps working for 24 hours, so you can switch without downtime. Revoke stops a secret at once.
  • Also accept a plain bearer key: the secret sent as Authorization: Bearer fsk_… instead of a signature. Simpler, but anyone who sees the key can post. Off by default.
  • IP allowlist: tick the shared lists of your organization that this form accepts, and add Extra addresses for this form (addresses or ranges, one per line). Signed requests are accepted only from these addresses. The note below says which addresses apply; when the list is empty, requests are accepted from any address.

[!IMPORTANT] A new signing secret is shown once: copy it into your backend's configuration then.

IP allowlists protect server mode only. Browser requests come from your visitors and are never checked against them.

How to sign a request, the headers, the body and the answers are in Form submissions.

Rate limits​

These apply to both modes:

SettingWhat it limitsAt first
Requests per address and Per window ofHow many attempts one IP address may make in a window of seconds. Further attempts are refused until the window ends.5 per 600 seconds
Hourly capThe most cases the form creates in an hour, from all addresses together. When it's reached, the form pauses and every admin gets an email.200

[!WARNING] A paused form refuses requests until an admin opens it and picks Resume in the warning at the top. It doesn't resume by itself.