이벤트 목록
엔티티 수준 이벤트(
user.status.updated, business.status.updated)도 거래 활동의 결과로 발생할 수 있습니다. 자세한 내용은 엔티티 webhook을 참조하세요.
샌드박스 애플리케이션은
transaction.created 또는 transaction.status.updated webhook을 보내지 않습니다. 이 이벤트를 테스트하려면 라이브 애플리케이션을 사용하거나 콘솔의 API & Webhooks → Try Webhook을 사용하세요. Travel Rule 샌드박스 교환은 environment: sandbox가 포함된 travel_rule.status.updated webhook을 보냅니다. 실서비스 전에 교환을 테스트하려면 Didit Test VASP를 사용하세요.엔벌로프
Didit webhook의 본문은 평면 구조입니다. 이벤트 필드가 엔벌로프 필드와 나란히 최상위 수준에 놓이며, 중첩된data 객체는 없습니다.
모든 전송에는 다음 필드가 포함됩니다.
payload 형식
transaction.created 및 transaction.status.updated
두 이벤트는 하나의 payload를 공유합니다. 간략한 요약과 action_required 블록(또는 null)으로 구성됩니다.
GET /v3/transactions/{transaction_id}/로 전체 레코드를 가져오세요. 이 응답에는 전체 상세 정보(당사자, rule_runs, provider_results, travel_rule, cost_breakdown, decision_reason_code)가 포함되며, 상태가 왜 변경되었는지도 확인할 수 있습니다.
transaction_rule_suggestions.created
이 이벤트는 단일 거래가 아니라 규칙 집합에 관한 것이므로 거래 ID를 포함하지 않습니다.
개인 데이터는 전혀 포함되지 않으며, 제안 ID, 종류, 제목, 개수만 담겨 있습니다.
본문에는 일반적인 엔벌로프 필드(
event_id, timestamp, application_id, environment)가 추가됩니다.
travel_rule.status.updated
FINISHED, CANCELLED, EXPIRED로의 전환도 포함됩니다. 이체가 이 상태 중 하나에 도달하면 해당 이체에 대해서는 더 이상 Travel Rule 이벤트가 전송되지 않습니다.
이벤트는 이전 이벤트와 같은 상태를 반복할 수 있습니다. 예를 들어 재전송 시에도 레일을 찾지 못해 이체가 COUNTERPARTY_VASP_NOT_FOUND 상태에 머무는 경우가 여기에 해당합니다.
rail은 INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP(Didit Test VASP가 응답한 샌드박스 이체이며, test_vasp: true와 test_vasp_scenario도 함께 포함됨), 또는 레일이 선택되지 않은 동안의 ""입니다. sunrise 등록에서는 항상 ""입니다.
거래 생성, sunrise 등록, 인바운드 TRP 조회, INTERNAL 레일 수신 구간에서 Didit은 transaction.created를 먼저 보내고, 그 뒤에 해당 거래의 travel_rule.status.updated 이벤트를 보냅니다.
이 단계에서 거래 상태를 변경하는 규칙은 transaction.created보다 앞서 transaction.status.updated를 보낼 수도 있습니다.
이미 생성한 입금 거래에 연결되는 sunrise 등록은 transaction.created를 보내지 않습니다.
각 webhook은 독립적으로 전송되고 재시도되므로, 재시도된 이벤트가 이후 이벤트보다 늦게 도착할 수 있습니다. 핸들러는 transaction_id를 기준으로 처리하고, 현재 상태가 필요하면 거래를 다시 조회하세요.
상태 변화 예시
단순 승인
검토 후 승인
추가 인증 단계
Travel Rule 이체
transaction.created가 먼저 큐에 들어갑니다. 각 webhook은 독립적으로 전송되므로 도착 순서에 의존하지 마세요.
TRUST로 보낸 이체는 COMPLETED 이벤트를 받지 않습니다. TRUST는 Didit이 읽을 수 있는 응답을 보내지 않기 때문입니다. 이체는 확인 기한까지 AWAITING_COUNTERPARTY 상태에 머물다가 EXPIRED로 끝납니다. GTR, VerifyVASP, Sygna Bridge에서는 Didit이 네트워크에서 거래 상대방의 응답을 읽으며, 이벤트는 그 응답 이후에 발생합니다.
서명 검증
모든 전송은 대상의 공유 비밀을 사용하여 HMAC-SHA256으로 서명되며, 서명 헤더 세 개와 타임스탬프가 함께 전달됩니다.재시도 및 전송 보장
5xx,404, 시간 초과 또는 연결 실패가 발생하면 Didit은 최대 2회 재시도합니다. 첫 실패 후 약 1분 뒤에 한 번, 그 후 약 4분 뒤에 한 번 더 재시도합니다.- 재시도된 전송은 동일한
event_id를 재사용하므로, 핸들러에서 이 값으로 중복을 제거하십시오. - 최종 실패 후에는 해당 이벤트의 전송이 중단되고 귀하의 조직에 알림이 전송됩니다. 대상이 조용히 비활성화되는 일은 결코 없습니다.
2xx응답은 빠르게 반환하십시오(큐에 넣은 후 처리). 응답이 느리면 시간 초과와 중복 전송이 발생할 위험이 있습니다.
멱등성
자체 중복 제거 저장소에event_id를 저장하여 각 webhook을 정확히 한 번만 처리하십시오. 엔드포인트가 응답 확인(ACK)을 느리게 보내거나 요청 도중 연결이 끊기면 같은 이벤트가 다시 전송될 수 있습니다.
구독하기
다음 단계
webhook 레퍼런스
대상, 서명, 재시도.
상태
전체 상태 머신.
연동 가이드
프로덕션 환경에서 webhook 처리하기.