
# Définir la date de fin d'une adhésion

`PATCH /fapi/v1/organizations/{org_id}/memberships/{membership_id}` · appelé depuis l'hôte de connexion de l'environnement

Définit ou supprime la date à laquelle une adhésion prend fin (`expires_at`), pour un écran de profil d'organisation. Lorsque cette date est dépassée, l'adhésion est supprimée et les sessions et jetons du membre dans le contexte de cette organisation sont révoqués. Un événement `membership_expiry_warned` est publié sept jours avant. Les rôles se modifient via [Définir les rôles d'un membre](/docs/api/fapi/organizations/memberships/set-roles) ; ce point de terminaison ne modifie que la date de fin.

Nécessite le cookie `__Host-idp_session` de l'utilisateur authentifié avec un `Origin` exact, ou un jeton d'accès API front d'une application de première partie (`Authorization: DPoP <token>` avec une preuve DPoP ; voir [Jeton d'accès API front](/docs/api/fapi/front-api-token)). L'utilisateur doit être un membre actif de l'organisation disposant des autorisations `idp_members:update_roles` et `idp_members:remove`. Un utilisateur qui n'est pas membre reçoit `404 not_found` ; un membre qui ne dispose pas des deux autorisations reçoit `403 insufficient_permissions`. Vous ne pouvez pas modifier votre propre adhésion ici (`403 insufficient_permissions`), et seul un membre détenant le rôle d'administrateur peut modifier un membre qui détient un rôle privilégié (`403 role_not_assignable`).

Avec `@keenauth/js` : `await keenauth.organizations.setMemberExpiry(orgId, membershipId, "2027-03-31T00:00:00Z", { expectedVersion: 3 })` ; passez `null` pour supprimer la date.

## Requête

En-têtes :

| En-tête | Requis | Description |
| --- | --- | --- |
| `Idp-Client` | oui | Identifiant du SDK. |
| `Origin` | oui, avec le cookie | `https://<sign-in host>`. |
| `If-Match` | non | Une version, `"<version>"`, issue de la liste des membres. Une version qui ne correspond pas, ou plusieurs versions, renvoie `412 precondition_failed`. |

`org_id` : l'identifiant de l'organisation (`org_…`). `membership_id` : l'identifiant de l'adhésion (`mem_…`).

Corps : `{"expires_at": "<RFC 3339 time>"}` ou `{"expires_at": null}` pour supprimer la date. `expires_at` est obligatoire. L'heure doit être future et au plus 365 jours après la création de l'adhésion.

## Réponse

`200 OK` avec l'adhésion (mêmes champs qu'un élément de [la liste des membres](/docs/api/fapi/organizations/memberships/list)) et `ETag: "<version>"`.

## Erreurs

| Statut | Code | Quand |
| --- | --- | --- |
| 400 | `unknown_field` | Le corps contient un champ autre que `expires_at`. |
| 400 | `malformed_request` | `If-Match` est mal formé. |
| 401 | `unauthenticated` | Aucun cookie de session ou jeton valide. |
| 403 | `insufficient_permissions` | L'utilisateur ne dispose pas de `idp_members:update_roles` ou `idp_members:remove`, ou l'adhésion est la sienne. |
| 403 | `role_not_assignable` | Le membre détient un rôle privilégié et l'utilisateur ne détient pas le rôle d'administrateur. |
| 403 | `origin_not_allowed` | Le `Origin` ne correspond pas. |
| 404 | `not_found` | Aucune organisation ou adhésion de ce type pour cet utilisateur ; un identifiant inconnu, mal formé ou étranger reçoit la même réponse. |
| 409 | `organization_disabled` | L'organisation est désactivée ou en attente de suppression (`organization_pending_deletion`). |
| 412 | `precondition_failed` | `If-Match` ne correspond pas à la version actuelle de l'adhésion. |
| 422 | `validation_failed` | `expires_at` est absent, n'est pas une heure RFC 3339, est passé, ou dépasse de plus de 365 jours la création de l'adhésion. |
| 503 | `service_unavailable` | Service temporairement indisponible ; réessayez après `Retry-After`. |

## Exemple

```bash
curl -X PATCH "https://example.keenauth.app/fapi/v1/organizations/org_01jbz6x8kq3m2n4p5r6s7t8v9a/memberships/mem_01jbz6x8kq3m2n4p5r6s7t8v9b" \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H 'If-Match: "3"' \
  -H "Content-Type: application/json" \
  -b cookies.txt \
  -d '{"expires_at": "2027-03-31T00:00:00Z"}'
```

```json
{
  "id": "mem_01jbz6x8kq3m2n4p5r6s7t8v9b",
  "user_id": "usr_01jbz6x8kq3m2n4p5r6s7t8v9c",
  "status": "active",
  "roles": [{ "role_id": "rol_01jbz6x8kq3m2n4p5r6s7t8v9w", "source": "admin_api" }],
  "created_at": "2026-11-03T09:00:00Z",
  "activated_at": "2026-11-03T09:00:00Z",
  "updated_at": "2026-11-03T11:00:00Z",
  "version": 4
}
```

## Données personnelles

Ce point de terminaison traite des données personnelles : adhésions et invitations aux organisations. [Données personnelles dans les API KeenAuth](/docs/policies/personal-data) décrit les données conservées, leur durée de conservation et leur suppression. N'envoyez pas de catégories particulières de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.
