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,664 @@
|
|
|
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 ...errors.bad_request_error import BadRequestError
|
|
14
|
+
from ...errors.forbidden_error import ForbiddenError
|
|
15
|
+
from ...errors.not_found_error import NotFoundError
|
|
16
|
+
from ...types.success_response import SuccessResponse
|
|
17
|
+
from .types.check_verification_response import CheckVerificationResponse
|
|
18
|
+
from .types.create_verification_response import CreateVerificationResponse
|
|
19
|
+
from .types.resend_verification_response import ResendVerificationResponse
|
|
20
|
+
from .types.two_factor_verification_resend_request_channel import TwoFactorVerificationResendRequestChannel
|
|
21
|
+
from pydantic import ValidationError
|
|
22
|
+
|
|
23
|
+
# this is used as the default value for optional parameters
|
|
24
|
+
OMIT = typing.cast(typing.Any, ...)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class RawVerificationClient:
|
|
28
|
+
def __init__(self, *, client_wrapper: SyncClientWrapper):
|
|
29
|
+
self._client_wrapper = client_wrapper
|
|
30
|
+
|
|
31
|
+
def create(
|
|
32
|
+
self, *, service_id: str, to: str, channel: str, request_options: typing.Optional[RequestOptions] = None
|
|
33
|
+
) -> HttpResponse[CreateVerificationResponse]:
|
|
34
|
+
"""
|
|
35
|
+
Creates a 2FA verification and sends a one-time password (OTP) to the destination phone number over the selected channel. Requires a 2FA service configured in the Wavix portal; the service is reused to generate and validate OTPs.
|
|
36
|
+
|
|
37
|
+
The verification proceeds through three steps:
|
|
38
|
+
1. Create a verification to generate and send an OTP.
|
|
39
|
+
2. Resend the OTP on the same verification if needed.
|
|
40
|
+
3. Validate the OTP through the check endpoint.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
service_id : str
|
|
45
|
+
Unique Wavix 2FA Service ID. Available on the Wavix portal.
|
|
46
|
+
|
|
47
|
+
to : str
|
|
48
|
+
End user's phone number to which the verification code will be sent. The phone number must be in E.164 format.
|
|
49
|
+
|
|
50
|
+
channel : str
|
|
51
|
+
Channel used to deliver the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
|
|
52
|
+
|
|
53
|
+
request_options : typing.Optional[RequestOptions]
|
|
54
|
+
Request-specific configuration.
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
HttpResponse[CreateVerificationResponse]
|
|
59
|
+
Returns the created 2FA verification.
|
|
60
|
+
"""
|
|
61
|
+
_response = self._client_wrapper.httpx_client.request(
|
|
62
|
+
"v1/two-fa/verification",
|
|
63
|
+
method="POST",
|
|
64
|
+
json={
|
|
65
|
+
"service_id": service_id,
|
|
66
|
+
"to": to,
|
|
67
|
+
"channel": channel,
|
|
68
|
+
},
|
|
69
|
+
headers={
|
|
70
|
+
"content-type": "application/json",
|
|
71
|
+
},
|
|
72
|
+
request_options=request_options,
|
|
73
|
+
omit=OMIT,
|
|
74
|
+
)
|
|
75
|
+
try:
|
|
76
|
+
if 200 <= _response.status_code < 300:
|
|
77
|
+
_data = typing.cast(
|
|
78
|
+
CreateVerificationResponse,
|
|
79
|
+
parse_obj_as(
|
|
80
|
+
type_=CreateVerificationResponse, # type: ignore
|
|
81
|
+
object_=_response.json(),
|
|
82
|
+
),
|
|
83
|
+
)
|
|
84
|
+
return HttpResponse(response=_response, data=_data)
|
|
85
|
+
if _response.status_code == 400:
|
|
86
|
+
raise BadRequestError(
|
|
87
|
+
headers=dict(_response.headers),
|
|
88
|
+
body=typing.cast(
|
|
89
|
+
typing.Any,
|
|
90
|
+
parse_obj_as(
|
|
91
|
+
type_=typing.Any, # type: ignore
|
|
92
|
+
object_=_response.json(),
|
|
93
|
+
),
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
if _response.status_code == 403:
|
|
97
|
+
raise ForbiddenError(
|
|
98
|
+
headers=dict(_response.headers),
|
|
99
|
+
body=typing.cast(
|
|
100
|
+
typing.Any,
|
|
101
|
+
parse_obj_as(
|
|
102
|
+
type_=typing.Any, # type: ignore
|
|
103
|
+
object_=_response.json(),
|
|
104
|
+
),
|
|
105
|
+
),
|
|
106
|
+
)
|
|
107
|
+
_response_json = _response.json()
|
|
108
|
+
except JSONDecodeError:
|
|
109
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
110
|
+
except ValidationError as e:
|
|
111
|
+
raise ParsingError(
|
|
112
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
113
|
+
)
|
|
114
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
115
|
+
|
|
116
|
+
def resend(
|
|
117
|
+
self,
|
|
118
|
+
session_id: str,
|
|
119
|
+
*,
|
|
120
|
+
channel: TwoFactorVerificationResendRequestChannel,
|
|
121
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
122
|
+
) -> HttpResponse[ResendVerificationResponse]:
|
|
123
|
+
"""
|
|
124
|
+
Resends the OTP for the verification identified by `session_id` over the specified channel. Previously sent codes are invalidated.
|
|
125
|
+
|
|
126
|
+
Parameters
|
|
127
|
+
----------
|
|
128
|
+
session_id : str
|
|
129
|
+
The unique ID of the 2FA verification session.
|
|
130
|
+
|
|
131
|
+
channel : TwoFactorVerificationResendRequestChannel
|
|
132
|
+
Channel used to resend the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
|
|
133
|
+
|
|
134
|
+
request_options : typing.Optional[RequestOptions]
|
|
135
|
+
Request-specific configuration.
|
|
136
|
+
|
|
137
|
+
Returns
|
|
138
|
+
-------
|
|
139
|
+
HttpResponse[ResendVerificationResponse]
|
|
140
|
+
Returns the resend result, including the channel used.
|
|
141
|
+
"""
|
|
142
|
+
_response = self._client_wrapper.httpx_client.request(
|
|
143
|
+
f"v1/two-fa/verification/{encode_path_param(session_id)}",
|
|
144
|
+
method="POST",
|
|
145
|
+
json={
|
|
146
|
+
"channel": channel,
|
|
147
|
+
},
|
|
148
|
+
headers={
|
|
149
|
+
"content-type": "application/json",
|
|
150
|
+
},
|
|
151
|
+
request_options=request_options,
|
|
152
|
+
omit=OMIT,
|
|
153
|
+
)
|
|
154
|
+
try:
|
|
155
|
+
if 200 <= _response.status_code < 300:
|
|
156
|
+
_data = typing.cast(
|
|
157
|
+
ResendVerificationResponse,
|
|
158
|
+
parse_obj_as(
|
|
159
|
+
type_=ResendVerificationResponse, # type: ignore
|
|
160
|
+
object_=_response.json(),
|
|
161
|
+
),
|
|
162
|
+
)
|
|
163
|
+
return HttpResponse(response=_response, data=_data)
|
|
164
|
+
if _response.status_code == 400:
|
|
165
|
+
raise BadRequestError(
|
|
166
|
+
headers=dict(_response.headers),
|
|
167
|
+
body=typing.cast(
|
|
168
|
+
typing.Any,
|
|
169
|
+
parse_obj_as(
|
|
170
|
+
type_=typing.Any, # type: ignore
|
|
171
|
+
object_=_response.json(),
|
|
172
|
+
),
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
if _response.status_code == 403:
|
|
176
|
+
raise ForbiddenError(
|
|
177
|
+
headers=dict(_response.headers),
|
|
178
|
+
body=typing.cast(
|
|
179
|
+
typing.Any,
|
|
180
|
+
parse_obj_as(
|
|
181
|
+
type_=typing.Any, # type: ignore
|
|
182
|
+
object_=_response.json(),
|
|
183
|
+
),
|
|
184
|
+
),
|
|
185
|
+
)
|
|
186
|
+
_response_json = _response.json()
|
|
187
|
+
except JSONDecodeError:
|
|
188
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
189
|
+
except ValidationError as e:
|
|
190
|
+
raise ParsingError(
|
|
191
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
192
|
+
)
|
|
193
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
194
|
+
|
|
195
|
+
def check(
|
|
196
|
+
self, session_id: str, *, code: str, request_options: typing.Optional[RequestOptions] = None
|
|
197
|
+
) -> HttpResponse[CheckVerificationResponse]:
|
|
198
|
+
"""
|
|
199
|
+
Validates the OTP submitted by the end user against the verification identified by `session_id`.
|
|
200
|
+
|
|
201
|
+
Parameters
|
|
202
|
+
----------
|
|
203
|
+
session_id : str
|
|
204
|
+
The unique ID of the 2FA verification session.
|
|
205
|
+
|
|
206
|
+
code : str
|
|
207
|
+
The code entered by an end user
|
|
208
|
+
|
|
209
|
+
request_options : typing.Optional[RequestOptions]
|
|
210
|
+
Request-specific configuration.
|
|
211
|
+
|
|
212
|
+
Returns
|
|
213
|
+
-------
|
|
214
|
+
HttpResponse[CheckVerificationResponse]
|
|
215
|
+
Returns the validation result in `is_valid`.
|
|
216
|
+
"""
|
|
217
|
+
_response = self._client_wrapper.httpx_client.request(
|
|
218
|
+
f"v1/two-fa/verification/{encode_path_param(session_id)}/check",
|
|
219
|
+
method="POST",
|
|
220
|
+
json={
|
|
221
|
+
"code": code,
|
|
222
|
+
},
|
|
223
|
+
headers={
|
|
224
|
+
"content-type": "application/json",
|
|
225
|
+
},
|
|
226
|
+
request_options=request_options,
|
|
227
|
+
omit=OMIT,
|
|
228
|
+
)
|
|
229
|
+
try:
|
|
230
|
+
if 200 <= _response.status_code < 300:
|
|
231
|
+
_data = typing.cast(
|
|
232
|
+
CheckVerificationResponse,
|
|
233
|
+
parse_obj_as(
|
|
234
|
+
type_=CheckVerificationResponse, # type: ignore
|
|
235
|
+
object_=_response.json(),
|
|
236
|
+
),
|
|
237
|
+
)
|
|
238
|
+
return HttpResponse(response=_response, data=_data)
|
|
239
|
+
if _response.status_code == 400:
|
|
240
|
+
raise BadRequestError(
|
|
241
|
+
headers=dict(_response.headers),
|
|
242
|
+
body=typing.cast(
|
|
243
|
+
typing.Any,
|
|
244
|
+
parse_obj_as(
|
|
245
|
+
type_=typing.Any, # type: ignore
|
|
246
|
+
object_=_response.json(),
|
|
247
|
+
),
|
|
248
|
+
),
|
|
249
|
+
)
|
|
250
|
+
if _response.status_code == 403:
|
|
251
|
+
raise ForbiddenError(
|
|
252
|
+
headers=dict(_response.headers),
|
|
253
|
+
body=typing.cast(
|
|
254
|
+
typing.Any,
|
|
255
|
+
parse_obj_as(
|
|
256
|
+
type_=typing.Any, # type: ignore
|
|
257
|
+
object_=_response.json(),
|
|
258
|
+
),
|
|
259
|
+
),
|
|
260
|
+
)
|
|
261
|
+
_response_json = _response.json()
|
|
262
|
+
except JSONDecodeError:
|
|
263
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
264
|
+
except ValidationError as e:
|
|
265
|
+
raise ParsingError(
|
|
266
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
267
|
+
)
|
|
268
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
269
|
+
|
|
270
|
+
def cancel(
|
|
271
|
+
self, session_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
272
|
+
) -> HttpResponse[SuccessResponse]:
|
|
273
|
+
"""
|
|
274
|
+
Cancels the 2FA verification identified by `session_id`. No further codes are sent, and previously sent codes can no longer be validated. A new verification is required to send another code.
|
|
275
|
+
|
|
276
|
+
Parameters
|
|
277
|
+
----------
|
|
278
|
+
session_id : str
|
|
279
|
+
The unique ID of the 2FA verification session.
|
|
280
|
+
|
|
281
|
+
request_options : typing.Optional[RequestOptions]
|
|
282
|
+
Request-specific configuration.
|
|
283
|
+
|
|
284
|
+
Returns
|
|
285
|
+
-------
|
|
286
|
+
HttpResponse[SuccessResponse]
|
|
287
|
+
Returns a success confirmation. The verification is canceled.
|
|
288
|
+
"""
|
|
289
|
+
_response = self._client_wrapper.httpx_client.request(
|
|
290
|
+
f"v1/two-fa/verification/{encode_path_param(session_id)}/cancel",
|
|
291
|
+
method="PATCH",
|
|
292
|
+
request_options=request_options,
|
|
293
|
+
)
|
|
294
|
+
try:
|
|
295
|
+
if 200 <= _response.status_code < 300:
|
|
296
|
+
_data = typing.cast(
|
|
297
|
+
SuccessResponse,
|
|
298
|
+
parse_obj_as(
|
|
299
|
+
type_=SuccessResponse, # type: ignore
|
|
300
|
+
object_=_response.json(),
|
|
301
|
+
),
|
|
302
|
+
)
|
|
303
|
+
return HttpResponse(response=_response, data=_data)
|
|
304
|
+
if _response.status_code == 400:
|
|
305
|
+
raise BadRequestError(
|
|
306
|
+
headers=dict(_response.headers),
|
|
307
|
+
body=typing.cast(
|
|
308
|
+
typing.Any,
|
|
309
|
+
parse_obj_as(
|
|
310
|
+
type_=typing.Any, # type: ignore
|
|
311
|
+
object_=_response.json(),
|
|
312
|
+
),
|
|
313
|
+
),
|
|
314
|
+
)
|
|
315
|
+
if _response.status_code == 403:
|
|
316
|
+
raise ForbiddenError(
|
|
317
|
+
headers=dict(_response.headers),
|
|
318
|
+
body=typing.cast(
|
|
319
|
+
typing.Any,
|
|
320
|
+
parse_obj_as(
|
|
321
|
+
type_=typing.Any, # type: ignore
|
|
322
|
+
object_=_response.json(),
|
|
323
|
+
),
|
|
324
|
+
),
|
|
325
|
+
)
|
|
326
|
+
if _response.status_code == 404:
|
|
327
|
+
raise NotFoundError(
|
|
328
|
+
headers=dict(_response.headers),
|
|
329
|
+
body=typing.cast(
|
|
330
|
+
typing.Any,
|
|
331
|
+
parse_obj_as(
|
|
332
|
+
type_=typing.Any, # type: ignore
|
|
333
|
+
object_=_response.json(),
|
|
334
|
+
),
|
|
335
|
+
),
|
|
336
|
+
)
|
|
337
|
+
_response_json = _response.json()
|
|
338
|
+
except JSONDecodeError:
|
|
339
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
340
|
+
except ValidationError as e:
|
|
341
|
+
raise ParsingError(
|
|
342
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
343
|
+
)
|
|
344
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
class AsyncRawVerificationClient:
|
|
348
|
+
def __init__(self, *, client_wrapper: AsyncClientWrapper):
|
|
349
|
+
self._client_wrapper = client_wrapper
|
|
350
|
+
|
|
351
|
+
async def create(
|
|
352
|
+
self, *, service_id: str, to: str, channel: str, request_options: typing.Optional[RequestOptions] = None
|
|
353
|
+
) -> AsyncHttpResponse[CreateVerificationResponse]:
|
|
354
|
+
"""
|
|
355
|
+
Creates a 2FA verification and sends a one-time password (OTP) to the destination phone number over the selected channel. Requires a 2FA service configured in the Wavix portal; the service is reused to generate and validate OTPs.
|
|
356
|
+
|
|
357
|
+
The verification proceeds through three steps:
|
|
358
|
+
1. Create a verification to generate and send an OTP.
|
|
359
|
+
2. Resend the OTP on the same verification if needed.
|
|
360
|
+
3. Validate the OTP through the check endpoint.
|
|
361
|
+
|
|
362
|
+
Parameters
|
|
363
|
+
----------
|
|
364
|
+
service_id : str
|
|
365
|
+
Unique Wavix 2FA Service ID. Available on the Wavix portal.
|
|
366
|
+
|
|
367
|
+
to : str
|
|
368
|
+
End user's phone number to which the verification code will be sent. The phone number must be in E.164 format.
|
|
369
|
+
|
|
370
|
+
channel : str
|
|
371
|
+
Channel used to deliver the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
|
|
372
|
+
|
|
373
|
+
request_options : typing.Optional[RequestOptions]
|
|
374
|
+
Request-specific configuration.
|
|
375
|
+
|
|
376
|
+
Returns
|
|
377
|
+
-------
|
|
378
|
+
AsyncHttpResponse[CreateVerificationResponse]
|
|
379
|
+
Returns the created 2FA verification.
|
|
380
|
+
"""
|
|
381
|
+
_response = await self._client_wrapper.httpx_client.request(
|
|
382
|
+
"v1/two-fa/verification",
|
|
383
|
+
method="POST",
|
|
384
|
+
json={
|
|
385
|
+
"service_id": service_id,
|
|
386
|
+
"to": to,
|
|
387
|
+
"channel": channel,
|
|
388
|
+
},
|
|
389
|
+
headers={
|
|
390
|
+
"content-type": "application/json",
|
|
391
|
+
},
|
|
392
|
+
request_options=request_options,
|
|
393
|
+
omit=OMIT,
|
|
394
|
+
)
|
|
395
|
+
try:
|
|
396
|
+
if 200 <= _response.status_code < 300:
|
|
397
|
+
_data = typing.cast(
|
|
398
|
+
CreateVerificationResponse,
|
|
399
|
+
parse_obj_as(
|
|
400
|
+
type_=CreateVerificationResponse, # type: ignore
|
|
401
|
+
object_=_response.json(),
|
|
402
|
+
),
|
|
403
|
+
)
|
|
404
|
+
return AsyncHttpResponse(response=_response, data=_data)
|
|
405
|
+
if _response.status_code == 400:
|
|
406
|
+
raise BadRequestError(
|
|
407
|
+
headers=dict(_response.headers),
|
|
408
|
+
body=typing.cast(
|
|
409
|
+
typing.Any,
|
|
410
|
+
parse_obj_as(
|
|
411
|
+
type_=typing.Any, # type: ignore
|
|
412
|
+
object_=_response.json(),
|
|
413
|
+
),
|
|
414
|
+
),
|
|
415
|
+
)
|
|
416
|
+
if _response.status_code == 403:
|
|
417
|
+
raise ForbiddenError(
|
|
418
|
+
headers=dict(_response.headers),
|
|
419
|
+
body=typing.cast(
|
|
420
|
+
typing.Any,
|
|
421
|
+
parse_obj_as(
|
|
422
|
+
type_=typing.Any, # type: ignore
|
|
423
|
+
object_=_response.json(),
|
|
424
|
+
),
|
|
425
|
+
),
|
|
426
|
+
)
|
|
427
|
+
_response_json = _response.json()
|
|
428
|
+
except JSONDecodeError:
|
|
429
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
430
|
+
except ValidationError as e:
|
|
431
|
+
raise ParsingError(
|
|
432
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
433
|
+
)
|
|
434
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
435
|
+
|
|
436
|
+
async def resend(
|
|
437
|
+
self,
|
|
438
|
+
session_id: str,
|
|
439
|
+
*,
|
|
440
|
+
channel: TwoFactorVerificationResendRequestChannel,
|
|
441
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
442
|
+
) -> AsyncHttpResponse[ResendVerificationResponse]:
|
|
443
|
+
"""
|
|
444
|
+
Resends the OTP for the verification identified by `session_id` over the specified channel. Previously sent codes are invalidated.
|
|
445
|
+
|
|
446
|
+
Parameters
|
|
447
|
+
----------
|
|
448
|
+
session_id : str
|
|
449
|
+
The unique ID of the 2FA verification session.
|
|
450
|
+
|
|
451
|
+
channel : TwoFactorVerificationResendRequestChannel
|
|
452
|
+
Channel used to resend the verification code. One of `sms` (sent as a text message) or `voice` (read aloud over a phone call).
|
|
453
|
+
|
|
454
|
+
request_options : typing.Optional[RequestOptions]
|
|
455
|
+
Request-specific configuration.
|
|
456
|
+
|
|
457
|
+
Returns
|
|
458
|
+
-------
|
|
459
|
+
AsyncHttpResponse[ResendVerificationResponse]
|
|
460
|
+
Returns the resend result, including the channel used.
|
|
461
|
+
"""
|
|
462
|
+
_response = await self._client_wrapper.httpx_client.request(
|
|
463
|
+
f"v1/two-fa/verification/{encode_path_param(session_id)}",
|
|
464
|
+
method="POST",
|
|
465
|
+
json={
|
|
466
|
+
"channel": channel,
|
|
467
|
+
},
|
|
468
|
+
headers={
|
|
469
|
+
"content-type": "application/json",
|
|
470
|
+
},
|
|
471
|
+
request_options=request_options,
|
|
472
|
+
omit=OMIT,
|
|
473
|
+
)
|
|
474
|
+
try:
|
|
475
|
+
if 200 <= _response.status_code < 300:
|
|
476
|
+
_data = typing.cast(
|
|
477
|
+
ResendVerificationResponse,
|
|
478
|
+
parse_obj_as(
|
|
479
|
+
type_=ResendVerificationResponse, # type: ignore
|
|
480
|
+
object_=_response.json(),
|
|
481
|
+
),
|
|
482
|
+
)
|
|
483
|
+
return AsyncHttpResponse(response=_response, data=_data)
|
|
484
|
+
if _response.status_code == 400:
|
|
485
|
+
raise BadRequestError(
|
|
486
|
+
headers=dict(_response.headers),
|
|
487
|
+
body=typing.cast(
|
|
488
|
+
typing.Any,
|
|
489
|
+
parse_obj_as(
|
|
490
|
+
type_=typing.Any, # type: ignore
|
|
491
|
+
object_=_response.json(),
|
|
492
|
+
),
|
|
493
|
+
),
|
|
494
|
+
)
|
|
495
|
+
if _response.status_code == 403:
|
|
496
|
+
raise ForbiddenError(
|
|
497
|
+
headers=dict(_response.headers),
|
|
498
|
+
body=typing.cast(
|
|
499
|
+
typing.Any,
|
|
500
|
+
parse_obj_as(
|
|
501
|
+
type_=typing.Any, # type: ignore
|
|
502
|
+
object_=_response.json(),
|
|
503
|
+
),
|
|
504
|
+
),
|
|
505
|
+
)
|
|
506
|
+
_response_json = _response.json()
|
|
507
|
+
except JSONDecodeError:
|
|
508
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
509
|
+
except ValidationError as e:
|
|
510
|
+
raise ParsingError(
|
|
511
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
512
|
+
)
|
|
513
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
514
|
+
|
|
515
|
+
async def check(
|
|
516
|
+
self, session_id: str, *, code: str, request_options: typing.Optional[RequestOptions] = None
|
|
517
|
+
) -> AsyncHttpResponse[CheckVerificationResponse]:
|
|
518
|
+
"""
|
|
519
|
+
Validates the OTP submitted by the end user against the verification identified by `session_id`.
|
|
520
|
+
|
|
521
|
+
Parameters
|
|
522
|
+
----------
|
|
523
|
+
session_id : str
|
|
524
|
+
The unique ID of the 2FA verification session.
|
|
525
|
+
|
|
526
|
+
code : str
|
|
527
|
+
The code entered by an end user
|
|
528
|
+
|
|
529
|
+
request_options : typing.Optional[RequestOptions]
|
|
530
|
+
Request-specific configuration.
|
|
531
|
+
|
|
532
|
+
Returns
|
|
533
|
+
-------
|
|
534
|
+
AsyncHttpResponse[CheckVerificationResponse]
|
|
535
|
+
Returns the validation result in `is_valid`.
|
|
536
|
+
"""
|
|
537
|
+
_response = await self._client_wrapper.httpx_client.request(
|
|
538
|
+
f"v1/two-fa/verification/{encode_path_param(session_id)}/check",
|
|
539
|
+
method="POST",
|
|
540
|
+
json={
|
|
541
|
+
"code": code,
|
|
542
|
+
},
|
|
543
|
+
headers={
|
|
544
|
+
"content-type": "application/json",
|
|
545
|
+
},
|
|
546
|
+
request_options=request_options,
|
|
547
|
+
omit=OMIT,
|
|
548
|
+
)
|
|
549
|
+
try:
|
|
550
|
+
if 200 <= _response.status_code < 300:
|
|
551
|
+
_data = typing.cast(
|
|
552
|
+
CheckVerificationResponse,
|
|
553
|
+
parse_obj_as(
|
|
554
|
+
type_=CheckVerificationResponse, # type: ignore
|
|
555
|
+
object_=_response.json(),
|
|
556
|
+
),
|
|
557
|
+
)
|
|
558
|
+
return AsyncHttpResponse(response=_response, data=_data)
|
|
559
|
+
if _response.status_code == 400:
|
|
560
|
+
raise BadRequestError(
|
|
561
|
+
headers=dict(_response.headers),
|
|
562
|
+
body=typing.cast(
|
|
563
|
+
typing.Any,
|
|
564
|
+
parse_obj_as(
|
|
565
|
+
type_=typing.Any, # type: ignore
|
|
566
|
+
object_=_response.json(),
|
|
567
|
+
),
|
|
568
|
+
),
|
|
569
|
+
)
|
|
570
|
+
if _response.status_code == 403:
|
|
571
|
+
raise ForbiddenError(
|
|
572
|
+
headers=dict(_response.headers),
|
|
573
|
+
body=typing.cast(
|
|
574
|
+
typing.Any,
|
|
575
|
+
parse_obj_as(
|
|
576
|
+
type_=typing.Any, # type: ignore
|
|
577
|
+
object_=_response.json(),
|
|
578
|
+
),
|
|
579
|
+
),
|
|
580
|
+
)
|
|
581
|
+
_response_json = _response.json()
|
|
582
|
+
except JSONDecodeError:
|
|
583
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
584
|
+
except ValidationError as e:
|
|
585
|
+
raise ParsingError(
|
|
586
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
587
|
+
)
|
|
588
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|
|
589
|
+
|
|
590
|
+
async def cancel(
|
|
591
|
+
self, session_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
592
|
+
) -> AsyncHttpResponse[SuccessResponse]:
|
|
593
|
+
"""
|
|
594
|
+
Cancels the 2FA verification identified by `session_id`. No further codes are sent, and previously sent codes can no longer be validated. A new verification is required to send another code.
|
|
595
|
+
|
|
596
|
+
Parameters
|
|
597
|
+
----------
|
|
598
|
+
session_id : str
|
|
599
|
+
The unique ID of the 2FA verification session.
|
|
600
|
+
|
|
601
|
+
request_options : typing.Optional[RequestOptions]
|
|
602
|
+
Request-specific configuration.
|
|
603
|
+
|
|
604
|
+
Returns
|
|
605
|
+
-------
|
|
606
|
+
AsyncHttpResponse[SuccessResponse]
|
|
607
|
+
Returns a success confirmation. The verification is canceled.
|
|
608
|
+
"""
|
|
609
|
+
_response = await self._client_wrapper.httpx_client.request(
|
|
610
|
+
f"v1/two-fa/verification/{encode_path_param(session_id)}/cancel",
|
|
611
|
+
method="PATCH",
|
|
612
|
+
request_options=request_options,
|
|
613
|
+
)
|
|
614
|
+
try:
|
|
615
|
+
if 200 <= _response.status_code < 300:
|
|
616
|
+
_data = typing.cast(
|
|
617
|
+
SuccessResponse,
|
|
618
|
+
parse_obj_as(
|
|
619
|
+
type_=SuccessResponse, # type: ignore
|
|
620
|
+
object_=_response.json(),
|
|
621
|
+
),
|
|
622
|
+
)
|
|
623
|
+
return AsyncHttpResponse(response=_response, data=_data)
|
|
624
|
+
if _response.status_code == 400:
|
|
625
|
+
raise BadRequestError(
|
|
626
|
+
headers=dict(_response.headers),
|
|
627
|
+
body=typing.cast(
|
|
628
|
+
typing.Any,
|
|
629
|
+
parse_obj_as(
|
|
630
|
+
type_=typing.Any, # type: ignore
|
|
631
|
+
object_=_response.json(),
|
|
632
|
+
),
|
|
633
|
+
),
|
|
634
|
+
)
|
|
635
|
+
if _response.status_code == 403:
|
|
636
|
+
raise ForbiddenError(
|
|
637
|
+
headers=dict(_response.headers),
|
|
638
|
+
body=typing.cast(
|
|
639
|
+
typing.Any,
|
|
640
|
+
parse_obj_as(
|
|
641
|
+
type_=typing.Any, # type: ignore
|
|
642
|
+
object_=_response.json(),
|
|
643
|
+
),
|
|
644
|
+
),
|
|
645
|
+
)
|
|
646
|
+
if _response.status_code == 404:
|
|
647
|
+
raise NotFoundError(
|
|
648
|
+
headers=dict(_response.headers),
|
|
649
|
+
body=typing.cast(
|
|
650
|
+
typing.Any,
|
|
651
|
+
parse_obj_as(
|
|
652
|
+
type_=typing.Any, # type: ignore
|
|
653
|
+
object_=_response.json(),
|
|
654
|
+
),
|
|
655
|
+
),
|
|
656
|
+
)
|
|
657
|
+
_response_json = _response.json()
|
|
658
|
+
except JSONDecodeError:
|
|
659
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
|
|
660
|
+
except ValidationError as e:
|
|
661
|
+
raise ParsingError(
|
|
662
|
+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
|
|
663
|
+
)
|
|
664
|
+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
|