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,1000 @@
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.unprocessable_entity_error import UnprocessableEntityError
18
+ from ..types.number import Number
19
+ from ..types.number_destination import NumberDestination
20
+ from ..types.number_list_response import NumberListResponse
21
+ from .types.bulk_update_numbers_response import BulkUpdateNumbersResponse
22
+ from .types.delete_numbers_response import DeleteNumbersResponse
23
+ from pydantic import ValidationError
24
+
25
+ # this is used as the default value for optional parameters
26
+ OMIT = typing.cast(typing.Any, ...)
27
+
28
+
29
+ class RawNumbersClient:
30
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
31
+ self._client_wrapper = client_wrapper
32
+
33
+ def list(
34
+ self,
35
+ *,
36
+ city_id: typing.Optional[int] = None,
37
+ search: typing.Optional[str] = None,
38
+ label: typing.Optional[str] = None,
39
+ label_present: typing.Optional[bool] = None,
40
+ page: typing.Optional[int] = None,
41
+ per_page: typing.Optional[int] = None,
42
+ request_options: typing.Optional[RequestOptions] = None,
43
+ ) -> HttpResponse[NumberListResponse]:
44
+ """
45
+ Returns a paginated list of the phone numbers owned by the authenticated account.
46
+
47
+ Parameters
48
+ ----------
49
+ city_id : typing.Optional[int]
50
+ Filters numbers by the ID of their city or rate center.
51
+
52
+ search : typing.Optional[str]
53
+ Filters numbers by a full or partial phone number.
54
+
55
+ label : typing.Optional[str]
56
+ Filters numbers by `label`.
57
+
58
+ label_present : typing.Optional[bool]
59
+ When `true`, returns only numbers that have a label; when `false`, only numbers without one.
60
+
61
+ page : typing.Optional[int]
62
+ Page number to retrieve. Default `1`.
63
+
64
+ per_page : typing.Optional[int]
65
+ Number of records to return per page. Default `25`.
66
+
67
+ request_options : typing.Optional[RequestOptions]
68
+ Request-specific configuration.
69
+
70
+ Returns
71
+ -------
72
+ HttpResponse[NumberListResponse]
73
+ Returns a paginated list of phone numbers.
74
+ """
75
+ _response = self._client_wrapper.httpx_client.request(
76
+ "v1/numbers",
77
+ method="GET",
78
+ params={
79
+ "city_id": city_id,
80
+ "search": search,
81
+ "label": label,
82
+ "label_present": label_present,
83
+ "page": page,
84
+ "per_page": per_page,
85
+ },
86
+ request_options=request_options,
87
+ )
88
+ try:
89
+ if 200 <= _response.status_code < 300:
90
+ _data = typing.cast(
91
+ NumberListResponse,
92
+ parse_obj_as(
93
+ type_=NumberListResponse, # type: ignore
94
+ object_=_response.json(),
95
+ ),
96
+ )
97
+ return HttpResponse(response=_response, data=_data)
98
+ if _response.status_code == 403:
99
+ raise ForbiddenError(
100
+ headers=dict(_response.headers),
101
+ body=typing.cast(
102
+ typing.Any,
103
+ parse_obj_as(
104
+ type_=typing.Any, # type: ignore
105
+ object_=_response.json(),
106
+ ),
107
+ ),
108
+ )
109
+ _response_json = _response.json()
110
+ except JSONDecodeError:
111
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
112
+ except ValidationError as e:
113
+ raise ParsingError(
114
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
115
+ )
116
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
117
+
118
+ def delete(
119
+ self,
120
+ *,
121
+ ids: typing.Optional[typing.Union[int, typing.Sequence[int]]] = None,
122
+ dids: typing.Optional[str] = None,
123
+ request_options: typing.Optional[RequestOptions] = None,
124
+ ) -> HttpResponse[DeleteNumbersResponse]:
125
+ """
126
+ Releases the listed phone numbers back to stock. Selection accepts either `ids` (record IDs) or `dids` (phone numbers), but not both.
127
+
128
+ Parameters
129
+ ----------
130
+ ids : typing.Optional[typing.Union[int, typing.Sequence[int]]]
131
+ Record IDs of the phone numbers to release. Mutually exclusive with `dids`.
132
+
133
+ dids : typing.Optional[str]
134
+ Comma-separated phone numbers to release. Mutually exclusive with `ids`.
135
+
136
+ request_options : typing.Optional[RequestOptions]
137
+ Request-specific configuration.
138
+
139
+ Returns
140
+ -------
141
+ HttpResponse[DeleteNumbersResponse]
142
+ Returns a success confirmation. The numbers are released back to stock.
143
+ """
144
+ _response = self._client_wrapper.httpx_client.request(
145
+ "v1/numbers",
146
+ method="DELETE",
147
+ params={
148
+ "ids": ids,
149
+ "dids": dids,
150
+ },
151
+ request_options=request_options,
152
+ )
153
+ try:
154
+ if 200 <= _response.status_code < 300:
155
+ _data = typing.cast(
156
+ DeleteNumbersResponse,
157
+ parse_obj_as(
158
+ type_=DeleteNumbersResponse, # type: ignore
159
+ object_=_response.json(),
160
+ ),
161
+ )
162
+ return HttpResponse(response=_response, data=_data)
163
+ if _response.status_code == 403:
164
+ raise ForbiddenError(
165
+ headers=dict(_response.headers),
166
+ body=typing.cast(
167
+ typing.Any,
168
+ parse_obj_as(
169
+ type_=typing.Any, # type: ignore
170
+ object_=_response.json(),
171
+ ),
172
+ ),
173
+ )
174
+ if _response.status_code == 404:
175
+ raise NotFoundError(
176
+ headers=dict(_response.headers),
177
+ body=typing.cast(
178
+ typing.Any,
179
+ parse_obj_as(
180
+ type_=typing.Any, # type: ignore
181
+ object_=_response.json(),
182
+ ),
183
+ ),
184
+ )
185
+ if _response.status_code == 422:
186
+ raise UnprocessableEntityError(
187
+ headers=dict(_response.headers),
188
+ body=typing.cast(
189
+ typing.Any,
190
+ parse_obj_as(
191
+ type_=typing.Any, # type: ignore
192
+ object_=_response.json(),
193
+ ),
194
+ ),
195
+ )
196
+ _response_json = _response.json()
197
+ except JSONDecodeError:
198
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
199
+ except ValidationError as e:
200
+ raise ParsingError(
201
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
202
+ )
203
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
204
+
205
+ def bulk_update(
206
+ self,
207
+ *,
208
+ ids: typing.Sequence[int],
209
+ sms_enabled: typing.Optional[bool] = OMIT,
210
+ destinations: typing.Optional[typing.Sequence[NumberDestination]] = OMIT,
211
+ sms_relay_url: typing.Optional[str] = OMIT,
212
+ call_recording_enabled: typing.Optional[bool] = OMIT,
213
+ transcription_enabled: typing.Optional[bool] = OMIT,
214
+ transcription_threshold: typing.Optional[int] = OMIT,
215
+ call_status_url: typing.Optional[str] = OMIT,
216
+ request_options: typing.Optional[RequestOptions] = None,
217
+ ) -> HttpResponse[BulkUpdateNumbersResponse]:
218
+ """
219
+ Applies the same changes to every listed phone number. Only the provided fields are changed. Destination and SMS callback changes are applied asynchronously and may not be reflected in the response immediately.
220
+
221
+ Parameters
222
+ ----------
223
+ ids : typing.Sequence[int]
224
+ Numbers (by ID) to apply the patch to. The same patch is
225
+ applied to every listed number.
226
+
227
+ sms_enabled : typing.Optional[bool]
228
+ Indicates whether SMS is enabled for the phone numbers.
229
+
230
+ destinations : typing.Optional[typing.Sequence[NumberDestination]]
231
+ Inbound call routing destinations for the phone numbers.
232
+
233
+ sms_relay_url : typing.Optional[str]
234
+ Callback URL for inbound messages.
235
+
236
+ call_recording_enabled : typing.Optional[bool]
237
+ Indicates whether call recording is enabled.
238
+
239
+ transcription_enabled : typing.Optional[bool]
240
+ Indicates whether call transcription is enabled.
241
+
242
+ transcription_threshold : typing.Optional[int]
243
+ Minimum call duration in seconds before transcription runs.
244
+
245
+ call_status_url : typing.Optional[str]
246
+ Callback URL for call status updates.
247
+
248
+ request_options : typing.Optional[RequestOptions]
249
+ Request-specific configuration.
250
+
251
+ Returns
252
+ -------
253
+ HttpResponse[BulkUpdateNumbersResponse]
254
+ Returns the updated phone numbers.
255
+ """
256
+ _response = self._client_wrapper.httpx_client.request(
257
+ "v1/numbers",
258
+ method="PATCH",
259
+ json={
260
+ "ids": ids,
261
+ "sms_enabled": sms_enabled,
262
+ "destinations": convert_and_respect_annotation_metadata(
263
+ object_=destinations, annotation=typing.Sequence[NumberDestination], direction="write"
264
+ ),
265
+ "sms_relay_url": sms_relay_url,
266
+ "call_recording_enabled": call_recording_enabled,
267
+ "transcription_enabled": transcription_enabled,
268
+ "transcription_threshold": transcription_threshold,
269
+ "call_status_url": call_status_url,
270
+ },
271
+ headers={
272
+ "content-type": "application/json",
273
+ },
274
+ request_options=request_options,
275
+ omit=OMIT,
276
+ )
277
+ try:
278
+ if 200 <= _response.status_code < 300:
279
+ _data = typing.cast(
280
+ BulkUpdateNumbersResponse,
281
+ parse_obj_as(
282
+ type_=BulkUpdateNumbersResponse, # type: ignore
283
+ object_=_response.json(),
284
+ ),
285
+ )
286
+ return HttpResponse(response=_response, data=_data)
287
+ if _response.status_code == 400:
288
+ raise BadRequestError(
289
+ headers=dict(_response.headers),
290
+ body=typing.cast(
291
+ typing.Any,
292
+ parse_obj_as(
293
+ type_=typing.Any, # type: ignore
294
+ object_=_response.json(),
295
+ ),
296
+ ),
297
+ )
298
+ if _response.status_code == 403:
299
+ raise ForbiddenError(
300
+ headers=dict(_response.headers),
301
+ body=typing.cast(
302
+ typing.Any,
303
+ parse_obj_as(
304
+ type_=typing.Any, # type: ignore
305
+ object_=_response.json(),
306
+ ),
307
+ ),
308
+ )
309
+ if _response.status_code == 404:
310
+ raise NotFoundError(
311
+ headers=dict(_response.headers),
312
+ body=typing.cast(
313
+ typing.Any,
314
+ parse_obj_as(
315
+ type_=typing.Any, # type: ignore
316
+ object_=_response.json(),
317
+ ),
318
+ ),
319
+ )
320
+ _response_json = _response.json()
321
+ except JSONDecodeError:
322
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
323
+ except ValidationError as e:
324
+ raise ParsingError(
325
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
326
+ )
327
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
328
+
329
+ def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[Number]:
330
+ """
331
+ Returns the phone number identified by `id`, including its destinations, documents, and feature settings.
332
+
333
+ Parameters
334
+ ----------
335
+ id : int
336
+ The unique ID of the phone number.
337
+
338
+ request_options : typing.Optional[RequestOptions]
339
+ Request-specific configuration.
340
+
341
+ Returns
342
+ -------
343
+ HttpResponse[Number]
344
+ Returns the phone number.
345
+ """
346
+ _response = self._client_wrapper.httpx_client.request(
347
+ f"v1/numbers/{encode_path_param(id)}",
348
+ method="GET",
349
+ request_options=request_options,
350
+ )
351
+ try:
352
+ if 200 <= _response.status_code < 300:
353
+ _data = typing.cast(
354
+ Number,
355
+ parse_obj_as(
356
+ type_=Number, # type: ignore
357
+ object_=_response.json(),
358
+ ),
359
+ )
360
+ return HttpResponse(response=_response, data=_data)
361
+ if _response.status_code == 403:
362
+ raise ForbiddenError(
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 == 404:
373
+ raise NotFoundError(
374
+ headers=dict(_response.headers),
375
+ body=typing.cast(
376
+ typing.Any,
377
+ parse_obj_as(
378
+ type_=typing.Any, # type: ignore
379
+ object_=_response.json(),
380
+ ),
381
+ ),
382
+ )
383
+ _response_json = _response.json()
384
+ except JSONDecodeError:
385
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
386
+ except ValidationError as e:
387
+ raise ParsingError(
388
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
389
+ )
390
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
391
+
392
+ def update(
393
+ self,
394
+ id: int,
395
+ *,
396
+ sms_enabled: typing.Optional[bool] = OMIT,
397
+ destinations: typing.Optional[typing.Sequence[NumberDestination]] = OMIT,
398
+ sms_relay_url: typing.Optional[str] = OMIT,
399
+ call_recording_enabled: typing.Optional[bool] = OMIT,
400
+ transcription_enabled: typing.Optional[bool] = OMIT,
401
+ transcription_threshold: typing.Optional[int] = OMIT,
402
+ call_status_url: typing.Optional[str] = OMIT,
403
+ request_options: typing.Optional[RequestOptions] = None,
404
+ ) -> HttpResponse[Number]:
405
+ """
406
+ Updates the phone number identified by `id`. Only the provided fields are changed.
407
+
408
+ Parameters
409
+ ----------
410
+ id : int
411
+ The unique ID of the phone number.
412
+
413
+ sms_enabled : typing.Optional[bool]
414
+ Indicates whether SMS is enabled for the phone number.
415
+
416
+ destinations : typing.Optional[typing.Sequence[NumberDestination]]
417
+ Inbound call routing destinations for the phone number.
418
+
419
+ sms_relay_url : typing.Optional[str]
420
+ Callback URL for inbound messages.
421
+
422
+ call_recording_enabled : typing.Optional[bool]
423
+ Indicates whether call recording is enabled.
424
+
425
+ transcription_enabled : typing.Optional[bool]
426
+ Indicates whether call transcription is enabled.
427
+
428
+ transcription_threshold : typing.Optional[int]
429
+ Minimum call duration in seconds before transcription runs.
430
+
431
+ call_status_url : typing.Optional[str]
432
+ Callback URL for call status updates.
433
+
434
+ request_options : typing.Optional[RequestOptions]
435
+ Request-specific configuration.
436
+
437
+ Returns
438
+ -------
439
+ HttpResponse[Number]
440
+ Returns the updated phone number.
441
+ """
442
+ _response = self._client_wrapper.httpx_client.request(
443
+ f"v1/numbers/{encode_path_param(id)}",
444
+ method="PATCH",
445
+ json={
446
+ "sms_enabled": sms_enabled,
447
+ "destinations": convert_and_respect_annotation_metadata(
448
+ object_=destinations, annotation=typing.Sequence[NumberDestination], direction="write"
449
+ ),
450
+ "sms_relay_url": sms_relay_url,
451
+ "call_recording_enabled": call_recording_enabled,
452
+ "transcription_enabled": transcription_enabled,
453
+ "transcription_threshold": transcription_threshold,
454
+ "call_status_url": call_status_url,
455
+ },
456
+ headers={
457
+ "content-type": "application/json",
458
+ },
459
+ request_options=request_options,
460
+ omit=OMIT,
461
+ )
462
+ try:
463
+ if 200 <= _response.status_code < 300:
464
+ _data = typing.cast(
465
+ Number,
466
+ parse_obj_as(
467
+ type_=Number, # type: ignore
468
+ object_=_response.json(),
469
+ ),
470
+ )
471
+ return HttpResponse(response=_response, data=_data)
472
+ if _response.status_code == 400:
473
+ raise BadRequestError(
474
+ headers=dict(_response.headers),
475
+ body=typing.cast(
476
+ typing.Any,
477
+ parse_obj_as(
478
+ type_=typing.Any, # type: ignore
479
+ object_=_response.json(),
480
+ ),
481
+ ),
482
+ )
483
+ if _response.status_code == 403:
484
+ raise ForbiddenError(
485
+ headers=dict(_response.headers),
486
+ body=typing.cast(
487
+ typing.Any,
488
+ parse_obj_as(
489
+ type_=typing.Any, # type: ignore
490
+ object_=_response.json(),
491
+ ),
492
+ ),
493
+ )
494
+ if _response.status_code == 404:
495
+ raise NotFoundError(
496
+ headers=dict(_response.headers),
497
+ body=typing.cast(
498
+ typing.Any,
499
+ parse_obj_as(
500
+ type_=typing.Any, # type: ignore
501
+ object_=_response.json(),
502
+ ),
503
+ ),
504
+ )
505
+ _response_json = _response.json()
506
+ except JSONDecodeError:
507
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
508
+ except ValidationError as e:
509
+ raise ParsingError(
510
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
511
+ )
512
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
513
+
514
+
515
+ class AsyncRawNumbersClient:
516
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
517
+ self._client_wrapper = client_wrapper
518
+
519
+ async def list(
520
+ self,
521
+ *,
522
+ city_id: typing.Optional[int] = None,
523
+ search: typing.Optional[str] = None,
524
+ label: typing.Optional[str] = None,
525
+ label_present: typing.Optional[bool] = None,
526
+ page: typing.Optional[int] = None,
527
+ per_page: typing.Optional[int] = None,
528
+ request_options: typing.Optional[RequestOptions] = None,
529
+ ) -> AsyncHttpResponse[NumberListResponse]:
530
+ """
531
+ Returns a paginated list of the phone numbers owned by the authenticated account.
532
+
533
+ Parameters
534
+ ----------
535
+ city_id : typing.Optional[int]
536
+ Filters numbers by the ID of their city or rate center.
537
+
538
+ search : typing.Optional[str]
539
+ Filters numbers by a full or partial phone number.
540
+
541
+ label : typing.Optional[str]
542
+ Filters numbers by `label`.
543
+
544
+ label_present : typing.Optional[bool]
545
+ When `true`, returns only numbers that have a label; when `false`, only numbers without one.
546
+
547
+ page : typing.Optional[int]
548
+ Page number to retrieve. Default `1`.
549
+
550
+ per_page : typing.Optional[int]
551
+ Number of records to return per page. Default `25`.
552
+
553
+ request_options : typing.Optional[RequestOptions]
554
+ Request-specific configuration.
555
+
556
+ Returns
557
+ -------
558
+ AsyncHttpResponse[NumberListResponse]
559
+ Returns a paginated list of phone numbers.
560
+ """
561
+ _response = await self._client_wrapper.httpx_client.request(
562
+ "v1/numbers",
563
+ method="GET",
564
+ params={
565
+ "city_id": city_id,
566
+ "search": search,
567
+ "label": label,
568
+ "label_present": label_present,
569
+ "page": page,
570
+ "per_page": per_page,
571
+ },
572
+ request_options=request_options,
573
+ )
574
+ try:
575
+ if 200 <= _response.status_code < 300:
576
+ _data = typing.cast(
577
+ NumberListResponse,
578
+ parse_obj_as(
579
+ type_=NumberListResponse, # type: ignore
580
+ object_=_response.json(),
581
+ ),
582
+ )
583
+ return AsyncHttpResponse(response=_response, data=_data)
584
+ if _response.status_code == 403:
585
+ raise ForbiddenError(
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
+ _response_json = _response.json()
596
+ except JSONDecodeError:
597
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
598
+ except ValidationError as e:
599
+ raise ParsingError(
600
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
601
+ )
602
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
603
+
604
+ async def delete(
605
+ self,
606
+ *,
607
+ ids: typing.Optional[typing.Union[int, typing.Sequence[int]]] = None,
608
+ dids: typing.Optional[str] = None,
609
+ request_options: typing.Optional[RequestOptions] = None,
610
+ ) -> AsyncHttpResponse[DeleteNumbersResponse]:
611
+ """
612
+ Releases the listed phone numbers back to stock. Selection accepts either `ids` (record IDs) or `dids` (phone numbers), but not both.
613
+
614
+ Parameters
615
+ ----------
616
+ ids : typing.Optional[typing.Union[int, typing.Sequence[int]]]
617
+ Record IDs of the phone numbers to release. Mutually exclusive with `dids`.
618
+
619
+ dids : typing.Optional[str]
620
+ Comma-separated phone numbers to release. Mutually exclusive with `ids`.
621
+
622
+ request_options : typing.Optional[RequestOptions]
623
+ Request-specific configuration.
624
+
625
+ Returns
626
+ -------
627
+ AsyncHttpResponse[DeleteNumbersResponse]
628
+ Returns a success confirmation. The numbers are released back to stock.
629
+ """
630
+ _response = await self._client_wrapper.httpx_client.request(
631
+ "v1/numbers",
632
+ method="DELETE",
633
+ params={
634
+ "ids": ids,
635
+ "dids": dids,
636
+ },
637
+ request_options=request_options,
638
+ )
639
+ try:
640
+ if 200 <= _response.status_code < 300:
641
+ _data = typing.cast(
642
+ DeleteNumbersResponse,
643
+ parse_obj_as(
644
+ type_=DeleteNumbersResponse, # type: ignore
645
+ object_=_response.json(),
646
+ ),
647
+ )
648
+ return AsyncHttpResponse(response=_response, data=_data)
649
+ if _response.status_code == 403:
650
+ raise ForbiddenError(
651
+ headers=dict(_response.headers),
652
+ body=typing.cast(
653
+ typing.Any,
654
+ parse_obj_as(
655
+ type_=typing.Any, # type: ignore
656
+ object_=_response.json(),
657
+ ),
658
+ ),
659
+ )
660
+ if _response.status_code == 404:
661
+ raise NotFoundError(
662
+ headers=dict(_response.headers),
663
+ body=typing.cast(
664
+ typing.Any,
665
+ parse_obj_as(
666
+ type_=typing.Any, # type: ignore
667
+ object_=_response.json(),
668
+ ),
669
+ ),
670
+ )
671
+ if _response.status_code == 422:
672
+ raise UnprocessableEntityError(
673
+ headers=dict(_response.headers),
674
+ body=typing.cast(
675
+ typing.Any,
676
+ parse_obj_as(
677
+ type_=typing.Any, # type: ignore
678
+ object_=_response.json(),
679
+ ),
680
+ ),
681
+ )
682
+ _response_json = _response.json()
683
+ except JSONDecodeError:
684
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
685
+ except ValidationError as e:
686
+ raise ParsingError(
687
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
688
+ )
689
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
690
+
691
+ async def bulk_update(
692
+ self,
693
+ *,
694
+ ids: typing.Sequence[int],
695
+ sms_enabled: typing.Optional[bool] = OMIT,
696
+ destinations: typing.Optional[typing.Sequence[NumberDestination]] = OMIT,
697
+ sms_relay_url: typing.Optional[str] = OMIT,
698
+ call_recording_enabled: typing.Optional[bool] = OMIT,
699
+ transcription_enabled: typing.Optional[bool] = OMIT,
700
+ transcription_threshold: typing.Optional[int] = OMIT,
701
+ call_status_url: typing.Optional[str] = OMIT,
702
+ request_options: typing.Optional[RequestOptions] = None,
703
+ ) -> AsyncHttpResponse[BulkUpdateNumbersResponse]:
704
+ """
705
+ Applies the same changes to every listed phone number. Only the provided fields are changed. Destination and SMS callback changes are applied asynchronously and may not be reflected in the response immediately.
706
+
707
+ Parameters
708
+ ----------
709
+ ids : typing.Sequence[int]
710
+ Numbers (by ID) to apply the patch to. The same patch is
711
+ applied to every listed number.
712
+
713
+ sms_enabled : typing.Optional[bool]
714
+ Indicates whether SMS is enabled for the phone numbers.
715
+
716
+ destinations : typing.Optional[typing.Sequence[NumberDestination]]
717
+ Inbound call routing destinations for the phone numbers.
718
+
719
+ sms_relay_url : typing.Optional[str]
720
+ Callback URL for inbound messages.
721
+
722
+ call_recording_enabled : typing.Optional[bool]
723
+ Indicates whether call recording is enabled.
724
+
725
+ transcription_enabled : typing.Optional[bool]
726
+ Indicates whether call transcription is enabled.
727
+
728
+ transcription_threshold : typing.Optional[int]
729
+ Minimum call duration in seconds before transcription runs.
730
+
731
+ call_status_url : typing.Optional[str]
732
+ Callback URL for call status updates.
733
+
734
+ request_options : typing.Optional[RequestOptions]
735
+ Request-specific configuration.
736
+
737
+ Returns
738
+ -------
739
+ AsyncHttpResponse[BulkUpdateNumbersResponse]
740
+ Returns the updated phone numbers.
741
+ """
742
+ _response = await self._client_wrapper.httpx_client.request(
743
+ "v1/numbers",
744
+ method="PATCH",
745
+ json={
746
+ "ids": ids,
747
+ "sms_enabled": sms_enabled,
748
+ "destinations": convert_and_respect_annotation_metadata(
749
+ object_=destinations, annotation=typing.Sequence[NumberDestination], direction="write"
750
+ ),
751
+ "sms_relay_url": sms_relay_url,
752
+ "call_recording_enabled": call_recording_enabled,
753
+ "transcription_enabled": transcription_enabled,
754
+ "transcription_threshold": transcription_threshold,
755
+ "call_status_url": call_status_url,
756
+ },
757
+ headers={
758
+ "content-type": "application/json",
759
+ },
760
+ request_options=request_options,
761
+ omit=OMIT,
762
+ )
763
+ try:
764
+ if 200 <= _response.status_code < 300:
765
+ _data = typing.cast(
766
+ BulkUpdateNumbersResponse,
767
+ parse_obj_as(
768
+ type_=BulkUpdateNumbersResponse, # type: ignore
769
+ object_=_response.json(),
770
+ ),
771
+ )
772
+ return AsyncHttpResponse(response=_response, data=_data)
773
+ if _response.status_code == 400:
774
+ raise BadRequestError(
775
+ headers=dict(_response.headers),
776
+ body=typing.cast(
777
+ typing.Any,
778
+ parse_obj_as(
779
+ type_=typing.Any, # type: ignore
780
+ object_=_response.json(),
781
+ ),
782
+ ),
783
+ )
784
+ if _response.status_code == 403:
785
+ raise ForbiddenError(
786
+ headers=dict(_response.headers),
787
+ body=typing.cast(
788
+ typing.Any,
789
+ parse_obj_as(
790
+ type_=typing.Any, # type: ignore
791
+ object_=_response.json(),
792
+ ),
793
+ ),
794
+ )
795
+ if _response.status_code == 404:
796
+ raise NotFoundError(
797
+ headers=dict(_response.headers),
798
+ body=typing.cast(
799
+ typing.Any,
800
+ parse_obj_as(
801
+ type_=typing.Any, # type: ignore
802
+ object_=_response.json(),
803
+ ),
804
+ ),
805
+ )
806
+ _response_json = _response.json()
807
+ except JSONDecodeError:
808
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
809
+ except ValidationError as e:
810
+ raise ParsingError(
811
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
812
+ )
813
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
814
+
815
+ async def get(
816
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
817
+ ) -> AsyncHttpResponse[Number]:
818
+ """
819
+ Returns the phone number identified by `id`, including its destinations, documents, and feature settings.
820
+
821
+ Parameters
822
+ ----------
823
+ id : int
824
+ The unique ID of the phone number.
825
+
826
+ request_options : typing.Optional[RequestOptions]
827
+ Request-specific configuration.
828
+
829
+ Returns
830
+ -------
831
+ AsyncHttpResponse[Number]
832
+ Returns the phone number.
833
+ """
834
+ _response = await self._client_wrapper.httpx_client.request(
835
+ f"v1/numbers/{encode_path_param(id)}",
836
+ method="GET",
837
+ request_options=request_options,
838
+ )
839
+ try:
840
+ if 200 <= _response.status_code < 300:
841
+ _data = typing.cast(
842
+ Number,
843
+ parse_obj_as(
844
+ type_=Number, # type: ignore
845
+ object_=_response.json(),
846
+ ),
847
+ )
848
+ return AsyncHttpResponse(response=_response, data=_data)
849
+ if _response.status_code == 403:
850
+ raise ForbiddenError(
851
+ headers=dict(_response.headers),
852
+ body=typing.cast(
853
+ typing.Any,
854
+ parse_obj_as(
855
+ type_=typing.Any, # type: ignore
856
+ object_=_response.json(),
857
+ ),
858
+ ),
859
+ )
860
+ if _response.status_code == 404:
861
+ raise NotFoundError(
862
+ headers=dict(_response.headers),
863
+ body=typing.cast(
864
+ typing.Any,
865
+ parse_obj_as(
866
+ type_=typing.Any, # type: ignore
867
+ object_=_response.json(),
868
+ ),
869
+ ),
870
+ )
871
+ _response_json = _response.json()
872
+ except JSONDecodeError:
873
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
874
+ except ValidationError as e:
875
+ raise ParsingError(
876
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
877
+ )
878
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
879
+
880
+ async def update(
881
+ self,
882
+ id: int,
883
+ *,
884
+ sms_enabled: typing.Optional[bool] = OMIT,
885
+ destinations: typing.Optional[typing.Sequence[NumberDestination]] = OMIT,
886
+ sms_relay_url: typing.Optional[str] = OMIT,
887
+ call_recording_enabled: typing.Optional[bool] = OMIT,
888
+ transcription_enabled: typing.Optional[bool] = OMIT,
889
+ transcription_threshold: typing.Optional[int] = OMIT,
890
+ call_status_url: typing.Optional[str] = OMIT,
891
+ request_options: typing.Optional[RequestOptions] = None,
892
+ ) -> AsyncHttpResponse[Number]:
893
+ """
894
+ Updates the phone number identified by `id`. Only the provided fields are changed.
895
+
896
+ Parameters
897
+ ----------
898
+ id : int
899
+ The unique ID of the phone number.
900
+
901
+ sms_enabled : typing.Optional[bool]
902
+ Indicates whether SMS is enabled for the phone number.
903
+
904
+ destinations : typing.Optional[typing.Sequence[NumberDestination]]
905
+ Inbound call routing destinations for the phone number.
906
+
907
+ sms_relay_url : typing.Optional[str]
908
+ Callback URL for inbound messages.
909
+
910
+ call_recording_enabled : typing.Optional[bool]
911
+ Indicates whether call recording is enabled.
912
+
913
+ transcription_enabled : typing.Optional[bool]
914
+ Indicates whether call transcription is enabled.
915
+
916
+ transcription_threshold : typing.Optional[int]
917
+ Minimum call duration in seconds before transcription runs.
918
+
919
+ call_status_url : typing.Optional[str]
920
+ Callback URL for call status updates.
921
+
922
+ request_options : typing.Optional[RequestOptions]
923
+ Request-specific configuration.
924
+
925
+ Returns
926
+ -------
927
+ AsyncHttpResponse[Number]
928
+ Returns the updated phone number.
929
+ """
930
+ _response = await self._client_wrapper.httpx_client.request(
931
+ f"v1/numbers/{encode_path_param(id)}",
932
+ method="PATCH",
933
+ json={
934
+ "sms_enabled": sms_enabled,
935
+ "destinations": convert_and_respect_annotation_metadata(
936
+ object_=destinations, annotation=typing.Sequence[NumberDestination], direction="write"
937
+ ),
938
+ "sms_relay_url": sms_relay_url,
939
+ "call_recording_enabled": call_recording_enabled,
940
+ "transcription_enabled": transcription_enabled,
941
+ "transcription_threshold": transcription_threshold,
942
+ "call_status_url": call_status_url,
943
+ },
944
+ headers={
945
+ "content-type": "application/json",
946
+ },
947
+ request_options=request_options,
948
+ omit=OMIT,
949
+ )
950
+ try:
951
+ if 200 <= _response.status_code < 300:
952
+ _data = typing.cast(
953
+ Number,
954
+ parse_obj_as(
955
+ type_=Number, # type: ignore
956
+ object_=_response.json(),
957
+ ),
958
+ )
959
+ return AsyncHttpResponse(response=_response, data=_data)
960
+ if _response.status_code == 400:
961
+ raise BadRequestError(
962
+ headers=dict(_response.headers),
963
+ body=typing.cast(
964
+ typing.Any,
965
+ parse_obj_as(
966
+ type_=typing.Any, # type: ignore
967
+ object_=_response.json(),
968
+ ),
969
+ ),
970
+ )
971
+ if _response.status_code == 403:
972
+ raise ForbiddenError(
973
+ headers=dict(_response.headers),
974
+ body=typing.cast(
975
+ typing.Any,
976
+ parse_obj_as(
977
+ type_=typing.Any, # type: ignore
978
+ object_=_response.json(),
979
+ ),
980
+ ),
981
+ )
982
+ if _response.status_code == 404:
983
+ raise NotFoundError(
984
+ headers=dict(_response.headers),
985
+ body=typing.cast(
986
+ typing.Any,
987
+ parse_obj_as(
988
+ type_=typing.Any, # type: ignore
989
+ object_=_response.json(),
990
+ ),
991
+ ),
992
+ )
993
+ _response_json = _response.json()
994
+ except JSONDecodeError:
995
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
996
+ except ValidationError as e:
997
+ raise ParsingError(
998
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
999
+ )
1000
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)