Skip to content

Data processed by OpenWAF Verify

Last updated: October 29, 2026

This is an English translation provided for convenience. In case of any discrepancy, the Spanish version prevails.

Draft, pending legal review. This text describes what OpenWAF Verify does today, checked against its code. It has not yet been reviewed by a lawyer and may change.

In short

  • OpenWAF Verify checks that a browser did the work of a challenge. It does not try to identify the person.
  • Signals are evaluated in the edge node’s memory and dropped. Per-network counters live there for about 10 minutes. What Verify keeps after that is counts per site and per minute, with no IP address, for 30 days.
  • The «Check my browser» troubleshooting page keeps one record per check, with the network but never the full IP address, for 7 days, for support (section 2.9).
  • No canvas, WebGL, audio or font fingerprints, no high-entropy client hints, no persistent device identifier and nothing that follows a visitor across sites.
  • The only cookie on your site is __waf_pass, set by the challenge page. The widget sets no cookie. The «Check my browser» page uses a short test cookie on its own domain.
  • You are the controller and OpenWAF is your processor under the Data Processing Agreement. The draft DPA annex for Verify describes the same processing in contract form.

1. What OpenWAF Verify is

Verify is the challenge engine of the OpenWAF edge. It has three parts, all served on your own host under /__waf/ by the edge nodes that already proxy your site. The visitor’s browser never contacts another domain for it.

Risk scoring adds a score from 0 to 100 to each challenge. It is on in log mode (counts only, nothing applied) unless you turn it off. See risk scoring.

When a check fails, the challenge page and the widget link to «Check my browser», a troubleshooting page at verify.openwaf.dev (section 2.9). Visitors only open it by following that link, or one sent by support.

2. What is processed

2.1 On every challenge

DataWhat forHow long
IP address of the visitorTo bind the challenge to the visitor’s network, to look up its network (ASN) in a database on the node, to check it against the node’s threat feeds and the WAF’s IP reputation, and for per-IP rate limits of the Verify endpoints.In memory while the request is handled. Rate-limit counters: one-minute sliding windows, at most about two minutes.
Network prefix: the IPv4 /24 or IPv6 /64 of the addressThe challenge, the token and the pass are valid only from that network. Per-network counters of recent challenges, failures and replays.The challenge, the token and the counters use a hash of it; the __waf_pass cookie holds the prefix itself (section 4). Counters: about 10 minutes in the node’s memory.
Network (ASN) of the addressWhether it belongs to a list of hosting and datacenter networks; per-ASN counters of failed solves.Counters: about 10 minutes in the node’s memory.
Proof of work: the solutions and the time between issue and solveTo check the work and to spot solves faster than a browser can do them, or solves that keep taking the same time.Checked and dropped. The solve time feeds a histogram per site and minute.
Host and path of the requestTo issue the challenge for the right site and rule.Not kept by Verify.

2.2 With risk scoring on

The score is the sum of fixed weights of the signals that fired. The signals are a closed list of names. Server side: asn_hosting, ip_feed, ip_reputation, net_velocity, net_failures, asn_failures, net_replay, tls_mismatch, headers_missing, client_hints_mismatch, ua_automation, webdriver, solve_too_fast, solve_timing_repeat. Browser checks: cdp_runtime, native_patched, headless_env, worker_mismatch, click_dynamics, client_tampered. cdp_input is reserved and never fires. pat_valid lowers the score and fires only when Private Access Tokens are enabled (section 2.7). What each one looks at is in the signal list.

The counters behind net_*, asn_failures and the timing signals are kept per edge node, for every site that node serves, so a network that floods one site raises its score on another for about 10 minutes. They are not shared between nodes.

2.3 Challenge page

2.4 Widget

2.5 Browser checks

With risk scoring on, the challenge page and the widget run a few checks about automation frameworks: a DevTools protocol client attached to the page, built-in functions replaced by a script, a headless or emulated window, a Web Worker that describes a different browser than the page, and how the verification box was activated. Each check is compared inside the page. Only one bit per check leaves it (fired or not, ran or not), packed in a 32-bit number encoded for that challenge. The values compared, such as window sizes or the Worker’s user agent, are never sent.

2.6 Siteverify

2.7 Private Access Tokens, when enabled

Not enabled today: OpenWAF has no trusted token issuer configured, so the edge never asks for a token. When it is enabled, and only on zones with risk scoring on, the edge can ask a supporting device for a Private Access Token (Privacy Pass, RFC 9576, RFC 9577 and RFC 9578) from a public issuer, bound to that challenge and your host. The device obtains the token from its issuer on its own; the edge sends nothing to the issuer. The node checks the issuer’s signature with the issuer’s public key, shipped in its signed configuration. A valid token can only lower the risk score (signal pat_valid). It never raises it and never passes a challenge on its own. The token is checked and dropped, not stored; the analytics count only how many challenges had a valid one.

2.8 Single use

To make each challenge and token usable once on every node, the edge counts a hash of its random nonce on the node and on the control plane. These counters contain no personal data and expire with the challenge (10 minutes) or the token (300 seconds), plus 30 seconds.

2.9 «Check my browser» page

Check my browser is a troubleshooting page that OpenWAF runs at verify.openwaf.dev. The link of a failed check carries the host the visitor was on and the challenge’s short ID. Under an organization’s white-label brand there is no link. What each check means is in the Check my browser documentation.

The page reads nothing about the device beyond what it shows the visitor: no canvas, WebGL, audio or font data.

3. What Verify never collects

Set by the challenge page after a correct solution. The widget sets no cookie.

AttributeValue
ContentExpiry, the network prefix (for example 198.51.100.0/24), the host or zone it is valid for and the issue time, signed with a key of your zone. Nothing else identifies the visitor.
Lifetimepass_ttl_minutes of the zone: 12 hours by default, from 5 minutes to 7 days. While under attack mode is on, the lifetime set for that mode (also 5 minutes to 7 days).
FlagsHttpOnly, Secure, SameSite=Lax, Path=/.
DomainThe host that issued it, or the whole zone (Domain=example.com) with pass_scope: zone.

5. Purpose

Verify processes these data only to protect your service: to tell browsers from automated traffic, to slow down floods, credential stuffing and form spam, and to show you how your challenges perform. The «Check my browser» records serve only to troubleshoot failed checks for support. OpenWAF does not use them for advertising, does not build profiles of visitors, does not sell or share them, and does not use them for its own purposes, including improving its detection.

6. Where

7. How long

WhatWhereHow long
IP address, headers, ClientHello, solutions, browser-check answersNode memoryWhile the request is handled
Per-network (hash of the /24 or /64) and per-ASN countersNode memoryAbout 10 minutes (two 5-minute buckets)
Per-IP rate-limit counters of the Verify endpointsNodeOne-minute sliding windows, at most about two minutes
Single-use counters (hash of a nonce)Node and control plane10 minutes for a challenge, 300 seconds for a token, plus 30 seconds
Siteverify answers with an idempotency_keyMemory of the node or control plane300 seconds
__waf_pass cookieVisitor’s browser12 hours by default (5 minutes to 7 days)
Counts per site and minute, split by what served the challenge (the kind of rule, or the widget and its action): challenges issued, solved and failed by cause, solve-time histogram, siteverify results, risk levels, score buckets and signal names. No IP address.Control plane (Germany)30 days
«Check my browser» records: check ID, time, hosts, challenge ID, network (/24 or /64), browser family and major version, test-cookie result, network labels and check results. No full IP address.Edge node that served the page7 days, then deleted (the copy in the node log rotates like the log lines below)
__waf_check test cookie of «Check my browser»Visitor’s browser, on verify.openwaf.devUntil the check is recorded, at most 15 minutes
Node log lines of some challenge events: under attack mode (host, IP address, method and path, a short challenge ID), failed widget checks (host, IP address, the reason, a short challenge ID, the widget) and unverified crawler claims (crawler name, IP address, host). Crawler lines, under attack failures and widget failures are logged at most once per interval, except refused ticks of the widget; under attack solves are logged each time.Node logsRotated by size and overwritten, not archived

The rule or policy that sent a visitor to the challenge (a WAF score, a rate rule, AI Crawl Control) may record its own security event, with the IP address, user agent and JA4 fingerprint, like any other security event. AI Crawl Control records its own events for AI agents and crawlers with the same fields. Those events belong to the WAF and AI Crawl Control, not to Verify, and are deleted after 30 days, as the Data Processing Agreement says. They store the JA4 as a text string in the field tls_fingerprint, never the ClientHello, and leave it empty behind a trusted proxy or over plain HTTP. When a client follows the AI Crawl Control trap, the node also marks its IP address and a hash of its JA4 within its /24 or /64 for 24 hours.

8. Roles

You decide where Verify runs and why, so you are the controller. OpenWAF processes the data on your behalf as your processor under the Data Processing Agreement. If you are an agency acting for your clients, you are their processor and OpenWAF is your sub-processor. OpenWAF does not act as a controller of these data.

This section is a draft and has not been reviewed by a lawyer. It is not legal advice.

10. Sub-processors

Verify adds no sub-processor. It runs on the same infrastructure as the rest of OpenWAF Cloud: Hetzner (Germany) for the edge nodes, the control plane and the storage of the counts, Vultr (Madrid, Spain) for the Madrid edge node, and Cloudflare in transit as described in section 6. The full list is on the sub-processors page. No issuer of Private Access Tokens receives data from OpenWAF.

11. A paragraph for your privacy policy

You can adapt this text. Replace the bracketed parts.

To protect [this website] against automated abuse, some pages and forms use OpenWAF Verify, a security check provided by AI Services LLC (OpenWAF) as our processor. When it runs, your browser solves a small computing task, and OpenWAF’s servers in the European Union check it together with your IP address, the network it belongs to, your browser’s user agent and language headers, technical properties of your browser’s encrypted connection and a few yes/no checks about automation tools. These data are used only for security and are kept in memory for at most about 10 minutes; only counts without IP addresses are kept, for 30 days. The check may set a cookie named __waf_pass on [our domain], valid for [12 hours], so that you are not asked again. Our legal basis is our legitimate interest in keeping [this website] secure (article 6.1.f GDPR). More details: https://openwaf.dev/legal/verify-data/.

12. Contact

Questions about this page or about Verify: support@openwaf.dev. Visitors who want to exercise their rights should contact the website that showed the challenge; if they write to us, we forward the request to that customer, as section 7 of the Data Processing Agreement says.