# account.passkey.accept — Confirmer une clé d'accès en attente par ce que rend « navigator.credentials.create » : elle devient active, les autres sessions se ferment, et le premier facteur rend dix codes, une fois.

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

§ 7.7.3. La cérémonie est vérifiée : le défi émis, l'origine et la partie de confiance de la console, la présence et la vérification de l'utilisateur, un algorithme accepté. Seule la clé publique est gardée. Le premier facteur actif du compte rend dix 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/passkeys/{secondFactorId}/accept` — 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. |
| `clientDataJSON` | corps | texte, 4096 caractères au plus, motif `^[A-Za-z0-9_-]+$` | oui | « response.clientDataJSON », en base64url. |
| `attestationObject` | corps | texte, 16384 caractères au plus, motif `^[A-Za-z0-9_-]+$` | oui | « response.attestationObject », en base64url. |
| `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 |
| `state` | toujours `active` |  |
| `confirmedAt` | texte, format date-time |  |
| `recoveryCodes` | liste de de 10 à 10 éléments — chaque élément : texte, motif `^[0-9A-HJKMNP-TV-Z]{4}(-[0-9A-HJKMNP-TV-Z]{4}){3}$`, ou nul |  |
| `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 passkey accept --second-factor-id <valeur> --client-data-j-s-o-n <valeur> --attestation-object <valeur>`

| Option | Type | Requise | Défaut | Description |
| --- | --- | --- | --- | --- |
| `--second-factor-id` | texte | oui | — | Identifiant de second facteur |
| `--client-data-j-s-o-n` | texte | oui | — | « response.clientDataJSON », en base64url. |
| `--attestation-object` | texte | oui | — | « response.attestationObject », en base64url. |
| `--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 rend la valeur d'un secret, une seule fois, ou la refuse à tous : aucun outil MCP ne renvoie la valeur d'un secret, quelle que soit la portée du jeton (EX-MCP-070, EX-SEC-270).

## 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. |
| `cle_d_acces_refusee` | les deux | La clé d'accès n'a pas pu être enrôlée : la cérémonie n'a pas été faite pour cette console, pour ce défi, avec la vérification de l'utilisateur, ou par un algorithme accepté — ou la clé est déjà enrôlée. |
| `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. |
| `valeur_rendue_une_fois` | API | Ce que l'opération crée n'est rendu qu'au premier appel : la plateforme n'en garde pas de copie, et un rejeu ne peut pas le rendre. |

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

Confirmer la clé d'accès :

```json
{
  "secondFactorId": "sfa_01JQ8ZK4M7NP2RSTVWXYZ34567",
  "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIn0",
  "attestationObject": "o2NmbXRkbm9uZQ",
  "idempotencyKey": "confirmation-cle-2026-10-03"
}
```
