# OpenWAF Verify

> Retos emitidos, resueltos y fallidos del reto de navegador y de los widgets Verify de una zona, respuestas de siteverify y puntuación de riesgo.

Analítica de [OpenWAF Verify](https://developers.openwaf.dev/es/waf/verify-widget/) en una zona, la página del reto de navegador (barrera, límites de peticiones, control de rastreadores IA, [modo bajo ataque](https://developers.openwaf.dev/es/waf/under-attack/)) y los widgets. Los ajustes son el bloque `challenge` de los [ajustes de borde](https://developers.openwaf.dev/es/api/edge-settings/#update-zone-edge) de la zona.

| Operación | Ruta |
|---|---|
| [Ver la analítica de Verify](https://developers.openwaf.dev/es/api/verify/#get-challenge-analytics) | `GET /v1/orgs/{org}/zones/{zone}/challenge/analytics` |

## Ver la analítica de Verify

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

Devuelve, 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](https://developers.openwaf.dev/es/waf/verify-risk/#analytics) 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](https://developers.openwaf.dev/es/waf/browser-challenge/#analytics).

**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](https://developers.openwaf.dev/es/api/zones/#list-zones)). |
| `days` | consulta | integer | No | Días UTC terminando hoy. Por defecto `7`. De 1 a 30. |

#### Respuesta

- `200`: Devuelve [ChallengeAnalytics](https://developers.openwaf.dev/es/api/schemas/#challenge-analytics).

| 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](https://developers.openwaf.dev/es/api/schemas/#challenge-risk-levels) |  |
| `daily` | array de object |  |
| `daily[].date` | string (date) |  |
| `daily[].issued` | integer |  |
| `daily[].solved` | integer |  |
| `daily[].failed` | integer |  |
| `risk` | [ChallengeRiskReport](https://developers.openwaf.dev/es/api/schemas/#challenge-risk-report) |  |
| `settings` | [ZoneEdgeChallenge](https://developers.openwaf.dev/es/api/schemas/#zone-edge-challenge) |  |

#### 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.

```sh
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/challenge/analytics?days=7" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
```

```json
{
  "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
      }
    }
  }
}
```
