
# 年齢ポリシーを置き換える

`PUT /v1/age-policy` · 権限 `identity-settings:write`

年齢ポリシー全体を書き込みます。`If-Match` が必要です（欠落時は `428`、一致しない場合は `412`）。一度も書き込まれていないポリシーのバージョンは `"0"` です。ルール: `min_age` および国別しきい値は 13〜21 です。国コードは ISO 3166-1 alpha-2（大文字）で、最大 250 件です。`parental_consent_below` は `null` または 1..`min_age` です。`store_birthdate` は、`mode` が `birthdate` の場合にのみ `true` にできます。ポリシーは以降のサインアップにのみ適用され、既存のユーザーは変更されません。

## リクエスト

JSON ボディ（未知のフィールドは `400 unknown_field` で拒否されます）:

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `If-Match` | ヘッダー | はい | ヘッダー: `GET /v1/age-policy` の `ETag` 値。 |
| `mode` | 文字列 | はい | `off`、`attestation`（生年と生月を尋ねる中立的な質問、値は保存されません）、または `birthdate`。 |
| `min_age` | 整数 | はい | 13〜21。 |
| `country_min_age` | オブジェクト | はい | 国コード → しきい値（13〜21）。未指定の国は `min_age` を使用します。 |
| `country_source` | 文字列 | はい | `ip` または `declared`。 |
| `under_age_action` | 文字列 | はい | `block` または `create_minor`。 |
| `parental_consent_below` | 整数 \| null | いいえ | `null`（保護者の同意なし）または 1..`min_age`。 |
| `pending_consent_action` | 文字列 | はい | `block_sign_in` または `issue_limited`。 |
| `store_birthdate` | 真偽値 | はい | `mode: birthdate` の場合にのみ `true`。 |
| `applies_to` | 文字列 | はい | `self_signup` または `all`。 |

## レスポンス

ポリシーと `ETag` ヘッダーを含む `200 OK`。

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

## トークン

`mode` が `off` でない間、要求されたスコープに関係なく、ID トークン、アクセストークン、UserInfo レスポンスにはユーザーの `age_group`（`adult`、`minor`、または `unknown`）が含まれます。値がある場合は `parental_consent_status`（`not_required`、`pending`、`granted`、`denied`、または `revoked`）も含まれます。`mode: off` の場合は、どちらのクレームも発行されません。どちらも KeenAuth だけが書き込みます（お客様のフックやクレームテンプレートでは設定できません）。変更は `PATCH /v1/users/{user_id}` で行ってください。

`pending_consent_action: block_sign_in` の下では、`parental_consent_status` が `pending`、`denied`、または `revoked` のユーザーにはトークンが発行されません。認可リクエストは `access_denied` で終了し、トークンエンドポイントは認可コード、デバイスコード、リフレッシュトークンのグラントに対して `invalid_grant`（`Parental consent has not been granted.`）で応答します。リフレッシュトークンは取り消されません。同意が `granted` になると再び機能します。`issue_limited` の下ではトークンが発行され、お客様のアプリケーションがクレームからそのユーザーを制限します。

## エラー

| HTTP | コード | 発生条件 |
|---|---|---|
| 400 | `unknown_field` | ボディに未知のフィールドが含まれています。 |
| 412 | `precondition_failed` | `If-Match` が現在のバージョンと一致しません。 |
| 415 | `unsupported_media_type` | コンテンツタイプが `application/json` ではありません。 |
| 422 | `validation_failed` | フィールドが欠落している（`required`）か、上記のルールに違反しています。ポインターはフィールドを示します（例: `/country_min_age/DE`）。 |
| 428 | `precondition_required` | `If-Match` ヘッダーがありません。 |
| 401 | `unauthenticated` | 資格情報が存在しない、無効、または取り消されています。 |
| 403 | `insufficient_permissions` | 資格情報に必要な権限がありません。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` の期間を置いて再試行してください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できません。`Retry-After` の期間を置いて再試行してください。 |

## 例

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