wavix-python-sdk 1.0.0__py3-none-any.whl

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 (497) hide show
  1. wavix/__init__.py +801 -0
  2. wavix/_default_clients.py +32 -0
  3. wavix/api_keys/__init__.py +4 -0
  4. wavix/api_keys/client.py +764 -0
  5. wavix/api_keys/raw_client.py +1191 -0
  6. wavix/billing/__init__.py +41 -0
  7. wavix/billing/client.py +82 -0
  8. wavix/billing/invoices/__init__.py +34 -0
  9. wavix/billing/invoices/client.py +203 -0
  10. wavix/billing/invoices/raw_client.py +302 -0
  11. wavix/billing/invoices/types/__init__.py +34 -0
  12. wavix/billing/invoices/types/list_invoices_response.py +31 -0
  13. wavix/billing/raw_client.py +13 -0
  14. wavix/billing/transactions/__init__.py +34 -0
  15. wavix/billing/transactions/client.py +209 -0
  16. wavix/billing/transactions/raw_client.py +253 -0
  17. wavix/billing/transactions/types/__init__.py +34 -0
  18. wavix/billing/transactions/types/list_transactions_response.py +31 -0
  19. wavix/buy/__init__.py +61 -0
  20. wavix/buy/cities/__init__.py +34 -0
  21. wavix/buy/cities/client.py +134 -0
  22. wavix/buy/cities/raw_client.py +201 -0
  23. wavix/buy/cities/types/__init__.py +34 -0
  24. wavix/buy/cities/types/list_cities_response.py +23 -0
  25. wavix/buy/client.py +139 -0
  26. wavix/buy/countries/__init__.py +34 -0
  27. wavix/buy/countries/client.py +116 -0
  28. wavix/buy/countries/raw_client.py +144 -0
  29. wavix/buy/countries/types/__init__.py +34 -0
  30. wavix/buy/countries/types/list_countries_response.py +23 -0
  31. wavix/buy/numbers/__init__.py +34 -0
  32. wavix/buy/numbers/client.py +168 -0
  33. wavix/buy/numbers/raw_client.py +227 -0
  34. wavix/buy/numbers/types/__init__.py +34 -0
  35. wavix/buy/numbers/types/list_numbers_response.py +26 -0
  36. wavix/buy/raw_client.py +13 -0
  37. wavix/buy/region_cities/__init__.py +34 -0
  38. wavix/buy/region_cities/client.py +142 -0
  39. wavix/buy/region_cities/raw_client.py +207 -0
  40. wavix/buy/region_cities/types/__init__.py +34 -0
  41. wavix/buy/region_cities/types/list_region_cities_response.py +23 -0
  42. wavix/buy/regions/__init__.py +34 -0
  43. wavix/buy/regions/client.py +132 -0
  44. wavix/buy/regions/raw_client.py +222 -0
  45. wavix/buy/regions/types/__init__.py +34 -0
  46. wavix/buy/regions/types/list_regions_response.py +23 -0
  47. wavix/call_control/__init__.py +40 -0
  48. wavix/call_control/audio/__init__.py +4 -0
  49. wavix/call_control/audio/client.py +195 -0
  50. wavix/call_control/audio/raw_client.py +333 -0
  51. wavix/call_control/client.py +796 -0
  52. wavix/call_control/raw_client.py +1224 -0
  53. wavix/call_control/streams/__init__.py +4 -0
  54. wavix/call_control/streams/client.py +250 -0
  55. wavix/call_control/streams/raw_client.py +325 -0
  56. wavix/call_control/types/__init__.py +38 -0
  57. wavix/call_control/types/call_dtmf_collect_request_prompt.py +33 -0
  58. wavix/call_control/types/call_dtmf_collect_request_prompt_say.py +31 -0
  59. wavix/call_recording/__init__.py +4 -0
  60. wavix/call_recording/client.py +430 -0
  61. wavix/call_recording/raw_client.py +726 -0
  62. wavix/call_webhooks/__init__.py +37 -0
  63. wavix/call_webhooks/client.py +281 -0
  64. wavix/call_webhooks/raw_client.py +529 -0
  65. wavix/call_webhooks/types/__init__.py +38 -0
  66. wavix/call_webhooks/types/call_webhooks_create_request_event_type.py +5 -0
  67. wavix/call_webhooks/types/delete_call_webhooks_request_event_type.py +5 -0
  68. wavix/cart/__init__.py +38 -0
  69. wavix/cart/client.py +327 -0
  70. wavix/cart/raw_client.py +629 -0
  71. wavix/cart/types/__init__.py +40 -0
  72. wavix/cart/types/checkout_cart_response.py +22 -0
  73. wavix/cart/types/get_cart_response.py +29 -0
  74. wavix/cart/types/remove_cart_response.py +22 -0
  75. wavix/cdrs/__init__.py +39 -0
  76. wavix/cdrs/client.py +968 -0
  77. wavix/cdrs/raw_client.py +1176 -0
  78. wavix/cdrs/transcription/__init__.py +4 -0
  79. wavix/cdrs/transcription/client.py +112 -0
  80. wavix/cdrs/transcription/raw_client.py +156 -0
  81. wavix/cdrs/types/__init__.py +38 -0
  82. wavix/cdrs/types/cdr_search_request_disposition.py +5 -0
  83. wavix/cdrs/types/cdr_search_request_type.py +5 -0
  84. wavix/client.py +578 -0
  85. wavix/core/__init__.py +127 -0
  86. wavix/core/api_error.py +23 -0
  87. wavix/core/client_wrapper.py +119 -0
  88. wavix/core/datetime_utils.py +70 -0
  89. wavix/core/file.py +67 -0
  90. wavix/core/force_multipart.py +18 -0
  91. wavix/core/http_client.py +839 -0
  92. wavix/core/http_response.py +59 -0
  93. wavix/core/http_sse/__init__.py +42 -0
  94. wavix/core/http_sse/_api.py +170 -0
  95. wavix/core/http_sse/_decoders.py +61 -0
  96. wavix/core/http_sse/_exceptions.py +7 -0
  97. wavix/core/http_sse/_models.py +17 -0
  98. wavix/core/jsonable_encoder.py +120 -0
  99. wavix/core/logging.py +107 -0
  100. wavix/core/parse_error.py +36 -0
  101. wavix/core/pydantic_utilities.py +508 -0
  102. wavix/core/query_encoder.py +58 -0
  103. wavix/core/remove_none_from_dict.py +11 -0
  104. wavix/core/request_options.py +35 -0
  105. wavix/core/serialization.py +347 -0
  106. wavix/environment.py +7 -0
  107. wavix/errors/__init__.py +56 -0
  108. wavix/errors/bad_request_error.py +10 -0
  109. wavix/errors/forbidden_error.py +10 -0
  110. wavix/errors/not_found_error.py +10 -0
  111. wavix/errors/service_unavailable_error.py +11 -0
  112. wavix/errors/too_many_requests_error.py +11 -0
  113. wavix/errors/unauthorized_error.py +11 -0
  114. wavix/errors/unprocessable_entity_error.py +10 -0
  115. wavix/link_shortener/__init__.py +34 -0
  116. wavix/link_shortener/client.py +194 -0
  117. wavix/link_shortener/metrics/__init__.py +4 -0
  118. wavix/link_shortener/metrics/client.py +198 -0
  119. wavix/link_shortener/metrics/raw_client.py +218 -0
  120. wavix/link_shortener/raw_client.py +265 -0
  121. wavix/number_validator/__init__.py +35 -0
  122. wavix/number_validator/client.py +271 -0
  123. wavix/number_validator/raw_client.py +383 -0
  124. wavix/number_validator/results/__init__.py +4 -0
  125. wavix/number_validator/results/client.py +114 -0
  126. wavix/number_validator/results/raw_client.py +156 -0
  127. wavix/number_validator/types/__init__.py +34 -0
  128. wavix/number_validator/types/get_number_validator_response.py +112 -0
  129. wavix/numbers/__init__.py +39 -0
  130. wavix/numbers/client.py +689 -0
  131. wavix/numbers/papers/__init__.py +4 -0
  132. wavix/numbers/papers/client.py +155 -0
  133. wavix/numbers/papers/raw_client.py +208 -0
  134. wavix/numbers/raw_client.py +1000 -0
  135. wavix/numbers/types/__init__.py +38 -0
  136. wavix/numbers/types/bulk_update_numbers_response.py +23 -0
  137. wavix/numbers/types/delete_numbers_response.py +22 -0
  138. wavix/profile/__init__.py +41 -0
  139. wavix/profile/client.py +308 -0
  140. wavix/profile/config/__init__.py +34 -0
  141. wavix/profile/config/client.py +100 -0
  142. wavix/profile/config/raw_client.py +124 -0
  143. wavix/profile/config/types/__init__.py +34 -0
  144. wavix/profile/config/types/get_config_response.py +25 -0
  145. wavix/profile/raw_client.py +360 -0
  146. wavix/profile/types/__init__.py +38 -0
  147. wavix/profile/types/profile_update_request_company_info.py +48 -0
  148. wavix/profile/types/profile_update_request_company_info_industry.py +22 -0
  149. wavix/py.typed +0 -0
  150. wavix/sip_trunks/__init__.py +4 -0
  151. wavix/sip_trunks/client.py +927 -0
  152. wavix/sip_trunks/raw_client.py +1324 -0
  153. wavix/sms_and_mms/__init__.py +66 -0
  154. wavix/sms_and_mms/client.py +101 -0
  155. wavix/sms_and_mms/messages/__init__.py +49 -0
  156. wavix/sms_and_mms/messages/client.py +625 -0
  157. wavix/sms_and_mms/messages/raw_client.py +793 -0
  158. wavix/sms_and_mms/messages/types/__init__.py +47 -0
  159. wavix/sms_and_mms/messages/types/get_messages_response.py +97 -0
  160. wavix/sms_and_mms/messages/types/list_all_messages_request_message_type.py +5 -0
  161. wavix/sms_and_mms/messages/types/list_messages_request_message_type.py +5 -0
  162. wavix/sms_and_mms/messages/types/list_messages_response.py +26 -0
  163. wavix/sms_and_mms/opt_outs/__init__.py +34 -0
  164. wavix/sms_and_mms/opt_outs/client.py +277 -0
  165. wavix/sms_and_mms/opt_outs/raw_client.py +438 -0
  166. wavix/sms_and_mms/opt_outs/types/__init__.py +34 -0
  167. wavix/sms_and_mms/opt_outs/types/create_opt_outs_response.py +22 -0
  168. wavix/sms_and_mms/raw_client.py +13 -0
  169. wavix/sms_and_mms/sender_ids/__init__.py +38 -0
  170. wavix/sms_and_mms/sender_ids/client.py +391 -0
  171. wavix/sms_and_mms/sender_ids/raw_client.py +617 -0
  172. wavix/sms_and_mms/sender_ids/types/__init__.py +40 -0
  173. wavix/sms_and_mms/sender_ids/types/delete_sender_ids_response.py +22 -0
  174. wavix/sms_and_mms/sender_ids/types/sender_id_create_request_monthly_volume.py +7 -0
  175. wavix/sms_and_mms/sender_ids/types/sender_id_create_request_usecase.py +5 -0
  176. wavix/speech_analytics/__init__.py +52 -0
  177. wavix/speech_analytics/client.py +372 -0
  178. wavix/speech_analytics/file/__init__.py +4 -0
  179. wavix/speech_analytics/file/client.py +114 -0
  180. wavix/speech_analytics/file/raw_client.py +148 -0
  181. wavix/speech_analytics/raw_client.py +527 -0
  182. wavix/speech_analytics/types/__init__.py +47 -0
  183. wavix/speech_analytics/types/create_speech_analytics_response.py +32 -0
  184. wavix/speech_analytics/types/get_speech_analytics_response.py +77 -0
  185. wavix/speech_analytics/types/get_speech_analytics_response_language.py +5 -0
  186. wavix/speech_analytics/types/get_speech_analytics_response_status.py +5 -0
  187. wavix/sub_accounts/__init__.py +52 -0
  188. wavix/sub_accounts/client.py +442 -0
  189. wavix/sub_accounts/raw_client.py +775 -0
  190. wavix/sub_accounts/transactions/__init__.py +4 -0
  191. wavix/sub_accounts/transactions/client.py +198 -0
  192. wavix/sub_accounts/transactions/raw_client.py +265 -0
  193. wavix/sub_accounts/types/__init__.py +47 -0
  194. wavix/sub_accounts/types/list_sub_accounts_request_status.py +5 -0
  195. wavix/sub_accounts/types/sub_accounts_create_request_default_destinations.py +31 -0
  196. wavix/sub_accounts/types/sub_accounts_update_request_default_destinations.py +31 -0
  197. wavix/sub_accounts/types/sub_accounts_update_request_status.py +5 -0
  198. wavix/ten_dlc/__init__.py +167 -0
  199. wavix/ten_dlc/brand_appeals/__init__.py +34 -0
  200. wavix/ten_dlc/brand_appeals/client.py +244 -0
  201. wavix/ten_dlc/brand_appeals/raw_client.py +390 -0
  202. wavix/ten_dlc/brand_appeals/types/__init__.py +34 -0
  203. wavix/ten_dlc/brand_appeals/types/create_brand_appeals_response.py +22 -0
  204. wavix/ten_dlc/brand_evidence/__init__.py +37 -0
  205. wavix/ten_dlc/brand_evidence/client.py +365 -0
  206. wavix/ten_dlc/brand_evidence/raw_client.py +599 -0
  207. wavix/ten_dlc/brand_evidence/types/__init__.py +38 -0
  208. wavix/ten_dlc/brand_evidence/types/delete_brand_evidence_response.py +22 -0
  209. wavix/ten_dlc/brand_evidence/types/upload_brand_evidence_response.py +38 -0
  210. wavix/ten_dlc/brand_vetting_appeals/__init__.py +34 -0
  211. wavix/ten_dlc/brand_vetting_appeals/client.py +258 -0
  212. wavix/ten_dlc/brand_vetting_appeals/raw_client.py +381 -0
  213. wavix/ten_dlc/brand_vetting_appeals/types/__init__.py +36 -0
  214. wavix/ten_dlc/brand_vetting_appeals/types/create_brand_vetting_appeals_response.py +22 -0
  215. wavix/ten_dlc/brand_vettings/__init__.py +4 -0
  216. wavix/ten_dlc/brand_vettings/client.py +325 -0
  217. wavix/ten_dlc/brand_vettings/raw_client.py +518 -0
  218. wavix/ten_dlc/brands/__init__.py +85 -0
  219. wavix/ten_dlc/brands/client.py +870 -0
  220. wavix/ten_dlc/brands/raw_client.py +1263 -0
  221. wavix/ten_dlc/brands/types/__init__.py +83 -0
  222. wavix/ten_dlc/brands/types/create_brands_response.py +143 -0
  223. wavix/ten_dlc/brands/types/create_brands_response_entity_type.py +7 -0
  224. wavix/ten_dlc/brands/types/create_brands_response_status.py +7 -0
  225. wavix/ten_dlc/brands/types/delete_brands_response.py +22 -0
  226. wavix/ten_dlc/brands/types/get_brands_response.py +143 -0
  227. wavix/ten_dlc/brands/types/get_brands_response_entity_type.py +7 -0
  228. wavix/ten_dlc/brands/types/get_brands_response_status.py +7 -0
  229. wavix/ten_dlc/brands/types/list_brands_response.py +33 -0
  230. wavix/ten_dlc/brands/types/list_brands_response_pagination.py +41 -0
  231. wavix/ten_dlc/brands/types/qualify_usecase_brands_request_use_case.py +35 -0
  232. wavix/ten_dlc/brands/types/qualify_usecase_brands_response.py +33 -0
  233. wavix/ten_dlc/brands/types/ten_dlc_brand_update_request_entity_type.py +7 -0
  234. wavix/ten_dlc/brands/types/ten_dlc_brand_update_request_vertical.py +18 -0
  235. wavix/ten_dlc/brands/types/update_brands_response.py +143 -0
  236. wavix/ten_dlc/brands/types/update_brands_response_entity_type.py +7 -0
  237. wavix/ten_dlc/brands/types/update_brands_response_status.py +7 -0
  238. wavix/ten_dlc/campaign_numbers/__init__.py +38 -0
  239. wavix/ten_dlc/campaign_numbers/client.py +304 -0
  240. wavix/ten_dlc/campaign_numbers/raw_client.py +448 -0
  241. wavix/ten_dlc/campaign_numbers/types/__init__.py +40 -0
  242. wavix/ten_dlc/campaign_numbers/types/link_campaign_numbers_response.py +22 -0
  243. wavix/ten_dlc/campaign_numbers/types/list_campaign_numbers_response.py +33 -0
  244. wavix/ten_dlc/campaign_numbers/types/unlink_campaign_numbers_response.py +22 -0
  245. wavix/ten_dlc/campaigns/__init__.py +64 -0
  246. wavix/ten_dlc/campaigns/client.py +1493 -0
  247. wavix/ten_dlc/campaigns/raw_client.py +1840 -0
  248. wavix/ten_dlc/campaigns/types/__init__.py +62 -0
  249. wavix/ten_dlc/campaigns/types/create_campaigns_response.py +211 -0
  250. wavix/ten_dlc/campaigns/types/delete_campaigns_response.py +22 -0
  251. wavix/ten_dlc/campaigns/types/get_campaigns_response.py +211 -0
  252. wavix/ten_dlc/campaigns/types/list_by_brand_campaigns_response.py +33 -0
  253. wavix/ten_dlc/campaigns/types/list_by_brand_campaigns_response_pagination.py +41 -0
  254. wavix/ten_dlc/campaigns/types/list_campaigns_response.py +33 -0
  255. wavix/ten_dlc/campaigns/types/list_campaigns_response_pagination.py +41 -0
  256. wavix/ten_dlc/campaigns/types/ten_dlc_campaign_update_request_usecase.py +15 -0
  257. wavix/ten_dlc/campaigns/types/update_campaigns_response.py +211 -0
  258. wavix/ten_dlc/client.py +196 -0
  259. wavix/ten_dlc/raw_client.py +13 -0
  260. wavix/ten_dlc/subscriptions/__init__.py +37 -0
  261. wavix/ten_dlc/subscriptions/client.py +271 -0
  262. wavix/ten_dlc/subscriptions/raw_client.py +398 -0
  263. wavix/ten_dlc/subscriptions/types/__init__.py +38 -0
  264. wavix/ten_dlc/subscriptions/types/create_subscriptions_response.py +31 -0
  265. wavix/ten_dlc/subscriptions/types/delete_subscriptions_response.py +22 -0
  266. wavix/two_fa/__init__.py +56 -0
  267. wavix/two_fa/client.py +101 -0
  268. wavix/two_fa/events/__init__.py +4 -0
  269. wavix/two_fa/events/client.py +114 -0
  270. wavix/two_fa/events/raw_client.py +156 -0
  271. wavix/two_fa/raw_client.py +13 -0
  272. wavix/two_fa/sessions/__init__.py +4 -0
  273. wavix/two_fa/sessions/client.py +142 -0
  274. wavix/two_fa/sessions/raw_client.py +200 -0
  275. wavix/two_fa/verification/__init__.py +49 -0
  276. wavix/two_fa/verification/client.py +395 -0
  277. wavix/two_fa/verification/raw_client.py +664 -0
  278. wavix/two_fa/verification/types/__init__.py +47 -0
  279. wavix/two_fa/verification/types/check_verification_response.py +22 -0
  280. wavix/two_fa/verification/types/create_verification_response.py +51 -0
  281. wavix/two_fa/verification/types/resend_verification_response.py +38 -0
  282. wavix/two_fa/verification/types/two_factor_verification_resend_request_channel.py +5 -0
  283. wavix/types/__init__.py +637 -0
  284. wavix/types/account_error_response.py +31 -0
  285. wavix/types/account_limits.py +32 -0
  286. wavix/types/allowed_i_ps.py +7 -0
  287. wavix/types/allowed_i_ps_item.py +27 -0
  288. wavix/types/api_key.py +138 -0
  289. wavix/types/api_key_calls_scope_permission.py +30 -0
  290. wavix/types/api_key_calls_scope_permission_allow.py +5 -0
  291. wavix/types/api_key_scope_permission.py +30 -0
  292. wavix/types/api_key_scope_permission_allow.py +5 -0
  293. wavix/types/available_number.py +97 -0
  294. wavix/types/available_number_list_response.py +26 -0
  295. wavix/types/bad_request_error_body.py +27 -0
  296. wavix/types/billing_transaction_list_response.py +31 -0
  297. wavix/types/brand_status_updated_webhook.py +28 -0
  298. wavix/types/brand_status_updated_webhook_status.py +7 -0
  299. wavix/types/call.py +92 -0
  300. wavix/types/call_control_validation_error_response.py +34 -0
  301. wavix/types/call_create_response.py +92 -0
  302. wavix/types/call_create_response_event_type.py +18 -0
  303. wavix/types/call_direction.py +5 -0
  304. wavix/types/call_disposition.py +5 -0
  305. wavix/types/call_event_type.py +18 -0
  306. wavix/types/call_list_response.py +28 -0
  307. wavix/types/call_recording_list_response.py +28 -0
  308. wavix/types/call_response.py +24 -0
  309. wavix/types/call_status_webhook.py +70 -0
  310. wavix/types/call_status_webhook_direction.py +5 -0
  311. wavix/types/call_stream_channel.py +5 -0
  312. wavix/types/call_stream_response.py +27 -0
  313. wavix/types/call_stream_type.py +5 -0
  314. wavix/types/call_webhook.py +37 -0
  315. wavix/types/call_webhook_event_type.py +5 -0
  316. wavix/types/call_webhook_list_response.py +10 -0
  317. wavix/types/call_webhook_list_response_item.py +28 -0
  318. wavix/types/call_webhook_list_response_item_event_type.py +5 -0
  319. wavix/types/campaign_status_updated_webhook.py +41 -0
  320. wavix/types/campaign_status_updated_webhook_status.py +7 -0
  321. wavix/types/cart_response.py +29 -0
  322. wavix/types/cdr.py +97 -0
  323. wavix/types/cdr_list_response.py +26 -0
  324. wavix/types/cdr_response.py +104 -0
  325. wavix/types/cdr_transcription_completed_webhook.py +28 -0
  326. wavix/types/cdr_transcription_completed_webhook_status.py +5 -0
  327. wavix/types/cdr_transcription_response.py +74 -0
  328. wavix/types/cdr_transcription_search_response.py +26 -0
  329. wavix/types/cdr_with_transcription.py +97 -0
  330. wavix/types/city.py +32 -0
  331. wavix/types/city_list_response.py +23 -0
  332. wavix/types/country.py +32 -0
  333. wavix/types/country_has_no_regions_error_response.py +27 -0
  334. wavix/types/country_list_response.py +23 -0
  335. wavix/types/document_type.py +32 -0
  336. wavix/types/document_type_id.py +7 -0
  337. wavix/types/file_transcript_response.py +30 -0
  338. wavix/types/file_transcript_turn.py +46 -0
  339. wavix/types/file_transcription_completed_webhook.py +32 -0
  340. wavix/types/file_transcription_response.py +77 -0
  341. wavix/types/file_transcription_response_language.py +5 -0
  342. wavix/types/file_transcription_response_status.py +5 -0
  343. wavix/types/financial_transaction.py +57 -0
  344. wavix/types/forbidden_error_response.py +27 -0
  345. wavix/types/inbound_call_destination.py +53 -0
  346. wavix/types/inbound_call_transport.py +6 -0
  347. wavix/types/inbound_message.py +46 -0
  348. wavix/types/invalid_recording.py +31 -0
  349. wavix/types/invoice.py +42 -0
  350. wavix/types/invoice_list_response.py +31 -0
  351. wavix/types/list_brand_evidence_response.py +23 -0
  352. wavix/types/list_sessions_response_item.py +58 -0
  353. wavix/types/message.py +103 -0
  354. wavix/types/message_body.py +29 -0
  355. wavix/types/message_create_request.py +46 -0
  356. wavix/types/message_delivery_status.py +8 -0
  357. wavix/types/message_list_response.py +26 -0
  358. wavix/types/message_response.py +97 -0
  359. wavix/types/messages_delivery_report.py +81 -0
  360. wavix/types/not_found_error_body.py +27 -0
  361. wavix/types/not_found_error_response.py +27 -0
  362. wavix/types/number.py +160 -0
  363. wavix/types/number_destination.py +38 -0
  364. wavix/types/number_document.py +58 -0
  365. wavix/types/number_list_response.py +32 -0
  366. wavix/types/number_status_updated_webhook.py +38 -0
  367. wavix/types/number_status_updated_webhook_status.py +5 -0
  368. wavix/types/number_validator_create_bulk_response.py +10 -0
  369. wavix/types/number_validator_create_bulk_response_request_id.py +26 -0
  370. wavix/types/on_call_event_payload.py +34 -0
  371. wavix/types/on_call_event_payload_type.py +5 -0
  372. wavix/types/opt_out.py +27 -0
  373. wavix/types/opt_out_item.py +38 -0
  374. wavix/types/opt_outs_list_response.py +26 -0
  375. wavix/types/pagination.py +37 -0
  376. wavix/types/phone_lookup_details.py +32 -0
  377. wavix/types/phone_number_validation_type.py +5 -0
  378. wavix/types/phone_validation_batch_response.py +38 -0
  379. wavix/types/phone_validation_batch_result_response.py +41 -0
  380. wavix/types/phone_validation_response.py +112 -0
  381. wavix/types/phone_validation_result_response.py +115 -0
  382. wavix/types/profile_config_response.py +25 -0
  383. wavix/types/profile_response.py +79 -0
  384. wavix/types/profile_response_company_info.py +53 -0
  385. wavix/types/profile_response_company_info_country.py +31 -0
  386. wavix/types/profile_response_company_info_industry.py +22 -0
  387. wavix/types/profile_response_default_destinations_item.py +27 -0
  388. wavix/types/record_not_found_error_response.py +27 -0
  389. wavix/types/recording.py +57 -0
  390. wavix/types/recording_deleted_error_response.py +38 -0
  391. wavix/types/region.py +31 -0
  392. wavix/types/region_list_response.py +23 -0
  393. wavix/types/send_messages_response.py +100 -0
  394. wavix/types/sender_id.py +48 -0
  395. wavix/types/sender_id_details.py +44 -0
  396. wavix/types/sender_id_list_response.py +23 -0
  397. wavix/types/sender_id_response.py +48 -0
  398. wavix/types/sender_id_response_type.py +5 -0
  399. wavix/types/sender_id_type.py +5 -0
  400. wavix/types/short_link_metrics_item.py +69 -0
  401. wavix/types/short_link_metrics_response.py +26 -0
  402. wavix/types/short_link_response.py +22 -0
  403. wavix/types/sip_trunk_create_request.py +132 -0
  404. wavix/types/sip_trunk_create_request_allowed_ips_item.py +22 -0
  405. wavix/types/sip_trunk_create_request_host_request.py +26 -0
  406. wavix/types/sip_trunk_list_response.py +26 -0
  407. wavix/types/sip_trunk_response.py +145 -0
  408. wavix/types/sip_trunk_summary.py +114 -0
  409. wavix/types/sip_trunk_summary_host_request.py +31 -0
  410. wavix/types/sub_accounts_list_response.py +26 -0
  411. wavix/types/sub_accounts_transactions_list_response.py +30 -0
  412. wavix/types/sub_accounts_transactions_list_response_transactions_item.py +48 -0
  413. wavix/types/sub_organization_response.py +59 -0
  414. wavix/types/sub_organization_response_default_destinations.py +31 -0
  415. wavix/types/sub_organization_response_status.py +5 -0
  416. wavix/types/submit_file_transcription_response.py +32 -0
  417. wavix/types/success_response.py +22 -0
  418. wavix/types/tcr_error_message.py +27 -0
  419. wavix/types/tcr_feedback.py +23 -0
  420. wavix/types/tcr_feedback_category.py +47 -0
  421. wavix/types/ten_dlc_brand.py +143 -0
  422. wavix/types/ten_dlc_brand_appeal.py +54 -0
  423. wavix/types/ten_dlc_brand_appeal_create_request.py +36 -0
  424. wavix/types/ten_dlc_brand_appeal_outcome.py +38 -0
  425. wavix/types/ten_dlc_brand_appeal_outcome_feedback.py +27 -0
  426. wavix/types/ten_dlc_brand_appeal_outcome_vetting_status.py +7 -0
  427. wavix/types/ten_dlc_brand_create_request.py +8 -0
  428. wavix/types/ten_dlc_brand_create_request_entity_type.py +7 -0
  429. wavix/types/ten_dlc_brand_create_request_stock_exchange.py +26 -0
  430. wavix/types/ten_dlc_brand_create_request_stock_exchange_entity_type.py +7 -0
  431. wavix/types/ten_dlc_brand_create_request_vertical.py +18 -0
  432. wavix/types/ten_dlc_brand_create_request_zero.py +24 -0
  433. wavix/types/ten_dlc_brand_create_request_zero_entity_type.py +5 -0
  434. wavix/types/ten_dlc_brand_entity_type.py +7 -0
  435. wavix/types/ten_dlc_brand_evidence.py +38 -0
  436. wavix/types/ten_dlc_brand_identity_verification_status.py +7 -0
  437. wavix/types/ten_dlc_brand_list_response.py +33 -0
  438. wavix/types/ten_dlc_brand_list_response_pagination.py +41 -0
  439. wavix/types/ten_dlc_brand_qualification_result.py +33 -0
  440. wavix/types/ten_dlc_brand_status.py +7 -0
  441. wavix/types/ten_dlc_brand_vetting.py +71 -0
  442. wavix/types/ten_dlc_brand_vetting_appeal.py +78 -0
  443. wavix/types/ten_dlc_brand_vetting_appeal_appeal_outcome.py +37 -0
  444. wavix/types/ten_dlc_brand_vetting_appeal_appeal_outcome_feedback.py +26 -0
  445. wavix/types/ten_dlc_brand_vetting_appeal_outcome.py +33 -0
  446. wavix/types/ten_dlc_brand_vetting_appeal_outcome_feedback.py +26 -0
  447. wavix/types/ten_dlc_brand_vetting_appeal_outcome_reason.py +22 -0
  448. wavix/types/ten_dlc_campaign.py +211 -0
  449. wavix/types/ten_dlc_campaign_list_response.py +33 -0
  450. wavix/types/ten_dlc_campaign_list_response_pagination.py +41 -0
  451. wavix/types/ten_dlc_campaign_nudge_request.py +32 -0
  452. wavix/types/ten_dlc_campaign_number.py +27 -0
  453. wavix/types/ten_dlc_campaign_number_list_response.py +33 -0
  454. wavix/types/ten_dlc_event_subscription.py +31 -0
  455. wavix/types/ten_dlcmno_metadata.py +101 -0
  456. wavix/types/transaction_status.py +5 -0
  457. wavix/types/transaction_type.py +50 -0
  458. wavix/types/transcript_turn.py +46 -0
  459. wavix/types/transcription_filter.py +35 -0
  460. wavix/types/transcription_filter_agent.py +36 -0
  461. wavix/types/transcription_filter_any.py +36 -0
  462. wavix/types/transcription_filter_client.py +36 -0
  463. wavix/types/transcription_language.py +5 -0
  464. wavix/types/transcription_reference.py +29 -0
  465. wavix/types/transcription_status.py +5 -0
  466. wavix/types/tts_language.py +5 -0
  467. wavix/types/tts_voice_id.py +25 -0
  468. wavix/types/two_factor_verification_check_response.py +22 -0
  469. wavix/types/two_factor_verification_event.py +47 -0
  470. wavix/types/two_factor_verification_resend_response.py +38 -0
  471. wavix/types/two_factor_verification_response.py +51 -0
  472. wavix/types/unauthorized_error_response.py +32 -0
  473. wavix/types/unprocessable_entity_error_body.py +27 -0
  474. wavix/types/validation_error_response.py +27 -0
  475. wavix/types/voice_campaign_create_request.py +20 -0
  476. wavix/types/voice_campaign_response.py +41 -0
  477. wavix/types/voice_campaigns_create_response.py +20 -0
  478. wavix/types/voice_campaigns_create_response_voice_campaign.py +43 -0
  479. wavix/types/voice_campaigns_get_response.py +20 -0
  480. wavix/types/voice_campaigns_get_response_voice_campaign.py +43 -0
  481. wavix/types/web_rtc_token.py +43 -0
  482. wavix/types/web_rtc_token_response.py +44 -0
  483. wavix/types/web_rtc_tokens_list_response.py +30 -0
  484. wavix/version.py +3 -0
  485. wavix/voice_campaigns/__init__.py +4 -0
  486. wavix/voice_campaigns/client.py +197 -0
  487. wavix/voice_campaigns/raw_client.py +332 -0
  488. wavix/webrtc/__init__.py +34 -0
  489. wavix/webrtc/client.py +63 -0
  490. wavix/webrtc/raw_client.py +13 -0
  491. wavix/webrtc/tokens/__init__.py +4 -0
  492. wavix/webrtc/tokens/client.py +432 -0
  493. wavix/webrtc/tokens/raw_client.py +869 -0
  494. wavix_python_sdk-1.0.0.dist-info/LICENSE +21 -0
  495. wavix_python_sdk-1.0.0.dist-info/METADATA +339 -0
  496. wavix_python_sdk-1.0.0.dist-info/RECORD +497 -0
  497. wavix_python_sdk-1.0.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,664 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ...core.api_error import ApiError
7
+ from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ...core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ...core.jsonable_encoder import encode_path_param
10
+ from ...core.parse_error import ParsingError
11
+ from ...core.pydantic_utilities import parse_obj_as
12
+ from ...core.request_options import RequestOptions
13
+ from ...errors.bad_request_error import BadRequestError
14
+ from ...errors.forbidden_error import ForbiddenError
15
+ from ...errors.not_found_error import NotFoundError
16
+ from ...types.success_response import SuccessResponse
17
+ from .types.check_verification_response import CheckVerificationResponse
18
+ from .types.create_verification_response import CreateVerificationResponse
19
+ from .types.resend_verification_response import ResendVerificationResponse
20
+ from .types.two_factor_verification_resend_request_channel import TwoFactorVerificationResendRequestChannel
21
+ from pydantic import ValidationError
22
+
23
+ # this is used as the default value for optional parameters
24
+ OMIT = typing.cast(typing.Any, ...)
25
+
26
+
27
+ class RawVerificationClient:
28
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
29
+ self._client_wrapper = client_wrapper
30
+
31
+ def create(
32
+ self, *, service_id: str, to: str, channel: str, request_options: typing.Optional[RequestOptions] = None
33
+ ) -> HttpResponse[CreateVerificationResponse]:
34
+ """
35
+ Creates a 2FA verification and sends a one-time password (OTP) to the destination phone number over the selected channel. Requires a 2FA service configured in the Wavix portal; the service is reused to generate and validate OTPs.
36
+
37
+ The verification proceeds through three steps:
38
+ 1. Create a verification to generate and send an OTP.
39
+ 2. Resend the OTP on the same verification if needed.
40
+ 3. Validate the OTP through the check endpoint.
41
+
42
+ Parameters
43
+ ----------
44
+ service_id : str
45
+ Unique Wavix 2FA Service ID. Available on the Wavix portal.
46
+
47
+ to : str
48
+ End user's phone number to which the verification code will be sent. The phone number must be in E.164 format.
49
+
50
+ channel : str
51
+ Channel used to deliver the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
52
+
53
+ request_options : typing.Optional[RequestOptions]
54
+ Request-specific configuration.
55
+
56
+ Returns
57
+ -------
58
+ HttpResponse[CreateVerificationResponse]
59
+ Returns the created 2FA verification.
60
+ """
61
+ _response = self._client_wrapper.httpx_client.request(
62
+ "v1/two-fa/verification",
63
+ method="POST",
64
+ json={
65
+ "service_id": service_id,
66
+ "to": to,
67
+ "channel": channel,
68
+ },
69
+ headers={
70
+ "content-type": "application/json",
71
+ },
72
+ request_options=request_options,
73
+ omit=OMIT,
74
+ )
75
+ try:
76
+ if 200 <= _response.status_code < 300:
77
+ _data = typing.cast(
78
+ CreateVerificationResponse,
79
+ parse_obj_as(
80
+ type_=CreateVerificationResponse, # type: ignore
81
+ object_=_response.json(),
82
+ ),
83
+ )
84
+ return HttpResponse(response=_response, data=_data)
85
+ if _response.status_code == 400:
86
+ raise BadRequestError(
87
+ headers=dict(_response.headers),
88
+ body=typing.cast(
89
+ typing.Any,
90
+ parse_obj_as(
91
+ type_=typing.Any, # type: ignore
92
+ object_=_response.json(),
93
+ ),
94
+ ),
95
+ )
96
+ if _response.status_code == 403:
97
+ raise ForbiddenError(
98
+ headers=dict(_response.headers),
99
+ body=typing.cast(
100
+ typing.Any,
101
+ parse_obj_as(
102
+ type_=typing.Any, # type: ignore
103
+ object_=_response.json(),
104
+ ),
105
+ ),
106
+ )
107
+ _response_json = _response.json()
108
+ except JSONDecodeError:
109
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
110
+ except ValidationError as e:
111
+ raise ParsingError(
112
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
113
+ )
114
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
115
+
116
+ def resend(
117
+ self,
118
+ session_id: str,
119
+ *,
120
+ channel: TwoFactorVerificationResendRequestChannel,
121
+ request_options: typing.Optional[RequestOptions] = None,
122
+ ) -> HttpResponse[ResendVerificationResponse]:
123
+ """
124
+ Resends the OTP for the verification identified by `session_id` over the specified channel. Previously sent codes are invalidated.
125
+
126
+ Parameters
127
+ ----------
128
+ session_id : str
129
+ The unique ID of the 2FA verification session.
130
+
131
+ channel : TwoFactorVerificationResendRequestChannel
132
+ Channel used to resend the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
133
+
134
+ request_options : typing.Optional[RequestOptions]
135
+ Request-specific configuration.
136
+
137
+ Returns
138
+ -------
139
+ HttpResponse[ResendVerificationResponse]
140
+ Returns the resend result, including the channel used.
141
+ """
142
+ _response = self._client_wrapper.httpx_client.request(
143
+ f"v1/two-fa/verification/{encode_path_param(session_id)}",
144
+ method="POST",
145
+ json={
146
+ "channel": channel,
147
+ },
148
+ headers={
149
+ "content-type": "application/json",
150
+ },
151
+ request_options=request_options,
152
+ omit=OMIT,
153
+ )
154
+ try:
155
+ if 200 <= _response.status_code < 300:
156
+ _data = typing.cast(
157
+ ResendVerificationResponse,
158
+ parse_obj_as(
159
+ type_=ResendVerificationResponse, # type: ignore
160
+ object_=_response.json(),
161
+ ),
162
+ )
163
+ return HttpResponse(response=_response, data=_data)
164
+ if _response.status_code == 400:
165
+ raise BadRequestError(
166
+ headers=dict(_response.headers),
167
+ body=typing.cast(
168
+ typing.Any,
169
+ parse_obj_as(
170
+ type_=typing.Any, # type: ignore
171
+ object_=_response.json(),
172
+ ),
173
+ ),
174
+ )
175
+ if _response.status_code == 403:
176
+ raise ForbiddenError(
177
+ headers=dict(_response.headers),
178
+ body=typing.cast(
179
+ typing.Any,
180
+ parse_obj_as(
181
+ type_=typing.Any, # type: ignore
182
+ object_=_response.json(),
183
+ ),
184
+ ),
185
+ )
186
+ _response_json = _response.json()
187
+ except JSONDecodeError:
188
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
189
+ except ValidationError as e:
190
+ raise ParsingError(
191
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
192
+ )
193
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
194
+
195
+ def check(
196
+ self, session_id: str, *, code: str, request_options: typing.Optional[RequestOptions] = None
197
+ ) -> HttpResponse[CheckVerificationResponse]:
198
+ """
199
+ Validates the OTP submitted by the end user against the verification identified by `session_id`.
200
+
201
+ Parameters
202
+ ----------
203
+ session_id : str
204
+ The unique ID of the 2FA verification session.
205
+
206
+ code : str
207
+ The code entered by an end user
208
+
209
+ request_options : typing.Optional[RequestOptions]
210
+ Request-specific configuration.
211
+
212
+ Returns
213
+ -------
214
+ HttpResponse[CheckVerificationResponse]
215
+ Returns the validation result in `is_valid`.
216
+ """
217
+ _response = self._client_wrapper.httpx_client.request(
218
+ f"v1/two-fa/verification/{encode_path_param(session_id)}/check",
219
+ method="POST",
220
+ json={
221
+ "code": code,
222
+ },
223
+ headers={
224
+ "content-type": "application/json",
225
+ },
226
+ request_options=request_options,
227
+ omit=OMIT,
228
+ )
229
+ try:
230
+ if 200 <= _response.status_code < 300:
231
+ _data = typing.cast(
232
+ CheckVerificationResponse,
233
+ parse_obj_as(
234
+ type_=CheckVerificationResponse, # type: ignore
235
+ object_=_response.json(),
236
+ ),
237
+ )
238
+ return HttpResponse(response=_response, data=_data)
239
+ if _response.status_code == 400:
240
+ raise BadRequestError(
241
+ headers=dict(_response.headers),
242
+ body=typing.cast(
243
+ typing.Any,
244
+ parse_obj_as(
245
+ type_=typing.Any, # type: ignore
246
+ object_=_response.json(),
247
+ ),
248
+ ),
249
+ )
250
+ if _response.status_code == 403:
251
+ raise ForbiddenError(
252
+ headers=dict(_response.headers),
253
+ body=typing.cast(
254
+ typing.Any,
255
+ parse_obj_as(
256
+ type_=typing.Any, # type: ignore
257
+ object_=_response.json(),
258
+ ),
259
+ ),
260
+ )
261
+ _response_json = _response.json()
262
+ except JSONDecodeError:
263
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
264
+ except ValidationError as e:
265
+ raise ParsingError(
266
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
267
+ )
268
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
269
+
270
+ def cancel(
271
+ self, session_id: str, *, request_options: typing.Optional[RequestOptions] = None
272
+ ) -> HttpResponse[SuccessResponse]:
273
+ """
274
+ Cancels the 2FA verification identified by `session_id`. No further codes are sent, and previously sent codes can no longer be validated. A new verification is required to send another code.
275
+
276
+ Parameters
277
+ ----------
278
+ session_id : str
279
+ The unique ID of the 2FA verification session.
280
+
281
+ request_options : typing.Optional[RequestOptions]
282
+ Request-specific configuration.
283
+
284
+ Returns
285
+ -------
286
+ HttpResponse[SuccessResponse]
287
+ Returns a success confirmation. The verification is canceled.
288
+ """
289
+ _response = self._client_wrapper.httpx_client.request(
290
+ f"v1/two-fa/verification/{encode_path_param(session_id)}/cancel",
291
+ method="PATCH",
292
+ request_options=request_options,
293
+ )
294
+ try:
295
+ if 200 <= _response.status_code < 300:
296
+ _data = typing.cast(
297
+ SuccessResponse,
298
+ parse_obj_as(
299
+ type_=SuccessResponse, # type: ignore
300
+ object_=_response.json(),
301
+ ),
302
+ )
303
+ return HttpResponse(response=_response, data=_data)
304
+ if _response.status_code == 400:
305
+ raise BadRequestError(
306
+ headers=dict(_response.headers),
307
+ body=typing.cast(
308
+ typing.Any,
309
+ parse_obj_as(
310
+ type_=typing.Any, # type: ignore
311
+ object_=_response.json(),
312
+ ),
313
+ ),
314
+ )
315
+ if _response.status_code == 403:
316
+ raise ForbiddenError(
317
+ headers=dict(_response.headers),
318
+ body=typing.cast(
319
+ typing.Any,
320
+ parse_obj_as(
321
+ type_=typing.Any, # type: ignore
322
+ object_=_response.json(),
323
+ ),
324
+ ),
325
+ )
326
+ if _response.status_code == 404:
327
+ raise NotFoundError(
328
+ headers=dict(_response.headers),
329
+ body=typing.cast(
330
+ typing.Any,
331
+ parse_obj_as(
332
+ type_=typing.Any, # type: ignore
333
+ object_=_response.json(),
334
+ ),
335
+ ),
336
+ )
337
+ _response_json = _response.json()
338
+ except JSONDecodeError:
339
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
340
+ except ValidationError as e:
341
+ raise ParsingError(
342
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
343
+ )
344
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
345
+
346
+
347
+ class AsyncRawVerificationClient:
348
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
349
+ self._client_wrapper = client_wrapper
350
+
351
+ async def create(
352
+ self, *, service_id: str, to: str, channel: str, request_options: typing.Optional[RequestOptions] = None
353
+ ) -> AsyncHttpResponse[CreateVerificationResponse]:
354
+ """
355
+ Creates a 2FA verification and sends a one-time password (OTP) to the destination phone number over the selected channel. Requires a 2FA service configured in the Wavix portal; the service is reused to generate and validate OTPs.
356
+
357
+ The verification proceeds through three steps:
358
+ 1. Create a verification to generate and send an OTP.
359
+ 2. Resend the OTP on the same verification if needed.
360
+ 3. Validate the OTP through the check endpoint.
361
+
362
+ Parameters
363
+ ----------
364
+ service_id : str
365
+ Unique Wavix 2FA Service ID. Available on the Wavix portal.
366
+
367
+ to : str
368
+ End user's phone number to which the verification code will be sent. The phone number must be in E.164 format.
369
+
370
+ channel : str
371
+ Channel used to deliver the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
372
+
373
+ request_options : typing.Optional[RequestOptions]
374
+ Request-specific configuration.
375
+
376
+ Returns
377
+ -------
378
+ AsyncHttpResponse[CreateVerificationResponse]
379
+ Returns the created 2FA verification.
380
+ """
381
+ _response = await self._client_wrapper.httpx_client.request(
382
+ "v1/two-fa/verification",
383
+ method="POST",
384
+ json={
385
+ "service_id": service_id,
386
+ "to": to,
387
+ "channel": channel,
388
+ },
389
+ headers={
390
+ "content-type": "application/json",
391
+ },
392
+ request_options=request_options,
393
+ omit=OMIT,
394
+ )
395
+ try:
396
+ if 200 <= _response.status_code < 300:
397
+ _data = typing.cast(
398
+ CreateVerificationResponse,
399
+ parse_obj_as(
400
+ type_=CreateVerificationResponse, # type: ignore
401
+ object_=_response.json(),
402
+ ),
403
+ )
404
+ return AsyncHttpResponse(response=_response, data=_data)
405
+ if _response.status_code == 400:
406
+ raise BadRequestError(
407
+ headers=dict(_response.headers),
408
+ body=typing.cast(
409
+ typing.Any,
410
+ parse_obj_as(
411
+ type_=typing.Any, # type: ignore
412
+ object_=_response.json(),
413
+ ),
414
+ ),
415
+ )
416
+ if _response.status_code == 403:
417
+ raise ForbiddenError(
418
+ headers=dict(_response.headers),
419
+ body=typing.cast(
420
+ typing.Any,
421
+ parse_obj_as(
422
+ type_=typing.Any, # type: ignore
423
+ object_=_response.json(),
424
+ ),
425
+ ),
426
+ )
427
+ _response_json = _response.json()
428
+ except JSONDecodeError:
429
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
430
+ except ValidationError as e:
431
+ raise ParsingError(
432
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
433
+ )
434
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
435
+
436
+ async def resend(
437
+ self,
438
+ session_id: str,
439
+ *,
440
+ channel: TwoFactorVerificationResendRequestChannel,
441
+ request_options: typing.Optional[RequestOptions] = None,
442
+ ) -> AsyncHttpResponse[ResendVerificationResponse]:
443
+ """
444
+ Resends the OTP for the verification identified by `session_id` over the specified channel. Previously sent codes are invalidated.
445
+
446
+ Parameters
447
+ ----------
448
+ session_id : str
449
+ The unique ID of the 2FA verification session.
450
+
451
+ channel : TwoFactorVerificationResendRequestChannel
452
+ Channel used to resend the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
453
+
454
+ request_options : typing.Optional[RequestOptions]
455
+ Request-specific configuration.
456
+
457
+ Returns
458
+ -------
459
+ AsyncHttpResponse[ResendVerificationResponse]
460
+ Returns the resend result, including the channel used.
461
+ """
462
+ _response = await self._client_wrapper.httpx_client.request(
463
+ f"v1/two-fa/verification/{encode_path_param(session_id)}",
464
+ method="POST",
465
+ json={
466
+ "channel": channel,
467
+ },
468
+ headers={
469
+ "content-type": "application/json",
470
+ },
471
+ request_options=request_options,
472
+ omit=OMIT,
473
+ )
474
+ try:
475
+ if 200 <= _response.status_code < 300:
476
+ _data = typing.cast(
477
+ ResendVerificationResponse,
478
+ parse_obj_as(
479
+ type_=ResendVerificationResponse, # type: ignore
480
+ object_=_response.json(),
481
+ ),
482
+ )
483
+ return AsyncHttpResponse(response=_response, data=_data)
484
+ if _response.status_code == 400:
485
+ raise BadRequestError(
486
+ headers=dict(_response.headers),
487
+ body=typing.cast(
488
+ typing.Any,
489
+ parse_obj_as(
490
+ type_=typing.Any, # type: ignore
491
+ object_=_response.json(),
492
+ ),
493
+ ),
494
+ )
495
+ if _response.status_code == 403:
496
+ raise ForbiddenError(
497
+ headers=dict(_response.headers),
498
+ body=typing.cast(
499
+ typing.Any,
500
+ parse_obj_as(
501
+ type_=typing.Any, # type: ignore
502
+ object_=_response.json(),
503
+ ),
504
+ ),
505
+ )
506
+ _response_json = _response.json()
507
+ except JSONDecodeError:
508
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
509
+ except ValidationError as e:
510
+ raise ParsingError(
511
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
512
+ )
513
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
514
+
515
+ async def check(
516
+ self, session_id: str, *, code: str, request_options: typing.Optional[RequestOptions] = None
517
+ ) -> AsyncHttpResponse[CheckVerificationResponse]:
518
+ """
519
+ Validates the OTP submitted by the end user against the verification identified by `session_id`.
520
+
521
+ Parameters
522
+ ----------
523
+ session_id : str
524
+ The unique ID of the 2FA verification session.
525
+
526
+ code : str
527
+ The code entered by an end user
528
+
529
+ request_options : typing.Optional[RequestOptions]
530
+ Request-specific configuration.
531
+
532
+ Returns
533
+ -------
534
+ AsyncHttpResponse[CheckVerificationResponse]
535
+ Returns the validation result in `is_valid`.
536
+ """
537
+ _response = await self._client_wrapper.httpx_client.request(
538
+ f"v1/two-fa/verification/{encode_path_param(session_id)}/check",
539
+ method="POST",
540
+ json={
541
+ "code": code,
542
+ },
543
+ headers={
544
+ "content-type": "application/json",
545
+ },
546
+ request_options=request_options,
547
+ omit=OMIT,
548
+ )
549
+ try:
550
+ if 200 <= _response.status_code < 300:
551
+ _data = typing.cast(
552
+ CheckVerificationResponse,
553
+ parse_obj_as(
554
+ type_=CheckVerificationResponse, # type: ignore
555
+ object_=_response.json(),
556
+ ),
557
+ )
558
+ return AsyncHttpResponse(response=_response, data=_data)
559
+ if _response.status_code == 400:
560
+ raise BadRequestError(
561
+ headers=dict(_response.headers),
562
+ body=typing.cast(
563
+ typing.Any,
564
+ parse_obj_as(
565
+ type_=typing.Any, # type: ignore
566
+ object_=_response.json(),
567
+ ),
568
+ ),
569
+ )
570
+ if _response.status_code == 403:
571
+ raise ForbiddenError(
572
+ headers=dict(_response.headers),
573
+ body=typing.cast(
574
+ typing.Any,
575
+ parse_obj_as(
576
+ type_=typing.Any, # type: ignore
577
+ object_=_response.json(),
578
+ ),
579
+ ),
580
+ )
581
+ _response_json = _response.json()
582
+ except JSONDecodeError:
583
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
584
+ except ValidationError as e:
585
+ raise ParsingError(
586
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
587
+ )
588
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
589
+
590
+ async def cancel(
591
+ self, session_id: str, *, request_options: typing.Optional[RequestOptions] = None
592
+ ) -> AsyncHttpResponse[SuccessResponse]:
593
+ """
594
+ Cancels the 2FA verification identified by `session_id`. No further codes are sent, and previously sent codes can no longer be validated. A new verification is required to send another code.
595
+
596
+ Parameters
597
+ ----------
598
+ session_id : str
599
+ The unique ID of the 2FA verification session.
600
+
601
+ request_options : typing.Optional[RequestOptions]
602
+ Request-specific configuration.
603
+
604
+ Returns
605
+ -------
606
+ AsyncHttpResponse[SuccessResponse]
607
+ Returns a success confirmation. The verification is canceled.
608
+ """
609
+ _response = await self._client_wrapper.httpx_client.request(
610
+ f"v1/two-fa/verification/{encode_path_param(session_id)}/cancel",
611
+ method="PATCH",
612
+ request_options=request_options,
613
+ )
614
+ try:
615
+ if 200 <= _response.status_code < 300:
616
+ _data = typing.cast(
617
+ SuccessResponse,
618
+ parse_obj_as(
619
+ type_=SuccessResponse, # type: ignore
620
+ object_=_response.json(),
621
+ ),
622
+ )
623
+ return AsyncHttpResponse(response=_response, data=_data)
624
+ if _response.status_code == 400:
625
+ raise BadRequestError(
626
+ headers=dict(_response.headers),
627
+ body=typing.cast(
628
+ typing.Any,
629
+ parse_obj_as(
630
+ type_=typing.Any, # type: ignore
631
+ object_=_response.json(),
632
+ ),
633
+ ),
634
+ )
635
+ if _response.status_code == 403:
636
+ raise ForbiddenError(
637
+ headers=dict(_response.headers),
638
+ body=typing.cast(
639
+ typing.Any,
640
+ parse_obj_as(
641
+ type_=typing.Any, # type: ignore
642
+ object_=_response.json(),
643
+ ),
644
+ ),
645
+ )
646
+ if _response.status_code == 404:
647
+ raise NotFoundError(
648
+ headers=dict(_response.headers),
649
+ body=typing.cast(
650
+ typing.Any,
651
+ parse_obj_as(
652
+ type_=typing.Any, # type: ignore
653
+ object_=_response.json(),
654
+ ),
655
+ ),
656
+ )
657
+ _response_json = _response.json()
658
+ except JSONDecodeError:
659
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
660
+ except ValidationError as e:
661
+ raise ParsingError(
662
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
663
+ )
664
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)