
# Actualizar la configuración de protección frente a ataques

`PATCH /v1/attack-protection` · permiso `attack-protection:write`

Actualiza el objeto de protección frente a ataques con un parche de fusión JSON (`application/merge-patch+json`, RFC 7396). `If-Match` es obligatorio: si falta, se devuelve `428`; si el `ETag` está desactualizado, `412`. Un parche que no cambia nada no escribe nada y conserva el `ETag`.

## Solicitud

| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| `If-Match` | encabezado | sí | El `ETag` del objeto tal como se leyó por última vez. Si falta: `428`; si está desactualizado: `412`. |
| cuerpo | objeto | sí | El parche de fusión. Los campos se enumeran en [Reemplazar la configuración de protección frente a ataques](put.md). |

## Comportamiento

- Las secciones se fusionan de forma recursiva: envíe solo los campos que cambia.
- `null` elimina un campo o una sección completa, que vuelve así a su valor predeterminado. Las listas como `allowlist` y `allowed_countries` se reemplazan por completo.
- El objeto fusionado se valida exactamente igual que un cuerpo de `PUT`.

## Respuesta

`200 OK` con el objeto, como en [Obtener la configuración de protección frente a ataques](get.md), y el nuevo `ETag`.

## Errores

| HTTP | código | Cuándo |
|---|---|---|
| 400 | `unknown_field` | Una sección o un campo no forma parte del objeto. `errors[]` enumera los punteros. |
| 400 | `malformed_request` | El cuerpo no es JSON válido o el encabezado `If-Match` está mal formado. |
| 401 | `unauthenticated` | La credencial falta, no es válida o fue revocada. |
| 403 | `insufficient_permissions` | La credencial no tiene `attack-protection:write`. |
| 403 | `plan_feature_unavailable` | `risk_policy.mode` es `enforce` y el plan no lo incluye; el cuerpo contiene `feature` y `required_plan`. |
| 412 | `precondition_failed` | El objeto cambió desde que lo leyó. Léalo de nuevo y reintente. |
| 413 | `payload_too_large` | El objeto supera 32 KiB. |
| 422 | `validation_failed` | En el objeto fusionado, un valor tiene un tipo incorrecto o está fuera de rango, o `block_threshold` no es mayor que `challenge_threshold`. `errors[]` enumera los punteros. |
| 422 | `below_security_floor` | Un valor está por debajo del mínimo de seguridad. Cada entrada de `errors[]` indica en `detail` el campo y su mínimo. |
| 422 | `allowlist_range_too_broad` | Un prefijo de la lista de permitidos es más amplio que /8 (IPv4) o /32 (IPv6). |
| 428 | `precondition_required` | Falta `If-Match`. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; reintente después del periodo indicado en `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; reintente después del periodo indicado en `Retry-After`. |

Si hay varios tipos de error, solo se devuelve el más grave, en este orden: `unknown_field`, `validation_failed`, `below_security_floor`, `allowlist_range_too_broad`, `plan_feature_unavailable`. Los valores escritos nunca se devuelven en la respuesta.

## Ejemplo

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/attack-protection \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "3f1c9a0b5d7e2a4c6b8d0e1f2a3b4c5d"' \
  -d '{"risk_policy": {"block_threshold": 9}, "sms_protection": null}'
```
