# account.second_factor.revoke — Retirer un second facteur, le mot de passe actuel présenté : les autres sessions se ferment, et le dernier facteur emporte les codes de récupération.

> Engendrée depuis le registre. Ne pas modifier à la main.

§ 7.7.3. Sous une session de console. Un facteur en attente se retire aussi. Retirer le dernier facteur actif rend au compte une connexion par mot de passe seul, et efface ses codes de récupération.

| Propriété | Valeur |
| --- | --- |
| Niveau | `account` |
| Rang minimal | — |
| Rôle transversal | — |
| Portées | `org:admin` |
| Compte de service | ne la mène pas : elle est réservée à une personne |
| Réversibilité | E — réversible avec effort : validation d'une personne avant l'appel, puis cinq minutes pour tout défaire d'un seul appel |
| Idempotence | une clé d'idempotence est acceptée : le rejeu rend la première réponse |
| Limites de débit, par jeton | 600 appels par 60 secondes (`general`), et 60 appels par 60 secondes (`sensitive`) |

## API

`POST /v1/account/second-factors/{secondFactorId}/revoke` — succès en `200`.

| Paramètre | Où | Type | Requis | Description |
| --- | --- | --- | --- | --- |
| `secondFactorId` | chemin | texte, motif `^sfa_[0-9A-HJKMNP-TV-Z]{26}$` | oui | Identifiant de second facteur |
| `Idempotency-Key` | en-tête | texte, de 8 à 128 caractères | non | Clé d'idempotence. Un rejeu portant la même clé retourne le résultat initial sans nouvel effet de bord, et la réponse porte alors « Idempotency-Replayed: true ». Équivaut au champ « idempotencyKey » du corps ; les deux à la fois ne sont acceptés que s'ils sont identiques. |
| `currentPassword` | corps | texte, de 1 à 1024 caractères | oui | Le mot de passe actuel du compte. |
| `idempotencyKey` | corps | texte, de 8 à 128 caractères | non | Clé d'idempotence, obligatoire. Un rejeu portant la même clé rend le résultat initial, sans nouvel effet de bord. |

La réponse :

| Champ | Type | Description |
| --- | --- | --- |
| `secondFactorId` | texte, motif `^sfa_[0-9A-HJKMNP-TV-Z]{26}$` | Identifiant de second facteur |
| `removedAt` | texte, format date-time |  |
| `activeFactors` | entier, 0 au moins | Les facteurs actifs qui restent au compte. |
| `closedSessions` | entier | Les autres sessions du compte, fermées par ce changement. |
| `undoToken` | nul |  |

En-têtes de la réponse : `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, `RateLimit-Policy`, `Idempotency-Replayed`.

Autres réponses : `400`, `401`, `403`, `404`, `409`, `429`, `500`, `503` — communes à toute opération.

## Ligne de commande

`bastide account second_factor revoke --second-factor-id <valeur> --current-password <valeur>`

| Option | Type | Requise | Défaut | Description |
| --- | --- | --- | --- | --- |
| `--second-factor-id` | texte | oui | — | Identifiant de second facteur |
| `--current-password` | texte | oui | — | Le mot de passe actuel du compte. |
| `--idempotency-key` | texte | non | — | Clé d'idempotence, obligatoire. Un rejeu portant la même clé rend le résultat initial, sans nouvel effet de bord. |

La commande demande une confirmation avant d'agir, sauf avec « --yes ».

## MCP

Aucun outil : elle touche à l'identité d'une personne ou d'un compte — ses facteurs, ses sessions, ses jetons, ce que l'organisation exige de ses membres : un agent agit sous un jeton de soixante minutes au plus et ne se fabrique aucun accès durable (§ 6.4.3, EX-MCP-080).

## Erreurs

| Code | Surface | Cause |
| --- | --- | --- |
| `session_requise` | les deux | Ce geste ne se fait que sous une session de console, ouverte par un mot de passe : un jeton personnel ne le fait pas. |
| `mot_de_passe_actuel_invalide` | les deux | Le mot de passe actuel présenté n'est pas celui du compte. |
| `trop_de_tentatives` | les deux | Cinq échecs en quinze minutes pour ce compte depuis cette adresse : l'essai suivant attend. |
| `second_factor_required` | les deux | L'organisation exige un second facteur des rôles Propriétaire, Administrateur et Sécurité, et ce compte n'en tient aucun ; OU un rôle qui ouvre l'écriture SQL ou la gestion des clés (Mainteneur, Administrateur, Propriétaire) est attribué à un compte sans second facteur. |
| `idempotency_key_conflict` | API | Deux clés d'idempotence différentes ont été présentées, dans le corps et dans l'en-tête. |

S'y ajoutent les refus communs à toute opération — entrée invalide, authentification, autorisation, cible introuvable, conflit, limite de débit, indisponibilité — que le catalogue des erreurs décrit.

## Exemples

Retirer une application d'authentification perdue :

```json
{
  "secondFactorId": "sfa_01JQ8ZK4M7NP2RSTVWXYZ34567",
  "currentPassword": "le mot de passe du compte",
  "idempotencyKey": "retrait-totp-2026-10-03"
}
```
