메인 콘텐츠로 건너뛰기
Didit의 샌드박스는 Stripe의 테스트 카드나 Sumsub의 문서 템플릿과 같은 역할을 합니다. 실제 제공업체를 호출하거나 실제 개인정보를 사용하거나 잔액에 영향을 주지 않고 원하는 인증 결과를 결정적으로 재현할 수 있습니다.
이 데이터의 기준 원본은 verification 서비스의 serialize_catalog()이며, GET /v1/sandbox/scenarios/ 엔드포인트에서 실시간으로 제공됩니다. service-didit-verification 저장소의 docs/sandbox/SANDBOX_REFERENCE.md는 pipenv run python scripts/generate_sandbox_reference.py로 드리프트 테스트를 거친 사본이 생성됩니다. 이 페이지는 해당 참조 문서를 그대로 옮긴 것이므로, 내용이 오래된 것 같으면 항상 실시간 카탈로그 엔드포인트를 기준으로 하십시오. 카탈로그 엔드포인트는 인증이 필요합니다. 다른 호출과 같은 방식으로 API 키(x-api-key)를 보내거나, 실행 중인 세션 안에서 조회하는 경우 세션 토큰을 사용하십시오.

환경 모델

샌드박스는 애플리케이션별 모드(ApplicationDetail.mode == SANDBOX)이며, Stripe의 테스트 모드와 같은 개념입니다. 샌드박스 애플리케이션에서 세션이 실행되는 동안에는 다음이 적용됩니다.
  • 모든 외부 제공업체(OCR, AML, 얼굴 대조, 라이브니스, NFC, 전화, 이메일, IP, 주소 증명, 데이터베이스 검증, 문서 AI)가 모의(mock) 처리됩니다. 어떤 제3자도 호출되지 않습니다.
  • 라이브니스는 실제 환경과 똑같이 동작합니다. 능동형 라이브니스 워크플로는 호스팅 흐름과 네이티브 SDK의 웹 핸드오프 모두에서 샌드박스에서도 실제 능동형 캡처를 실행하므로, 사용자가 실제로 겪게 될 경험을 테스트할 수 있습니다. 라이브니스 결과만 시나리오 또는 매직 값으로 시뮬레이션되며, 보고서에는 워크플로에 설정된 방식이 기록됩니다.
  • 커스텀 도메인은 라이브 환경에서만 사용할 수 있습니다. 샌드박스 애플리케이션에는 커스텀 도메인을 추가할 수 없으며, 샌드박스 세션은 항상 기본 호스팅 인증 도메인에서 실행됩니다.
  • 세션은 청구되지 않으며, 잔액 확인도 건너뜁니다.
  • 애플리케이션별로 24시간 동안 세션 생성 500회 할당량이 적용됩니다.
  • webhook에는 "environment": "sandbox"가 포함됩니다(라이브 세션의 webhook에는 "environment": "live"가 포함됩니다).
  • 호스팅 흐름은 세션 환경 정보를 노출하므로, UI에서 사용자에게 실제 개인정보를 업로드하지 말라고 경고할 수 있습니다.
  • 결과는 픽셀에 의존하지 않습니다. 추출된 데이터와 상태는 시나리오 또는 매직 값에서 가져옵니다. 캡처된 미디어 자체(문서, 셀피, 영상, 주소 증명 파일)는 라이브 세션과 똑같이 실제로 저장됩니다.

샌드박스의 거래 모니터링

샌드박스는 세션 형태로 동작하며, 검증 세션이 호출하는 제공업체를 모의합니다. 거래 모니터링에는 모의할 제공업체가 없으므로, 샌드박스 애플리케이션은 다른 방식을 택합니다. 거래는 저장되지만, 그 거래에 대해 판단, 스크리닝, 알림, 청구를 수행하는 처리는 아무것도 실행되지 않습니다. 샌드박스 애플리케이션에서 생성된 거래는 평소와 같이 저장되고 응답으로 반환되지만, 다음 사항은 발생하지 않습니다.
  • 규칙 평가 없음. 규칙 모드와 관계없이 rule_runs는 비어 있습니다. 샌드박스 애플리케이션에서는 ACTIVE 규칙이 절대 발동하지 않으므로, 거래는 점수 0과 함께 APPROVED 상태를 유지하며 알림이나 케이스가 생성되지 않습니다.
  • AML / 지갑 스크리닝 없음. 모니터링이 활성화된 애플리케이션이라도 암호화폐 거래의 경우 provider_results는 비어 있습니다.
  • webhook 없음. 샌드박스 거래에 대해서는 transaction.created와 transaction.status.updated가 모두 전송되지 않습니다.
  • 청구 없음. 사용량 이벤트는 가격 0.0000으로 기록되며 잔액은 변하지 않습니다.
모든 거래 응답에는 environment 필드("live" 또는 "sandbox")가 포함되므로, 비어 있는 rule_runs는 모호하지 않습니다. "sandbox"는 규칙이 평가되지 않았다는 뜻이며, 규칙이 모두 일치하지 않았다는 뜻이 아닙니다. Business Console도 거래의 Risk & decision 카드에서 단순한 “No rules evaluated” 대신 같은 내용을 표시합니다.
Travel Rule은 ‘아무것도 실행되지 않는다’는 원칙의 유일한 예외입니다. Travel Rule이 활성화된 애플리케이션에서 샌드박스 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이 거래에 적용됨), 지갑 소유권 확인을 기다릴 수 있습니다. 모든 시나리오는 샌드박스에서 Travel Rule 테스트를 참조하십시오.수신 - POST /v3/travel-rule/inbound/. 등록은 어떤 채널로도 전송을 발생시키지 않으므로, 이 과정은 시뮬레이션되지 않습니다. 샌드박스는 입금을 지갑 주소록과 대조하고 라이브 환경과 똑같이 동기적으로 정산합니다. 결과는 AWAITING_COUNTERPARTY가 아니라 실제 결과로 나타납니다. ON_HOLD(주소록 일치 항목 없음), UNCONFIRMED_OWNERSHIP(일치한 항목의 소유권이 확인되지 않음), COUNTERPARTY_MISMATCHED_DATA(수취인 이름이 지갑 보유자와 일치하지 않음), 또는 COMPLETED 후 FINISHED(확인된 항목과 일치함) 중 하나입니다. Didit Test VASP로부터 전송을 받으려면, 지갑 주소록에 있는 자체 지갑 중 하나를 사용하여 Test VASP 수신 전송 트리거를 사용하십시오.

Travel Rule 테스트 VASP 시나리오

카탈로그의 travel_rule.scenarios에는 다음 송신 시나리오가 나열되어 있습니다. 샌드박스 애플리케이션에서 Travel Rule을 활성화한 후, 송신 travelRule 거래에 아래 수취인 이름을 설정하십시오. 위에서 설명한 임계값 및 선언된 자체 보관 지갑 검사가 먼저 실행됩니다. 수취인 이름 대신 수취인 지갑 주소로 시나리오를 선택할 수도 있습니다(둘 다 설정된 경우 지갑이 우선합니다). 이름도 지갑도 지정하지 않은 전송은 accept로 완료됩니다. 샌드박스에서 Travel Rule 테스트에서 각 시나리오의 지갑과 정확한 결과를 확인할 수 있습니다. 수신 Test VASP 트리거는 scenario 필드에서 accept와 name_mismatch만 허용합니다.
라이브 전환 전에 규칙을 검증하는 방법. Backtest를 사용하십시오. 이 기능은 규칙을 실제 거래 내역에 다시 적용하고, 어떤 거래의 상태도 변경하지 않은 채 evaluated / matched / affected_entities를 보고합니다. 라이브 애플리케이션에서 TEST 모드와 함께 사용하십시오. TEST 규칙은 새로 들어오는 모든 라이브 거래를 평가하고, 일치했을 내용을 점수나 상태를 변경하지 않고 기록합니다. 선별성이 적절하다고 확인되면 ACTIVE로 전환하십시오.

라이브와 샌드박스 전환 방법

라이브와 샌드박스는 별도의 애플리케이션이므로 테스트 트래픽과 프로덕션 데이터가 섞이지 않습니다. 각 애플리케이션에는 live 또는 sandbox의 mode가 있습니다.
  • 샌드박스 모드 애플리케이션의 API 키를 사용하면 모의 세션을 얻을 수 있습니다. 이 세션은 과금되지 않으며 시뮬레이션할 수 있습니다.
  • 라이브 모드 애플리케이션의 API 키는 실제 인증에 사용합니다.
sandbox_scenario 필드(세션 생성 시 및 단독 AML API에서 사용)와 시뮬레이션 엔드포인트는 샌드박스 애플리케이션에서만 허용됩니다. 라이브 애플리케이션에서는 거부됩니다.

호스팅 인증 흐름의 샌드박스

샌드박스 애플리케이션에서 생성한 세션은 호스팅 인증 흐름(POST /v3/session/이 반환하는 url)에 추가 UI를 표시합니다.
  • 카드 내 샌드박스 배너. 모든 화면의 카드 안에 “테스트 데이터만 사용 - 실제 호출 없음” 배너가 표시됩니다. 따라서 이 세션이 실제 제공업체를 호출하지 않고 잔액에도 영향을 주지 않는다는 점이 항상 분명합니다. 캡처된 미디어는 일반 세션과 같은 방식으로 저장되므로, 실제 신분증이나 개인정보 대신 샘플 문서와 테스트 데이터를 사용하십시오.
  • 흐름 시작 전 시나리오 선택기. 캡처를 시작하기 전에 카드 내 선택기가 사용자가 테스트 결과를 고르도록 안내합니다. 먼저 결과를 선택하고, 그 결과에 대한 트리거를 고릅니다. 확인하면 POST /v3/session/{session_id}/sandbox/arm/이 호출되고(흐름 시작 전 세션 설정(또는 재설정) 참조), 해당 시나리오의 모의 값이 이미 적용된 상태로 흐름이 이어집니다.
  • 샘플 문서 스트립. 문서 업로드/캡처 컴포넌트 바로 아래에 샌드박스 샘플 문서가 한 줄로 최대 3개까지 표시됩니다. 하나를 탭하면 실제 업로드 대신 그 문서를 사용합니다.
샌드박스 세션은 실제 캡처 미디어를 저장합니다. 문서, 셀피, 라이브니스 영상, 주소 증명 파일은 라이브 세션과 똑같이 업로드되고 보존됩니다. 반면 추출된 데이터(신분증 인증 필드, 얼굴 대조 점수, 라이브니스 결과 등)와 세션 결과 자체(승인됨 / 검토 중 / 거부됨)는 시나리오 또는 모의 값에 의해 시뮬레이션되며, 캡처된 미디어에서 도출되지 않습니다. Business Console은 샌드박스 세션의 추출 데이터 섹션에 시뮬레이션 데이터 칩을 표시하므로, 검토자는 세션의 어느 부분이 실제 캡처이고 어느 부분이 시나리오에 따른 결과인지 한눈에 구분할 수 있습니다.

시나리오

각 시나리오는 이름이 지정된 매직 값 묶음입니다. 결과를 재현하려면 세션 생성 시(또는 시뮬레이션 endpoint에) 해당 슬러그를 sandbox_scenario로 전달하세요. review_* 시나리오는 거부 수준의 입력 없이도 수동 검토 UX(콘솔 검토 대기열, In Review 웹훅, 검토자의 승인/거부 작업)를 테스트할 수 있도록 존재합니다. 위의 두 kyb_* 시나리오는 expected_details.first_name 대신 expected_details.registration_number를 설정합니다. 이들은 기업 확인(KYB) 세션에만 적용됩니다.

매직 값

매직 값은 하나의 모의 기능이 특정 위험을 발생시키도록 하는 특정 입력값입니다. 입력 필드를 매직 값으로 설정하면(직접 설정하거나 시나리오를 통해) 해당 위험이 트리거됩니다.

비문서 조회 및 신원 지갑

샌드박스 애플리케이션에서는 국가 카탈로그에 있는 모든 신원 지갑을 활성화할 수 있으며, 여기에는 라이브 애플리케이션에서 사용할 수 없는 지갑도 포함됩니다. 기본 approve 시나리오는 외부 지갑에 로그인하지 않고 검증된 신원을 시뮬레이션합니다. 결과는 세션에 저장되며 워크플로의 일반적인 다음 단계를 따릅니다. 샌드박스는 실제 지갑 자격 증명을 검증하지 않으며, 시뮬레이션된 시도에 대해 요금을 부과하지 않습니다. 조회 요청은 여전히 입력된 필드를 검증하며, 기본값이 1인 설정된 시도 한도를 적용합니다. 재시도와 대체 규칙을 테스트하려면 다음 시나리오를 사용할 수 있습니다. 지갑 실패는 국가 설정에 따라 문서 촬영으로 대체되거나 거부됩니다. 완료된 조회 시도는 별도로 기록되므로, 허용된 시도가 두 번이면 대체 전에 결과가 두 개 생성됩니다. 모든 샌드박스 사용량은 계속 무료입니다.

은행 인증 계좌 확인

샌드박스 은행 인증 단계는 모든 국가에서 두 가지 방식을 제공하며, 단계에서 설정한 순서대로 진행됩니다. 실제 은행이나 비용이 없는 시뮬레이션 서비스를 사용합니다. 기본 순서에서는 사용자가 은행 로그인부터 시작하고, 계좌 정보 입력을 선택해 계좌 확인을 실행합니다. bank_method_order를 ["account_lookup", "open_banking"]로 설정하면 계좌 확인부터 시작합니다. 입력한 계좌의 마지막 네 글자가 응답을 결정합니다. 모든 끝자리와 형식별 유효한 계좌는 샌드박스에서 테스트하기를 참조하십시오. 계좌 확인 API는 같은 끝자리를 기준으로 샌드박스 키에 해당하는 응답을 반환합니다.

샘플 문서

샌드박스에서는 실제 신분증 문서를 절대 업로드하지 마세요. 대신 내장된 샘플 문서를 사용하세요.
호스팅 흐름에는 문서 유형별로 하나씩, 총 세 개의 샘플 문서가 있습니다. 스트립에서 샘플을 탭하면 실제 촬영 대신 해당 샘플을 사용합니다. 추출된 데이터와 세션 결과는 항상 선택한 시나리오 또는 매직 값에서 가져오므로, 어떤 샘플이든 어떤 시나리오와도 함께 사용할 수 있습니다.

샘플 신원: expected_details 테스트

모든 샌드박스 문서는 하나의 고정된 신원으로 만들어집니다. 추출되는 값은 모든 세션에서 동일하며 현재 날짜에서 계산되지 않습니다. 따라서 이 값으로 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를 브라질 전자여권을 제외하는 국가 또는 문서 유형으로 제한하면, 샌드박스는 허용된 첫 번째 국가의 문서를 대신 만듭니다. 따라서 nationality, id_country, 문서 이름도 해당 국가를 따릅니다. 위의 날짜는 그대로 유지됩니다.

만들어진 문서에 포함되지 않는 정보

만들어진 문서는 허용된 국가와 문서 유형에 맞는 일반 템플릿이므로, 실제 주 정부 발급 문서에서만 얻을 수 있는 필드는 비어 있습니다. 라우팅에 중요한 필드는 지역 / 미국 주(kyc.region)입니다. 샌드박스의 미국 운전면허증이나 신분증에는 주 정보가 없으므로, 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, 재제출, 새 세션 링크 등)을 보내지 않습니다. 이메일을 보내려면 수신자 주소에 다음 수신 동의 패턴 중 하나를 사용하세요.

샌드박스 결과 제어: 시나리오, 매직 값, 사전 설정, 시뮬레이션 endpoint

샌드박스 결과를 제어하는 방법은 다섯 가지입니다.

1. 세션 생성 시 sandbox_scenario 설정

세션을 생성할 때(POST /v3/session/) 시나리오 슬러그를 설정합니다. 생성 과정에서 시나리오에 포함된 매직 값이 세션의 입력 필드로 확장되므로, 모의 제공자가 실제 워크플로 파이프라인을 거쳐 의도한 결과를 반환합니다.

2. 매직 값을 직접 입력

개별 입력 필드를 직접 설정합니다(예: expected_details.first_name = "SANDBOX_OCR_DOCUMENT_EXPIRED" 또는 user_email = "sandbox+aml_hit@didit.test"). 전체 목록은 위의 매직 값 표를 참조하세요.

3. 플로우 시작 전 시나리오 사전 설정(또는 재설정)

이미 존재하는 세션이 Not Started 상태를 지나지 않았다면, 해당 세션에 설정된 시나리오를 지정하거나 교체할 수 있습니다. 이 endpoint는 플로우 시작 전 시나리오 선택기가 호출하는 endpoint이며, 사용자 지정 선택기나 테스트 하네스를 직접 구성하려는 경우 직접 호출할 수 있습니다.
200 응답:
  • 애플리케이션 API 키가 아니라, 세션 생성 시 session_token으로 반환되는 세션 자체의 Session-Token으로 인증합니다. 이 endpoint는 클라이언트용 endpoint입니다.
  • 알 수 없는 시나리오 슬러그이면 400을 반환하고, 세션이 Not Started 상태를 지난 후에는 400을 반환합니다("Scenario can only be armed before the verification starts.").
  • Session-Token이 라이브(샌드박스가 아닌) 애플리케이션에 속하거나 경로의 session_id와 일치하지 않으면 404를 반환합니다.
  • 시나리오를 다시 설정하면 이전 시나리오가 대체됩니다. 이전 시나리오가 기록한 매직 값만 지워지고, 사용자가 직접 입력한 값(이메일, 이름 등)은 그대로 유지됩니다. 예를 들어 decline_phone_high_risk를 설정한 뒤 approve를 설정하면 전화번호는 미설정 상태로 돌아가지만, 고객이 입력한 이메일은 두 호출 모두에서 유지됩니다.

4. 시뮬레이션 endpoint

사후에 최종 상태를 강제로 설정합니다.
  • 콘솔 / 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 중 하나 이상은 반드시 포함해야 합니다. 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는 요청한 슬러그를 그대로 반환하고, risk는 적용된 위험 사례입니다. 해당하는 값이 없으면 각각 null입니다.
  • send_webhooks는 적용된 값을 반환합니다.
  • 알 수 없는 시나리오나 위험 사례이거나, new_status를 도출할 수 없거나, 지원하지 않는 new_status이거나, 세션이 이미 요청된 상태를 가지고 있으면 400을 반환합니다(["The new status is the same as the current status."]).

5. 독립형 AML API의 sandbox_scenario

백엔드 AML 스크리닝에는 최종 사용자나 설정할 세션이 없으므로, 슬러그를 스크리닝 요청 자체에 포함합니다(POST /v3/aml/).
  • decline_aml_hit은 실제 운영 환경과 같은 형식의 일치 결과를 하나 반환하고 스크리닝을 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/에서 조회할 수 있습니다.
  • 알 수 없는 시나리오 슬러그이면 400을 반환하고, API 키가 라이브 애플리케이션에 속하면 400을 반환합니다.

sandbox_scenario가 표시되는 위치

설정된 시나리오 슬러그(설정된 시나리오가 없으면 null)는 일부 인터페이스에서 다시 반환되며, 다른 인터페이스에서는 의도적으로 제외됩니다. 서버 측에서 설정된 시나리오에 따라 분기 처리해야 한다면, webhook 엔벨로프나 두 가지 결정 endpoint(v1 또는 v3) 중 하나에서 값을 읽으세요.

사용량 및 결제

샌드박스 사용량은 집계되지만 청구되지 않습니다.
  • 모의 호출마다 사용량 이벤트가 기록됩니다(is_sandbox: true, 가격 0.0000). 디버깅을 위해 샌드박스 사용량을 확인할 수 있도록 하기 위함이며, 사용량 합계에 더해지지 않고, 잔액에서 차감되지 않으며, 청구서에도 나타나지 않습니다.
  • Business Console의 잔액, 충전, 실시간 사용량 화면은 기본적으로 샌드박스 사용량을 제외합니다. 충전 사용량 endpoint는 environment 파라미터(live가 기본값이고 sandbox 선택 가능)를 받으므로, 샌드박스 사용량을 따로 조회할 수 있습니다. 이때 비용은 항상 0이며 무료 요금제 사용량도 차감되지 않습니다.
  • 이메일 및 전화번호 인증은 세션 결과 단위가 아니라 요청 단위로 결제됩니다. 샌드박스는 웹훅 계층에서 이를 완전히 반영할 수 없습니다. 샌드박스의 이메일/전화번호 인증도 다른 모의 기능과 마찬가지로 요청마다 가격 0.0000의 사용량 이벤트를 기록합니다. 이는 실제 결제 동작과의 알려진 차이로, 의도된 설계이며 버그가 아닙니다.
  • 데이터베이스 검증의 샌드박스 응답 형식은 실제 제공자가 없으므로 프로덕션 환경의 제공자별 형식과 의도적으로 다릅니다. 샌드박스의 데이터베이스 검증 payload는 결과(상태 및 경고 코드)를 대신하는 값으로 취급하고, 실제 제공자 응답을 바이트 단위로 미리 보여주는 것으로 간주하지 마십시오.
마지막 수정일 2026년 11월 7일