高リスク機能のための年齢保証
特定の管轄区域における特定の権限は、有効にする前に確認済み年齢が必要です。たとえば、ブラジル(BR)の loot-boxes-paid-cosmetic-only、loot-boxes-paid-gameplay-impacting、targeted-ads、および profiling は verifiedAgeThreshold が 18 である必要があります。これらの権限はデフォルトで無効になっており、年齢要件のために確認済みと見なされるプラットフォームシグナルまたは専用の年齢保証チャレンジ(CHALLENGE_SESSION_UPGRADE_BY_AGE_ASSURANCE)によってのみ解除できます。
このページの目的
以下を理解する必要がある場合にこのページを使用してください:
- プレイヤーがすでに年齢ゲートを通過した後も権限が無効のままである理由
POST /session/upgradeが権限を即座に有効にするか、チャレンジを返すか- 閾値を満たしているがまだ年齢を確認していないプレイヤーへの対応方法
- 閾値を下回る年齢を最初に申告したプレイヤーの回復方法
確認済み年齢閾値
verifiedAgeThreshold とは、申告または推定された年齢ではなく、確認済み年齢が必要であることを意味します。
現在の主な例は:
- ブラジル(
BR):loot-boxes-paid-cosmetic-only、loot-boxes-paid-gameplay-impacting、targeted-ads、およびprofilingは確認済み年齢18が必要;direct-marketingは確認済み年齢12が必要
verifiedAgeThreshold を持つ権限は:
managedBy: GUARDIANになることはない- プレイヤーが十分な年齢だが確認がまだ必要な場合は
managedBy: PLAYER - プレイヤーが閾値を下回っている場合は
managedBy: PROHIBITED
これは現在、前述のリストのブラジル権限に適用されます。追加の管轄区域が確認済み年齢要件を追加する場合、同じ権限モデルが適用されます。
権限状態のロジック
権限に verifiedAgeThreshold がある場合、Permission オブジェクトにそのフィールドが含まれます:
{
"name": "loot-boxes-paid-gameplay-impacting",
"enabled": false,
"managedBy": "PLAYER",
"verifiedAgeThreshold": 18
}
| プレイヤーの年齢と閾値の比較 | 年齢確認済み? | managedBy | enabled |
|---|---|---|---|
| 閾値未満 | N/A | PROHIBITED | false |
| 閾値以上 | いいえ | PLAYER | false |
| 閾値以上 | はい(確認済みプラットフォームシグナル経由) | PLAYER | true |
| 閾値以上 | はい(年齢保証経由) | PLAYER | true |
閾値のある権限は managedBy: GUARDIAN になることはありません。保護者の同意では解除できません。
セッションの ageVerification
確認済みプラットフォームシグナルが処理されるか、年齢保証チャレンジが完了すると、セッションに ageVerification オブジェクトが保存されます:
{
"ageVerification": {
"verifiedAge": 18,
"platformName": "apple-ios",
"declarationType": "governmentIDChecked",
"verifiedAt": "2026-03-14T00:00:00Z"
}
}
この確認は再利用可能です。セッションに記録されると、同じかより低い閾値を持つ権限に対する後続の POST /session/upgrade 呼び出しは、通常新しいチャレンジなしで満たすことができます。
セッションアップグレードフロー
POST /session/upgrade は、プレイヤーが高リスク権限を即座に取得できるか、先に確認が必要かを決定するエンドポイントです。
セッションアップグレードAPI
関連するリクエストフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
platformAgeSignal | PlatformAgeSignal | 閾値を即座に満たすことができるプラットフォームシグナル |
options | object | 年齢保証エクスペリエンスに転送されるオプション |
options.facialAgeEstimation.passIfOver | integer | 顔年齢推定が合格とすべき最小年齢 |
options.facialAgeEstimation.failIfUnder | integer | 顔年齢推定が不合格とすべき最大年齢 |
options.redirectUrl | string | チャレンジ完了後のリダイレクト先 |
リクエスト例(確認済みプラットフォームシグナルが権限を満たす場合):
POST /api/v1/session/upgrade
{
"sessionId": "608616da-4fd2-4742-82bf-ec1d4ffd8187",
"requestedPermissions": [
{ "name": "loot-boxes-paid-gameplay-impacting" }
],
"platformAgeSignal": {
"name": "apple-ios",
"ageLow": 18,
"ageHigh": 25,
"declarationType": "governmentIDChecked"
}
}
{
"session": {
"sessionId": "608616da-4fd2-4742-82bf-ec1d4ffd8187",
"permissions": [
{
"name": "loot-boxes-paid-gameplay-impacting",
"enabled": true,
"managedBy": "PLAYER",
"verifiedAgeThreshold": 18
}
],
"ageVerification": {
"verifiedAge": 18,
"platformName": "apple-ios",
"declarationType": "governmentIDChecked",
"verifiedAt": "2026-03-14T00:00:00Z"
}
}
}
リクエスト例(プレイヤーが閾値を満たしているが年齢保証が必要な場合):
POST /api/v1/session/upgrade
{
"sessionId": "608616da-4fd2-4742-82bf-ec1d4ffd8187",
"requestedPermissions": [
{ "name": "loot-boxes-paid-gameplay-impacting" }
],
"options": {
"redirectUrl": "https://mygame.com/callback"
}
}
{
"session": {
"sessionId": "608616da-4fd2-4742-82bf-ec1d4ffd8187",
"permissions": [
{
"name": "loot-boxes-paid-gameplay-impacting",
"enabled": false,
"managedBy": "PLAYER",
"verifiedAgeThreshold": 18
}
]
},
"challenge": {
"challengeId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "CHALLENGE_SESSION_UPGRADE_BY_AGE_ASSURANCE",
"url": "https://family.k-id.com/session/upgrade/age-assurance?token=..."
}
}
結果例(プレイヤーが閾値を下回っている場合):
{
"session": {
"sessionId": "608616da-4fd2-4742-82bf-ec1d4ffd8187",
"permissions": [
{
"name": "loot-boxes-paid-gameplay-impacting",
"enabled": false,
"managedBy": "PROHIBITED",
"verifiedAgeThreshold": 18
}
]
}
}
この場合、プレイヤーはその権限には年齢が足りないため、チャレンジは返されません。
主な動作:
- リクエストされたすべての権限は、
verifiedAgeThresholdをすべて持つか、まったく持たないかのどちらかである必要があります - プレイヤーが閾値を下回っている場合、権限は
PROHIBITEDのままでチャレンジは発行されません - 確認済みプラットフォームシグナルは、リクエストされた一部またはすべての権限を即座に満たすことができます
- セッション上の既存の
ageVerificationもリクエストを満たすことができます - 未解決の残りの権限のみが年齢保証チャレンジになります
チャレンジ結果の処理
チャレンジURLは https://family.k-id.com/session/upgrade/age-assurance?token=... を指します。
プレイヤーがこのURLを開くと:
- トークンが解析・検証されます。
- チャレンジがすでに解決されている場合、プレイヤーは完了ページにリダイレクトされます。
- まだ保留中の場合、k-IDの年齢確認方法(顔年齢推定やID文書スキャンなど)を含む確認iframeが表示されます。
- 完了時、結果が統合先に送信されます。
結果を受け取る方法は3つあります:
オプション1:postMessage をリッスン
iframeまたはwebview統合の場合、ファミリーポータルは Challenge.StateChange メッセージを親ウィンドウにポストします:
{
"eventType": "Challenge.StateChange",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"productId": "your-product-id",
"status": "PASS"
}
}
DOM postMessage イベントはUIを更新するために役立ちますが、信頼できる情報源ではありません。サーバー側のロジックには、webhookまたはポーリングエンドポイントを使用してください。
オプション2:GET /challenge/get-status をポーリング
GET /api/v1/challenge/get-status?challengeId=a1b2c3d4-e5f6-7890-abcd-ef1234567890
可能なステータスは PASS、FAIL、PENDING、IN_PROGRESS です。
オプション3:Challenge.StateChange webhookを受信
k-IDは、チャレンジステータスが変更されるたびに、設定されたエンドポイントに Challenge.StateChange webhookイベントをポストします:
{
"eventType": "Challenge.StateChange",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"productId": 11472,
"status": "PASS",
"sessionId": "608616da-4fd2-4742-82bf-ec1d4ffd8187"
}
}
| フィールド | 説明 |
|---|---|
data.id | POST /session/upgrade によって返された challengeId |
data.status | PASS、FAIL、または IN_PROGRESS |
data.sessionId | PASS 時に存在:更新されたセッションを取得するために使用 |
Webhookはリアルタイムで配信され、ポーリングを必要としないため、サーバー側の処理に推奨されるアプローチです。フィールドリファレンスとステータスライフサイクルの完全な情報については、Challenge.StateChange を参照してください。
結果後
PASS後、GET /session/getを呼び出し、更新された権限を使用します。閾値権限は有効になり、セッションにageVerificationが含まれるはずです。FAIL後、権限は無効のままです。プレイヤーは後でPOST /session/upgradeを再度呼び出すことで再試行できます。
閾値を下回る年齢を入力したプレイヤーの回復フロー
プレイヤーが高リスク権限の閾値を下回る申告年齢を入力し、PROHIBITED 権限になる場合があります。その場合、セッションはすでにプレイヤーがその機能には年齢が足りないと示しているため、通常の session/upgrade フローでは問題を解決できません。
この回復フローの対象:
- プレイヤー管理のセッション
- 承認者がまだリンクされていない保護者管理のセッション
承認者がすでにリンクされている保護者管理のセッションには適していません。
回復手順
- プレイヤーをAgeKit+の年齢申し立てに誘導します。 適切な
jurisdictionとcriteriaを指定してPOST /age-verification/perform-age-appealを呼び出します。返されたURLをiframeまたはwebviewで表示して、プレイヤーが年齢確認を完了できるようにします。申し立てが失敗した場合にプレイヤーが既存のセッションを保持し、VPCを再度行う必要がないように、まだセッションを無効化しないでください。 - 年齢申し立ての結果を処理します。 DOMイベント、webhook、または
GET /age-verification/get-statusを介して結果をリッスンします。- 成功時: 申し立てにより、プレイヤーの確認済み年齢を証明する
verificationIdが生成されます。 - 失敗時: 機能は禁止されたままです。プレイヤーは最初に申告した年齢のままで、既存のセッションは保持されます。
- 成功時: 申し立てにより、プレイヤーの確認済み年齢を証明する
- セッションを無効化します。 申し立て成功後、プレイヤーがゼロから始められるように、自分の側で
sessionIdを破棄します。セッション無効化エンドポイントは将来のリリースで予定されています;現時点では、クライアント側でセッションを削除するだけで十分です。 - k-IDシグナルを使用して年齢ゲートフローを再開します。 申し立てからの
verificationIdをk-idプラットフォームシグナルとして送信します。
POST /api/v1/age-gate/check
{
"jurisdiction": "BR",
"platformAgeSignal": {
"name": "k-id",
"verificationId": "<verificationId from age appeal>"
}
}
k-IDは verificationId から確認済み年齢を解決します。確認済み年齢が verifiedAgeThreshold 以上であれば、高リスク権限が有効な状態でセッションが作成されます。
権限の順次アップグレード
各閾値権限は独立して追跡されます:
- 1つの権限をアップグレードしても、他の権限が自動的にアップグレードされるわけではありません
- 各権限は引き続き
POST /session/upgradeを通じてリクエストする必要があります - セッションに
ageVerificationが記録されると、同じかより低い閾値を持つ後続の権限は、別のチャレンジなしで満たされることが多い