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