Skip to content

Verification Settings

Console → WAF → [domain] → Protection — This page covers visitor verification and automatic protection settings. Every change takes effect immediately; there is no separate save button.


Choose the verification type applied to all visitors. JS Challenge and CAPTCHA cannot be active at the same time.

ModeWhat it doesWhen to use
OffNo verification; rules continue to runNormal traffic conditions
JS ChallengeHEIMWALL’s built-in JS challenge; no external provider neededDefault choice; quickly filters bots
CAPTCHAThird-party CAPTCHA provider; visual verificationMobile/API clients or clients that cannot execute JavaScript

When Auto-Protection is active, the system can temporarily switch the mode when the RPS threshold is exceeded. A live badge appears on the card in that case; your permanent selection is not changed.


You must configure a provider before the CAPTCHA mode can be enabled. Supported providers:

ProviderNotes
hCaptchaPrivacy-focused; free tier available
reCAPTCHA v2Google infrastructure; widely recognised
FriendlyCaptchaBot-proof, JavaScript-based; no user interaction required
MTCaptchaGDPR-compliant; European servers
ALTCHAOpen-source, proof-of-work based; no external service required
  1. Console → Protection → CAPTCHA Settings → Edit
  2. Select a provider from the list
  3. Obtain your Site Key and Secret Key from the provider’s dashboard (for ALTCHA: Challenge URL and HMAC Secret)
  4. Enter the keys and save

Choose the HTTP status code returned with the challenge page. The default is 503 Service Unavailable.

Why 503? Bots and crawlers interpret 503 as a temporary error; returning 200 would let them treat the challenge page as a successful response.

When should you change it? If another reverse proxy (e.g. Cloudflare, a second WAF) sits in front of HEIMWALL, it may log 503 as an error. Selecting 200 or 204 avoids that log noise.


Controls how long a visitor’s verification remains valid and how long the JS challenge page waits before appearing.

SettingDefaultRangeDescription
JS Clearance30 min5–1440 minA visitor who passes JS is not re-challenged for this duration
CAPTCHA Clearance60 min5–1440 minA visitor who passes CAPTCHA is not re-challenged for this duration
JS Delay1500 ms100–10000 msHow long the JS challenge page waits before the verification runs

CAPTCHA clearance is typically set longer than JS clearance because CAPTCHA is a stronger verification.

The JS delay gives legitimate browsers enough time to complete the verification; setting it too low can cause problems on slow connections.


Browsers send Sec-CH-UA and similar Client Hints headers on some requests. If these headers are inconsistent with the User-Agent, the visitor may be a bot or a tool disguised as a browser. This policy controls what happens in that case.

PolicyBehaviour
CompatibilityClient Hints are not checked; maximum compatibility (default)
BalancedInconsistencies are logged but no action is taken
StrictInconsistent Client Hints → selected action (CAPTCHA or Block)

Every request is automatically assigned a bot score from 0 to 100. You can run this engine in passive monitoring or automatic action (enforce) mode.

For a detailed explanation and threshold calibration, see Bot Score.


When requests per second (RPS) exceeds the configured threshold, the system automatically starts a challenge; when traffic returns to normal and the standby period elapses, it stops automatically.

SettingDescription
RPS ThresholdChallenge starts when requests per second exceed this value (10–5000)
StandbyHow many seconds after the threshold is crossed before the challenge activates (10–3600 s)
Challenge WindowHow long the challenge stays active after traffic normalises (60–3600 s)
Challenge TypeJS Challenge or CAPTCHA

Default values suit most scenarios. The parameters below are for fine-tuning when needed:

ParameterDefaultDescription
Velocity Factor×10A “velocity breach” is triggered when current RPS exceeds the historical baseline by this multiplier
Baseline Window300 sTime window over which the baseline RPS average is calculated
Minimum Baseline RPS50Auto-protection does not activate for traffic below this level
Minimum Pressure IPs20If the number of distinct IPs is below this, the event is not treated as an attack
Rearm Cooldown300 sWaiting period before the next trigger after the challenge closes

Circuit breaker: Automatically disables the challenge when the origin error rate rises — opening a challenge when the origin cannot respond is counterproductive.

ParameterDefaultDescription
CB Window60 sTime window over which the error rate is measured
Max Error Rate50%The circuit breaker trips when the error rate exceeds this
Min Samples5Minimum number of requests required before a decision is made
Half-Open Period30 sRetry window after the circuit breaker trips

A domain-wide request limit applied to all endpoints. Unlike rule-level rate limiting, this applies everywhere without any rule condition.

SettingDescription
Request CountMaximum requests allowed within the window
WindowDuration after which the counter resets (seconds)
IPv6 PrefixPrefix length used to group IPv6 addresses from the same network (/29–/64)

Requests from IPs that exceed this threshold before the window resets are rejected with 429 Too Many Requests.

For per-endpoint limits, see Rate Limiting.


Automatically and temporarily blocks IPs that repeatedly fail challenges or constantly hit rate limits.

SettingDescription
Failure CountIP is blocked after this many failures
WindowDuration over which failures are counted (minutes)
Block DurationHow long the IP stays on the blocklist (seconds)
IPv6 PrefixPrefix length used to group IPv6 addresses from the same network

The IP is removed automatically when the block duration expires; no manual action is required.