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