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,1224 @@
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 ..core.serialization import convert_and_respect_annotation_metadata
14
+ from ..errors.bad_request_error import BadRequestError
15
+ from ..errors.not_found_error import NotFoundError
16
+ from ..errors.unauthorized_error import UnauthorizedError
17
+ from ..types.call_create_response import CallCreateResponse
18
+ from ..types.call_list_response import CallListResponse
19
+ from ..types.call_response import CallResponse
20
+ from ..types.call_stream_channel import CallStreamChannel
21
+ from ..types.call_stream_type import CallStreamType
22
+ from ..types.success_response import SuccessResponse
23
+ from ..types.unauthorized_error_response import UnauthorizedErrorResponse
24
+ from .types.call_dtmf_collect_request_prompt import CallDtmfCollectRequestPrompt
25
+ from pydantic import ValidationError
26
+
27
+ # this is used as the default value for optional parameters
28
+ OMIT = typing.cast(typing.Any, ...)
29
+
30
+
31
+ class RawCallControlClient:
32
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
33
+ self._client_wrapper = client_wrapper
34
+
35
+ def list(self, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[CallListResponse]:
36
+ """
37
+ Returns the calls currently in progress for the authenticated account.
38
+
39
+ Parameters
40
+ ----------
41
+ request_options : typing.Optional[RequestOptions]
42
+ Request-specific configuration.
43
+
44
+ Returns
45
+ -------
46
+ HttpResponse[CallListResponse]
47
+ Returns the list of active calls.
48
+ """
49
+ _response = self._client_wrapper.httpx_client.request(
50
+ "v1/calls",
51
+ method="GET",
52
+ request_options=request_options,
53
+ )
54
+ try:
55
+ if 200 <= _response.status_code < 300:
56
+ _data = typing.cast(
57
+ CallListResponse,
58
+ parse_obj_as(
59
+ type_=CallListResponse, # type: ignore
60
+ object_=_response.json(),
61
+ ),
62
+ )
63
+ return HttpResponse(response=_response, data=_data)
64
+ if _response.status_code == 401:
65
+ raise UnauthorizedError(
66
+ headers=dict(_response.headers),
67
+ body=typing.cast(
68
+ UnauthorizedErrorResponse,
69
+ parse_obj_as(
70
+ type_=UnauthorizedErrorResponse, # type: ignore
71
+ object_=_response.json(),
72
+ ),
73
+ ),
74
+ )
75
+ _response_json = _response.json()
76
+ except JSONDecodeError:
77
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
78
+ except ValidationError as e:
79
+ raise ParsingError(
80
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
81
+ )
82
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
83
+
84
+ def create(
85
+ self,
86
+ *,
87
+ from_: str,
88
+ to: str,
89
+ callback_url: str,
90
+ recording: typing.Optional[bool] = OMIT,
91
+ voicemail_detection: typing.Optional[bool] = OMIT,
92
+ tag: typing.Optional[str] = OMIT,
93
+ timeout: typing.Optional[int] = OMIT,
94
+ request_options: typing.Optional[RequestOptions] = None,
95
+ ) -> HttpResponse[CallCreateResponse]:
96
+ """
97
+ Places an outbound call. Returns the call with its `uuid` for tracking and control.
98
+
99
+ Parameters
100
+ ----------
101
+ from_ : str
102
+ Caller ID. Must be an active or verified phone number on the account.
103
+
104
+ to : str
105
+ Destination number in E.164 format
106
+
107
+ callback_url : str
108
+ The callback URL where Wavix sends the call status updates
109
+
110
+ recording : typing.Optional[bool]
111
+ Specifies whether to record the call
112
+
113
+ voicemail_detection : typing.Optional[bool]
114
+ Specifies whether the AMD is turned on for the call
115
+
116
+ tag : typing.Optional[str]
117
+ Call metadata
118
+
119
+ timeout : typing.Optional[int]
120
+ The ring timeout, in seconds, before the call is considered unanswered.
121
+
122
+ request_options : typing.Optional[RequestOptions]
123
+ Request-specific configuration.
124
+
125
+ Returns
126
+ -------
127
+ HttpResponse[CallCreateResponse]
128
+ Returns the created call.
129
+ """
130
+ _response = self._client_wrapper.httpx_client.request(
131
+ "v1/calls",
132
+ method="POST",
133
+ json={
134
+ "from": from_,
135
+ "to": to,
136
+ "callback_url": callback_url,
137
+ "recording": recording,
138
+ "voicemail_detection": voicemail_detection,
139
+ "tag": tag,
140
+ "timeout": timeout,
141
+ },
142
+ headers={
143
+ "content-type": "application/json",
144
+ },
145
+ request_options=request_options,
146
+ omit=OMIT,
147
+ )
148
+ try:
149
+ if 200 <= _response.status_code < 300:
150
+ _data = typing.cast(
151
+ CallCreateResponse,
152
+ parse_obj_as(
153
+ type_=CallCreateResponse, # type: ignore
154
+ object_=_response.json(),
155
+ ),
156
+ )
157
+ return HttpResponse(response=_response, data=_data)
158
+ if _response.status_code == 400:
159
+ raise BadRequestError(
160
+ headers=dict(_response.headers),
161
+ body=typing.cast(
162
+ typing.Any,
163
+ parse_obj_as(
164
+ type_=typing.Any, # type: ignore
165
+ object_=_response.json(),
166
+ ),
167
+ ),
168
+ )
169
+ if _response.status_code == 401:
170
+ raise UnauthorizedError(
171
+ headers=dict(_response.headers),
172
+ body=typing.cast(
173
+ UnauthorizedErrorResponse,
174
+ parse_obj_as(
175
+ type_=UnauthorizedErrorResponse, # type: ignore
176
+ object_=_response.json(),
177
+ ),
178
+ ),
179
+ )
180
+ _response_json = _response.json()
181
+ except JSONDecodeError:
182
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
183
+ except ValidationError as e:
184
+ raise ParsingError(
185
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
186
+ )
187
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
188
+
189
+ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[CallResponse]:
190
+ """
191
+ Returns the call identified by `id`, including its current event and timestamps.
192
+
193
+ Parameters
194
+ ----------
195
+ id : str
196
+ The `uuid` of the call.
197
+
198
+ request_options : typing.Optional[RequestOptions]
199
+ Request-specific configuration.
200
+
201
+ Returns
202
+ -------
203
+ HttpResponse[CallResponse]
204
+ Returns the call.
205
+ """
206
+ _response = self._client_wrapper.httpx_client.request(
207
+ f"v1/calls/{encode_path_param(id)}",
208
+ method="GET",
209
+ request_options=request_options,
210
+ )
211
+ try:
212
+ if 200 <= _response.status_code < 300:
213
+ _data = typing.cast(
214
+ CallResponse,
215
+ parse_obj_as(
216
+ type_=CallResponse, # type: ignore
217
+ object_=_response.json(),
218
+ ),
219
+ )
220
+ return HttpResponse(response=_response, data=_data)
221
+ if _response.status_code == 401:
222
+ raise UnauthorizedError(
223
+ headers=dict(_response.headers),
224
+ body=typing.cast(
225
+ UnauthorizedErrorResponse,
226
+ parse_obj_as(
227
+ type_=UnauthorizedErrorResponse, # type: ignore
228
+ object_=_response.json(),
229
+ ),
230
+ ),
231
+ )
232
+ if _response.status_code == 404:
233
+ raise NotFoundError(
234
+ headers=dict(_response.headers),
235
+ body=typing.cast(
236
+ typing.Any,
237
+ parse_obj_as(
238
+ type_=typing.Any, # type: ignore
239
+ object_=_response.json(),
240
+ ),
241
+ ),
242
+ )
243
+ _response_json = _response.json()
244
+ except JSONDecodeError:
245
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
246
+ except ValidationError as e:
247
+ raise ParsingError(
248
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
249
+ )
250
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
251
+
252
+ def delete(
253
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
254
+ ) -> HttpResponse[SuccessResponse]:
255
+ """
256
+ Ends the active call identified by `id` by hanging up.
257
+
258
+ Parameters
259
+ ----------
260
+ id : str
261
+ The `uuid` of the call.
262
+
263
+ request_options : typing.Optional[RequestOptions]
264
+ Request-specific configuration.
265
+
266
+ Returns
267
+ -------
268
+ HttpResponse[SuccessResponse]
269
+ Returns a success confirmation. The call is ended.
270
+ """
271
+ _response = self._client_wrapper.httpx_client.request(
272
+ f"v1/calls/{encode_path_param(id)}",
273
+ method="DELETE",
274
+ request_options=request_options,
275
+ )
276
+ try:
277
+ if 200 <= _response.status_code < 300:
278
+ _data = typing.cast(
279
+ SuccessResponse,
280
+ parse_obj_as(
281
+ type_=SuccessResponse, # type: ignore
282
+ object_=_response.json(),
283
+ ),
284
+ )
285
+ return HttpResponse(response=_response, data=_data)
286
+ if _response.status_code == 401:
287
+ raise UnauthorizedError(
288
+ headers=dict(_response.headers),
289
+ body=typing.cast(
290
+ UnauthorizedErrorResponse,
291
+ parse_obj_as(
292
+ type_=UnauthorizedErrorResponse, # type: ignore
293
+ object_=_response.json(),
294
+ ),
295
+ ),
296
+ )
297
+ if _response.status_code == 404:
298
+ raise NotFoundError(
299
+ headers=dict(_response.headers),
300
+ body=typing.cast(
301
+ typing.Any,
302
+ parse_obj_as(
303
+ type_=typing.Any, # type: ignore
304
+ object_=_response.json(),
305
+ ),
306
+ ),
307
+ )
308
+ _response_json = _response.json()
309
+ except JSONDecodeError:
310
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
311
+ except ValidationError as e:
312
+ raise ParsingError(
313
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
314
+ )
315
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
316
+
317
+ def update(
318
+ self, id: str, *, tag: str, request_options: typing.Optional[RequestOptions] = None
319
+ ) -> HttpResponse[SuccessResponse]:
320
+ """
321
+ Updates the active call identified by `id`. Only the `tag` field can be changed.
322
+
323
+ Parameters
324
+ ----------
325
+ id : str
326
+ The `uuid` of the call.
327
+
328
+ tag : str
329
+ User-defined label attached to the Call for tracking or reporting.
330
+
331
+ request_options : typing.Optional[RequestOptions]
332
+ Request-specific configuration.
333
+
334
+ Returns
335
+ -------
336
+ HttpResponse[SuccessResponse]
337
+ Returns a success confirmation. The call `tag` is updated.
338
+ """
339
+ _response = self._client_wrapper.httpx_client.request(
340
+ f"v1/calls/{encode_path_param(id)}",
341
+ method="PATCH",
342
+ json={
343
+ "tag": tag,
344
+ },
345
+ headers={
346
+ "content-type": "application/json",
347
+ },
348
+ request_options=request_options,
349
+ omit=OMIT,
350
+ )
351
+ try:
352
+ if 200 <= _response.status_code < 300:
353
+ _data = typing.cast(
354
+ SuccessResponse,
355
+ parse_obj_as(
356
+ type_=SuccessResponse, # type: ignore
357
+ object_=_response.json(),
358
+ ),
359
+ )
360
+ return HttpResponse(response=_response, data=_data)
361
+ if _response.status_code == 400:
362
+ raise BadRequestError(
363
+ headers=dict(_response.headers),
364
+ body=typing.cast(
365
+ typing.Any,
366
+ parse_obj_as(
367
+ type_=typing.Any, # type: ignore
368
+ object_=_response.json(),
369
+ ),
370
+ ),
371
+ )
372
+ if _response.status_code == 401:
373
+ raise UnauthorizedError(
374
+ headers=dict(_response.headers),
375
+ body=typing.cast(
376
+ UnauthorizedErrorResponse,
377
+ parse_obj_as(
378
+ type_=UnauthorizedErrorResponse, # type: ignore
379
+ object_=_response.json(),
380
+ ),
381
+ ),
382
+ )
383
+ if _response.status_code == 404:
384
+ raise NotFoundError(
385
+ headers=dict(_response.headers),
386
+ body=typing.cast(
387
+ typing.Any,
388
+ parse_obj_as(
389
+ type_=typing.Any, # type: ignore
390
+ object_=_response.json(),
391
+ ),
392
+ ),
393
+ )
394
+ _response_json = _response.json()
395
+ except JSONDecodeError:
396
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
397
+ except ValidationError as e:
398
+ raise ParsingError(
399
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
400
+ )
401
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
402
+
403
+ def answer(
404
+ self,
405
+ id: str,
406
+ *,
407
+ call_recording: typing.Optional[bool] = OMIT,
408
+ call_transcription: typing.Optional[bool] = OMIT,
409
+ stream_url: typing.Optional[str] = OMIT,
410
+ stream_type: typing.Optional[CallStreamType] = OMIT,
411
+ stream_channel: typing.Optional[CallStreamChannel] = OMIT,
412
+ request_options: typing.Optional[RequestOptions] = None,
413
+ ) -> HttpResponse[SuccessResponse]:
414
+ """
415
+ Answers the inbound call identified by `id`. Optionally starts media streaming on answer.
416
+
417
+ Parameters
418
+ ----------
419
+ id : str
420
+ The `uuid` of the call.
421
+
422
+ call_recording : typing.Optional[bool]
423
+ Indicates whether the call should be recorded.
424
+
425
+ call_transcription : typing.Optional[bool]
426
+ Indicates whether the call should be transcribed after it ends.
427
+
428
+ stream_url : typing.Optional[str]
429
+ WebSocket URL to stream the call.
430
+
431
+ stream_type : typing.Optional[CallStreamType]
432
+ Direction of audio streamed to `stream_url`.
433
+
434
+ stream_channel : typing.Optional[CallStreamChannel]
435
+ Audio channel streamed to `stream_url`.
436
+
437
+ request_options : typing.Optional[RequestOptions]
438
+ Request-specific configuration.
439
+
440
+ Returns
441
+ -------
442
+ HttpResponse[SuccessResponse]
443
+ Returns a success confirmation. The call is answered.
444
+ """
445
+ _response = self._client_wrapper.httpx_client.request(
446
+ f"v1/calls/{encode_path_param(id)}/answer",
447
+ method="POST",
448
+ json={
449
+ "call_recording": call_recording,
450
+ "call_transcription": call_transcription,
451
+ "stream_url": stream_url,
452
+ "stream_type": stream_type,
453
+ "stream_channel": stream_channel,
454
+ },
455
+ headers={
456
+ "content-type": "application/json",
457
+ },
458
+ request_options=request_options,
459
+ omit=OMIT,
460
+ )
461
+ try:
462
+ if 200 <= _response.status_code < 300:
463
+ _data = typing.cast(
464
+ SuccessResponse,
465
+ parse_obj_as(
466
+ type_=SuccessResponse, # type: ignore
467
+ object_=_response.json(),
468
+ ),
469
+ )
470
+ return HttpResponse(response=_response, data=_data)
471
+ if _response.status_code == 400:
472
+ raise BadRequestError(
473
+ headers=dict(_response.headers),
474
+ body=typing.cast(
475
+ typing.Any,
476
+ parse_obj_as(
477
+ type_=typing.Any, # type: ignore
478
+ object_=_response.json(),
479
+ ),
480
+ ),
481
+ )
482
+ if _response.status_code == 401:
483
+ raise UnauthorizedError(
484
+ headers=dict(_response.headers),
485
+ body=typing.cast(
486
+ UnauthorizedErrorResponse,
487
+ parse_obj_as(
488
+ type_=UnauthorizedErrorResponse, # type: ignore
489
+ object_=_response.json(),
490
+ ),
491
+ ),
492
+ )
493
+ if _response.status_code == 404:
494
+ raise NotFoundError(
495
+ headers=dict(_response.headers),
496
+ body=typing.cast(
497
+ typing.Any,
498
+ parse_obj_as(
499
+ type_=typing.Any, # type: ignore
500
+ object_=_response.json(),
501
+ ),
502
+ ),
503
+ )
504
+ _response_json = _response.json()
505
+ except JSONDecodeError:
506
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
507
+ except ValidationError as e:
508
+ raise ParsingError(
509
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
510
+ )
511
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
512
+
513
+ def collect(
514
+ self,
515
+ id: str,
516
+ *,
517
+ max_digits: typing.Optional[int] = OMIT,
518
+ timeout: typing.Optional[int] = OMIT,
519
+ termination_character: typing.Optional[str] = OMIT,
520
+ max_attempts: typing.Optional[int] = OMIT,
521
+ prompt: typing.Optional[CallDtmfCollectRequestPrompt] = OMIT,
522
+ request_options: typing.Optional[RequestOptions] = None,
523
+ ) -> HttpResponse[SuccessResponse]:
524
+ """
525
+ Collects DTMF keypad input from the caller on the active call identified by `id`.
526
+
527
+ Parameters
528
+ ----------
529
+ id : str
530
+ The `uuid` of the call.
531
+
532
+ max_digits : typing.Optional[int]
533
+ Maximum number of digits to collect.
534
+
535
+ timeout : typing.Optional[int]
536
+ Timeout for digit collection in seconds.
537
+
538
+ termination_character : typing.Optional[str]
539
+ DTMF character that ends input collection.
540
+
541
+ max_attempts : typing.Optional[int]
542
+ Maximum number of attempts.
543
+
544
+ prompt : typing.Optional[CallDtmfCollectRequestPrompt]
545
+ Prompt to play before collecting digits.
546
+ Play a prerecorded audio file or use Wavix Text-To-Speech.
547
+
548
+ request_options : typing.Optional[RequestOptions]
549
+ Request-specific configuration.
550
+
551
+ Returns
552
+ -------
553
+ HttpResponse[SuccessResponse]
554
+ Returns a success confirmation. DTMF collection starts.
555
+ """
556
+ _response = self._client_wrapper.httpx_client.request(
557
+ f"v1/calls/{encode_path_param(id)}/collect",
558
+ method="POST",
559
+ json={
560
+ "max_digits": max_digits,
561
+ "timeout": timeout,
562
+ "termination_character": termination_character,
563
+ "max_attempts": max_attempts,
564
+ "prompt": convert_and_respect_annotation_metadata(
565
+ object_=prompt, annotation=CallDtmfCollectRequestPrompt, direction="write"
566
+ ),
567
+ },
568
+ headers={
569
+ "content-type": "application/json",
570
+ },
571
+ request_options=request_options,
572
+ omit=OMIT,
573
+ )
574
+ try:
575
+ if 200 <= _response.status_code < 300:
576
+ _data = typing.cast(
577
+ SuccessResponse,
578
+ parse_obj_as(
579
+ type_=SuccessResponse, # type: ignore
580
+ object_=_response.json(),
581
+ ),
582
+ )
583
+ return HttpResponse(response=_response, data=_data)
584
+ if _response.status_code == 400:
585
+ raise BadRequestError(
586
+ headers=dict(_response.headers),
587
+ body=typing.cast(
588
+ typing.Any,
589
+ parse_obj_as(
590
+ type_=typing.Any, # type: ignore
591
+ object_=_response.json(),
592
+ ),
593
+ ),
594
+ )
595
+ if _response.status_code == 401:
596
+ raise UnauthorizedError(
597
+ headers=dict(_response.headers),
598
+ body=typing.cast(
599
+ UnauthorizedErrorResponse,
600
+ parse_obj_as(
601
+ type_=UnauthorizedErrorResponse, # type: ignore
602
+ object_=_response.json(),
603
+ ),
604
+ ),
605
+ )
606
+ if _response.status_code == 404:
607
+ raise NotFoundError(
608
+ headers=dict(_response.headers),
609
+ body=typing.cast(
610
+ typing.Any,
611
+ parse_obj_as(
612
+ type_=typing.Any, # type: ignore
613
+ object_=_response.json(),
614
+ ),
615
+ ),
616
+ )
617
+ _response_json = _response.json()
618
+ except JSONDecodeError:
619
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
620
+ except ValidationError as e:
621
+ raise ParsingError(
622
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
623
+ )
624
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
625
+
626
+
627
+ class AsyncRawCallControlClient:
628
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
629
+ self._client_wrapper = client_wrapper
630
+
631
+ async def list(
632
+ self, *, request_options: typing.Optional[RequestOptions] = None
633
+ ) -> AsyncHttpResponse[CallListResponse]:
634
+ """
635
+ Returns the calls currently in progress for the authenticated account.
636
+
637
+ Parameters
638
+ ----------
639
+ request_options : typing.Optional[RequestOptions]
640
+ Request-specific configuration.
641
+
642
+ Returns
643
+ -------
644
+ AsyncHttpResponse[CallListResponse]
645
+ Returns the list of active calls.
646
+ """
647
+ _response = await self._client_wrapper.httpx_client.request(
648
+ "v1/calls",
649
+ method="GET",
650
+ request_options=request_options,
651
+ )
652
+ try:
653
+ if 200 <= _response.status_code < 300:
654
+ _data = typing.cast(
655
+ CallListResponse,
656
+ parse_obj_as(
657
+ type_=CallListResponse, # type: ignore
658
+ object_=_response.json(),
659
+ ),
660
+ )
661
+ return AsyncHttpResponse(response=_response, data=_data)
662
+ if _response.status_code == 401:
663
+ raise UnauthorizedError(
664
+ headers=dict(_response.headers),
665
+ body=typing.cast(
666
+ UnauthorizedErrorResponse,
667
+ parse_obj_as(
668
+ type_=UnauthorizedErrorResponse, # type: ignore
669
+ object_=_response.json(),
670
+ ),
671
+ ),
672
+ )
673
+ _response_json = _response.json()
674
+ except JSONDecodeError:
675
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
676
+ except ValidationError as e:
677
+ raise ParsingError(
678
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
679
+ )
680
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
681
+
682
+ async def create(
683
+ self,
684
+ *,
685
+ from_: str,
686
+ to: str,
687
+ callback_url: str,
688
+ recording: typing.Optional[bool] = OMIT,
689
+ voicemail_detection: typing.Optional[bool] = OMIT,
690
+ tag: typing.Optional[str] = OMIT,
691
+ timeout: typing.Optional[int] = OMIT,
692
+ request_options: typing.Optional[RequestOptions] = None,
693
+ ) -> AsyncHttpResponse[CallCreateResponse]:
694
+ """
695
+ Places an outbound call. Returns the call with its `uuid` for tracking and control.
696
+
697
+ Parameters
698
+ ----------
699
+ from_ : str
700
+ Caller ID. Must be an active or verified phone number on the account.
701
+
702
+ to : str
703
+ Destination number in E.164 format
704
+
705
+ callback_url : str
706
+ The callback URL where Wavix sends the call status updates
707
+
708
+ recording : typing.Optional[bool]
709
+ Specifies whether to record the call
710
+
711
+ voicemail_detection : typing.Optional[bool]
712
+ Specifies whether the AMD is turned on for the call
713
+
714
+ tag : typing.Optional[str]
715
+ Call metadata
716
+
717
+ timeout : typing.Optional[int]
718
+ The ring timeout, in seconds, before the call is considered unanswered.
719
+
720
+ request_options : typing.Optional[RequestOptions]
721
+ Request-specific configuration.
722
+
723
+ Returns
724
+ -------
725
+ AsyncHttpResponse[CallCreateResponse]
726
+ Returns the created call.
727
+ """
728
+ _response = await self._client_wrapper.httpx_client.request(
729
+ "v1/calls",
730
+ method="POST",
731
+ json={
732
+ "from": from_,
733
+ "to": to,
734
+ "callback_url": callback_url,
735
+ "recording": recording,
736
+ "voicemail_detection": voicemail_detection,
737
+ "tag": tag,
738
+ "timeout": timeout,
739
+ },
740
+ headers={
741
+ "content-type": "application/json",
742
+ },
743
+ request_options=request_options,
744
+ omit=OMIT,
745
+ )
746
+ try:
747
+ if 200 <= _response.status_code < 300:
748
+ _data = typing.cast(
749
+ CallCreateResponse,
750
+ parse_obj_as(
751
+ type_=CallCreateResponse, # type: ignore
752
+ object_=_response.json(),
753
+ ),
754
+ )
755
+ return AsyncHttpResponse(response=_response, data=_data)
756
+ if _response.status_code == 400:
757
+ raise BadRequestError(
758
+ headers=dict(_response.headers),
759
+ body=typing.cast(
760
+ typing.Any,
761
+ parse_obj_as(
762
+ type_=typing.Any, # type: ignore
763
+ object_=_response.json(),
764
+ ),
765
+ ),
766
+ )
767
+ if _response.status_code == 401:
768
+ raise UnauthorizedError(
769
+ headers=dict(_response.headers),
770
+ body=typing.cast(
771
+ UnauthorizedErrorResponse,
772
+ parse_obj_as(
773
+ type_=UnauthorizedErrorResponse, # type: ignore
774
+ object_=_response.json(),
775
+ ),
776
+ ),
777
+ )
778
+ _response_json = _response.json()
779
+ except JSONDecodeError:
780
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
781
+ except ValidationError as e:
782
+ raise ParsingError(
783
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
784
+ )
785
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
786
+
787
+ async def get(
788
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
789
+ ) -> AsyncHttpResponse[CallResponse]:
790
+ """
791
+ Returns the call identified by `id`, including its current event and timestamps.
792
+
793
+ Parameters
794
+ ----------
795
+ id : str
796
+ The `uuid` of the call.
797
+
798
+ request_options : typing.Optional[RequestOptions]
799
+ Request-specific configuration.
800
+
801
+ Returns
802
+ -------
803
+ AsyncHttpResponse[CallResponse]
804
+ Returns the call.
805
+ """
806
+ _response = await self._client_wrapper.httpx_client.request(
807
+ f"v1/calls/{encode_path_param(id)}",
808
+ method="GET",
809
+ request_options=request_options,
810
+ )
811
+ try:
812
+ if 200 <= _response.status_code < 300:
813
+ _data = typing.cast(
814
+ CallResponse,
815
+ parse_obj_as(
816
+ type_=CallResponse, # type: ignore
817
+ object_=_response.json(),
818
+ ),
819
+ )
820
+ return AsyncHttpResponse(response=_response, data=_data)
821
+ if _response.status_code == 401:
822
+ raise UnauthorizedError(
823
+ headers=dict(_response.headers),
824
+ body=typing.cast(
825
+ UnauthorizedErrorResponse,
826
+ parse_obj_as(
827
+ type_=UnauthorizedErrorResponse, # type: ignore
828
+ object_=_response.json(),
829
+ ),
830
+ ),
831
+ )
832
+ if _response.status_code == 404:
833
+ raise NotFoundError(
834
+ headers=dict(_response.headers),
835
+ body=typing.cast(
836
+ typing.Any,
837
+ parse_obj_as(
838
+ type_=typing.Any, # type: ignore
839
+ object_=_response.json(),
840
+ ),
841
+ ),
842
+ )
843
+ _response_json = _response.json()
844
+ except JSONDecodeError:
845
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
846
+ except ValidationError as e:
847
+ raise ParsingError(
848
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
849
+ )
850
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
851
+
852
+ async def delete(
853
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
854
+ ) -> AsyncHttpResponse[SuccessResponse]:
855
+ """
856
+ Ends the active call identified by `id` by hanging up.
857
+
858
+ Parameters
859
+ ----------
860
+ id : str
861
+ The `uuid` of the call.
862
+
863
+ request_options : typing.Optional[RequestOptions]
864
+ Request-specific configuration.
865
+
866
+ Returns
867
+ -------
868
+ AsyncHttpResponse[SuccessResponse]
869
+ Returns a success confirmation. The call is ended.
870
+ """
871
+ _response = await self._client_wrapper.httpx_client.request(
872
+ f"v1/calls/{encode_path_param(id)}",
873
+ method="DELETE",
874
+ request_options=request_options,
875
+ )
876
+ try:
877
+ if 200 <= _response.status_code < 300:
878
+ _data = typing.cast(
879
+ SuccessResponse,
880
+ parse_obj_as(
881
+ type_=SuccessResponse, # type: ignore
882
+ object_=_response.json(),
883
+ ),
884
+ )
885
+ return AsyncHttpResponse(response=_response, data=_data)
886
+ if _response.status_code == 401:
887
+ raise UnauthorizedError(
888
+ headers=dict(_response.headers),
889
+ body=typing.cast(
890
+ UnauthorizedErrorResponse,
891
+ parse_obj_as(
892
+ type_=UnauthorizedErrorResponse, # type: ignore
893
+ object_=_response.json(),
894
+ ),
895
+ ),
896
+ )
897
+ if _response.status_code == 404:
898
+ raise NotFoundError(
899
+ headers=dict(_response.headers),
900
+ body=typing.cast(
901
+ typing.Any,
902
+ parse_obj_as(
903
+ type_=typing.Any, # type: ignore
904
+ object_=_response.json(),
905
+ ),
906
+ ),
907
+ )
908
+ _response_json = _response.json()
909
+ except JSONDecodeError:
910
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
911
+ except ValidationError as e:
912
+ raise ParsingError(
913
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
914
+ )
915
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
916
+
917
+ async def update(
918
+ self, id: str, *, tag: str, request_options: typing.Optional[RequestOptions] = None
919
+ ) -> AsyncHttpResponse[SuccessResponse]:
920
+ """
921
+ Updates the active call identified by `id`. Only the `tag` field can be changed.
922
+
923
+ Parameters
924
+ ----------
925
+ id : str
926
+ The `uuid` of the call.
927
+
928
+ tag : str
929
+ User-defined label attached to the Call for tracking or reporting.
930
+
931
+ request_options : typing.Optional[RequestOptions]
932
+ Request-specific configuration.
933
+
934
+ Returns
935
+ -------
936
+ AsyncHttpResponse[SuccessResponse]
937
+ Returns a success confirmation. The call `tag` is updated.
938
+ """
939
+ _response = await self._client_wrapper.httpx_client.request(
940
+ f"v1/calls/{encode_path_param(id)}",
941
+ method="PATCH",
942
+ json={
943
+ "tag": tag,
944
+ },
945
+ headers={
946
+ "content-type": "application/json",
947
+ },
948
+ request_options=request_options,
949
+ omit=OMIT,
950
+ )
951
+ try:
952
+ if 200 <= _response.status_code < 300:
953
+ _data = typing.cast(
954
+ SuccessResponse,
955
+ parse_obj_as(
956
+ type_=SuccessResponse, # type: ignore
957
+ object_=_response.json(),
958
+ ),
959
+ )
960
+ return AsyncHttpResponse(response=_response, data=_data)
961
+ if _response.status_code == 400:
962
+ raise BadRequestError(
963
+ headers=dict(_response.headers),
964
+ body=typing.cast(
965
+ typing.Any,
966
+ parse_obj_as(
967
+ type_=typing.Any, # type: ignore
968
+ object_=_response.json(),
969
+ ),
970
+ ),
971
+ )
972
+ if _response.status_code == 401:
973
+ raise UnauthorizedError(
974
+ headers=dict(_response.headers),
975
+ body=typing.cast(
976
+ UnauthorizedErrorResponse,
977
+ parse_obj_as(
978
+ type_=UnauthorizedErrorResponse, # type: ignore
979
+ object_=_response.json(),
980
+ ),
981
+ ),
982
+ )
983
+ if _response.status_code == 404:
984
+ raise NotFoundError(
985
+ headers=dict(_response.headers),
986
+ body=typing.cast(
987
+ typing.Any,
988
+ parse_obj_as(
989
+ type_=typing.Any, # type: ignore
990
+ object_=_response.json(),
991
+ ),
992
+ ),
993
+ )
994
+ _response_json = _response.json()
995
+ except JSONDecodeError:
996
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
997
+ except ValidationError as e:
998
+ raise ParsingError(
999
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1000
+ )
1001
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1002
+
1003
+ async def answer(
1004
+ self,
1005
+ id: str,
1006
+ *,
1007
+ call_recording: typing.Optional[bool] = OMIT,
1008
+ call_transcription: typing.Optional[bool] = OMIT,
1009
+ stream_url: typing.Optional[str] = OMIT,
1010
+ stream_type: typing.Optional[CallStreamType] = OMIT,
1011
+ stream_channel: typing.Optional[CallStreamChannel] = OMIT,
1012
+ request_options: typing.Optional[RequestOptions] = None,
1013
+ ) -> AsyncHttpResponse[SuccessResponse]:
1014
+ """
1015
+ Answers the inbound call identified by `id`. Optionally starts media streaming on answer.
1016
+
1017
+ Parameters
1018
+ ----------
1019
+ id : str
1020
+ The `uuid` of the call.
1021
+
1022
+ call_recording : typing.Optional[bool]
1023
+ Indicates whether the call should be recorded.
1024
+
1025
+ call_transcription : typing.Optional[bool]
1026
+ Indicates whether the call should be transcribed after it ends.
1027
+
1028
+ stream_url : typing.Optional[str]
1029
+ WebSocket URL to stream the call.
1030
+
1031
+ stream_type : typing.Optional[CallStreamType]
1032
+ Direction of audio streamed to `stream_url`.
1033
+
1034
+ stream_channel : typing.Optional[CallStreamChannel]
1035
+ Audio channel streamed to `stream_url`.
1036
+
1037
+ request_options : typing.Optional[RequestOptions]
1038
+ Request-specific configuration.
1039
+
1040
+ Returns
1041
+ -------
1042
+ AsyncHttpResponse[SuccessResponse]
1043
+ Returns a success confirmation. The call is answered.
1044
+ """
1045
+ _response = await self._client_wrapper.httpx_client.request(
1046
+ f"v1/calls/{encode_path_param(id)}/answer",
1047
+ method="POST",
1048
+ json={
1049
+ "call_recording": call_recording,
1050
+ "call_transcription": call_transcription,
1051
+ "stream_url": stream_url,
1052
+ "stream_type": stream_type,
1053
+ "stream_channel": stream_channel,
1054
+ },
1055
+ headers={
1056
+ "content-type": "application/json",
1057
+ },
1058
+ request_options=request_options,
1059
+ omit=OMIT,
1060
+ )
1061
+ try:
1062
+ if 200 <= _response.status_code < 300:
1063
+ _data = typing.cast(
1064
+ SuccessResponse,
1065
+ parse_obj_as(
1066
+ type_=SuccessResponse, # type: ignore
1067
+ object_=_response.json(),
1068
+ ),
1069
+ )
1070
+ return AsyncHttpResponse(response=_response, data=_data)
1071
+ if _response.status_code == 400:
1072
+ raise BadRequestError(
1073
+ headers=dict(_response.headers),
1074
+ body=typing.cast(
1075
+ typing.Any,
1076
+ parse_obj_as(
1077
+ type_=typing.Any, # type: ignore
1078
+ object_=_response.json(),
1079
+ ),
1080
+ ),
1081
+ )
1082
+ if _response.status_code == 401:
1083
+ raise UnauthorizedError(
1084
+ headers=dict(_response.headers),
1085
+ body=typing.cast(
1086
+ UnauthorizedErrorResponse,
1087
+ parse_obj_as(
1088
+ type_=UnauthorizedErrorResponse, # type: ignore
1089
+ object_=_response.json(),
1090
+ ),
1091
+ ),
1092
+ )
1093
+ if _response.status_code == 404:
1094
+ raise NotFoundError(
1095
+ headers=dict(_response.headers),
1096
+ body=typing.cast(
1097
+ typing.Any,
1098
+ parse_obj_as(
1099
+ type_=typing.Any, # type: ignore
1100
+ object_=_response.json(),
1101
+ ),
1102
+ ),
1103
+ )
1104
+ _response_json = _response.json()
1105
+ except JSONDecodeError:
1106
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1107
+ except ValidationError as e:
1108
+ raise ParsingError(
1109
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1110
+ )
1111
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1112
+
1113
+ async def collect(
1114
+ self,
1115
+ id: str,
1116
+ *,
1117
+ max_digits: typing.Optional[int] = OMIT,
1118
+ timeout: typing.Optional[int] = OMIT,
1119
+ termination_character: typing.Optional[str] = OMIT,
1120
+ max_attempts: typing.Optional[int] = OMIT,
1121
+ prompt: typing.Optional[CallDtmfCollectRequestPrompt] = OMIT,
1122
+ request_options: typing.Optional[RequestOptions] = None,
1123
+ ) -> AsyncHttpResponse[SuccessResponse]:
1124
+ """
1125
+ Collects DTMF keypad input from the caller on the active call identified by `id`.
1126
+
1127
+ Parameters
1128
+ ----------
1129
+ id : str
1130
+ The `uuid` of the call.
1131
+
1132
+ max_digits : typing.Optional[int]
1133
+ Maximum number of digits to collect.
1134
+
1135
+ timeout : typing.Optional[int]
1136
+ Timeout for digit collection in seconds.
1137
+
1138
+ termination_character : typing.Optional[str]
1139
+ DTMF character that ends input collection.
1140
+
1141
+ max_attempts : typing.Optional[int]
1142
+ Maximum number of attempts.
1143
+
1144
+ prompt : typing.Optional[CallDtmfCollectRequestPrompt]
1145
+ Prompt to play before collecting digits.
1146
+ Play a prerecorded audio file or use Wavix Text-To-Speech.
1147
+
1148
+ request_options : typing.Optional[RequestOptions]
1149
+ Request-specific configuration.
1150
+
1151
+ Returns
1152
+ -------
1153
+ AsyncHttpResponse[SuccessResponse]
1154
+ Returns a success confirmation. DTMF collection starts.
1155
+ """
1156
+ _response = await self._client_wrapper.httpx_client.request(
1157
+ f"v1/calls/{encode_path_param(id)}/collect",
1158
+ method="POST",
1159
+ json={
1160
+ "max_digits": max_digits,
1161
+ "timeout": timeout,
1162
+ "termination_character": termination_character,
1163
+ "max_attempts": max_attempts,
1164
+ "prompt": convert_and_respect_annotation_metadata(
1165
+ object_=prompt, annotation=CallDtmfCollectRequestPrompt, direction="write"
1166
+ ),
1167
+ },
1168
+ headers={
1169
+ "content-type": "application/json",
1170
+ },
1171
+ request_options=request_options,
1172
+ omit=OMIT,
1173
+ )
1174
+ try:
1175
+ if 200 <= _response.status_code < 300:
1176
+ _data = typing.cast(
1177
+ SuccessResponse,
1178
+ parse_obj_as(
1179
+ type_=SuccessResponse, # type: ignore
1180
+ object_=_response.json(),
1181
+ ),
1182
+ )
1183
+ return AsyncHttpResponse(response=_response, data=_data)
1184
+ if _response.status_code == 400:
1185
+ raise BadRequestError(
1186
+ headers=dict(_response.headers),
1187
+ body=typing.cast(
1188
+ typing.Any,
1189
+ parse_obj_as(
1190
+ type_=typing.Any, # type: ignore
1191
+ object_=_response.json(),
1192
+ ),
1193
+ ),
1194
+ )
1195
+ if _response.status_code == 401:
1196
+ raise UnauthorizedError(
1197
+ headers=dict(_response.headers),
1198
+ body=typing.cast(
1199
+ UnauthorizedErrorResponse,
1200
+ parse_obj_as(
1201
+ type_=UnauthorizedErrorResponse, # type: ignore
1202
+ object_=_response.json(),
1203
+ ),
1204
+ ),
1205
+ )
1206
+ if _response.status_code == 404:
1207
+ raise NotFoundError(
1208
+ headers=dict(_response.headers),
1209
+ body=typing.cast(
1210
+ typing.Any,
1211
+ parse_obj_as(
1212
+ type_=typing.Any, # type: ignore
1213
+ object_=_response.json(),
1214
+ ),
1215
+ ),
1216
+ )
1217
+ _response_json = _response.json()
1218
+ except JSONDecodeError:
1219
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1220
+ except ValidationError as e:
1221
+ raise ParsingError(
1222
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1223
+ )
1224
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)