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,1176 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+ from json.decoder import JSONDecodeError
6
+
7
+ from ..core.api_error import ApiError
8
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
9
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
10
+ from ..core.jsonable_encoder import encode_path_param
11
+ from ..core.parse_error import ParsingError
12
+ from ..core.pydantic_utilities import parse_obj_as
13
+ from ..core.request_options import RequestOptions
14
+ from ..core.serialization import convert_and_respect_annotation_metadata
15
+ from ..errors.bad_request_error import BadRequestError
16
+ from ..errors.forbidden_error import ForbiddenError
17
+ from ..errors.not_found_error import NotFoundError
18
+ from ..errors.unprocessable_entity_error import UnprocessableEntityError
19
+ from ..types.call_disposition import CallDisposition
20
+ from ..types.cdr_list_response import CdrListResponse
21
+ from ..types.cdr_response import CdrResponse
22
+ from ..types.cdr_transcription_response import CdrTranscriptionResponse
23
+ from ..types.cdr_transcription_search_response import CdrTranscriptionSearchResponse
24
+ from ..types.success_response import SuccessResponse
25
+ from ..types.transcription_filter import TranscriptionFilter
26
+ from ..types.transcription_language import TranscriptionLanguage
27
+ from .types.cdr_search_request_disposition import CdrSearchRequestDisposition
28
+ from .types.cdr_search_request_type import CdrSearchRequestType
29
+ from pydantic import ValidationError
30
+
31
+ # this is used as the default value for optional parameters
32
+ OMIT = typing.cast(typing.Any, ...)
33
+
34
+
35
+ class RawCdrsClient:
36
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
37
+ self._client_wrapper = client_wrapper
38
+
39
+ def list(
40
+ self,
41
+ *,
42
+ from_: dt.date,
43
+ to: dt.date,
44
+ type: str,
45
+ disposition: typing.Optional[CallDisposition] = None,
46
+ from_search: typing.Optional[str] = None,
47
+ to_search: typing.Optional[str] = None,
48
+ sip_trunk: typing.Optional[str] = None,
49
+ uuid_: typing.Optional[str] = None,
50
+ page: typing.Optional[int] = None,
51
+ per_page: typing.Optional[int] = None,
52
+ request_options: typing.Optional[RequestOptions] = None,
53
+ ) -> HttpResponse[CdrListResponse]:
54
+ """
55
+ Returns a paginated list of call detail records for the authenticated account, within the requested date range.
56
+
57
+ Parameters
58
+ ----------
59
+ from_ : dt.date
60
+ Start of the date range to query, in `YYYY-MM-DD` format. Inclusive.
61
+
62
+ to : dt.date
63
+ End of the date range to query, in `YYYY-MM-DD` format. Inclusive.
64
+
65
+ type : str
66
+ Filters CDRs by call direction. One of `placed` (outbound calls dialed by the account) or `received` (inbound calls answered by the account).
67
+
68
+ disposition : typing.Optional[CallDisposition]
69
+ Filters CDRs by call disposition. One of `answered` (the called party answered), `busy` (the called party was busy), `rejected` (the call was declined), `failed` (the call could not be routed), or `all` (no disposition filter).
70
+
71
+ from_search : typing.Optional[str]
72
+ Filters CDRs by originating phone number. Accepts a full or partial number.
73
+
74
+ to_search : typing.Optional[str]
75
+ Filters CDRs by destination phone number. Accepts a full or partial number.
76
+
77
+ sip_trunk : typing.Optional[str]
78
+ Filters outbound CDRs by SIP trunk login. Ignored for inbound calls.
79
+
80
+ uuid_ : typing.Optional[str]
81
+ Filters CDRs by the unique call ID.
82
+
83
+ page : typing.Optional[int]
84
+ Page number to retrieve. Default `1`.
85
+
86
+ per_page : typing.Optional[int]
87
+ Number of records to return per page. Default `25`.
88
+
89
+ request_options : typing.Optional[RequestOptions]
90
+ Request-specific configuration.
91
+
92
+ Returns
93
+ -------
94
+ HttpResponse[CdrListResponse]
95
+ Returns a paginated list of CDRs.
96
+ """
97
+ _response = self._client_wrapper.httpx_client.request(
98
+ "v1/cdrs",
99
+ method="GET",
100
+ params={
101
+ "from": str(from_),
102
+ "to": str(to),
103
+ "type": type,
104
+ "disposition": disposition,
105
+ "from_search": from_search,
106
+ "to_search": to_search,
107
+ "sip_trunk": sip_trunk,
108
+ "uuid": uuid_,
109
+ "page": page,
110
+ "per_page": per_page,
111
+ },
112
+ request_options=request_options,
113
+ )
114
+ try:
115
+ if 200 <= _response.status_code < 300:
116
+ _data = typing.cast(
117
+ CdrListResponse,
118
+ parse_obj_as(
119
+ type_=CdrListResponse, # type: ignore
120
+ object_=_response.json(),
121
+ ),
122
+ )
123
+ return HttpResponse(response=_response, data=_data)
124
+ if _response.status_code == 400:
125
+ raise BadRequestError(
126
+ headers=dict(_response.headers),
127
+ body=typing.cast(
128
+ typing.Any,
129
+ parse_obj_as(
130
+ type_=typing.Any, # type: ignore
131
+ object_=_response.json(),
132
+ ),
133
+ ),
134
+ )
135
+ _response_json = _response.json()
136
+ except JSONDecodeError:
137
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
138
+ except ValidationError as e:
139
+ raise ParsingError(
140
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
141
+ )
142
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
143
+
144
+ def search(
145
+ self,
146
+ *,
147
+ type: CdrSearchRequestType,
148
+ from_: dt.date,
149
+ to: dt.date,
150
+ page: int,
151
+ per_page: int,
152
+ from_search: typing.Optional[str] = OMIT,
153
+ to_search: typing.Optional[str] = OMIT,
154
+ sip_trunk: typing.Optional[str] = OMIT,
155
+ min_duration: typing.Optional[int] = OMIT,
156
+ transcription: typing.Optional[TranscriptionFilter] = OMIT,
157
+ uuid_: typing.Optional[str] = OMIT,
158
+ disposition: typing.Optional[CdrSearchRequestDisposition] = OMIT,
159
+ request_options: typing.Optional[RequestOptions] = None,
160
+ ) -> HttpResponse[CdrTranscriptionSearchResponse]:
161
+ """
162
+ Searches call transcriptions for the given keywords or phrases and returns the matching CDRs with their transcriptions.
163
+
164
+ Parameters
165
+ ----------
166
+ type : CdrSearchRequestType
167
+ Filters by call type. One of `placed` (outbound calls dialed by the account) or `received` (inbound calls answered by the account).
168
+
169
+ from_ : dt.date
170
+ Start date for call search in `YYYY-MM-DD` format.
171
+
172
+ to : dt.date
173
+ End date for call search in `YYYY-MM-DD` format.
174
+
175
+ page : int
176
+ Page number to retrieve.
177
+
178
+ per_page : int
179
+ Number of records per page.
180
+
181
+ from_search : typing.Optional[str]
182
+ Originating phone number to filter results. Accepts full or partial number.
183
+
184
+ to_search : typing.Optional[str]
185
+ Destination phone number to filter results. Accepts full or partial number.
186
+
187
+ sip_trunk : typing.Optional[str]
188
+ SIP trunk login to filter outbound calls. Ignored for inbound calls.
189
+
190
+ min_duration : typing.Optional[int]
191
+ Minimum call duration in seconds.
192
+
193
+ transcription : typing.Optional[TranscriptionFilter]
194
+
195
+ uuid_ : typing.Optional[str]
196
+ Call ID.
197
+
198
+ disposition : typing.Optional[CdrSearchRequestDisposition]
199
+ Call disposition to filter results. If omitted, returns only answered
200
+ calls. Allowed values: `answered`, `busy`, `rejected`,
201
+ `failed`, `all`. Use `all` to return calls
202
+ regardless of their disposition.
203
+
204
+ request_options : typing.Optional[RequestOptions]
205
+ Request-specific configuration.
206
+
207
+ Returns
208
+ -------
209
+ HttpResponse[CdrTranscriptionSearchResponse]
210
+ Returns a paginated list of matching CDRs with their transcriptions.
211
+ """
212
+ _response = self._client_wrapper.httpx_client.request(
213
+ "v1/cdrs",
214
+ method="POST",
215
+ json={
216
+ "type": type,
217
+ "from": from_,
218
+ "to": to,
219
+ "from_search": from_search,
220
+ "to_search": to_search,
221
+ "sip_trunk": sip_trunk,
222
+ "min_duration": min_duration,
223
+ "transcription": convert_and_respect_annotation_metadata(
224
+ object_=transcription, annotation=TranscriptionFilter, direction="write"
225
+ ),
226
+ "uuid": uuid_,
227
+ "disposition": disposition,
228
+ "page": page,
229
+ "per_page": per_page,
230
+ },
231
+ headers={
232
+ "content-type": "application/json",
233
+ },
234
+ request_options=request_options,
235
+ omit=OMIT,
236
+ )
237
+ try:
238
+ if 200 <= _response.status_code < 300:
239
+ _data = typing.cast(
240
+ CdrTranscriptionSearchResponse,
241
+ parse_obj_as(
242
+ type_=CdrTranscriptionSearchResponse, # type: ignore
243
+ object_=_response.json(),
244
+ ),
245
+ )
246
+ return HttpResponse(response=_response, data=_data)
247
+ if _response.status_code == 403:
248
+ raise ForbiddenError(
249
+ headers=dict(_response.headers),
250
+ body=typing.cast(
251
+ typing.Any,
252
+ parse_obj_as(
253
+ type_=typing.Any, # type: ignore
254
+ object_=_response.json(),
255
+ ),
256
+ ),
257
+ )
258
+ if _response.status_code == 422:
259
+ raise UnprocessableEntityError(
260
+ headers=dict(_response.headers),
261
+ body=typing.cast(
262
+ typing.Any,
263
+ parse_obj_as(
264
+ type_=typing.Any, # type: ignore
265
+ object_=_response.json(),
266
+ ),
267
+ ),
268
+ )
269
+ _response_json = _response.json()
270
+ except JSONDecodeError:
271
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
272
+ except ValidationError as e:
273
+ raise ParsingError(
274
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
275
+ )
276
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
277
+
278
+ def retranscribe(
279
+ self,
280
+ call_id: str,
281
+ *,
282
+ language: typing.Optional[TranscriptionLanguage] = OMIT,
283
+ webhook_url: typing.Optional[str] = OMIT,
284
+ request_options: typing.Optional[RequestOptions] = None,
285
+ ) -> HttpResponse[SuccessResponse]:
286
+ """
287
+ Transcribes the recording of the call identified by `call_id`. Transcription is asynchronous; poll the transcription endpoint for the result.
288
+
289
+ Parameters
290
+ ----------
291
+ call_id : str
292
+ The unique ID of the call.
293
+
294
+ language : typing.Optional[TranscriptionLanguage]
295
+
296
+ webhook_url : typing.Optional[str]
297
+ Webhook URL to receive status updates.
298
+
299
+ request_options : typing.Optional[RequestOptions]
300
+ Request-specific configuration.
301
+
302
+ Returns
303
+ -------
304
+ HttpResponse[SuccessResponse]
305
+ Returns a success confirmation. Transcription is queued.
306
+ """
307
+ _response = self._client_wrapper.httpx_client.request(
308
+ f"v1/cdrs/{encode_path_param(call_id)}/retranscribe",
309
+ method="PUT",
310
+ json={
311
+ "language": language,
312
+ "webhook_url": webhook_url,
313
+ },
314
+ headers={
315
+ "content-type": "application/json",
316
+ },
317
+ request_options=request_options,
318
+ omit=OMIT,
319
+ )
320
+ try:
321
+ if 200 <= _response.status_code < 300:
322
+ _data = typing.cast(
323
+ SuccessResponse,
324
+ parse_obj_as(
325
+ type_=SuccessResponse, # type: ignore
326
+ object_=_response.json(),
327
+ ),
328
+ )
329
+ return HttpResponse(response=_response, data=_data)
330
+ if _response.status_code == 403:
331
+ raise ForbiddenError(
332
+ headers=dict(_response.headers),
333
+ body=typing.cast(
334
+ typing.Any,
335
+ parse_obj_as(
336
+ type_=typing.Any, # type: ignore
337
+ object_=_response.json(),
338
+ ),
339
+ ),
340
+ )
341
+ if _response.status_code == 404:
342
+ raise NotFoundError(
343
+ headers=dict(_response.headers),
344
+ body=typing.cast(
345
+ typing.Any,
346
+ parse_obj_as(
347
+ type_=typing.Any, # type: ignore
348
+ object_=_response.json(),
349
+ ),
350
+ ),
351
+ )
352
+ if _response.status_code == 422:
353
+ raise UnprocessableEntityError(
354
+ headers=dict(_response.headers),
355
+ body=typing.cast(
356
+ typing.Any,
357
+ parse_obj_as(
358
+ type_=typing.Any, # type: ignore
359
+ object_=_response.json(),
360
+ ),
361
+ ),
362
+ )
363
+ _response_json = _response.json()
364
+ except JSONDecodeError:
365
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
366
+ except ValidationError as e:
367
+ raise ParsingError(
368
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
369
+ )
370
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
371
+
372
+ def transcriptions(
373
+ self, call_id: str, *, request_options: typing.Optional[RequestOptions] = None
374
+ ) -> HttpResponse[CdrTranscriptionResponse]:
375
+ """
376
+ Returns the transcription of the recorded call identified by `call_id`. Alias of the `transcription` endpoint.
377
+
378
+ Parameters
379
+ ----------
380
+ call_id : str
381
+ The unique ID of the call.
382
+
383
+ request_options : typing.Optional[RequestOptions]
384
+ Request-specific configuration.
385
+
386
+ Returns
387
+ -------
388
+ HttpResponse[CdrTranscriptionResponse]
389
+ Returns the call transcription.
390
+ """
391
+ _response = self._client_wrapper.httpx_client.request(
392
+ f"v1/cdrs/{encode_path_param(call_id)}/transcriptions",
393
+ method="GET",
394
+ request_options=request_options,
395
+ )
396
+ try:
397
+ if 200 <= _response.status_code < 300:
398
+ _data = typing.cast(
399
+ CdrTranscriptionResponse,
400
+ parse_obj_as(
401
+ type_=CdrTranscriptionResponse, # type: ignore
402
+ object_=_response.json(),
403
+ ),
404
+ )
405
+ return HttpResponse(response=_response, data=_data)
406
+ if _response.status_code == 403:
407
+ raise ForbiddenError(
408
+ headers=dict(_response.headers),
409
+ body=typing.cast(
410
+ typing.Any,
411
+ parse_obj_as(
412
+ type_=typing.Any, # type: ignore
413
+ object_=_response.json(),
414
+ ),
415
+ ),
416
+ )
417
+ if _response.status_code == 404:
418
+ raise NotFoundError(
419
+ headers=dict(_response.headers),
420
+ body=typing.cast(
421
+ typing.Any,
422
+ parse_obj_as(
423
+ type_=typing.Any, # type: ignore
424
+ object_=_response.json(),
425
+ ),
426
+ ),
427
+ )
428
+ _response_json = _response.json()
429
+ except JSONDecodeError:
430
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
431
+ except ValidationError as e:
432
+ raise ParsingError(
433
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
434
+ )
435
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
436
+
437
+ def get(
438
+ self,
439
+ call_id: str,
440
+ *,
441
+ show_transcription: typing.Optional[bool] = None,
442
+ request_options: typing.Optional[RequestOptions] = None,
443
+ ) -> HttpResponse[CdrResponse]:
444
+ """
445
+ Returns the call detail record for the call identified by `call_id`.
446
+
447
+ Parameters
448
+ ----------
449
+ call_id : str
450
+ The unique ID of the call.
451
+
452
+ show_transcription : typing.Optional[bool]
453
+ When `true`, includes the call transcription in the response.
454
+
455
+ request_options : typing.Optional[RequestOptions]
456
+ Request-specific configuration.
457
+
458
+ Returns
459
+ -------
460
+ HttpResponse[CdrResponse]
461
+ Returns the CDR.
462
+ """
463
+ _response = self._client_wrapper.httpx_client.request(
464
+ f"v1/cdrs/{encode_path_param(call_id)}",
465
+ method="GET",
466
+ params={
467
+ "show_transcription": show_transcription,
468
+ },
469
+ request_options=request_options,
470
+ )
471
+ try:
472
+ if 200 <= _response.status_code < 300:
473
+ _data = typing.cast(
474
+ CdrResponse,
475
+ parse_obj_as(
476
+ type_=CdrResponse, # type: ignore
477
+ object_=_response.json(),
478
+ ),
479
+ )
480
+ return HttpResponse(response=_response, data=_data)
481
+ if _response.status_code == 404:
482
+ raise NotFoundError(
483
+ headers=dict(_response.headers),
484
+ body=typing.cast(
485
+ typing.Any,
486
+ parse_obj_as(
487
+ type_=typing.Any, # type: ignore
488
+ object_=_response.json(),
489
+ ),
490
+ ),
491
+ )
492
+ _response_json = _response.json()
493
+ except JSONDecodeError:
494
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
495
+ except ValidationError as e:
496
+ raise ParsingError(
497
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
498
+ )
499
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
500
+
501
+ def list_all(
502
+ self,
503
+ *,
504
+ from_: dt.date,
505
+ to: dt.date,
506
+ type: str,
507
+ disposition: typing.Optional[CallDisposition] = None,
508
+ from_search: typing.Optional[str] = None,
509
+ to_search: typing.Optional[str] = None,
510
+ sip_trunk: typing.Optional[str] = None,
511
+ uuid_: typing.Optional[str] = None,
512
+ page: typing.Optional[int] = None,
513
+ per_page: typing.Optional[int] = None,
514
+ request_options: typing.Optional[RequestOptions] = None,
515
+ ) -> HttpResponse[str]:
516
+ """
517
+ Streams matching call detail records as newline-delimited JSON (NDJSON), one record per line, for bulk export.
518
+
519
+ Parameters
520
+ ----------
521
+ from_ : dt.date
522
+ Start of the date range to query, in `YYYY-MM-DD` format. Inclusive.
523
+
524
+ to : dt.date
525
+ End of the date range to query, in `YYYY-MM-DD` format. Inclusive.
526
+
527
+ type : str
528
+ Filters CDRs by call direction. One of `placed` (outbound calls dialed by the account) or `received` (inbound calls answered by the account).
529
+
530
+ disposition : typing.Optional[CallDisposition]
531
+ Filters CDRs by call disposition. One of `answered` (the called party answered), `busy` (the called party was busy), `rejected` (the call was declined), `failed` (the call could not be routed), or `all` (no disposition filter).
532
+
533
+ from_search : typing.Optional[str]
534
+ Filters CDRs by originating phone number. Accepts a full or partial number.
535
+
536
+ to_search : typing.Optional[str]
537
+ Filters CDRs by destination phone number. Accepts a full or partial number.
538
+
539
+ sip_trunk : typing.Optional[str]
540
+ Filters outbound CDRs by SIP trunk login. Ignored for inbound calls.
541
+
542
+ uuid_ : typing.Optional[str]
543
+ Filters CDRs by the unique call ID.
544
+
545
+ page : typing.Optional[int]
546
+ Page number to retrieve. Default `1`.
547
+
548
+ per_page : typing.Optional[int]
549
+ Number of records to return per page. Default `25`.
550
+
551
+ request_options : typing.Optional[RequestOptions]
552
+ Request-specific configuration.
553
+
554
+ Returns
555
+ -------
556
+ HttpResponse[str]
557
+ Returns an NDJSON stream of CDRs, one record per line.
558
+ """
559
+ _response = self._client_wrapper.httpx_client.request(
560
+ "v1/cdrs/all",
561
+ method="GET",
562
+ params={
563
+ "from": str(from_),
564
+ "to": str(to),
565
+ "type": type,
566
+ "disposition": disposition,
567
+ "from_search": from_search,
568
+ "to_search": to_search,
569
+ "sip_trunk": sip_trunk,
570
+ "uuid": uuid_,
571
+ "page": page,
572
+ "per_page": per_page,
573
+ },
574
+ request_options=request_options,
575
+ )
576
+ try:
577
+ if 200 <= _response.status_code < 300:
578
+ _data = typing.cast(
579
+ str,
580
+ parse_obj_as(
581
+ type_=str, # type: ignore
582
+ object_=_response.json(),
583
+ ),
584
+ )
585
+ return HttpResponse(response=_response, data=_data)
586
+ if _response.status_code == 403:
587
+ raise ForbiddenError(
588
+ headers=dict(_response.headers),
589
+ body=typing.cast(
590
+ typing.Any,
591
+ parse_obj_as(
592
+ type_=typing.Any, # type: ignore
593
+ object_=_response.json(),
594
+ ),
595
+ ),
596
+ )
597
+ _response_json = _response.json()
598
+ except JSONDecodeError:
599
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
600
+ except ValidationError as e:
601
+ raise ParsingError(
602
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
603
+ )
604
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
605
+
606
+
607
+ class AsyncRawCdrsClient:
608
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
609
+ self._client_wrapper = client_wrapper
610
+
611
+ async def list(
612
+ self,
613
+ *,
614
+ from_: dt.date,
615
+ to: dt.date,
616
+ type: str,
617
+ disposition: typing.Optional[CallDisposition] = None,
618
+ from_search: typing.Optional[str] = None,
619
+ to_search: typing.Optional[str] = None,
620
+ sip_trunk: typing.Optional[str] = None,
621
+ uuid_: typing.Optional[str] = None,
622
+ page: typing.Optional[int] = None,
623
+ per_page: typing.Optional[int] = None,
624
+ request_options: typing.Optional[RequestOptions] = None,
625
+ ) -> AsyncHttpResponse[CdrListResponse]:
626
+ """
627
+ Returns a paginated list of call detail records for the authenticated account, within the requested date range.
628
+
629
+ Parameters
630
+ ----------
631
+ from_ : dt.date
632
+ Start of the date range to query, in `YYYY-MM-DD` format. Inclusive.
633
+
634
+ to : dt.date
635
+ End of the date range to query, in `YYYY-MM-DD` format. Inclusive.
636
+
637
+ type : str
638
+ Filters CDRs by call direction. One of `placed` (outbound calls dialed by the account) or `received` (inbound calls answered by the account).
639
+
640
+ disposition : typing.Optional[CallDisposition]
641
+ Filters CDRs by call disposition. One of `answered` (the called party answered), `busy` (the called party was busy), `rejected` (the call was declined), `failed` (the call could not be routed), or `all` (no disposition filter).
642
+
643
+ from_search : typing.Optional[str]
644
+ Filters CDRs by originating phone number. Accepts a full or partial number.
645
+
646
+ to_search : typing.Optional[str]
647
+ Filters CDRs by destination phone number. Accepts a full or partial number.
648
+
649
+ sip_trunk : typing.Optional[str]
650
+ Filters outbound CDRs by SIP trunk login. Ignored for inbound calls.
651
+
652
+ uuid_ : typing.Optional[str]
653
+ Filters CDRs by the unique call ID.
654
+
655
+ page : typing.Optional[int]
656
+ Page number to retrieve. Default `1`.
657
+
658
+ per_page : typing.Optional[int]
659
+ Number of records to return per page. Default `25`.
660
+
661
+ request_options : typing.Optional[RequestOptions]
662
+ Request-specific configuration.
663
+
664
+ Returns
665
+ -------
666
+ AsyncHttpResponse[CdrListResponse]
667
+ Returns a paginated list of CDRs.
668
+ """
669
+ _response = await self._client_wrapper.httpx_client.request(
670
+ "v1/cdrs",
671
+ method="GET",
672
+ params={
673
+ "from": str(from_),
674
+ "to": str(to),
675
+ "type": type,
676
+ "disposition": disposition,
677
+ "from_search": from_search,
678
+ "to_search": to_search,
679
+ "sip_trunk": sip_trunk,
680
+ "uuid": uuid_,
681
+ "page": page,
682
+ "per_page": per_page,
683
+ },
684
+ request_options=request_options,
685
+ )
686
+ try:
687
+ if 200 <= _response.status_code < 300:
688
+ _data = typing.cast(
689
+ CdrListResponse,
690
+ parse_obj_as(
691
+ type_=CdrListResponse, # type: ignore
692
+ object_=_response.json(),
693
+ ),
694
+ )
695
+ return AsyncHttpResponse(response=_response, data=_data)
696
+ if _response.status_code == 400:
697
+ raise BadRequestError(
698
+ headers=dict(_response.headers),
699
+ body=typing.cast(
700
+ typing.Any,
701
+ parse_obj_as(
702
+ type_=typing.Any, # type: ignore
703
+ object_=_response.json(),
704
+ ),
705
+ ),
706
+ )
707
+ _response_json = _response.json()
708
+ except JSONDecodeError:
709
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
710
+ except ValidationError as e:
711
+ raise ParsingError(
712
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
713
+ )
714
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
715
+
716
+ async def search(
717
+ self,
718
+ *,
719
+ type: CdrSearchRequestType,
720
+ from_: dt.date,
721
+ to: dt.date,
722
+ page: int,
723
+ per_page: int,
724
+ from_search: typing.Optional[str] = OMIT,
725
+ to_search: typing.Optional[str] = OMIT,
726
+ sip_trunk: typing.Optional[str] = OMIT,
727
+ min_duration: typing.Optional[int] = OMIT,
728
+ transcription: typing.Optional[TranscriptionFilter] = OMIT,
729
+ uuid_: typing.Optional[str] = OMIT,
730
+ disposition: typing.Optional[CdrSearchRequestDisposition] = OMIT,
731
+ request_options: typing.Optional[RequestOptions] = None,
732
+ ) -> AsyncHttpResponse[CdrTranscriptionSearchResponse]:
733
+ """
734
+ Searches call transcriptions for the given keywords or phrases and returns the matching CDRs with their transcriptions.
735
+
736
+ Parameters
737
+ ----------
738
+ type : CdrSearchRequestType
739
+ Filters by call type. One of `placed` (outbound calls dialed by the account) or `received` (inbound calls answered by the account).
740
+
741
+ from_ : dt.date
742
+ Start date for call search in `YYYY-MM-DD` format.
743
+
744
+ to : dt.date
745
+ End date for call search in `YYYY-MM-DD` format.
746
+
747
+ page : int
748
+ Page number to retrieve.
749
+
750
+ per_page : int
751
+ Number of records per page.
752
+
753
+ from_search : typing.Optional[str]
754
+ Originating phone number to filter results. Accepts full or partial number.
755
+
756
+ to_search : typing.Optional[str]
757
+ Destination phone number to filter results. Accepts full or partial number.
758
+
759
+ sip_trunk : typing.Optional[str]
760
+ SIP trunk login to filter outbound calls. Ignored for inbound calls.
761
+
762
+ min_duration : typing.Optional[int]
763
+ Minimum call duration in seconds.
764
+
765
+ transcription : typing.Optional[TranscriptionFilter]
766
+
767
+ uuid_ : typing.Optional[str]
768
+ Call ID.
769
+
770
+ disposition : typing.Optional[CdrSearchRequestDisposition]
771
+ Call disposition to filter results. If omitted, returns only answered
772
+ calls. Allowed values: `answered`, `busy`, `rejected`,
773
+ `failed`, `all`. Use `all` to return calls
774
+ regardless of their disposition.
775
+
776
+ request_options : typing.Optional[RequestOptions]
777
+ Request-specific configuration.
778
+
779
+ Returns
780
+ -------
781
+ AsyncHttpResponse[CdrTranscriptionSearchResponse]
782
+ Returns a paginated list of matching CDRs with their transcriptions.
783
+ """
784
+ _response = await self._client_wrapper.httpx_client.request(
785
+ "v1/cdrs",
786
+ method="POST",
787
+ json={
788
+ "type": type,
789
+ "from": from_,
790
+ "to": to,
791
+ "from_search": from_search,
792
+ "to_search": to_search,
793
+ "sip_trunk": sip_trunk,
794
+ "min_duration": min_duration,
795
+ "transcription": convert_and_respect_annotation_metadata(
796
+ object_=transcription, annotation=TranscriptionFilter, direction="write"
797
+ ),
798
+ "uuid": uuid_,
799
+ "disposition": disposition,
800
+ "page": page,
801
+ "per_page": per_page,
802
+ },
803
+ headers={
804
+ "content-type": "application/json",
805
+ },
806
+ request_options=request_options,
807
+ omit=OMIT,
808
+ )
809
+ try:
810
+ if 200 <= _response.status_code < 300:
811
+ _data = typing.cast(
812
+ CdrTranscriptionSearchResponse,
813
+ parse_obj_as(
814
+ type_=CdrTranscriptionSearchResponse, # type: ignore
815
+ object_=_response.json(),
816
+ ),
817
+ )
818
+ return AsyncHttpResponse(response=_response, data=_data)
819
+ if _response.status_code == 403:
820
+ raise ForbiddenError(
821
+ headers=dict(_response.headers),
822
+ body=typing.cast(
823
+ typing.Any,
824
+ parse_obj_as(
825
+ type_=typing.Any, # type: ignore
826
+ object_=_response.json(),
827
+ ),
828
+ ),
829
+ )
830
+ if _response.status_code == 422:
831
+ raise UnprocessableEntityError(
832
+ headers=dict(_response.headers),
833
+ body=typing.cast(
834
+ typing.Any,
835
+ parse_obj_as(
836
+ type_=typing.Any, # type: ignore
837
+ object_=_response.json(),
838
+ ),
839
+ ),
840
+ )
841
+ _response_json = _response.json()
842
+ except JSONDecodeError:
843
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
844
+ except ValidationError as e:
845
+ raise ParsingError(
846
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
847
+ )
848
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
849
+
850
+ async def retranscribe(
851
+ self,
852
+ call_id: str,
853
+ *,
854
+ language: typing.Optional[TranscriptionLanguage] = OMIT,
855
+ webhook_url: typing.Optional[str] = OMIT,
856
+ request_options: typing.Optional[RequestOptions] = None,
857
+ ) -> AsyncHttpResponse[SuccessResponse]:
858
+ """
859
+ Transcribes the recording of the call identified by `call_id`. Transcription is asynchronous; poll the transcription endpoint for the result.
860
+
861
+ Parameters
862
+ ----------
863
+ call_id : str
864
+ The unique ID of the call.
865
+
866
+ language : typing.Optional[TranscriptionLanguage]
867
+
868
+ webhook_url : typing.Optional[str]
869
+ Webhook URL to receive status updates.
870
+
871
+ request_options : typing.Optional[RequestOptions]
872
+ Request-specific configuration.
873
+
874
+ Returns
875
+ -------
876
+ AsyncHttpResponse[SuccessResponse]
877
+ Returns a success confirmation. Transcription is queued.
878
+ """
879
+ _response = await self._client_wrapper.httpx_client.request(
880
+ f"v1/cdrs/{encode_path_param(call_id)}/retranscribe",
881
+ method="PUT",
882
+ json={
883
+ "language": language,
884
+ "webhook_url": webhook_url,
885
+ },
886
+ headers={
887
+ "content-type": "application/json",
888
+ },
889
+ request_options=request_options,
890
+ omit=OMIT,
891
+ )
892
+ try:
893
+ if 200 <= _response.status_code < 300:
894
+ _data = typing.cast(
895
+ SuccessResponse,
896
+ parse_obj_as(
897
+ type_=SuccessResponse, # type: ignore
898
+ object_=_response.json(),
899
+ ),
900
+ )
901
+ return AsyncHttpResponse(response=_response, data=_data)
902
+ if _response.status_code == 403:
903
+ raise ForbiddenError(
904
+ headers=dict(_response.headers),
905
+ body=typing.cast(
906
+ typing.Any,
907
+ parse_obj_as(
908
+ type_=typing.Any, # type: ignore
909
+ object_=_response.json(),
910
+ ),
911
+ ),
912
+ )
913
+ if _response.status_code == 404:
914
+ raise NotFoundError(
915
+ headers=dict(_response.headers),
916
+ body=typing.cast(
917
+ typing.Any,
918
+ parse_obj_as(
919
+ type_=typing.Any, # type: ignore
920
+ object_=_response.json(),
921
+ ),
922
+ ),
923
+ )
924
+ if _response.status_code == 422:
925
+ raise UnprocessableEntityError(
926
+ headers=dict(_response.headers),
927
+ body=typing.cast(
928
+ typing.Any,
929
+ parse_obj_as(
930
+ type_=typing.Any, # type: ignore
931
+ object_=_response.json(),
932
+ ),
933
+ ),
934
+ )
935
+ _response_json = _response.json()
936
+ except JSONDecodeError:
937
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
938
+ except ValidationError as e:
939
+ raise ParsingError(
940
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
941
+ )
942
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
943
+
944
+ async def transcriptions(
945
+ self, call_id: str, *, request_options: typing.Optional[RequestOptions] = None
946
+ ) -> AsyncHttpResponse[CdrTranscriptionResponse]:
947
+ """
948
+ Returns the transcription of the recorded call identified by `call_id`. Alias of the `transcription` endpoint.
949
+
950
+ Parameters
951
+ ----------
952
+ call_id : str
953
+ The unique ID of the call.
954
+
955
+ request_options : typing.Optional[RequestOptions]
956
+ Request-specific configuration.
957
+
958
+ Returns
959
+ -------
960
+ AsyncHttpResponse[CdrTranscriptionResponse]
961
+ Returns the call transcription.
962
+ """
963
+ _response = await self._client_wrapper.httpx_client.request(
964
+ f"v1/cdrs/{encode_path_param(call_id)}/transcriptions",
965
+ method="GET",
966
+ request_options=request_options,
967
+ )
968
+ try:
969
+ if 200 <= _response.status_code < 300:
970
+ _data = typing.cast(
971
+ CdrTranscriptionResponse,
972
+ parse_obj_as(
973
+ type_=CdrTranscriptionResponse, # type: ignore
974
+ object_=_response.json(),
975
+ ),
976
+ )
977
+ return AsyncHttpResponse(response=_response, data=_data)
978
+ if _response.status_code == 403:
979
+ raise ForbiddenError(
980
+ headers=dict(_response.headers),
981
+ body=typing.cast(
982
+ typing.Any,
983
+ parse_obj_as(
984
+ type_=typing.Any, # type: ignore
985
+ object_=_response.json(),
986
+ ),
987
+ ),
988
+ )
989
+ if _response.status_code == 404:
990
+ raise NotFoundError(
991
+ headers=dict(_response.headers),
992
+ body=typing.cast(
993
+ typing.Any,
994
+ parse_obj_as(
995
+ type_=typing.Any, # type: ignore
996
+ object_=_response.json(),
997
+ ),
998
+ ),
999
+ )
1000
+ _response_json = _response.json()
1001
+ except JSONDecodeError:
1002
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1003
+ except ValidationError as e:
1004
+ raise ParsingError(
1005
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1006
+ )
1007
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1008
+
1009
+ async def get(
1010
+ self,
1011
+ call_id: str,
1012
+ *,
1013
+ show_transcription: typing.Optional[bool] = None,
1014
+ request_options: typing.Optional[RequestOptions] = None,
1015
+ ) -> AsyncHttpResponse[CdrResponse]:
1016
+ """
1017
+ Returns the call detail record for the call identified by `call_id`.
1018
+
1019
+ Parameters
1020
+ ----------
1021
+ call_id : str
1022
+ The unique ID of the call.
1023
+
1024
+ show_transcription : typing.Optional[bool]
1025
+ When `true`, includes the call transcription in the response.
1026
+
1027
+ request_options : typing.Optional[RequestOptions]
1028
+ Request-specific configuration.
1029
+
1030
+ Returns
1031
+ -------
1032
+ AsyncHttpResponse[CdrResponse]
1033
+ Returns the CDR.
1034
+ """
1035
+ _response = await self._client_wrapper.httpx_client.request(
1036
+ f"v1/cdrs/{encode_path_param(call_id)}",
1037
+ method="GET",
1038
+ params={
1039
+ "show_transcription": show_transcription,
1040
+ },
1041
+ request_options=request_options,
1042
+ )
1043
+ try:
1044
+ if 200 <= _response.status_code < 300:
1045
+ _data = typing.cast(
1046
+ CdrResponse,
1047
+ parse_obj_as(
1048
+ type_=CdrResponse, # type: ignore
1049
+ object_=_response.json(),
1050
+ ),
1051
+ )
1052
+ return AsyncHttpResponse(response=_response, data=_data)
1053
+ if _response.status_code == 404:
1054
+ raise NotFoundError(
1055
+ headers=dict(_response.headers),
1056
+ body=typing.cast(
1057
+ typing.Any,
1058
+ parse_obj_as(
1059
+ type_=typing.Any, # type: ignore
1060
+ object_=_response.json(),
1061
+ ),
1062
+ ),
1063
+ )
1064
+ _response_json = _response.json()
1065
+ except JSONDecodeError:
1066
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1067
+ except ValidationError as e:
1068
+ raise ParsingError(
1069
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1070
+ )
1071
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1072
+
1073
+ async def list_all(
1074
+ self,
1075
+ *,
1076
+ from_: dt.date,
1077
+ to: dt.date,
1078
+ type: str,
1079
+ disposition: typing.Optional[CallDisposition] = None,
1080
+ from_search: typing.Optional[str] = None,
1081
+ to_search: typing.Optional[str] = None,
1082
+ sip_trunk: typing.Optional[str] = None,
1083
+ uuid_: typing.Optional[str] = None,
1084
+ page: typing.Optional[int] = None,
1085
+ per_page: typing.Optional[int] = None,
1086
+ request_options: typing.Optional[RequestOptions] = None,
1087
+ ) -> AsyncHttpResponse[str]:
1088
+ """
1089
+ Streams matching call detail records as newline-delimited JSON (NDJSON), one record per line, for bulk export.
1090
+
1091
+ Parameters
1092
+ ----------
1093
+ from_ : dt.date
1094
+ Start of the date range to query, in `YYYY-MM-DD` format. Inclusive.
1095
+
1096
+ to : dt.date
1097
+ End of the date range to query, in `YYYY-MM-DD` format. Inclusive.
1098
+
1099
+ type : str
1100
+ Filters CDRs by call direction. One of `placed` (outbound calls dialed by the account) or `received` (inbound calls answered by the account).
1101
+
1102
+ disposition : typing.Optional[CallDisposition]
1103
+ Filters CDRs by call disposition. One of `answered` (the called party answered), `busy` (the called party was busy), `rejected` (the call was declined), `failed` (the call could not be routed), or `all` (no disposition filter).
1104
+
1105
+ from_search : typing.Optional[str]
1106
+ Filters CDRs by originating phone number. Accepts a full or partial number.
1107
+
1108
+ to_search : typing.Optional[str]
1109
+ Filters CDRs by destination phone number. Accepts a full or partial number.
1110
+
1111
+ sip_trunk : typing.Optional[str]
1112
+ Filters outbound CDRs by SIP trunk login. Ignored for inbound calls.
1113
+
1114
+ uuid_ : typing.Optional[str]
1115
+ Filters CDRs by the unique call ID.
1116
+
1117
+ page : typing.Optional[int]
1118
+ Page number to retrieve. Default `1`.
1119
+
1120
+ per_page : typing.Optional[int]
1121
+ Number of records to return per page. Default `25`.
1122
+
1123
+ request_options : typing.Optional[RequestOptions]
1124
+ Request-specific configuration.
1125
+
1126
+ Returns
1127
+ -------
1128
+ AsyncHttpResponse[str]
1129
+ Returns an NDJSON stream of CDRs, one record per line.
1130
+ """
1131
+ _response = await self._client_wrapper.httpx_client.request(
1132
+ "v1/cdrs/all",
1133
+ method="GET",
1134
+ params={
1135
+ "from": str(from_),
1136
+ "to": str(to),
1137
+ "type": type,
1138
+ "disposition": disposition,
1139
+ "from_search": from_search,
1140
+ "to_search": to_search,
1141
+ "sip_trunk": sip_trunk,
1142
+ "uuid": uuid_,
1143
+ "page": page,
1144
+ "per_page": per_page,
1145
+ },
1146
+ request_options=request_options,
1147
+ )
1148
+ try:
1149
+ if 200 <= _response.status_code < 300:
1150
+ _data = typing.cast(
1151
+ str,
1152
+ parse_obj_as(
1153
+ type_=str, # type: ignore
1154
+ object_=_response.json(),
1155
+ ),
1156
+ )
1157
+ return AsyncHttpResponse(response=_response, data=_data)
1158
+ if _response.status_code == 403:
1159
+ raise ForbiddenError(
1160
+ headers=dict(_response.headers),
1161
+ body=typing.cast(
1162
+ typing.Any,
1163
+ parse_obj_as(
1164
+ type_=typing.Any, # type: ignore
1165
+ object_=_response.json(),
1166
+ ),
1167
+ ),
1168
+ )
1169
+ _response_json = _response.json()
1170
+ except JSONDecodeError:
1171
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1172
+ except ValidationError as e:
1173
+ raise ParsingError(
1174
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1175
+ )
1176
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)