
# Enddatum einer Mitgliedschaft festlegen

`PATCH /fapi/v1/organizations/{org_id}/memberships/{membership_id}` · wird vom Anmeldehost der Umgebung aufgerufen

Legt das Datum fest, an dem eine Mitgliedschaft endet (`expires_at`), oder entfernt es, z. B. für eine Profilansicht der Organisation. Wenn das Datum erreicht ist, wird die Mitgliedschaft entfernt, und die Sitzungen und Token des Mitglieds im Kontext dieser Organisation werden widerrufen. Sieben Tage vorher wird ein Ereignis `membership_expiry_warned` veröffentlicht. Rollen ändern Sie mit [Rollen eines Mitglieds festlegen](/docs/api/fapi/organizations/memberships/set-roles); dieser Endpunkt ändert nur das Enddatum.

Erforderlich ist das Cookie `__Host-idp_session` des authentifizierten Benutzers mit einem exakten `Origin`, oder ein Front-API-Zugriffstoken einer First-Party-Anwendung (`Authorization: DPoP <token>` mit einem DPoP-Proof; siehe [Front-API-Zugriffstoken](/docs/api/fapi/front-api-token)). Der Benutzer muss aktives Mitglied der Organisation sein und sowohl die Berechtigung `idp_members:update_roles` als auch `idp_members:remove` besitzen. Ein Benutzer, der kein Mitglied ist, erhält `404 not_found`; ein Mitglied ohne beide Berechtigungen erhält `403 insufficient_permissions`. Ihre eigene Mitgliedschaft können Sie hier nicht ändern (`403 insufficient_permissions`), und nur ein Mitglied mit der Admin-Rolle kann ein Mitglied mit einer privilegierten Rolle ändern (`403 role_not_assignable`).

Mit `@keenauth/js`: `await keenauth.organizations.setMemberExpiry(orgId, membershipId, "2027-03-31T00:00:00Z", { expectedVersion: 3 })`; übergeben Sie `null`, um das Datum zu entfernen.

## Anfrage

Header:

| Header | Pflicht | Beschreibung |
| --- | --- | --- |
| `Idp-Client` | ja | SDK-Kennung. |
| `Origin` | ja, mit dem Cookie | `https://<Anmeldehost>`. |
| `If-Match` | nein | Eine Version, `"<version>"`, aus der Mitgliederliste. Stimmt die Version nicht überein oder werden mehrere Versionen angegeben, antwortet der Endpunkt mit `412 precondition_failed`. |

`org_id`: die Organisations-ID (`org_…`). `membership_id`: die ID der Mitgliedschaft (`mem_…`).

Body: `{"expires_at": "<RFC-3339-Zeitpunkt>"}` oder `{"expires_at": null}`, um das Datum zu entfernen. `expires_at` ist erforderlich. Der Zeitpunkt muss in der Zukunft liegen und höchstens 365 Tage nach der Erstellung der Mitgliedschaft.

## Antwort

`200 OK` mit der Mitgliedschaft (dieselben Felder wie ein Eintrag in [der Mitgliederliste](/docs/api/fapi/organizations/memberships/list)) und `ETag: "<version>"`.

## Fehler

| Status | Code | Wann |
| --- | --- | --- |
| 400 | `unknown_field` | Der Body enthält ein anderes Feld als `expires_at`. |
| 400 | `malformed_request` | `If-Match` ist fehlerhaft. |
| 401 | `unauthenticated` | Kein gültiges Sitzungs-Cookie oder Token. |
| 403 | `insufficient_permissions` | Dem Benutzer fehlt `idp_members:update_roles` oder `idp_members:remove`, oder die Mitgliedschaft ist die eigene. |
| 403 | `role_not_assignable` | Das Mitglied hat eine privilegierte Rolle, und der Benutzer hat nicht die Admin-Rolle. |
| 403 | `origin_not_allowed` | Der `Origin` stimmt nicht überein. |
| 404 | `not_found` | Für diesen Benutzer existiert keine solche Organisation oder Mitgliedschaft; eine unbekannte, fehlerhafte oder fremde ID führt zur selben Antwort. |
| 409 | `organization_disabled` | Die Organisation ist deaktiviert oder zur Löschung vorgesehen (`organization_pending_deletion`). |
| 412 | `precondition_failed` | `If-Match` nennt nicht die aktuelle Version der Mitgliedschaft. |
| 422 | `validation_failed` | `expires_at` fehlt, ist kein RFC-3339-Zeitpunkt, liegt in der Vergangenheit oder mehr als 365 Tage nach der Erstellung der Mitgliedschaft. |
| 503 | `service_unavailable` | Vorübergehend nicht verfügbar; wiederholen Sie die Anfrage nach `Retry-After`. |

## Beispiel

```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
}
```

## Personenbezogene Daten

Dieser Endpunkt verarbeitet personenbezogene Daten: Organisationsmitgliedschaften und Einladungen. [Personenbezogene Daten in den KeenAuth-APIs](/docs/policies/personal-data) beschreibt, was gespeichert wird, wie lange es aufbewahrt wird und wie es gelöscht wird. Senden Sie keine besonderen Kategorien personenbezogener Daten (Gesundheit, biometrische Daten, Religion, politische Meinungen, sexuelle Orientierung) in einem Feld.
