
# Kuruluş politikasını oluşturun veya değiştirin

`PUT /v1/organizations/{org_id}/policies/{policy_kind}` · izin `organizations:write`

Bir politika türünün tüm ayarlar nesnesini değiştirir. Kuruluş politikası, ortamın ayarından yalnızca daha sıkı olabilir. Plan kapısı sunucu tarafından uygulanır: `session` ve `ip_allowlist` türleri ile AAGUID izin listesi Enterprise planı gerektirir (geliştirme ortamlarında açıktır). Ayar içeriği yönetim denetim günlüğüne yazılır; `organization.updated` olayı bunu içermez.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `org_id` | yol | evet | Kuruluş kimliği (`org_…`). |
| `policy_kind` | yol | evet | Politika türü: `authentication_methods`, `mfa`, `phishing_resistant`, `sso_enforcement`, `session` veya `ip_allowlist`. Başka bir değer `404` döndürür. |
| `If-Match` | header | hayır | Politika mevcutsa zorunludur (son okumanın `ETag` değeri); politikayı oluşturmak için atlayın. `*`, mevcut bir politikayla eşleşir. |
| `settings` | nesne | evet | Türün ayarlar nesnesi. Türe göre alanlar: `authentication_methods`: `allowed_connection_ids` (`conn_…`), `allow_passkey`, `allow_password`; `mfa`: `required_for` (`none`, `admins`, `all`), `allowed_factors` (`totp`, `webauthn`, `sms`, `email`), `enrollment_grace_days` (0-30); `phishing_resistant`: `required_for`, `aaguid_allowlist` (en fazla 500); `sso_enforcement`: `mode` (`off`, `org_context`, `verified_domains`), `connection_ids` (`conn_…`), `bypass_user_ids` (`usr_…`, en fazla 2); `session`: `idle_minutes`, `absolute_minutes`, `refresh_idle_days`, `refresh_absolute_days`; `ip_allowlist`: `cidrs` (en fazla 100), `applies_to` (`admins`, `all`). |

İstek gövdesi:

```json
{
  "settings": {
    "required_for": "all",
    "allowed_factors": [
      "totp",
      "webauthn"
    ],
    "enrollment_grace_days": 7
  }
}
```

## Yanıt

Politika oluşturulduğunda `201 Created`, değiştirildiğinde `200 OK` döner; gövde politikanın kendisidir ve yanıt yeni `ETag` değerini içerir.

```json
{
  "organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "policy_kind": "mfa",
  "schema_version": 1,
  "settings": {
    "required_for": "all",
    "allowed_factors": [
      "totp",
      "webauthn"
    ],
    "enrollment_grace_days": 7
  },
  "updated_at": "2026-10-12T09:30:00.123456Z",
  "version": 1
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Gövdede şemada bulunmayan veya salt okunur bir alan var. |
| 403 | `plan_feature_unavailable` | Tür veya AAGUID izin listesi daha yüksek bir plan gerektiriyor; sorun `feature` ve `required_plan` içerir. |
| 404 | `not_found` | Kuruluş yok veya tür bilinmiyor. |
| 409 | `domain_not_verified` | `mode` `verified_domains` olan `sso_enforcement`, kuruluşta doğrulanmış bir alan adı gerektirir. |
| 409 | `connection_test_required` | `sso_enforcement` açılırken (`off` durumundan veya hiç politika yokken), `connection_ids` içindeki en az birinin mevcut yapılandırmasıyla son 24 saat içinde başarılı bir test girişi gerekir. Bir bağlantı testi çalıştırın (`POST /v1/connections/{connection_id}:test`) ve yeniden deneyin. |
| 409 | `organization_pending_deletion` | Kuruluş, self-servis silme işlemini bekliyor; önce silmeyi iptal edin. |
| 412 | `precondition_failed` | `If-Match`, mevcut sürümle eşleşmiyor veya bu türde politika yokken gönderildi ya da bu istek oluşturulurken başka bir istek politikayı oluşturdu; politikayı yeniden okuyun. |
| 422 | `validation_failed` | Bir ayar alanı bilinmiyor veya geçersiz; `errors[]`, `/settings/…` yolunu gösterir. |
| 422 | `policy_weaker_than_parent` | Ayar, ortamın ayarından daha zayıf; `errors[]` zayıf alanı gösterir. |
| 422 | `at_least_one_method` | `authentication_methods`, hiçbir oturum açma yöntemi bırakmıyor. |
| 428 | `precondition_required` | Politika mevcutken `If-Match` eksik. |
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz veya iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisi gerekli izne sahip değil. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl -X PUT https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/policies/mfa \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"settings":{"required_for":"all","allowed_factors":["totp","webauthn"]}}'
```
