Analítica de OpenWAF Verify en una zona, la página del reto de navegador (barrera, límites de peticiones, control de rastreadores IA, modo bajo ataque) y los widgets. Los ajustes son el bloque challenge de los ajustes de borde de la zona.
| Operación | Ruta |
|---|---|
| Ver la analítica de Verify | GET /v1/orgs/{org}/zones/{zone}/challenge/analytics |
Ver la analítica de Verify
GET /v1/orgs/{org}/zones/{zone}/challenge/analyticsDevuelve, para los últimos days (1–30, 7 por defecto), los retos emitidos, resueltos, fallidos, abandonados y resueltos con un clic (interactive), la tasa y el tiempo de resolución, los fallos por causa, las respuestas de siteverify, una fila por disparador (gate, rate_rule, ai_agents, pipeline, crawler, under_attack) y por widget, y una por día. risk es el modo y los umbrales de la puntuación de riesgo de la zona y lo que decidió en la ventana, siempre presente (ceros sin datos); en modo log, sus niveles, escaladas y bloqueos son lo que se habría aplicado. Consulta la analítica del reto de navegador.
Rol necesario: readonly o superior.
Parámetros
| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
org | ruta | string (uuid) | Sí | Id de la organización. Cada ruta comprueba que es la del token (si no, 404). |
zone | ruta | string (uuid) | Sí | Id de la zona (consulta Listar zonas). |
days | consulta | integer | No | Días UTC terminando hoy. Por defecto 7. De 1 a 30. |
Respuesta
200: Devuelve ChallengeAnalytics.
| Campo | Tipo | Descripción |
|---|---|---|
zone | string | |
days | integer | |
from | string (date-time) | |
to | string (date-time) | |
totals | object | |
totals.issued | integer | |
totals.solved | integer | |
totals.failed | integer | |
totals.abandoned | integer | |
totals.interactive | integer | |
totals.solve_rate | number | |
totals.latency_p50_ms | integer | |
totals.latency_p95_ms | integer | |
totals.latency_mean_ms | integer | |
failures | object | |
failures.invalid | integer | |
failures.expired | integer | |
failures.replayed | integer | |
failures.solution | integer | |
failures.elsewhere | integer | |
siteverify | object | |
siteverify.ok | integer | |
siteverify.invalid | integer | |
siteverify.duplicate | integer | |
siteverify.expired | integer | |
siteverify.bad_secret | integer | |
siteverify.remoteip_mismatch | integer | |
siteverify.error | integer | |
by_label | array de object | |
by_label[].source | string | Uno de interstitial, widget. |
by_label[].widget_id | string | |
by_label[].widget_name | string | |
by_label[].label | string | |
by_label[].issued | integer | |
by_label[].solved | integer | |
by_label[].failed | integer | |
by_label[].solve_rate | number | |
by_label[].latency_p50_ms | integer | |
by_label[].latency_p95_ms | integer | |
by_label[].risk_levels | ChallengeRiskLevels | |
daily | array de object | |
daily[].date | string (date) | |
daily[].issued | integer | |
daily[].solved | integer | |
daily[].failed | integer | |
risk | ChallengeRiskReport | |
settings | ZoneEdgeChallenge |
Errores
| Estado | Descripción |
|---|---|
400 | Petición mal formada (bad_request). |
404 | No existe o el token no lo ve (not_found). |
503 | No disponible ahora (unavailable); reinténtalo más tarde. |
Ejemplo
Aún sin método en los SDK: usa la petición HTTP.
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/challenge/analytics?days=7" \
-H "Authorization: Bearer $OPENWAF_TOKEN"{
"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
}
}
}
}