5 minutes. Prefer dual-check with reCAPTCHA/Turnstile on sensitive actions.
Ask the Amen operator for siteKey (public) and secretKey (server-only), plus allowed origins and actions.
<div id="amen-captcha"></div>
<script src="https://challenge.amensecurity.ca/widget.js"></script>
<script>
AmenCaptcha.render('#amen-captcha', {
siteKey: 'YOUR_SITE_KEY',
action: 'login',
onToken(token) { window.__amenToken = token; }
});
</script>
Or React: copy AmenChallenge from Amen web / Inboxes and set publicBaseUrl="https://challenge.amensecurity.ca".
curl -sS -X POST 'https://challenge.amensecurity.ca/v1/verify' \
-H 'Content-Type: application/json' \
-d '{"secret":"YOUR_SECRET","token":"ac1.…","action":"login"}'
Reject unless success: true. Response may include soft risk / band (log it; don’t hard-ban on review alone).
GATE_MODE=balanced — PoW only after escalationGATE_MODE=soft — puzzle + honeypot onlyGATE_MODE=off — kill-switch (auto tokens)Mount only on forms (login, signup, send). Never gate public GET pages or sitemaps.
Contract lives in the Amen repo: Amen/captcha/docs/openapi.yaml. Live health: /health.