didit-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +25 -0
  3. data/LICENSE +21 -0
  4. data/README.md +277 -0
  5. data/lib/didit/authentication/base64_url.rb +34 -0
  6. data/lib/didit/authentication/cache.rb +201 -0
  7. data/lib/didit/authentication/http.rb +150 -0
  8. data/lib/didit/authentication/issuer.rb +115 -0
  9. data/lib/didit/authentication/jws.rb +231 -0
  10. data/lib/didit/authentication/key_set.rb +89 -0
  11. data/lib/didit/authentication/pkce.rb +64 -0
  12. data/lib/didit/authentication/types.rb +175 -0
  13. data/lib/didit/authentication.rb +546 -0
  14. data/lib/didit/client.rb +211 -0
  15. data/lib/didit/errors.rb +153 -0
  16. data/lib/didit/file_part.rb +85 -0
  17. data/lib/didit/internal/config.rb +94 -0
  18. data/lib/didit/internal/errors.rb +83 -0
  19. data/lib/didit/internal/log.rb +41 -0
  20. data/lib/didit/internal/multipart.rb +60 -0
  21. data/lib/didit/internal/request.rb +322 -0
  22. data/lib/didit/internal/transport.rb +198 -0
  23. data/lib/didit/internal/util.rb +76 -0
  24. data/lib/didit/internal.rb +15 -0
  25. data/lib/didit/model.rb +199 -0
  26. data/lib/didit/page.rb +130 -0
  27. data/lib/didit/raw_response.rb +57 -0
  28. data/lib/didit/resource.rb +15 -0
  29. data/lib/didit/resources/account.rb +309 -0
  30. data/lib/didit/resources/address_validation.rb +73 -0
  31. data/lib/didit/resources/age_estimation.rb +110 -0
  32. data/lib/didit/resources/aml.rb +166 -0
  33. data/lib/didit/resources/aml_monitoring.rb +30 -0
  34. data/lib/didit/resources/analytics.rb +87 -0
  35. data/lib/didit/resources/bank.rb +65 -0
  36. data/lib/didit/resources/billing.rb +61 -0
  37. data/lib/didit/resources/biometric_templates.rb +234 -0
  38. data/lib/didit/resources/blocklist.rb +130 -0
  39. data/lib/didit/resources/business_sessions.rb +29 -0
  40. data/lib/didit/resources/businesses.rb +471 -0
  41. data/lib/didit/resources/cases.rb +2116 -0
  42. data/lib/didit/resources/customization.rb +153 -0
  43. data/lib/didit/resources/database_validation.rb +327 -0
  44. data/lib/didit/resources/document_ai.rb +145 -0
  45. data/lib/didit/resources/email.rb +254 -0
  46. data/lib/didit/resources/face_match.rb +103 -0
  47. data/lib/didit/resources/face_search.rb +103 -0
  48. data/lib/didit/resources/fraud_checks.rb +130 -0
  49. data/lib/didit/resources/id_verification.rb +163 -0
  50. data/lib/didit/resources/id_wallets.rb +1468 -0
  51. data/lib/didit/resources/investigator.rb +419 -0
  52. data/lib/didit/resources/ip.rb +68 -0
  53. data/lib/didit/resources/kyb.rb +256 -0
  54. data/lib/didit/resources/lists.rb +332 -0
  55. data/lib/didit/resources/monitoring_events.rb +466 -0
  56. data/lib/didit/resources/networks.rb +427 -0
  57. data/lib/didit/resources/passive_liveness.rb +103 -0
  58. data/lib/didit/resources/phone.rb +271 -0
  59. data/lib/didit/resources/pricing.rb +40 -0
  60. data/lib/didit/resources/proof_of_address.rb +167 -0
  61. data/lib/didit/resources/questionnaires.rb +170 -0
  62. data/lib/didit/resources/regulatory_reports.rb +314 -0
  63. data/lib/didit/resources/report_templates.rb +146 -0
  64. data/lib/didit/resources/sessions.rb +2820 -0
  65. data/lib/didit/resources/transactions.rb +981 -0
  66. data/lib/didit/resources/travel_rule.rb +1202 -0
  67. data/lib/didit/resources/users.rb +521 -0
  68. data/lib/didit/resources/wallet_screening.rb +190 -0
  69. data/lib/didit/resources/webhooks.rb +396 -0
  70. data/lib/didit/resources/workflows.rb +214 -0
  71. data/lib/didit/resources.rb +263 -0
  72. data/lib/didit/types/account.rb +11 -0
  73. data/lib/didit/types/account_components.rb +105 -0
  74. data/lib/didit/types/address_validation.rb +8 -0
  75. data/lib/didit/types/age_estimation.rb +89 -0
  76. data/lib/didit/types/aml.rb +193 -0
  77. data/lib/didit/types/aml_monitoring.rb +73 -0
  78. data/lib/didit/types/analytics.rb +62 -0
  79. data/lib/didit/types/bank.rb +8 -0
  80. data/lib/didit/types/billing.rb +18 -0
  81. data/lib/didit/types/biometric_templates.rb +292 -0
  82. data/lib/didit/types/blocklist.rb +31 -0
  83. data/lib/didit/types/businesses.rb +45 -0
  84. data/lib/didit/types/cases.rb +368 -0
  85. data/lib/didit/types/components.rb +12206 -0
  86. data/lib/didit/types/customization.rb +8 -0
  87. data/lib/didit/types/database_validation.rb +177 -0
  88. data/lib/didit/types/document_ai.rb +135 -0
  89. data/lib/didit/types/email.rb +116 -0
  90. data/lib/didit/types/face_match.rb +93 -0
  91. data/lib/didit/types/face_search.rb +129 -0
  92. data/lib/didit/types/fraud_checks.rb +8 -0
  93. data/lib/didit/types/id_verification.rb +231 -0
  94. data/lib/didit/types/id_wallets.rb +8 -0
  95. data/lib/didit/types/investigator.rb +221 -0
  96. data/lib/didit/types/ip.rb +8 -0
  97. data/lib/didit/types/kyb.rb +1391 -0
  98. data/lib/didit/types/lists.rb +111 -0
  99. data/lib/didit/types/monitoring_events.rb +235 -0
  100. data/lib/didit/types/networks.rb +120 -0
  101. data/lib/didit/types/passive_liveness.rb +95 -0
  102. data/lib/didit/types/phone.rb +69 -0
  103. data/lib/didit/types/proof_of_address.rb +166 -0
  104. data/lib/didit/types/questionnaires.rb +29 -0
  105. data/lib/didit/types/regulatory_reports.rb +100 -0
  106. data/lib/didit/types/report_templates.rb +41 -0
  107. data/lib/didit/types/sessions.rb +1441 -0
  108. data/lib/didit/types/transactions.rb +245 -0
  109. data/lib/didit/types/travel_rule.rb +168 -0
  110. data/lib/didit/types/users.rb +180 -0
  111. data/lib/didit/types/wallet_screening.rb +49 -0
  112. data/lib/didit/types/webhooks.rb +355 -0
  113. data/lib/didit/types/workflows.rb +32 -0
  114. data/lib/didit/types.rb +1681 -0
  115. data/lib/didit/version.rb +5 -0
  116. data/lib/didit/webhooks/canonical_json.rb +187 -0
  117. data/lib/didit/webhooks/client_methods.rb +23 -0
  118. data/lib/didit/webhooks/events.rb +221 -0
  119. data/lib/didit/webhooks/headers.rb +83 -0
  120. data/lib/didit/webhooks/verifier.rb +260 -0
  121. data/lib/didit/webhooks.rb +99 -0
  122. data/lib/didit-sdk.rb +4 -0
  123. data/lib/didit.rb +31 -0
  124. data/sig/didit/authentication/base64_url.rbs +10 -0
  125. data/sig/didit/authentication/cache.rbs +60 -0
  126. data/sig/didit/authentication/http.rbs +37 -0
  127. data/sig/didit/authentication/issuer.rbs +17 -0
  128. data/sig/didit/authentication/jws.rbs +41 -0
  129. data/sig/didit/authentication/jwt.rbs +14 -0
  130. data/sig/didit/authentication/key_set.rbs +25 -0
  131. data/sig/didit/authentication/pkce.rbs +20 -0
  132. data/sig/didit/authentication/types.rbs +114 -0
  133. data/sig/didit/authentication.rbs +81 -0
  134. data/sig/didit/client.rbs +61 -0
  135. data/sig/didit/errors.rbs +80 -0
  136. data/sig/didit/file_part.rbs +19 -0
  137. data/sig/didit/internal.rbs +199 -0
  138. data/sig/didit/model.rbs +42 -0
  139. data/sig/didit/page.rbs +34 -0
  140. data/sig/didit/raw_response.rbs +20 -0
  141. data/sig/didit/resource.rbs +8 -0
  142. data/sig/didit/resources/account.rbs +23 -0
  143. data/sig/didit/resources/address_validation.rbs +9 -0
  144. data/sig/didit/resources/age_estimation.rbs +9 -0
  145. data/sig/didit/resources/aml.rbs +10 -0
  146. data/sig/didit/resources/aml_monitoring.rbs +9 -0
  147. data/sig/didit/resources/analytics.rbs +9 -0
  148. data/sig/didit/resources/bank.rbs +9 -0
  149. data/sig/didit/resources/billing.rbs +10 -0
  150. data/sig/didit/resources/biometric_templates.rbs +13 -0
  151. data/sig/didit/resources/blocklist.rbs +11 -0
  152. data/sig/didit/resources/business_sessions.rbs +9 -0
  153. data/sig/didit/resources/businesses.rbs +22 -0
  154. data/sig/didit/resources/cases.rbs +103 -0
  155. data/sig/didit/resources/customization.rbs +10 -0
  156. data/sig/didit/resources/database_validation.rbs +9 -0
  157. data/sig/didit/resources/document_ai.rbs +9 -0
  158. data/sig/didit/resources/email.rbs +11 -0
  159. data/sig/didit/resources/face_match.rbs +9 -0
  160. data/sig/didit/resources/face_search.rbs +9 -0
  161. data/sig/didit/resources/fraud_checks.rbs +11 -0
  162. data/sig/didit/resources/id_verification.rbs +9 -0
  163. data/sig/didit/resources/id_wallets.rbs +37 -0
  164. data/sig/didit/resources/investigator.rbs +23 -0
  165. data/sig/didit/resources/ip.rbs +9 -0
  166. data/sig/didit/resources/kyb.rbs +12 -0
  167. data/sig/didit/resources/lists.rbs +20 -0
  168. data/sig/didit/resources/monitoring_events.rbs +16 -0
  169. data/sig/didit/resources/networks.rbs +25 -0
  170. data/sig/didit/resources/passive_liveness.rbs +9 -0
  171. data/sig/didit/resources/phone.rbs +11 -0
  172. data/sig/didit/resources/pricing.rbs +9 -0
  173. data/sig/didit/resources/proof_of_address.rbs +9 -0
  174. data/sig/didit/resources/questionnaires.rbs +13 -0
  175. data/sig/didit/resources/regulatory_reports.rbs +16 -0
  176. data/sig/didit/resources/report_templates.rbs +13 -0
  177. data/sig/didit/resources/sessions.rbs +78 -0
  178. data/sig/didit/resources/transactions.rbs +43 -0
  179. data/sig/didit/resources/travel_rule.rbs +62 -0
  180. data/sig/didit/resources/users.rbs +21 -0
  181. data/sig/didit/resources/wallet_screening.rbs +11 -0
  182. data/sig/didit/resources/webhooks.rbs +23 -0
  183. data/sig/didit/resources/workflows.rbs +13 -0
  184. data/sig/didit/resources.rbs +50 -0
  185. data/sig/didit/types/account.rbs +22 -0
  186. data/sig/didit/types/account_components.rbs +94 -0
  187. data/sig/didit/types/address_validation.rbs +7 -0
  188. data/sig/didit/types/age_estimation.rbs +80 -0
  189. data/sig/didit/types/aml.rbs +174 -0
  190. data/sig/didit/types/aml_monitoring.rbs +67 -0
  191. data/sig/didit/types/analytics.rbs +57 -0
  192. data/sig/didit/types/bank.rbs +9 -0
  193. data/sig/didit/types/billing.rbs +19 -0
  194. data/sig/didit/types/biometric_templates.rbs +268 -0
  195. data/sig/didit/types/blocklist.rbs +33 -0
  196. data/sig/didit/types/businesses.rbs +54 -0
  197. data/sig/didit/types/cases.rbs +414 -0
  198. data/sig/didit/types/components.rbs +10920 -0
  199. data/sig/didit/types/customization.rbs +7 -0
  200. data/sig/didit/types/database_validation.rbs +152 -0
  201. data/sig/didit/types/document_ai.rbs +123 -0
  202. data/sig/didit/types/email.rbs +112 -0
  203. data/sig/didit/types/face_match.rbs +86 -0
  204. data/sig/didit/types/face_search.rbs +112 -0
  205. data/sig/didit/types/fraud_checks.rbs +9 -0
  206. data/sig/didit/types/id_verification.rbs +196 -0
  207. data/sig/didit/types/id_wallets.rbs +55 -0
  208. data/sig/didit/types/investigator.rbs +212 -0
  209. data/sig/didit/types/ip.rbs +7 -0
  210. data/sig/didit/types/kyb.rbs +1254 -0
  211. data/sig/didit/types/lists.rbs +106 -0
  212. data/sig/didit/types/monitoring_events.rbs +234 -0
  213. data/sig/didit/types/networks.rbs +113 -0
  214. data/sig/didit/types/passive_liveness.rbs +87 -0
  215. data/sig/didit/types/phone.rbs +65 -0
  216. data/sig/didit/types/proof_of_address.rbs +144 -0
  217. data/sig/didit/types/questionnaires.rbs +30 -0
  218. data/sig/didit/types/regulatory_reports.rbs +101 -0
  219. data/sig/didit/types/report_templates.rbs +42 -0
  220. data/sig/didit/types/sessions.rbs +1349 -0
  221. data/sig/didit/types/transactions.rbs +273 -0
  222. data/sig/didit/types/travel_rule.rbs +188 -0
  223. data/sig/didit/types/users.rbs +181 -0
  224. data/sig/didit/types/wallet_screening.rbs +40 -0
  225. data/sig/didit/types/webhooks.rbs +311 -0
  226. data/sig/didit/types/workflows.rbs +30 -0
  227. data/sig/didit/webhooks/canonical_json.rbs +25 -0
  228. data/sig/didit/webhooks/client_methods.rbs +11 -0
  229. data/sig/didit/webhooks/events.rbs +125 -0
  230. data/sig/didit/webhooks/headers.rbs +22 -0
  231. data/sig/didit/webhooks/verifier.rbs +54 -0
  232. data/sig/didit/webhooks.rbs +37 -0
  233. data/sig/didit.rbs +20 -0
  234. metadata +300 -0
@@ -0,0 +1,1202 @@
1
+ # Code generated by codegen from openapi/*.json. DO NOT EDIT.
2
+ # frozen_string_literal: true
3
+
4
+ module Didit
5
+ module Resources
6
+ # The +travel_rule+ resource.
7
+ class TravelRule < Didit::Resource
8
+ # @return [Didit::Resources::TravelRule::CounterpartyContacts]
9
+ def counterparty_contacts
10
+ @counterparty_contacts ||= CounterpartyContacts.new(@client)
11
+ end
12
+
13
+ # @return [Didit::Resources::TravelRule::Networks]
14
+ def networks
15
+ @networks ||= Networks.new(@client)
16
+ end
17
+
18
+ # @return [Didit::Resources::TravelRule::Transfers]
19
+ def transfers
20
+ @transfers ||= Transfers.new(@client)
21
+ end
22
+
23
+ # @return [Didit::Resources::TravelRule::WalletAddresses]
24
+ def wallet_addresses
25
+ @wallet_addresses ||= WalletAddresses.new(@client)
26
+ end
27
+
28
+ # @return [Didit::Resources::TravelRule::WalletProofs]
29
+ def wallet_proofs
30
+ @wallet_proofs ||= WalletProofs.new(@client)
31
+ end
32
+
33
+ # @return [Didit::Resources::TravelRule::Workspace]
34
+ def workspace
35
+ @workspace ||= Workspace.new(@client)
36
+ end
37
+
38
+ # Clear your decision on a VASP
39
+ #
40
+ # Clear your application's own decision on a counterparty. The response shows the decision that applies
41
+ # afterwards: null, or for an entity of a brand the brand's decision, which the entity follows again.
42
+ #
43
+ # +DELETE /v3/travel-rule/vasps/{vasp_id}/decision/+
44
+ #
45
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
46
+ # member.
47
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
48
+ # @return [Didit::Types::TravelRuleCounterpartyDecisionResponse]
49
+ def clear_vasp_decision(vasp_id, request_options: nil)
50
+ @client.request(
51
+ :delete,
52
+ "/v3/travel-rule/vasps/{vasp_id}/decision/",
53
+ path_params: { "vasp_id" => vasp_id },
54
+ response: Types::TravelRuleCounterpartyDecisionResponse,
55
+ request_options: request_options
56
+ )
57
+ end
58
+
59
+ # Mint a wallet-ownership widget session
60
+ #
61
+ # Mint a hosted wallet-ownership widget URL/token. Send the customer to the returned url to prove control of a
62
+ # wallet (message signing, Satoshi test, screenshot, or self-declaration). The widget is web-only in this
63
+ # release - open the url in the system browser or a custom tab, never inside a mobile SDK webview.
64
+ #
65
+ # +POST /v3/travel-rule/widget-session/+
66
+ #
67
+ # @param wallet_address [String] The wallet address to verify. Optional; when empty, the address must be
68
+ # supplied when a proof is started.
69
+ # @param chain [String] Chain token for the address, for example `ETH`, `BTC` or `SOL`. Use the same token as in
70
+ # your wallet address book. Message signing and the Satoshi test are offered only for a supported chain. The
71
+ # address book entry the proof verifies stores it under its canonical identifier (ETH, BTC, SOL, TRX).
72
+ # @param holder_name [String] Name of the wallet holder, used for the beneficiary name match.
73
+ # @param vendor_data [String] Your internal identifier for the holder, carried onto the created address-book
74
+ # entry.
75
+ # @param transaction_id [String, nil] Optional. Didit transaction UUID of a Travel Rule transfer to advance when
76
+ # the proof verifies.
77
+ # @param satoshi_deposit_address [String] Optional. A deposit address you control; supplying it enables the
78
+ # SATOSHI_TEST proof method.
79
+ # @param callback_url [String] Optional. Absolute http(s) URL where the widget returns the customer after
80
+ # completion.
81
+ # @param expires_in_minutes [Integer] Optional. Lifetime of the minted link, in minutes. Automatically extended
82
+ # to cover the Satoshi test window when SATOSHI_TEST is offered.
83
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
84
+ # @return [Didit::Types::TravelRuleWidgetSessionResponse]
85
+ def create_widget_session(
86
+ wallet_address: OMIT,
87
+ chain: OMIT,
88
+ holder_name: OMIT,
89
+ vendor_data: OMIT,
90
+ transaction_id: OMIT,
91
+ satoshi_deposit_address: OMIT,
92
+ callback_url: OMIT,
93
+ expires_in_minutes: OMIT,
94
+ request_options: nil
95
+ )
96
+ @client.request(
97
+ :post,
98
+ "/v3/travel-rule/widget-session/",
99
+ body: {
100
+ "wallet_address" => wallet_address,
101
+ "chain" => chain,
102
+ "holder_name" => holder_name,
103
+ "vendor_data" => vendor_data,
104
+ "transaction_id" => transaction_id,
105
+ "satoshi_deposit_address" => satoshi_deposit_address,
106
+ "callback_url" => callback_url,
107
+ "expires_in_minutes" => expires_in_minutes
108
+ },
109
+ response: Types::TravelRuleWidgetSessionResponse,
110
+ request_options: request_options
111
+ )
112
+ end
113
+
114
+ # List due-diligence questionnaires with a VASP
115
+ #
116
+ # Every due-diligence questionnaire your application sent the counterparty, newest first, with its status and,
117
+ # once answered, the answers. Private to your application.
118
+ #
119
+ # +GET /v3/travel-rule/vasps/{vasp_id}/questionnaires/+
120
+ #
121
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
122
+ # member.
123
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
124
+ # @return [Didit::Types::TravelRuleCounterpartyQuestionnaireList]
125
+ def list_vasp_questionnaires(vasp_id, request_options: nil)
126
+ @client.request(
127
+ :get,
128
+ "/v3/travel-rule/vasps/{vasp_id}/questionnaires/",
129
+ path_params: { "vasp_id" => vasp_id },
130
+ response: Types::TravelRuleCounterpartyQuestionnaireList,
131
+ request_options: request_options
132
+ )
133
+ end
134
+
135
+ # Search the VASP directory
136
+ #
137
+ # Paginated, name-sorted search of the VASP directory: the shared directory entries, which Didit builds from the
138
+ # ESMA interim MiCA register, the public TRISA directory, the global LEI register and its own curation, plus the
139
+ # members of the Didit network. Each row carries the routes your application has to it today. Your own
140
+ # application's profile is never listed. Rows also carry the shared due-diligence assessment and your
141
+ # application's own decision, entity screening and questionnaires.
142
+ #
143
+ # +GET /v3/travel-rule/vasps/+
144
+ #
145
+ # @param search [String] A name or alias fragment (case-insensitive), an exact LEI, or a domain (example.com or
146
+ # a URL on it). Didit network members match on their legal name, LEI or the domain of their compliance email.
147
+ # @param network [String] Only directory entries a network's member directory currently lists.
148
+ # @param jurisdiction [String] ISO 3166 alpha-2 or alpha-3 country code. 400 for anything else.
149
+ # @param reachable [Boolean] true: only VASPs your application has an available route to (Didit network members
150
+ # included). false: only directory entries it cannot reach today.
151
+ # @param kind [String] Only directory entries, or only Didit network members.
152
+ # @param risk [String] Only directory entries whose risk_level is this band. Didit network members, which are
153
+ # not scored, never match.
154
+ # @param responsiveness [String] Only directory entries whose responsiveness.status is this value. Didit network
155
+ # members never match.
156
+ # @param limit [Integer]
157
+ # @param offset [Integer]
158
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
159
+ # @return [Didit::Page<Didit::Types::VaspDirectoryEntry>]
160
+ def list_vasps(
161
+ search: OMIT,
162
+ network: OMIT,
163
+ jurisdiction: OMIT,
164
+ reachable: OMIT,
165
+ kind: OMIT,
166
+ risk: OMIT,
167
+ responsiveness: OMIT,
168
+ limit: OMIT,
169
+ offset: OMIT,
170
+ request_options: nil
171
+ )
172
+ @client.request(
173
+ :get,
174
+ "/v3/travel-rule/vasps/",
175
+ query: {
176
+ "search" => search,
177
+ "network" => network,
178
+ "jurisdiction" => jurisdiction,
179
+ "reachable" => reachable,
180
+ "kind" => kind,
181
+ "risk" => risk,
182
+ "responsiveness" => responsiveness,
183
+ "limit" => limit,
184
+ "offset" => offset
185
+ },
186
+ page: Types::VaspDirectoryEntry,
187
+ request_options: request_options
188
+ )
189
+ end
190
+
191
+ # Register an after-deposit (sunrise) inbound transfer
192
+ #
193
+ # Register Travel Rule data for a crypto deposit that already settled on-chain before any exchange took place.
194
+ # Creates an inbound travelRule transaction (or reuses an unclaimed deposit) and resolves the transfer against
195
+ # your wallet address book. For a newly created transaction, Didit sends transaction.created first and the
196
+ # travel_rule.status.updated webhooks after it.
197
+ #
198
+ # +POST /v3/travel-rule/inbound/+
199
+ #
200
+ # @param chain [String] Chain the deposit settled on, for example `ETH`. Stored lowercase and compared
201
+ # case-insensitively with your wallet address book entries, so use the same chain token there.
202
+ # @param txid [String] On-chain transaction hash. Deduped together with wallet_address.
203
+ # @param wallet_address [String] The destination wallet you received the deposit on. An XRP X-address is split
204
+ # into its classic address and tag.
205
+ # @param amount [String] Deposit amount as a decimal string, zero or greater, with up to 18 decimal places.
206
+ # @param currency [String] Deposit asset, e.g. "USDC".
207
+ # @param originator_data [Hash] Originator details from the sending VASP, if known, as a flat object such as
208
+ # `{"name": "..."}`. Didit reads name (or full_name), first_name, last_name and vendor_data from it.
209
+ # @param beneficiary_data [Hash] Beneficiary details (your customer), as a flat object such as `{"name":
210
+ # "..."}`. Didit matches name against the holder_name of the matched address book entry, and sets wallet_address
211
+ # and chain from the request.
212
+ # @param originating_vasp [Hash] Optional description of the sending VASP. It stays on this transfer only
213
+ # (`metadata.originating_vasp`, and the transfer's originator VASP in GET /v3/travel-rule/transfers/); it never
214
+ # creates, edits or links a shared VASP directory entry.
215
+ # @param memo [String] Optional. The deposit's destination tag or memo on a memo network: on a shared deposit
216
+ # address it is what tells your customers apart, and the address-book entry for that memo is matched. XRP: a
217
+ # destination tag, a whole number from 0 to 4294967295 (a JSON number is accepted). XLM: a text memo of up to 28
218
+ # bytes, a 64-bit id or a 32-byte hash in hex. EOS: up to 256 bytes. ATOM: up to 256 characters....
219
+ # @param utxo [Hash] Optional, UTXO chains only. The deposit transaction's inputs and outputs: the sender's
220
+ # wallet is the declared `originator_data.wallet_address`, else the largest input.
221
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
222
+ # @return [Didit::Types::TravelRuleInboundResponse]
223
+ def register_inbound(
224
+ chain:,
225
+ txid:,
226
+ wallet_address:,
227
+ amount:,
228
+ currency:,
229
+ originator_data: OMIT,
230
+ beneficiary_data: OMIT,
231
+ originating_vasp: OMIT,
232
+ memo: OMIT,
233
+ utxo: OMIT,
234
+ request_options: nil
235
+ )
236
+ @client.request(
237
+ :post,
238
+ "/v3/travel-rule/inbound/",
239
+ body: {
240
+ "chain" => chain,
241
+ "txid" => txid,
242
+ "wallet_address" => wallet_address,
243
+ "amount" => amount,
244
+ "currency" => currency,
245
+ "originator_data" => originator_data,
246
+ "beneficiary_data" => beneficiary_data,
247
+ "originating_vasp" => originating_vasp,
248
+ "memo" => memo,
249
+ "utxo" => utxo
250
+ },
251
+ response: Types::TravelRuleInboundResponse,
252
+ request_options: request_options
253
+ )
254
+ end
255
+
256
+ # Get Travel Rule settings
257
+ #
258
+ # Read the application's Travel Rule settings and VASP profile. Auto-creates a default (disabled) settings row
259
+ # and an empty profile on first read.
260
+ #
261
+ # +GET /v3/travel-rule/settings/+
262
+ #
263
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
264
+ # @return [Didit::Types::TravelRuleSettingsDetail]
265
+ def retrieve_settings(request_options: nil)
266
+ @client.request(
267
+ :get,
268
+ "/v3/travel-rule/settings/",
269
+ response: Types::TravelRuleSettingsDetail,
270
+ request_options: request_options
271
+ )
272
+ end
273
+
274
+ # Get a VASP directory entry
275
+ #
276
+ # One directory entry or Didit network member by the id the search returned, with the same fields and the routes
277
+ # your application has to it.
278
+ #
279
+ # +GET /v3/travel-rule/vasps/{vasp_id}/+
280
+ #
281
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/.
282
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
283
+ # @return [Didit::Types::VaspDirectoryEntry]
284
+ def retrieve_vasp(vasp_id, request_options: nil)
285
+ @client.request(
286
+ :get,
287
+ "/v3/travel-rule/vasps/{vasp_id}/",
288
+ path_params: { "vasp_id" => vasp_id },
289
+ response: Types::VaspDirectoryEntry,
290
+ request_options: request_options
291
+ )
292
+ end
293
+
294
+ # Get your decision on a VASP
295
+ #
296
+ # Your application's decision on a counterparty (a directory entry or a Didit network member): approved,
297
+ # restricted or blocked. An entity of a brand with no decision of its own follows the brand's decision, named in
298
+ # inherited_from. Private to your application.
299
+ #
300
+ # +GET /v3/travel-rule/vasps/{vasp_id}/decision/+
301
+ #
302
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
303
+ # member.
304
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
305
+ # @return [Didit::Types::TravelRuleCounterpartyDecisionResponse]
306
+ def retrieve_vasp_decision(vasp_id, request_options: nil)
307
+ @client.request(
308
+ :get,
309
+ "/v3/travel-rule/vasps/{vasp_id}/decision/",
310
+ path_params: { "vasp_id" => vasp_id },
311
+ response: Types::TravelRuleCounterpartyDecisionResponse,
312
+ request_options: request_options
313
+ )
314
+ end
315
+
316
+ # Get a VASP's entity screening
317
+ #
318
+ # Whether counterparty screening is on for your application, what one screening costs your organization, how
319
+ # long a result stays fresh, and your latest sanctions and adverse-media screening of the counterparty. Reading
320
+ # it is free.
321
+ #
322
+ # +GET /v3/travel-rule/vasps/{vasp_id}/screening/+
323
+ #
324
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
325
+ # member.
326
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
327
+ # @return [Didit::Types::TravelRuleCounterpartyScreeningStatus]
328
+ def retrieve_vasp_screening(vasp_id, request_options: nil)
329
+ @client.request(
330
+ :get,
331
+ "/v3/travel-rule/vasps/{vasp_id}/screening/",
332
+ path_params: { "vasp_id" => vasp_id },
333
+ response: Types::TravelRuleCounterpartyScreeningStatus,
334
+ request_options: request_options
335
+ )
336
+ end
337
+
338
+ # Screen a VASP
339
+ #
340
+ # Screen the counterparty entity against sanctions and adverse media for your application. Opt-in:
341
+ # counterparty_screening_enabled must be on in your Travel Rule settings. Each new screening is billed at your
342
+ # organization's Company AML Screening price; a screening younger than 30 days is returned instead (200, not
343
+ # billed) unless you send refresh: true. One screening of a counterparty runs at a time per application. The
344
+ # result is private to your application. Sandbox applications are never screened.
345
+ #
346
+ # +POST /v3/travel-rule/vasps/{vasp_id}/screening/+
347
+ #
348
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
349
+ # member.
350
+ # @param refresh [Boolean] true screens again (and bills again) even when a fresh screening exists.
351
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
352
+ # @return [Didit::Types::TravelRuleCounterpartyScreeningResult]
353
+ def screen_vasp(vasp_id, refresh: OMIT, request_options: nil)
354
+ @client.request(
355
+ :post,
356
+ "/v3/travel-rule/vasps/{vasp_id}/screening/",
357
+ path_params: { "vasp_id" => vasp_id },
358
+ body: {
359
+ "refresh" => refresh
360
+ },
361
+ response: Types::TravelRuleCounterpartyScreeningResult,
362
+ request_options: request_options
363
+ )
364
+ end
365
+
366
+ # Send the compliance email confirmation
367
+ #
368
+ # Emails a single-use confirmation link to your VASP profile's compliance_email. Opening the link and pressing
369
+ # its confirm button confirms the address, which the Didit network needs before it lists your profile. A new
370
+ # request replaces the previous link; the link stops working when the compliance email changes. One email per
371
+ # minute per address.
372
+ #
373
+ # +POST /v3/travel-rule/settings/compliance-email/confirmation/+
374
+ #
375
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
376
+ # @return [Didit::Types::TravelRuleSendComplianceEmailConfirmationResponse]
377
+ def send_compliance_email_confirmation(request_options: nil)
378
+ @client.request(
379
+ :post,
380
+ "/v3/travel-rule/settings/compliance-email/confirmation/",
381
+ response: Types::TravelRuleSendComplianceEmailConfirmationResponse,
382
+ request_options: request_options
383
+ )
384
+ end
385
+
386
+ # Send a due-diligence questionnaire to a VASP
387
+ #
388
+ # Email Didit's standard due-diligence questionnaire to a compliance address on record for the counterparty,
389
+ # with a single-use answer link. The counterparty has 30 days to answer every question; the answers stay current
390
+ # for 365 days. A new send replaces your earlier unanswered questionnaire to the same counterparty, whose link
391
+ # stops working. One email per minute per address.
392
+ #
393
+ # +POST /v3/travel-rule/vasps/{vasp_id}/questionnaires/+
394
+ #
395
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
396
+ # member.
397
+ # @param sent_to [String] Optional. A compliance address on record for the counterparty: for a directory entry
398
+ # its compliance address or a contact your application sees, for a Didit network member its confirmed compliance
399
+ # email. Default: the address a Travel Rule email to the counterparty goes to (your own contact first, then a
400
+ # platform contact, then the entry's compliance address).
401
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
402
+ # @return [Didit::Types::TravelRuleCounterpartyQuestionnaire]
403
+ def send_vasp_questionnaire(vasp_id, sent_to: OMIT, request_options: nil)
404
+ @client.request(
405
+ :post,
406
+ "/v3/travel-rule/vasps/{vasp_id}/questionnaires/",
407
+ path_params: { "vasp_id" => vasp_id },
408
+ body: {
409
+ "sent_to" => sent_to
410
+ },
411
+ response: Types::TravelRuleCounterpartyQuestionnaire,
412
+ request_options: request_options
413
+ )
414
+ end
415
+
416
+ # Update Travel Rule settings
417
+ #
418
+ # Upsert the application's Travel Rule settings and VASP profile. Partial update - only send the fields you want
419
+ # to change. Setting `is_enabled: true` requires a non-blank `legal_name` (already stored or included in the
420
+ # same request), otherwise returns 400.
421
+ #
422
+ # +PUT /v3/travel-rule/settings/+
423
+ #
424
+ # @param is_enabled [Boolean]
425
+ # @param legal_name [String]
426
+ # @param lei [String]
427
+ # @param jurisdiction [String]
428
+ # @param name_matching_strictness [String] `CONTAINS` accepts one name whose words all appear in the other.
429
+ # @param confirmation_timeout_hours [Integer]
430
+ # @param timeout_outcome [String]
431
+ # @param compliance_email [String] Compliance contact email for your VASP profile. The Didit network lists your
432
+ # profile only once this address is confirmed through an emailed link (POST
433
+ # /v3/travel-rule/settings/compliance-email/confirmation/); changing it needs a new confirmation.
434
+ # @param is_discoverable [Boolean] Whether your VASP profile can be listed in the Didit network: found in GET
435
+ # /v3/travel-rule/vasps/ by other Didit customers and reached on the INTERNAL rail. Listing also needs a live
436
+ # application, Travel Rule on, a legal name and a confirmed compliance email; didit_network says which are
437
+ # missing. Default true.
438
+ # @param threshold_amount [String] Decimal string, zero or greater, in your application's default currency.
439
+ # Minimum transfer amount that triggers a managed exchange.
440
+ # @param ownership_validation_mode [String] See the response field of the same name.
441
+ # @param simplified_validation_threshold [String] Decimal string, 0 or more.
442
+ # @param data_sharing_fields [Hash] Merged per entity type: an entity type you leave out keeps its current
443
+ # choice. A choice that cannot meet the originator obligations of your `jurisdiction` regime (EU TFR or FATF
444
+ # Recommendation 16), an empty list included, is refused with `400`.
445
+ # @param matching_rules [Hash] Merged per entity type, and per field inside it. A field that entity type does
446
+ # not compare (for example `date_of_birth` for `company`) is refused with `400`.
447
+ # @param inbound_auto_accept [Boolean]
448
+ # @param allow_self_declaration [Boolean]
449
+ # @param allow_screenshot_proof [Boolean] When true, the wallet-ownership widget offers screenshot upload as an
450
+ # ownership evidence method. Default true.
451
+ # @param auto_wallet_verification [Boolean]
452
+ # @param vasp_attribution_enabled [Boolean]
453
+ # @param counterparty_screening_enabled [Boolean] Opt-in sanctions and adverse-media screening of counterparty
454
+ # VASPs, billed per screening at the Company AML Screening price. When on, Didit screens the counterparty an
455
+ # outbound exchange reaches (reusing a screening younger than 30 days) and you can screen one with POST
456
+ # /v3/travel-rule/vasps/{vasp_id}/screening/. Default false: nothing is screened or billed.
457
+ # @param sunrise_policy [String] HOLD, REJECT, PROCEED, or empty to follow timeout_outcome. See the response
458
+ # field of the same name.
459
+ # @param non_responsive_policy [String] HOLD, REJECT, PROCEED, or empty to follow timeout_outcome. See the
460
+ # response field of the same name.
461
+ # @param disabled_networks [Array<String>] Networks opted out of platform membership. Does not disable your
462
+ # connected own memberships or provision unavailable networks.
463
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
464
+ # @return [Didit::Types::TravelRuleSettingsDetail]
465
+ def update_settings(
466
+ is_enabled: OMIT,
467
+ legal_name: OMIT,
468
+ lei: OMIT,
469
+ jurisdiction: OMIT,
470
+ name_matching_strictness: OMIT,
471
+ confirmation_timeout_hours: OMIT,
472
+ timeout_outcome: OMIT,
473
+ compliance_email: OMIT,
474
+ is_discoverable: OMIT,
475
+ threshold_amount: OMIT,
476
+ ownership_validation_mode: OMIT,
477
+ simplified_validation_threshold: OMIT,
478
+ data_sharing_fields: OMIT,
479
+ matching_rules: OMIT,
480
+ inbound_auto_accept: OMIT,
481
+ allow_self_declaration: OMIT,
482
+ allow_screenshot_proof: OMIT,
483
+ auto_wallet_verification: OMIT,
484
+ vasp_attribution_enabled: OMIT,
485
+ counterparty_screening_enabled: OMIT,
486
+ sunrise_policy: OMIT,
487
+ non_responsive_policy: OMIT,
488
+ disabled_networks: OMIT,
489
+ request_options: nil
490
+ )
491
+ @client.request(
492
+ :put,
493
+ "/v3/travel-rule/settings/",
494
+ body: {
495
+ "is_enabled" => is_enabled,
496
+ "legal_name" => legal_name,
497
+ "lei" => lei,
498
+ "jurisdiction" => jurisdiction,
499
+ "name_matching_strictness" => name_matching_strictness,
500
+ "confirmation_timeout_hours" => confirmation_timeout_hours,
501
+ "timeout_outcome" => timeout_outcome,
502
+ "compliance_email" => compliance_email,
503
+ "is_discoverable" => is_discoverable,
504
+ "threshold_amount" => threshold_amount,
505
+ "ownership_validation_mode" => ownership_validation_mode,
506
+ "simplified_validation_threshold" => simplified_validation_threshold,
507
+ "data_sharing_fields" => data_sharing_fields,
508
+ "matching_rules" => matching_rules,
509
+ "inbound_auto_accept" => inbound_auto_accept,
510
+ "allow_self_declaration" => allow_self_declaration,
511
+ "allow_screenshot_proof" => allow_screenshot_proof,
512
+ "auto_wallet_verification" => auto_wallet_verification,
513
+ "vasp_attribution_enabled" => vasp_attribution_enabled,
514
+ "counterparty_screening_enabled" => counterparty_screening_enabled,
515
+ "sunrise_policy" => sunrise_policy,
516
+ "non_responsive_policy" => non_responsive_policy,
517
+ "disabled_networks" => disabled_networks
518
+ },
519
+ response: Types::TravelRuleSettingsDetail,
520
+ request_options: request_options
521
+ )
522
+ end
523
+
524
+ # Set your decision on a VASP
525
+ #
526
+ # Make or change your application's decision on a counterparty: APPROVED, RESTRICTED or BLOCKED, with an
527
+ # optional reason. It never changes the shared directory entry and acts only through your transaction rules
528
+ # (counterparty_dd_status). A decision on a brand also covers each of its entities that has no decision of its
529
+ # own.
530
+ #
531
+ # +PUT /v3/travel-rule/vasps/{vasp_id}/decision/+
532
+ #
533
+ # @param vasp_id [String] The id of a row of GET /v3/travel-rule/vasps/: a directory entry or a Didit network
534
+ # member.
535
+ # @param decision [String]
536
+ # @param reason [String] Optional. Replaces the previous reason; omit it to clear it.
537
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
538
+ # @return [Didit::Types::TravelRuleCounterpartyDecisionResponse]
539
+ def update_vasp_decision(vasp_id, decision:, reason: OMIT, request_options: nil)
540
+ @client.request(
541
+ :put,
542
+ "/v3/travel-rule/vasps/{vasp_id}/decision/",
543
+ path_params: { "vasp_id" => vasp_id },
544
+ body: {
545
+ "decision" => decision,
546
+ "reason" => reason
547
+ },
548
+ response: Types::TravelRuleCounterpartyDecisionResponse,
549
+ request_options: request_options
550
+ )
551
+ end
552
+
553
+ # The +travel_rule.counterparty_contacts+ resource.
554
+ class CounterpartyContacts < Didit::Resource
555
+ # Add a counterparty contact
556
+ #
557
+ # Adds a private compliance address for one directory entry. Only your application sees and uses it, and the
558
+ # EMAIL rail writes to it before any platform contact. Adding an address the entry already has among your own
559
+ # contacts returns that contact.
560
+ #
561
+ # +POST /v3/travel-rule/counterparty-contacts/+
562
+ #
563
+ # @param counterparty [String] The directory entry's `id`.
564
+ # @param email [String]
565
+ # @param name [String] Optional label.
566
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
567
+ # @return [Didit::Types::TravelRuleCounterpartyContact]
568
+ def create(counterparty:, email:, name: OMIT, request_options: nil)
569
+ @client.request(
570
+ :post,
571
+ "/v3/travel-rule/counterparty-contacts/",
572
+ body: {
573
+ "counterparty" => counterparty,
574
+ "email" => email,
575
+ "name" => name
576
+ },
577
+ response: Types::TravelRuleCounterpartyContact,
578
+ request_options: request_options
579
+ )
580
+ end
581
+
582
+ # Delete a counterparty contact
583
+ #
584
+ # Deletes one of your application's own contacts. The EMAIL rail stops writing to it at once. Platform
585
+ # contacts cannot be deleted.
586
+ #
587
+ # +DELETE /v3/travel-rule/counterparty-contacts/{contact_uuid}/+
588
+ #
589
+ # @param contact_uuid [String]
590
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
591
+ # @return [nil]
592
+ def delete(contact_uuid, request_options: nil)
593
+ @client.request(
594
+ :delete,
595
+ "/v3/travel-rule/counterparty-contacts/{contact_uuid}/",
596
+ path_params: { "contact_uuid" => contact_uuid },
597
+ request_options: request_options
598
+ )
599
+ end
600
+
601
+ # List counterparty contacts
602
+ #
603
+ # The compliance addresses the EMAIL rail may write to for your application: Didit's platform contacts plus
604
+ # your application's own private ones, bounced ones included, newest first. Paginated with `limit` (default
605
+ # 50) and `offset`; `count` stops at 100, so 100 means 100 or more.
606
+ #
607
+ # +GET /v3/travel-rule/counterparty-contacts/+
608
+ #
609
+ # @param counterparty [String] Only the contacts of this directory entry. Must be a UUID; an empty value means
610
+ # no filter.
611
+ # @param limit [Integer] Page size, default 50.
612
+ # @param offset [Integer] Rows to skip.
613
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
614
+ # @return [Didit::Page<Didit::Types::TravelRuleCounterpartyContact>]
615
+ def list(counterparty: OMIT, limit: OMIT, offset: OMIT, request_options: nil)
616
+ @client.request(
617
+ :get,
618
+ "/v3/travel-rule/counterparty-contacts/",
619
+ query: {
620
+ "counterparty" => counterparty,
621
+ "limit" => limit,
622
+ "offset" => offset
623
+ },
624
+ page: Types::TravelRuleCounterpartyContact,
625
+ request_options: request_options
626
+ )
627
+ end
628
+ end
629
+
630
+ # The +travel_rule.networks+ resource.
631
+ class Networks < Didit::Resource
632
+ # Request a Travel Rule network
633
+ #
634
+ # Ask for this application's own participant on a network Didit's membership carries (GTR or Sygna). Without
635
+ # an approved questionnaire the participant waits for it (questionnaire_pending); with one it goes to the
636
+ # network's onboarding (submitted_to_network) and becomes active once the network gives it a code. Idempotent:
637
+ # a pending, onboarding or live participant is returned unchanged. If the network refused the registration
638
+ # (last_error is set), requesting again retries. TRUST and VerifyVASP are reachable only through your own
639
+ # membership: TRUST admits members per VASP, and a VerifyVASP Enclave serves one VASP id.
640
+ #
641
+ # +POST /v3/travel-rule/networks/{network}/request/+
642
+ #
643
+ # @param network [String] The network to join through Didit's membership.
644
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
645
+ # @return [Didit::Types::TravelRuleNetworkParticipant]
646
+ def request_access(network, request_options: nil)
647
+ @client.request(
648
+ :post,
649
+ "/v3/travel-rule/networks/{network}/request/",
650
+ path_params: { "network" => network },
651
+ response: Types::TravelRuleNetworkParticipant,
652
+ request_options: request_options
653
+ )
654
+ end
655
+
656
+ # Get Travel Rule networks
657
+ #
658
+ # Read, for this application, every network's true state: whether it sends through your own membership or
659
+ # through Didit's, and why it cannot yet. Also returns the due-diligence questionnaire and your participants.
660
+ # Reading creates nothing.
661
+ #
662
+ # +GET /v3/travel-rule/networks/+
663
+ #
664
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
665
+ # @return [Didit::Types::TravelRuleNetworksOverview]
666
+ def retrieve(request_options: nil)
667
+ @client.request(
668
+ :get,
669
+ "/v3/travel-rule/networks/",
670
+ response: Types::TravelRuleNetworksOverview,
671
+ request_options: request_options
672
+ )
673
+ end
674
+
675
+ # Get the network questionnaire
676
+ #
677
+ # Read Didit's network due-diligence questionnaire for this application, its status and Didit's review note.
678
+ # An application that never saved one reads an empty draft.
679
+ #
680
+ # +GET /v3/travel-rule/networks/questionnaire/+
681
+ #
682
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
683
+ # @return [Didit::Types::TravelRuleNetworkQuestionnaire]
684
+ def retrieve_questionnaire(request_options: nil)
685
+ @client.request(
686
+ :get,
687
+ "/v3/travel-rule/networks/questionnaire/",
688
+ response: Types::TravelRuleNetworkQuestionnaire,
689
+ request_options: request_options
690
+ )
691
+ end
692
+
693
+ # Submit the network questionnaire
694
+ #
695
+ # Send the saved questionnaire to Didit's review. The saved answers must be complete: every field except lei
696
+ # and data_protection_contact_email, with the three attestations true. Didit approves it, asks for changes
697
+ # (edit and submit again) or rejects it. Networks you requested while it was pending are handed to their
698
+ # onboarding when it is approved.
699
+ #
700
+ # +POST /v3/travel-rule/networks/questionnaire/submit/+
701
+ #
702
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
703
+ # @return [Didit::Types::TravelRuleNetworkQuestionnaire]
704
+ def submit_questionnaire(request_options: nil)
705
+ @client.request(
706
+ :post,
707
+ "/v3/travel-rule/networks/questionnaire/submit/",
708
+ response: Types::TravelRuleNetworkQuestionnaire,
709
+ request_options: request_options
710
+ )
711
+ end
712
+
713
+ # Save network questionnaire answers
714
+ #
715
+ # Save answers to the questionnaire while it is draft or changes_requested. Saves are partial: answers you do
716
+ # not send are kept.
717
+ #
718
+ # +PUT /v3/travel-rule/networks/questionnaire/+
719
+ #
720
+ # @param legal_name [String]
721
+ # @param registration_number [String]
722
+ # @param incorporation_country [String] ISO 3166-1 alpha-2 country code.
723
+ # @param registered_address [String]
724
+ # @param website [String]
725
+ # @param lei [String] Optional. A valid ISO 17442 LEI when given.
726
+ # @param licences [Array<Hash>] Every licence or registration the VASP holds.
727
+ # @param operating_jurisdictions [Array<String>]
728
+ # @param compliance_officer_name [String]
729
+ # @param compliance_officer_email [String]
730
+ # @param aml_ctf_policy_attested [Boolean] Must be true to submit.
731
+ # @param sanctions_screening_attested [Boolean] Must be true to submit.
732
+ # @param data_protection_attested [Boolean] Must be true to submit.
733
+ # @param data_protection_contact_email [String] Optional.
734
+ # @param expected_monthly_transfers [Integer]
735
+ # @param expected_monthly_volume_usd [String] Expected monthly volume in USD, up to 2 decimal places. Returned
736
+ # as a string.
737
+ # @param assets [Array<String>] Asset tickers, stored upper-case, sorted and de-duplicated.
738
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
739
+ # @return [Didit::Types::TravelRuleNetworkQuestionnaire]
740
+ def update_questionnaire(
741
+ legal_name: OMIT,
742
+ registration_number: OMIT,
743
+ incorporation_country: OMIT,
744
+ registered_address: OMIT,
745
+ website: OMIT,
746
+ lei: OMIT,
747
+ licences: OMIT,
748
+ operating_jurisdictions: OMIT,
749
+ compliance_officer_name: OMIT,
750
+ compliance_officer_email: OMIT,
751
+ aml_ctf_policy_attested: OMIT,
752
+ sanctions_screening_attested: OMIT,
753
+ data_protection_attested: OMIT,
754
+ data_protection_contact_email: OMIT,
755
+ expected_monthly_transfers: OMIT,
756
+ expected_monthly_volume_usd: OMIT,
757
+ assets: OMIT,
758
+ request_options: nil
759
+ )
760
+ @client.request(
761
+ :put,
762
+ "/v3/travel-rule/networks/questionnaire/",
763
+ body: {
764
+ "legal_name" => legal_name,
765
+ "registration_number" => registration_number,
766
+ "incorporation_country" => incorporation_country,
767
+ "registered_address" => registered_address,
768
+ "website" => website,
769
+ "lei" => lei,
770
+ "licences" => licences,
771
+ "operating_jurisdictions" => operating_jurisdictions,
772
+ "compliance_officer_name" => compliance_officer_name,
773
+ "compliance_officer_email" => compliance_officer_email,
774
+ "aml_ctf_policy_attested" => aml_ctf_policy_attested,
775
+ "sanctions_screening_attested" => sanctions_screening_attested,
776
+ "data_protection_attested" => data_protection_attested,
777
+ "data_protection_contact_email" => data_protection_contact_email,
778
+ "expected_monthly_transfers" => expected_monthly_transfers,
779
+ "expected_monthly_volume_usd" => expected_monthly_volume_usd,
780
+ "assets" => assets
781
+ },
782
+ response: Types::TravelRuleNetworkQuestionnaire,
783
+ request_options: request_options
784
+ )
785
+ end
786
+ end
787
+
788
+ # The +travel_rule.transfers+ resource.
789
+ class Transfers < Didit::Resource
790
+ # List Travel Rule transfers
791
+ #
792
+ # Your application's Travel Rule transfers, newest first, paginated with `limit` (default 50) and `offset`.
793
+ # Rows carry VASP names, wallets and memos only, never person data. Comma-separated values select several. An
794
+ # unknown value answers 400 naming the parameter, for example `{"direction": ["Unknown value(s): inbound."]}`.
795
+ #
796
+ # +GET /v3/travel-rule/transfers/+
797
+ #
798
+ # @param direction [String] INBOUND, OUTBOUND, or both comma-separated. Case-sensitive.
799
+ # @param status [String] One or more transfer statuses, comma-separated.
800
+ # @param rail [String] One or more of INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP,
801
+ # comma-separated.
802
+ # @param kind [String] withdrawal, deposit or message, comma-separated.
803
+ # @param currency [String] The transaction's currency, case-insensitive.
804
+ # @param start_date [Date, String] Transfers created on or after this day (UTC), YYYY-MM-DD.
805
+ # @param end_date [Date, String] Transfers created on or before this day (UTC), YYYY-MM-DD.
806
+ # @param counterparty [String] The `id` of a directory entry or Didit network member from GET
807
+ # /v3/travel-rule/vasps/: your transfers with that counterparty. A value that is not a valid id answers 400.
808
+ # @param limit [Integer] Page size, default 50.
809
+ # @param offset [Integer] Rows to skip.
810
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
811
+ # @return [Didit::Page<Didit::Types::TravelRuleTransferRow>]
812
+ def list(
813
+ direction: OMIT,
814
+ status: OMIT,
815
+ rail: OMIT,
816
+ kind: OMIT,
817
+ currency: OMIT,
818
+ start_date: OMIT,
819
+ end_date: OMIT,
820
+ counterparty: OMIT,
821
+ limit: OMIT,
822
+ offset: OMIT,
823
+ request_options: nil
824
+ )
825
+ @client.request(
826
+ :get,
827
+ "/v3/travel-rule/transfers/",
828
+ query: {
829
+ "direction" => direction,
830
+ "status" => status,
831
+ "rail" => rail,
832
+ "kind" => kind,
833
+ "currency" => currency,
834
+ "start_date" => start_date,
835
+ "end_date" => end_date,
836
+ "counterparty" => counterparty,
837
+ "limit" => limit,
838
+ "offset" => offset
839
+ },
840
+ page: Types::TravelRuleTransferRow,
841
+ request_options: request_options
842
+ )
843
+ end
844
+ end
845
+
846
+ # The +travel_rule.wallet_addresses+ resource.
847
+ class WalletAddresses < Didit::Resource
848
+ # Import wallet addresses in bulk
849
+ #
850
+ # Add up to 10,000 wallets to your Travel Rule address book in one call, as JSON or as a CSV file. A wallet
851
+ # can be sent by its address, by the SHA-256 of its lowercased address (`address_hash`) to keep the address
852
+ # private, or both. The import is idempotent: a wallet already in the book is reported as `existing` and left
853
+ # untouched, so the same file can be sent again. Each row is validated on its own, so one bad row never fails
854
+ # the others. A wallet imported by its hash only matches transfers to that address and can be proven with the
855
+ # wallet-ownership widget like any other entry.
856
+ #
857
+ # +POST /v3/travel-rule/wallet-addresses/import/+
858
+ #
859
+ # @param body [Hash, Array<Hash>]
860
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
861
+ # @return [Didit::Types::WalletAddressImportReport]
862
+ def bulk_import(body:, request_options: nil)
863
+ @client.request(
864
+ :post,
865
+ "/v3/travel-rule/wallet-addresses/import/",
866
+ body: body,
867
+ encoding: :auto,
868
+ file_fields: %w[file],
869
+ response: Types::WalletAddressImportReport,
870
+ request_options: request_options
871
+ )
872
+ end
873
+
874
+ # Register a wallet address
875
+ #
876
+ # Add an entry to your Travel Rule wallet address book so inbound INTERNAL-rail transfers can resolve against
877
+ # it.
878
+ #
879
+ # +POST /v3/travel-rule/wallet-addresses/+
880
+ #
881
+ # @param address [String] The wallet address. An XRP X-address is stored as its classic address and its tag,
882
+ # so it matches transfers that name either form.
883
+ # @param chain [String] Chain token for the address, for example `ETH` or `BTC`. When Didit routes or
884
+ # registers a transfer, it matches address book entries on the wallet address and, when the transfer carries a
885
+ # chain, on this value too, ignoring case. A transfer's chain is `beneficiary_data.chain`, filled from the
886
+ # transaction's crypto chain or currency symbol (for example `ETH`) when you do not send it, or the `chain`
887
+ # o...
888
+ # @param holder_vendor_data [String]
889
+ # @param holder_name [String]
890
+ # @param entity_type [String]
891
+ # @param self_declared [Boolean] Write-only. When true, the entry is created already ownership-verified via a
892
+ # SELF_DECLARATION proof. Returns 400 when `allow_self_declaration` is off in your Travel Rule settings.
893
+ # @param travel_address [String] Optional. The counterparty VASP's travel address for this wallet, enabling
894
+ # TRP routing for the assets TRP carries (BTC, ETH, and USDC on a named network). An invalid travel address
895
+ # returns 400.
896
+ # @param memo [String] Optional. The destination tag or memo that is part of the wallet. XRP: a destination
897
+ # tag, a whole number from 0 to 4294967295 (a JSON number is accepted). XLM: a text memo of up to 28 bytes, a
898
+ # 64-bit id or a 32-byte hash in hex. EOS: up to 256 bytes. ATOM: up to 256 characters. HBAR: up to 100 bytes.
899
+ # Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin and Lightning wallets take no memo:...
900
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
901
+ # @return [Didit::Types::WalletAddressEntry]
902
+ def create(
903
+ address:,
904
+ chain: OMIT,
905
+ holder_vendor_data: OMIT,
906
+ holder_name: OMIT,
907
+ entity_type: OMIT,
908
+ self_declared: OMIT,
909
+ travel_address: OMIT,
910
+ memo: OMIT,
911
+ request_options: nil
912
+ )
913
+ @client.request(
914
+ :post,
915
+ "/v3/travel-rule/wallet-addresses/",
916
+ body: {
917
+ "address" => address,
918
+ "chain" => chain,
919
+ "holder_vendor_data" => holder_vendor_data,
920
+ "holder_name" => holder_name,
921
+ "entity_type" => entity_type,
922
+ "self_declared" => self_declared,
923
+ "travel_address" => travel_address,
924
+ "memo" => memo
925
+ },
926
+ response: Types::WalletAddressEntry,
927
+ request_options: request_options
928
+ )
929
+ end
930
+
931
+ # Delete a wallet address
932
+ #
933
+ # Deletes the entry together with its ownership proofs and the screenshots they stored. It stops matching new
934
+ # transfers immediately and the address is freed up for re-registration. Transfers that already used the
935
+ # wallet keep their own record of it and read the same. Deletion is irreversible.
936
+ #
937
+ # +DELETE /v3/travel-rule/wallet-addresses/{entry_uuid}/+
938
+ #
939
+ # @param entry_uuid [String]
940
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
941
+ # @return [nil]
942
+ def delete(entry_uuid, request_options: nil)
943
+ @client.request(
944
+ :delete,
945
+ "/v3/travel-rule/wallet-addresses/{entry_uuid}/",
946
+ path_params: { "entry_uuid" => entry_uuid },
947
+ request_options: request_options
948
+ )
949
+ end
950
+
951
+ # List wallet address book entries
952
+ #
953
+ # Paginated list of your application's Travel Rule wallet address book, newest first.
954
+ #
955
+ # +GET /v3/travel-rule/wallet-addresses/+
956
+ #
957
+ # @param limit [Integer]
958
+ # @param offset [Integer]
959
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
960
+ # @return [Didit::Page<Didit::Types::WalletAddressEntry>]
961
+ def list(limit: OMIT, offset: OMIT, request_options: nil)
962
+ @client.request(
963
+ :get,
964
+ "/v3/travel-rule/wallet-addresses/",
965
+ query: {
966
+ "limit" => limit,
967
+ "offset" => offset
968
+ },
969
+ page: Types::WalletAddressEntry,
970
+ request_options: request_options
971
+ )
972
+ end
973
+
974
+ # Update wallet address holder metadata
975
+ #
976
+ # Partial update of holder_name, holder_vendor_data, entity_type, and travel_address. Setting travel_address
977
+ # attaches a TRP routing address to the entry; invalid values are rejected with 400. The response echoes only
978
+ # these four fields.
979
+ #
980
+ # +PATCH /v3/travel-rule/wallet-addresses/{entry_uuid}/+
981
+ #
982
+ # @param entry_uuid [String]
983
+ # @param holder_name [String]
984
+ # @param holder_vendor_data [String]
985
+ # @param entity_type [String]
986
+ # @param travel_address [String]
987
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
988
+ # @return [Didit::Types::WalletAddressEntryUpdate]
989
+ def update(
990
+ entry_uuid,
991
+ holder_name: OMIT,
992
+ holder_vendor_data: OMIT,
993
+ entity_type: OMIT,
994
+ travel_address: OMIT,
995
+ request_options: nil
996
+ )
997
+ @client.request(
998
+ :patch,
999
+ "/v3/travel-rule/wallet-addresses/{entry_uuid}/",
1000
+ path_params: { "entry_uuid" => entry_uuid },
1001
+ body: {
1002
+ "holder_name" => holder_name,
1003
+ "holder_vendor_data" => holder_vendor_data,
1004
+ "entity_type" => entity_type,
1005
+ "travel_address" => travel_address
1006
+ },
1007
+ response: Types::WalletAddressEntryUpdate,
1008
+ request_options: request_options
1009
+ )
1010
+ end
1011
+ end
1012
+
1013
+ # The +travel_rule.wallet_proofs+ resource.
1014
+ class WalletProofs < Didit::Resource
1015
+ # Approve or reject a screenshot wallet proof
1016
+ #
1017
+ # Decide a screenshot proof from your review queue. approve verifies the proof and the address book entry and
1018
+ # applies the ownership to the transfer the widget session was minted for, exactly as a verified signature
1019
+ # does. A screenshot never confirms a transfer that another Didit customer sent over the INTERNAL rail: that
1020
+ # takes a signed message or a test deposit. reject closes the proof as REJECTED with failure_reason
1021
+ # REVIEW_REJECTED; the end user can start a new proof from the widget. The note is kept with the proof.
1022
+ #
1023
+ # +POST /v3/travel-rule/wallet-proofs/{proof_uuid}/decision/+
1024
+ #
1025
+ # @param proof_uuid [String] proof_id from the review queue.
1026
+ # @param decision [String]
1027
+ # @param note [String] Optional. Kept with the proof and returned as review_note.
1028
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1029
+ # @return [Didit::Types::TravelRuleWalletProofReview]
1030
+ def decide(proof_uuid, decision:, note: OMIT, request_options: nil)
1031
+ @client.request(
1032
+ :post,
1033
+ "/v3/travel-rule/wallet-proofs/{proof_uuid}/decision/",
1034
+ path_params: { "proof_uuid" => proof_uuid },
1035
+ body: {
1036
+ "decision" => decision,
1037
+ "note" => note
1038
+ },
1039
+ response: Types::TravelRuleWalletProofReview,
1040
+ request_options: request_options
1041
+ )
1042
+ end
1043
+
1044
+ # List screenshot wallet proofs to review
1045
+ #
1046
+ # Your review queue for screenshot wallet-ownership proofs. A screenshot is the one proof Didit cannot check
1047
+ # itself: once the end user uploads it from the widget it waits PENDING until you approve or reject it with
1048
+ # POST /v3/travel-rule/wallet-proofs/{proof_uuid}/decision/. Oldest first, so the queue is worked from the
1049
+ # proof that has waited longest. Only uploaded screenshots appear, never a proof whose end user has not
1050
+ # uploaded a file yet, and never one on a wallet you deleted from your address book (Didit closes those as
1051
+ # OWNERSHIP_CHANGED).
1052
+ #
1053
+ # +GET /v3/travel-rule/wallet-proofs/+
1054
+ #
1055
+ # @param status [String] Which proofs to list. Defaults to PENDING, the ones still to decide.
1056
+ # @param limit [Integer]
1057
+ # @param offset [Integer]
1058
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1059
+ # @return [Didit::Page<Didit::Types::TravelRuleWalletProofReview>]
1060
+ def list(status: OMIT, limit: OMIT, offset: OMIT, request_options: nil)
1061
+ @client.request(
1062
+ :get,
1063
+ "/v3/travel-rule/wallet-proofs/",
1064
+ query: {
1065
+ "status" => status,
1066
+ "limit" => limit,
1067
+ "offset" => offset
1068
+ },
1069
+ page: Types::TravelRuleWalletProofReview,
1070
+ request_options: request_options
1071
+ )
1072
+ end
1073
+ end
1074
+
1075
+ # The +travel_rule.workspace+ resource.
1076
+ class Workspace < Didit::Resource
1077
+ # Claim a directory entry
1078
+ #
1079
+ # Claims the directory entry this workspace is. When the work email is at a domain the entry lists, the claim
1080
+ # is proved and applies at once: the VASP profile and Travel Rule settings are filled from the entry and
1081
+ # Travel Rule is turned on, so the next transfer to it routes over the Didit network. Otherwise the claim
1082
+ # waits for review (`pending_review`).
1083
+ #
1084
+ # +POST /v3/travel-rule/workspace/claim/+
1085
+ #
1086
+ # @param vasp_id [String] The directory entry this workspace is. Read ids from `GET /v3/travel-rule/vasps/`.
1087
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1088
+ # @return [Didit::Types::TravelRuleWorkspace]
1089
+ def claim(vasp_id:, request_options: nil)
1090
+ @client.request(
1091
+ :post,
1092
+ "/v3/travel-rule/workspace/claim/",
1093
+ body: {
1094
+ "vasp_id" => vasp_id
1095
+ },
1096
+ response: Types::TravelRuleWorkspace,
1097
+ request_options: request_options
1098
+ )
1099
+ end
1100
+
1101
+ # Confirm the domain verification code
1102
+ #
1103
+ # Spends the emailed code and marks the email domain verified.
1104
+ #
1105
+ # +POST /v3/travel-rule/workspace/domain/confirm/+
1106
+ #
1107
+ # @param code [String]
1108
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1109
+ # @return [Didit::Types::TravelRuleWorkspace]
1110
+ def confirm_domain(code:, request_options: nil)
1111
+ @client.request(
1112
+ :post,
1113
+ "/v3/travel-rule/workspace/domain/confirm/",
1114
+ body: {
1115
+ "code" => code
1116
+ },
1117
+ response: Types::TravelRuleWorkspace,
1118
+ request_options: request_options
1119
+ )
1120
+ end
1121
+
1122
+ # Enable outbound billing
1123
+ #
1124
+ # Turns outbound Travel Rule billing on for the workspace. Receiving stays free. This cannot be turned back
1125
+ # off through the API: contact Didit support.
1126
+ #
1127
+ # +POST /v3/travel-rule/workspace/billing/+
1128
+ #
1129
+ # @param enabled [Boolean] Only `true` is accepted: outbound billing cannot be turned back off through the
1130
+ # API.
1131
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1132
+ # @return [Didit::Types::TravelRuleWorkspace]
1133
+ def enable_billing(enabled: OMIT, request_options: nil)
1134
+ @client.request(
1135
+ :post,
1136
+ "/v3/travel-rule/workspace/billing/",
1137
+ body: {
1138
+ "enabled" => enabled
1139
+ },
1140
+ response: Types::TravelRuleWorkspace,
1141
+ request_options: request_options
1142
+ )
1143
+ end
1144
+
1145
+ # Get the free Travel Rule workspace
1146
+ #
1147
+ # Reads the free workspace of an application that joined free: directory claim, domain proof, billing and
1148
+ # Didit network listing.
1149
+ #
1150
+ # +GET /v3/travel-rule/workspace/+
1151
+ #
1152
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1153
+ # @return [Didit::Types::TravelRuleWorkspace]
1154
+ def get(request_options: nil)
1155
+ @client.request(
1156
+ :get,
1157
+ "/v3/travel-rule/workspace/",
1158
+ response: Types::TravelRuleWorkspace,
1159
+ request_options: request_options
1160
+ )
1161
+ end
1162
+
1163
+ # Email a domain verification code
1164
+ #
1165
+ # Emails a single-use code to the workspace's work address to prove it controls the email domain. Throttled,
1166
+ # and a limited number of wrong attempts is accepted per code. Also returns the TXT record for the DNS
1167
+ # alternative.
1168
+ #
1169
+ # +POST /v3/travel-rule/workspace/domain/code/+
1170
+ #
1171
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1172
+ # @return [Didit::Types::TravelRuleWorkspaceDomainCodeResponse]
1173
+ def send_domain_code(request_options: nil)
1174
+ @client.request(
1175
+ :post,
1176
+ "/v3/travel-rule/workspace/domain/code/",
1177
+ response: Types::TravelRuleWorkspaceDomainCodeResponse,
1178
+ request_options: request_options
1179
+ )
1180
+ end
1181
+
1182
+ # Verify the domain from its TXT record
1183
+ #
1184
+ # Checks for the `didit-tr-verify.<domain>` TXT record returned by the code endpoint and marks the domain
1185
+ # verified when it matches. One of the two proofs, the emailed code or the TXT record, is enough.
1186
+ #
1187
+ # +POST /v3/travel-rule/workspace/domain/dns/+
1188
+ #
1189
+ # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body
1190
+ # @return [Didit::Types::TravelRuleWorkspace]
1191
+ def verify_domain_dns(request_options: nil)
1192
+ @client.request(
1193
+ :post,
1194
+ "/v3/travel-rule/workspace/domain/dns/",
1195
+ response: Types::TravelRuleWorkspace,
1196
+ request_options: request_options
1197
+ )
1198
+ end
1199
+ end
1200
+ end
1201
+ end
1202
+ end