メインコンテンツへスキップ
DiditのSandboxは、StripeのテストカードやSumsubの書類テンプレートに相当する仕組みです。実際のプロバイダー、実際の個人情報(PII)、残高に一切触れることなく、あらゆる検証結果を決定論的に再現できます。
このデータの信頼できる唯一の情報源は、検証サービスの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引き継ぎでも、サンドボックス内で実際のアクティブキャプチャが実行されるため、ユーザーが体験する操作をそのままテストできます。シミュレートされるのはライブネスの結果のみで、シナリオまたはマジック値によって決まります。レポートには、ワークフローで設定した方式が記録されます。
  • カスタムドメインは本番環境専用です。 サンドボックスのアプリケーションではカスタムドメインを追加できず、サンドボックスのセッションは常にデフォルトのホスト型検証ドメインで実行されます。
  • セッションは課金されません。また、残高チェックは行われません。
  • アプリケーションごとに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カードで同じ内容を表示します。
トラベルルールは「何も実行されない」の唯一の例外です。 トラベルルールが 有効なアプリケーションでは、サンドボックスのtravelRule取引でも交換エンジンによる処理が実行されます。送金記録が作成され、ステータスが遷移します。 サンドボックスが決して行わないのは、Didit外部の相手との通信です。 唯一の取引相手はプラットフォームに組み込まれたDidit Test VASPです。コンプライアンスメッセージがいずれのレール(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が適用されます。 しきい値を超える場合、セルフホスト型ウォレットのチェックが通常どおり適用されます。申告済みのセルフホスト型ウォレットへの送金は何も送信されずにUNCONFIRMED_OWNERSHIPになり、サンドボックスではウォレット所有権ウィジェット、または送信先ウォレットがすでにウォレットアドレス帳にある場合は所有権の確認によって完了できます。 しきい値を超えるその他の送金はTEST_VASPレールでDidit Test VASPに送られ、Didit Test VASPは受取人のウォレットまたは名前で選んだシナリオに従ってDidit内で応答します。結果は完了、却下、不一致、COUNTERPARTY_VASP_NOT_REACHABLE、期限切れ(その後、取引にはtimeout_outcomeが適用されます)、ウォレット所有権の待機のいずれかです。 すべてのシナリオについてはサンドボックスでトラベルルールをテストするを参照してください。受信:POST /v3/travel-rule/inbound/。登録はレール経由で送信されることがないため、 シミュレーションされる部分はありません。サンドボックスは本番環境とまったく同じように、ウォレット アドレス帳との照合結果に基づいて入金を同期的に確定します。結果はAWAITING_COUNTERPARTYではなく 実際の結果になります。ON_HOLD(アドレス帳に一致なし)、UNCONFIRMED_OWNERSHIP(一致したエントリの所有権が未検証)、 COUNTERPARTY_MISMATCHED_DATA(受取人名がウォレット保有者と一致しない)、 またはCOMPLETEDの後にFINISHED(検証済みのエントリに一致)のいずれかです。 代わりにDidit Test VASPからの送金を受け取るには、自分のアドレス帳にあるウォレットのいずれかを指定してTest VASPの受信送金をトリガーを使用します。

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

カタログのtravel_rule.scenariosには、以下の送信シナリオが記載されています。サンドボックスアプリケーションでトラベルルールを有効にした後、送信するtravelRule取引に下記の受取人名を設定します。上記のしきい値チェックと申告済みセルフホスト型ウォレットのチェックが先に実行されます。 名前の代わりに受取人のウォレットアドレスでシナリオを選ぶこともできます(両方が設定されている場合はウォレットが優先されます)。どちらも指定されていない送金はacceptとして完了します。各シナリオのウォレットと正確な結果はサンドボックスでトラベルルールをテストするに記載されています。 受信用Test VASPトリガーのscenarioフィールドで受け付けるのはacceptとname_mismatchのみです。
ルールを本番運用する前に試す方法。 Backtestを使用してください。実際の取引履歴に対して ルールを再実行し、どの取引のステータスにも影響を与えずに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件)が1行で表示されます。いずれかをタップすると、実際のアップロードの代わりにそのサンプルを使用できます。
サンドボックスセッションには、撮影された実際のメディアが保存されます。書類、セルフィー、ライブネス検知の動画、住所証明のファイルは、本番環境のセッションとまったく同じようにアップロードされ、保持されます。抽出データ(本人確認のフィールド、顔照合の一致スコア、ライブネス検知の結果など)とセッションの結果そのもの(承認済み・レビュー中・却下)は、シナリオまたはマジックバリューによってシミュレートされ、撮影されたメディアから導き出されることはありません。Business Consoleでは、サンドボックスセッションの抽出データのセクションにシミュレーションデータチップが表示されるため、レビュアーはセッションのどの部分が実際の撮影で、どの部分がシナリオによるものかを一目で判別できます。

シナリオ

各シナリオは、複数のマジック値に名前を付けてまとめたものです。結果を再現するには、セッション作成時(またはsimulateエンドポイント)にそのスラッグをsandbox_scenarioとして渡します。 review_*シナリオは、却下レベルの入力を用意しなくても、手動レビューのUX(コンソールのレビューキュー、In ReviewのWebhook、レビュアーによる承認/却下アクション)をテストできるように用意されています。上記の2つのkyb_*シナリオは、expected_details.first_nameではなくexpected_details.registration_numberを設定します。これらは法人確認 (KYB) セッションにのみ適用されます。

マジック値

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

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

サンドボックスのアプリケーションでは、本番環境のアプリケーションでは利用できないウォレットも含め、国カタログにあるすべてのIDウォレットを有効にできます。 デフォルトのapproveシナリオは、外部ウォレットにサインインすることなく、確認済みのIDをシミュレートします。 結果はセッションに保存され、ワークフローは通常どおり次のステップに進みます。 サンドボックスでは実際のウォレットの資格情報は検証されず、シミュレートされた試行に料金は発生しません。 照会リクエストでは引き続き入力されたフィールドが検証され、設定された試行回数の上限が適用されます。上限のデフォルトは1回です。 再試行とフォールバックルールを確認するには、以下のシナリオを使用してください。 ウォレットで失敗した場合は、国の設定に従って書類撮影へのフォールバックまたは却下が行われます。 完了した照会の試行は個別に記録されるため、許可された試行が2回の場合、フォールバックの前に2件の結果が生成されます。 サンドボックスの利用はすべて引き続き無料です。

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

銀行口座認証は本番環境ではまだ有効になっていないため、このセクションは有効化後に適用されます。それまでは、サンドボックスキーにも本番キーと同じbank_verification_not_availableのレスポンスが返されます。 サンドボックスの銀行口座認証ステップでは、すべての国で両方の方式が、ステップで設定した順序で提供されます。銀行を介さないシミュレーションサービス上で動作し、費用はかかりません。 デフォルトの順序では、ユーザーは銀行へのサインインから始め、口座情報を入力を選択して口座チェックを実行します。口座チェックから始めるには、bank_method_orderを["account_lookup", "open_banking"]に設定します。 入力した口座番号の末尾4文字によって結果が決まります。すべての末尾パターンと、形式ごとの有効な口座番号についてはサンドボックスでテストするを参照してください。 口座チェックAPIも、サンドボックスキーを使用した場合も、同じ末尾パターンに基づいて応答します。

サンプル書類

サンドボックスでは実際の本人確認書類を絶対にアップロードしないでください。代わりに組み込みのサンプルドキュメントを使用してください。
ホスト型認証フローでは、書類の種類ごとに1つずつ、計3つのサンプル書類が用意されています。 実際の撮影の代わりに使用するには、一覧からサンプルをタップします。抽出データとセッションの結果は常に選択したシナリオまたはマジック値によって決まるため、どのサンプルもどのシナリオと組み合わせて使用できます。

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

サンドボックスのすべての書類は、1つの固定の本人情報から生成されます。 抽出される値はどのセッションでも同じで、現在の日付から算出されることはありません。そのため、これらの値をexpected_detailsに事前入力し、フィールド比較と警告処理をエンドツーエンドで確認できます。 以下の値を渡すと比較チェックは合格し、それ以外の値を渡すと、対応する*_MISMATCH_WITH_PROVIDED警告が意図的に発生します。 日付はすべてのサンプル書類で共通です。 それ以外の本人情報は、使用する書類によって異なります。
first_nameとlast_nameは例外です。サンドボックスはexpected_detailsで送信した氏名を生成される書類にそのまま反映するため、どの氏名でも氏名照合は合格します。 氏名の不一致を検証するにはSANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDEDマジック値を、生年月日の不一致にはSANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDEDを使用します。
ワークフローでdocuments_allowedを、ブラジルのeパスポートを含まない国または書類の種類に制限している場合、サンドボックスは代わりに許可された最初の国の書類を生成します。そのため、nationality、id_country、書類名はその国に従います。上記の日付は変わりません。

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

生成される書類は、許可された国と書類の種類に対応する汎用テンプレートであるため、実際に公的機関が発行した書類にしかないフィールドは空のままです。ルーティングに関係するのは地域 / 米国の州(kyc.region)です。サンドボックスの米国運転免許証やIDカードには州の情報がないため、Region equals ILのような分岐条件はサンドボックスでは一致することがありません。そのノードの他の分岐も一致しない場合、フローはノードのフォールバック分岐(条件のない分岐)に進みます。これはレビューでも分岐の失敗でもなく、単に条件で読み取る値が存在しないだけです。フィールドが存在しない場合はnot equalsとnot inも不成立になります。フィールドが存在しない場合と空文字列の違いについては、分岐条件がセッションデータを読み取る仕組みを参照してください。 サンドボックスで州に依存するフローを検証するには、書類ではなく、セッション上で自分が制御できる値に基づいて判定を行います。
  • セッション作成時にmetadataで州を送信し(例: "metadata": {"credential_state": "IL"})、metadata.credential_stateで分岐します。メタデータはサンドボックスでも本番環境とまったく同じように評価されます。
  • 書類で州を証明する必要もある場合は、本番トラフィック用に書類由来のkyc.region条件を残しておきます。本番モードでは、地域は実際の書類から読み取られます。
ルーティングに関するその他の点はすべて本番環境と同じです。ワークフローのグラフ、分岐条件、metadataとexpected_detailsの値、アクションノード、ステータスノードはすべて実際に実行されます。サンドボックスが独自にセッションをレビューに回すことはありません。サンドボックスのセッションがレビュー中で終了するのは、ワークフローがそこにルーティングした場合(review_*シナリオ、レビューアクションに対応付けられたマジック値、またはグラフ内のステータスノード)のみです。

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

  • 電話番号のOTP: サンドボックスの電話番号チェックは、正しい形式のコード(4〜8桁、123456を含む)をすべて受け付けます。不正な形式の入力には引き続き400が返されます。
  • メールのOTP: サンドボックスのメールチェックは、正しい形式のコード(123456を含む)をすべて受け付けます。不正な形式の入力には引き続き400が返されます。
デフォルトでは、サンドボックスのセッションはメール(レビューのアラート、ステータス変更、OTP、再提出、新しいセッションリンクなど)を送信しません。それでもメールを配信するには、受信者のアドレスを、次のいずれかのオプトインパターンに従って設定します。

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

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

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

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

2. 手入力のマジック値

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

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

既存のセッションに対して、アームするシナリオを設定または置き換えられます。ただし、セッションがNot Startedより先に進んでいないことが条件です。これはフロー開始前のシナリオピッカーが呼び出すエンドポイントです。独自のピッカーやテストハーネスを構築するために、自分で呼び出すこともできます。
200レスポンス:
  • 認証には、アプリケーションの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つは必須です。 send_webhooks: trueの場合、実際のステータス変更時とまったく同じWebhookが送信されます。具体的にはstatus.updatedに加え、その変更によって発生するuser.status.updatedイベントとuser.data.updatedイベント(企業セッションの場合はbusiness.status.updatedとbusiness.data.updated)です。これらは、各イベントを購読している送信先に送信されます。 send_webhooks: falseの場合もステータスは変更されますが、Webhookは記録も送信もされません。 未送信Webhookの復旧処理がその判定を再送することはありません。コンソールは引き続きリアルタイムで更新されます。 セッションの次のステータス変更では、通常どおりWebhookが送信されます。
200レスポンス:
  • 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/)に指定します。
  • 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)は、一部の箇所では返され、それ以外の箇所では意図的に省かれています。 連携の中でアームされたシナリオに応じてサーバー側で分岐する必要がある場合は、Webhookのペイロードか、いずれかの判定エンドポイント(v1またはv3)からslugを読み取ってください。

利用状況と請求

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