
# Yaş politikasını değiştir

`PUT /v1/age-policy` · İzin `identity-settings:write`

Tüm yaş politikasını yazar. `If-Match` zorunludur (eksikse `428`, eşleşmiyorsa `412`); hiç yazılmamış bir politikanın sürümü `"0"`. Kurallar: `min_age` ve ülke eşikleri 13-21 arasındadır; ülke kodları ISO 3166-1 alpha-2 (büyük harf) olmalı ve en fazla 250 girdi içerebilir; `parental_consent_below` `null` veya 1..`min_age` olabilir; `store_birthdate` ancak `mode` `birthdate` ise `true` olabilir. Politika yalnızca sonraki hesap oluşturmalara uygulanır; mevcut kullanıcılar değişmez.

## İstek

JSON gövdesi (bilinmeyen alanlar `400 unknown_field` ile reddedilir):

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `If-Match` | header | evet | Başlık: `GET /v1/age-policy` içindeki `ETag` değeri. |
| `mode` | string | evet | `off`, `attestation` (doğum yılı ve ayı sorusu, değer saklanmaz) veya `birthdate`. |
| `min_age` | integer | evet | 13-21. |
| `country_min_age` | object | evet | Ülke kodu → eşik (13-21); eksik ülkeler `min_age` kullanır. |
| `country_source` | string | evet | `ip` veya `declared`. |
| `under_age_action` | string | evet | `block` veya `create_minor`. |
| `parental_consent_below` | integer \| null | hayır | `null` (ebeveyn onayı yok) veya 1..`min_age`. |
| `pending_consent_action` | string | evet | `block_sign_in` veya `issue_limited`. |
| `store_birthdate` | boolean | evet | `true` yalnızca `mode: birthdate` ile. |
| `applies_to` | string | evet | `self_signup` veya `all`. |

## Yanıt

`200 OK` ile politika ve `ETag` başlığı döner.

```json
{
  "mode": "attestation",
  "min_age": 16,
  "country_min_age": {"DE": 16, "FR": 15, "IT": 14},
  "country_source": "ip",
  "under_age_action": "block",
  "parental_consent_below": null,
  "pending_consent_action": "block_sign_in",
  "store_birthdate": false,
  "applies_to": "self_signup",
  "updated_at": "2026-10-05T09:30:00.123456Z"
}
```

## Belirteçler

`mode` `off` değilken, istenen kapsamlar ne olursa olsun ID belirteçleri, erişim belirteçleri ve UserInfo yanıtı kullanıcının `age_group` değerini taşır (`adult`, `minor` veya `unknown`); değeri olduğunda ise `parental_consent_status` (`not_required`, `pending`, `granted`, `denied` veya `revoked`) da taşınır. `mode: off` ile bu iki talep de verilmez. İkisi de yalnızca KeenAuth tarafından yazılır (kancalarınız ve talep şablonlarınız bunları ayarlayamaz); bunları `PATCH /v1/users/{user_id}` ile değiştirin.

`pending_consent_action: block_sign_in` altında, `parental_consent_status` değeri `pending`, `denied` veya `revoked` olan kullanıcıya belirteç verilmez: yetkilendirme isteği `access_denied` ile sonlanır ve belirteç uç noktası, yetkilendirme kodu, cihaz kodu ve yenileme belirteci akışları için `invalid_grant` (`Parental consent has not been granted.`) yanıtı verir. Yenileme belirteci iptal edilmez; onay `granted` olduğunda yeniden çalışır. `issue_limited` altında belirteçler verilir ve uygulamanız kullanıcıyı taleplerden kısıtlar.

## Hatalar

| HTTP | kod | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Gövdede bilinmeyen bir alan var. |
| 412 | `precondition_failed` | `If-Match` mevcut sürümle eşleşmiyor. |
| 415 | `unsupported_media_type` | İçerik türü `application/json` değil. |
| 422 | `validation_failed` | Bir alan eksik (`required`) veya yukarıdaki kurallardan birini bozuyor; işaretçi alanı gösterir, örneğin `/country_min_age/DE`. |
| 428 | `precondition_required` | `If-Match` başlığı 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/age-policy \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H 'If-Match: "0"' \
  -d '{"mode":"attestation","min_age":16,"country_min_age":{"DE":16,"FR":15},"country_source":"ip","under_age_action":"block","parental_consent_below":null,"pending_consent_action":"block_sign_in","store_birthdate":false,"applies_to":"self_signup"}'
```
