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,1324 @@
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.forbidden_error import ForbiddenError
16
+ from ..errors.not_found_error import NotFoundError
17
+ from ..errors.unauthorized_error import UnauthorizedError
18
+ from ..errors.unprocessable_entity_error import UnprocessableEntityError
19
+ from ..types.sip_trunk_create_request_allowed_ips_item import SipTrunkCreateRequestAllowedIpsItem
20
+ from ..types.sip_trunk_create_request_host_request import SipTrunkCreateRequestHostRequest
21
+ from ..types.sip_trunk_list_response import SipTrunkListResponse
22
+ from ..types.sip_trunk_response import SipTrunkResponse
23
+ from ..types.success_response import SuccessResponse
24
+ from ..types.unauthorized_error_response import UnauthorizedErrorResponse
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 RawSipTrunksClient:
32
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
33
+ self._client_wrapper = client_wrapper
34
+
35
+ def list(
36
+ self,
37
+ *,
38
+ page: typing.Optional[int] = None,
39
+ per_page: typing.Optional[int] = None,
40
+ request_options: typing.Optional[RequestOptions] = None,
41
+ ) -> HttpResponse[SipTrunkListResponse]:
42
+ """
43
+ Returns a paginated list of SIP trunks for the authenticated account.
44
+
45
+ Parameters
46
+ ----------
47
+ page : typing.Optional[int]
48
+ Page number to retrieve. Default `1`.
49
+
50
+ per_page : typing.Optional[int]
51
+ Number of records to return per page. Default `25`.
52
+
53
+ request_options : typing.Optional[RequestOptions]
54
+ Request-specific configuration.
55
+
56
+ Returns
57
+ -------
58
+ HttpResponse[SipTrunkListResponse]
59
+ Returns a paginated list of SIP trunks.
60
+ """
61
+ _response = self._client_wrapper.httpx_client.request(
62
+ "v1/trunks",
63
+ method="GET",
64
+ params={
65
+ "page": page,
66
+ "per_page": per_page,
67
+ },
68
+ request_options=request_options,
69
+ )
70
+ try:
71
+ if 200 <= _response.status_code < 300:
72
+ _data = typing.cast(
73
+ SipTrunkListResponse,
74
+ parse_obj_as(
75
+ type_=SipTrunkListResponse, # type: ignore
76
+ object_=_response.json(),
77
+ ),
78
+ )
79
+ return HttpResponse(response=_response, data=_data)
80
+ if _response.status_code == 401:
81
+ raise UnauthorizedError(
82
+ headers=dict(_response.headers),
83
+ body=typing.cast(
84
+ UnauthorizedErrorResponse,
85
+ parse_obj_as(
86
+ type_=UnauthorizedErrorResponse, # type: ignore
87
+ object_=_response.json(),
88
+ ),
89
+ ),
90
+ )
91
+ if _response.status_code == 403:
92
+ raise ForbiddenError(
93
+ headers=dict(_response.headers),
94
+ body=typing.cast(
95
+ typing.Any,
96
+ parse_obj_as(
97
+ type_=typing.Any, # type: ignore
98
+ object_=_response.json(),
99
+ ),
100
+ ),
101
+ )
102
+ _response_json = _response.json()
103
+ except JSONDecodeError:
104
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
105
+ except ValidationError as e:
106
+ raise ParsingError(
107
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
108
+ )
109
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
110
+
111
+ def create(
112
+ self,
113
+ *,
114
+ label: str,
115
+ password: str,
116
+ callerid: str,
117
+ ip_restrict: bool,
118
+ didinfo_enabled: bool,
119
+ call_restrict: bool,
120
+ cost_limit: bool,
121
+ channels_restrict: bool,
122
+ rewrite_enabled: bool,
123
+ transcription_enabled: bool,
124
+ transcription_threshold: int,
125
+ host_request: typing.Optional[SipTrunkCreateRequestHostRequest] = OMIT,
126
+ multiple_numbers: typing.Optional[bool] = OMIT,
127
+ allowed_ips: typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]] = OMIT,
128
+ call_limit: typing.Optional[int] = OMIT,
129
+ max_call_cost: typing.Optional[float] = OMIT,
130
+ max_channels: typing.Optional[int] = OMIT,
131
+ rewrite_prefix: typing.Optional[str] = OMIT,
132
+ rewrite_cond: typing.Optional[str] = OMIT,
133
+ call_recording_enabled: typing.Optional[bool] = OMIT,
134
+ machine_detection_enabled: typing.Optional[bool] = OMIT,
135
+ encrypted_media: typing.Optional[bool] = OMIT,
136
+ request_options: typing.Optional[RequestOptions] = None,
137
+ ) -> HttpResponse[SipTrunkResponse]:
138
+ """
139
+ Creates a SIP trunk for routing inbound and outbound calls. Returns the trunk with its generated `access_token`.
140
+
141
+ Parameters
142
+ ----------
143
+ label : str
144
+ User-defined name of the SIP trunk
145
+
146
+ password : str
147
+ Password set for the SIP trunk. A strong password helps keep the trunk secure.
148
+
149
+ callerid : str
150
+ Caller ID associated with the SIP trunk. Must be an active or verified number on the account.
151
+
152
+ ip_restrict : bool
153
+ Indicates whether SIP trunk registration is allowed from only specific public static IP addresses. When set to `true`, the `allowed_ips` parameter must be provided.
154
+
155
+ didinfo_enabled : bool
156
+ Indicates whether inbound calls include dialed number information in the `To` header of SIP INVITE requests
157
+
158
+ call_restrict : bool
159
+ Indicates whether a maximum call duration limit is enforced for the SIP trunk
160
+
161
+ cost_limit : bool
162
+ Indicates if the max cost limit for an outbound call limit is activated for the SIP trunk.
163
+
164
+ channels_restrict : bool
165
+ Indicates whether a limit on the number of concurrent outbound calls is enforced for the SIP trunk
166
+
167
+ rewrite_enabled : bool
168
+ Indicates whether a custom dial plan is activated for the SIP trunk
169
+
170
+ transcription_enabled : bool
171
+ Indicates whether automatic call transcription is enabled for the SIP trunk.
172
+ Available for `Flex Pro` customers only.
173
+
174
+ transcription_threshold : int
175
+ Transcriptions will be generated for calls that meet or exceed the specified minimal call duration threshold, in seconds.
176
+ Available for `Flex Pro` customers only.
177
+
178
+ host_request : typing.Optional[SipTrunkCreateRequestHostRequest]
179
+ For SIP trunks with IP authentication, includes the SIP endpoint public static IP address and the status of the authentication request. Wavix authenticates all SIP traffic originating from this IP address.
180
+
181
+ multiple_numbers : typing.Optional[bool]
182
+ Indicates whether any active or verified phone number on the account can be used as the Caller ID for the SIP trunk.
183
+
184
+ allowed_ips : typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]]
185
+ A list of public static IP addresses allowed to register with the SIP trunk
186
+
187
+ call_limit : typing.Optional[int]
188
+ Maximum call duration for the SIP trunk, in seconds. Must not exceed the maximum duration set for the account. Ignored when `call_restrict` is `false`.
189
+
190
+ max_call_cost : typing.Optional[float]
191
+ Maximum cost for an outbound call, in USD
192
+
193
+ max_channels : typing.Optional[int]
194
+ Maximum number of concurrent outbound calls for the SIP trunk. Must not exceed the outbound channel capacity set for the account. Ignored when `channels_restrict` is `false`.
195
+
196
+ rewrite_prefix : typing.Optional[str]
197
+ Digits to automatically prepend to each dialed phone number
198
+
199
+ rewrite_cond : typing.Optional[str]
200
+ Number of leading digits to automatically remove from each dialed phone number
201
+
202
+ call_recording_enabled : typing.Optional[bool]
203
+ Indicates whether outbound call recording is enabled for the SIP trunk
204
+
205
+ machine_detection_enabled : typing.Optional[bool]
206
+ Indicates whether automatic voicemail detection is enabled for the SIP trunk.
207
+ Available for `Flex Pro` customers only.
208
+
209
+ encrypted_media : typing.Optional[bool]
210
+ Indicates whether SRTP media encryption is enabled for the SIP trunk.
211
+
212
+ request_options : typing.Optional[RequestOptions]
213
+ Request-specific configuration.
214
+
215
+ Returns
216
+ -------
217
+ HttpResponse[SipTrunkResponse]
218
+ Returns the created SIP trunk.
219
+ """
220
+ _response = self._client_wrapper.httpx_client.request(
221
+ "v1/trunks",
222
+ method="POST",
223
+ json={
224
+ "label": label,
225
+ "password": password,
226
+ "host_request": convert_and_respect_annotation_metadata(
227
+ object_=host_request, annotation=SipTrunkCreateRequestHostRequest, direction="write"
228
+ ),
229
+ "callerid": callerid,
230
+ "multiple_numbers": multiple_numbers,
231
+ "ip_restrict": ip_restrict,
232
+ "allowed_ips": convert_and_respect_annotation_metadata(
233
+ object_=allowed_ips,
234
+ annotation=typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]],
235
+ direction="write",
236
+ ),
237
+ "didinfo_enabled": didinfo_enabled,
238
+ "call_restrict": call_restrict,
239
+ "call_limit": call_limit,
240
+ "cost_limit": cost_limit,
241
+ "max_call_cost": max_call_cost,
242
+ "channels_restrict": channels_restrict,
243
+ "max_channels": max_channels,
244
+ "rewrite_enabled": rewrite_enabled,
245
+ "rewrite_prefix": rewrite_prefix,
246
+ "rewrite_cond": rewrite_cond,
247
+ "call_recording_enabled": call_recording_enabled,
248
+ "transcription_enabled": transcription_enabled,
249
+ "transcription_threshold": transcription_threshold,
250
+ "machine_detection_enabled": machine_detection_enabled,
251
+ "encrypted_media": encrypted_media,
252
+ },
253
+ headers={
254
+ "content-type": "application/json",
255
+ },
256
+ request_options=request_options,
257
+ omit=OMIT,
258
+ )
259
+ try:
260
+ if 200 <= _response.status_code < 300:
261
+ _data = typing.cast(
262
+ SipTrunkResponse,
263
+ parse_obj_as(
264
+ type_=SipTrunkResponse, # type: ignore
265
+ object_=_response.json(),
266
+ ),
267
+ )
268
+ return HttpResponse(response=_response, data=_data)
269
+ if _response.status_code == 400:
270
+ raise BadRequestError(
271
+ headers=dict(_response.headers),
272
+ body=typing.cast(
273
+ typing.Any,
274
+ parse_obj_as(
275
+ type_=typing.Any, # type: ignore
276
+ object_=_response.json(),
277
+ ),
278
+ ),
279
+ )
280
+ if _response.status_code == 401:
281
+ raise UnauthorizedError(
282
+ headers=dict(_response.headers),
283
+ body=typing.cast(
284
+ UnauthorizedErrorResponse,
285
+ parse_obj_as(
286
+ type_=UnauthorizedErrorResponse, # type: ignore
287
+ object_=_response.json(),
288
+ ),
289
+ ),
290
+ )
291
+ if _response.status_code == 403:
292
+ raise ForbiddenError(
293
+ headers=dict(_response.headers),
294
+ body=typing.cast(
295
+ typing.Any,
296
+ parse_obj_as(
297
+ type_=typing.Any, # type: ignore
298
+ object_=_response.json(),
299
+ ),
300
+ ),
301
+ )
302
+ if _response.status_code == 422:
303
+ raise UnprocessableEntityError(
304
+ headers=dict(_response.headers),
305
+ body=typing.cast(
306
+ typing.Any,
307
+ parse_obj_as(
308
+ type_=typing.Any, # type: ignore
309
+ object_=_response.json(),
310
+ ),
311
+ ),
312
+ )
313
+ _response_json = _response.json()
314
+ except JSONDecodeError:
315
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
316
+ except ValidationError as e:
317
+ raise ParsingError(
318
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
319
+ )
320
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
321
+
322
+ def get(
323
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
324
+ ) -> HttpResponse[SipTrunkResponse]:
325
+ """
326
+ Returns the SIP trunk identified by `id`.
327
+
328
+ Parameters
329
+ ----------
330
+ id : int
331
+ The unique ID of the SIP trunk.
332
+
333
+ request_options : typing.Optional[RequestOptions]
334
+ Request-specific configuration.
335
+
336
+ Returns
337
+ -------
338
+ HttpResponse[SipTrunkResponse]
339
+ Returns the SIP trunk.
340
+ """
341
+ _response = self._client_wrapper.httpx_client.request(
342
+ f"v1/trunks/{encode_path_param(id)}",
343
+ method="GET",
344
+ request_options=request_options,
345
+ )
346
+ try:
347
+ if 200 <= _response.status_code < 300:
348
+ _data = typing.cast(
349
+ SipTrunkResponse,
350
+ parse_obj_as(
351
+ type_=SipTrunkResponse, # type: ignore
352
+ object_=_response.json(),
353
+ ),
354
+ )
355
+ return HttpResponse(response=_response, data=_data)
356
+ if _response.status_code == 403:
357
+ raise ForbiddenError(
358
+ headers=dict(_response.headers),
359
+ body=typing.cast(
360
+ typing.Any,
361
+ parse_obj_as(
362
+ type_=typing.Any, # type: ignore
363
+ object_=_response.json(),
364
+ ),
365
+ ),
366
+ )
367
+ if _response.status_code == 404:
368
+ raise NotFoundError(
369
+ headers=dict(_response.headers),
370
+ body=typing.cast(
371
+ typing.Any,
372
+ parse_obj_as(
373
+ type_=typing.Any, # type: ignore
374
+ object_=_response.json(),
375
+ ),
376
+ ),
377
+ )
378
+ _response_json = _response.json()
379
+ except JSONDecodeError:
380
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
381
+ except ValidationError as e:
382
+ raise ParsingError(
383
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
384
+ )
385
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
386
+
387
+ def update(
388
+ self,
389
+ id: int,
390
+ *,
391
+ label: str,
392
+ password: str,
393
+ callerid: str,
394
+ ip_restrict: bool,
395
+ didinfo_enabled: bool,
396
+ call_restrict: bool,
397
+ cost_limit: bool,
398
+ channels_restrict: bool,
399
+ rewrite_enabled: bool,
400
+ transcription_enabled: bool,
401
+ transcription_threshold: int,
402
+ host_request: typing.Optional[SipTrunkCreateRequestHostRequest] = OMIT,
403
+ multiple_numbers: typing.Optional[bool] = OMIT,
404
+ allowed_ips: typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]] = OMIT,
405
+ call_limit: typing.Optional[int] = OMIT,
406
+ max_call_cost: typing.Optional[float] = OMIT,
407
+ max_channels: typing.Optional[int] = OMIT,
408
+ rewrite_prefix: typing.Optional[str] = OMIT,
409
+ rewrite_cond: typing.Optional[str] = OMIT,
410
+ call_recording_enabled: typing.Optional[bool] = OMIT,
411
+ machine_detection_enabled: typing.Optional[bool] = OMIT,
412
+ encrypted_media: typing.Optional[bool] = OMIT,
413
+ request_options: typing.Optional[RequestOptions] = None,
414
+ ) -> HttpResponse[SipTrunkResponse]:
415
+ """
416
+ Replaces the configuration of the SIP trunk identified by `id`. Omitted fields revert to their defaults.
417
+
418
+ Parameters
419
+ ----------
420
+ id : int
421
+ The unique ID of the SIP trunk.
422
+
423
+ label : str
424
+ User-defined name of the SIP trunk
425
+
426
+ password : str
427
+ Password set for the SIP trunk. A strong password helps keep the trunk secure.
428
+
429
+ callerid : str
430
+ Caller ID associated with the SIP trunk. Must be an active or verified number on the account.
431
+
432
+ ip_restrict : bool
433
+ Indicates whether SIP trunk registration is allowed from only specific public static IP addresses. When set to `true`, the `allowed_ips` parameter must be provided.
434
+
435
+ didinfo_enabled : bool
436
+ Indicates whether inbound calls include dialed number information in the `To` header of SIP INVITE requests
437
+
438
+ call_restrict : bool
439
+ Indicates whether a maximum call duration limit is enforced for the SIP trunk
440
+
441
+ cost_limit : bool
442
+ Indicates if the max cost limit for an outbound call limit is activated for the SIP trunk.
443
+
444
+ channels_restrict : bool
445
+ Indicates whether a limit on the number of concurrent outbound calls is enforced for the SIP trunk
446
+
447
+ rewrite_enabled : bool
448
+ Indicates whether a custom dial plan is activated for the SIP trunk
449
+
450
+ transcription_enabled : bool
451
+ Indicates whether automatic call transcription is enabled for the SIP trunk.
452
+ Available for `Flex Pro` customers only.
453
+
454
+ transcription_threshold : int
455
+ Transcriptions will be generated for calls that meet or exceed the specified minimal call duration threshold, in seconds.
456
+ Available for `Flex Pro` customers only.
457
+
458
+ host_request : typing.Optional[SipTrunkCreateRequestHostRequest]
459
+ For SIP trunks with IP authentication, includes the SIP endpoint public static IP address and the status of the authentication request. Wavix authenticates all SIP traffic originating from this IP address.
460
+
461
+ multiple_numbers : typing.Optional[bool]
462
+ Indicates whether any active or verified phone number on the account can be used as the Caller ID for the SIP trunk.
463
+
464
+ allowed_ips : typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]]
465
+ A list of public static IP addresses allowed to register with the SIP trunk
466
+
467
+ call_limit : typing.Optional[int]
468
+ Maximum call duration for the SIP trunk, in seconds. Must not exceed the maximum duration set for the account. Ignored when `call_restrict` is `false`.
469
+
470
+ max_call_cost : typing.Optional[float]
471
+ Maximum cost for an outbound call, in USD
472
+
473
+ max_channels : typing.Optional[int]
474
+ Maximum number of concurrent outbound calls for the SIP trunk. Must not exceed the outbound channel capacity set for the account. Ignored when `channels_restrict` is `false`.
475
+
476
+ rewrite_prefix : typing.Optional[str]
477
+ Digits to automatically prepend to each dialed phone number
478
+
479
+ rewrite_cond : typing.Optional[str]
480
+ Number of leading digits to automatically remove from each dialed phone number
481
+
482
+ call_recording_enabled : typing.Optional[bool]
483
+ Indicates whether outbound call recording is enabled for the SIP trunk
484
+
485
+ machine_detection_enabled : typing.Optional[bool]
486
+ Indicates whether automatic voicemail detection is enabled for the SIP trunk.
487
+ Available for `Flex Pro` customers only.
488
+
489
+ encrypted_media : typing.Optional[bool]
490
+ Indicates whether SRTP media encryption is enabled for the SIP trunk.
491
+
492
+ request_options : typing.Optional[RequestOptions]
493
+ Request-specific configuration.
494
+
495
+ Returns
496
+ -------
497
+ HttpResponse[SipTrunkResponse]
498
+ Returns the updated SIP trunk.
499
+ """
500
+ _response = self._client_wrapper.httpx_client.request(
501
+ f"v1/trunks/{encode_path_param(id)}",
502
+ method="PUT",
503
+ json={
504
+ "label": label,
505
+ "password": password,
506
+ "host_request": convert_and_respect_annotation_metadata(
507
+ object_=host_request, annotation=SipTrunkCreateRequestHostRequest, direction="write"
508
+ ),
509
+ "callerid": callerid,
510
+ "multiple_numbers": multiple_numbers,
511
+ "ip_restrict": ip_restrict,
512
+ "allowed_ips": convert_and_respect_annotation_metadata(
513
+ object_=allowed_ips,
514
+ annotation=typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]],
515
+ direction="write",
516
+ ),
517
+ "didinfo_enabled": didinfo_enabled,
518
+ "call_restrict": call_restrict,
519
+ "call_limit": call_limit,
520
+ "cost_limit": cost_limit,
521
+ "max_call_cost": max_call_cost,
522
+ "channels_restrict": channels_restrict,
523
+ "max_channels": max_channels,
524
+ "rewrite_enabled": rewrite_enabled,
525
+ "rewrite_prefix": rewrite_prefix,
526
+ "rewrite_cond": rewrite_cond,
527
+ "call_recording_enabled": call_recording_enabled,
528
+ "transcription_enabled": transcription_enabled,
529
+ "transcription_threshold": transcription_threshold,
530
+ "machine_detection_enabled": machine_detection_enabled,
531
+ "encrypted_media": encrypted_media,
532
+ },
533
+ headers={
534
+ "content-type": "application/json",
535
+ },
536
+ request_options=request_options,
537
+ omit=OMIT,
538
+ )
539
+ try:
540
+ if 200 <= _response.status_code < 300:
541
+ _data = typing.cast(
542
+ SipTrunkResponse,
543
+ parse_obj_as(
544
+ type_=SipTrunkResponse, # type: ignore
545
+ object_=_response.json(),
546
+ ),
547
+ )
548
+ return HttpResponse(response=_response, data=_data)
549
+ if _response.status_code == 400:
550
+ raise BadRequestError(
551
+ headers=dict(_response.headers),
552
+ body=typing.cast(
553
+ typing.Any,
554
+ parse_obj_as(
555
+ type_=typing.Any, # type: ignore
556
+ object_=_response.json(),
557
+ ),
558
+ ),
559
+ )
560
+ if _response.status_code == 401:
561
+ raise UnauthorizedError(
562
+ headers=dict(_response.headers),
563
+ body=typing.cast(
564
+ UnauthorizedErrorResponse,
565
+ parse_obj_as(
566
+ type_=UnauthorizedErrorResponse, # type: ignore
567
+ object_=_response.json(),
568
+ ),
569
+ ),
570
+ )
571
+ if _response.status_code == 403:
572
+ raise ForbiddenError(
573
+ headers=dict(_response.headers),
574
+ body=typing.cast(
575
+ typing.Any,
576
+ parse_obj_as(
577
+ type_=typing.Any, # type: ignore
578
+ object_=_response.json(),
579
+ ),
580
+ ),
581
+ )
582
+ if _response.status_code == 404:
583
+ raise NotFoundError(
584
+ headers=dict(_response.headers),
585
+ body=typing.cast(
586
+ typing.Any,
587
+ parse_obj_as(
588
+ type_=typing.Any, # type: ignore
589
+ object_=_response.json(),
590
+ ),
591
+ ),
592
+ )
593
+ _response_json = _response.json()
594
+ except JSONDecodeError:
595
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
596
+ except ValidationError as e:
597
+ raise ParsingError(
598
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
599
+ )
600
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
601
+
602
+ def delete(
603
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
604
+ ) -> HttpResponse[SuccessResponse]:
605
+ """
606
+ Deletes the SIP trunk identified by `id`. Deletion is permanent and stops call routing through the trunk.
607
+
608
+ Parameters
609
+ ----------
610
+ id : int
611
+ The unique ID of the SIP trunk.
612
+
613
+ request_options : typing.Optional[RequestOptions]
614
+ Request-specific configuration.
615
+
616
+ Returns
617
+ -------
618
+ HttpResponse[SuccessResponse]
619
+ Returns a success confirmation. The SIP trunk is deleted.
620
+ """
621
+ _response = self._client_wrapper.httpx_client.request(
622
+ f"v1/trunks/{encode_path_param(id)}",
623
+ method="DELETE",
624
+ request_options=request_options,
625
+ )
626
+ try:
627
+ if 200 <= _response.status_code < 300:
628
+ _data = typing.cast(
629
+ SuccessResponse,
630
+ parse_obj_as(
631
+ type_=SuccessResponse, # type: ignore
632
+ object_=_response.json(),
633
+ ),
634
+ )
635
+ return HttpResponse(response=_response, data=_data)
636
+ if _response.status_code == 401:
637
+ raise UnauthorizedError(
638
+ headers=dict(_response.headers),
639
+ body=typing.cast(
640
+ UnauthorizedErrorResponse,
641
+ parse_obj_as(
642
+ type_=UnauthorizedErrorResponse, # type: ignore
643
+ object_=_response.json(),
644
+ ),
645
+ ),
646
+ )
647
+ if _response.status_code == 403:
648
+ raise ForbiddenError(
649
+ headers=dict(_response.headers),
650
+ body=typing.cast(
651
+ typing.Any,
652
+ parse_obj_as(
653
+ type_=typing.Any, # type: ignore
654
+ object_=_response.json(),
655
+ ),
656
+ ),
657
+ )
658
+ if _response.status_code == 404:
659
+ raise NotFoundError(
660
+ headers=dict(_response.headers),
661
+ body=typing.cast(
662
+ typing.Any,
663
+ parse_obj_as(
664
+ type_=typing.Any, # type: ignore
665
+ object_=_response.json(),
666
+ ),
667
+ ),
668
+ )
669
+ _response_json = _response.json()
670
+ except JSONDecodeError:
671
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
672
+ except ValidationError as e:
673
+ raise ParsingError(
674
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
675
+ )
676
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
677
+
678
+
679
+ class AsyncRawSipTrunksClient:
680
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
681
+ self._client_wrapper = client_wrapper
682
+
683
+ async def list(
684
+ self,
685
+ *,
686
+ page: typing.Optional[int] = None,
687
+ per_page: typing.Optional[int] = None,
688
+ request_options: typing.Optional[RequestOptions] = None,
689
+ ) -> AsyncHttpResponse[SipTrunkListResponse]:
690
+ """
691
+ Returns a paginated list of SIP trunks for the authenticated account.
692
+
693
+ Parameters
694
+ ----------
695
+ page : typing.Optional[int]
696
+ Page number to retrieve. Default `1`.
697
+
698
+ per_page : typing.Optional[int]
699
+ Number of records to return per page. Default `25`.
700
+
701
+ request_options : typing.Optional[RequestOptions]
702
+ Request-specific configuration.
703
+
704
+ Returns
705
+ -------
706
+ AsyncHttpResponse[SipTrunkListResponse]
707
+ Returns a paginated list of SIP trunks.
708
+ """
709
+ _response = await self._client_wrapper.httpx_client.request(
710
+ "v1/trunks",
711
+ method="GET",
712
+ params={
713
+ "page": page,
714
+ "per_page": per_page,
715
+ },
716
+ request_options=request_options,
717
+ )
718
+ try:
719
+ if 200 <= _response.status_code < 300:
720
+ _data = typing.cast(
721
+ SipTrunkListResponse,
722
+ parse_obj_as(
723
+ type_=SipTrunkListResponse, # type: ignore
724
+ object_=_response.json(),
725
+ ),
726
+ )
727
+ return AsyncHttpResponse(response=_response, data=_data)
728
+ if _response.status_code == 401:
729
+ raise UnauthorizedError(
730
+ headers=dict(_response.headers),
731
+ body=typing.cast(
732
+ UnauthorizedErrorResponse,
733
+ parse_obj_as(
734
+ type_=UnauthorizedErrorResponse, # type: ignore
735
+ object_=_response.json(),
736
+ ),
737
+ ),
738
+ )
739
+ if _response.status_code == 403:
740
+ raise ForbiddenError(
741
+ headers=dict(_response.headers),
742
+ body=typing.cast(
743
+ typing.Any,
744
+ parse_obj_as(
745
+ type_=typing.Any, # type: ignore
746
+ object_=_response.json(),
747
+ ),
748
+ ),
749
+ )
750
+ _response_json = _response.json()
751
+ except JSONDecodeError:
752
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
753
+ except ValidationError as e:
754
+ raise ParsingError(
755
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
756
+ )
757
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
758
+
759
+ async def create(
760
+ self,
761
+ *,
762
+ label: str,
763
+ password: str,
764
+ callerid: str,
765
+ ip_restrict: bool,
766
+ didinfo_enabled: bool,
767
+ call_restrict: bool,
768
+ cost_limit: bool,
769
+ channels_restrict: bool,
770
+ rewrite_enabled: bool,
771
+ transcription_enabled: bool,
772
+ transcription_threshold: int,
773
+ host_request: typing.Optional[SipTrunkCreateRequestHostRequest] = OMIT,
774
+ multiple_numbers: typing.Optional[bool] = OMIT,
775
+ allowed_ips: typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]] = OMIT,
776
+ call_limit: typing.Optional[int] = OMIT,
777
+ max_call_cost: typing.Optional[float] = OMIT,
778
+ max_channels: typing.Optional[int] = OMIT,
779
+ rewrite_prefix: typing.Optional[str] = OMIT,
780
+ rewrite_cond: typing.Optional[str] = OMIT,
781
+ call_recording_enabled: typing.Optional[bool] = OMIT,
782
+ machine_detection_enabled: typing.Optional[bool] = OMIT,
783
+ encrypted_media: typing.Optional[bool] = OMIT,
784
+ request_options: typing.Optional[RequestOptions] = None,
785
+ ) -> AsyncHttpResponse[SipTrunkResponse]:
786
+ """
787
+ Creates a SIP trunk for routing inbound and outbound calls. Returns the trunk with its generated `access_token`.
788
+
789
+ Parameters
790
+ ----------
791
+ label : str
792
+ User-defined name of the SIP trunk
793
+
794
+ password : str
795
+ Password set for the SIP trunk. A strong password helps keep the trunk secure.
796
+
797
+ callerid : str
798
+ Caller ID associated with the SIP trunk. Must be an active or verified number on the account.
799
+
800
+ ip_restrict : bool
801
+ Indicates whether SIP trunk registration is allowed from only specific public static IP addresses. When set to `true`, the `allowed_ips` parameter must be provided.
802
+
803
+ didinfo_enabled : bool
804
+ Indicates whether inbound calls include dialed number information in the `To` header of SIP INVITE requests
805
+
806
+ call_restrict : bool
807
+ Indicates whether a maximum call duration limit is enforced for the SIP trunk
808
+
809
+ cost_limit : bool
810
+ Indicates if the max cost limit for an outbound call limit is activated for the SIP trunk.
811
+
812
+ channels_restrict : bool
813
+ Indicates whether a limit on the number of concurrent outbound calls is enforced for the SIP trunk
814
+
815
+ rewrite_enabled : bool
816
+ Indicates whether a custom dial plan is activated for the SIP trunk
817
+
818
+ transcription_enabled : bool
819
+ Indicates whether automatic call transcription is enabled for the SIP trunk.
820
+ Available for `Flex Pro` customers only.
821
+
822
+ transcription_threshold : int
823
+ Transcriptions will be generated for calls that meet or exceed the specified minimal call duration threshold, in seconds.
824
+ Available for `Flex Pro` customers only.
825
+
826
+ host_request : typing.Optional[SipTrunkCreateRequestHostRequest]
827
+ For SIP trunks with IP authentication, includes the SIP endpoint public static IP address and the status of the authentication request. Wavix authenticates all SIP traffic originating from this IP address.
828
+
829
+ multiple_numbers : typing.Optional[bool]
830
+ Indicates whether any active or verified phone number on the account can be used as the Caller ID for the SIP trunk.
831
+
832
+ allowed_ips : typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]]
833
+ A list of public static IP addresses allowed to register with the SIP trunk
834
+
835
+ call_limit : typing.Optional[int]
836
+ Maximum call duration for the SIP trunk, in seconds. Must not exceed the maximum duration set for the account. Ignored when `call_restrict` is `false`.
837
+
838
+ max_call_cost : typing.Optional[float]
839
+ Maximum cost for an outbound call, in USD
840
+
841
+ max_channels : typing.Optional[int]
842
+ Maximum number of concurrent outbound calls for the SIP trunk. Must not exceed the outbound channel capacity set for the account. Ignored when `channels_restrict` is `false`.
843
+
844
+ rewrite_prefix : typing.Optional[str]
845
+ Digits to automatically prepend to each dialed phone number
846
+
847
+ rewrite_cond : typing.Optional[str]
848
+ Number of leading digits to automatically remove from each dialed phone number
849
+
850
+ call_recording_enabled : typing.Optional[bool]
851
+ Indicates whether outbound call recording is enabled for the SIP trunk
852
+
853
+ machine_detection_enabled : typing.Optional[bool]
854
+ Indicates whether automatic voicemail detection is enabled for the SIP trunk.
855
+ Available for `Flex Pro` customers only.
856
+
857
+ encrypted_media : typing.Optional[bool]
858
+ Indicates whether SRTP media encryption is enabled for the SIP trunk.
859
+
860
+ request_options : typing.Optional[RequestOptions]
861
+ Request-specific configuration.
862
+
863
+ Returns
864
+ -------
865
+ AsyncHttpResponse[SipTrunkResponse]
866
+ Returns the created SIP trunk.
867
+ """
868
+ _response = await self._client_wrapper.httpx_client.request(
869
+ "v1/trunks",
870
+ method="POST",
871
+ json={
872
+ "label": label,
873
+ "password": password,
874
+ "host_request": convert_and_respect_annotation_metadata(
875
+ object_=host_request, annotation=SipTrunkCreateRequestHostRequest, direction="write"
876
+ ),
877
+ "callerid": callerid,
878
+ "multiple_numbers": multiple_numbers,
879
+ "ip_restrict": ip_restrict,
880
+ "allowed_ips": convert_and_respect_annotation_metadata(
881
+ object_=allowed_ips,
882
+ annotation=typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]],
883
+ direction="write",
884
+ ),
885
+ "didinfo_enabled": didinfo_enabled,
886
+ "call_restrict": call_restrict,
887
+ "call_limit": call_limit,
888
+ "cost_limit": cost_limit,
889
+ "max_call_cost": max_call_cost,
890
+ "channels_restrict": channels_restrict,
891
+ "max_channels": max_channels,
892
+ "rewrite_enabled": rewrite_enabled,
893
+ "rewrite_prefix": rewrite_prefix,
894
+ "rewrite_cond": rewrite_cond,
895
+ "call_recording_enabled": call_recording_enabled,
896
+ "transcription_enabled": transcription_enabled,
897
+ "transcription_threshold": transcription_threshold,
898
+ "machine_detection_enabled": machine_detection_enabled,
899
+ "encrypted_media": encrypted_media,
900
+ },
901
+ headers={
902
+ "content-type": "application/json",
903
+ },
904
+ request_options=request_options,
905
+ omit=OMIT,
906
+ )
907
+ try:
908
+ if 200 <= _response.status_code < 300:
909
+ _data = typing.cast(
910
+ SipTrunkResponse,
911
+ parse_obj_as(
912
+ type_=SipTrunkResponse, # type: ignore
913
+ object_=_response.json(),
914
+ ),
915
+ )
916
+ return AsyncHttpResponse(response=_response, data=_data)
917
+ if _response.status_code == 400:
918
+ raise BadRequestError(
919
+ headers=dict(_response.headers),
920
+ body=typing.cast(
921
+ typing.Any,
922
+ parse_obj_as(
923
+ type_=typing.Any, # type: ignore
924
+ object_=_response.json(),
925
+ ),
926
+ ),
927
+ )
928
+ if _response.status_code == 401:
929
+ raise UnauthorizedError(
930
+ headers=dict(_response.headers),
931
+ body=typing.cast(
932
+ UnauthorizedErrorResponse,
933
+ parse_obj_as(
934
+ type_=UnauthorizedErrorResponse, # type: ignore
935
+ object_=_response.json(),
936
+ ),
937
+ ),
938
+ )
939
+ if _response.status_code == 403:
940
+ raise ForbiddenError(
941
+ headers=dict(_response.headers),
942
+ body=typing.cast(
943
+ typing.Any,
944
+ parse_obj_as(
945
+ type_=typing.Any, # type: ignore
946
+ object_=_response.json(),
947
+ ),
948
+ ),
949
+ )
950
+ if _response.status_code == 422:
951
+ raise UnprocessableEntityError(
952
+ headers=dict(_response.headers),
953
+ body=typing.cast(
954
+ typing.Any,
955
+ parse_obj_as(
956
+ type_=typing.Any, # type: ignore
957
+ object_=_response.json(),
958
+ ),
959
+ ),
960
+ )
961
+ _response_json = _response.json()
962
+ except JSONDecodeError:
963
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
964
+ except ValidationError as e:
965
+ raise ParsingError(
966
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
967
+ )
968
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
969
+
970
+ async def get(
971
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
972
+ ) -> AsyncHttpResponse[SipTrunkResponse]:
973
+ """
974
+ Returns the SIP trunk identified by `id`.
975
+
976
+ Parameters
977
+ ----------
978
+ id : int
979
+ The unique ID of the SIP trunk.
980
+
981
+ request_options : typing.Optional[RequestOptions]
982
+ Request-specific configuration.
983
+
984
+ Returns
985
+ -------
986
+ AsyncHttpResponse[SipTrunkResponse]
987
+ Returns the SIP trunk.
988
+ """
989
+ _response = await self._client_wrapper.httpx_client.request(
990
+ f"v1/trunks/{encode_path_param(id)}",
991
+ method="GET",
992
+ request_options=request_options,
993
+ )
994
+ try:
995
+ if 200 <= _response.status_code < 300:
996
+ _data = typing.cast(
997
+ SipTrunkResponse,
998
+ parse_obj_as(
999
+ type_=SipTrunkResponse, # type: ignore
1000
+ object_=_response.json(),
1001
+ ),
1002
+ )
1003
+ return AsyncHttpResponse(response=_response, data=_data)
1004
+ if _response.status_code == 403:
1005
+ raise ForbiddenError(
1006
+ headers=dict(_response.headers),
1007
+ body=typing.cast(
1008
+ typing.Any,
1009
+ parse_obj_as(
1010
+ type_=typing.Any, # type: ignore
1011
+ object_=_response.json(),
1012
+ ),
1013
+ ),
1014
+ )
1015
+ if _response.status_code == 404:
1016
+ raise NotFoundError(
1017
+ headers=dict(_response.headers),
1018
+ body=typing.cast(
1019
+ typing.Any,
1020
+ parse_obj_as(
1021
+ type_=typing.Any, # type: ignore
1022
+ object_=_response.json(),
1023
+ ),
1024
+ ),
1025
+ )
1026
+ _response_json = _response.json()
1027
+ except JSONDecodeError:
1028
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1029
+ except ValidationError as e:
1030
+ raise ParsingError(
1031
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1032
+ )
1033
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1034
+
1035
+ async def update(
1036
+ self,
1037
+ id: int,
1038
+ *,
1039
+ label: str,
1040
+ password: str,
1041
+ callerid: str,
1042
+ ip_restrict: bool,
1043
+ didinfo_enabled: bool,
1044
+ call_restrict: bool,
1045
+ cost_limit: bool,
1046
+ channels_restrict: bool,
1047
+ rewrite_enabled: bool,
1048
+ transcription_enabled: bool,
1049
+ transcription_threshold: int,
1050
+ host_request: typing.Optional[SipTrunkCreateRequestHostRequest] = OMIT,
1051
+ multiple_numbers: typing.Optional[bool] = OMIT,
1052
+ allowed_ips: typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]] = OMIT,
1053
+ call_limit: typing.Optional[int] = OMIT,
1054
+ max_call_cost: typing.Optional[float] = OMIT,
1055
+ max_channels: typing.Optional[int] = OMIT,
1056
+ rewrite_prefix: typing.Optional[str] = OMIT,
1057
+ rewrite_cond: typing.Optional[str] = OMIT,
1058
+ call_recording_enabled: typing.Optional[bool] = OMIT,
1059
+ machine_detection_enabled: typing.Optional[bool] = OMIT,
1060
+ encrypted_media: typing.Optional[bool] = OMIT,
1061
+ request_options: typing.Optional[RequestOptions] = None,
1062
+ ) -> AsyncHttpResponse[SipTrunkResponse]:
1063
+ """
1064
+ Replaces the configuration of the SIP trunk identified by `id`. Omitted fields revert to their defaults.
1065
+
1066
+ Parameters
1067
+ ----------
1068
+ id : int
1069
+ The unique ID of the SIP trunk.
1070
+
1071
+ label : str
1072
+ User-defined name of the SIP trunk
1073
+
1074
+ password : str
1075
+ Password set for the SIP trunk. A strong password helps keep the trunk secure.
1076
+
1077
+ callerid : str
1078
+ Caller ID associated with the SIP trunk. Must be an active or verified number on the account.
1079
+
1080
+ ip_restrict : bool
1081
+ Indicates whether SIP trunk registration is allowed from only specific public static IP addresses. When set to `true`, the `allowed_ips` parameter must be provided.
1082
+
1083
+ didinfo_enabled : bool
1084
+ Indicates whether inbound calls include dialed number information in the `To` header of SIP INVITE requests
1085
+
1086
+ call_restrict : bool
1087
+ Indicates whether a maximum call duration limit is enforced for the SIP trunk
1088
+
1089
+ cost_limit : bool
1090
+ Indicates if the max cost limit for an outbound call limit is activated for the SIP trunk.
1091
+
1092
+ channels_restrict : bool
1093
+ Indicates whether a limit on the number of concurrent outbound calls is enforced for the SIP trunk
1094
+
1095
+ rewrite_enabled : bool
1096
+ Indicates whether a custom dial plan is activated for the SIP trunk
1097
+
1098
+ transcription_enabled : bool
1099
+ Indicates whether automatic call transcription is enabled for the SIP trunk.
1100
+ Available for `Flex Pro` customers only.
1101
+
1102
+ transcription_threshold : int
1103
+ Transcriptions will be generated for calls that meet or exceed the specified minimal call duration threshold, in seconds.
1104
+ Available for `Flex Pro` customers only.
1105
+
1106
+ host_request : typing.Optional[SipTrunkCreateRequestHostRequest]
1107
+ For SIP trunks with IP authentication, includes the SIP endpoint public static IP address and the status of the authentication request. Wavix authenticates all SIP traffic originating from this IP address.
1108
+
1109
+ multiple_numbers : typing.Optional[bool]
1110
+ Indicates whether any active or verified phone number on the account can be used as the Caller ID for the SIP trunk.
1111
+
1112
+ allowed_ips : typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]]
1113
+ A list of public static IP addresses allowed to register with the SIP trunk
1114
+
1115
+ call_limit : typing.Optional[int]
1116
+ Maximum call duration for the SIP trunk, in seconds. Must not exceed the maximum duration set for the account. Ignored when `call_restrict` is `false`.
1117
+
1118
+ max_call_cost : typing.Optional[float]
1119
+ Maximum cost for an outbound call, in USD
1120
+
1121
+ max_channels : typing.Optional[int]
1122
+ Maximum number of concurrent outbound calls for the SIP trunk. Must not exceed the outbound channel capacity set for the account. Ignored when `channels_restrict` is `false`.
1123
+
1124
+ rewrite_prefix : typing.Optional[str]
1125
+ Digits to automatically prepend to each dialed phone number
1126
+
1127
+ rewrite_cond : typing.Optional[str]
1128
+ Number of leading digits to automatically remove from each dialed phone number
1129
+
1130
+ call_recording_enabled : typing.Optional[bool]
1131
+ Indicates whether outbound call recording is enabled for the SIP trunk
1132
+
1133
+ machine_detection_enabled : typing.Optional[bool]
1134
+ Indicates whether automatic voicemail detection is enabled for the SIP trunk.
1135
+ Available for `Flex Pro` customers only.
1136
+
1137
+ encrypted_media : typing.Optional[bool]
1138
+ Indicates whether SRTP media encryption is enabled for the SIP trunk.
1139
+
1140
+ request_options : typing.Optional[RequestOptions]
1141
+ Request-specific configuration.
1142
+
1143
+ Returns
1144
+ -------
1145
+ AsyncHttpResponse[SipTrunkResponse]
1146
+ Returns the updated SIP trunk.
1147
+ """
1148
+ _response = await self._client_wrapper.httpx_client.request(
1149
+ f"v1/trunks/{encode_path_param(id)}",
1150
+ method="PUT",
1151
+ json={
1152
+ "label": label,
1153
+ "password": password,
1154
+ "host_request": convert_and_respect_annotation_metadata(
1155
+ object_=host_request, annotation=SipTrunkCreateRequestHostRequest, direction="write"
1156
+ ),
1157
+ "callerid": callerid,
1158
+ "multiple_numbers": multiple_numbers,
1159
+ "ip_restrict": ip_restrict,
1160
+ "allowed_ips": convert_and_respect_annotation_metadata(
1161
+ object_=allowed_ips,
1162
+ annotation=typing.Optional[typing.Sequence[SipTrunkCreateRequestAllowedIpsItem]],
1163
+ direction="write",
1164
+ ),
1165
+ "didinfo_enabled": didinfo_enabled,
1166
+ "call_restrict": call_restrict,
1167
+ "call_limit": call_limit,
1168
+ "cost_limit": cost_limit,
1169
+ "max_call_cost": max_call_cost,
1170
+ "channels_restrict": channels_restrict,
1171
+ "max_channels": max_channels,
1172
+ "rewrite_enabled": rewrite_enabled,
1173
+ "rewrite_prefix": rewrite_prefix,
1174
+ "rewrite_cond": rewrite_cond,
1175
+ "call_recording_enabled": call_recording_enabled,
1176
+ "transcription_enabled": transcription_enabled,
1177
+ "transcription_threshold": transcription_threshold,
1178
+ "machine_detection_enabled": machine_detection_enabled,
1179
+ "encrypted_media": encrypted_media,
1180
+ },
1181
+ headers={
1182
+ "content-type": "application/json",
1183
+ },
1184
+ request_options=request_options,
1185
+ omit=OMIT,
1186
+ )
1187
+ try:
1188
+ if 200 <= _response.status_code < 300:
1189
+ _data = typing.cast(
1190
+ SipTrunkResponse,
1191
+ parse_obj_as(
1192
+ type_=SipTrunkResponse, # type: ignore
1193
+ object_=_response.json(),
1194
+ ),
1195
+ )
1196
+ return AsyncHttpResponse(response=_response, data=_data)
1197
+ if _response.status_code == 400:
1198
+ raise BadRequestError(
1199
+ headers=dict(_response.headers),
1200
+ body=typing.cast(
1201
+ typing.Any,
1202
+ parse_obj_as(
1203
+ type_=typing.Any, # type: ignore
1204
+ object_=_response.json(),
1205
+ ),
1206
+ ),
1207
+ )
1208
+ if _response.status_code == 401:
1209
+ raise UnauthorizedError(
1210
+ headers=dict(_response.headers),
1211
+ body=typing.cast(
1212
+ UnauthorizedErrorResponse,
1213
+ parse_obj_as(
1214
+ type_=UnauthorizedErrorResponse, # type: ignore
1215
+ object_=_response.json(),
1216
+ ),
1217
+ ),
1218
+ )
1219
+ if _response.status_code == 403:
1220
+ raise ForbiddenError(
1221
+ headers=dict(_response.headers),
1222
+ body=typing.cast(
1223
+ typing.Any,
1224
+ parse_obj_as(
1225
+ type_=typing.Any, # type: ignore
1226
+ object_=_response.json(),
1227
+ ),
1228
+ ),
1229
+ )
1230
+ if _response.status_code == 404:
1231
+ raise NotFoundError(
1232
+ headers=dict(_response.headers),
1233
+ body=typing.cast(
1234
+ typing.Any,
1235
+ parse_obj_as(
1236
+ type_=typing.Any, # type: ignore
1237
+ object_=_response.json(),
1238
+ ),
1239
+ ),
1240
+ )
1241
+ _response_json = _response.json()
1242
+ except JSONDecodeError:
1243
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1244
+ except ValidationError as e:
1245
+ raise ParsingError(
1246
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1247
+ )
1248
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1249
+
1250
+ async def delete(
1251
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
1252
+ ) -> AsyncHttpResponse[SuccessResponse]:
1253
+ """
1254
+ Deletes the SIP trunk identified by `id`. Deletion is permanent and stops call routing through the trunk.
1255
+
1256
+ Parameters
1257
+ ----------
1258
+ id : int
1259
+ The unique ID of the SIP trunk.
1260
+
1261
+ request_options : typing.Optional[RequestOptions]
1262
+ Request-specific configuration.
1263
+
1264
+ Returns
1265
+ -------
1266
+ AsyncHttpResponse[SuccessResponse]
1267
+ Returns a success confirmation. The SIP trunk is deleted.
1268
+ """
1269
+ _response = await self._client_wrapper.httpx_client.request(
1270
+ f"v1/trunks/{encode_path_param(id)}",
1271
+ method="DELETE",
1272
+ request_options=request_options,
1273
+ )
1274
+ try:
1275
+ if 200 <= _response.status_code < 300:
1276
+ _data = typing.cast(
1277
+ SuccessResponse,
1278
+ parse_obj_as(
1279
+ type_=SuccessResponse, # type: ignore
1280
+ object_=_response.json(),
1281
+ ),
1282
+ )
1283
+ return AsyncHttpResponse(response=_response, data=_data)
1284
+ if _response.status_code == 401:
1285
+ raise UnauthorizedError(
1286
+ headers=dict(_response.headers),
1287
+ body=typing.cast(
1288
+ UnauthorizedErrorResponse,
1289
+ parse_obj_as(
1290
+ type_=UnauthorizedErrorResponse, # type: ignore
1291
+ object_=_response.json(),
1292
+ ),
1293
+ ),
1294
+ )
1295
+ if _response.status_code == 403:
1296
+ raise ForbiddenError(
1297
+ headers=dict(_response.headers),
1298
+ body=typing.cast(
1299
+ typing.Any,
1300
+ parse_obj_as(
1301
+ type_=typing.Any, # type: ignore
1302
+ object_=_response.json(),
1303
+ ),
1304
+ ),
1305
+ )
1306
+ if _response.status_code == 404:
1307
+ raise NotFoundError(
1308
+ headers=dict(_response.headers),
1309
+ body=typing.cast(
1310
+ typing.Any,
1311
+ parse_obj_as(
1312
+ type_=typing.Any, # type: ignore
1313
+ object_=_response.json(),
1314
+ ),
1315
+ ),
1316
+ )
1317
+ _response_json = _response.json()
1318
+ except JSONDecodeError:
1319
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1320
+ except ValidationError as e:
1321
+ raise ParsingError(
1322
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1323
+ )
1324
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)