Shield
Widget Modes
All three modes run the same verification pipeline — the only difference is what the visitor sees. No mode ever shows a puzzle.
Managed
RecommendedVerification is invisible for real users. If the humanity score of a background attempt is low, the widget escalates: it shows a single "I am human" confirmation, and the click triggers a harder proof-of-work challenge. Most visitors never see it.
Best for: signup, login, and checkout forms — anywhere you want maximum protection with a human fallback.
Non-Interactive
Background verification with a small status badge ("Verifying… / Verified") so visitors can see protection is active. Never asks for input — traffic that fails simply doesn't receive a token.
Best for: contact forms and comment boxes where a visible trust signal is useful.
Invisible
No visible widget at all. Verification runs on page load, or on demand via
the JS API
(edgeShield.execute()).
Because there is no visible element, there is no interactive escalation — low-scoring
traffic fails silently.
Best for: seamless UX on login pages and SPAs where you handle low scores server-side.
Setting the Mode
The mode is configured per widget in the dashboard (Shield → widget → Settings) and takes
effect on the next challenge issued — no redeploy needed. You can also override it
per-placement with data-mode:
<!-- Set per-widget in the dashboard, or override per-placement -->
<div class="edge-shield" data-sitekey="es_..." data-mode="invisible"></div> Data Attribute Reference
| Attribute | Default | Description |
|---|---|---|
data-sitekey | required | The widget's public sitekey |
data-mode | managed | managed, non-interactive, or invisible |
data-callback | — | Global function name called with the token on success |
data-error-callback | — | Global function name called with an error string |
data-expired-callback | — | Called when a token expires (the widget auto-refreshes afterwards) |
data-input-name | edge-shield-response | Name of the hidden form input the token is written to |
data-compat | — | Set to turnstile to also populate a cf-turnstile-response input |