メインコンテンツに移動

高リスク機能のための年齢保証

特定の管轄区域における特定の権限は、有効にする前に確認済み年齢が必要です。たとえば、ブラジル(BR)の loot-boxes-paid-cosmetic-onlyloot-boxes-paid-gameplay-impactingtargeted-ads、および profilingverifiedAgeThreshold が 18 である必要があります。これらの権限はデフォルトで無効になっており、年齢要件のために確認済みと見なされるプラットフォームシグナルまたは専用の年齢保証チャレンジ(CHALLENGE_SESSION_UPGRADE_BY_AGE_ASSURANCE)によってのみ解除できます。

このページの目的

以下を理解する必要がある場合にこのページを使用してください:

  • プレイヤーがすでに年齢ゲートを通過した後も権限が無効のままである理由
  • POST /session/upgrade が権限を即座に有効にするか、チャレンジを返すか
  • 閾値を満たしているがまだ年齢を確認していないプレイヤーへの対応方法
  • 閾値を下回る年齢を最初に申告したプレイヤーの回復方法

確認済み年齢閾値

verifiedAgeThreshold とは、申告または推定された年齢ではなく、確認済み年齢が必要であることを意味します。

現在の主な例は:

  • ブラジル(BR: loot-boxes-paid-cosmetic-onlyloot-boxes-paid-gameplay-impactingtargeted-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
}
プレイヤーの年齢と閾値の比較年齢確認済み?managedByenabled
閾値未満N/APROHIBITEDfalse
閾値以上いいえPLAYERfalse
閾値以上はい(確認済みプラットフォームシグナル経由)PLAYERtrue
閾値以上はい(年齢保証経由)PLAYERtrue

閾値のある権限は 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

関連するリクエストフィールド:

フィールド説明
platformAgeSignalPlatformAgeSignal閾値を即座に満たすことができるプラットフォームシグナル
optionsobject年齢保証エクスペリエンスに転送されるオプション
options.facialAgeEstimation.passIfOverinteger顔年齢推定が合格とすべき最小年齢
options.facialAgeEstimation.failIfUnderinteger顔年齢推定が不合格とすべき最大年齢
options.redirectUrlstringチャレンジ完了後のリダイレクト先

リクエスト例(確認済みプラットフォームシグナルが権限を満たす場合):

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を開くと:

  1. トークンが解析・検証されます。
  2. チャレンジがすでに解決されている場合、プレイヤーは完了ページにリダイレクトされます。
  3. まだ保留中の場合、k-IDの年齢確認方法(顔年齢推定やID文書スキャンなど)を含む確認iframeが表示されます。
  4. 完了時、結果が統合先に送信されます。

結果を受け取る方法は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

可能なステータスは PASSFAILPENDINGIN_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.idPOST /session/upgrade によって返された challengeId
data.statusPASSFAIL、または IN_PROGRESS
data.sessionIdPASS 時に存在:更新されたセッションを取得するために使用

Webhookはリアルタイムで配信され、ポーリングを必要としないため、サーバー側の処理に推奨されるアプローチです。フィールドリファレンスとステータスライフサイクルの完全な情報については、Challenge.StateChange を参照してください。

結果後

  • PASS 後、GET /session/get を呼び出し、更新された権限を使用します。閾値権限は有効になり、セッションに ageVerification が含まれるはずです。
  • FAIL 後、権限は無効のままです。プレイヤーは後で POST /session/upgrade を再度呼び出すことで再試行できます。

閾値を下回る年齢を入力したプレイヤーの回復フロー

プレイヤーが高リスク権限の閾値を下回る申告年齢を入力し、PROHIBITED 権限になる場合があります。その場合、セッションはすでにプレイヤーがその機能には年齢が足りないと示しているため、通常の session/upgrade フローでは問題を解決できません。

この回復フローの対象:

  • プレイヤー管理のセッション
  • 承認者がまだリンクされていない保護者管理のセッション

承認者がすでにリンクされている保護者管理のセッションには適していません

回復手順

  1. プレイヤーをAgeKit+の年齢申し立てに誘導します。 適切な jurisdictioncriteria を指定して POST /age-verification/perform-age-appeal を呼び出します。返されたURLをiframeまたはwebviewで表示して、プレイヤーが年齢確認を完了できるようにします。申し立てが失敗した場合にプレイヤーが既存のセッションを保持し、VPCを再度行う必要がないように、まだセッションを無効化しないでください。
  2. 年齢申し立ての結果を処理します。 DOMイベント、webhook、または GET /age-verification/get-status を介して結果をリッスンします。
    • 成功時: 申し立てにより、プレイヤーの確認済み年齢を証明する verificationId が生成されます。
    • 失敗時: 機能は禁止されたままです。プレイヤーは最初に申告した年齢のままで、既存のセッションは保持されます。
  3. セッションを無効化します。 申し立て成功後、プレイヤーがゼロから始められるように、自分の側で sessionId を破棄します。セッション無効化エンドポイントは将来のリリースで予定されています;現時点では、クライアント側でセッションを削除するだけで十分です。
  4. k-IDシグナルを使用して年齢ゲートフローを再開します。 申し立てからの verificationIdk-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 が記録されると、同じかより低い閾値を持つ後続の権限は、別のチャレンジなしで満たされることが多い