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