
# Aggiorna le impostazioni della protezione dagli attacchi

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

Aggiorna l'oggetto di protezione dagli attacchi con un JSON merge patch (`application/merge-patch+json`, RFC 7396). `If-Match` è obbligatorio: se manca si ottiene `428`, se l'`ETag` è obsoleto `412`. Una patch che non modifica nulla non scrive nulla e mantiene l'`ETag`.

## Richiesta

| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| `If-Match` | header | sì | L'`ETag` dell'oggetto così come letto l'ultima volta. Se manca: `428`; se obsoleto: `412`. |
| corpo | oggetto | sì | Il merge patch. I campi sono elencati in [Sostituisci le impostazioni della protezione dagli attacchi](put.md). |

## Comportamento

- Le sezioni si uniscono ricorsivamente: inviate solo i campi che modificate.
- `null` rimuove un campo o un'intera sezione, riportandoli al valore predefinito. Le liste come `allowlist` e `allowed_countries` vengono sostituite per intero.
- L'oggetto unito viene verificato esattamente come un corpo `PUT`.

## Risposta

`200 OK` con l'oggetto, come in [Ottieni le impostazioni della protezione dagli attacchi](get.md), e il nuovo `ETag`.

## Errori

| HTTP | codice | Quando |
|---|---|---|
| 400 | `unknown_field` | Una sezione o un campo non fa parte dell'oggetto. `errors[]` elenca i puntatori. |
| 400 | `malformed_request` | Il corpo non è un JSON valido, oppure l'header `If-Match` è malformato. |
| 401 | `unauthenticated` | La credenziale è mancante, non valida o revocata. |
| 403 | `insufficient_permissions` | La credenziale non ha `attack-protection:write`. |
| 403 | `plan_feature_unavailable` | `risk_policy.mode` è `enforce` ma il piano non lo include; il corpo contiene `feature` e `required_plan`. |
| 412 | `precondition_failed` | L'oggetto è cambiato dopo la lettura. Leggetelo di nuovo e riprovate. |
| 413 | `payload_too_large` | L'oggetto supera 32 KiB. |
| 422 | `validation_failed` | Nell'oggetto unito un valore ha il tipo sbagliato o è fuori intervallo, oppure `block_threshold` non è maggiore di `challenge_threshold`. `errors[]` elenca i puntatori. |
| 422 | `below_security_floor` | Un valore è sotto la soglia minima di sicurezza. Ogni voce di `errors[]` indica campo e soglia in `detail`. |
| 422 | `allowlist_range_too_broad` | Un prefisso della lista di autorizzazione è più ampio di /8 (IPv4) o /32 (IPv6). |
| 428 | `precondition_required` | `If-Match` manca. |
| 429 | `rate_limited` | È stato superato il limite di frequenza; riprovate dopo il periodo indicato in `Retry-After`. |
| 503 | `service_unavailable` | Una dipendenza non è disponibile temporaneamente; riprovate dopo il periodo indicato in `Retry-After`. |

Se sono presenti più tipi di errore, viene restituito solo il più grave, in quest'ordine: `unknown_field`, `validation_failed`, `below_security_floor`, `allowlist_range_too_broad`, `plan_feature_unavailable`. I valori scritti non vengono mai restituiti nella risposta.

## Esempio

```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}'
```
