> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# サンドボックスのテストデータ：シナリオ・マジック値・書類

> Diditのサンドボックスでは、シナリオ、マジック値、armエンドポイント、サンプル書類、OTPコードを使い、個人情報の入力や請求なしで決まった結果をテストできます。

DiditのSandboxは、StripeのテストカードやSumsubの書類テンプレートに相当する仕組みです。実際のプロバイダー、実際の個人情報(PII)、残高に一切触れることなく、あらゆる検証結果を決定論的に再現できます。

> [!NOTE]
>
> このデータの信頼できる唯一の情報源は、検証サービスの`serialize_catalog()`で、`GET /v1/sandbox/scenarios/`からリアルタイムで提供されています。乖離テストを通過したコピーは、`service-didit-verification`リポジトリで`pipenv run python scripts/generate_sandbox_reference.py`を実行すると`docs/sandbox/SANDBOX_REFERENCE.md`に生成されます。このページはそのリファレンスを反映したものです。ここに記載の内容が古いと思われる場合は、常にリアルタイムのカタログエンドポイントを信頼してください。カタログエンドポイントには認証が必要です。他の呼び出しと同じ方法でAPIキー(`x-api-key`)を送信するか、実行中のセッション内から取得する場合はセッショントークンを送信してください。

## 環境モデル

サンドボックスは**アプリケーションごとのモード**(`ApplicationDetail.mode == SANDBOX`)で、Stripeのテストモードと同じ考え方です。サンドボックスのアプリケーションでセッションが実行されている間は、次のようになります。

* すべての外部プロバイダー(OCR、AML、顔照合、ライブネス、NFC、電話番号、メールアドレス、IP、POA、データベース検証、Document AI)は**モック化**され、サードパーティが呼び出されることは一切ありません。
* **ライブネスは本番環境とまったく同じように実行されます。** アクティブライブネスのワークフローでは、ホスト型フローでもネイティブSDKのWeb引き継ぎでも、サンドボックス内で実際のアクティブキャプチャが実行されるため、ユーザーが体験する操作をそのままテストできます。シミュレートされるのはライブネスの*結果*のみで、シナリオまたはマジック値によって決まります。レポートには、ワークフローで設定した方式が記録されます。
* **カスタムドメインは本番環境専用です。** サンドボックスのアプリケーションでは[カスタムドメイン](https://docs.didit.me/ja/console/custom-domain.md)を追加できず、サンドボックスのセッションは常にデフォルトのホスト型検証ドメインで実行されます。
* セッションは**課金されません**。また、残高チェックは行われません。
* アプリケーションごとに**24時間あたり500件のセッション作成**という上限が適用されます。
* Webhookには`"environment": "sandbox"`が含まれます(本番環境のセッションには`"environment": "live"`が含まれます)。
* ホスト型フローはセッションの環境を公開するため、UIでユーザーに実際の個人情報(PII)をアップロードしないよう警告できます。
* **結果がピクセルに左右されることはありません**。抽出データとステータスは、シナリオまたはマジック値によって決まります。撮影されたメディア自体(書類、セルフィー、動画、POAファイル)は、本番環境のセッションとまったく同じように実際に保存されます。

## サンドボックスでのトランザクションモニタリング

サンドボックスは**セッション型**です。検証セッションが呼び出すプロバイダーをモックします。
トランザクションモニタリングにはモックするプロバイダーがないため、サンドボックスアプリケーションは
別の方法をとります。取引は保存されますが、**判定、スクリーニング、通知、課金を行う処理は
その取引に対して一切実行されません**。

サンドボックスアプリケーションで作成された取引は通常どおり保存されて返されますが、
以下のいずれも実行されません。

* **ルール評価なし。** ルールのモードにかかわらず、`rule_runs`は空です。サンドボックスアプリケーション上の`ACTIVE`ルールは決して発火しないため、取引はスコア`0`の`APPROVED`のままとなり、アラートもケースも作成されません。
* **AML/ウォレットスクリーニングなし。** モニタリングが有効なアプリケーション上の暗号資産取引であっても、`provider_results`は空です。
* **Webhookなし。** サンドボックスの取引については、`transaction.created`も`transaction.status.updated`も配信されません。
* **課金なし。** 利用イベントは料金`0.0000`で記録され、残高は変わりません。

すべての取引レスポンスには`environment`フィールド(`"live"`または`"sandbox"`)が含まれるため、
`rule_runs`が空でも意味が曖昧になることはありません。`"sandbox"`は、一致したルールがなかったことではなく、
ルールが評価されなかったことを意味します。Business Consoleも、単なる「No rules
evaluated」ではなく、取引の*Risk & decision*カードで同じ内容を表示します。

> [!NOTE]
>
> **トラベルルールは「何も実行されない」の唯一の例外です。** トラベルルールが
> 有効なアプリケーションでは、サンドボックスの`travelRule`取引でも交換エンジンによる処理が実行されます。送金記録が作成され、ステータスが遷移します。
> サンドボックスが決して行わないのは、Didit外部の相手との通信です。
> 唯一の取引相手はプラットフォームに組み込まれた[Didit Test VASP](https://docs.didit.me/ja/transaction-monitoring/travel-rule-sandbox.md)です。コンプライアンスメッセージがいずれのレール(`TRP`、接続済みのネットワークメンバーシップ、メール、`INTERNAL`)でも実際の取引相手VASPに届くことはなく、取引相手VASPの帰属判定に関するスクリーニングはスキップされ、キャンセルしても取引相手には何も送信されません。
> `travel_rule.status.updated` Webhookは`"environment": "sandbox"`が付与された状態で配信されます。
>
> **送信**:送信する`travelRule`取引。
> 最初に`threshold_amount`のチェックが実行されます。サンドボックスは通貨換算を行わないため、サンドボックスではこのチェックは`transaction_details.amount_in_default_currency`を送信した場合にのみ適用されます。送信しない場合、サンドボックスのすべての送金がしきい値超えとして扱われます。
> 応答のない送金は`confirmation_timeout_hours`の経過後に期限切れとなり、その後、取引には`timeout_outcome`が適用されます。
> しきい値を超える場合、セルフホスト型ウォレットのチェックが通常どおり適用されます。[申告済みのセルフホスト型ウォレット](https://docs.didit.me/ja/transaction-monitoring/travel-rule.md#申告されたセルフホスト型ウォレット)への送金は何も送信されずに`UNCONFIRMED_OWNERSHIP`になり、サンドボックスでは[ウォレット所有権ウィジェット](https://docs.didit.me/ja/transaction-monitoring/wallet-ownership-widget.md)、または送信先ウォレットがすでにウォレットアドレス帳にある場合は[所有権の確認](https://docs.didit.me/ja/management-api/travel-rule/confirm-ownership.md)によって完了できます。
> しきい値を超えるその他の送金は`TEST_VASP`レールでDidit Test VASPに送られ、Didit Test VASPは受取人のウォレットまたは名前で選んだシナリオに従ってDidit内で応答します。結果は完了、却下、不一致、`COUNTERPARTY_VASP_NOT_REACHABLE`、期限切れ(その後、取引には`timeout_outcome`が適用されます)、ウォレット所有権の待機のいずれかです。
> すべてのシナリオについては[サンドボックスでトラベルルールをテストする](https://docs.didit.me/ja/transaction-monitoring/travel-rule-sandbox.md)を参照してください。
>
> **受信**:`POST /v3/travel-rule/inbound/`。登録はレール経由で送信されることがないため、
> シミュレーションされる部分はありません。サンドボックスは本番環境とまったく同じように、ウォレット
> アドレス帳との照合結果に基づいて入金を同期的に確定します。結果は`AWAITING_COUNTERPARTY`ではなく
> 実際の結果になります。`ON_HOLD`(アドレス帳に一致なし)、`UNCONFIRMED_OWNERSHIP`(一致したエントリの所有権が未検証)、
> `COUNTERPARTY_MISMATCHED_DATA`(受取人名がウォレット保有者と一致しない)、
> または`COMPLETED`の後に`FINISHED`(検証済みのエントリに一致)のいずれかです。
> 代わりにDidit Test VASPからの送金を受け取るには、自分のアドレス帳にあるウォレットのいずれかを指定して[Test VASPの受信送金をトリガー](https://docs.didit.me/ja/management-api/travel-rule/trigger-test-vasp-inbound.md)を使用します。

### トラベルルールのTest VASPシナリオ

カタログの`travel_rule.scenarios`には、以下の送信シナリオが記載されています。サンドボックスアプリケーションでトラベルルールを有効にした後、送信する`travelRule`取引に下記の受取人名を設定します。上記のしきい値チェックと申告済みセルフホスト型ウォレットのチェックが先に実行されます。

| シナリオ | 受取人名 | 結果 |
| - | - | - |
| `accept` | `Didit Test VASP` | `COMPLETED` |
| `decline` | `Didit Test VASP Decline` | `COUNTERPARTY_VASP_GENERAL_DECLINE` |
| `name_mismatch` | `Didit Test VASP Name Mismatch` | `COUNTERPARTY_MISMATCHED_DATA` |
| `not_reachable` | `Didit Test VASP Not Reachable` | 配信の再試行後に`COUNTERPARTY_VASP_NOT_REACHABLE` |
| `timeout` | `Didit Test VASP Timeout` | 1分の期限経過後に有効期限チェックが実行された時点で`EXPIRED` |
| `self_hosted` | `Didit Test VASP Self Hosted` | `UNCONFIRMED_OWNERSHIP` |

名前の代わりに受取人のウォレットアドレスでシナリオを選ぶこともできます(両方が設定されている場合はウォレットが優先されます)。どちらも指定されていない送金は`accept`として完了します。各シナリオのウォレットと正確な結果は[サンドボックスでトラベルルールをテストする](https://docs.didit.me/ja/transaction-monitoring/travel-rule-sandbox.md)に記載されています。

[受信用Test VASPトリガー](https://docs.didit.me/ja/management-api/travel-rule/trigger-test-vasp-inbound.md)の`scenario`フィールドで受け付けるのは`accept`と`name_mismatch`のみです。

> [!NOTE]
>
> **ルールを本番運用する前に試す方法。**
> [Backtest](https://docs.didit.me/ja/transaction-monitoring/rules-api.md#作成、バックテスト、有効化)を使用してください。実際の取引履歴に対して
> ルールを再実行し、どの取引のステータスにも影響を与えずに`evaluated`/
> `matched`/`affected_entities`をレポートします。これを本番アプリケーションの
> `TEST`モードと組み合わせます。`TEST`ルールは新しい本番取引ごとに評価され、スコアやステータスを
> 変更せずに一致したはずの内容を記録します。選択性が適切になったら`ACTIVE`に切り替えてください。

## 本番環境とサンドボックスを切り替える方法

本番環境とサンドボックスは**別々のアプリケーション**であるため、テストトラフィックと本番データが混ざることはありません。各アプリケーションには`live`または`sandbox`の`mode`があります。

* モックされ、課金されず、シミュレーション可能なセッションを取得するには、**サンドボックスモード**のアプリケーションのAPIキーを使用します。
* 実際の認証には、**本番モード**のアプリケーションのAPIキーを使用します。

`sandbox_scenario`フィールド(セッション作成時およびスタンドアロンのAML APIで使用)とsimulateエンドポイントは、サンドボックスアプリケーションでのみ受け付けられ、本番アプリケーションでは拒否されます。

## ホスト型検証フローでのサンドボックス

サンドボックスアプリケーションで作成されたセッションでは、ホスト型検証フロー(`POST /v3/session/`が返す`url`)に追加のUIが表示されます。

* **カード内のサンドボックスバナー。** すべての画面のカード内に「テストデータのみ・実際の呼び出しなし」というバナーが表示されるため、セッションが実際のプロバイダーを呼び出すことも、残高に影響することもないことが常に一目でわかります。撮影されたメディアは通常のセッションと同様に保存されるため、実際の本人確認書類や個人情報ではなく、サンプル書類とテストデータを使用してください。
* **フロー開始前のシナリオ選択。** 撮影が始まる前に、カード内の選択画面でユーザーがテスト結果を選びます。まず結果を選び、次にその結果のトリガーを選びます。確定すると`POST /v3/session/{session_id}/sandbox/arm/`が呼び出され(後述の[フロー開始前にセッションをアーム(または再アーム)する](#3-フロー開始前にセッションをアームまたは再アームする)を参照)、そのシナリオのマジックバリューが適用された状態でフローに進みます。
* **サンプル書類の一覧。** 書類のアップロード・撮影コンポーネントのすぐ下に、サンドボックスのサンプル書類(最大3件)が1行で表示されます。いずれかをタップすると、実際のアップロードの代わりにそのサンプルを使用できます。

サンドボックスセッションには、撮影された**実際の**メディアが保存されます。書類、セルフィー、ライブネス検知の動画、住所証明のファイルは、本番環境のセッションとまったく同じようにアップロードされ、保持されます。*抽出*データ(本人確認のフィールド、顔照合の一致スコア、ライブネス検知の結果など)とセッションの結果そのもの(承認済み・レビュー中・却下)は、シナリオまたはマジックバリューによってシミュレートされ、撮影されたメディアから導き出されることはありません。Business Consoleでは、サンドボックスセッションの抽出データのセクションに**シミュレーションデータ**チップが表示されるため、レビュアーはセッションのどの部分が実際の撮影で、どの部分がシナリオによるものかを一目で判別できます。

## シナリオ

各シナリオは、複数のマジック値に名前を付けてまとめたものです。結果を再現するには、セッション作成時(またはsimulateエンドポイント)にそのスラッグを`sandbox_scenario`として渡します。

| スラッグ | タイトル | デフォルトのステータス | 説明 |
| - | - | - | - |
| `approve` | 正常系：すべての機能が承認 | 承認済み | サンドボックスのデフォルト動作です。モック化されたすべての機能が、問題のないAPPROVEDの結果を返します。セッションのステータスは最終的にAPPROVEDになります。 |
| `decline_aml_hit` | AML：重要な公的地位を有する者 (PEP) | 却下 | AMLモックが1件のヒットを返し、セッションはAML機能で却下されます。このヒットは本番環境のAMLプロバイダーと同じ[Hitスキーマ](https://docs.didit.me/ja/core-technology/aml-screening/report-aml-screening.md#ヒットごとのフィールド)を使用し、`url`、`match_score`、`risk_score`、`review_status`、`properties`、`pep_matches[]`、`score_breakdown`がすべて設定されます。また、POSSIBLE\_MATCH\_FOUNDの警告Logが書き込まれます。 |
| `decline_document_expired` | 本人確認：書類の有効期限切れ | 却下 | 本人確認モックが、有効期限が過去の日付であるパスポートを返します。セッションは本人確認で却下され、DOCUMENT\_EXPIREDの警告Logが記録されます。 |
| `decline_minimum_age` | 本人確認：最低年齢ポリシー未満 | 却下 | 本人確認モックが、ユーザーが約10歳となる生年月日を返します。本番環境と同じ年齢チェックがMINIMUM\_AGE\_NOT\_METを出力し、ワークフローは却下します。 |
| `decline_mrz_validation` | 本人確認：MRZチェックサムエラー | 却下 | 本人確認モックが、MRZチェックサムが破損したパスポートを返します。本番環境と同じMRZバリデーターがMRZ\_VALIDATION\_FAILEDを出力し、セッションは却下されます。 |
| `decline_could_not_recognize_document` | 本人確認：読み取れない書類 | 却下 | 本人確認モックが空のレスポンスを返します。本番環境と同じ処理でCOULD\_NOT\_RECOGNIZE\_DOCUMENTが発生し、SDKに通知されます。 |
| `decline_face_match_low_similarity` | 顔照合：類似度が却下しきい値を下回る | 却下 | 顔照合モックが低いスコアを返します。本番環境と同じ処理でLOW\_FACE\_MATCH\_SIMILARITYが出力され、ワークフローノードのアクションマッピングにより却下されます。 |
| `decline_database_no_match` | データベース検証：すべてのサービスで一致なし | 却下 | 選択したすべてのデータベースサービスがNO\_MATCHを返します。本番環境と同じ処理でDATABASE\_VALIDATION\_NO\_MATCHが出力され、ワークフローは却下します。 |
| `decline_phone_high_risk` | 電話番号：予約済みの高リスクテスト番号 | 却下 | 電話番号検証モックが検証をブロックします(予約済みのテスト範囲)。電話番号検証はBLOCKEDで終了し、HIGH\_RISK\_PHONE\_NUMBERを出力します。 |
| `decline_email_breach` | メールアドレス：漏洩データベースでのヒット | 却下 | メール漏洩モックが、そのアドレスについて漏洩のヒットを1件返します。メールアドレス認証はBREACHED\_EMAIL\_DETECTEDを出力します。 |
| `decline_ip_blocklist` | IP分析：ブロックリストに含まれるIPアドレス | 却下 | IP分析モックが、IP\_ADDRESS\_IN\_BLOCKLISTにより位置情報の評価を却下します。セッションはIP分析で却下されます。 |
| `decline_poa_address_mismatch` | POA：提供された住所との不一致 | 却下 | POAモックが、ADDRESS\_MISMATCH\_WITH\_PROVIDEDにより住所証明を却下します。セッションはPOAで却下されます。 |
| `decline_liveness_attack` | ライブネス：顔への攻撃を検出 | 却下 | パッシブライブネスモックが顔への攻撃のシグナルを検出し、LIVENESS\_FACE\_ATTACKを出力します。セッションはライブネスで却下されます。 |
| `decline_nfc_chip_not_verified` | NFC：ePassportチップが未検証 | 却下 | ePassportモックが、SOD/DG署名の完全性チェックに失敗するチップを返します。本番環境と同じ処理でNFC\_CHIP\_NOT\_VERIFIEDが出力され、ワークフローが未検証のチップを却下する設定の場合、セッションはNFCで却下されます。 |
| `decline_nfc_trust_anchor_missing` | NFC：発行元のトラストアンカーが利用不可 | 却下 | ePassportモックが、発行元のCSCAがトラストストアに存在しないDSCで署名されたチップを返します。本番環境と同じ処理でNFC\_TRUST\_ANCHOR\_MISSINGが出力され、ワークフローが未検証のチップを却下する設定の場合、セッションは却下されます。 |
| `decline_document_ai_unreadable` | Document AI：読み取れない書類 | 却下 | Document AIモックは読み取り可能なフィールドを返しません。本番環境と同じ処理でDOCUMENT\_AI\_UNREADABLE\_DOCUMENTが出力され、再試行の上限回数に達すると、書類は却下として確定します。 |
| `review_aml_possible_match` | AML：レビューが必要な一致の可能性 | レビュー中 | AMLモックが信頼度の低いヒットを返します。セッションはレビュー中となり、アナリストが解決するための警告レベルのPOSSIBLE\_MATCH\_FOUND Logが記録されます。 |
| `review_face_match_borderline` | 顔照合：境界線上の類似度 | レビュー中 | 顔照合モックが、レビューしきい値と却下しきい値の間のスコアを返します。セッションは顔照合でレビュー中となります。 |
| `review_document_borderline_age` | 本人確認：未成年をレビューに回す | レビュー中 | 本人確認モックが、ワークフローで設定された最低年齢を下回る生年月日を返します。ワークフローのminimum\_age\_actionはDECLINEではなくREVIEWに設定されているため、セッションは却下されずに本人確認でレビュー中となります。 |
| `review_poa_partial_match` | POA：住所の部分一致 | レビュー中 | POAモックが、提供された住所と部分的にしか一致しない住所を返します。セッションは住所証明でレビュー中となります。 |
| `review_database_partial_match` | データベース検証：部分一致 | レビュー中 | データベースサービスが、氏名と生年月日について部分一致を返します。セッションはデータベース検証でレビュー中となります。 |
| `decline_kyb_registry_mismatch` | KYB：法人登記データの不一致 | 却下 | 法人登記モックが、法人登記データが期待される情報と一致しない企業を返します。企業セッションは法人登記チェックで却下されます。 |
| `review_kyb_registry_partial` | KYB：法人登記データの部分一致 | レビュー中 | 法人登記モックが、名称が部分的にしか一致しない企業を返します。企業セッションは法人登記チェックでレビュー中となります。 |

`review_*`シナリオは、却下レベルの入力を用意しなくても、手動レビューのUX(コンソールのレビューキュー、`In Review`のWebhook、レビュアーによる承認/却下アクション)をテストできるように用意されています。上記の2つの`kyb_*`シナリオは、`expected_details.first_name`ではなく`expected_details.registration_number`を設定します。これらは法人確認 (KYB) セッションにのみ適用されます。

## マジック値

マジック値とは、モック化された特定の機能に特定のリスクを発生させるための特定の入力値です。入力フィールドにマジック値を設定すると（直接、またはシナリオ経由で）、そのリスクをトリガーできます。

| 機能 | 入力フィールド | マジック値 | リスク | 説明 |
| - | - | - | - | - |
| AML | `user_email` | `sandbox+aml_hit@didit.test` | `POSSIBLE_MATCH_FOUND` | AML：重要な公的地位を有する者 (PEP)。AMLモックが1件のヒットを返し、セッションはAMLで却下されます。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_EXPIRED` | `DOCUMENT_EXPIRED` | OCR：書類の有効期限切れ。セッションは本人確認で却下されます。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MINIMUM_AGE_NOT_MET` | `MINIMUM_AGE_NOT_MET` | OCR：生年月日から算出したユーザーの年齢が、設定された最低年齢を下回ります。セッションは却下されます。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MAXIMUM_AGE_EXCEEDED` | `MAXIMUM_AGE_EXCEEDED` | OCR：抽出された年齢が、設定された最高年齢ポリシーを超えています。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_NUMBER_FORMAT_MISMATCH` | `DOCUMENT_NUMBER_FORMAT_MISMATCH` | OCR：抽出された書類番号が、書類レジストリにある当該書類の想定フォーマットの正規表現と一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_PERSONAL_NUMBER_FORMAT_MISMATCH` | `PERSONAL_NUMBER_FORMAT_MISMATCH` | OCR：抽出された個人番号が、書類レジストリのフォーマットチェックに合格しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` | `DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` | OCR：抽出された書類の種類が、アプリケーションの`documents_allowed`ポリシーの対象外です。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDED` | `FULL_NAME_MISMATCH_WITH_PROVIDED` | OCR：書類上の氏名と、顧客が`expected_details`に事前入力した氏名の一致度が、氏名照合のしきい値を上回りません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_GENDER_MISMATCH_WITH_PROVIDED` | `GENDER_MISMATCH_WITH_PROVIDED` | OCR：抽出された性別が`expected_details.gender`と一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDED` | `DOB_MISMATCH_WITH_PROVIDED` | OCR：抽出された生年月日が`expected_details.date_of_birth`と一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_COUNTRY_MISMATCH_WITH_PROVIDED` | `COUNTRY_MISMATCH_WITH_PROVIDED` | OCR：発行国が`expected_details.country`（または`id_country`）と一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_NATIONALITY_MISMATCH_WITH_PROVIDED` | `NATIONALITY_MISMATCH_WITH_PROVIDED` | OCR：抽出された国籍が`expected_details.nationality`と一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_IDENTIFICATION_NUMBER_MISMATCH_WITH_PROVIDED` | `IDENTIFICATION_NUMBER_MISMATCH_WITH_PROVIDED` | OCR：抽出された書類番号、個人番号または納税者番号が`expected_details.identification_number`と一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_COULD_NOT_RECOGNIZE_DOCUMENT` | `COULD_NOT_RECOGNIZE_DOCUMENT` | OCRパイプラインが空または認識不能な結果を返します。本番環境ではCOULD\_NOT\_RECOGNIZE\_DOCUMENTが発生します。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MRZ_NOT_DETECTED` | `MRZ_NOT_DETECTED` | OCR：書類にMRZがあるはずですが、パイプラインがMRZを検出できませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MRZ_VALIDATION_FAILED` | `MRZ_VALIDATION_FAILED` | OCR：MRZは検出されましたが、チェックサムまたはフォーマットの検証に失敗しました。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` | `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` | OCR：MRZの本人情報フィールドが、VIZから抽出したフィールドと一致しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_BARCODE_NOT_DETECTED` | `BARCODE_NOT_DETECTED` | OCR：書類にバーコードがあるはずですが、見つかりませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_BARCODE_VALIDATION_FAILED` | `BARCODE_VALIDATION_FAILED` | OCR：バーコードはデコードされましたが、フィールド間の照合検証に失敗しました。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_QR_NOT_DETECTED` | `QR_NOT_DETECTED` | OCR：書類にQRコードがあるはずですが、見つかりませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_QR_VALIDATION_FAILED` | `QR_VALIDATION_FAILED` | OCR：QRコードはデコードされましたが、フィールド間の照合検証に失敗しました。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DATA_INCONSISTENT` | `DATA_INCONSISTENT` | OCR：VIZフィールドの内部整合性チェックで不一致があります。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_SIDES_MISMATCH` | `DOCUMENT_SIDES_MISMATCH` | OCR：表面と裏面のdocument\_nameが、同じ書類として対応しません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_NAME_NOT_DETECTED` | `NAME_NOT_DETECTED` | OCR：書類から名も姓も抽出できませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DATE_OF_BIRTH_NOT_DETECTED` | `DATE_OF_BIRTH_NOT_DETECTED` | OCR：書類クラスでは生年月日があるはずですが、抽出結果に含まれていません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_EXPIRATION_DATE_NOT_DETECTED` | `EXPIRATION_DATE_NOT_DETECTED` | OCR：書類クラスでは有効期限があるはずですが、抽出結果に含まれていません。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_NUMBER_NOT_DETECTED` | `DOCUMENT_NUMBER_NOT_DETECTED` | OCR：書類番号も個人番号も抽出できませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_COULD_NOT_DETECT_DOCUMENT_TYPE` | `COULD_NOT_DETECT_DOCUMENT_TYPE` | OCR：分類器が、撮影画像を対応している書類の種類に分類できませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_PORTRAIT_IMAGE_NOT_DETECTED` | `PORTRAIT_IMAGE_NOT_DETECTED` | OCR：パイプラインが書類上の顔写真領域を切り出せませんでした。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_UNPARSED_ADDRESS` | `UNPARSED_ADDRESS` | OCR：書類に住所フィールドはあるものの、ジオコーディングまたは解析で利用可能な結果が得られません。 |
| DATABASE\_VALIDATION | `expected_details.first_name` | `SANDBOX_DB_NO_MATCH` | `DATABASE_VALIDATION_NO_MATCH` | データベース検証：すべての政府・登記サービスがNO\_MATCHを返し、セッションはデータベース検証で却下されます。 |
| FACEMATCH | `expected_details.first_name` | `SANDBOX_FACE_LOW_MATCH` | `LOW_FACE_MATCH_SIMILARITY` | 顔照合：類似度スコアが却下のしきい値を下回り、セッションは顔照合で却下されます。 |
| PHONE | `phone_number` | `+15005550009` | `HIGH_RISK_PHONE_NUMBER` | 電話番号：配信不能または高リスク用に予約されたテスト番号です。電話番号検証のモックは失敗を返します。 |
| EMAIL | `user_email` | `sandbox+breach@didit.test` | `BREACHED_EMAIL_DETECTED` | メールアドレス：漏洩データベースがこのアドレスに対してヒットを返します。 |
| LOCATION | `expected_details.first_name` | `SANDBOX_IP_BLOCKLIST` | `IP_ADDRESS_IN_BLOCKLIST` | IP分析：リクエスト元のIPアドレスがアプリケーションのブロックリストに含まれており、セッションはIP分析で却下されます。 |
| PROOF\_OF\_ADDRESS | `expected_details.first_name` | `SANDBOX_POA_ADDRESS_MISMATCH` | `ADDRESS_MISMATCH_WITH_PROVIDED` | POA：アップロードされた書類の住所が、顧客が`expected_details`に事前入力した住所と一致せず、セッションはPOAで却下されます。 |
| LIVENESS | `expected_details.first_name` | `SANDBOX_LIVENESS_ATTACK` | `LIVENESS_FACE_ATTACK` | ライブネス検知：パッシブライブネスのモックが顔攻撃のシグナルを検知し、セッションはライブネス検知で却下されます。 |
| NFC | `expected_details.first_name` | `SANDBOX_NFC_CHIP_NOT_VERIFIED` | `NFC_CHIP_NOT_VERIFIED` | NFC：ePassportのモックが、SOD/DG署名の完全性検証に失敗するチップを返します。本番環境ではNFC\_CHIP\_NOT\_VERIFIEDを発生させ、ワークフローが未検証チップを却下する設定の場合は却下されます。 |
| NFC | `expected_details.first_name` | `SANDBOX_NFC_TRUST_ANCHOR_MISSING` | `NFC_TRUST_ANCHOR_MISSING` | NFC：DSCの証明書チェーンに含まれるCSCAがトラストストアに存在しません。本番環境ではNFC\_TRUST\_ANCHOR\_MISSINGを発生させ、未検証チップに対して設定されたアクションを適用します。 |
| DOCUMENT\_AI | `expected_details.first_name` | `SANDBOX_DOCUMENT_AI_UNREADABLE` | `DOCUMENT_AI_UNREADABLE_DOCUMENT` | Document AI：抽出で読み取り可能なフィールドが返されません。本番環境ではDOCUMENT\_AI\_UNREADABLE\_DOCUMENTを出力し、再試行の上限に達した時点で書類は却下として確定します。 |
| AML | `user_email` | `sandbox+aml_review@didit.test` | `POSSIBLE_MATCH_FOUND` | AML：手動での解決が必要な一致の可能性があり、セッションはレビュー中になります。 |
| FACEMATCH | `expected_details.first_name` | `SANDBOX_FACE_BORDERLINE_MATCH` | `LOW_FACE_MATCH_SIMILARITY` | 顔照合：類似度がレビューと却下のしきい値の間にある境界値で、セッションはレビュー中になります。 |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_BORDERLINE_AGE` | `MINIMUM_AGE_NOT_MET` | OCR：生年月日が最低年齢を下回っていますが、ワークフローが最低年齢の不適合を却下ではなくレビューとする設定のため、セッションはレビュー中になります。 |
| DATABASE\_VALIDATION | `expected_details.first_name` | `SANDBOX_DB_PARTIAL_MATCH` | `DATABASE_VALIDATION_PARTIAL_MATCH` | データベース検証：識別番号は一致するものの、氏名・生年月日は部分的にしか一致せず、セッションはレビュー中になります。 |
| PROOF\_OF\_ADDRESS | `expected_details.first_name` | `SANDBOX_POA_PARTIAL_MATCH` | `ADDRESS_MISMATCH_WITH_PROVIDED` | POA：アップロードされた書類の住所が提供された住所と部分的に一致し、セッションはレビュー中になります。 |
| KYB\_REGISTRY | `expected_details.registration_number` | `SANDBOX-KYB-MISMATCH` | `KYB_REGISTRY_DATA_MISMATCH_WITH_EXPECTED` | KYB：登記上の企業データが期待される詳細と一致せず、セッションは却下されます。 |
| KYB\_REGISTRY | `expected_details.registration_number` | `SANDBOX-KYB-REVIEW` | `KYB_REGISTRY_DATA_PARTIAL_MATCH_WITH_EXPECTED` | KYB：登記上の企業データが部分的に一致し、セッションはレビュー中になります。 |

## 書類以外の照会とIDウォレット

サンドボックスのアプリケーションでは、本番環境のアプリケーションでは利用できないウォレットも含め、国カタログにあるすべてのIDウォレットを有効にできます。
デフォルトの`approve`シナリオは、外部ウォレットにサインインすることなく、確認済みのIDをシミュレートします。
結果はセッションに保存され、ワークフローは通常どおり次のステップに進みます。
サンドボックスでは実際のウォレットの資格情報は検証されず、シミュレートされた試行に料金は発生しません。

照会リクエストでは引き続き入力されたフィールドが検証され、設定された試行回数の上限が適用されます。上限のデフォルトは1回です。
再試行とフォールバックルールを確認するには、以下のシナリオを使用してください。

| シナリオ | シミュレートされる結果 |
| - | - |
| `lookup_partial_match` | レジストリで部分一致となります。試行回数の上限にカウントされます。 |
| `lookup_no_match` | レジストリは一致なしで応答します。試行回数の上限にカウントされます。 |
| `lookup_provider_error` | レジストリから応答がありません。ユーザーに再試行が求められ、応答のない試行が3回続くとプロバイダーエラー時のフォールバックが適用されます。 |
| `wallet_cancelled` | ユーザーがウォレットへのサインインをキャンセルします。 |
| `wallet_timeout` | ウォレットへのサインインが期限切れになります。 |
| `wallet_provider_error` | ウォレットがサインインを完了できません。 |

ウォレットで失敗した場合は、国の設定に従って書類撮影へのフォールバックまたは却下が行われます。
完了した照会の試行は個別に記録されるため、許可された試行が2回の場合、フォールバックの前に2件の結果が生成されます。
サンドボックスの利用はすべて引き続き無料です。

## 銀行口座認証の口座チェック

銀行口座認証は本番環境ではまだ有効になっていないため、このセクションは有効化後に適用されます。それまでは、サンドボックスキーにも本番キーと同じ`bank_verification_not_available`のレスポンスが返されます。

サンドボックスの銀行口座認証ステップでは、すべての国で[両方の方式](https://docs.didit.me/ja/core-technology/bank-verification/verification-methods.md)が、ステップで設定した順序で提供されます。銀行を介さないシミュレーションサービス上で動作し、費用はかかりません。
デフォルトの順序では、ユーザーは銀行へのサインインから始め、**口座情報を入力**を選択して[口座チェック](https://docs.didit.me/ja/core-technology/bank-verification/account-check.md)を実行します。口座チェックから始めるには、`bank_method_order`を`["account_lookup", "open_banking"]`に設定します。
入力した口座番号の末尾4文字によって結果が決まります。すべての末尾パターンと、形式ごとの有効な口座番号については[サンドボックスでテストする](https://docs.didit.me/ja/core-technology/bank-verification/account-check.md#サンドボックスでテストする)を参照してください。
[口座チェックAPI](https://docs.didit.me/ja/standalone-apis/bank-account-check.md)も、サンドボックスキーを使用した場合も、同じ末尾パターンに基づいて応答します。

## サンプル書類

> [!WARNING]
>
> サンドボックスでは実際の本人確認書類を絶対にアップロードしないでください。代わりに組み込みのサンプルドキュメントを使用してください。

ホスト型認証フローでは、書類の種類ごとに1つずつ、計3つのサンプル書類が用意されています。

| 国 | 書類の種類 |
| - | - |
| スペイン | 国民身分証明書 |
| アルゼンチン | パスポート |
| ポーランド | 運転免許証 |

実際の撮影の代わりに使用するには、一覧からサンプルをタップします。抽出データとセッションの結果は常に選択したシナリオまたはマジック値によって決まるため、どのサンプルもどのシナリオと組み合わせて使用できます。

## サンプルの本人情報: `expected_details`のテスト

サンドボックスのすべての書類は、1つの**固定**の本人情報から生成されます。
抽出される値はどのセッションでも同じで、現在の日付から算出されることはありません。そのため、これらの値を`expected_details`に事前入力し、フィールド比較と警告処理をエンドツーエンドで確認できます。
以下の値を渡すと比較チェックは合格し、それ以外の値を渡すと、対応する`*_MISMATCH_WITH_PROVIDED`警告が意図的に発生します。

日付はすべてのサンプル書類で共通です。

| フィールド | 値 |
| - | - |
| `date_of_birth` | `1990-06-15` |
| 発行日 | `2025-06-15` |
| 有効期限 | `2035-06-15` |

それ以外の本人情報は、使用する書類によって異なります。

| `sandbox_sample` | 書類 | `first_name` | `last_name` | `gender` | `nationality` | `id_country` | `identification_number` |
| - | - | - | - | - | - | - | - |
| *(デフォルト、サンプル未選択)* | ブラジルのeパスポート | `GUSTAVO` | `MATSUMOTO` | `M` | `BRA` | `BRA` | `YC531181` |
| `spain-id-card-2021` | スペインの国民IDカード | `CARMEN` | `ESPAÑOLA ESPAÑOLA` | `F` | `ESP` | `ESP` | `CAA000000` |
| `argentina-passport-2009` | アルゼンチンのパスポート | `MARIA VICTORIA` | `VILLAREAL` | `F` | `ARG` | `ARG` | `AAF794880` |
| `poland-driving-license-2019` | ポーランドの運転免許証 | `JAN` | `KOWALSKI` | この書類には記載なし | `POL` | `POL` | `SP005/89/5` |

```json theme={null}
{
  "workflow_id": "<your-workflow-uuid>",
  "expected_details": {
    "date_of_birth": "1990-06-15",
    "gender": "M",
    "nationality": "BRA",
    "identification_number": "YC531181"
  }
}
```

`first_name`と`last_name`は例外です。サンドボックスは`expected_details`で送信した氏名を生成される書類にそのまま反映するため、どの氏名でも氏名照合は合格します。
氏名の不一致を検証するには`SANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDED`マジック値を、生年月日の不一致には`SANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDED`を使用します。

> [!NOTE]
>
> ワークフローで`documents_allowed`を、ブラジルのeパスポートを含まない国または書類の種類に制限している場合、サンドボックスは代わりに許可された最初の国の書類を生成します。そのため、`nationality`、`id_country`、書類名はその国に従います。上記の日付は変わりません。

### 生成された書類に含まれない情報

生成される書類は、許可された国と書類の種類に対応する汎用テンプレートであるため、実際に公的機関が発行した書類にしかないフィールドは空のままです。ルーティングに関係するのは**地域 / 米国の州**(`kyc.region`)です。サンドボックスの米国運転免許証やIDカードには州の情報がないため、`Region equals IL`のような分岐条件はサンドボックスでは一致することがありません。そのノードの他の分岐も一致しない場合、フローはノードのフォールバック分岐(条件のない分岐)に進みます。これはレビューでも分岐の失敗でもなく、単に条件で読み取る値が存在しないだけです。フィールドが存在しない場合は`not equals`と`not in`も不成立になります。フィールドが存在しない場合と空文字列の違いについては、[分岐条件がセッションデータを読み取る仕組み](https://docs.didit.me/ja/console/workflows.md#分岐条件がセッションデータを読み取る仕組み)を参照してください。

サンドボックスで州に依存するフローを検証するには、書類ではなく、セッション上で自分が制御できる値に基づいて判定を行います。

* セッション作成時に`metadata`で州を送信し(例: `"metadata": {"credential_state": "IL"}`)、`metadata.credential_state`で分岐します。メタデータはサンドボックスでも本番環境とまったく同じように評価されます。
* 書類で州を証明する必要もある場合は、本番トラフィック用に書類由来の`kyc.region`条件を残しておきます。本番モードでは、地域は実際の書類から読み取られます。

ルーティングに関するその他の点はすべて本番環境と同じです。ワークフローのグラフ、分岐条件、`metadata`と`expected_details`の値、アクションノード、ステータスノードはすべて実際に実行されます。サンドボックスが独自にセッションをレビューに回すことはありません。サンドボックスのセッションがレビュー中で終了するのは、ワークフローがそこにルーティングした場合(`review_*`シナリオ、レビューアクションに対応付けられたマジック値、またはグラフ内のステータスノード)のみです。

## OTPコードとメールのオプトイン

* **電話番号のOTP:** サンドボックスの電話番号チェックは、正しい形式のコード(4〜8桁、`123456`を含む)をすべて受け付けます。不正な形式の入力には引き続き`400`が返されます。
* **メールのOTP:** サンドボックスのメールチェックは、正しい形式のコード(`123456`を含む)をすべて受け付けます。不正な形式の入力には引き続き`400`が返されます。

デフォルトでは、サンドボックスのセッションはメール(レビューのアラート、ステータス変更、OTP、再提出、新しいセッションリンクなど)を送信**しません**。それでもメールを配信するには、受信者のアドレスを、次のいずれかのオプトインパターンに従って設定します。

| オプトインパターン | 例 |
| - | - |
| `<local>+sandbox@<domain>` | `alice+sandbox@example.com` |
| `*@didit.test` | `alice@didit.test` |

## シナリオ、マジック値、アーム、simulateエンドポイントによる結果の制御

サンドボックスの結果を制御する方法は5つあります。

### 1. セッション作成時の`sandbox_scenario`

セッション作成時(`POST /v3/session/`)にシナリオのslugを指定します。作成処理では、シナリオに含まれるマジック値がセッションの入力フィールドに展開されます。そのため、モック化されたプロバイダーが実際のワークフローパイプラインを通じて意図した結果を返します。

```json theme={null}
{
  "workflow_id": "<your-workflow-uuid>",
  "sandbox_scenario": "decline_document_expired"
}
```

### 2. 手入力のマジック値

個々の入力フィールドを自分で設定します(例: `expected_details.first_name = "SANDBOX_OCR_DOCUMENT_EXPIRED"`、`user_email = "sandbox+aml_hit@didit.test"`)。全一覧は、前述のマジック値の表を参照してください。

### 3. フロー開始前にセッションをアームまたは再アームする

既存のセッションに対して、アームするシナリオを設定または置き換えられます。ただし、セッションが`Not Started`より先に進んでいないことが条件です。これは[フロー開始前のシナリオピッカー](#ホスト型検証フローでのサンドボックス)が呼び出すエンドポイントです。独自のピッカーやテストハーネスを構築するために、自分で呼び出すこともできます。

```
POST /v3/session/{session_id}/sandbox/arm/
Session-Token: <session_token>
```

```json theme={null}
{
  "scenario": "decline_document_expired"
}
```

200レスポンス:

```json theme={null}
{
  "session_id": "<session_id>",
  "scenario": "decline_document_expired",
  "status": "Not Started"
}
```

* 認証には、アプリケーションのAPIキーではなく、セッション自身の`Session-Token`(セッション作成時に`session_token`として返されます)を使用します。これはクライアント向けのエンドポイントです。
* 不明なシナリオslugの場合は`400`を返します。セッションが`Not Started`より先に進んだ後も`400`を返します(`"Scenario can only be armed before the verification starts."`)。
* `Session-Token`が本番(サンドボックス以外)のアプリケーションに属する場合、またはパス内の`session_id`と一致しない場合は`404`を返します。
* **再アームすると、以前のシナリオが置き換えられます。** 消去されるのは以前のシナリオが書き込んだマジック値だけです。ユーザーがすでに手入力した内容(メールアドレス、名など)はそのまま残ります。たとえば、`decline_phone_high_risk`をアームしてから`approve`をアームすると、電話番号は未設定に戻ります。一方、顧客が入力したメールアドレスは両方の呼び出し後も残ります。

### 4. simulateエンドポイント

事後に終了ステータスを強制的に設定します。

* コンソール / APIキー(`write:sessions`権限が必要です。スコープ付きAPIキーにはセッションへの書き込み権限が必要です): `POST /v3/session/{session_id}/simulate/`
* ホスト型フロー(`Session-Token`ヘッダー): `POST /v3/session/{session_id}/sandbox/simulate/`

どちらもKYCとKYBのサンドボックスセッションで動作します。
本番(サンドボックス以外)のセッションでは`404`を返します。パス内の`session_id`と一致しない`Session-Token`の場合も同様です。

ボディのフィールドはすべて任意ですが、`new_status`、`scenario`、`risk`のうち少なくとも1つは必須です。

| フィールド | 型 | 内容 |
| - | - | - |
| `new_status` | string | `Approved`、`Declined`、`In Review`、`Expired`、`Abandoned`のいずれか。省略した場合は、リスクケース(`risk`、またはシナリオのマジック値が持つ最初のリスク)のデフォルトステータスになります。リスクケースがない場合は、シナリオのデフォルトステータスになります。 |
| `scenario` | string、最大100文字 | シナリオのslug。`risk`を指定しない場合は、そのマジック値が持つ最初のリスクが適用されます。 |
| `risk` | string、最大128文字 | リスクケース。その警告がセッションに追加されます。 |
| `node_id` | string、最大128文字 | 警告を紐付けるワークフローのノード。デフォルトはセッションの現在のノードです。 |
| `comment` | string、最大500文字 | ステータス変更時に記録されるアクティビティエントリに追加されるメモ。 |
| `send_webhooks` | boolean、デフォルト`true` | ステータス変更時にWebhookを送信するかどうか。 |

`send_webhooks: true`の場合、実際のステータス変更時とまったく同じWebhookが送信されます。具体的には`status.updated`に加え、その変更によって発生する`user.status.updated`イベントと`user.data.updated`イベント(企業セッションの場合は`business.status.updated`と`business.data.updated`)です。これらは、各イベントを購読している送信先に送信されます。
`send_webhooks: false`の場合もステータスは変更されますが、Webhookは記録も送信もされません。
未送信Webhookの復旧処理がその判定を再送することはありません。コンソールは引き続きリアルタイムで更新されます。
セッションの次のステータス変更では、通常どおりWebhookが送信されます。

```json theme={null}
{
  "scenario": "decline_aml_hit",
  "send_webhooks": false
}
```

200レスポンス:

```json theme={null}
{
  "session_id": "<session_id>",
  "previous_status": "In Progress",
  "status": "Declined",
  "scenario": "decline_aml_hit",
  "risk": "POSSIBLE_MATCH_FOUND",
  "send_webhooks": false
}
```

* `status`はシミュレーションで設定されたステータス、`previous_status`はそれ以前のセッションのステータスです。
* `scenario`は指定したslugをそのまま返し、`risk`は適用されたリスクケースです。該当がない場合はそれぞれ`null`になります。
* `send_webhooks`は適用された値をそのまま返します。
* 次の場合は`400`を返します。不明なシナリオまたはリスクの場合、`new_status`を導出できない場合、上記以外の`new_status`の場合、セッションがすでに要求されたステータスにある場合(`["The new status is the same as the current status."]`)です。

### 5. スタンドアロンAML APIでの`sandbox_scenario`

バックエンドのAMLスクリーニングには、エンドユーザーもアームするセッションもありません。そのため、slugはスクリーニングリクエスト自体(`POST /v3/aml/`)に指定します。

```json theme={null}
{
  "full_name": "Ada Lovelace",
  "save_api_request": true,
  "sandbox_scenario": "decline_aml_hit"
}
```

* `decline_aml_hit`は本番環境と同じ形式のヒットを1件返し、スクリーニングを`Declined`で確定します。`review_aml_possible_match`は`In Review`で確定します。AML結果を設定しないシナリオでは、スクリーニングはヒットなしになります。
* `save_api_request: true`(デフォルト)の場合、スクリーニングは本番のキーとまったく同じように保存されます。そのため、返された`request_id`は`GET /v3/session/{request_id}/decision/`と`GET /v3/session/{request_id}/generate-pdf/`で参照できます。
* 不明なシナリオslugの場合は`400`を返します。APIキーが本番のアプリケーションに属する場合も`400`を返します。

## `sandbox_scenario`が表示される場所

アームされたシナリオのslug(アームされていない場合は`null`)は、一部の箇所では返され、それ以外の箇所では意図的に省かれています。

| 箇所 | 含まれるか |
| - | - |
| 現在のステップのペイロード(KYCとKYB) | はい、`sandbox_scenario`として |
| `GET /v1/session/{id}/decision/` | はい、`sandbox_scenario`として |
| `GET /v3/session/{id}/decision/`([セッションの取得](https://docs.didit.me/ja/sessions-api/retrieve-session.md)を参照) | はい、トップレベルの`sandbox_scenario`として(アームされていない場合はnull) |
| セッションのWebhook(`status.updated`、`data.updated`) | はい、`sandbox_scenario`として。本番セッションやアームされていないサンドボックスセッションでは`null` |

連携の中でアームされたシナリオに応じてサーバー側で分岐する必要がある場合は、Webhookのペイロードか、いずれかの判定エンドポイント(`v1`または`v3`)からslugを読み取ってください。

## 利用状況と請求

サンドボックスの利用状況は記録されますが、課金されることはありません。

* モックされた呼び出しでも利用イベント（`is_sandbox: true`、料金`0.0000`）は必ず記録されるため、デバッグ時にサンドボックスの利用量を確認できます。ただし、この利用量が利用合計に加算されることも、残高から差し引かれることも、請求書に記載されることもありません。
* Business Consoleの残高、チャージ、本番利用状況の画面では、デフォルトでサンドボックスの利用状況が除外されます。チャージ利用状況のエンドポイントは`environment`パラメーター（デフォルトの`live`、または`sandbox`）を受け付けるため、サンドボックスの利用量を個別に確認できます。この場合も費用は常にゼロで、無料枠は消費されません。
* メールアドレス認証と電話番号検証は、セッションの結果ごとではなくリクエストごとに課金されますが、サンドボックスにはWebhookレイヤーでこれを完全に再現する方法がありません。サンドボックスのメール・電話番号チェックでも、他のすべてのモック機能と同様に、リクエストごとに料金`0.0000`の利用イベントが記録されます。これは本番環境の課金動作との既知かつ許容された相違であり、バグではありません。
* サンドボックスにおけるデータベース検証のレスポンス形式は、再現すべき実際のプロバイダーが存在しないため、本番環境のプロバイダーごとの形式とは意図的に異なります。サンドボックスのデータベース検証のペイロードは結果（ステータスと警告コード）の代替として扱い、本番環境のプロバイダーレスポンスをバイト単位で正確に再現したプレビューとはみなさないでください。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.