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.
- wavix/__init__.py +801 -0
- wavix/_default_clients.py +32 -0
- wavix/api_keys/__init__.py +4 -0
- wavix/api_keys/client.py +764 -0
- wavix/api_keys/raw_client.py +1191 -0
- wavix/billing/__init__.py +41 -0
- wavix/billing/client.py +82 -0
- wavix/billing/invoices/__init__.py +34 -0
- wavix/billing/invoices/client.py +203 -0
- wavix/billing/invoices/raw_client.py +302 -0
- wavix/billing/invoices/types/__init__.py +34 -0
- wavix/billing/invoices/types/list_invoices_response.py +31 -0
- wavix/billing/raw_client.py +13 -0
- wavix/billing/transactions/__init__.py +34 -0
- wavix/billing/transactions/client.py +209 -0
- wavix/billing/transactions/raw_client.py +253 -0
- wavix/billing/transactions/types/__init__.py +34 -0
- wavix/billing/transactions/types/list_transactions_response.py +31 -0
- wavix/buy/__init__.py +61 -0
- wavix/buy/cities/__init__.py +34 -0
- wavix/buy/cities/client.py +134 -0
- wavix/buy/cities/raw_client.py +201 -0
- wavix/buy/cities/types/__init__.py +34 -0
- wavix/buy/cities/types/list_cities_response.py +23 -0
- wavix/buy/client.py +139 -0
- wavix/buy/countries/__init__.py +34 -0
- wavix/buy/countries/client.py +116 -0
- wavix/buy/countries/raw_client.py +144 -0
- wavix/buy/countries/types/__init__.py +34 -0
- wavix/buy/countries/types/list_countries_response.py +23 -0
- wavix/buy/numbers/__init__.py +34 -0
- wavix/buy/numbers/client.py +168 -0
- wavix/buy/numbers/raw_client.py +227 -0
- wavix/buy/numbers/types/__init__.py +34 -0
- wavix/buy/numbers/types/list_numbers_response.py +26 -0
- wavix/buy/raw_client.py +13 -0
- wavix/buy/region_cities/__init__.py +34 -0
- wavix/buy/region_cities/client.py +142 -0
- wavix/buy/region_cities/raw_client.py +207 -0
- wavix/buy/region_cities/types/__init__.py +34 -0
- wavix/buy/region_cities/types/list_region_cities_response.py +23 -0
- wavix/buy/regions/__init__.py +34 -0
- wavix/buy/regions/client.py +132 -0
- wavix/buy/regions/raw_client.py +222 -0
- wavix/buy/regions/types/__init__.py +34 -0
- wavix/buy/regions/types/list_regions_response.py +23 -0
- wavix/call_control/__init__.py +40 -0
- wavix/call_control/audio/__init__.py +4 -0
- wavix/call_control/audio/client.py +195 -0
- wavix/call_control/audio/raw_client.py +333 -0
- wavix/call_control/client.py +796 -0
- wavix/call_control/raw_client.py +1224 -0
- wavix/call_control/streams/__init__.py +4 -0
- wavix/call_control/streams/client.py +250 -0
- wavix/call_control/streams/raw_client.py +325 -0
- wavix/call_control/types/__init__.py +38 -0
- wavix/call_control/types/call_dtmf_collect_request_prompt.py +33 -0
- wavix/call_control/types/call_dtmf_collect_request_prompt_say.py +31 -0
- wavix/call_recording/__init__.py +4 -0
- wavix/call_recording/client.py +430 -0
- wavix/call_recording/raw_client.py +726 -0
- wavix/call_webhooks/__init__.py +37 -0
- wavix/call_webhooks/client.py +281 -0
- wavix/call_webhooks/raw_client.py +529 -0
- wavix/call_webhooks/types/__init__.py +38 -0
- wavix/call_webhooks/types/call_webhooks_create_request_event_type.py +5 -0
- wavix/call_webhooks/types/delete_call_webhooks_request_event_type.py +5 -0
- wavix/cart/__init__.py +38 -0
- wavix/cart/client.py +327 -0
- wavix/cart/raw_client.py +629 -0
- wavix/cart/types/__init__.py +40 -0
- wavix/cart/types/checkout_cart_response.py +22 -0
- wavix/cart/types/get_cart_response.py +29 -0
- wavix/cart/types/remove_cart_response.py +22 -0
- wavix/cdrs/__init__.py +39 -0
- wavix/cdrs/client.py +968 -0
- wavix/cdrs/raw_client.py +1176 -0
- wavix/cdrs/transcription/__init__.py +4 -0
- wavix/cdrs/transcription/client.py +112 -0
- wavix/cdrs/transcription/raw_client.py +156 -0
- wavix/cdrs/types/__init__.py +38 -0
- wavix/cdrs/types/cdr_search_request_disposition.py +5 -0
- wavix/cdrs/types/cdr_search_request_type.py +5 -0
- wavix/client.py +578 -0
- wavix/core/__init__.py +127 -0
- wavix/core/api_error.py +23 -0
- wavix/core/client_wrapper.py +119 -0
- wavix/core/datetime_utils.py +70 -0
- wavix/core/file.py +67 -0
- wavix/core/force_multipart.py +18 -0
- wavix/core/http_client.py +839 -0
- wavix/core/http_response.py +59 -0
- wavix/core/http_sse/__init__.py +42 -0
- wavix/core/http_sse/_api.py +170 -0
- wavix/core/http_sse/_decoders.py +61 -0
- wavix/core/http_sse/_exceptions.py +7 -0
- wavix/core/http_sse/_models.py +17 -0
- wavix/core/jsonable_encoder.py +120 -0
- wavix/core/logging.py +107 -0
- wavix/core/parse_error.py +36 -0
- wavix/core/pydantic_utilities.py +508 -0
- wavix/core/query_encoder.py +58 -0
- wavix/core/remove_none_from_dict.py +11 -0
- wavix/core/request_options.py +35 -0
- wavix/core/serialization.py +347 -0
- wavix/environment.py +7 -0
- wavix/errors/__init__.py +56 -0
- wavix/errors/bad_request_error.py +10 -0
- wavix/errors/forbidden_error.py +10 -0
- wavix/errors/not_found_error.py +10 -0
- wavix/errors/service_unavailable_error.py +11 -0
- wavix/errors/too_many_requests_error.py +11 -0
- wavix/errors/unauthorized_error.py +11 -0
- wavix/errors/unprocessable_entity_error.py +10 -0
- wavix/link_shortener/__init__.py +34 -0
- wavix/link_shortener/client.py +194 -0
- wavix/link_shortener/metrics/__init__.py +4 -0
- wavix/link_shortener/metrics/client.py +198 -0
- wavix/link_shortener/metrics/raw_client.py +218 -0
- wavix/link_shortener/raw_client.py +265 -0
- wavix/number_validator/__init__.py +35 -0
- wavix/number_validator/client.py +271 -0
- wavix/number_validator/raw_client.py +383 -0
- wavix/number_validator/results/__init__.py +4 -0
- wavix/number_validator/results/client.py +114 -0
- wavix/number_validator/results/raw_client.py +156 -0
- wavix/number_validator/types/__init__.py +34 -0
- wavix/number_validator/types/get_number_validator_response.py +112 -0
- wavix/numbers/__init__.py +39 -0
- wavix/numbers/client.py +689 -0
- wavix/numbers/papers/__init__.py +4 -0
- wavix/numbers/papers/client.py +155 -0
- wavix/numbers/papers/raw_client.py +208 -0
- wavix/numbers/raw_client.py +1000 -0
- wavix/numbers/types/__init__.py +38 -0
- wavix/numbers/types/bulk_update_numbers_response.py +23 -0
- wavix/numbers/types/delete_numbers_response.py +22 -0
- wavix/profile/__init__.py +41 -0
- wavix/profile/client.py +308 -0
- wavix/profile/config/__init__.py +34 -0
- wavix/profile/config/client.py +100 -0
- wavix/profile/config/raw_client.py +124 -0
- wavix/profile/config/types/__init__.py +34 -0
- wavix/profile/config/types/get_config_response.py +25 -0
- wavix/profile/raw_client.py +360 -0
- wavix/profile/types/__init__.py +38 -0
- wavix/profile/types/profile_update_request_company_info.py +48 -0
- wavix/profile/types/profile_update_request_company_info_industry.py +22 -0
- wavix/py.typed +0 -0
- wavix/sip_trunks/__init__.py +4 -0
- wavix/sip_trunks/client.py +927 -0
- wavix/sip_trunks/raw_client.py +1324 -0
- wavix/sms_and_mms/__init__.py +66 -0
- wavix/sms_and_mms/client.py +101 -0
- wavix/sms_and_mms/messages/__init__.py +49 -0
- wavix/sms_and_mms/messages/client.py +625 -0
- wavix/sms_and_mms/messages/raw_client.py +793 -0
- wavix/sms_and_mms/messages/types/__init__.py +47 -0
- wavix/sms_and_mms/messages/types/get_messages_response.py +97 -0
- wavix/sms_and_mms/messages/types/list_all_messages_request_message_type.py +5 -0
- wavix/sms_and_mms/messages/types/list_messages_request_message_type.py +5 -0
- wavix/sms_and_mms/messages/types/list_messages_response.py +26 -0
- wavix/sms_and_mms/opt_outs/__init__.py +34 -0
- wavix/sms_and_mms/opt_outs/client.py +277 -0
- wavix/sms_and_mms/opt_outs/raw_client.py +438 -0
- wavix/sms_and_mms/opt_outs/types/__init__.py +34 -0
- wavix/sms_and_mms/opt_outs/types/create_opt_outs_response.py +22 -0
- wavix/sms_and_mms/raw_client.py +13 -0
- wavix/sms_and_mms/sender_ids/__init__.py +38 -0
- wavix/sms_and_mms/sender_ids/client.py +391 -0
- wavix/sms_and_mms/sender_ids/raw_client.py +617 -0
- wavix/sms_and_mms/sender_ids/types/__init__.py +40 -0
- wavix/sms_and_mms/sender_ids/types/delete_sender_ids_response.py +22 -0
- wavix/sms_and_mms/sender_ids/types/sender_id_create_request_monthly_volume.py +7 -0
- wavix/sms_and_mms/sender_ids/types/sender_id_create_request_usecase.py +5 -0
- wavix/speech_analytics/__init__.py +52 -0
- wavix/speech_analytics/client.py +372 -0
- wavix/speech_analytics/file/__init__.py +4 -0
- wavix/speech_analytics/file/client.py +114 -0
- wavix/speech_analytics/file/raw_client.py +148 -0
- wavix/speech_analytics/raw_client.py +527 -0
- wavix/speech_analytics/types/__init__.py +47 -0
- wavix/speech_analytics/types/create_speech_analytics_response.py +32 -0
- wavix/speech_analytics/types/get_speech_analytics_response.py +77 -0
- wavix/speech_analytics/types/get_speech_analytics_response_language.py +5 -0
- wavix/speech_analytics/types/get_speech_analytics_response_status.py +5 -0
- wavix/sub_accounts/__init__.py +52 -0
- wavix/sub_accounts/client.py +442 -0
- wavix/sub_accounts/raw_client.py +775 -0
- wavix/sub_accounts/transactions/__init__.py +4 -0
- wavix/sub_accounts/transactions/client.py +198 -0
- wavix/sub_accounts/transactions/raw_client.py +265 -0
- wavix/sub_accounts/types/__init__.py +47 -0
- wavix/sub_accounts/types/list_sub_accounts_request_status.py +5 -0
- wavix/sub_accounts/types/sub_accounts_create_request_default_destinations.py +31 -0
- wavix/sub_accounts/types/sub_accounts_update_request_default_destinations.py +31 -0
- wavix/sub_accounts/types/sub_accounts_update_request_status.py +5 -0
- wavix/ten_dlc/__init__.py +167 -0
- wavix/ten_dlc/brand_appeals/__init__.py +34 -0
- wavix/ten_dlc/brand_appeals/client.py +244 -0
- wavix/ten_dlc/brand_appeals/raw_client.py +390 -0
- wavix/ten_dlc/brand_appeals/types/__init__.py +34 -0
- wavix/ten_dlc/brand_appeals/types/create_brand_appeals_response.py +22 -0
- wavix/ten_dlc/brand_evidence/__init__.py +37 -0
- wavix/ten_dlc/brand_evidence/client.py +365 -0
- wavix/ten_dlc/brand_evidence/raw_client.py +599 -0
- wavix/ten_dlc/brand_evidence/types/__init__.py +38 -0
- wavix/ten_dlc/brand_evidence/types/delete_brand_evidence_response.py +22 -0
- wavix/ten_dlc/brand_evidence/types/upload_brand_evidence_response.py +38 -0
- wavix/ten_dlc/brand_vetting_appeals/__init__.py +34 -0
- wavix/ten_dlc/brand_vetting_appeals/client.py +258 -0
- wavix/ten_dlc/brand_vetting_appeals/raw_client.py +381 -0
- wavix/ten_dlc/brand_vetting_appeals/types/__init__.py +36 -0
- wavix/ten_dlc/brand_vetting_appeals/types/create_brand_vetting_appeals_response.py +22 -0
- wavix/ten_dlc/brand_vettings/__init__.py +4 -0
- wavix/ten_dlc/brand_vettings/client.py +325 -0
- wavix/ten_dlc/brand_vettings/raw_client.py +518 -0
- wavix/ten_dlc/brands/__init__.py +85 -0
- wavix/ten_dlc/brands/client.py +870 -0
- wavix/ten_dlc/brands/raw_client.py +1263 -0
- wavix/ten_dlc/brands/types/__init__.py +83 -0
- wavix/ten_dlc/brands/types/create_brands_response.py +143 -0
- wavix/ten_dlc/brands/types/create_brands_response_entity_type.py +7 -0
- wavix/ten_dlc/brands/types/create_brands_response_status.py +7 -0
- wavix/ten_dlc/brands/types/delete_brands_response.py +22 -0
- wavix/ten_dlc/brands/types/get_brands_response.py +143 -0
- wavix/ten_dlc/brands/types/get_brands_response_entity_type.py +7 -0
- wavix/ten_dlc/brands/types/get_brands_response_status.py +7 -0
- wavix/ten_dlc/brands/types/list_brands_response.py +33 -0
- wavix/ten_dlc/brands/types/list_brands_response_pagination.py +41 -0
- wavix/ten_dlc/brands/types/qualify_usecase_brands_request_use_case.py +35 -0
- wavix/ten_dlc/brands/types/qualify_usecase_brands_response.py +33 -0
- wavix/ten_dlc/brands/types/ten_dlc_brand_update_request_entity_type.py +7 -0
- wavix/ten_dlc/brands/types/ten_dlc_brand_update_request_vertical.py +18 -0
- wavix/ten_dlc/brands/types/update_brands_response.py +143 -0
- wavix/ten_dlc/brands/types/update_brands_response_entity_type.py +7 -0
- wavix/ten_dlc/brands/types/update_brands_response_status.py +7 -0
- wavix/ten_dlc/campaign_numbers/__init__.py +38 -0
- wavix/ten_dlc/campaign_numbers/client.py +304 -0
- wavix/ten_dlc/campaign_numbers/raw_client.py +448 -0
- wavix/ten_dlc/campaign_numbers/types/__init__.py +40 -0
- wavix/ten_dlc/campaign_numbers/types/link_campaign_numbers_response.py +22 -0
- wavix/ten_dlc/campaign_numbers/types/list_campaign_numbers_response.py +33 -0
- wavix/ten_dlc/campaign_numbers/types/unlink_campaign_numbers_response.py +22 -0
- wavix/ten_dlc/campaigns/__init__.py +64 -0
- wavix/ten_dlc/campaigns/client.py +1493 -0
- wavix/ten_dlc/campaigns/raw_client.py +1840 -0
- wavix/ten_dlc/campaigns/types/__init__.py +62 -0
- wavix/ten_dlc/campaigns/types/create_campaigns_response.py +211 -0
- wavix/ten_dlc/campaigns/types/delete_campaigns_response.py +22 -0
- wavix/ten_dlc/campaigns/types/get_campaigns_response.py +211 -0
- wavix/ten_dlc/campaigns/types/list_by_brand_campaigns_response.py +33 -0
- wavix/ten_dlc/campaigns/types/list_by_brand_campaigns_response_pagination.py +41 -0
- wavix/ten_dlc/campaigns/types/list_campaigns_response.py +33 -0
- wavix/ten_dlc/campaigns/types/list_campaigns_response_pagination.py +41 -0
- wavix/ten_dlc/campaigns/types/ten_dlc_campaign_update_request_usecase.py +15 -0
- wavix/ten_dlc/campaigns/types/update_campaigns_response.py +211 -0
- wavix/ten_dlc/client.py +196 -0
- wavix/ten_dlc/raw_client.py +13 -0
- wavix/ten_dlc/subscriptions/__init__.py +37 -0
- wavix/ten_dlc/subscriptions/client.py +271 -0
- wavix/ten_dlc/subscriptions/raw_client.py +398 -0
- wavix/ten_dlc/subscriptions/types/__init__.py +38 -0
- wavix/ten_dlc/subscriptions/types/create_subscriptions_response.py +31 -0
- wavix/ten_dlc/subscriptions/types/delete_subscriptions_response.py +22 -0
- wavix/two_fa/__init__.py +56 -0
- wavix/two_fa/client.py +101 -0
- wavix/two_fa/events/__init__.py +4 -0
- wavix/two_fa/events/client.py +114 -0
- wavix/two_fa/events/raw_client.py +156 -0
- wavix/two_fa/raw_client.py +13 -0
- wavix/two_fa/sessions/__init__.py +4 -0
- wavix/two_fa/sessions/client.py +142 -0
- wavix/two_fa/sessions/raw_client.py +200 -0
- wavix/two_fa/verification/__init__.py +49 -0
- wavix/two_fa/verification/client.py +395 -0
- wavix/two_fa/verification/raw_client.py +664 -0
- wavix/two_fa/verification/types/__init__.py +47 -0
- wavix/two_fa/verification/types/check_verification_response.py +22 -0
- wavix/two_fa/verification/types/create_verification_response.py +51 -0
- wavix/two_fa/verification/types/resend_verification_response.py +38 -0
- wavix/two_fa/verification/types/two_factor_verification_resend_request_channel.py +5 -0
- wavix/types/__init__.py +637 -0
- wavix/types/account_error_response.py +31 -0
- wavix/types/account_limits.py +32 -0
- wavix/types/allowed_i_ps.py +7 -0
- wavix/types/allowed_i_ps_item.py +27 -0
- wavix/types/api_key.py +138 -0
- wavix/types/api_key_calls_scope_permission.py +30 -0
- wavix/types/api_key_calls_scope_permission_allow.py +5 -0
- wavix/types/api_key_scope_permission.py +30 -0
- wavix/types/api_key_scope_permission_allow.py +5 -0
- wavix/types/available_number.py +97 -0
- wavix/types/available_number_list_response.py +26 -0
- wavix/types/bad_request_error_body.py +27 -0
- wavix/types/billing_transaction_list_response.py +31 -0
- wavix/types/brand_status_updated_webhook.py +28 -0
- wavix/types/brand_status_updated_webhook_status.py +7 -0
- wavix/types/call.py +92 -0
- wavix/types/call_control_validation_error_response.py +34 -0
- wavix/types/call_create_response.py +92 -0
- wavix/types/call_create_response_event_type.py +18 -0
- wavix/types/call_direction.py +5 -0
- wavix/types/call_disposition.py +5 -0
- wavix/types/call_event_type.py +18 -0
- wavix/types/call_list_response.py +28 -0
- wavix/types/call_recording_list_response.py +28 -0
- wavix/types/call_response.py +24 -0
- wavix/types/call_status_webhook.py +70 -0
- wavix/types/call_status_webhook_direction.py +5 -0
- wavix/types/call_stream_channel.py +5 -0
- wavix/types/call_stream_response.py +27 -0
- wavix/types/call_stream_type.py +5 -0
- wavix/types/call_webhook.py +37 -0
- wavix/types/call_webhook_event_type.py +5 -0
- wavix/types/call_webhook_list_response.py +10 -0
- wavix/types/call_webhook_list_response_item.py +28 -0
- wavix/types/call_webhook_list_response_item_event_type.py +5 -0
- wavix/types/campaign_status_updated_webhook.py +41 -0
- wavix/types/campaign_status_updated_webhook_status.py +7 -0
- wavix/types/cart_response.py +29 -0
- wavix/types/cdr.py +97 -0
- wavix/types/cdr_list_response.py +26 -0
- wavix/types/cdr_response.py +104 -0
- wavix/types/cdr_transcription_completed_webhook.py +28 -0
- wavix/types/cdr_transcription_completed_webhook_status.py +5 -0
- wavix/types/cdr_transcription_response.py +74 -0
- wavix/types/cdr_transcription_search_response.py +26 -0
- wavix/types/cdr_with_transcription.py +97 -0
- wavix/types/city.py +32 -0
- wavix/types/city_list_response.py +23 -0
- wavix/types/country.py +32 -0
- wavix/types/country_has_no_regions_error_response.py +27 -0
- wavix/types/country_list_response.py +23 -0
- wavix/types/document_type.py +32 -0
- wavix/types/document_type_id.py +7 -0
- wavix/types/file_transcript_response.py +30 -0
- wavix/types/file_transcript_turn.py +46 -0
- wavix/types/file_transcription_completed_webhook.py +32 -0
- wavix/types/file_transcription_response.py +77 -0
- wavix/types/file_transcription_response_language.py +5 -0
- wavix/types/file_transcription_response_status.py +5 -0
- wavix/types/financial_transaction.py +57 -0
- wavix/types/forbidden_error_response.py +27 -0
- wavix/types/inbound_call_destination.py +53 -0
- wavix/types/inbound_call_transport.py +6 -0
- wavix/types/inbound_message.py +46 -0
- wavix/types/invalid_recording.py +31 -0
- wavix/types/invoice.py +42 -0
- wavix/types/invoice_list_response.py +31 -0
- wavix/types/list_brand_evidence_response.py +23 -0
- wavix/types/list_sessions_response_item.py +58 -0
- wavix/types/message.py +103 -0
- wavix/types/message_body.py +29 -0
- wavix/types/message_create_request.py +46 -0
- wavix/types/message_delivery_status.py +8 -0
- wavix/types/message_list_response.py +26 -0
- wavix/types/message_response.py +97 -0
- wavix/types/messages_delivery_report.py +81 -0
- wavix/types/not_found_error_body.py +27 -0
- wavix/types/not_found_error_response.py +27 -0
- wavix/types/number.py +160 -0
- wavix/types/number_destination.py +38 -0
- wavix/types/number_document.py +58 -0
- wavix/types/number_list_response.py +32 -0
- wavix/types/number_status_updated_webhook.py +38 -0
- wavix/types/number_status_updated_webhook_status.py +5 -0
- wavix/types/number_validator_create_bulk_response.py +10 -0
- wavix/types/number_validator_create_bulk_response_request_id.py +26 -0
- wavix/types/on_call_event_payload.py +34 -0
- wavix/types/on_call_event_payload_type.py +5 -0
- wavix/types/opt_out.py +27 -0
- wavix/types/opt_out_item.py +38 -0
- wavix/types/opt_outs_list_response.py +26 -0
- wavix/types/pagination.py +37 -0
- wavix/types/phone_lookup_details.py +32 -0
- wavix/types/phone_number_validation_type.py +5 -0
- wavix/types/phone_validation_batch_response.py +38 -0
- wavix/types/phone_validation_batch_result_response.py +41 -0
- wavix/types/phone_validation_response.py +112 -0
- wavix/types/phone_validation_result_response.py +115 -0
- wavix/types/profile_config_response.py +25 -0
- wavix/types/profile_response.py +79 -0
- wavix/types/profile_response_company_info.py +53 -0
- wavix/types/profile_response_company_info_country.py +31 -0
- wavix/types/profile_response_company_info_industry.py +22 -0
- wavix/types/profile_response_default_destinations_item.py +27 -0
- wavix/types/record_not_found_error_response.py +27 -0
- wavix/types/recording.py +57 -0
- wavix/types/recording_deleted_error_response.py +38 -0
- wavix/types/region.py +31 -0
- wavix/types/region_list_response.py +23 -0
- wavix/types/send_messages_response.py +100 -0
- wavix/types/sender_id.py +48 -0
- wavix/types/sender_id_details.py +44 -0
- wavix/types/sender_id_list_response.py +23 -0
- wavix/types/sender_id_response.py +48 -0
- wavix/types/sender_id_response_type.py +5 -0
- wavix/types/sender_id_type.py +5 -0
- wavix/types/short_link_metrics_item.py +69 -0
- wavix/types/short_link_metrics_response.py +26 -0
- wavix/types/short_link_response.py +22 -0
- wavix/types/sip_trunk_create_request.py +132 -0
- wavix/types/sip_trunk_create_request_allowed_ips_item.py +22 -0
- wavix/types/sip_trunk_create_request_host_request.py +26 -0
- wavix/types/sip_trunk_list_response.py +26 -0
- wavix/types/sip_trunk_response.py +145 -0
- wavix/types/sip_trunk_summary.py +114 -0
- wavix/types/sip_trunk_summary_host_request.py +31 -0
- wavix/types/sub_accounts_list_response.py +26 -0
- wavix/types/sub_accounts_transactions_list_response.py +30 -0
- wavix/types/sub_accounts_transactions_list_response_transactions_item.py +48 -0
- wavix/types/sub_organization_response.py +59 -0
- wavix/types/sub_organization_response_default_destinations.py +31 -0
- wavix/types/sub_organization_response_status.py +5 -0
- wavix/types/submit_file_transcription_response.py +32 -0
- wavix/types/success_response.py +22 -0
- wavix/types/tcr_error_message.py +27 -0
- wavix/types/tcr_feedback.py +23 -0
- wavix/types/tcr_feedback_category.py +47 -0
- wavix/types/ten_dlc_brand.py +143 -0
- wavix/types/ten_dlc_brand_appeal.py +54 -0
- wavix/types/ten_dlc_brand_appeal_create_request.py +36 -0
- wavix/types/ten_dlc_brand_appeal_outcome.py +38 -0
- wavix/types/ten_dlc_brand_appeal_outcome_feedback.py +27 -0
- wavix/types/ten_dlc_brand_appeal_outcome_vetting_status.py +7 -0
- wavix/types/ten_dlc_brand_create_request.py +8 -0
- wavix/types/ten_dlc_brand_create_request_entity_type.py +7 -0
- wavix/types/ten_dlc_brand_create_request_stock_exchange.py +26 -0
- wavix/types/ten_dlc_brand_create_request_stock_exchange_entity_type.py +7 -0
- wavix/types/ten_dlc_brand_create_request_vertical.py +18 -0
- wavix/types/ten_dlc_brand_create_request_zero.py +24 -0
- wavix/types/ten_dlc_brand_create_request_zero_entity_type.py +5 -0
- wavix/types/ten_dlc_brand_entity_type.py +7 -0
- wavix/types/ten_dlc_brand_evidence.py +38 -0
- wavix/types/ten_dlc_brand_identity_verification_status.py +7 -0
- wavix/types/ten_dlc_brand_list_response.py +33 -0
- wavix/types/ten_dlc_brand_list_response_pagination.py +41 -0
- wavix/types/ten_dlc_brand_qualification_result.py +33 -0
- wavix/types/ten_dlc_brand_status.py +7 -0
- wavix/types/ten_dlc_brand_vetting.py +71 -0
- wavix/types/ten_dlc_brand_vetting_appeal.py +78 -0
- wavix/types/ten_dlc_brand_vetting_appeal_appeal_outcome.py +37 -0
- wavix/types/ten_dlc_brand_vetting_appeal_appeal_outcome_feedback.py +26 -0
- wavix/types/ten_dlc_brand_vetting_appeal_outcome.py +33 -0
- wavix/types/ten_dlc_brand_vetting_appeal_outcome_feedback.py +26 -0
- wavix/types/ten_dlc_brand_vetting_appeal_outcome_reason.py +22 -0
- wavix/types/ten_dlc_campaign.py +211 -0
- wavix/types/ten_dlc_campaign_list_response.py +33 -0
- wavix/types/ten_dlc_campaign_list_response_pagination.py +41 -0
- wavix/types/ten_dlc_campaign_nudge_request.py +32 -0
- wavix/types/ten_dlc_campaign_number.py +27 -0
- wavix/types/ten_dlc_campaign_number_list_response.py +33 -0
- wavix/types/ten_dlc_event_subscription.py +31 -0
- wavix/types/ten_dlcmno_metadata.py +101 -0
- wavix/types/transaction_status.py +5 -0
- wavix/types/transaction_type.py +50 -0
- wavix/types/transcript_turn.py +46 -0
- wavix/types/transcription_filter.py +35 -0
- wavix/types/transcription_filter_agent.py +36 -0
- wavix/types/transcription_filter_any.py +36 -0
- wavix/types/transcription_filter_client.py +36 -0
- wavix/types/transcription_language.py +5 -0
- wavix/types/transcription_reference.py +29 -0
- wavix/types/transcription_status.py +5 -0
- wavix/types/tts_language.py +5 -0
- wavix/types/tts_voice_id.py +25 -0
- wavix/types/two_factor_verification_check_response.py +22 -0
- wavix/types/two_factor_verification_event.py +47 -0
- wavix/types/two_factor_verification_resend_response.py +38 -0
- wavix/types/two_factor_verification_response.py +51 -0
- wavix/types/unauthorized_error_response.py +32 -0
- wavix/types/unprocessable_entity_error_body.py +27 -0
- wavix/types/validation_error_response.py +27 -0
- wavix/types/voice_campaign_create_request.py +20 -0
- wavix/types/voice_campaign_response.py +41 -0
- wavix/types/voice_campaigns_create_response.py +20 -0
- wavix/types/voice_campaigns_create_response_voice_campaign.py +43 -0
- wavix/types/voice_campaigns_get_response.py +20 -0
- wavix/types/voice_campaigns_get_response_voice_campaign.py +43 -0
- wavix/types/web_rtc_token.py +43 -0
- wavix/types/web_rtc_token_response.py +44 -0
- wavix/types/web_rtc_tokens_list_response.py +30 -0
- wavix/version.py +3 -0
- wavix/voice_campaigns/__init__.py +4 -0
- wavix/voice_campaigns/client.py +197 -0
- wavix/voice_campaigns/raw_client.py +332 -0
- wavix/webrtc/__init__.py +34 -0
- wavix/webrtc/client.py +63 -0
- wavix/webrtc/raw_client.py +13 -0
- wavix/webrtc/tokens/__init__.py +4 -0
- wavix/webrtc/tokens/client.py +432 -0
- wavix/webrtc/tokens/raw_client.py +869 -0
- wavix_python_sdk-1.0.0.dist-info/LICENSE +21 -0
- wavix_python_sdk-1.0.0.dist-info/METADATA +339 -0
- wavix_python_sdk-1.0.0.dist-info/RECORD +497 -0
- wavix_python_sdk-1.0.0.dist-info/WHEEL +4 -0
wavix/cdrs/raw_client.py
ADDED
|
@@ -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)
|