# Configurar la política

> Elige una plantilla, fija la acción de cada categoría y clave de la política, haz excepciones para bots concretos y cambia entre modo registro y aplicar.

La política tiene una [acción](https://developers.openwaf.dev/es/ai-crawl-control/categories/#actions) por clave: las seis [categorías](https://developers.openwaf.dev/es/ai-crawl-control/categories/) configurables y las cinco [claves adicionales](https://developers.openwaf.dev/es/ai-crawl-control/categories/#policy-keys). La decisión para una petición es la excepción propia del bot, si la tiene; si no, la acción más fuerte de las claves que se le aplican.

## Valores por defecto

Todas las claves están en `log`, salvo `ai_search`, `ai_user_agent` y `search_engine`, que están en `allow`. Las personas siempre pasan.

## Plantillas

Una plantilla sustituye la política **entera**. El modo, `spoofed_challenge` y las excepciones por bot no cambian. Las claves de `policy` que envíes en el mismo cambio se aplican encima de la plantilla.

| Clave | `search_ok_block_training` | `verified_only` | `block_unverified_automation` |
|---|---|---|---|
| Nombre en el panel | Permitir buscadores e IA de búsqueda, bloquear entrenamiento | Solo verificados | Bloquear todo lo automatizado no verificado |
| `ai_training` | block | allow | log |
| `ai_search` | allow | allow | allow |
| `ai_user_agent` | allow | allow | allow |
| `search_engine` | allow | allow | allow |
| `unverified_automation` | log | challenge | block |
| `spoofed` | challenge | block | block |
| `unverified_bot` | log | block | log |
| `trap_hit` | log | challenge | block |
| `secret_probe` | log | block | block |
| `robots_violation` | log | log | block |
| `agent_burst` | log | challenge | block |

## Cambiar la política

**Panel**

**Control de rastreadores IA → Resumen → Configuración**: **Plantillas → Aplicar** y después ajusta la **Acción por categoría**. **Revisar y guardar** enseña las diferencias antes de guardar.
**CLI**

```sh
openwaf-cloud ctl zones set example.com ai_agents.template=search_ok_block_training ai_agents.policy.spoofed=block \
  --reason "Bloquear el entrenamiento y los rastreadores falsos"
```
**API**

`ai_agents` en un `PATCH …/edge` es un JSON merge patch: los objetos se mezclan (la política, clave a clave), las listas se sustituyen enteras y `null` devuelve un campo a su valor por defecto. `template` es de solo escritura.
```sh
curl -sS -X PATCH "https://dash.openwaf.dev/v1/orgs/$ORG/zones/example.com/edge" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Bloquear el entrenamiento y los rastreadores falsos" \
  -H "Content-Type: application/json" \
  -d '{"ai_agents": {"template": "search_ok_block_training", "policy": {"spoofed": "block"}}}'
```
**MCP**

`ai_agents_settings` con `{"zone": "example.com", "template": "search_ok_block_training", "patch": {"policy": {"spoofed": "block"}}, "reason": "…"}`. Sin `patch` ni `template` solo lee los ajustes.


## Excepciones por bot

`bot_overrides` (hasta 100 entradas `{bot_id, action}`) fija la acción de un bot del catálogo, sea cual sea su categoría. La lista se sustituye entera.

**Panel**

**Configuración → Excepciones por rastreador → Añadir rastreador**, elige el rastreador y su acción.
**CLI**

Pares `bot:acción` separados por comas; `""` quita todas las excepciones.
```sh
openwaf-cloud ctl zones set example.com ai_agents.bot_overrides=gptbot:block,ccbot:allow --reason "Política por bot"
```
**API**

```json
{"ai_agents": {"bot_overrides": [{"bot_id": "gptbot", "action": "block"}, {"bot_id": "ccbot", "action": "allow"}]}}
```
**MCP**

`ai_agents_settings` con `"patch": {"bot_overrides": [{"bot_id": "gptbot", "action": "block"}]}`.


## Registro y aplicar

| `mode` | Efecto |
|---|---|
| `log` (por defecto) | Las decisiones se calculan y se cuentan con `enforced: false`; el tráfico pasa. Los informes las enseñan como «se habría aplicado». |
| `enforce` | Las decisiones se aplican. |

La acción `tarpit` necesita `tarpit.enabled`; consulta [Trampa y laberinto](https://developers.openwaf.dev/es/ai-crawl-control/trap-and-tarpit/).

## Un nombre con su propia política

`hosts.<nombre>.ai_agents` sustituye entera la configuración de la zona para ese nombre; el primer cambio de un nombre parte de la configuración de la zona. En el panel, usa **Se aplica a** en la configuración; en MCP, pasa `host`; en la CLI, usa `--host`:

```sh
openwaf-cloud ctl zones set example.com --host shop.example.com ai_agents.mode=enforce --reason "Aplicar en la tienda"
```
