
# Obtenir les paramètres de protection contre les attaques

`GET /v1/attack-protection` · permission `attack-protection:read`

Renvoie l'objet de protection contre les attaques de l'environnement : force brute, limitation des IP suspectes, bourrage d'identifiants, protection contre les bots, mot de passe compromis, protection à l'inscription, protection SMS et politique de risque. Chaque section a deux vues : `configured` est ce que vous avez écrit, `effective` est la valeur en vigueur, avec les valeurs par défaut, le plancher de sécurité et votre plan appliqués. Une section que vous n'avez jamais écrite a `configured: {}`. L'en-tête de réponse `ETag` identifie le contenu de l'objet ; envoyez-le comme `If-Match` sur `PUT` et `PATCH`.

## Requête

Cette opération ne prend ni champ de chemin, ni de requête, ni de corps. L'environnement provient de l'identifiant.

## Réponse

`200 OK` avec l'objet et l'en-tête `ETag`.

```json
{
  "schema_version": 1,
  "brute_force": {
    "configured": {"max_failures": 10},
    "effective": {"mode": "enforce", "max_failures": 10, "window_minutes": 15, "lock_minutes": 15, "notify_user": true}
  },
  "risk_policy": {
    "configured": {"mode": "enforce"},
    "effective": {"mode": "log", "challenge_threshold": 4, "block_threshold": null, "notify_user_on_new_device": true}
  },
  "bot_protection": {
    "configured": {},
    "effective": {"mode": "risk_based", "provider": "altcha"}
  }
}
```

L'exemple est raccourci : chaque réponse contient les huit sections (`brute_force`, `suspicious_ip_throttling`, `credential_stuffing`, `bot_protection`, `breached_password`, `signup_protection`, `sms_protection`, `risk_policy`). Dans l'exemple, le plan n'inclut plus l'application du risque : le `enforce` configuré est conservé mais s'affiche comme `log`.

## Champs

| Champ | Type | Plage ou valeurs | Valeur par défaut | Plancher |
|---|---|---|---|---|
| `brute_force.mode` | texte | `log`, `enforce` | `enforce` | |
| `brute_force.max_failures` | entier | 5-100 | 20 | au plus 100 |
| `brute_force.window_minutes` | entier | 5-60 | 15 | |
| `brute_force.lock_minutes` | entier | 5-60 | 15 | au moins 5 |
| `brute_force.notify_user` | booléen | | `true` | |
| `suspicious_ip_throttling.mode` | texte | `log`, `enforce` | `enforce` | |
| `suspicious_ip_throttling.login_failures_per_ip_per_day` | entier | 10-10000 | 100 | |
| `suspicious_ip_throttling.signups_per_ip_per_hour` | entier | 1-20 | 20 | au plus 20 |
| `suspicious_ip_throttling.allowlist` | tableau de texte | jusqu'à 100 préfixes CIDR ; IPv4 pas plus large que /8, IPv6 pas plus large que /32 | `[]` | |
| `credential_stuffing.mode` | texte | `log`, `enforce` | `enforce` | |
| `credential_stuffing.attack_mode_auto` | booléen | | `true` | |
| `credential_stuffing.attack_mode_duration_minutes` | entier | 15-240 | 30 | |
| `bot_protection.mode` | texte | `off`, `risk_based`, `always` | `risk_based` | |
| `bot_protection.provider` | texte | `altcha` | `altcha` | |
| `breached_password.on_signup` | texte | `block` | `block` | `block` |
| `breached_password.on_password_change` | texte | `block` | `block` | `block` |
| `breached_password.on_login` | texte | `require_reset`, `notify` | `require_reset` | |
| `breached_password.notify_user` | booléen | | `true` | |
| `signup_protection.block_disposable_email` | booléen | | `true` | |
| `signup_protection.block_email_subaddress` | booléen | | `false` | |
| `signup_protection.max_signups_per_device_30d` | entier | 1-50 | 3 | |
| `sms_protection.allowed_countries` | tableau de texte | jusqu'à 250 codes ISO 3166-1 alpha-2 | `[]` (valeur du plan) | |
| `sms_protection.daily_cap` | entier \| null | 1-1000000 ; `null` est la valeur du plan | `null` | |
| `sms_protection.conversion_breaker` | booléen | | `true` | `true` |
| `risk_policy.mode` | texte | `log`, `enforce` (`enforce` requiert le plan Startup ou supérieur) | `log` | |
| `risk_policy.challenge_threshold` | entier | 3-8 | 4 | |
| `risk_policy.block_threshold` | entier \| null | 6-12, supérieur à `challenge_threshold` ; `null` désactive | `null` | |
| `risk_policy.notify_user_on_new_device` | booléen | | `true` | |

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 401 | `unauthenticated` | L'identifiant est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant n'a pas la permission requise. |
| 429 | `rate_limited` | La limite de débit est dépassée ; réessayez après la durée `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez après la durée `Retry-After`. |

## Exemple

```bash
curl https://api.eu.keenauth.com/v1/attack-protection \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```
