
# ディレクトリを更新

`PATCH /v1/directories/{directory_id}` · 権限 `directories:write`

JSON マージパッチ（RFC 7396、`Content-Type: application/merge-patch+json`）で、ディレクトリの名前とプロビジョニング設定を更新します。`If-Match` は必須で、現在の値は `GET /v1/directories/{directory_id}` の `ETag` ヘッダーです。どのフィールドも `null` を受け付けません。変更のないパッチは何も書き込まず、バージョンも維持されます。書き込みは `directory.updated` として監査され、変更された設定ごとに変更前と変更後の値が記録されます。

- 削除されていないユーザーレコードがあるディレクトリでは `provisioning_mode` を変更できません（`409 conflict`）。代わりにディレクトリを削除して作り直してください。
- `attribute_allowlist` は全体が置き換えられます。リストから外された属性は、同じトランザクションでディレクトリのユーザーレコードからも削除されます。
- `mass_deprovision_guard` は一部だけを更新できます。省略したサブフィールドは保持されます。

## リクエスト

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `directory_id` | パス | はい | SCIM ディレクトリ ID（`dir_…`）。 |
| `If-Match` | ヘッダー | はい | ディレクトリの現在の `ETag`。 |
| `name` | 文字列 | いいえ | 1〜64 文字。制御文字を含まず、先頭や末尾に空白を含まないこと。 |
| `provisioning_mode` | 文字列 | いいえ | `user_store`（環境のユーザー、組織のメンバーシップ、グループのロールも書き込む）または `mirror`（ディレクトリのレコードのみ保持）。 |
| `attribute_allowlist` | 配列 | いいえ | 保存する任意の SCIM 属性。重複不可: `title`、`usertype`、`phonenumbers`、およびエンタープライズ拡張の `employeenumber`、`department`、`division`、`costcenter`、`organization`、`manager`（完全名は `urn:ietf:params:scim:schemas:extension:enterprise:2.0:user:`）。 |
| `unverified_domain_action` | 文字列 | いいえ | メールドメインが検証されていないユーザーの扱い: `invite`（招待されたメンバーシップ）または `mirror_only`（ディレクトリのレコードのみ）。 |
| `delete_action` | 文字列 | いいえ | SCIM `DELETE /Users` の動作: `remove_membership` または `delete_user`（ディレクトリが管理するユーザーを削除）。 |
| `on_delete_memberships` | 文字列 | いいえ | ディレクトリを削除したとき、このディレクトリ由来のメンバーシップをどうするか: `keep`、`suspend`、`remove`。 |
| `mass_deprovision_guard` | オブジェクト | いいえ | `enabled`（真偽値）、`percent`（5〜50）、`absolute_min`（10〜1000）。5 分以内に両方のしきい値を超えるデプロビジョニングは、承認されるまで保留されます。 |
| `send_welcome_email` | 真偽値 | いいえ | 新しいディレクトリユーザーにアカウント有効化メールを送るかどうか。 |

## レスポンス

ディレクトリと新しい `ETag` を含む `200 OK`。

```json
{
  "id": "dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
  "organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "type": "scim",
  "name": "Okta EU",
  "state": "active",
  "base_url": "https://acme.eu.keenauth.app/scim/v2/dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
  "created_at": "2026-10-19T09:31:00.123456Z",
  "last_request_at": null,
  "provisioning_mode": "user_store",
  "attribute_allowlist": ["title", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:user:department"],
  "unverified_domain_action": "invite",
  "delete_action": "remove_membership",
  "on_delete_memberships": "keep",
  "mass_deprovision_guard": {"enabled": true, "percent": 20, "absolute_min": 25},
  "send_welcome_email": false
}
```

## エラー

| HTTP | code | 発生条件 |
|---|---|---|
| 400 | `malformed_request` | ボディが JSON オブジェクトではありません。 |
| 400 | `unknown_field` | パッチに書き込めないフィールドが含まれています（例: `state`）。 |
| 404 | `not_found` | この環境にディレクトリが存在しません。 |
| 409 | `conflict` | ユーザーレコードがあるディレクトリの `provisioning_mode` を変更しようとした、またはディレクトリが削除中です。 |
| 412 | `precondition_failed` | `If-Match` が現在のバージョンと一致しません。 |
| 415 | `unsupported_media_type` | `Content-Type` が `application/merge-patch+json` ではありません。 |
| 422 | `validation_failed` | フィールドが `null` または不正です。エラーにはフィールド名が含まれます（例: `/mass_deprovision_guard/percent` `invalid`）。 |
| 428 | `precondition_required` | `If-Match` がありません。 |
| 401 | `unauthenticated` | 認証情報がない、不正、または失効しています。 |
| 403 | `insufficient_permissions` | 認証情報に必要な権限がありません。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` の期間を置いて再試行してください。 |
| 503 | `service_unavailable` | ディレクトリの同期が一時的に利用できないか、このデプロイでは未設定です。`Retry-After` の期間を置いて再試行してください。 |

## 例

```bash
curl -i -X PATCH "https://api.eu.keenauth.com/v1/directories/dir_01j9xm2n4p6q8r0s2t4v6w8y0z" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H 'If-Match: "3"' \
  -H "Content-Type: application/merge-patch+json" \
  -d '{"name":"Okta EU","mass_deprovision_guard":{"percent":20}}'
```
