OpenWAF Verify

Challenges issued, solved and failed by the browser challenge and the Verify widgets of a zone, siteverify answers and risk scoring.

Analytics of OpenWAF Verify on a zone, the browser challenge page (gate, rate limits, AI Crawl Control, under attack mode) and the widgets. The settings are the challenge block of the zone's edge settings.

OperationEndpoint
Get Verify analyticsGET /v1/orgs/{org}/zones/{zone}/challenge/analytics

Get Verify analytics

GET /v1/orgs/{org}/zones/{zone}/challenge/analytics

Returns, for the last days (1–30, default 7), the challenges issued, solved, failed, abandoned and solved with a click (interactive), the solve rate and solve time, failures by cause, siteverify answers, one row per trigger (gate, rate_rule, ai_agents, pipeline, crawler, under_attack) and per widget, and one per day. risk is the zone's risk scoring mode and thresholds and what it decided in the window, always present (zeros without data); in log mode its levels, escalations and blocks are what would have been applied. See Browser challenge analytics.

Required role: readonly or higher.

Parameters

NameInTypeRequiredDescription
orgpathstring (uuid)YesOrganization id. Every route checks that it is the token's organization (otherwise 404).
zonepathstring (uuid)YesZone id (see List zones).
daysqueryintegerNoUTC days ending today. Default 7. From 1 to 30.

Response

FieldTypeDescription
zonestring
daysinteger
fromstring (date-time)
tostring (date-time)
totalsobject
totals.issuedinteger
totals.solvedinteger
totals.failedinteger
totals.abandonedinteger
totals.interactiveinteger
totals.solve_ratenumber
totals.latency_p50_msinteger
totals.latency_p95_msinteger
totals.latency_mean_msinteger
failuresobject
failures.invalidinteger
failures.expiredinteger
failures.replayedinteger
failures.solutioninteger
failures.elsewhereinteger
siteverifyobject
siteverify.okinteger
siteverify.invalidinteger
siteverify.duplicateinteger
siteverify.expiredinteger
siteverify.bad_secretinteger
siteverify.remoteip_mismatchinteger
siteverify.errorinteger
by_labelarray of object
by_label[].sourcestringOne of interstitial, widget.
by_label[].widget_idstring
by_label[].widget_namestring
by_label[].labelstring
by_label[].issuedinteger
by_label[].solvedinteger
by_label[].failedinteger
by_label[].solve_ratenumber
by_label[].latency_p50_msinteger
by_label[].latency_p95_msinteger
by_label[].risk_levelsChallengeRiskLevels
dailyarray of object
daily[].datestring (date)
daily[].issuedinteger
daily[].solvedinteger
daily[].failedinteger
riskChallengeRiskReport
settingsZoneEdgeChallenge

Errors

StatusDescription
400Malformed request (bad_request).
404Not found, or not visible to the token (not_found).
503Not available right now (unavailable); retry later.

Example

No SDK method yet: use the HTTP request.

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/challenge/analytics?days=7" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "zone": "example.com",
  "days": 0,
  "from": "2026-10-27T09:30:00Z",
  "to": "2026-10-27T09:30:00Z",
  "totals": {
    "issued": 0,
    "solved": 0,
    "failed": 0,
    "abandoned": 0,
    "interactive": 0,
    "solve_rate": 0.5,
    "latency_p50_ms": 0,
    "latency_p95_ms": 0,
    "latency_mean_ms": 0
  },
  "failures": {
    "invalid": 0,
    "expired": 0,
    "replayed": 0,
    "solution": 0,
    "elsewhere": 0
  },
  "siteverify": {
    "ok": 0,
    "invalid": 0,
    "duplicate": 0,
    "expired": 0,
    "bad_secret": 0,
    "remoteip_mismatch": 0,
    "error": 0
  },
  "by_label": [
    {
      "source": "interstitial",
      "widget_id": "b37fe5d7-b6b8-4af4-ad93-0e98076dac07",
      "widget_name": "example",
      "label": "AI training",
      "issued": 0,
      "solved": 0,
      "failed": 0,
      "solve_rate": 0.5,
      "latency_p50_ms": 0,
      "latency_p95_ms": 0,
      "risk_levels": {
        "pass": 0,
        "harder": 0,
        "interactive": 0,
        "block": 0
      }
    }
  ],
  "daily": [
    {
      "date": "2026-10-27",
      "issued": 0,
      "solved": 0,
      "failed": 0
    }
  ],
  "risk": {
    "mode": "off",
    "thresholds": {
      "harder": 0,
      "interactive": 0,
      "block": 0
    },
    "evaluated": 0,
    "levels": {
      "pass": 0,
      "harder": 0,
      "interactive": 0,
      "block": 0
    },
    "scores": [
      0
    ],
    "top_signals": [
      {
        "signal": "example",
        "count": 128
      }
    ],
    "escalated": 0,
    "blocked": 0
  },
  "settings": {
    "pass_ttl_minutes": 720,
    "difficulty": 16,
    "pass_scope": "host",
    "color": "",
    "gate": {
      "enabled": false,
      "paths": [
        "/checkout"
      ],
      "pages": [
        "example"
      ]
    },
    "under_attack": {
      "enabled": false,
      "until": "2026-10-27T09:30:00Z",
      "hosts": [
        "www.example.com"
      ],
      "exempt_paths": [
        "example"
      ],
      "difficulty": 0,
      "pass_ttl_minutes": 0,
      "interactive": true
    },
    "risk": {
      "mode": "log",
      "thresholds": {
        "harder": 30,
        "interactive": 60,
        "block": 90
      }
    }
  }
}

Last updated:

↑↓ to navigate↵ to openesc to close