Ajouter un utilisateur à une organisation
POST /v1/organizations/{org_id}/memberships · autorisation organizations:write
Ajoute directement un utilisateur existant à l'organisation (source admin_api, statut active). Sans role_ids, le rôle de membre par défaut de l'organisation est attribué ; chaque rôle doit être un rôle de l'environnement ou un rôle de cette organisation. La réponse contient un ETag ; l'écriture est journalisée sous organization_membership.created. Idempotency-Key est facultatif.
Requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
org_id |
chemin | oui | Identifiant de l'organisation (org_…). |
user_id |
string | oui | Identifiant de l'utilisateur (usr_…). |
role_ids |
string[] | non | Identifiants de rôles (rol_…), 50 au maximum. |
expires_at |
string | non | Date et heure RFC 3339 future de fin de l'appartenance. |
Réponse
201 Created avec l'appartenance.
{
"id": "mem_01j9xn5p9s0t4v6w8x0y2z4a6c",
"organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
"user_id": "usr_01j9xh2k6p7q1r3s5t7v9w1x3y",
"status": "active",
"source": "admin_api",
"reason": null,
"roles": [
{
"role_id": "rol_01j9xr7s1t2w6x8y0z2a4b6c8e",
"source": "admin_api",
"assigned_at": "2026-10-12T09:31:00.123456Z"
}
],
"expires_at": null,
"created_at": "2026-10-12T09:31:00.123456Z",
"activated_at": "2026-10-12T09:31:00.123456Z",
"suspended_at": null,
"removed_at": null,
"updated_at": "2026-10-12T09:31:00.123456Z",
"version": 1
}
Erreurs
| HTTP | code | Quand |
|---|---|---|
| 404 | not_found |
L'organisation ou l'utilisateur n'existe pas dans cet environnement. |
| 403 | role_not_assignable |
Un rôle n'est ni un rôle de l'environnement ni un rôle de cette organisation. |
| 403 | user_not_active |
L'utilisateur n'est pas actif. |
| 409 | membership_already_exists |
L'utilisateur est déjà membre de l'organisation. |
| 409 | organization_disabled |
L'organisation est désactivée. |
| 409 | organization_membership_limit_reached |
La limite de membres de l'organisation est atteinte. |
| 409 | membership_limit_reached |
La limite d'appartenances de l'utilisateur est atteinte. |
| 422 | anonymous_user_not_allowed |
L'utilisateur est anonyme. |
| 422 | validation_failed |
Un champ est absent ou invalide. |
| 401 | unauthenticated |
L'identifiant est absent, invalide ou révoqué. |
| 403 | insufficient_permissions |
L'identifiant ne dispose pas de l'autorisation requise. L'attribution d'un rôle privilégié (is_privileged) requiert aussi roles:write ; sans cette autorisation, rien n'est écrit et required_permissions liste les deux autorisations. |
| 429 | rate_limited |
La limite de débit a été dépassée ; réessayez après la durée indiquée par Retry-After. |
| 503 | service_unavailable |
Une dépendance est temporairement indisponible ; réessayez après la durée indiquée par Retry-After. |
Exemple
curl -i -X POST "https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/memberships" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"user_id":"usr_01j9xh2k6p7q1r3s5t7v9w1x3y","role_ids":["rol_01j9xr7s1t2w6x8y0z2a4b6c8e"]}'
Données personnelles
Cet endpoint traite des données personnelles : appartenances aux organisations et invitations. 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. N'envoyez de données personnelles sensibles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.