
# Einstellungen des Angriffsschutzes aktualisieren

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

Aktualisiert das Angriffsschutz-Objekt mit einem JSON-Merge-Patch (`application/merge-patch+json`, RFC 7396). `If-Match` ist erforderlich: Fehlt es, gibt es `428`; ist das `ETag` veraltet, `412`. Ein Patch, der nichts ändert, schreibt nichts und behält das `ETag` bei.

## Anfrage

| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `If-Match` | Header | ja | Das `ETag` des Objekts, wie zuletzt gelesen. Fehlt: `428`; veraltet: `412`. |
| Body | Objekt | ja | Der Merge-Patch. Die Felder sind unter [Einstellungen des Angriffsschutzes ersetzen](put.md) aufgeführt. |

## Verhalten

- Abschnitte werden rekursiv zusammengeführt: Senden Sie nur die Felder, die Sie ändern.
- `null` entfernt ein Feld oder einen ganzen Abschnitt, der dadurch auf seinen Standardwert zurückfällt. Listen wie `allowlist` und `allowed_countries` werden insgesamt ersetzt.
- Das zusammengeführte Objekt wird genauso geprüft wie ein `PUT`-Body.

## Antwort

`200 OK` mit dem Objekt, wie in [Einstellungen des Angriffsschutzes abrufen](get.md), und dem neuen `ETag`.

## Fehler

| HTTP | Code | Wann |
|---|---|---|
| 400 | `unknown_field` | Ein Abschnitt oder Feld gehört nicht zum Objekt. `errors[]` listet die Pointer. |
| 400 | `malformed_request` | Der Body ist kein gültiges JSON, oder der Header `If-Match` ist fehlerhaft. |
| 401 | `unauthenticated` | Die Anmeldedaten fehlen, sind ungültig oder widerrufen. |
| 403 | `insufficient_permissions` | Den Anmeldedaten fehlt `attack-protection:write`. |
| 403 | `plan_feature_unavailable` | `risk_policy.mode` ist `enforce`, und der Tarif umfasst das nicht; der Body enthält `feature` und `required_plan`. |
| 412 | `precondition_failed` | Das Objekt hat sich seit dem Lesen geändert. Lesen Sie es erneut und versuchen Sie es noch einmal. |
| 413 | `payload_too_large` | Das Objekt ist größer als 32 KiB. |
| 422 | `validation_failed` | Ein Wert hat den falschen Typ oder liegt außerhalb des Bereichs, oder `block_threshold` ist nicht größer als `challenge_threshold`. `errors[]` listet die Pointer. |
| 422 | `below_security_floor` | Ein Wert liegt unterhalb der Sicherheitsuntergrenze. Jeder Eintrag in `errors[]` nennt Feld und Untergrenze in `detail`. |
| 422 | `allowlist_range_too_broad` | Ein Präfix der Allowlist ist breiter als /8 (IPv4) oder /32 (IPv6). |
| 428 | `precondition_required` | `If-Match` fehlt. |
| 429 | `rate_limited` | Das Ratenlimit wurde überschritten; nach der Zeit aus `Retry-After` erneut versuchen. |
| 503 | `service_unavailable` | Eine Abhängigkeit ist vorübergehend nicht verfügbar; nach der Zeit aus `Retry-After` erneut versuchen. |

Treten mehrere Fehlerarten auf, wird nur die schwerwiegendste zurückgegeben, in dieser Reihenfolge: `unknown_field`, `validation_failed`, `below_security_floor`, `allowlist_range_too_broad`, `plan_feature_unavailable`. Die geschriebenen Werte werden in der Antwort nie zurückgegeben.

## Beispiel

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