
# メンバーシップの終了日を設定

`PATCH /fapi/v1/organizations/{org_id}/memberships/{membership_id}` · 環境のサインインホストから呼び出されます

組織のプロフィール画面向けに、メンバーシップが終了する日付（`expires_at`）を設定または解除します。日付を過ぎると、メンバーシップは削除され、この組織のコンテキストにおけるメンバーのセッションとトークンは取り消されます。7 日前には `membership_expiry_warned` イベントが発行されます。ロールを変更するには [メンバーのロールを設定](/docs/api/fapi/organizations/memberships/set-roles) を使用します。このエンドポイントが変更するのは終了日のみです。

認証済みユーザーの `__Host-idp_session` Cookie（`Origin` が完全一致すること）、または First-party アプリの Front API アクセストークン（DPoP 証明付きの `Authorization: DPoP <token>`。[Front API アクセストークン](/docs/api/fapi/front-api-token) を参照）が必要です。ユーザーは、`idp_members:update_roles` と `idp_members:remove` の両方の権限を持つ、組織のアクティブなメンバーである必要があります。メンバーでないユーザーには `404 not_found` が返されます。両方の権限がないメンバーには `403 insufficient_permissions` が返されます。ここで自分自身のメンバーシップを変更することはできず（`403 insufficient_permissions`）、特権ロールを持つメンバーを変更できるのは管理者ロールを持つメンバーのみです（`403 role_not_assignable`）。

`@keenauth/js` を使う場合: `await keenauth.organizations.setMemberExpiry(orgId, membershipId, "2027-03-31T00:00:00Z", { expectedVersion: 3 })`。日付を解除するには `null` を渡します。

## リクエスト

ヘッダー:

| ヘッダー | 必須 | 説明 |
| --- | --- | --- |
| `Idp-Client` | はい | SDK の識別子。 |
| `Origin` | Cookie を使う場合はあり | `https://<sign-in host>`。 |
| `If-Match` | いいえ | メンバー一覧から取得した 1 つのバージョン `"<version>"`。一致しないバージョン、または複数のバージョンを指定すると `412 precondition_failed` が返されます。 |

`org_id`: 組織の識別子（`org_…`）。`membership_id`: メンバーシップの識別子（`mem_…`）。

ボディ: `{"expires_at": "<RFC 3339 time>"}`、または日付を解除する場合は `{"expires_at": null}`。`expires_at` は必須です。時刻は未来であり、メンバーシップ作成日から 365 日以内である必要があります。

## レスポンス

`200 OK` とメンバーシップ（[メンバー一覧](/docs/api/fapi/organizations/memberships/list) の項目と同じフィールド）、および `ETag: "<version>"` が返されます。

## エラー

| ステータス | コード | 発生条件 |
| --- | --- | --- |
| 400 | `unknown_field` | ボディに `expires_at` 以外のフィールドが含まれています。 |
| 400 | `malformed_request` | `If-Match` の形式が不正です。 |
| 401 | `unauthenticated` | 有効なセッション Cookie もトークンもありません。 |
| 403 | `insufficient_permissions` | ユーザーに `idp_members:update_roles` または `idp_members:remove` がない、またはメンバーシップがユーザー自身のものです。 |
| 403 | `role_not_assignable` | メンバーが特権ロールを持ち、ユーザーが管理者ロールを持っていません。 |
| 403 | `origin_not_allowed` | `Origin` が一致しません。 |
| 404 | `not_found` | このユーザーに対応する組織またはメンバーシップがありません。未知、形式不正、または他の組織の識別子も同じ応答になります。 |
| 409 | `organization_disabled` | 組織が無効化されているか、削除保留中（`organization_pending_deletion`）です。 |
| 412 | `precondition_failed` | `If-Match` がメンバーシップの現在のバージョンを指定していません。 |
| 422 | `validation_failed` | `expires_at` がない、RFC 3339 形式の時刻ではない、過去の日時である、またはメンバーシップ作成日から 365 日を超えています。 |
| 503 | `service_unavailable` | 一時的に利用できません。`Retry-After` の後に再試行してください。 |

## 例

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

## 個人データ

このエンドポイントは個人データを扱います。対象は組織のメンバーシップと招待です。[KeenAuth API における個人データ](/docs/policies/personal-data) では、保存される内容、保存期間、削除方法を説明しています。いかなるフィールドにも特別な種類の個人データ（健康、生体情報、宗教、政治的意見、性的指向）を送信しないでください。
