
# Enregistrer un consentement

`POST /v1/users/{user_id}/consent-records` · autorisation `consent-records:write`

Enregistre une acceptation obtenue dans votre propre canal (`method = management_api`). Le sujet est un document juridique (`subject_type = document` ; les finalités de consentement ne sont pas encore disponibles) et `state` vaut `presented`, `accepted` ou `declined`. La version, le hachage du contenu et la langue sont repris du document ; vous ne pouvez pas les fournir. `occurred_at` vaut par défaut la date et l'heure actuelles et ne peut pas être dans le futur ni dater de plus de 5 minutes. Les enregistrements sont en ajout seul : ils ne sont jamais modifiés ni supprimés.

## Requête

Paramètres de chemin :

| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| `user_id` | string | oui | Identifiant de l'utilisateur (`usr_…`). |

Corps JSON (les champs inconnus sont rejetés avec `400 unknown_field`) :

| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| `Idempotency-Key` | header | non | Clé facultative (16 à 64 caractères) qui rend sûre une requête relancée. |
| `subject_type` | string | oui | Uniquement `document`. |
| `subject_id` | string | oui | Identifiant du document juridique (`ldoc_…`) vu par l'utilisateur. |
| `state` | string | oui | `presented`, `accepted` ou `declined`. |
| `application_id` | string \| null | non | Application (`app_…`) ; si elle est omise et que le document est propre à une application, l'application du document est enregistrée. |
| `occurred_at` | string (date-time) | non | Moment de l'événement ; par défaut la date et l'heure actuelles, pas dans le futur, au plus 5 minutes avant. |

## Réponse

`201 Created` avec l'enregistrement de consentement.

```json
{
  "id": "crec_01j9xk3m7q8r2s4t6v8w0y2z4b",
  "user_id": "usr_01j9xk3m7q8r2s4t6v8w0y2z4c",
  "subject_type": "document",
  "subject_id": "ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "subject_version": "2026-10",
  "content_sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
  "locale": "en",
  "state": "accepted",
  "method": "management_api",
  "application_id": null,
  "occurred_at": "2026-10-05T09:31:12.004211Z"
}
```

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 400 | `unknown_field` | Le corps contient un champ inconnu. |
| 404 | `not_found` | L'utilisateur ou `application_id` n'existe pas dans cet environnement. L'extension `resource` indique lequel est manquant : `user` ou `application`. |
| 415 | `unsupported_media_type` | Le type de contenu n'est pas `application/json`. |
| 422 | `validation_failed` | Un champ est invalide : document inconnu (`/subject_id`, `unknown_subject`), `subject_type: purpose` (`not_supported`), un état non autorisé pour les documents, ou `occurred_at` hors plage. |
| 401 | `unauthenticated` | L'identifiant est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant ne dispose pas de l'autorisation requise. |
| 429 | `rate_limited` | La limite de débit a été dépassée ; réessayez après la période indiquée par `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez après la période indiquée par `Retry-After`. |

## Exemple

```bash
curl -X POST https://api.eu.keenauth.com/v1/users/usr_01j9xk3m7q8r2s4t6v8w0y2z4c/consent-records \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"subject_type":"document","subject_id":"ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a","state":"accepted"}'
```

## Données personnelles

Cet endpoint traite des données personnelles : enregistrements de consentement. [Données personnelles dans les API KeenAuth](/docs/policies/personal-data) décrit ce qui est stocké, la durée de conservation et la manière dont elles sont supprimées. N'envoyez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.
