Mettre à jour un utilisateur

PATCH /v1/users/{user_id} · permission users:write

Met à jour un utilisateur à l'aide d'un JSON merge patch (Content-Type: application/merge-patch+json). Seuls les champs que vous envoyez sont modifiés. Les champs texte sont vidés avec null ou une chaîne vide ; email_verified et phone_verified ne peuvent pas être vidés ; address est remplacée dans son ensemble ; user_metadata et app_metadata sont fusionnées clé par clé, et une valeur null supprime cette clé ; si user_metadata ou app_metadata lui-même est envoyé à null, toutes ses données sont supprimées et il devient {}. Le statut ne peut pas être modifié ici ; utilisez le blocage et le déblocage. Un utilisateur en attente de suppression ne peut pas être mis à jour. If-Match est facultatif : lorsqu'il est envoyé, il doit correspondre à l'ETag actuel de l'utilisateur.

Requête

Paramètre Dans Obligatoire Description
user_id chemin oui Identifiant de l'utilisateur, préfixé usr_.
If-Match en-tête non L'ETag issu d'une lecture précédente.

Le corps accepte les mêmes champs que Créer un utilisateur, tous facultatifs, ainsi que les champs d'âge ci-dessous. Les champs inconnus sont rejetés avec unknown_field.

Âge et consentement parental

Lorsque votre propre processus de vérification de l'âge ou de consentement parental est terminé, enregistrez son résultat sur l'utilisateur à l'aide de ces champs. Ils sont aussi renvoyés sur chaque objet utilisateur ; null signifie que l'utilisateur n'a pas été évalué.

Champ Valeurs Remarques
age_group adult, minor, unknown Ne peut pas être vidé ; envoyez unknown lorsque l'âge n'est pas connu.
parental_consent_status not_required, pending, granted, denied, revoked null le vide. Toute valeur autre que not_required n'est acceptée que lorsque le age_group de l'utilisateur est minor.
age_assurance_level self_declared, birthdate_declared, third_party_verified null le vide. Indique le degré de fiabilité avec lequel votre processus a établi l'âge.

Une modification de age_group ou de parental_consent_status émet un événement user.updated. N'indiquez ni date de naissance ni numéro de document d'identité dans ces champs ou dans les métadonnées pour les compléter ; envoyez uniquement le résultat.

Réponse

200 OK. Le corps est l'objet utilisateur. L'en-tête ETag contient la version de l'utilisateur.

Les données personnelles sont masquées lorsque la clé ne dispose pas de l'autorisation users:read_pii : email devient a***@e***.com, phone_number ne conserve que ses 2 derniers chiffres (+**********67), name, given_name, family_name, middle_name et nickname deviennent des initiales (A. L.), username ne conserve que son premier caractère (a***), birthdate devient ****-**-** et address devient {"redacted": true}. user_metadata et app_metadata ne sont pas masquées.

{
  "id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
  "kind": "regular",
  "status": "active",
  "external_id": null,
  "username": null,
  "name": "Ada Lovelace",
  "email": "ada@example.com",
  "email_verified": true,
  "phone_number": null,
  "phone_verified": false,
  "age_group": "adult",
  "parental_consent_status": null,
  "age_assurance_level": "self_declared",
  "user_metadata": {},
  "app_metadata": {},
  "created_via": "admin_api",
  "created_at": "2026-01-15T09:30:00Z",
  "updated_at": "2026-01-15T09:30:00Z",
  "last_sign_in_at": null,
  "deletion_requested_at": null,
  "deletion_due_at": null
}

Erreurs

Chaque erreur est un corps application/problem+json avec un code stable.

HTTP code Quand
400 malformed_request, unknown_field Le patch n'est pas un objet JSON, ou un champ ne figure pas dans le schéma ; ou If-Match est mal formé.
409 conflict La valeur est déjà utilisée, ou l'utilisateur est en attente de suppression (errors[].code vaut user_pending_deletion).
412 precondition_failed If-Match ne correspond pas à la version actuelle.
415 unsupported_media_type Content-Type n'est pas application/merge-patch+json.
422 validation_failed Une valeur est invalide ou a un type incorrect ; errors[].pointer désigne le champ.
404 not_found L'utilisateur n'existe pas dans cet environnement (ou l'identifiant est mal formé).
401 unauthenticated La clé d'API est absente, invalide ou révoquée.
403 insufficient_permissions La clé ne dispose pas de l'autorisation users:write.
429 rate_limited La limite de débit a été dépassée ; respectez Retry-After.
503 service_unavailable Une dépendance est temporairement indisponible ; réessayez plus tard.

Exemple

curl -X PATCH https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{"name": "Ada King", "app_metadata": {"tier": "gold"}}'

Enregistrer un consentement parental accordé pour un mineur :

curl -X PATCH https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{"age_group": "minor", "parental_consent_status": "granted", "age_assurance_level": "third_party_verified"}'

Données personnelles

Cet endpoint traite des données personnelles : le profil de l'utilisateur final. Données personnelles dans les API KeenAuth décrit ce qui est stocké, la durée de conservation et la manière dont elles sont supprimées. Ne transmettez de catégories particulières de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.