From 26abf13ddf0a237394e2d34ff9f2782221d0486a Mon Sep 17 00:00:00 2001
From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com>
Date: Mon, 2 Nov 2026 12:17:09 +0000
Subject: [PATCH 1/2] [fern-generated] Update SDK
Generated by Fern
CLI Version: unknown
Generators:
- fernapi/fern-python-sdk: 4.64.1
---
.fern/metadata.json | 4 +-
LICENSE | 21 +
pyproject.toml | 2 +-
reference.md | 4749 ++++++++++++++++-
src/elevenlabs/__init__.py | 461 +-
src/elevenlabs/audio_native/raw_client.py | 5 +-
src/elevenlabs/base_client.py | 19 +
.../knowledge_base/documents/client.py | 54 +-
.../knowledge_base/documents/raw_client.py | 44 +-
.../tests/invocations/client.py | 12 +
.../tests/invocations/raw_client.py | 10 +
.../triage_tickets/client.py | 10 +
.../triage_tickets/raw_client.py | 10 +
src/elevenlabs/core/client_wrapper.py | 4 +-
src/elevenlabs/dubbing/project/raw_client.py | 9 +-
src/elevenlabs/music/finetunes/raw_client.py | 5 +-
src/elevenlabs/music/raw_client.py | 5 +-
.../types => reception}/__init__.py | 50 +-
src/elevenlabs/reception/billing/__init__.py | 4 +
src/elevenlabs/reception/billing/client.py | 270 +
.../reception/billing/raw_client.py | 365 ++
.../reception/business_profile/__init__.py | 4 +
.../reception/business_profile/client.py | 204 +
.../reception/business_profile/raw_client.py | 283 +
src/elevenlabs/reception/client.py | 272 +
src/elevenlabs/reception/holidays/__init__.py | 4 +
src/elevenlabs/reception/holidays/client.py | 582 ++
.../reception/holidays/raw_client.py | 744 +++
.../reception/knowledge_sources/__init__.py | 4 +
.../reception/knowledge_sources/client.py | 471 ++
.../reception/knowledge_sources/raw_client.py | 677 +++
.../reception/locations/__init__.py | 4 +
src/elevenlabs/reception/locations/client.py | 485 ++
.../reception/locations/raw_client.py | 683 +++
.../reception/phone_numbers/__init__.py | 4 +
.../reception/phone_numbers/client.py | 424 ++
.../reception/phone_numbers/raw_client.py | 555 ++
src/elevenlabs/reception/raw_client.py | 13 +
.../receptionists}/__init__.py | 21 +-
.../reception/receptionists/client.py | 385 ++
.../receptionists/procedures/__init__.py | 4 +
.../receptionists/procedures/client.py | 447 ++
.../receptionists/procedures/raw_client.py | 587 ++
.../reception/receptionists/raw_client.py | 437 ++
.../reception/receptionists/rules/__init__.py | 4 +
.../reception/receptionists/rules/client.py | 359 ++
.../receptionists/rules/raw_client.py | 461 ++
.../receptionists/transfer_rules/__init__.py | 4 +
.../receptionists/transfer_rules/client.py | 363 ++
.../transfer_rules/raw_client.py | 461 ++
src/elevenlabs/reception/services/__init__.py | 4 +
src/elevenlabs/reception/services/client.py | 655 +++
.../reception/services/raw_client.py | 885 +++
src/elevenlabs/reception/staff/__init__.py | 4 +
src/elevenlabs/reception/staff/client.py | 483 ++
src/elevenlabs/reception/staff/raw_client.py | 683 +++
.../reception/subscriptions/__init__.py | 4 +
.../reception/subscriptions/client.py | 439 ++
.../reception/subscriptions/raw_client.py | 611 +++
src/elevenlabs/reception/tiers/__init__.py | 4 +
src/elevenlabs/reception/tiers/client.py | 102 +
src/elevenlabs/reception/tiers/raw_client.py | 126 +
.../reception/workspaces/__init__.py | 4 +
src/elevenlabs/reception/workspaces/client.py | 246 +
.../reception/workspaces/raw_client.py | 321 ++
.../service_accounts/api_keys/client.py | 8 +-
.../service_accounts/api_keys/raw_client.py | 8 +-
src/elevenlabs/speech_to_text/client.py | 4 +-
src/elevenlabs/speech_to_text/raw_client.py | 8 +-
src/elevenlabs/studio/projects/raw_client.py | 13 +-
src/elevenlabs/types/__init__.py | 445 +-
.../{dubbing_audio.py => add_url_request.py} | 11 +-
src/elevenlabs/types/agent_rule.py | 43 +
.../types/application_number_type.py | 5 +
.../types/appointment_reminder_mode.py | 5 +
.../types/assign_reseller_tier_request.py | 30 +
...gn_reseller_tier_request_billing_period.py | 5 +
.../types/cal_com_connection_health_status.py | 5 +
.../calendly_connection_health_status.py | 5 +
.../conversation_summary_response_model.py | 16 +-
src/elevenlabs/types/country_code.py | 3 +
.../types/customer_facing_config_input.py | 141 +
.../types/customer_facing_config_output.py | 141 +
.../types/customer_facing_config_patch.py | 127 +
src/elevenlabs/types/date_model.py | 37 +
src/elevenlabs/types/day_of_week.py | 3 +
src/elevenlabs/types/dubbing_error.py | 16 +-
.../types/dubbing_input_audio_chunk.py | 21 -
src/elevenlabs/types/dubbing_input_error.py | 21 -
.../types/dubbing_invalid_request_error.py | 21 -
.../types/dubbing_partial_transcript.py | 21 -
.../types/dubbing_queue_overflow_error.py | 21 -
.../types/dubbing_rate_limited_error.py | 21 -
.../types/dubbing_session_started.py | 22 -
src/elevenlabs/types/dubbing_status.py | 22 -
src/elevenlabs/types/dubbing_status_status.py | 5 -
.../types/dubbing_transcriber_error.py | 21 -
src/elevenlabs/types/dubbing_translation.py | 25 -
.../types/dubbing_translation_error.py | 21 -
src/elevenlabs/types/email_optional.py | 3 +
.../types/get_conversation_response_model.py | 10 +
.../types/holiday_response_model.py | 47 +
src/elevenlabs/types/holiday_type.py | 5 +
src/elevenlabs/types/ingest_failure.py | 19 +
src/elevenlabs/types/intake_question_kind.py | 5 +
.../types/internal_kb_crawl_page_timing.py | 30 +
.../types/knowledge_source_status.py | 5 +
src/elevenlabs/types/knowledge_source_type.py | 5 +
src/elevenlabs/types/language_preset_input.py | 5 +
.../types/language_preset_output.py | 5 +
src/elevenlabs/types/lenient_country.py | 7 +
src/elevenlabs/types/lenient_currency.py | 57 +
src/elevenlabs/types/lenient_optional_bool.py | 5 +
src/elevenlabs/types/lenient_optional_str.py | 5 +
src/elevenlabs/types/lenient_phone.py | 7 +
src/elevenlabs/types/lenient_state.py | 5 +
src/elevenlabs/types/lenient_vertical.py | 7 +
src/elevenlabs/types/llm.py | 1 +
src/elevenlabs/types/location_response.py | 66 +
src/elevenlabs/types/mcp_transport.py | 5 +
src/elevenlabs/types/permission_type.py | 1 +
src/elevenlabs/types/phone_number.py | 3 +
src/elevenlabs/types/phone_number_nullable.py | 5 +
src/elevenlabs/types/phone_number_optional.py | 3 +
src/elevenlabs/types/pricing_mode.py | 5 +
src/elevenlabs/types/processing_progress.py | 7 +
src/elevenlabs/types/promotion_target.py | 5 +
.../provision_reseller_workspace_response.py | 38 +
...ovision_reseller_workspace_subscription.py | 24 +
...r_workspace_subscription_billing_period.py | 7 +
src/elevenlabs/types/raw_business_info.py | 33 +
src/elevenlabs/types/raw_item.py | 27 +
src/elevenlabs/types/raw_location_info.py | 27 +
.../types/reseller_invoice_detail.py | 44 +
src/elevenlabs/types/reseller_invoice_line.py | 34 +
.../types/reseller_invoice_line_kind.py | 7 +
.../types/reseller_invoice_status.py | 5 +
.../types/reseller_invoice_summary.py | 46 +
...cript.py => reseller_invoices_response.py} | 12 +-
.../types/reseller_tier_response.py | 27 +
.../types/reseller_upcoming_payment.py | 36 +
...=> reseller_upcoming_payments_response.py} | 6 +-
.../types/reseller_workspace_subscription.py | 54 +
...r_workspace_subscription_billing_period.py | 5 +
.../types/reseller_workspace_summary.py | 35 +
.../types/reseller_workspaces_response.py | 23 +
src/elevenlabs/types/rule_priority.py | 5 +
src/elevenlabs/types/service_location_type.py | 5 +
...f_stream.py => service_update_response.py} | 6 +-
src/elevenlabs/types/smb_add_on.py | 48 +
.../types/smb_agent_info_response.py | 62 +
.../types/smb_agent_info_response_currency.py | 57 +
src/elevenlabs/types/smb_agent_target.py | 5 +
src/elevenlabs/types/smb_asset_scrapable.py | 44 +
.../types/smb_create_agent_rule_request.py | 39 +
.../types/smb_create_holiday_request.py | 40 +
.../types/smb_create_procedure_request.py | 38 +
.../types/smb_create_service_request.py | 119 +
.../types/smb_create_staff_request.py | 83 +
.../types/smb_create_transfer_rule_request.py | 44 +
.../types/smb_customer_facing_agent.py | 44 +
...stomer_facing_agent_deactivation_reason.py | 5 +
.../smb_customer_facing_agent_response.py | 63 +
src/elevenlabs/types/smb_group_membership.py | 34 +
.../types/smb_identity_verification_config.py | 34 +
src/elevenlabs/types/smb_intake_question.py | 55 +
.../types/smb_knowledge_source_db_model.py | 51 +
.../types/smb_location_deactivation_reason.py | 5 +
src/elevenlabs/types/smb_location_input.py | 62 +
src/elevenlabs/types/smb_location_output.py | 64 +
src/elevenlabs/types/smb_location_request.py | 56 +
.../types/smb_location_request_patch.py | 52 +
.../types/smb_notification_channel.py | 5 +
.../types/smb_phone_assignment_db_model.py | 90 +
.../smb_phone_assignment_db_model_provider.py | 5 +
...mb_phone_assignment_deactivation_reason.py | 7 +
.../types/smb_phone_regulatory_status.py | 5 +
src/elevenlabs/types/smb_procedure.py | 55 +
src/elevenlabs/types/smb_product_scrapable.py | 55 +
src/elevenlabs/types/smb_scraping_mode.py | 5 +
src/elevenlabs/types/smb_service_db_model.py | 135 +
src/elevenlabs/types/smb_service_kind.py | 5 +
src/elevenlabs/types/smb_service_promotion.py | 60 +
src/elevenlabs/types/smb_service_scrapable.py | 81 +
src/elevenlabs/types/smb_service_variant.py | 27 +
.../types/smb_sip_media_encryption.py | 5 +
src/elevenlabs/types/smb_sip_transport.py | 5 +
.../types/smb_staff_resource_db_model.py | 96 +
src/elevenlabs/types/smb_staff_scrapable.py | 44 +
src/elevenlabs/types/smb_tier_economics.py | 51 +
src/elevenlabs/types/smb_transfer_rule.py | 48 +
src/elevenlabs/types/smb_turn_eagerness.py | 5 +
.../types/smb_update_agent_info_request.py | 53 +
.../smb_update_agent_info_request_currency.py | 57 +
.../types/smb_update_agent_rule_request.py | 39 +
.../types/smb_update_holiday_request_patch.py | 40 +
.../types/smb_update_procedure_request.py | 38 +
.../types/smb_update_service_request_patch.py | 129 +
.../types/smb_update_staff_request_patch.py | 83 +
.../types/smb_update_transfer_rule_request.py | 44 +
src/elevenlabs/types/smb_vertical.py | 25 +
src/elevenlabs/types/smb_widget_appearance.py | 41 +
.../types/smb_widget_appearance_placement.py | 7 +
.../types/smb_widget_appearance_variant.py | 5 +
src/elevenlabs/types/sms_template_style.py | 5 +
src/elevenlabs/types/stripped_str.py | 3 +
src/elevenlabs/types/supported_lang.py | 3 +
src/elevenlabs/types/team_invite_outcome.py | 5 +
...g_auth_error.py => team_invite_request.py} | 7 +-
.../types/team_invite_request_role.py | 5 +
src/elevenlabs/types/team_invite_result.py | 23 +
src/elevenlabs/types/time_off_type.py | 5 +
src/elevenlabs/types/time_range_model.py | 43 +
src/elevenlabs/types/turn_config.py | 10 +
src/elevenlabs/types/turn_config_override.py | 5 +
.../types/turn_config_override_config.py | 5 +
.../types/turn_config_workflow_override.py | 5 +
..._required_true_metadata_ge_ge_0_le_le_6.py | 5 +
...test_guardrail_trigger_evaluation_model.py | 23 +
...t_test_tool_call_evaluation_model_input.py | 6 +
..._test_tool_call_evaluation_model_output.py | 6 +
src/elevenlabs/types/unix_timestamp.py | 3 +
src/elevenlabs/types/webhook_http_method.py | 5 +
.../whats_app_call_permission_request.py | 3 +
.../types/whats_app_conversation_info.py | 4 +
.../types/whats_app_opening_message.py | 33 +
src/elevenlabs/types/widget_config.py | 5 +
.../types/widget_config_response.py | 5 +
src/elevenlabs/types/working_hours.py | 25 +
.../types/workspace_group_permission.py | 1 +
src/elevenlabs/types/workspace_now.py | 35 +
.../types/receive_dubbing_stream_message.py | 37 -
.../types/send_dubbing_stream_message.py | 8 -
.../types/text_to_dialogue_input_format.py | 7 -
.../types/text_to_dialogue_output_format.py | 7 -
235 files changed, 24071 insertions(+), 515 deletions(-)
create mode 100644 LICENSE
rename src/elevenlabs/{v_1_dubbing_realtime/types => reception}/__init__.py (52%)
create mode 100644 src/elevenlabs/reception/billing/__init__.py
create mode 100644 src/elevenlabs/reception/billing/client.py
create mode 100644 src/elevenlabs/reception/billing/raw_client.py
create mode 100644 src/elevenlabs/reception/business_profile/__init__.py
create mode 100644 src/elevenlabs/reception/business_profile/client.py
create mode 100644 src/elevenlabs/reception/business_profile/raw_client.py
create mode 100644 src/elevenlabs/reception/client.py
create mode 100644 src/elevenlabs/reception/holidays/__init__.py
create mode 100644 src/elevenlabs/reception/holidays/client.py
create mode 100644 src/elevenlabs/reception/holidays/raw_client.py
create mode 100644 src/elevenlabs/reception/knowledge_sources/__init__.py
create mode 100644 src/elevenlabs/reception/knowledge_sources/client.py
create mode 100644 src/elevenlabs/reception/knowledge_sources/raw_client.py
create mode 100644 src/elevenlabs/reception/locations/__init__.py
create mode 100644 src/elevenlabs/reception/locations/client.py
create mode 100644 src/elevenlabs/reception/locations/raw_client.py
create mode 100644 src/elevenlabs/reception/phone_numbers/__init__.py
create mode 100644 src/elevenlabs/reception/phone_numbers/client.py
create mode 100644 src/elevenlabs/reception/phone_numbers/raw_client.py
create mode 100644 src/elevenlabs/reception/raw_client.py
rename src/elevenlabs/{v_1_dubbing_realtime => reception/receptionists}/__init__.py (66%)
create mode 100644 src/elevenlabs/reception/receptionists/client.py
create mode 100644 src/elevenlabs/reception/receptionists/procedures/__init__.py
create mode 100644 src/elevenlabs/reception/receptionists/procedures/client.py
create mode 100644 src/elevenlabs/reception/receptionists/procedures/raw_client.py
create mode 100644 src/elevenlabs/reception/receptionists/raw_client.py
create mode 100644 src/elevenlabs/reception/receptionists/rules/__init__.py
create mode 100644 src/elevenlabs/reception/receptionists/rules/client.py
create mode 100644 src/elevenlabs/reception/receptionists/rules/raw_client.py
create mode 100644 src/elevenlabs/reception/receptionists/transfer_rules/__init__.py
create mode 100644 src/elevenlabs/reception/receptionists/transfer_rules/client.py
create mode 100644 src/elevenlabs/reception/receptionists/transfer_rules/raw_client.py
create mode 100644 src/elevenlabs/reception/services/__init__.py
create mode 100644 src/elevenlabs/reception/services/client.py
create mode 100644 src/elevenlabs/reception/services/raw_client.py
create mode 100644 src/elevenlabs/reception/staff/__init__.py
create mode 100644 src/elevenlabs/reception/staff/client.py
create mode 100644 src/elevenlabs/reception/staff/raw_client.py
create mode 100644 src/elevenlabs/reception/subscriptions/__init__.py
create mode 100644 src/elevenlabs/reception/subscriptions/client.py
create mode 100644 src/elevenlabs/reception/subscriptions/raw_client.py
create mode 100644 src/elevenlabs/reception/tiers/__init__.py
create mode 100644 src/elevenlabs/reception/tiers/client.py
create mode 100644 src/elevenlabs/reception/tiers/raw_client.py
create mode 100644 src/elevenlabs/reception/workspaces/__init__.py
create mode 100644 src/elevenlabs/reception/workspaces/client.py
create mode 100644 src/elevenlabs/reception/workspaces/raw_client.py
rename src/elevenlabs/types/{dubbing_audio.py => add_url_request.py} (75%)
create mode 100644 src/elevenlabs/types/agent_rule.py
create mode 100644 src/elevenlabs/types/application_number_type.py
create mode 100644 src/elevenlabs/types/appointment_reminder_mode.py
create mode 100644 src/elevenlabs/types/assign_reseller_tier_request.py
create mode 100644 src/elevenlabs/types/assign_reseller_tier_request_billing_period.py
create mode 100644 src/elevenlabs/types/cal_com_connection_health_status.py
create mode 100644 src/elevenlabs/types/calendly_connection_health_status.py
create mode 100644 src/elevenlabs/types/country_code.py
create mode 100644 src/elevenlabs/types/customer_facing_config_input.py
create mode 100644 src/elevenlabs/types/customer_facing_config_output.py
create mode 100644 src/elevenlabs/types/customer_facing_config_patch.py
create mode 100644 src/elevenlabs/types/date_model.py
create mode 100644 src/elevenlabs/types/day_of_week.py
delete mode 100644 src/elevenlabs/types/dubbing_input_audio_chunk.py
delete mode 100644 src/elevenlabs/types/dubbing_input_error.py
delete mode 100644 src/elevenlabs/types/dubbing_invalid_request_error.py
delete mode 100644 src/elevenlabs/types/dubbing_partial_transcript.py
delete mode 100644 src/elevenlabs/types/dubbing_queue_overflow_error.py
delete mode 100644 src/elevenlabs/types/dubbing_rate_limited_error.py
delete mode 100644 src/elevenlabs/types/dubbing_session_started.py
delete mode 100644 src/elevenlabs/types/dubbing_status.py
delete mode 100644 src/elevenlabs/types/dubbing_status_status.py
delete mode 100644 src/elevenlabs/types/dubbing_transcriber_error.py
delete mode 100644 src/elevenlabs/types/dubbing_translation.py
delete mode 100644 src/elevenlabs/types/dubbing_translation_error.py
create mode 100644 src/elevenlabs/types/email_optional.py
create mode 100644 src/elevenlabs/types/holiday_response_model.py
create mode 100644 src/elevenlabs/types/holiday_type.py
create mode 100644 src/elevenlabs/types/ingest_failure.py
create mode 100644 src/elevenlabs/types/intake_question_kind.py
create mode 100644 src/elevenlabs/types/internal_kb_crawl_page_timing.py
create mode 100644 src/elevenlabs/types/knowledge_source_status.py
create mode 100644 src/elevenlabs/types/knowledge_source_type.py
create mode 100644 src/elevenlabs/types/lenient_country.py
create mode 100644 src/elevenlabs/types/lenient_currency.py
create mode 100644 src/elevenlabs/types/lenient_optional_bool.py
create mode 100644 src/elevenlabs/types/lenient_optional_str.py
create mode 100644 src/elevenlabs/types/lenient_phone.py
create mode 100644 src/elevenlabs/types/lenient_state.py
create mode 100644 src/elevenlabs/types/lenient_vertical.py
create mode 100644 src/elevenlabs/types/location_response.py
create mode 100644 src/elevenlabs/types/mcp_transport.py
create mode 100644 src/elevenlabs/types/phone_number.py
create mode 100644 src/elevenlabs/types/phone_number_nullable.py
create mode 100644 src/elevenlabs/types/phone_number_optional.py
create mode 100644 src/elevenlabs/types/pricing_mode.py
create mode 100644 src/elevenlabs/types/processing_progress.py
create mode 100644 src/elevenlabs/types/promotion_target.py
create mode 100644 src/elevenlabs/types/provision_reseller_workspace_response.py
create mode 100644 src/elevenlabs/types/provision_reseller_workspace_subscription.py
create mode 100644 src/elevenlabs/types/provision_reseller_workspace_subscription_billing_period.py
create mode 100644 src/elevenlabs/types/raw_business_info.py
create mode 100644 src/elevenlabs/types/raw_item.py
create mode 100644 src/elevenlabs/types/raw_location_info.py
create mode 100644 src/elevenlabs/types/reseller_invoice_detail.py
create mode 100644 src/elevenlabs/types/reseller_invoice_line.py
create mode 100644 src/elevenlabs/types/reseller_invoice_line_kind.py
create mode 100644 src/elevenlabs/types/reseller_invoice_status.py
create mode 100644 src/elevenlabs/types/reseller_invoice_summary.py
rename src/elevenlabs/types/{dubbing_committed_transcript.py => reseller_invoices_response.py} (66%)
create mode 100644 src/elevenlabs/types/reseller_tier_response.py
create mode 100644 src/elevenlabs/types/reseller_upcoming_payment.py
rename src/elevenlabs/types/{dubbing_audio_output_error.py => reseller_upcoming_payments_response.py} (74%)
create mode 100644 src/elevenlabs/types/reseller_workspace_subscription.py
create mode 100644 src/elevenlabs/types/reseller_workspace_subscription_billing_period.py
create mode 100644 src/elevenlabs/types/reseller_workspace_summary.py
create mode 100644 src/elevenlabs/types/reseller_workspaces_response.py
create mode 100644 src/elevenlabs/types/rule_priority.py
create mode 100644 src/elevenlabs/types/service_location_type.py
rename src/elevenlabs/types/{dubbing_end_of_stream.py => service_update_response.py} (73%)
create mode 100644 src/elevenlabs/types/smb_add_on.py
create mode 100644 src/elevenlabs/types/smb_agent_info_response.py
create mode 100644 src/elevenlabs/types/smb_agent_info_response_currency.py
create mode 100644 src/elevenlabs/types/smb_agent_target.py
create mode 100644 src/elevenlabs/types/smb_asset_scrapable.py
create mode 100644 src/elevenlabs/types/smb_create_agent_rule_request.py
create mode 100644 src/elevenlabs/types/smb_create_holiday_request.py
create mode 100644 src/elevenlabs/types/smb_create_procedure_request.py
create mode 100644 src/elevenlabs/types/smb_create_service_request.py
create mode 100644 src/elevenlabs/types/smb_create_staff_request.py
create mode 100644 src/elevenlabs/types/smb_create_transfer_rule_request.py
create mode 100644 src/elevenlabs/types/smb_customer_facing_agent.py
create mode 100644 src/elevenlabs/types/smb_customer_facing_agent_deactivation_reason.py
create mode 100644 src/elevenlabs/types/smb_customer_facing_agent_response.py
create mode 100644 src/elevenlabs/types/smb_group_membership.py
create mode 100644 src/elevenlabs/types/smb_identity_verification_config.py
create mode 100644 src/elevenlabs/types/smb_intake_question.py
create mode 100644 src/elevenlabs/types/smb_knowledge_source_db_model.py
create mode 100644 src/elevenlabs/types/smb_location_deactivation_reason.py
create mode 100644 src/elevenlabs/types/smb_location_input.py
create mode 100644 src/elevenlabs/types/smb_location_output.py
create mode 100644 src/elevenlabs/types/smb_location_request.py
create mode 100644 src/elevenlabs/types/smb_location_request_patch.py
create mode 100644 src/elevenlabs/types/smb_notification_channel.py
create mode 100644 src/elevenlabs/types/smb_phone_assignment_db_model.py
create mode 100644 src/elevenlabs/types/smb_phone_assignment_db_model_provider.py
create mode 100644 src/elevenlabs/types/smb_phone_assignment_deactivation_reason.py
create mode 100644 src/elevenlabs/types/smb_phone_regulatory_status.py
create mode 100644 src/elevenlabs/types/smb_procedure.py
create mode 100644 src/elevenlabs/types/smb_product_scrapable.py
create mode 100644 src/elevenlabs/types/smb_scraping_mode.py
create mode 100644 src/elevenlabs/types/smb_service_db_model.py
create mode 100644 src/elevenlabs/types/smb_service_kind.py
create mode 100644 src/elevenlabs/types/smb_service_promotion.py
create mode 100644 src/elevenlabs/types/smb_service_scrapable.py
create mode 100644 src/elevenlabs/types/smb_service_variant.py
create mode 100644 src/elevenlabs/types/smb_sip_media_encryption.py
create mode 100644 src/elevenlabs/types/smb_sip_transport.py
create mode 100644 src/elevenlabs/types/smb_staff_resource_db_model.py
create mode 100644 src/elevenlabs/types/smb_staff_scrapable.py
create mode 100644 src/elevenlabs/types/smb_tier_economics.py
create mode 100644 src/elevenlabs/types/smb_transfer_rule.py
create mode 100644 src/elevenlabs/types/smb_turn_eagerness.py
create mode 100644 src/elevenlabs/types/smb_update_agent_info_request.py
create mode 100644 src/elevenlabs/types/smb_update_agent_info_request_currency.py
create mode 100644 src/elevenlabs/types/smb_update_agent_rule_request.py
create mode 100644 src/elevenlabs/types/smb_update_holiday_request_patch.py
create mode 100644 src/elevenlabs/types/smb_update_procedure_request.py
create mode 100644 src/elevenlabs/types/smb_update_service_request_patch.py
create mode 100644 src/elevenlabs/types/smb_update_staff_request_patch.py
create mode 100644 src/elevenlabs/types/smb_update_transfer_rule_request.py
create mode 100644 src/elevenlabs/types/smb_vertical.py
create mode 100644 src/elevenlabs/types/smb_widget_appearance.py
create mode 100644 src/elevenlabs/types/smb_widget_appearance_placement.py
create mode 100644 src/elevenlabs/types/smb_widget_appearance_variant.py
create mode 100644 src/elevenlabs/types/sms_template_style.py
create mode 100644 src/elevenlabs/types/stripped_str.py
create mode 100644 src/elevenlabs/types/supported_lang.py
create mode 100644 src/elevenlabs/types/team_invite_outcome.py
rename src/elevenlabs/types/{dubbing_auth_error.py => team_invite_request.py} (74%)
create mode 100644 src/elevenlabs/types/team_invite_request_role.py
create mode 100644 src/elevenlabs/types/team_invite_result.py
create mode 100644 src/elevenlabs/types/time_off_type.py
create mode 100644 src/elevenlabs/types/time_range_model.py
create mode 100644 src/elevenlabs/types/unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6.py
create mode 100644 src/elevenlabs/types/unit_test_guardrail_trigger_evaluation_model.py
create mode 100644 src/elevenlabs/types/unix_timestamp.py
create mode 100644 src/elevenlabs/types/webhook_http_method.py
create mode 100644 src/elevenlabs/types/whats_app_opening_message.py
create mode 100644 src/elevenlabs/types/working_hours.py
create mode 100644 src/elevenlabs/types/workspace_now.py
delete mode 100644 src/elevenlabs/v_1_dubbing_realtime/types/receive_dubbing_stream_message.py
delete mode 100644 src/elevenlabs/v_1_dubbing_realtime/types/send_dubbing_stream_message.py
delete mode 100644 src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_input_format.py
delete mode 100644 src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_output_format.py
diff --git a/.fern/metadata.json b/.fern/metadata.json
index 9b2688c3c..1e43c9442 100644
--- a/.fern/metadata.json
+++ b/.fern/metadata.json
@@ -55,6 +55,6 @@
}
]
},
- "originGitCommit": "4a193ac760ee34f1f5f2eef5781ba50e38ce23e7",
- "sdkVersion": "2.75.0"
+ "originGitCommit": "f3313550b228fcf4ef3fe18e38965b8d33853367",
+ "sdkVersion": "2.76.0"
}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..9c2993025
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Elevenlabs.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index b27e2d0d0..376891580 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ dynamic = ["version"]
[tool.poetry]
name = "elevenlabs"
-version = "2.75.0"
+version = "2.76.0"
description = ""
readme = "README.md"
authors = []
diff --git a/reference.md b/reference.md
index aca1eafb3..12129152a 100644
--- a/reference.md
+++ b/reference.md
@@ -8478,7 +8478,7 @@ client.speech_to_text.convert(
-
-**no_verbatim:** `typing.Optional[bool]` — If true, the transcription will not have any filler words, false starts and non-speech sounds. Only supported with scribe_v2 model.
+**no_verbatim:** `typing.Optional[bool]` — If true, the transcription will not have any filler words, false starts and non-speech sounds.
@@ -14848,6 +14848,14 @@ client.conversational_ai.triage_tickets.update(
-
+**qa_comment:** `typing.Optional[str]` — If provided, updates the ticket description. Omit to leave unchanged.
+
+
+
+
+
+-
+
**status:** `typing.Optional[AgentConversationTicketStatus]` — If provided, updates the ticket status. Omit to leave unchanged.
@@ -25228,7 +25236,7 @@ client.conversational_ai.knowledge_base.documents.delete(
-
-Update the name and/or content of a document.
+Update the name, content and/or auto-sync settings of a document.
@@ -25292,6 +25300,38 @@ client.conversational_ai.knowledge_base.documents.update(
-
+**enable_auto_sync:** `typing.Optional[bool]` — Whether the document or folder is refreshed automatically. Only applicable to URL documents, folders, and externally-synced files. Leave unset to keep the current value.
+
+
+
+
+
+-
+
+**auto_remove:** `typing.Optional[bool]` — Whether to automatically remove the document once its source is no longer available. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+
+
+
+
+-
+
+**minimum_frequency_days:** `typing.Optional[int]` — Minimum frequency (in days) at which the document is refreshed. The actual interval may be shorter, never longer. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+
+
+
+
+-
+
+**tighten_only:** `typing.Optional[bool]` — Folders only. When true, items already in the folder are only tightened to stay at least as strict as the folder, and keep any setting that is stricter than the folder's. When false, they are set to exactly the folder's auto-sync settings. Ignored for externally synced folders, whose contents always follow the folder's schedule.
+
+
+
+
+
+-
+
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -28010,6 +28050,7 @@ client = ElevenLabs(
client.conversational_ai.tests.invocations.list(
agent_id="agent_id",
branch_id="branch_id",
+ created_by_user_id="created_by_user_id",
test_id="test_id",
start_time=1,
end_time=1,
@@ -28049,6 +28090,14 @@ client.conversational_ai.tests.invocations.list(
-
+**created_by_user_id:** `typing.Optional[str]` — Filter by test run creator user ID
+
+
+
+
+
+-
+
**test_id:** `typing.Optional[str]` — Filter to invocations that include a run of this test id
@@ -34644,6 +34693,4698 @@ client.pronunciation_dictionaries.rules.remove(
+
+
+
+
+## Reception Services
+client.reception.services.list(...) -> typing.List[SmbServiceDbModel]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get all services for the current workspace with optional filters
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.services.list(
+ staff_id="staff_id",
+ asset_id="asset_id",
+ is_active=True,
+ kind="classic",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**staff_id:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**asset_id:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**is_active:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**kind:** `typing.Optional[SmbServiceKind]`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.services.create(...) -> SmbServiceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create a new service
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbCreateServiceRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.services.create(
+ request=SmbCreateServiceRequest(
+ name="name",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request:** `SmbCreateServiceRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.services.get(...) -> SmbServiceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get a specific service by ID
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.services.get(
+ service_id="service_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**service_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.services.update(...) -> ServiceUpdateResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update an existing service. Only the fields sent are changed.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateServiceRequestPatch
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.services.update(
+ service_id="service_id",
+ request=SmbUpdateServiceRequestPatch(),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**service_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateServiceRequestPatch`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.services.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a service
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.services.delete(
+ service_id="service_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**service_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.services.confirm_update(...) -> ServiceUpdateResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Save a service update after user confirmed price impact. Optionally reprice future events.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateServiceRequestPatch
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.services.confirm_update(
+ service_id="service_id",
+ reprice=True,
+ request=SmbUpdateServiceRequestPatch(),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**service_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateServiceRequestPatch`
+
+
+
+
+
+-
+
+**reprice:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Staff
+client.reception.staff.list(...) -> typing.List[SmbStaffResourceDbModel]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get all staff for the current workspace
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.staff.list()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.staff.create(...) -> SmbStaffResourceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create a new staff member
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbCreateStaffRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.staff.create(
+ request=SmbCreateStaffRequest(
+ name="name",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request:** `SmbCreateStaffRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.staff.get(...) -> SmbStaffResourceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get a specific staff member by ID
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.staff.get(
+ staff_id="staff_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**staff_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.staff.update(...) -> SmbStaffResourceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update an existing staff member. Only the fields sent are changed.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateStaffRequestPatch
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.staff.update(
+ staff_id="staff_id",
+ request=SmbUpdateStaffRequestPatch(),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**staff_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateStaffRequestPatch`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.staff.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a staff member
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.staff.delete(
+ staff_id="staff_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**staff_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Receptionists
+client.reception.receptionists.list(...) -> typing.List[SmbCustomerFacingAgentResponse]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List every customer-facing receptionist for the workspace.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.list()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.update(...) -> SmbCustomerFacingAgentResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update a receptionist's display name, config and/or widget appearance.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.update(
+ agent_id="agent_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**config:** `typing.Optional[CustomerFacingConfigPatch]`
+
+
+
+
+
+-
+
+**name:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**widget:** `typing.Optional[SmbWidgetAppearance]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.activate(...) -> SmbCustomerFacingAgentResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Re-activate a deactivated receptionist. Subject to the workspace's tier cap; raises ``quota_exceeded`` if no active slot is free.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.activate(
+ agent_id="agent_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception PhoneNumbers
+client.reception.phone_numbers.list(...) -> typing.List[SmbPhoneAssignmentDbModel]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List the workspace's phone numbers and the receptionist each one rings. A number with no `customer_facing_agent_id` is held by the workspace but not attached to a receptionist yet.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.phone_numbers.list()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.phone_numbers.create(...) -> SmbPhoneAssignmentDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Give a receptionist a phone number. A number the workspace already holds but has not attached is used first. Otherwise, in the US and Canada, a number with one of the requested `area_codes` is taken from the pool or bought, falling back to any number in the business's country. In countries that require paperwork, the number is issued right away but takes public calls only once the workspace's own registration is approved (see `accepts_public_calls`). Counts toward the plan's phone number limit, and free plans can take only a few new numbers a day. Returns 404 when no number is available and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account and none is free.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.phone_numbers.create(
+ customer_facing_agent_id="customer_facing_agent_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**customer_facing_agent_id:** `str` — The receptionist that answers calls to the number.
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**area_codes:** `typing.Optional[typing.List[str]]` — Preferred US or Canadian area codes, e.g. `["415", "628"]`. Codes outside the business's country are ignored, and any number is given when none of these is available.
+
+
+
+
+
+-
+
+**number_type:** `typing.Optional[ApplicationNumberType]` — Local or mobile, in a country that requires paperwork before a number takes calls. Leave unset to try mobile first. Ignored in the US and Canada.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.phone_numbers.delete(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Remove a phone number from the workspace. A pool number goes back to the pool it came from. A number the business brought from its own Twilio account, or one issued in a country that requires paperwork, is released at Twilio and cannot be recovered. Returns 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.phone_numbers.delete(
+ phone_assignment_id="phone_assignment_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**phone_assignment_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.phone_numbers.update(...) -> SmbPhoneAssignmentDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Move a phone number to a different receptionist in the same workspace, which answers its calls from then on. Returns 409 `phone_number_not_attached` for a number no receptionist answers yet (attach it with `POST /v1/smb/phone-numbers/assignments`), and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.phone_numbers.update(
+ phone_assignment_id="phone_assignment_id",
+ customer_facing_agent_id="customer_facing_agent_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**phone_assignment_id:** `str`
+
+
+
+
+
+-
+
+**customer_facing_agent_id:** `str` — The receptionist that answers calls to the number from now on.
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Holidays
+client.reception.holidays.list(...) -> typing.List[HolidayResponseModel]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get all holidays/time-off entries for the current workspace with optional filters
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.holidays.list(
+ start_unix=1,
+ end_unix=1,
+ time_off_type="staff",
+ resource_id="resource_id",
+ location_id="location_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**start_unix:** `typing.Optional[int]` — Filter entries overlapping from this timestamp
+
+
+
+
+
+-
+
+**end_unix:** `typing.Optional[int]` — Filter entries overlapping before this timestamp
+
+
+
+
+
+-
+
+**time_off_type:** `typing.Optional[TimeOffType]` — Filter by type: location, staff, or asset
+
+
+
+
+
+-
+
+**resource_id:** `typing.Optional[str]` — Filter by associated resource ID (staff/asset)
+
+
+
+
+
+-
+
+**location_id:** `typing.Optional[str]` — Filter by location ID
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.holidays.create(...) -> HolidayResponseModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create a new holiday
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbCreateHolidayRequest, DateModel
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.holidays.create(
+ request=SmbCreateHolidayRequest(
+ name="name",
+ start_date=DateModel(
+ year=1,
+ month=1,
+ day=1,
+ ),
+ end_date=DateModel(
+ year=1,
+ month=1,
+ day=1,
+ ),
+ time_off_type="staff",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request:** `SmbCreateHolidayRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.holidays.get(...) -> HolidayResponseModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get a specific holiday by ID
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.holidays.get(
+ holiday_id="holiday_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**holiday_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.holidays.update(...) -> HolidayResponseModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update an existing holiday. Only the fields sent are changed.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateHolidayRequestPatch
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.holidays.update(
+ holiday_id="holiday_id",
+ request=SmbUpdateHolidayRequestPatch(),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**holiday_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateHolidayRequestPatch`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.holidays.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a holiday
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.holidays.delete(
+ holiday_id="holiday_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**holiday_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Locations
+client.reception.locations.list(...) -> typing.List[LocationResponse]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List all business locations.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.locations.list()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.locations.create(...) -> LocationResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Add a new business location.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbLocationRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.locations.create(
+ request=SmbLocationRequest(
+ name="name",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request:** `SmbLocationRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.locations.get(...) -> LocationResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get a single location by ID.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.locations.get(
+ location_id="location_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**location_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.locations.update(...) -> LocationResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update an existing location. Only the fields sent are changed.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbLocationRequestPatch
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.locations.update(
+ location_id="location_id",
+ request=SmbLocationRequestPatch(),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**location_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbLocationRequestPatch`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.locations.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a location.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.locations.delete(
+ location_id="location_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**location_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception BusinessProfile
+client.reception.business_profile.get(...) -> SmbAgentInfoResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get all agent-affecting configuration with current workspace time
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.business_profile.get()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.business_profile.update(...) -> SmbAgentInfoResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update all agent-affecting configuration (triggers agent regeneration)
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateAgentInfoRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.business_profile.update(
+ request=SmbUpdateAgentInfoRequest(),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request:** `SmbUpdateAgentInfoRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception KnowledgeSources
+client.reception.knowledge_sources.list(...) -> typing.List[SmbKnowledgeSourceDbModel]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List all knowledge sources for the current workspace
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.knowledge_sources.list()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.knowledge_sources.upload(...) -> SmbKnowledgeSourceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Upload a file as a knowledge source
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.knowledge_sources.upload(
+ file="example_file",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**file:** `core.File`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.knowledge_sources.get(...) -> SmbKnowledgeSourceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get a specific knowledge source by ID
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.knowledge_sources.get(
+ source_id="source_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**source_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.knowledge_sources.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a knowledge source
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.knowledge_sources.delete(
+ source_id="source_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**source_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.knowledge_sources.add_url(...) -> SmbKnowledgeSourceDbModel
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Add a URL as a knowledge source
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, AddUrlRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.knowledge_sources.add_url(
+ request=AddUrlRequest(
+ url="url",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request:** `AddUrlRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Workspaces
+client.reception.workspaces.list(...) -> ResellerWorkspacesResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List workspaces attributed to the caller's reseller, with cursor-based pagination
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.workspaces.list(
+ cursor="cursor",
+ page_size=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**cursor:** `typing.Optional[str]` — Pagination cursor from previous response
+
+
+
+
+
+-
+
+**page_size:** `typing.Optional[int]` — Number of workspaces per page
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.workspaces.create(...) -> ProvisionResellerWorkspaceResponse
+
+-
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.workspaces.create(
+ business_name="business_name",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**business_name:** `str`
+
+
+
+
+
+-
+
+**subscription:** `typing.Optional[ProvisionResellerWorkspaceSubscription]` — Paid tier to subscribe to. Omitted leaves the workspace with no subscription.
+
+
+
+
+
+-
+
+**phone_number:** `typing.Optional[str]` — A free number from the reseller's phone pool, reserved for the workspace until onboarding binds it to the receptionist.
+
+
+
+
+
+-
+
+**members:** `typing.Optional[typing.List[TeamInviteRequest]]` — People to invite once the workspace exists, capped by the tier's team size. Best-effort: each outcome is in `member_results`.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Subscriptions
+client.reception.subscriptions.assign(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Subscribe a reseller-attributed workspace to one of the reseller's tiers
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, AssignResellerTierRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.subscriptions.assign(
+ workspace_id="workspace_id",
+ request=AssignResellerTierRequest(
+ tier_id="tier_id",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**workspace_id:** `str`
+
+
+
+
+
+-
+
+**request:** `AssignResellerTierRequest`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.subscriptions.unassign(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+End a reseller-attributed workspace's subscription at the end of the current billing period
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.subscriptions.unassign(
+ workspace_id="workspace_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**workspace_id:** `str`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.subscriptions.change(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Move a reseller-attributed workspace between the reseller's tiers. Upgrades apply immediately; downgrades and lateral moves take effect at the end of the billing period.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, AssignResellerTierRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.subscriptions.change(
+ workspace_id="workspace_id",
+ request=AssignResellerTierRequest(
+ tier_id="tier_id",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**workspace_id:** `str`
+
+
+
+
+
+-
+
+**request:** `AssignResellerTierRequest`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.subscriptions.restore(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Undo a pending unassignment so the subscription renews normally
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.subscriptions.restore(
+ workspace_id="workspace_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**workspace_id:** `str`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.subscriptions.cancel_pending_downgrade(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Drop a scheduled downgrade, leaving the workspace on its current tier
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.subscriptions.cancel_pending_downgrade(
+ workspace_id="workspace_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**workspace_id:** `str`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Tiers
+client.reception.tiers.list() -> typing.List[ResellerTierResponse]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+The reseller's live tier ladder, lowest rank first. The first entry is the trial. Without tier management the rest are the builtin tiers. Retired tiers are omitted
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.tiers.list()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Billing
+client.reception.billing.list_invoices(...) -> ResellerInvoicesResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List the invoices charged to the reseller's card, newest first, one per workspace invoice
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.billing.list_invoices(
+ cursor="cursor",
+ page_size=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**cursor:** `typing.Optional[str]` — Pagination cursor from previous response
+
+
+
+
+
+-
+
+**page_size:** `typing.Optional[int]` — Number of invoices per page
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.billing.get_invoice(...) -> ResellerInvoiceDetail
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get one invoice charged to the reseller's card, broken down into the workspace invoice's lines
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.billing.get_invoice(
+ invoice_id="invoice_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**invoice_id:** `str`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.billing.list_upcoming_payments() -> ResellerUpcomingPaymentsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List the next workspace renewals the reseller's card will be charged for, soonest first
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.billing.list_upcoming_payments()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Receptionists Rules
+client.reception.receptionists.rules.create(...) -> AgentRule
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Add a behavioral rule to the named receptionist.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbCreateAgentRuleRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.rules.create(
+ agent_id="agent_id",
+ request=SmbCreateAgentRuleRequest(
+ title="title",
+ description="description",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbCreateAgentRuleRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.rules.update(...) -> AgentRule
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Replace an existing rule on the named receptionist. Send every field: an omitted `priority` resets to `strict`.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateAgentRuleRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.rules.update(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ request=SmbUpdateAgentRuleRequest(
+ title="title",
+ description="description",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**rule_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateAgentRuleRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.rules.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a rule from the named receptionist.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.rules.delete(
+ agent_id="agent_id",
+ rule_id="rule_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**rule_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Receptionists Procedures
+client.reception.receptionists.procedures.list(...) -> typing.List[SmbProcedure]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List the procedures (SOPs) the named receptionist can run on calls.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.procedures.list(
+ agent_id="agent_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.procedures.create(...) -> SmbProcedure
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Add a procedure (SOP) to the named receptionist.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbCreateProcedureRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.procedures.create(
+ agent_id="agent_id",
+ request=SmbCreateProcedureRequest(
+ name="name",
+ trigger="trigger",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbCreateProcedureRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.procedures.update(...) -> SmbProcedure
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Replace an existing procedure on the named receptionist. Send every field: an omitted `body` resets to empty.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateProcedureRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.procedures.update(
+ agent_id="agent_id",
+ procedure_id="procedure_id",
+ request=SmbUpdateProcedureRequest(
+ name="name",
+ trigger="trigger",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**procedure_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateProcedureRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.procedures.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a procedure from the named receptionist.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.procedures.delete(
+ agent_id="agent_id",
+ procedure_id="procedure_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**procedure_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Reception Receptionists TransferRules
+client.reception.receptionists.transfer_rules.create(...) -> SmbTransferRule
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Add a phone forwarding rule to the named receptionist.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbCreateTransferRuleRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.transfer_rules.create(
+ agent_id="agent_id",
+ request=SmbCreateTransferRuleRequest(
+ label="label",
+ phone_number="phone_number",
+ condition="condition",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbCreateTransferRuleRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.transfer_rules.update(...) -> SmbTransferRule
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Replace an existing transfer rule on the named receptionist. Send every field: an omitted `post_dial_digits` clears it.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs, SmbUpdateTransferRuleRequest
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.transfer_rules.update(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ request=SmbUpdateTransferRuleRequest(
+ label="label",
+ phone_number="phone_number",
+ condition="condition",
+ ),
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**rule_id:** `str`
+
+
+
+
+
+-
+
+**request:** `SmbUpdateTransferRuleRequest`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.reception.receptionists.transfer_rules.delete(...) -> typing.Dict[str, str]
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a transfer rule from the named receptionist.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from elevenlabs import ElevenLabs
+from elevenlabs.environment import ElevenLabsEnvironment
+
+client = ElevenLabs(
+ environment=ElevenLabsEnvironment.PRODUCTION,
+)
+
+client.reception.receptionists.transfer_rules.delete(
+ agent_id="agent_id",
+ rule_id="rule_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**agent_id:** `str`
+
+
+
+
+
+-
+
+**rule_id:** `str`
+
+
+
+
+
+-
+
+**xi_workspace_id:** `typing.Optional[str]` — The customer workspace a reseller's API key acts on.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
@@ -34847,7 +39588,7 @@ client.service_accounts.api_keys.create(
-
-**expires_at_unix:** `typing.Optional[int]` — Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+**expires_at_unix:** `typing.Optional[int]` — Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
@@ -35089,7 +39830,7 @@ client.service_accounts.api_keys.update(
-
-**expires_at_unix:** `typing.Optional[BodyEditServiceAccountApiKeyV1ServiceAccountsServiceAccountUserIdApiKeysApiKeyIdPatchExpiresAtUnix]` — Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+**expires_at_unix:** `typing.Optional[BodyEditServiceAccountApiKeyV1ServiceAccountsServiceAccountUserIdApiKeysApiKeyIdPatchExpiresAtUnix]` — Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
diff --git a/src/elevenlabs/__init__.py b/src/elevenlabs/__init__.py
index 12d645db5..48a1bc9d1 100644
--- a/src/elevenlabs/__init__.py
+++ b/src/elevenlabs/__init__.py
@@ -19,6 +19,7 @@
AddPronunciationDictionaryResponseModel,
AddPronunciationDictionaryResponseModelPermissionOnResource,
AddSharingVoiceRequest,
+ AddUrlRequest,
AddVoiceIvcResponseModel,
AddVoiceResponseModel,
AddVoiceToUserVoiceCollectionResponseModel,
@@ -82,6 +83,7 @@
AgentPlatformSettingsResponseModel,
AgentQueueingConfig,
AgentResponsePayload,
+ AgentRule,
AgentSimulatedChatTestResponseModel,
AgentSmbMetadata,
AgentSortBy,
@@ -173,6 +175,8 @@
ApiIntegrationWebhookOverridesSchemaOverridesValue_Omit,
ApiIntegrationWebhookToolConfigInput,
ApiIntegrationWebhookToolConfigOutput,
+ ApplicationNumberType,
+ AppointmentReminderMode,
ArchitectDispatchResponseModel,
ArrayJsonSchemaPropertyInput,
ArrayJsonSchemaPropertyInputItems,
@@ -192,6 +196,8 @@
AssetTranscription,
AssetTranscriptionData,
AssetTranscriptionStatus,
+ AssignResellerTierRequest,
+ AssignResellerTierRequestBillingPeriod,
AssignableUserResponseModel,
AstAdditionOperatorNodeInput,
AstAdditionOperatorNodeOutput,
@@ -371,6 +377,8 @@
BytedanceSeedream5ProRequest,
BytedanceSeedream5ProRequestAspectRatio,
BytedanceSeedream5ProRequestResolution,
+ CalComConnectionHealthStatus,
+ CalendlyConnectionHealthStatus,
CallResult,
CampaignConversationType,
CancelCalendarEventParams,
@@ -645,6 +653,7 @@
ConversationalConfigApiModelWorkflowOverrideOutput,
ConvertChapterResponseModel,
ConvertProjectResponseModel,
+ CountryCode,
CrawlStatus,
CrawlType,
CreateAgentBranchResponseModel,
@@ -719,10 +728,15 @@
CustomLlmapiType,
CustomSipHeader,
CustomSipHeaderWithDynamicVariable,
+ CustomerFacingConfigInput,
+ CustomerFacingConfigOutput,
+ CustomerFacingConfigPatch,
DashboardCallSuccessChartModel,
DashboardCriteriaChartModel,
DashboardDataCollectionChartModel,
DataCollectionResultCommonModel,
+ DateModel,
+ DayOfWeek,
DefaultSharingGroupConfig,
DefaultSharingGroupConfigPermissionLevel,
DefaultSharingGroupResponseModel,
@@ -786,17 +800,9 @@
DtmfInputConfig,
DubOrderItemRequest,
DubbedSegment,
- DubbingAudio,
- DubbingAudioOutputError,
- DubbingAuthError,
DubbingBulkSourceSegmentUpdateResponse,
DubbingBulkTargetSegmentUpdateResponse,
- DubbingCommittedTranscript,
- DubbingEndOfStream,
DubbingError,
- DubbingInputAudioChunk,
- DubbingInputError,
- DubbingInvalidRequestError,
DubbingLanguageListResponse,
DubbingLanguageOutputs,
DubbingLanguageResponse,
@@ -805,28 +811,21 @@
DubbingMediaReference,
DubbingMetadataPageResponseModel,
DubbingMetadataResponse,
- DubbingPartialTranscript,
DubbingProjectListResponse,
DubbingProjectResponse,
DubbingProjectResponseStatus,
- DubbingQueueOverflowError,
- DubbingRateLimitedError,
DubbingRegenerateResponse,
DubbingReleaseChannel,
DubbingRenderResponseModel,
DubbingResource,
DubbingSegmentUpdateRequest,
- DubbingSessionStarted,
DubbingSourceMediaInfo,
DubbingSourceSegmentUpdateResponse,
DubbingSourceTranscriptResponse,
- DubbingStatus,
- DubbingStatusStatus,
DubbingTargetSegmentUpdateRequest,
DubbingTargetSegmentUpdateResponse,
DubbingTargetTranscriptResponse,
DubbingTargetTranscriptSegment,
- DubbingTranscriberError,
DubbingTranscript,
DubbingTranscriptCharacter,
DubbingTranscriptResponseModel,
@@ -836,8 +835,6 @@
DubbingTranscriptWord,
DubbingTranscriptsResponseModel,
DubbingTranscriptsResponseModelTranscriptFormat,
- DubbingTranslation,
- DubbingTranslationError,
DummyToolResultModel,
DuplicateSpeechEngineRequest,
DynamicVariableAssignment,
@@ -865,6 +862,7 @@
ElevenV3Request,
ElevenV3RequestOutputFormat,
ElevenV3VoiceSettings,
+ EmailOptional,
EmbedVariant,
EmbeddingModelEnum,
EndCallToolConfig,
@@ -1111,6 +1109,8 @@
HistoryAlignmentResponseModel,
HistoryAlignmentsResponseModel,
HistoryItemResponse,
+ HolidayResponseModel,
+ HolidayType,
HtmlExportOptions,
HttpRequestModel,
HttpValidationError,
@@ -1139,6 +1139,7 @@
ImageSchema,
ImageSubject,
InboundSipTrunkConfigRequestModel,
+ IngestFailure,
InitPayload,
InitialiseContext,
InitializeConnection,
@@ -1152,10 +1153,12 @@
InlineVideoReference,
InlineVideoReferenceMimeType,
InputAudioChunkPayload,
+ IntakeQuestionKind,
IntegerSchema,
IntegrationType,
InteractionBudget,
InternalAlertingWebhookNotifier,
+ InternalKbCrawlPageTiming,
InternalSamplingConfigResponseModel,
InvoiceResponse,
InvoiceResponsePaymentIntentStatus,
@@ -1196,6 +1199,8 @@
KnowledgeBaseToolInfo,
KnowledgeBaseToolResultModel,
KnowledgeBaseToolStatus,
+ KnowledgeSourceStatus,
+ KnowledgeSourceType,
LanguageAddedResponse,
LanguageDetectionToolConfig,
LanguageDetectionToolResultModel,
@@ -1209,6 +1214,13 @@
LanguagesResponse_Pair,
LanguagesResponse_Single,
LeaveMessageParams,
+ LenientCountry,
+ LenientCurrency,
+ LenientOptionalBool,
+ LenientOptionalStr,
+ LenientPhone,
+ LenientState,
+ LenientVertical,
LibraryVoiceResponse,
LibraryVoiceResponseCategory,
ListAgentProceduresParams,
@@ -1274,6 +1286,7 @@
LlmUsageOutput,
LoadMemoryEntryToolErrorStatus,
LoadableMemoryEntry,
+ LocationResponse,
LockReason,
ManualSource,
ManualVerificationFileResponse,
@@ -1318,6 +1331,7 @@
McpToolConfigOverrideOutputInputOverridesValue_Llm,
McpToolConfigOverrideOutputInputOverridesValue_Omit,
McpToolConfigOverrideOutputToolCallSound,
+ McpTransport,
MediaCodec,
MediaGenerationCompletedResponse,
MediaGenerationCreateResponse,
@@ -1478,8 +1492,11 @@
PendingSubscriptionSwitchResponseModel,
PendingSubscriptionSwitchResponseModelNextTier,
PermissionType,
+ PhoneNumber,
PhoneNumberAgentInfo,
PhoneNumberDynamicVariableTransferDestination,
+ PhoneNumberNullable,
+ PhoneNumberOptional,
PhoneNumberSortBy,
PhoneNumberTransfer,
PhoneNumberTransferCustomSipHeadersItem,
@@ -1520,6 +1537,7 @@
PreToolSpeechMode,
PreviewAudioDbModel,
Price,
+ PricingMode,
PrivacyConfigInput,
PrivacyConfigOutput,
PrivateKeyJwtResponse,
@@ -1532,6 +1550,7 @@
ProcedureType,
ProcedureValidationError,
ProcedureVersionRef,
+ ProcessingProgress,
ProjectCreationMetaResponseModel,
ProjectCreationMetaResponseModelStatus,
ProjectCreationMetaType,
@@ -1566,6 +1585,7 @@
ProjectVideoResponseModel,
ProjectVideoThumbnailSheetResponseModel,
ProjectVoiceResponseModel,
+ PromotionTarget,
PromptAgent,
PromptAgentApiModelInput,
PromptAgentApiModelInputBackupLlmConfig,
@@ -1625,6 +1645,9 @@
PronunciationDictionaryVersionLocator,
PronunciationDictionaryVersionResponseModel,
PronunciationDictionaryVersionResponseModelPermissionOnResource,
+ ProvisionResellerWorkspaceResponse,
+ ProvisionResellerWorkspaceSubscription,
+ ProvisionResellerWorkspaceSubscriptionBillingPeriod,
PydanticPronunciationDictionaryVersionLocator,
QualityPresetType,
QueryParamsJsonSchemaInput,
@@ -1643,6 +1666,9 @@
RagIndexOverviewResponseModel,
RagIndexStatus,
RagRetrievalInfo,
+ RawBusinessInfo,
+ RawItem,
+ RawLocationInfo,
ReadLegalTerms,
ReadMetadataChapterDbModel,
ReaderResourceResponseModel,
@@ -1670,6 +1696,19 @@
RequestPvcManualVerificationResponseModel,
RequiredConstraint,
RequiredConstraints,
+ ResellerInvoiceDetail,
+ ResellerInvoiceLine,
+ ResellerInvoiceLineKind,
+ ResellerInvoiceStatus,
+ ResellerInvoiceSummary,
+ ResellerInvoicesResponse,
+ ResellerTierResponse,
+ ResellerUpcomingPayment,
+ ResellerUpcomingPaymentsResponse,
+ ResellerWorkspaceSubscription,
+ ResellerWorkspaceSubscriptionBillingPeriod,
+ ResellerWorkspaceSummary,
+ ResellerWorkspacesResponse,
ResourceAccessInfo,
ResourceAccessInfoAccessSource,
ResourceAccessInfoAnonymousAccessLevelOverride,
@@ -1686,6 +1725,7 @@
ReviewResponseModelRejectReasonsItem,
ReviewResponseModelReviewStatus,
ReviewStatus,
+ RulePriority,
SafetyCommonModelInput,
SafetyCommonModelOutput,
SafetyEvaluation,
@@ -1737,6 +1777,8 @@
SendTextMulti,
SentimentAggregate,
SentimentAnalysisSettings,
+ ServiceLocationType,
+ ServiceUpdateResponse,
SessionStartedPayload,
SessionStartedPayloadConfig,
SessionStartedPayloadConfigCommitStrategy,
@@ -1766,10 +1808,66 @@
SkipTurnToolConfig,
SkipTurnToolResponseModel,
SlackBotAuthResponse,
+ SmbAddOn,
+ SmbAgentInfoResponse,
+ SmbAgentInfoResponseCurrency,
+ SmbAgentTarget,
SmbAgentType,
+ SmbAssetScrapable,
SmbClientAccessConfig,
+ SmbCreateAgentRuleRequest,
+ SmbCreateHolidayRequest,
+ SmbCreateProcedureRequest,
+ SmbCreateServiceRequest,
+ SmbCreateStaffRequest,
+ SmbCreateTransferRuleRequest,
+ SmbCustomerFacingAgent,
+ SmbCustomerFacingAgentDeactivationReason,
+ SmbCustomerFacingAgentResponse,
+ SmbGroupMembership,
+ SmbIdentityVerificationConfig,
+ SmbIntakeQuestion,
+ SmbKnowledgeSourceDbModel,
+ SmbLocationDeactivationReason,
+ SmbLocationInput,
+ SmbLocationOutput,
+ SmbLocationRequest,
+ SmbLocationRequestPatch,
+ SmbNotificationChannel,
+ SmbPhoneAssignmentDbModel,
+ SmbPhoneAssignmentDbModelProvider,
+ SmbPhoneAssignmentDeactivationReason,
+ SmbPhoneRegulatoryStatus,
+ SmbProcedure,
+ SmbProductScrapable,
+ SmbScrapingMode,
+ SmbServiceDbModel,
+ SmbServiceKind,
+ SmbServicePromotion,
+ SmbServiceScrapable,
+ SmbServiceVariant,
+ SmbSipMediaEncryption,
+ SmbSipTransport,
+ SmbStaffResourceDbModel,
+ SmbStaffScrapable,
+ SmbTierEconomics,
+ SmbTransferRule,
+ SmbTurnEagerness,
+ SmbUpdateAgentInfoRequest,
+ SmbUpdateAgentInfoRequestCurrency,
+ SmbUpdateAgentRuleRequest,
+ SmbUpdateHolidayRequestPatch,
+ SmbUpdateProcedureRequest,
+ SmbUpdateServiceRequestPatch,
+ SmbUpdateStaffRequestPatch,
+ SmbUpdateTransferRuleRequest,
+ SmbVertical,
+ SmbWidgetAppearance,
+ SmbWidgetAppearancePlacement,
+ SmbWidgetAppearanceVariant,
SmsConversationInfo,
SmsConversationInfoDirection,
+ SmsTemplateStyle,
SoftTimeoutConfig,
SoftTimeoutConfigOverride,
SoftTimeoutConfigOverrideConfig,
@@ -1817,6 +1915,7 @@
StreamingAudioChunkWithTimestampsAndVoiceSegmentsResponseModel,
StreamingAudioChunkWithTimestampsResponse,
StringSchema,
+ StrippedStr,
StudioAgentSettingsModel,
StudioAgentToolSettingsModel,
StudioClipLocator,
@@ -1835,6 +1934,7 @@
SubscriptionUsageResponseModel,
SubtitleOrderItemRequest,
SuggestedAudioTag,
+ SupportedLang,
SupportedVoice,
SystemDataCollectionId,
SystemEvaluationCriteria,
@@ -1865,6 +1965,10 @@
SystemToolConfigOutputParams_TransferToAgent,
SystemToolConfigOutputParams_TransferToNumber,
SystemToolConfigOutputParams_VoicemailDetection,
+ TeamInviteOutcome,
+ TeamInviteRequest,
+ TeamInviteRequestRole,
+ TeamInviteResult,
TelephonyCallConfigInput,
TelephonyCallConfigOutput,
TelephonyDirection,
@@ -1955,7 +2059,9 @@
TicketSearchMatchField,
TicketSearchMatchResponseModel,
TicketStatusChangeResponseModel,
+ TimeOffType,
TimeRange,
+ TimeRangeModel,
ToDialogueSettingsResponseModel,
TokenResponseModel,
Tool,
@@ -2084,6 +2190,8 @@
TwilioOutboundCallResponse,
TwilioRegionId,
TxtExportOptions,
+ UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6,
+ UnitTestGuardrailTriggerEvaluationModel,
UnitTestRunResponseModel,
UnitTestRunResponseModelTestInfo,
UnitTestRunResponseModelTestInfo_Llm,
@@ -2099,6 +2207,7 @@
UnitTestToolCallParameterEval_Llm,
UnitTestToolCallParameterEval_Regex,
UnitTestWorkflowNodeTransitionEvaluationNodeId,
+ UnixTimestamp,
UpdateAgentConfigParams,
UpdateAgentProcedureParams,
UpdateAgentRuleParams,
@@ -2218,6 +2327,7 @@
WebhookAuthMethodType,
WebhookEventType,
WebhookHmacSettings,
+ WebhookHttpMethod,
WebhookTarget,
WebhookTargetAll,
WebhookTargetIds,
@@ -2245,6 +2355,7 @@
WhatsAppCallPermissionRequestState,
WhatsAppConversationInfo,
WhatsAppConversationInfoDirection,
+ WhatsAppOpeningMessage,
WhatsAppOutboundCallResponse,
WhatsAppOutboundMessageResponse,
WhatsAppRecipient,
@@ -2387,6 +2498,7 @@
WorkflowUnconditionalModelOutput,
WorkflowUpdateStateNodeModelInput,
WorkflowUpdateStateNodeModelOutput,
+ WorkingHours,
WorkspaceAnalyticsQueryResponseModel,
WorkspaceAnalyticsQueryResponseModelColumnTypesItem,
WorkspaceAnalyticsQueryResponseModelRowsItemItem,
@@ -2408,6 +2520,7 @@
WorkspaceGroupResponseModelGroupPvcLimit,
WorkspaceGroupResponseModelGroupUsageLimit,
WorkspaceMemberResponseModel,
+ WorkspaceNow,
WorkspaceResourceType,
WorkspaceServiceAccountListResponseModel,
WorkspaceServiceAccountResponseModel,
@@ -2441,6 +2554,7 @@
music,
productions,
pronunciation_dictionaries,
+ reception,
samples,
service_accounts,
speech_engine,
@@ -2455,7 +2569,6 @@
tokens,
usage,
user,
- v_1_dubbing_realtime,
v_1_speech_to_text_realtime,
v_1_text_to_dialogue_multi_stream_input,
v_1_text_to_dialogue_stream_input,
@@ -2566,12 +2679,6 @@
TextToSpeechStreamWithTimestampsRequestOutputFormat,
)
from .text_to_voice import VoiceDesignRequestModelModelId
- from .v_1_dubbing_realtime import (
- ReceiveDubbingStreamMessage,
- SendDubbingStreamMessage,
- TextToDialogueInputFormat,
- TextToDialogueOutputFormat,
- )
from .v_1_speech_to_text_realtime import ReceiveTranscription, TextToDialogueCommitStrategy
from .v_1_text_to_dialogue_multi_stream_input import ReceiveTextToDialogueWebsocketMessageMulti
from .v_1_text_to_dialogue_stream_input import ReceiveTextToDialogueWebsocketMessage
@@ -2597,6 +2704,7 @@
"AddPronunciationDictionaryResponseModel": ".types",
"AddPronunciationDictionaryResponseModelPermissionOnResource": ".types",
"AddSharingVoiceRequest": ".types",
+ "AddUrlRequest": ".types",
"AddVoiceIvcResponseModel": ".types",
"AddVoiceResponseModel": ".types",
"AddVoiceToUserVoiceCollectionResponseModel": ".types",
@@ -2660,6 +2768,7 @@
"AgentPlatformSettingsResponseModel": ".types",
"AgentQueueingConfig": ".types",
"AgentResponsePayload": ".types",
+ "AgentRule": ".types",
"AgentSimulatedChatTestResponseModel": ".types",
"AgentSmbMetadata": ".types",
"AgentSortBy": ".types",
@@ -2751,6 +2860,8 @@
"ApiIntegrationWebhookOverridesSchemaOverridesValue_Omit": ".types",
"ApiIntegrationWebhookToolConfigInput": ".types",
"ApiIntegrationWebhookToolConfigOutput": ".types",
+ "ApplicationNumberType": ".types",
+ "AppointmentReminderMode": ".types",
"ArchitectDispatchResponseModel": ".types",
"ArrayJsonSchemaPropertyInput": ".types",
"ArrayJsonSchemaPropertyInputItems": ".types",
@@ -2770,6 +2881,8 @@
"AssetTranscription": ".types",
"AssetTranscriptionData": ".types",
"AssetTranscriptionStatus": ".types",
+ "AssignResellerTierRequest": ".types",
+ "AssignResellerTierRequestBillingPeriod": ".types",
"AssignableUserResponseModel": ".types",
"AstAdditionOperatorNodeInput": ".types",
"AstAdditionOperatorNodeOutput": ".types",
@@ -2980,6 +3093,8 @@
"BytedanceSeedream5ProRequest": ".types",
"BytedanceSeedream5ProRequestAspectRatio": ".types",
"BytedanceSeedream5ProRequestResolution": ".types",
+ "CalComConnectionHealthStatus": ".types",
+ "CalendlyConnectionHealthStatus": ".types",
"CallResult": ".types",
"CampaignConversationType": ".types",
"CancelCalendarEventParams": ".types",
@@ -3256,6 +3371,7 @@
"ConversationalConfigApiModelWorkflowOverrideOutput": ".types",
"ConvertChapterResponseModel": ".types",
"ConvertProjectResponseModel": ".types",
+ "CountryCode": ".types",
"CrawlStatus": ".types",
"CrawlType": ".types",
"CreateAgentBranchResponseModel": ".types",
@@ -3330,10 +3446,15 @@
"CustomLlmapiType": ".types",
"CustomSipHeader": ".types",
"CustomSipHeaderWithDynamicVariable": ".types",
+ "CustomerFacingConfigInput": ".types",
+ "CustomerFacingConfigOutput": ".types",
+ "CustomerFacingConfigPatch": ".types",
"DashboardCallSuccessChartModel": ".types",
"DashboardCriteriaChartModel": ".types",
"DashboardDataCollectionChartModel": ".types",
"DataCollectionResultCommonModel": ".types",
+ "DateModel": ".types",
+ "DayOfWeek": ".types",
"DefaultSharingGroupConfig": ".types",
"DefaultSharingGroupConfigPermissionLevel": ".types",
"DefaultSharingGroupResponseModel": ".types",
@@ -3398,17 +3519,9 @@
"DubOrderItemRequest": ".types",
"DubRequestMode": ".dubbing",
"DubbedSegment": ".types",
- "DubbingAudio": ".types",
- "DubbingAudioOutputError": ".types",
- "DubbingAuthError": ".types",
"DubbingBulkSourceSegmentUpdateResponse": ".types",
"DubbingBulkTargetSegmentUpdateResponse": ".types",
- "DubbingCommittedTranscript": ".types",
- "DubbingEndOfStream": ".types",
"DubbingError": ".types",
- "DubbingInputAudioChunk": ".types",
- "DubbingInputError": ".types",
- "DubbingInvalidRequestError": ".types",
"DubbingLanguageListResponse": ".types",
"DubbingLanguageOutputs": ".types",
"DubbingLanguageResponse": ".types",
@@ -3424,28 +3537,21 @@
"DubbingMediaReference": ".types",
"DubbingMetadataPageResponseModel": ".types",
"DubbingMetadataResponse": ".types",
- "DubbingPartialTranscript": ".types",
"DubbingProjectListResponse": ".types",
"DubbingProjectResponse": ".types",
"DubbingProjectResponseStatus": ".types",
- "DubbingQueueOverflowError": ".types",
- "DubbingRateLimitedError": ".types",
"DubbingRegenerateResponse": ".types",
"DubbingReleaseChannel": ".types",
"DubbingRenderResponseModel": ".types",
"DubbingResource": ".types",
"DubbingSegmentUpdateRequest": ".types",
- "DubbingSessionStarted": ".types",
"DubbingSourceMediaInfo": ".types",
"DubbingSourceSegmentUpdateResponse": ".types",
"DubbingSourceTranscriptResponse": ".types",
- "DubbingStatus": ".types",
- "DubbingStatusStatus": ".types",
"DubbingTargetSegmentUpdateRequest": ".types",
"DubbingTargetSegmentUpdateResponse": ".types",
"DubbingTargetTranscriptResponse": ".types",
"DubbingTargetTranscriptSegment": ".types",
- "DubbingTranscriberError": ".types",
"DubbingTranscript": ".types",
"DubbingTranscriptCharacter": ".types",
"DubbingTranscriptResponseModel": ".types",
@@ -3455,8 +3561,6 @@
"DubbingTranscriptWord": ".types",
"DubbingTranscriptsResponseModel": ".types",
"DubbingTranscriptsResponseModelTranscriptFormat": ".types",
- "DubbingTranslation": ".types",
- "DubbingTranslationError": ".types",
"DummyToolResultModel": ".types",
"DuplicateSpeechEngineRequest": ".types",
"DynamicVariableAssignment": ".types",
@@ -3487,6 +3591,7 @@
"ElevenV3Request": ".types",
"ElevenV3RequestOutputFormat": ".types",
"ElevenV3VoiceSettings": ".types",
+ "EmailOptional": ".types",
"EmbedVariant": ".types",
"EmbeddingModelEnum": ".types",
"EndCallToolConfig": ".types",
@@ -3741,6 +3846,8 @@
"HistoryItemResponse": ".types",
"HistoryListRequestSortDirection": ".history",
"HistoryListRequestSource": ".history",
+ "HolidayResponseModel": ".types",
+ "HolidayType": ".types",
"HtmlExportOptions": ".types",
"HttpRequestModel": ".types",
"HttpValidationError": ".types",
@@ -3769,6 +3876,7 @@
"ImageSchema": ".types",
"ImageSubject": ".types",
"InboundSipTrunkConfigRequestModel": ".types",
+ "IngestFailure": ".types",
"InitPayload": ".types",
"InitialiseContext": ".types",
"InitializeConnection": ".types",
@@ -3782,10 +3890,12 @@
"InlineVideoReference": ".types",
"InlineVideoReferenceMimeType": ".types",
"InputAudioChunkPayload": ".types",
+ "IntakeQuestionKind": ".types",
"IntegerSchema": ".types",
"IntegrationType": ".types",
"InteractionBudget": ".types",
"InternalAlertingWebhookNotifier": ".types",
+ "InternalKbCrawlPageTiming": ".types",
"InternalSamplingConfigResponseModel": ".types",
"InvoiceResponse": ".types",
"InvoiceResponsePaymentIntentStatus": ".types",
@@ -3826,6 +3936,8 @@
"KnowledgeBaseToolInfo": ".types",
"KnowledgeBaseToolResultModel": ".types",
"KnowledgeBaseToolStatus": ".types",
+ "KnowledgeSourceStatus": ".types",
+ "KnowledgeSourceType": ".types",
"LanguageAddedResponse": ".types",
"LanguageDetectionToolConfig": ".types",
"LanguageDetectionToolResultModel": ".types",
@@ -3839,6 +3951,13 @@
"LanguagesResponse_Pair": ".types",
"LanguagesResponse_Single": ".types",
"LeaveMessageParams": ".types",
+ "LenientCountry": ".types",
+ "LenientCurrency": ".types",
+ "LenientOptionalBool": ".types",
+ "LenientOptionalStr": ".types",
+ "LenientPhone": ".types",
+ "LenientState": ".types",
+ "LenientVertical": ".types",
"LibraryVoiceResponse": ".types",
"LibraryVoiceResponseCategory": ".types",
"ListAgentProceduresParams": ".types",
@@ -3904,6 +4023,7 @@
"LlmUsageOutput": ".types",
"LoadMemoryEntryToolErrorStatus": ".types",
"LoadableMemoryEntry": ".types",
+ "LocationResponse": ".types",
"LockReason": ".types",
"ManualSource": ".types",
"ManualVerificationFileResponse": ".types",
@@ -3948,6 +4068,7 @@
"McpToolConfigOverrideOutputInputOverridesValue_Llm": ".types",
"McpToolConfigOverrideOutputInputOverridesValue_Omit": ".types",
"McpToolConfigOverrideOutputToolCallSound": ".types",
+ "McpTransport": ".types",
"MediaCodec": ".types",
"MediaGenerationCompletedResponse": ".types",
"MediaGenerationCreateResponse": ".types",
@@ -4115,8 +4236,11 @@
"PendingSubscriptionSwitchResponseModel": ".types",
"PendingSubscriptionSwitchResponseModelNextTier": ".types",
"PermissionType": ".types",
+ "PhoneNumber": ".types",
"PhoneNumberAgentInfo": ".types",
"PhoneNumberDynamicVariableTransferDestination": ".types",
+ "PhoneNumberNullable": ".types",
+ "PhoneNumberOptional": ".types",
"PhoneNumberSortBy": ".types",
"PhoneNumberTransfer": ".types",
"PhoneNumberTransferCustomSipHeadersItem": ".types",
@@ -4157,6 +4281,7 @@
"PreToolSpeechMode": ".types",
"PreviewAudioDbModel": ".types",
"Price": ".types",
+ "PricingMode": ".types",
"PrivacyConfigInput": ".types",
"PrivacyConfigOutput": ".types",
"PrivateKeyJwtResponse": ".types",
@@ -4169,6 +4294,7 @@
"ProcedureType": ".types",
"ProcedureValidationError": ".types",
"ProcedureVersionRef": ".types",
+ "ProcessingProgress": ".types",
"ProjectCreationMetaResponseModel": ".types",
"ProjectCreationMetaResponseModelStatus": ".types",
"ProjectCreationMetaType": ".types",
@@ -4203,6 +4329,7 @@
"ProjectVideoResponseModel": ".types",
"ProjectVideoThumbnailSheetResponseModel": ".types",
"ProjectVoiceResponseModel": ".types",
+ "PromotionTarget": ".types",
"PromptAgent": ".types",
"PromptAgentApiModelInput": ".types",
"PromptAgentApiModelInputBackupLlmConfig": ".types",
@@ -4263,6 +4390,9 @@
"PronunciationDictionaryVersionLocator": ".types",
"PronunciationDictionaryVersionResponseModel": ".types",
"PronunciationDictionaryVersionResponseModelPermissionOnResource": ".types",
+ "ProvisionResellerWorkspaceResponse": ".types",
+ "ProvisionResellerWorkspaceSubscription": ".types",
+ "ProvisionResellerWorkspaceSubscriptionBillingPeriod": ".types",
"PydanticPronunciationDictionaryVersionLocator": ".types",
"QualityPresetType": ".types",
"QueryParamsJsonSchemaInput": ".types",
@@ -4281,6 +4411,9 @@
"RagIndexOverviewResponseModel": ".types",
"RagIndexStatus": ".types",
"RagRetrievalInfo": ".types",
+ "RawBusinessInfo": ".types",
+ "RawItem": ".types",
+ "RawLocationInfo": ".types",
"ReadLegalTerms": ".types",
"ReadMetadataChapterDbModel": ".types",
"ReaderResourceResponseModel": ".types",
@@ -4291,7 +4424,6 @@
"RealtimeModel": ".types",
"RealtimeUrlOptions": ".realtime",
"RealtimeVoiceSettings": ".types",
- "ReceiveDubbingStreamMessage": ".v_1_dubbing_realtime",
"ReceiveMessage": ".v_1_text_to_speech_voice_id_stream_input",
"ReceiveMessageMulti": ".v_1_text_to_speech_voice_id_multi_stream_input",
"ReceiveTextToDialogueWebsocketMessage": ".v_1_text_to_dialogue_stream_input",
@@ -4320,6 +4452,19 @@
"RequestPvcManualVerificationResponseModel": ".types",
"RequiredConstraint": ".types",
"RequiredConstraints": ".types",
+ "ResellerInvoiceDetail": ".types",
+ "ResellerInvoiceLine": ".types",
+ "ResellerInvoiceLineKind": ".types",
+ "ResellerInvoiceStatus": ".types",
+ "ResellerInvoiceSummary": ".types",
+ "ResellerInvoicesResponse": ".types",
+ "ResellerTierResponse": ".types",
+ "ResellerUpcomingPayment": ".types",
+ "ResellerUpcomingPaymentsResponse": ".types",
+ "ResellerWorkspaceSubscription": ".types",
+ "ResellerWorkspaceSubscriptionBillingPeriod": ".types",
+ "ResellerWorkspaceSummary": ".types",
+ "ResellerWorkspacesResponse": ".types",
"ResourceAccessInfo": ".types",
"ResourceAccessInfoAccessSource": ".types",
"ResourceAccessInfoAnonymousAccessLevelOverride": ".types",
@@ -4336,6 +4481,7 @@
"ReviewResponseModelRejectReasonsItem": ".types",
"ReviewResponseModelReviewStatus": ".types",
"ReviewStatus": ".types",
+ "RulePriority": ".types",
"SafetyCommonModelInput": ".types",
"SafetyCommonModelOutput": ".types",
"SafetyEvaluation": ".types",
@@ -4383,7 +4529,6 @@
"SegmentUpdateResponse": ".types",
"SegmentedJsonExportOptions": ".types",
"SendCustomEmailParams": ".types",
- "SendDubbingStreamMessage": ".v_1_dubbing_realtime",
"SendMessage": ".v_1_text_to_speech_voice_id_stream_input",
"SendMessageMulti": ".v_1_text_to_speech_voice_id_multi_stream_input",
"SendText": ".types",
@@ -4392,6 +4537,8 @@
"SendUpstreamMessage": ".speech_engine_upstream",
"SentimentAggregate": ".types",
"SentimentAnalysisSettings": ".types",
+ "ServiceLocationType": ".types",
+ "ServiceUpdateResponse": ".types",
"SessionStartedPayload": ".types",
"SessionStartedPayloadConfig": ".types",
"SessionStartedPayloadConfigCommitStrategy": ".types",
@@ -4421,10 +4568,66 @@
"SkipTurnToolConfig": ".types",
"SkipTurnToolResponseModel": ".types",
"SlackBotAuthResponse": ".types",
+ "SmbAddOn": ".types",
+ "SmbAgentInfoResponse": ".types",
+ "SmbAgentInfoResponseCurrency": ".types",
+ "SmbAgentTarget": ".types",
"SmbAgentType": ".types",
+ "SmbAssetScrapable": ".types",
"SmbClientAccessConfig": ".types",
+ "SmbCreateAgentRuleRequest": ".types",
+ "SmbCreateHolidayRequest": ".types",
+ "SmbCreateProcedureRequest": ".types",
+ "SmbCreateServiceRequest": ".types",
+ "SmbCreateStaffRequest": ".types",
+ "SmbCreateTransferRuleRequest": ".types",
+ "SmbCustomerFacingAgent": ".types",
+ "SmbCustomerFacingAgentDeactivationReason": ".types",
+ "SmbCustomerFacingAgentResponse": ".types",
+ "SmbGroupMembership": ".types",
+ "SmbIdentityVerificationConfig": ".types",
+ "SmbIntakeQuestion": ".types",
+ "SmbKnowledgeSourceDbModel": ".types",
+ "SmbLocationDeactivationReason": ".types",
+ "SmbLocationInput": ".types",
+ "SmbLocationOutput": ".types",
+ "SmbLocationRequest": ".types",
+ "SmbLocationRequestPatch": ".types",
+ "SmbNotificationChannel": ".types",
+ "SmbPhoneAssignmentDbModel": ".types",
+ "SmbPhoneAssignmentDbModelProvider": ".types",
+ "SmbPhoneAssignmentDeactivationReason": ".types",
+ "SmbPhoneRegulatoryStatus": ".types",
+ "SmbProcedure": ".types",
+ "SmbProductScrapable": ".types",
+ "SmbScrapingMode": ".types",
+ "SmbServiceDbModel": ".types",
+ "SmbServiceKind": ".types",
+ "SmbServicePromotion": ".types",
+ "SmbServiceScrapable": ".types",
+ "SmbServiceVariant": ".types",
+ "SmbSipMediaEncryption": ".types",
+ "SmbSipTransport": ".types",
+ "SmbStaffResourceDbModel": ".types",
+ "SmbStaffScrapable": ".types",
+ "SmbTierEconomics": ".types",
+ "SmbTransferRule": ".types",
+ "SmbTurnEagerness": ".types",
+ "SmbUpdateAgentInfoRequest": ".types",
+ "SmbUpdateAgentInfoRequestCurrency": ".types",
+ "SmbUpdateAgentRuleRequest": ".types",
+ "SmbUpdateHolidayRequestPatch": ".types",
+ "SmbUpdateProcedureRequest": ".types",
+ "SmbUpdateServiceRequestPatch": ".types",
+ "SmbUpdateStaffRequestPatch": ".types",
+ "SmbUpdateTransferRuleRequest": ".types",
+ "SmbVertical": ".types",
+ "SmbWidgetAppearance": ".types",
+ "SmbWidgetAppearancePlacement": ".types",
+ "SmbWidgetAppearanceVariant": ".types",
"SmsConversationInfo": ".types",
"SmsConversationInfoDirection": ".types",
+ "SmsTemplateStyle": ".types",
"SoftTimeoutConfig": ".types",
"SoftTimeoutConfigOverride": ".types",
"SoftTimeoutConfigOverrideConfig": ".types",
@@ -4483,6 +4686,7 @@
"StreamingAudioChunkWithTimestampsAndVoiceSegmentsResponseModel": ".types",
"StreamingAudioChunkWithTimestampsResponse": ".types",
"StringSchema": ".types",
+ "StrippedStr": ".types",
"StudioAgentSettingsModel": ".types",
"StudioAgentToolSettingsModel": ".types",
"StudioClipLocator": ".types",
@@ -4501,6 +4705,7 @@
"SubscriptionUsageResponseModel": ".types",
"SubtitleOrderItemRequest": ".types",
"SuggestedAudioTag": ".types",
+ "SupportedLang": ".types",
"SupportedVoice": ".types",
"SystemDataCollectionId": ".types",
"SystemEvaluationCriteria": ".types",
@@ -4531,6 +4736,10 @@
"SystemToolConfigOutputParams_TransferToAgent": ".types",
"SystemToolConfigOutputParams_TransferToNumber": ".types",
"SystemToolConfigOutputParams_VoicemailDetection": ".types",
+ "TeamInviteOutcome": ".types",
+ "TeamInviteRequest": ".types",
+ "TeamInviteRequestRole": ".types",
+ "TeamInviteResult": ".types",
"TelephonyCallConfigInput": ".types",
"TelephonyCallConfigOutput": ".types",
"TelephonyDirection": ".types",
@@ -4596,8 +4805,6 @@
"TextToDialogueConvertRequestOutputFormat": ".text_to_dialogue",
"TextToDialogueConvertWithTimestampsRequestOutputFormat": ".text_to_dialogue",
"TextToDialogueEagerness": ".v_1_translation_realtime",
- "TextToDialogueInputFormat": ".v_1_dubbing_realtime",
- "TextToDialogueOutputFormat": ".v_1_dubbing_realtime",
"TextToDialogueTtsModelId": ".v_1_translation_realtime",
"TextToDialogueWebsocketApplyTextNormalizationEnum": ".types",
"TextToDialogueWebsocketAudioChunk": ".types",
@@ -4634,7 +4841,9 @@
"TicketSearchMatchField": ".types",
"TicketSearchMatchResponseModel": ".types",
"TicketStatusChangeResponseModel": ".types",
+ "TimeOffType": ".types",
"TimeRange": ".types",
+ "TimeRangeModel": ".types",
"ToDialogueSettingsResponseModel": ".types",
"TokenResponseModel": ".types",
"TooEarlyError": ".errors",
@@ -4765,6 +4974,8 @@
"TwilioRegionId": ".types",
"TxtExportOptions": ".types",
"UnauthorizedError": ".errors",
+ "UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6": ".types",
+ "UnitTestGuardrailTriggerEvaluationModel": ".types",
"UnitTestRunResponseModel": ".types",
"UnitTestRunResponseModelTestInfo": ".types",
"UnitTestRunResponseModelTestInfo_Llm": ".types",
@@ -4780,6 +4991,7 @@
"UnitTestToolCallParameterEval_Llm": ".types",
"UnitTestToolCallParameterEval_Regex": ".types",
"UnitTestWorkflowNodeTransitionEvaluationNodeId": ".types",
+ "UnixTimestamp": ".types",
"UnprocessableEntityError": ".errors",
"UpdateAgentConfigParams": ".types",
"UpdateAgentProcedureParams": ".types",
@@ -4904,6 +5116,7 @@
"WebhookAuthMethodType": ".types",
"WebhookEventType": ".types",
"WebhookHmacSettings": ".types",
+ "WebhookHttpMethod": ".types",
"WebhookTarget": ".types",
"WebhookTargetAll": ".types",
"WebhookTargetIds": ".types",
@@ -4931,6 +5144,7 @@
"WhatsAppCallPermissionRequestState": ".types",
"WhatsAppConversationInfo": ".types",
"WhatsAppConversationInfoDirection": ".types",
+ "WhatsAppOpeningMessage": ".types",
"WhatsAppOutboundCallResponse": ".types",
"WhatsAppOutboundMessageResponse": ".types",
"WhatsAppRecipient": ".types",
@@ -5073,6 +5287,7 @@
"WorkflowUnconditionalModelOutput": ".types",
"WorkflowUpdateStateNodeModelInput": ".types",
"WorkflowUpdateStateNodeModelOutput": ".types",
+ "WorkingHours": ".types",
"WorkspaceAnalyticsQueryResponseModel": ".types",
"WorkspaceAnalyticsQueryResponseModelColumnTypesItem": ".types",
"WorkspaceAnalyticsQueryResponseModelRowsItemItem": ".types",
@@ -5094,6 +5309,7 @@
"WorkspaceGroupResponseModelGroupPvcLimit": ".types",
"WorkspaceGroupResponseModelGroupUsageLimit": ".types",
"WorkspaceMemberResponseModel": ".types",
+ "WorkspaceNow": ".types",
"WorkspaceResourceType": ".types",
"WorkspaceServiceAccountListResponseModel": ".types",
"WorkspaceServiceAccountResponseModel": ".types",
@@ -5118,6 +5334,7 @@
"play": ".play",
"productions": ".productions",
"pronunciation_dictionaries": ".pronunciation_dictionaries",
+ "reception": ".reception",
"samples": ".samples",
"save": ".play",
"service_accounts": ".service_accounts",
@@ -5134,7 +5351,6 @@
"tokens": ".tokens",
"usage": ".usage",
"user": ".user",
- "v_1_dubbing_realtime": ".v_1_dubbing_realtime",
"v_1_speech_to_text_realtime": ".v_1_speech_to_text_realtime",
"v_1_text_to_dialogue_multi_stream_input": ".v_1_text_to_dialogue_multi_stream_input",
"v_1_text_to_dialogue_stream_input": ".v_1_text_to_dialogue_stream_input",
@@ -5180,6 +5396,7 @@ def __dir__():
"AddPronunciationDictionaryResponseModel",
"AddPronunciationDictionaryResponseModelPermissionOnResource",
"AddSharingVoiceRequest",
+ "AddUrlRequest",
"AddVoiceIvcResponseModel",
"AddVoiceResponseModel",
"AddVoiceToUserVoiceCollectionResponseModel",
@@ -5243,6 +5460,7 @@ def __dir__():
"AgentPlatformSettingsResponseModel",
"AgentQueueingConfig",
"AgentResponsePayload",
+ "AgentRule",
"AgentSimulatedChatTestResponseModel",
"AgentSmbMetadata",
"AgentSortBy",
@@ -5334,6 +5552,8 @@ def __dir__():
"ApiIntegrationWebhookOverridesSchemaOverridesValue_Omit",
"ApiIntegrationWebhookToolConfigInput",
"ApiIntegrationWebhookToolConfigOutput",
+ "ApplicationNumberType",
+ "AppointmentReminderMode",
"ArchitectDispatchResponseModel",
"ArrayJsonSchemaPropertyInput",
"ArrayJsonSchemaPropertyInputItems",
@@ -5353,6 +5573,8 @@ def __dir__():
"AssetTranscription",
"AssetTranscriptionData",
"AssetTranscriptionStatus",
+ "AssignResellerTierRequest",
+ "AssignResellerTierRequestBillingPeriod",
"AssignableUserResponseModel",
"AstAdditionOperatorNodeInput",
"AstAdditionOperatorNodeOutput",
@@ -5563,6 +5785,8 @@ def __dir__():
"BytedanceSeedream5ProRequest",
"BytedanceSeedream5ProRequestAspectRatio",
"BytedanceSeedream5ProRequestResolution",
+ "CalComConnectionHealthStatus",
+ "CalendlyConnectionHealthStatus",
"CallResult",
"CampaignConversationType",
"CancelCalendarEventParams",
@@ -5839,6 +6063,7 @@ def __dir__():
"ConversationalConfigApiModelWorkflowOverrideOutput",
"ConvertChapterResponseModel",
"ConvertProjectResponseModel",
+ "CountryCode",
"CrawlStatus",
"CrawlType",
"CreateAgentBranchResponseModel",
@@ -5913,10 +6138,15 @@ def __dir__():
"CustomLlmapiType",
"CustomSipHeader",
"CustomSipHeaderWithDynamicVariable",
+ "CustomerFacingConfigInput",
+ "CustomerFacingConfigOutput",
+ "CustomerFacingConfigPatch",
"DashboardCallSuccessChartModel",
"DashboardCriteriaChartModel",
"DashboardDataCollectionChartModel",
"DataCollectionResultCommonModel",
+ "DateModel",
+ "DayOfWeek",
"DefaultSharingGroupConfig",
"DefaultSharingGroupConfigPermissionLevel",
"DefaultSharingGroupResponseModel",
@@ -5981,17 +6211,9 @@ def __dir__():
"DubOrderItemRequest",
"DubRequestMode",
"DubbedSegment",
- "DubbingAudio",
- "DubbingAudioOutputError",
- "DubbingAuthError",
"DubbingBulkSourceSegmentUpdateResponse",
"DubbingBulkTargetSegmentUpdateResponse",
- "DubbingCommittedTranscript",
- "DubbingEndOfStream",
"DubbingError",
- "DubbingInputAudioChunk",
- "DubbingInputError",
- "DubbingInvalidRequestError",
"DubbingLanguageListResponse",
"DubbingLanguageOutputs",
"DubbingLanguageResponse",
@@ -6007,28 +6229,21 @@ def __dir__():
"DubbingMediaReference",
"DubbingMetadataPageResponseModel",
"DubbingMetadataResponse",
- "DubbingPartialTranscript",
"DubbingProjectListResponse",
"DubbingProjectResponse",
"DubbingProjectResponseStatus",
- "DubbingQueueOverflowError",
- "DubbingRateLimitedError",
"DubbingRegenerateResponse",
"DubbingReleaseChannel",
"DubbingRenderResponseModel",
"DubbingResource",
"DubbingSegmentUpdateRequest",
- "DubbingSessionStarted",
"DubbingSourceMediaInfo",
"DubbingSourceSegmentUpdateResponse",
"DubbingSourceTranscriptResponse",
- "DubbingStatus",
- "DubbingStatusStatus",
"DubbingTargetSegmentUpdateRequest",
"DubbingTargetSegmentUpdateResponse",
"DubbingTargetTranscriptResponse",
"DubbingTargetTranscriptSegment",
- "DubbingTranscriberError",
"DubbingTranscript",
"DubbingTranscriptCharacter",
"DubbingTranscriptResponseModel",
@@ -6038,8 +6253,6 @@ def __dir__():
"DubbingTranscriptWord",
"DubbingTranscriptsResponseModel",
"DubbingTranscriptsResponseModelTranscriptFormat",
- "DubbingTranslation",
- "DubbingTranslationError",
"DummyToolResultModel",
"DuplicateSpeechEngineRequest",
"DynamicVariableAssignment",
@@ -6070,6 +6283,7 @@ def __dir__():
"ElevenV3Request",
"ElevenV3RequestOutputFormat",
"ElevenV3VoiceSettings",
+ "EmailOptional",
"EmbedVariant",
"EmbeddingModelEnum",
"EndCallToolConfig",
@@ -6324,6 +6538,8 @@ def __dir__():
"HistoryItemResponse",
"HistoryListRequestSortDirection",
"HistoryListRequestSource",
+ "HolidayResponseModel",
+ "HolidayType",
"HtmlExportOptions",
"HttpRequestModel",
"HttpValidationError",
@@ -6352,6 +6568,7 @@ def __dir__():
"ImageSchema",
"ImageSubject",
"InboundSipTrunkConfigRequestModel",
+ "IngestFailure",
"InitPayload",
"InitialiseContext",
"InitializeConnection",
@@ -6365,10 +6582,12 @@ def __dir__():
"InlineVideoReference",
"InlineVideoReferenceMimeType",
"InputAudioChunkPayload",
+ "IntakeQuestionKind",
"IntegerSchema",
"IntegrationType",
"InteractionBudget",
"InternalAlertingWebhookNotifier",
+ "InternalKbCrawlPageTiming",
"InternalSamplingConfigResponseModel",
"InvoiceResponse",
"InvoiceResponsePaymentIntentStatus",
@@ -6409,6 +6628,8 @@ def __dir__():
"KnowledgeBaseToolInfo",
"KnowledgeBaseToolResultModel",
"KnowledgeBaseToolStatus",
+ "KnowledgeSourceStatus",
+ "KnowledgeSourceType",
"LanguageAddedResponse",
"LanguageDetectionToolConfig",
"LanguageDetectionToolResultModel",
@@ -6422,6 +6643,13 @@ def __dir__():
"LanguagesResponse_Pair",
"LanguagesResponse_Single",
"LeaveMessageParams",
+ "LenientCountry",
+ "LenientCurrency",
+ "LenientOptionalBool",
+ "LenientOptionalStr",
+ "LenientPhone",
+ "LenientState",
+ "LenientVertical",
"LibraryVoiceResponse",
"LibraryVoiceResponseCategory",
"ListAgentProceduresParams",
@@ -6487,6 +6715,7 @@ def __dir__():
"LlmUsageOutput",
"LoadMemoryEntryToolErrorStatus",
"LoadableMemoryEntry",
+ "LocationResponse",
"LockReason",
"ManualSource",
"ManualVerificationFileResponse",
@@ -6531,6 +6760,7 @@ def __dir__():
"McpToolConfigOverrideOutputInputOverridesValue_Llm",
"McpToolConfigOverrideOutputInputOverridesValue_Omit",
"McpToolConfigOverrideOutputToolCallSound",
+ "McpTransport",
"MediaCodec",
"MediaGenerationCompletedResponse",
"MediaGenerationCreateResponse",
@@ -6698,8 +6928,11 @@ def __dir__():
"PendingSubscriptionSwitchResponseModel",
"PendingSubscriptionSwitchResponseModelNextTier",
"PermissionType",
+ "PhoneNumber",
"PhoneNumberAgentInfo",
"PhoneNumberDynamicVariableTransferDestination",
+ "PhoneNumberNullable",
+ "PhoneNumberOptional",
"PhoneNumberSortBy",
"PhoneNumberTransfer",
"PhoneNumberTransferCustomSipHeadersItem",
@@ -6740,6 +6973,7 @@ def __dir__():
"PreToolSpeechMode",
"PreviewAudioDbModel",
"Price",
+ "PricingMode",
"PrivacyConfigInput",
"PrivacyConfigOutput",
"PrivateKeyJwtResponse",
@@ -6752,6 +6986,7 @@ def __dir__():
"ProcedureType",
"ProcedureValidationError",
"ProcedureVersionRef",
+ "ProcessingProgress",
"ProjectCreationMetaResponseModel",
"ProjectCreationMetaResponseModelStatus",
"ProjectCreationMetaType",
@@ -6786,6 +7021,7 @@ def __dir__():
"ProjectVideoResponseModel",
"ProjectVideoThumbnailSheetResponseModel",
"ProjectVoiceResponseModel",
+ "PromotionTarget",
"PromptAgent",
"PromptAgentApiModelInput",
"PromptAgentApiModelInputBackupLlmConfig",
@@ -6846,6 +7082,9 @@ def __dir__():
"PronunciationDictionaryVersionLocator",
"PronunciationDictionaryVersionResponseModel",
"PronunciationDictionaryVersionResponseModelPermissionOnResource",
+ "ProvisionResellerWorkspaceResponse",
+ "ProvisionResellerWorkspaceSubscription",
+ "ProvisionResellerWorkspaceSubscriptionBillingPeriod",
"PydanticPronunciationDictionaryVersionLocator",
"QualityPresetType",
"QueryParamsJsonSchemaInput",
@@ -6864,6 +7103,9 @@ def __dir__():
"RagIndexOverviewResponseModel",
"RagIndexStatus",
"RagRetrievalInfo",
+ "RawBusinessInfo",
+ "RawItem",
+ "RawLocationInfo",
"ReadLegalTerms",
"ReadMetadataChapterDbModel",
"ReaderResourceResponseModel",
@@ -6874,7 +7116,6 @@ def __dir__():
"RealtimeModel",
"RealtimeUrlOptions",
"RealtimeVoiceSettings",
- "ReceiveDubbingStreamMessage",
"ReceiveMessage",
"ReceiveMessageMulti",
"ReceiveTextToDialogueWebsocketMessage",
@@ -6903,6 +7144,19 @@ def __dir__():
"RequestPvcManualVerificationResponseModel",
"RequiredConstraint",
"RequiredConstraints",
+ "ResellerInvoiceDetail",
+ "ResellerInvoiceLine",
+ "ResellerInvoiceLineKind",
+ "ResellerInvoiceStatus",
+ "ResellerInvoiceSummary",
+ "ResellerInvoicesResponse",
+ "ResellerTierResponse",
+ "ResellerUpcomingPayment",
+ "ResellerUpcomingPaymentsResponse",
+ "ResellerWorkspaceSubscription",
+ "ResellerWorkspaceSubscriptionBillingPeriod",
+ "ResellerWorkspaceSummary",
+ "ResellerWorkspacesResponse",
"ResourceAccessInfo",
"ResourceAccessInfoAccessSource",
"ResourceAccessInfoAnonymousAccessLevelOverride",
@@ -6919,6 +7173,7 @@ def __dir__():
"ReviewResponseModelRejectReasonsItem",
"ReviewResponseModelReviewStatus",
"ReviewStatus",
+ "RulePriority",
"SafetyCommonModelInput",
"SafetyCommonModelOutput",
"SafetyEvaluation",
@@ -6966,7 +7221,6 @@ def __dir__():
"SegmentUpdateResponse",
"SegmentedJsonExportOptions",
"SendCustomEmailParams",
- "SendDubbingStreamMessage",
"SendMessage",
"SendMessageMulti",
"SendText",
@@ -6975,6 +7229,8 @@ def __dir__():
"SendUpstreamMessage",
"SentimentAggregate",
"SentimentAnalysisSettings",
+ "ServiceLocationType",
+ "ServiceUpdateResponse",
"SessionStartedPayload",
"SessionStartedPayloadConfig",
"SessionStartedPayloadConfigCommitStrategy",
@@ -7004,10 +7260,66 @@ def __dir__():
"SkipTurnToolConfig",
"SkipTurnToolResponseModel",
"SlackBotAuthResponse",
+ "SmbAddOn",
+ "SmbAgentInfoResponse",
+ "SmbAgentInfoResponseCurrency",
+ "SmbAgentTarget",
"SmbAgentType",
+ "SmbAssetScrapable",
"SmbClientAccessConfig",
+ "SmbCreateAgentRuleRequest",
+ "SmbCreateHolidayRequest",
+ "SmbCreateProcedureRequest",
+ "SmbCreateServiceRequest",
+ "SmbCreateStaffRequest",
+ "SmbCreateTransferRuleRequest",
+ "SmbCustomerFacingAgent",
+ "SmbCustomerFacingAgentDeactivationReason",
+ "SmbCustomerFacingAgentResponse",
+ "SmbGroupMembership",
+ "SmbIdentityVerificationConfig",
+ "SmbIntakeQuestion",
+ "SmbKnowledgeSourceDbModel",
+ "SmbLocationDeactivationReason",
+ "SmbLocationInput",
+ "SmbLocationOutput",
+ "SmbLocationRequest",
+ "SmbLocationRequestPatch",
+ "SmbNotificationChannel",
+ "SmbPhoneAssignmentDbModel",
+ "SmbPhoneAssignmentDbModelProvider",
+ "SmbPhoneAssignmentDeactivationReason",
+ "SmbPhoneRegulatoryStatus",
+ "SmbProcedure",
+ "SmbProductScrapable",
+ "SmbScrapingMode",
+ "SmbServiceDbModel",
+ "SmbServiceKind",
+ "SmbServicePromotion",
+ "SmbServiceScrapable",
+ "SmbServiceVariant",
+ "SmbSipMediaEncryption",
+ "SmbSipTransport",
+ "SmbStaffResourceDbModel",
+ "SmbStaffScrapable",
+ "SmbTierEconomics",
+ "SmbTransferRule",
+ "SmbTurnEagerness",
+ "SmbUpdateAgentInfoRequest",
+ "SmbUpdateAgentInfoRequestCurrency",
+ "SmbUpdateAgentRuleRequest",
+ "SmbUpdateHolidayRequestPatch",
+ "SmbUpdateProcedureRequest",
+ "SmbUpdateServiceRequestPatch",
+ "SmbUpdateStaffRequestPatch",
+ "SmbUpdateTransferRuleRequest",
+ "SmbVertical",
+ "SmbWidgetAppearance",
+ "SmbWidgetAppearancePlacement",
+ "SmbWidgetAppearanceVariant",
"SmsConversationInfo",
"SmsConversationInfoDirection",
+ "SmsTemplateStyle",
"SoftTimeoutConfig",
"SoftTimeoutConfigOverride",
"SoftTimeoutConfigOverrideConfig",
@@ -7066,6 +7378,7 @@ def __dir__():
"StreamingAudioChunkWithTimestampsAndVoiceSegmentsResponseModel",
"StreamingAudioChunkWithTimestampsResponse",
"StringSchema",
+ "StrippedStr",
"StudioAgentSettingsModel",
"StudioAgentToolSettingsModel",
"StudioClipLocator",
@@ -7084,6 +7397,7 @@ def __dir__():
"SubscriptionUsageResponseModel",
"SubtitleOrderItemRequest",
"SuggestedAudioTag",
+ "SupportedLang",
"SupportedVoice",
"SystemDataCollectionId",
"SystemEvaluationCriteria",
@@ -7114,6 +7428,10 @@ def __dir__():
"SystemToolConfigOutputParams_TransferToAgent",
"SystemToolConfigOutputParams_TransferToNumber",
"SystemToolConfigOutputParams_VoicemailDetection",
+ "TeamInviteOutcome",
+ "TeamInviteRequest",
+ "TeamInviteRequestRole",
+ "TeamInviteResult",
"TelephonyCallConfigInput",
"TelephonyCallConfigOutput",
"TelephonyDirection",
@@ -7179,8 +7497,6 @@ def __dir__():
"TextToDialogueConvertRequestOutputFormat",
"TextToDialogueConvertWithTimestampsRequestOutputFormat",
"TextToDialogueEagerness",
- "TextToDialogueInputFormat",
- "TextToDialogueOutputFormat",
"TextToDialogueTtsModelId",
"TextToDialogueWebsocketApplyTextNormalizationEnum",
"TextToDialogueWebsocketAudioChunk",
@@ -7217,7 +7533,9 @@ def __dir__():
"TicketSearchMatchField",
"TicketSearchMatchResponseModel",
"TicketStatusChangeResponseModel",
+ "TimeOffType",
"TimeRange",
+ "TimeRangeModel",
"ToDialogueSettingsResponseModel",
"TokenResponseModel",
"TooEarlyError",
@@ -7348,6 +7666,8 @@ def __dir__():
"TwilioRegionId",
"TxtExportOptions",
"UnauthorizedError",
+ "UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6",
+ "UnitTestGuardrailTriggerEvaluationModel",
"UnitTestRunResponseModel",
"UnitTestRunResponseModelTestInfo",
"UnitTestRunResponseModelTestInfo_Llm",
@@ -7363,6 +7683,7 @@ def __dir__():
"UnitTestToolCallParameterEval_Llm",
"UnitTestToolCallParameterEval_Regex",
"UnitTestWorkflowNodeTransitionEvaluationNodeId",
+ "UnixTimestamp",
"UnprocessableEntityError",
"UpdateAgentConfigParams",
"UpdateAgentProcedureParams",
@@ -7487,6 +7808,7 @@ def __dir__():
"WebhookAuthMethodType",
"WebhookEventType",
"WebhookHmacSettings",
+ "WebhookHttpMethod",
"WebhookTarget",
"WebhookTargetAll",
"WebhookTargetIds",
@@ -7514,6 +7836,7 @@ def __dir__():
"WhatsAppCallPermissionRequestState",
"WhatsAppConversationInfo",
"WhatsAppConversationInfoDirection",
+ "WhatsAppOpeningMessage",
"WhatsAppOutboundCallResponse",
"WhatsAppOutboundMessageResponse",
"WhatsAppRecipient",
@@ -7656,6 +7979,7 @@ def __dir__():
"WorkflowUnconditionalModelOutput",
"WorkflowUpdateStateNodeModelInput",
"WorkflowUpdateStateNodeModelOutput",
+ "WorkingHours",
"WorkspaceAnalyticsQueryResponseModel",
"WorkspaceAnalyticsQueryResponseModelColumnTypesItem",
"WorkspaceAnalyticsQueryResponseModelRowsItemItem",
@@ -7677,6 +8001,7 @@ def __dir__():
"WorkspaceGroupResponseModelGroupPvcLimit",
"WorkspaceGroupResponseModelGroupUsageLimit",
"WorkspaceMemberResponseModel",
+ "WorkspaceNow",
"WorkspaceResourceType",
"WorkspaceServiceAccountListResponseModel",
"WorkspaceServiceAccountResponseModel",
@@ -7701,6 +8026,7 @@ def __dir__():
"play",
"productions",
"pronunciation_dictionaries",
+ "reception",
"samples",
"save",
"service_accounts",
@@ -7717,7 +8043,6 @@ def __dir__():
"tokens",
"usage",
"user",
- "v_1_dubbing_realtime",
"v_1_speech_to_text_realtime",
"v_1_text_to_dialogue_multi_stream_input",
"v_1_text_to_dialogue_stream_input",
diff --git a/src/elevenlabs/audio_native/raw_client.py b/src/elevenlabs/audio_native/raw_client.py
index 8b6c0fe35..85caf294f 100644
--- a/src/elevenlabs/audio_native/raw_client.py
+++ b/src/elevenlabs/audio_native/raw_client.py
@@ -1,5 +1,6 @@
# This file was auto-generated by Fern from our API Definition.
+import json
import typing
from json.decoder import JSONDecodeError
@@ -121,7 +122,7 @@ def create(
"model_id": model_id,
"auto_convert": auto_convert,
"apply_text_normalization": apply_text_normalization,
- "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
+ "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
},
files={
**({"file": file} if file is not None else {}),
@@ -466,7 +467,7 @@ async def create(
"model_id": model_id,
"auto_convert": auto_convert,
"apply_text_normalization": apply_text_normalization,
- "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
+ "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
},
files={
**({"file": file} if file is not None else {}),
diff --git a/src/elevenlabs/base_client.py b/src/elevenlabs/base_client.py
index 8d52c9462..0de6a9a84 100644
--- a/src/elevenlabs/base_client.py
+++ b/src/elevenlabs/base_client.py
@@ -26,6 +26,7 @@
from .music.client import AsyncMusicClient, MusicClient
from .productions.client import AsyncProductionsClient, ProductionsClient
from .pronunciation_dictionaries.client import AsyncPronunciationDictionariesClient, PronunciationDictionariesClient
+ from .reception.client import AsyncReceptionClient, ReceptionClient
from .samples.client import AsyncSamplesClient, SamplesClient
from .service_accounts.client import AsyncServiceAccountsClient, ServiceAccountsClient
from .speech_engine.client import AsyncSpeechEngineClient, SpeechEngineClient
@@ -145,6 +146,7 @@ def __init__(
self._assets: typing.Optional[AssetsClient] = None
self._flows: typing.Optional[FlowsClient] = None
self._productions: typing.Optional[ProductionsClient] = None
+ self._reception: typing.Optional[ReceptionClient] = None
self._tokens: typing.Optional[TokensClient] = None
self._workspaces: typing.Optional[WorkspacesClient] = None
@@ -388,6 +390,14 @@ def productions(self):
self._productions = ProductionsClient(client_wrapper=self._client_wrapper)
return self._productions
+ @property
+ def reception(self):
+ if self._reception is None:
+ from .reception.client import ReceptionClient # noqa: E402
+
+ self._reception = ReceptionClient(client_wrapper=self._client_wrapper)
+ return self._reception
+
@property
def tokens(self):
if self._tokens is None:
@@ -505,6 +515,7 @@ def __init__(
self._assets: typing.Optional[AsyncAssetsClient] = None
self._flows: typing.Optional[AsyncFlowsClient] = None
self._productions: typing.Optional[AsyncProductionsClient] = None
+ self._reception: typing.Optional[AsyncReceptionClient] = None
self._tokens: typing.Optional[AsyncTokensClient] = None
self._workspaces: typing.Optional[AsyncWorkspacesClient] = None
@@ -748,6 +759,14 @@ def productions(self):
self._productions = AsyncProductionsClient(client_wrapper=self._client_wrapper)
return self._productions
+ @property
+ def reception(self):
+ if self._reception is None:
+ from .reception.client import AsyncReceptionClient # noqa: E402
+
+ self._reception = AsyncReceptionClient(client_wrapper=self._client_wrapper)
+ return self._reception
+
@property
def tokens(self):
if self._tokens is None:
diff --git a/src/elevenlabs/conversational_ai/knowledge_base/documents/client.py b/src/elevenlabs/conversational_ai/knowledge_base/documents/client.py
index 348d3002e..7bd966c8a 100644
--- a/src/elevenlabs/conversational_ai/knowledge_base/documents/client.py
+++ b/src/elevenlabs/conversational_ai/knowledge_base/documents/client.py
@@ -343,10 +343,14 @@ def update(
*,
name: typing.Optional[str] = OMIT,
content: typing.Optional[str] = OMIT,
+ enable_auto_sync: typing.Optional[bool] = OMIT,
+ auto_remove: typing.Optional[bool] = OMIT,
+ minimum_frequency_days: typing.Optional[int] = OMIT,
+ tighten_only: typing.Optional[bool] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> DocumentsUpdateResponse:
"""
- Update the name and/or content of a document.
+ Update the name, content and/or auto-sync settings of a document.
Parameters
----------
@@ -359,6 +363,18 @@ def update(
content : typing.Optional[str]
Updated content for the document. Only supported for text documents, URL documents with auto-sync disabled, and file documents that are not synced from an external source.
+ enable_auto_sync : typing.Optional[bool]
+ Whether the document or folder is refreshed automatically. Only applicable to URL documents, folders, and externally-synced files. Leave unset to keep the current value.
+
+ auto_remove : typing.Optional[bool]
+ Whether to automatically remove the document once its source is no longer available. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ minimum_frequency_days : typing.Optional[int]
+ Minimum frequency (in days) at which the document is refreshed. The actual interval may be shorter, never longer. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ tighten_only : typing.Optional[bool]
+ Folders only. When true, items already in the folder are only tightened to stay at least as strict as the folder, and keep any setting that is stricter than the folder's. When false, they are set to exactly the folder's auto-sync settings. Ignored for externally synced folders, whose contents always follow the folder's schedule.
+
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -379,7 +395,14 @@ def update(
)
"""
_response = self._raw_client.update(
- documentation_id, name=name, content=content, request_options=request_options
+ documentation_id,
+ name=name,
+ content=content,
+ enable_auto_sync=enable_auto_sync,
+ auto_remove=auto_remove,
+ minimum_frequency_days=minimum_frequency_days,
+ tighten_only=tighten_only,
+ request_options=request_options,
)
return _response.data
@@ -1075,10 +1098,14 @@ async def update(
*,
name: typing.Optional[str] = OMIT,
content: typing.Optional[str] = OMIT,
+ enable_auto_sync: typing.Optional[bool] = OMIT,
+ auto_remove: typing.Optional[bool] = OMIT,
+ minimum_frequency_days: typing.Optional[int] = OMIT,
+ tighten_only: typing.Optional[bool] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> DocumentsUpdateResponse:
"""
- Update the name and/or content of a document.
+ Update the name, content and/or auto-sync settings of a document.
Parameters
----------
@@ -1091,6 +1118,18 @@ async def update(
content : typing.Optional[str]
Updated content for the document. Only supported for text documents, URL documents with auto-sync disabled, and file documents that are not synced from an external source.
+ enable_auto_sync : typing.Optional[bool]
+ Whether the document or folder is refreshed automatically. Only applicable to URL documents, folders, and externally-synced files. Leave unset to keep the current value.
+
+ auto_remove : typing.Optional[bool]
+ Whether to automatically remove the document once its source is no longer available. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ minimum_frequency_days : typing.Optional[int]
+ Minimum frequency (in days) at which the document is refreshed. The actual interval may be shorter, never longer. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ tighten_only : typing.Optional[bool]
+ Folders only. When true, items already in the folder are only tightened to stay at least as strict as the folder, and keep any setting that is stricter than the folder's. When false, they are set to exactly the folder's auto-sync settings. Ignored for externally synced folders, whose contents always follow the folder's schedule.
+
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -1119,7 +1158,14 @@ async def main() -> None:
asyncio.run(main())
"""
_response = await self._raw_client.update(
- documentation_id, name=name, content=content, request_options=request_options
+ documentation_id,
+ name=name,
+ content=content,
+ enable_auto_sync=enable_auto_sync,
+ auto_remove=auto_remove,
+ minimum_frequency_days=minimum_frequency_days,
+ tighten_only=tighten_only,
+ request_options=request_options,
)
return _response.data
diff --git a/src/elevenlabs/conversational_ai/knowledge_base/documents/raw_client.py b/src/elevenlabs/conversational_ai/knowledge_base/documents/raw_client.py
index dc13142db..473d2f6ae 100644
--- a/src/elevenlabs/conversational_ai/knowledge_base/documents/raw_client.py
+++ b/src/elevenlabs/conversational_ai/knowledge_base/documents/raw_client.py
@@ -485,10 +485,14 @@ def update(
*,
name: typing.Optional[str] = OMIT,
content: typing.Optional[str] = OMIT,
+ enable_auto_sync: typing.Optional[bool] = OMIT,
+ auto_remove: typing.Optional[bool] = OMIT,
+ minimum_frequency_days: typing.Optional[int] = OMIT,
+ tighten_only: typing.Optional[bool] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[DocumentsUpdateResponse]:
"""
- Update the name and/or content of a document.
+ Update the name, content and/or auto-sync settings of a document.
Parameters
----------
@@ -501,6 +505,18 @@ def update(
content : typing.Optional[str]
Updated content for the document. Only supported for text documents, URL documents with auto-sync disabled, and file documents that are not synced from an external source.
+ enable_auto_sync : typing.Optional[bool]
+ Whether the document or folder is refreshed automatically. Only applicable to URL documents, folders, and externally-synced files. Leave unset to keep the current value.
+
+ auto_remove : typing.Optional[bool]
+ Whether to automatically remove the document once its source is no longer available. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ minimum_frequency_days : typing.Optional[int]
+ Minimum frequency (in days) at which the document is refreshed. The actual interval may be shorter, never longer. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ tighten_only : typing.Optional[bool]
+ Folders only. When true, items already in the folder are only tightened to stay at least as strict as the folder, and keep any setting that is stricter than the folder's. When false, they are set to exactly the folder's auto-sync settings. Ignored for externally synced folders, whose contents always follow the folder's schedule.
+
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -515,6 +531,10 @@ def update(
json={
"name": name,
"content": content,
+ "enable_auto_sync": enable_auto_sync,
+ "auto_remove": auto_remove,
+ "minimum_frequency_days": minimum_frequency_days,
+ "tighten_only": tighten_only,
},
headers={
"content-type": "application/json",
@@ -1459,10 +1479,14 @@ async def update(
*,
name: typing.Optional[str] = OMIT,
content: typing.Optional[str] = OMIT,
+ enable_auto_sync: typing.Optional[bool] = OMIT,
+ auto_remove: typing.Optional[bool] = OMIT,
+ minimum_frequency_days: typing.Optional[int] = OMIT,
+ tighten_only: typing.Optional[bool] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[DocumentsUpdateResponse]:
"""
- Update the name and/or content of a document.
+ Update the name, content and/or auto-sync settings of a document.
Parameters
----------
@@ -1475,6 +1499,18 @@ async def update(
content : typing.Optional[str]
Updated content for the document. Only supported for text documents, URL documents with auto-sync disabled, and file documents that are not synced from an external source.
+ enable_auto_sync : typing.Optional[bool]
+ Whether the document or folder is refreshed automatically. Only applicable to URL documents, folders, and externally-synced files. Leave unset to keep the current value.
+
+ auto_remove : typing.Optional[bool]
+ Whether to automatically remove the document once its source is no longer available. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ minimum_frequency_days : typing.Optional[int]
+ Minimum frequency (in days) at which the document is refreshed. The actual interval may be shorter, never longer. Only applicable when auto-sync is enabled. Leave unset to keep the current value.
+
+ tighten_only : typing.Optional[bool]
+ Folders only. When true, items already in the folder are only tightened to stay at least as strict as the folder, and keep any setting that is stricter than the folder's. When false, they are set to exactly the folder's auto-sync settings. Ignored for externally synced folders, whose contents always follow the folder's schedule.
+
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -1489,6 +1525,10 @@ async def update(
json={
"name": name,
"content": content,
+ "enable_auto_sync": enable_auto_sync,
+ "auto_remove": auto_remove,
+ "minimum_frequency_days": minimum_frequency_days,
+ "tighten_only": tighten_only,
},
headers={
"content-type": "application/json",
diff --git a/src/elevenlabs/conversational_ai/tests/invocations/client.py b/src/elevenlabs/conversational_ai/tests/invocations/client.py
index 8f205ffd6..de6e441a3 100644
--- a/src/elevenlabs/conversational_ai/tests/invocations/client.py
+++ b/src/elevenlabs/conversational_ai/tests/invocations/client.py
@@ -33,6 +33,7 @@ def list(
*,
agent_id: typing.Optional[str] = None,
branch_id: typing.Optional[str] = None,
+ created_by_user_id: typing.Optional[str] = None,
test_id: typing.Optional[str] = None,
start_time: typing.Optional[int] = None,
end_time: typing.Optional[int] = None,
@@ -53,6 +54,9 @@ def list(
branch_id : typing.Optional[str]
Filter by branch ID
+ created_by_user_id : typing.Optional[str]
+ Filter by test run creator user ID
+
test_id : typing.Optional[str]
Filter to invocations that include a run of this test id
@@ -92,6 +96,7 @@ def list(
client.conversational_ai.tests.invocations.list(
agent_id="agent_id",
branch_id="branch_id",
+ created_by_user_id="created_by_user_id",
test_id="test_id",
start_time=1,
end_time=1,
@@ -104,6 +109,7 @@ def list(
_response = self._raw_client.list(
agent_id=agent_id,
branch_id=branch_id,
+ created_by_user_id=created_by_user_id,
test_id=test_id,
start_time=start_time,
end_time=end_time,
@@ -300,6 +306,7 @@ async def list(
*,
agent_id: typing.Optional[str] = None,
branch_id: typing.Optional[str] = None,
+ created_by_user_id: typing.Optional[str] = None,
test_id: typing.Optional[str] = None,
start_time: typing.Optional[int] = None,
end_time: typing.Optional[int] = None,
@@ -320,6 +327,9 @@ async def list(
branch_id : typing.Optional[str]
Filter by branch ID
+ created_by_user_id : typing.Optional[str]
+ Filter by test run creator user ID
+
test_id : typing.Optional[str]
Filter to invocations that include a run of this test id
@@ -364,6 +374,7 @@ async def main() -> None:
await client.conversational_ai.tests.invocations.list(
agent_id="agent_id",
branch_id="branch_id",
+ created_by_user_id="created_by_user_id",
test_id="test_id",
start_time=1,
end_time=1,
@@ -379,6 +390,7 @@ async def main() -> None:
_response = await self._raw_client.list(
agent_id=agent_id,
branch_id=branch_id,
+ created_by_user_id=created_by_user_id,
test_id=test_id,
start_time=start_time,
end_time=end_time,
diff --git a/src/elevenlabs/conversational_ai/tests/invocations/raw_client.py b/src/elevenlabs/conversational_ai/tests/invocations/raw_client.py
index 62629b6a5..ab0ee2278 100644
--- a/src/elevenlabs/conversational_ai/tests/invocations/raw_client.py
+++ b/src/elevenlabs/conversational_ai/tests/invocations/raw_client.py
@@ -30,6 +30,7 @@ def list(
*,
agent_id: typing.Optional[str] = None,
branch_id: typing.Optional[str] = None,
+ created_by_user_id: typing.Optional[str] = None,
test_id: typing.Optional[str] = None,
start_time: typing.Optional[int] = None,
end_time: typing.Optional[int] = None,
@@ -50,6 +51,9 @@ def list(
branch_id : typing.Optional[str]
Filter by branch ID
+ created_by_user_id : typing.Optional[str]
+ Filter by test run creator user ID
+
test_id : typing.Optional[str]
Filter to invocations that include a run of this test id
@@ -85,6 +89,7 @@ def list(
params={
"agent_id": agent_id,
"branch_id": branch_id,
+ "created_by_user_id": created_by_user_id,
"test_id": test_id,
"start_time": start_time,
"end_time": end_time,
@@ -392,6 +397,7 @@ async def list(
*,
agent_id: typing.Optional[str] = None,
branch_id: typing.Optional[str] = None,
+ created_by_user_id: typing.Optional[str] = None,
test_id: typing.Optional[str] = None,
start_time: typing.Optional[int] = None,
end_time: typing.Optional[int] = None,
@@ -412,6 +418,9 @@ async def list(
branch_id : typing.Optional[str]
Filter by branch ID
+ created_by_user_id : typing.Optional[str]
+ Filter by test run creator user ID
+
test_id : typing.Optional[str]
Filter to invocations that include a run of this test id
@@ -447,6 +456,7 @@ async def list(
params={
"agent_id": agent_id,
"branch_id": branch_id,
+ "created_by_user_id": created_by_user_id,
"test_id": test_id,
"start_time": start_time,
"end_time": end_time,
diff --git a/src/elevenlabs/conversational_ai/triage_tickets/client.py b/src/elevenlabs/conversational_ai/triage_tickets/client.py
index 38d49f849..80f5a628e 100644
--- a/src/elevenlabs/conversational_ai/triage_tickets/client.py
+++ b/src/elevenlabs/conversational_ai/triage_tickets/client.py
@@ -476,6 +476,7 @@ def update(
agentqa_ticket_id: str,
*,
title: typing.Optional[str] = OMIT,
+ qa_comment: typing.Optional[str] = OMIT,
status: typing.Optional[AgentConversationTicketStatus] = OMIT,
assignee_user_id: typing.Optional[str] = OMIT,
priority: typing.Optional[AgentConversationTicketPriority] = OMIT,
@@ -491,6 +492,9 @@ def update(
title : typing.Optional[str]
If provided, updates the ticket title. Omit to leave unchanged.
+ qa_comment : typing.Optional[str]
+ If provided, updates the ticket description. Omit to leave unchanged.
+
status : typing.Optional[AgentConversationTicketStatus]
If provided, updates the ticket status. Omit to leave unchanged.
@@ -522,6 +526,7 @@ def update(
_response = self._raw_client.update(
agentqa_ticket_id,
title=title,
+ qa_comment=qa_comment,
status=status,
assignee_user_id=assignee_user_id,
priority=priority,
@@ -1168,6 +1173,7 @@ async def update(
agentqa_ticket_id: str,
*,
title: typing.Optional[str] = OMIT,
+ qa_comment: typing.Optional[str] = OMIT,
status: typing.Optional[AgentConversationTicketStatus] = OMIT,
assignee_user_id: typing.Optional[str] = OMIT,
priority: typing.Optional[AgentConversationTicketPriority] = OMIT,
@@ -1183,6 +1189,9 @@ async def update(
title : typing.Optional[str]
If provided, updates the ticket title. Omit to leave unchanged.
+ qa_comment : typing.Optional[str]
+ If provided, updates the ticket description. Omit to leave unchanged.
+
status : typing.Optional[AgentConversationTicketStatus]
If provided, updates the ticket status. Omit to leave unchanged.
@@ -1222,6 +1231,7 @@ async def main() -> None:
_response = await self._raw_client.update(
agentqa_ticket_id,
title=title,
+ qa_comment=qa_comment,
status=status,
assignee_user_id=assignee_user_id,
priority=priority,
diff --git a/src/elevenlabs/conversational_ai/triage_tickets/raw_client.py b/src/elevenlabs/conversational_ai/triage_tickets/raw_client.py
index ccaa5adcc..1c98ec4c3 100644
--- a/src/elevenlabs/conversational_ai/triage_tickets/raw_client.py
+++ b/src/elevenlabs/conversational_ai/triage_tickets/raw_client.py
@@ -601,6 +601,7 @@ def update(
agentqa_ticket_id: str,
*,
title: typing.Optional[str] = OMIT,
+ qa_comment: typing.Optional[str] = OMIT,
status: typing.Optional[AgentConversationTicketStatus] = OMIT,
assignee_user_id: typing.Optional[str] = OMIT,
priority: typing.Optional[AgentConversationTicketPriority] = OMIT,
@@ -616,6 +617,9 @@ def update(
title : typing.Optional[str]
If provided, updates the ticket title. Omit to leave unchanged.
+ qa_comment : typing.Optional[str]
+ If provided, updates the ticket description. Omit to leave unchanged.
+
status : typing.Optional[AgentConversationTicketStatus]
If provided, updates the ticket status. Omit to leave unchanged.
@@ -638,6 +642,7 @@ def update(
method="PATCH",
json={
"title": title,
+ "qa_comment": qa_comment,
"status": status,
"assignee_user_id": assignee_user_id,
"priority": priority,
@@ -1455,6 +1460,7 @@ async def update(
agentqa_ticket_id: str,
*,
title: typing.Optional[str] = OMIT,
+ qa_comment: typing.Optional[str] = OMIT,
status: typing.Optional[AgentConversationTicketStatus] = OMIT,
assignee_user_id: typing.Optional[str] = OMIT,
priority: typing.Optional[AgentConversationTicketPriority] = OMIT,
@@ -1470,6 +1476,9 @@ async def update(
title : typing.Optional[str]
If provided, updates the ticket title. Omit to leave unchanged.
+ qa_comment : typing.Optional[str]
+ If provided, updates the ticket description. Omit to leave unchanged.
+
status : typing.Optional[AgentConversationTicketStatus]
If provided, updates the ticket status. Omit to leave unchanged.
@@ -1492,6 +1501,7 @@ async def update(
method="PATCH",
json={
"title": title,
+ "qa_comment": qa_comment,
"status": status,
"assignee_user_id": assignee_user_id,
"priority": priority,
diff --git a/src/elevenlabs/core/client_wrapper.py b/src/elevenlabs/core/client_wrapper.py
index 7edd9639f..335d342a5 100644
--- a/src/elevenlabs/core/client_wrapper.py
+++ b/src/elevenlabs/core/client_wrapper.py
@@ -27,12 +27,12 @@ def get_headers(self) -> typing.Dict[str, str]:
import platform
headers: typing.Dict[str, str] = {
- "User-Agent": "elevenlabs/2.75.0",
+ "User-Agent": "elevenlabs/2.76.0",
"X-Fern-Language": "Python",
"X-Fern-Runtime": f"python/{platform.python_version()}",
"X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}",
"X-Fern-SDK-Name": "elevenlabs",
- "X-Fern-SDK-Version": "2.75.0",
+ "X-Fern-SDK-Version": "2.76.0",
**(self.get_custom_headers() or {}),
}
if self._api_key is not None:
diff --git a/src/elevenlabs/dubbing/project/raw_client.py b/src/elevenlabs/dubbing/project/raw_client.py
index 786054674..1122835b9 100644
--- a/src/elevenlabs/dubbing/project/raw_client.py
+++ b/src/elevenlabs/dubbing/project/raw_client.py
@@ -1,5 +1,6 @@
# This file was auto-generated by Fern from our API Definition.
+import json
import typing
from json.decoder import JSONDecodeError
@@ -169,8 +170,8 @@ def create(
"reference": reference,
"source_language": source_language,
"model_id": model_id,
- "keyterms": keyterms,
- "webhook_ids": webhook_ids,
+ "keyterms": json.dumps(jsonable_encoder(keyterms)),
+ "webhook_ids": json.dumps(jsonable_encoder(webhook_ids)),
"target_language": target_language,
},
files={
@@ -457,8 +458,8 @@ async def create(
"reference": reference,
"source_language": source_language,
"model_id": model_id,
- "keyterms": keyterms,
- "webhook_ids": webhook_ids,
+ "keyterms": json.dumps(jsonable_encoder(keyterms)),
+ "webhook_ids": json.dumps(jsonable_encoder(webhook_ids)),
"target_language": target_language,
},
files={
diff --git a/src/elevenlabs/music/finetunes/raw_client.py b/src/elevenlabs/music/finetunes/raw_client.py
index 022b07635..f3fc21640 100644
--- a/src/elevenlabs/music/finetunes/raw_client.py
+++ b/src/elevenlabs/music/finetunes/raw_client.py
@@ -1,5 +1,6 @@
# This file was auto-generated by Fern from our API Definition.
+import json
import typing
from json.decoder import JSONDecodeError
@@ -166,7 +167,7 @@ def create(
data={
"name": name,
"primary_genre": primary_genre,
- "tags": tags,
+ "tags": json.dumps(jsonable_encoder(tags)),
"visibility": visibility,
"model_id": model_id,
},
@@ -621,7 +622,7 @@ async def create(
data={
"name": name,
"primary_genre": primary_genre,
- "tags": tags,
+ "tags": json.dumps(jsonable_encoder(tags)),
"visibility": visibility,
"model_id": model_id,
},
diff --git a/src/elevenlabs/music/raw_client.py b/src/elevenlabs/music/raw_client.py
index b688f9aa4..95f97fbe0 100644
--- a/src/elevenlabs/music/raw_client.py
+++ b/src/elevenlabs/music/raw_client.py
@@ -9,6 +9,7 @@
from ..core.api_error import ApiError
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.http_response import AsyncHttpResponse, HttpResponse
+from ..core.jsonable_encoder import jsonable_encoder
from ..core.parse_error import ParsingError
from ..core.request_options import RequestOptions
from ..core.serialization import convert_and_respect_annotation_metadata
@@ -112,7 +113,7 @@ def video_to_music(
},
data={
"description": description,
- "tags": tags,
+ "tags": json.dumps(jsonable_encoder(tags)),
"model_id": model_id,
"add_sfx": add_sfx,
"separate_tracks": separate_tracks,
@@ -962,7 +963,7 @@ async def video_to_music(
},
data={
"description": description,
- "tags": tags,
+ "tags": json.dumps(jsonable_encoder(tags)),
"model_id": model_id,
"add_sfx": add_sfx,
"separate_tracks": separate_tracks,
diff --git a/src/elevenlabs/v_1_dubbing_realtime/types/__init__.py b/src/elevenlabs/reception/__init__.py
similarity index 52%
rename from src/elevenlabs/v_1_dubbing_realtime/types/__init__.py
rename to src/elevenlabs/reception/__init__.py
index 0e501df4c..5fdd6d500 100644
--- a/src/elevenlabs/v_1_dubbing_realtime/types/__init__.py
+++ b/src/elevenlabs/reception/__init__.py
@@ -6,15 +6,33 @@
from importlib import import_module
if typing.TYPE_CHECKING:
- from .receive_dubbing_stream_message import ReceiveDubbingStreamMessage
- from .send_dubbing_stream_message import SendDubbingStreamMessage
- from .text_to_dialogue_input_format import TextToDialogueInputFormat
- from .text_to_dialogue_output_format import TextToDialogueOutputFormat
+ from . import (
+ billing,
+ business_profile,
+ holidays,
+ knowledge_sources,
+ locations,
+ phone_numbers,
+ receptionists,
+ services,
+ staff,
+ subscriptions,
+ tiers,
+ workspaces,
+ )
_dynamic_imports: typing.Dict[str, str] = {
- "ReceiveDubbingStreamMessage": ".receive_dubbing_stream_message",
- "SendDubbingStreamMessage": ".send_dubbing_stream_message",
- "TextToDialogueInputFormat": ".text_to_dialogue_input_format",
- "TextToDialogueOutputFormat": ".text_to_dialogue_output_format",
+ "billing": ".billing",
+ "business_profile": ".business_profile",
+ "holidays": ".holidays",
+ "knowledge_sources": ".knowledge_sources",
+ "locations": ".locations",
+ "phone_numbers": ".phone_numbers",
+ "receptionists": ".receptionists",
+ "services": ".services",
+ "staff": ".staff",
+ "subscriptions": ".subscriptions",
+ "tiers": ".tiers",
+ "workspaces": ".workspaces",
}
@@ -40,8 +58,16 @@ def __dir__():
__all__ = [
- "ReceiveDubbingStreamMessage",
- "SendDubbingStreamMessage",
- "TextToDialogueInputFormat",
- "TextToDialogueOutputFormat",
+ "billing",
+ "business_profile",
+ "holidays",
+ "knowledge_sources",
+ "locations",
+ "phone_numbers",
+ "receptionists",
+ "services",
+ "staff",
+ "subscriptions",
+ "tiers",
+ "workspaces",
]
diff --git a/src/elevenlabs/reception/billing/__init__.py b/src/elevenlabs/reception/billing/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/billing/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/billing/client.py b/src/elevenlabs/reception/billing/client.py
new file mode 100644
index 000000000..cffdb9ccc
--- /dev/null
+++ b/src/elevenlabs/reception/billing/client.py
@@ -0,0 +1,270 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.reseller_invoice_detail import ResellerInvoiceDetail
+from ...types.reseller_invoices_response import ResellerInvoicesResponse
+from ...types.reseller_upcoming_payments_response import ResellerUpcomingPaymentsResponse
+from .raw_client import AsyncRawBillingClient, RawBillingClient
+
+
+class BillingClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawBillingClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawBillingClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawBillingClient
+ """
+ return self._raw_client
+
+ def list_invoices(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ResellerInvoicesResponse:
+ """
+ List the invoices charged to the reseller's card, newest first, one per workspace invoice
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of invoices per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerInvoicesResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.billing.list_invoices(
+ cursor="cursor",
+ page_size=1,
+ )
+ """
+ _response = self._raw_client.list_invoices(cursor=cursor, page_size=page_size, request_options=request_options)
+ return _response.data
+
+ def get_invoice(
+ self, invoice_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> ResellerInvoiceDetail:
+ """
+ Get one invoice charged to the reseller's card, broken down into the workspace invoice's lines
+
+ Parameters
+ ----------
+ invoice_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerInvoiceDetail
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.billing.get_invoice(
+ invoice_id="invoice_id",
+ )
+ """
+ _response = self._raw_client.get_invoice(invoice_id, request_options=request_options)
+ return _response.data
+
+ def list_upcoming_payments(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> ResellerUpcomingPaymentsResponse:
+ """
+ List the next workspace renewals the reseller's card will be charged for, soonest first
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerUpcomingPaymentsResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.billing.list_upcoming_payments()
+ """
+ _response = self._raw_client.list_upcoming_payments(request_options=request_options)
+ return _response.data
+
+
+class AsyncBillingClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawBillingClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawBillingClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawBillingClient
+ """
+ return self._raw_client
+
+ async def list_invoices(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ResellerInvoicesResponse:
+ """
+ List the invoices charged to the reseller's card, newest first, one per workspace invoice
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of invoices per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerInvoicesResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.billing.list_invoices(
+ cursor="cursor",
+ page_size=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list_invoices(
+ cursor=cursor, page_size=page_size, request_options=request_options
+ )
+ return _response.data
+
+ async def get_invoice(
+ self, invoice_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> ResellerInvoiceDetail:
+ """
+ Get one invoice charged to the reseller's card, broken down into the workspace invoice's lines
+
+ Parameters
+ ----------
+ invoice_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerInvoiceDetail
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.billing.get_invoice(
+ invoice_id="invoice_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get_invoice(invoice_id, request_options=request_options)
+ return _response.data
+
+ async def list_upcoming_payments(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> ResellerUpcomingPaymentsResponse:
+ """
+ List the next workspace renewals the reseller's card will be charged for, soonest first
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerUpcomingPaymentsResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.billing.list_upcoming_payments()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list_upcoming_payments(request_options=request_options)
+ return _response.data
diff --git a/src/elevenlabs/reception/billing/raw_client.py b/src/elevenlabs/reception/billing/raw_client.py
new file mode 100644
index 000000000..9276c9a27
--- /dev/null
+++ b/src/elevenlabs/reception/billing/raw_client.py
@@ -0,0 +1,365 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.reseller_invoice_detail import ResellerInvoiceDetail
+from ...types.reseller_invoices_response import ResellerInvoicesResponse
+from ...types.reseller_upcoming_payments_response import ResellerUpcomingPaymentsResponse
+from pydantic import ValidationError
+
+
+class RawBillingClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list_invoices(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ResellerInvoicesResponse]:
+ """
+ List the invoices charged to the reseller's card, newest first, one per workspace invoice
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of invoices per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ResellerInvoicesResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/billing/invoices",
+ method="GET",
+ params={
+ "cursor": cursor,
+ "page_size": page_size,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerInvoicesResponse,
+ construct_type(
+ type_=ResellerInvoicesResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def get_invoice(
+ self, invoice_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[ResellerInvoiceDetail]:
+ """
+ Get one invoice charged to the reseller's card, broken down into the workspace invoice's lines
+
+ Parameters
+ ----------
+ invoice_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ResellerInvoiceDetail]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/billing/invoices/{jsonable_encoder(invoice_id)}",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerInvoiceDetail,
+ construct_type(
+ type_=ResellerInvoiceDetail, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def list_upcoming_payments(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[ResellerUpcomingPaymentsResponse]:
+ """
+ List the next workspace renewals the reseller's card will be charged for, soonest first
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ResellerUpcomingPaymentsResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/billing/upcoming",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerUpcomingPaymentsResponse,
+ construct_type(
+ type_=ResellerUpcomingPaymentsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawBillingClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list_invoices(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ResellerInvoicesResponse]:
+ """
+ List the invoices charged to the reseller's card, newest first, one per workspace invoice
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of invoices per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ResellerInvoicesResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/billing/invoices",
+ method="GET",
+ params={
+ "cursor": cursor,
+ "page_size": page_size,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerInvoicesResponse,
+ construct_type(
+ type_=ResellerInvoicesResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def get_invoice(
+ self, invoice_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[ResellerInvoiceDetail]:
+ """
+ Get one invoice charged to the reseller's card, broken down into the workspace invoice's lines
+
+ Parameters
+ ----------
+ invoice_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ResellerInvoiceDetail]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/billing/invoices/{jsonable_encoder(invoice_id)}",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerInvoiceDetail,
+ construct_type(
+ type_=ResellerInvoiceDetail, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def list_upcoming_payments(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[ResellerUpcomingPaymentsResponse]:
+ """
+ List the next workspace renewals the reseller's card will be charged for, soonest first
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ResellerUpcomingPaymentsResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/billing/upcoming",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerUpcomingPaymentsResponse,
+ construct_type(
+ type_=ResellerUpcomingPaymentsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/business_profile/__init__.py b/src/elevenlabs/reception/business_profile/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/business_profile/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/business_profile/client.py b/src/elevenlabs/reception/business_profile/client.py
new file mode 100644
index 000000000..17c26f518
--- /dev/null
+++ b/src/elevenlabs/reception/business_profile/client.py
@@ -0,0 +1,204 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.smb_agent_info_response import SmbAgentInfoResponse
+from ...types.smb_update_agent_info_request import SmbUpdateAgentInfoRequest
+from .raw_client import AsyncRawBusinessProfileClient, RawBusinessProfileClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class BusinessProfileClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawBusinessProfileClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawBusinessProfileClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawBusinessProfileClient
+ """
+ return self._raw_client
+
+ def get(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> SmbAgentInfoResponse:
+ """
+ Get all agent-affecting configuration with current workspace time
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbAgentInfoResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.business_profile.get()
+ """
+ _response = self._raw_client.get(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def update(
+ self,
+ *,
+ request: SmbUpdateAgentInfoRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbAgentInfoResponse:
+ """
+ Update all agent-affecting configuration (triggers agent regeneration)
+
+ Parameters
+ ----------
+ request : SmbUpdateAgentInfoRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbAgentInfoResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateAgentInfoRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.business_profile.update(
+ request=SmbUpdateAgentInfoRequest(),
+ )
+ """
+ _response = self._raw_client.update(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncBusinessProfileClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawBusinessProfileClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawBusinessProfileClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawBusinessProfileClient
+ """
+ return self._raw_client
+
+ async def get(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> SmbAgentInfoResponse:
+ """
+ Get all agent-affecting configuration with current workspace time
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbAgentInfoResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.business_profile.get()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ async def update(
+ self,
+ *,
+ request: SmbUpdateAgentInfoRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbAgentInfoResponse:
+ """
+ Update all agent-affecting configuration (triggers agent regeneration)
+
+ Parameters
+ ----------
+ request : SmbUpdateAgentInfoRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbAgentInfoResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateAgentInfoRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.business_profile.update(
+ request=SmbUpdateAgentInfoRequest(),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/business_profile/raw_client.py b/src/elevenlabs/reception/business_profile/raw_client.py
new file mode 100644
index 000000000..cfef2b0fd
--- /dev/null
+++ b/src/elevenlabs/reception/business_profile/raw_client.py
@@ -0,0 +1,283 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.smb_agent_info_response import SmbAgentInfoResponse
+from ...types.smb_update_agent_info_request import SmbUpdateAgentInfoRequest
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawBusinessProfileClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def get(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[SmbAgentInfoResponse]:
+ """
+ Get all agent-affecting configuration with current workspace time
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbAgentInfoResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/agent-info",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbAgentInfoResponse,
+ construct_type(
+ type_=SmbAgentInfoResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ *,
+ request: SmbUpdateAgentInfoRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbAgentInfoResponse]:
+ """
+ Update all agent-affecting configuration (triggers agent regeneration)
+
+ Parameters
+ ----------
+ request : SmbUpdateAgentInfoRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbAgentInfoResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/agent-info",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateAgentInfoRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbAgentInfoResponse,
+ construct_type(
+ type_=SmbAgentInfoResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawBusinessProfileClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def get(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[SmbAgentInfoResponse]:
+ """
+ Get all agent-affecting configuration with current workspace time
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbAgentInfoResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/agent-info",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbAgentInfoResponse,
+ construct_type(
+ type_=SmbAgentInfoResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ *,
+ request: SmbUpdateAgentInfoRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbAgentInfoResponse]:
+ """
+ Update all agent-affecting configuration (triggers agent regeneration)
+
+ Parameters
+ ----------
+ request : SmbUpdateAgentInfoRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbAgentInfoResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/agent-info",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateAgentInfoRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbAgentInfoResponse,
+ construct_type(
+ type_=SmbAgentInfoResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/client.py b/src/elevenlabs/reception/client.py
new file mode 100644
index 000000000..de42de187
--- /dev/null
+++ b/src/elevenlabs/reception/client.py
@@ -0,0 +1,272 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from __future__ import annotations
+
+import typing
+
+from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from .raw_client import AsyncRawReceptionClient, RawReceptionClient
+
+if typing.TYPE_CHECKING:
+ from .billing.client import AsyncBillingClient, BillingClient
+ from .business_profile.client import AsyncBusinessProfileClient, BusinessProfileClient
+ from .holidays.client import AsyncHolidaysClient, HolidaysClient
+ from .knowledge_sources.client import AsyncKnowledgeSourcesClient, KnowledgeSourcesClient
+ from .locations.client import AsyncLocationsClient, LocationsClient
+ from .phone_numbers.client import AsyncPhoneNumbersClient, PhoneNumbersClient
+ from .receptionists.client import AsyncReceptionistsClient, ReceptionistsClient
+ from .services.client import AsyncServicesClient, ServicesClient
+ from .staff.client import AsyncStaffClient, StaffClient
+ from .subscriptions.client import AsyncSubscriptionsClient, SubscriptionsClient
+ from .tiers.client import AsyncTiersClient, TiersClient
+ from .workspaces.client import AsyncWorkspacesClient, WorkspacesClient
+
+
+class ReceptionClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawReceptionClient(client_wrapper=client_wrapper)
+ self._client_wrapper = client_wrapper
+ self._services: typing.Optional[ServicesClient] = None
+ self._staff: typing.Optional[StaffClient] = None
+ self._receptionists: typing.Optional[ReceptionistsClient] = None
+ self._phone_numbers: typing.Optional[PhoneNumbersClient] = None
+ self._holidays: typing.Optional[HolidaysClient] = None
+ self._locations: typing.Optional[LocationsClient] = None
+ self._business_profile: typing.Optional[BusinessProfileClient] = None
+ self._knowledge_sources: typing.Optional[KnowledgeSourcesClient] = None
+ self._workspaces: typing.Optional[WorkspacesClient] = None
+ self._subscriptions: typing.Optional[SubscriptionsClient] = None
+ self._tiers: typing.Optional[TiersClient] = None
+ self._billing: typing.Optional[BillingClient] = None
+
+ @property
+ def with_raw_response(self) -> RawReceptionClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawReceptionClient
+ """
+ return self._raw_client
+
+ @property
+ def services(self):
+ if self._services is None:
+ from .services.client import ServicesClient # noqa: E402
+
+ self._services = ServicesClient(client_wrapper=self._client_wrapper)
+ return self._services
+
+ @property
+ def staff(self):
+ if self._staff is None:
+ from .staff.client import StaffClient # noqa: E402
+
+ self._staff = StaffClient(client_wrapper=self._client_wrapper)
+ return self._staff
+
+ @property
+ def receptionists(self):
+ if self._receptionists is None:
+ from .receptionists.client import ReceptionistsClient # noqa: E402
+
+ self._receptionists = ReceptionistsClient(client_wrapper=self._client_wrapper)
+ return self._receptionists
+
+ @property
+ def phone_numbers(self):
+ if self._phone_numbers is None:
+ from .phone_numbers.client import PhoneNumbersClient # noqa: E402
+
+ self._phone_numbers = PhoneNumbersClient(client_wrapper=self._client_wrapper)
+ return self._phone_numbers
+
+ @property
+ def holidays(self):
+ if self._holidays is None:
+ from .holidays.client import HolidaysClient # noqa: E402
+
+ self._holidays = HolidaysClient(client_wrapper=self._client_wrapper)
+ return self._holidays
+
+ @property
+ def locations(self):
+ if self._locations is None:
+ from .locations.client import LocationsClient # noqa: E402
+
+ self._locations = LocationsClient(client_wrapper=self._client_wrapper)
+ return self._locations
+
+ @property
+ def business_profile(self):
+ if self._business_profile is None:
+ from .business_profile.client import BusinessProfileClient # noqa: E402
+
+ self._business_profile = BusinessProfileClient(client_wrapper=self._client_wrapper)
+ return self._business_profile
+
+ @property
+ def knowledge_sources(self):
+ if self._knowledge_sources is None:
+ from .knowledge_sources.client import KnowledgeSourcesClient # noqa: E402
+
+ self._knowledge_sources = KnowledgeSourcesClient(client_wrapper=self._client_wrapper)
+ return self._knowledge_sources
+
+ @property
+ def workspaces(self):
+ if self._workspaces is None:
+ from .workspaces.client import WorkspacesClient # noqa: E402
+
+ self._workspaces = WorkspacesClient(client_wrapper=self._client_wrapper)
+ return self._workspaces
+
+ @property
+ def subscriptions(self):
+ if self._subscriptions is None:
+ from .subscriptions.client import SubscriptionsClient # noqa: E402
+
+ self._subscriptions = SubscriptionsClient(client_wrapper=self._client_wrapper)
+ return self._subscriptions
+
+ @property
+ def tiers(self):
+ if self._tiers is None:
+ from .tiers.client import TiersClient # noqa: E402
+
+ self._tiers = TiersClient(client_wrapper=self._client_wrapper)
+ return self._tiers
+
+ @property
+ def billing(self):
+ if self._billing is None:
+ from .billing.client import BillingClient # noqa: E402
+
+ self._billing = BillingClient(client_wrapper=self._client_wrapper)
+ return self._billing
+
+
+class AsyncReceptionClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawReceptionClient(client_wrapper=client_wrapper)
+ self._client_wrapper = client_wrapper
+ self._services: typing.Optional[AsyncServicesClient] = None
+ self._staff: typing.Optional[AsyncStaffClient] = None
+ self._receptionists: typing.Optional[AsyncReceptionistsClient] = None
+ self._phone_numbers: typing.Optional[AsyncPhoneNumbersClient] = None
+ self._holidays: typing.Optional[AsyncHolidaysClient] = None
+ self._locations: typing.Optional[AsyncLocationsClient] = None
+ self._business_profile: typing.Optional[AsyncBusinessProfileClient] = None
+ self._knowledge_sources: typing.Optional[AsyncKnowledgeSourcesClient] = None
+ self._workspaces: typing.Optional[AsyncWorkspacesClient] = None
+ self._subscriptions: typing.Optional[AsyncSubscriptionsClient] = None
+ self._tiers: typing.Optional[AsyncTiersClient] = None
+ self._billing: typing.Optional[AsyncBillingClient] = None
+
+ @property
+ def with_raw_response(self) -> AsyncRawReceptionClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawReceptionClient
+ """
+ return self._raw_client
+
+ @property
+ def services(self):
+ if self._services is None:
+ from .services.client import AsyncServicesClient # noqa: E402
+
+ self._services = AsyncServicesClient(client_wrapper=self._client_wrapper)
+ return self._services
+
+ @property
+ def staff(self):
+ if self._staff is None:
+ from .staff.client import AsyncStaffClient # noqa: E402
+
+ self._staff = AsyncStaffClient(client_wrapper=self._client_wrapper)
+ return self._staff
+
+ @property
+ def receptionists(self):
+ if self._receptionists is None:
+ from .receptionists.client import AsyncReceptionistsClient # noqa: E402
+
+ self._receptionists = AsyncReceptionistsClient(client_wrapper=self._client_wrapper)
+ return self._receptionists
+
+ @property
+ def phone_numbers(self):
+ if self._phone_numbers is None:
+ from .phone_numbers.client import AsyncPhoneNumbersClient # noqa: E402
+
+ self._phone_numbers = AsyncPhoneNumbersClient(client_wrapper=self._client_wrapper)
+ return self._phone_numbers
+
+ @property
+ def holidays(self):
+ if self._holidays is None:
+ from .holidays.client import AsyncHolidaysClient # noqa: E402
+
+ self._holidays = AsyncHolidaysClient(client_wrapper=self._client_wrapper)
+ return self._holidays
+
+ @property
+ def locations(self):
+ if self._locations is None:
+ from .locations.client import AsyncLocationsClient # noqa: E402
+
+ self._locations = AsyncLocationsClient(client_wrapper=self._client_wrapper)
+ return self._locations
+
+ @property
+ def business_profile(self):
+ if self._business_profile is None:
+ from .business_profile.client import AsyncBusinessProfileClient # noqa: E402
+
+ self._business_profile = AsyncBusinessProfileClient(client_wrapper=self._client_wrapper)
+ return self._business_profile
+
+ @property
+ def knowledge_sources(self):
+ if self._knowledge_sources is None:
+ from .knowledge_sources.client import AsyncKnowledgeSourcesClient # noqa: E402
+
+ self._knowledge_sources = AsyncKnowledgeSourcesClient(client_wrapper=self._client_wrapper)
+ return self._knowledge_sources
+
+ @property
+ def workspaces(self):
+ if self._workspaces is None:
+ from .workspaces.client import AsyncWorkspacesClient # noqa: E402
+
+ self._workspaces = AsyncWorkspacesClient(client_wrapper=self._client_wrapper)
+ return self._workspaces
+
+ @property
+ def subscriptions(self):
+ if self._subscriptions is None:
+ from .subscriptions.client import AsyncSubscriptionsClient # noqa: E402
+
+ self._subscriptions = AsyncSubscriptionsClient(client_wrapper=self._client_wrapper)
+ return self._subscriptions
+
+ @property
+ def tiers(self):
+ if self._tiers is None:
+ from .tiers.client import AsyncTiersClient # noqa: E402
+
+ self._tiers = AsyncTiersClient(client_wrapper=self._client_wrapper)
+ return self._tiers
+
+ @property
+ def billing(self):
+ if self._billing is None:
+ from .billing.client import AsyncBillingClient # noqa: E402
+
+ self._billing = AsyncBillingClient(client_wrapper=self._client_wrapper)
+ return self._billing
diff --git a/src/elevenlabs/reception/holidays/__init__.py b/src/elevenlabs/reception/holidays/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/holidays/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/holidays/client.py b/src/elevenlabs/reception/holidays/client.py
new file mode 100644
index 000000000..6d4671bd1
--- /dev/null
+++ b/src/elevenlabs/reception/holidays/client.py
@@ -0,0 +1,582 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.holiday_response_model import HolidayResponseModel
+from ...types.smb_create_holiday_request import SmbCreateHolidayRequest
+from ...types.smb_update_holiday_request_patch import SmbUpdateHolidayRequestPatch
+from ...types.time_off_type import TimeOffType
+from .raw_client import AsyncRawHolidaysClient, RawHolidaysClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class HolidaysClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawHolidaysClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawHolidaysClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawHolidaysClient
+ """
+ return self._raw_client
+
+ def list(
+ self,
+ *,
+ start_unix: typing.Optional[int] = None,
+ end_unix: typing.Optional[int] = None,
+ time_off_type: typing.Optional[TimeOffType] = None,
+ resource_id: typing.Optional[str] = None,
+ location_id: typing.Optional[str] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[HolidayResponseModel]:
+ """
+ Get all holidays/time-off entries for the current workspace with optional filters
+
+ Parameters
+ ----------
+ start_unix : typing.Optional[int]
+ Filter entries overlapping from this timestamp
+
+ end_unix : typing.Optional[int]
+ Filter entries overlapping before this timestamp
+
+ time_off_type : typing.Optional[TimeOffType]
+ Filter by type: location, staff, or asset
+
+ resource_id : typing.Optional[str]
+ Filter by associated resource ID (staff/asset)
+
+ location_id : typing.Optional[str]
+ Filter by location ID
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[HolidayResponseModel]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.holidays.list(
+ start_unix=1,
+ end_unix=1,
+ time_off_type="staff",
+ resource_id="resource_id",
+ location_id="location_id",
+ )
+ """
+ _response = self._raw_client.list(
+ start_unix=start_unix,
+ end_unix=end_unix,
+ time_off_type=time_off_type,
+ resource_id=resource_id,
+ location_id=location_id,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
+
+ def create(
+ self,
+ *,
+ request: SmbCreateHolidayRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HolidayResponseModel:
+ """
+ Create a new holiday
+
+ Parameters
+ ----------
+ request : SmbCreateHolidayRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HolidayResponseModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import DateModel, ElevenLabs, SmbCreateHolidayRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.holidays.create(
+ request=SmbCreateHolidayRequest(
+ name="name",
+ start_date=DateModel(
+ year=1,
+ month=1,
+ day=1,
+ ),
+ end_date=DateModel(
+ year=1,
+ month=1,
+ day=1,
+ ),
+ time_off_type="staff",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def get(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HolidayResponseModel:
+ """
+ Get a specific holiday by ID
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HolidayResponseModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.holidays.get(
+ holiday_id="holiday_id",
+ )
+ """
+ _response = self._raw_client.get(holiday_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def update(
+ self,
+ holiday_id: str,
+ *,
+ request: SmbUpdateHolidayRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HolidayResponseModel:
+ """
+ Update an existing holiday. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ request : SmbUpdateHolidayRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HolidayResponseModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateHolidayRequestPatch
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.holidays.update(
+ holiday_id="holiday_id",
+ request=SmbUpdateHolidayRequestPatch(),
+ )
+ """
+ _response = self._raw_client.update(
+ holiday_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a holiday
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.holidays.delete(
+ holiday_id="holiday_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ holiday_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncHolidaysClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawHolidaysClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawHolidaysClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawHolidaysClient
+ """
+ return self._raw_client
+
+ async def list(
+ self,
+ *,
+ start_unix: typing.Optional[int] = None,
+ end_unix: typing.Optional[int] = None,
+ time_off_type: typing.Optional[TimeOffType] = None,
+ resource_id: typing.Optional[str] = None,
+ location_id: typing.Optional[str] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[HolidayResponseModel]:
+ """
+ Get all holidays/time-off entries for the current workspace with optional filters
+
+ Parameters
+ ----------
+ start_unix : typing.Optional[int]
+ Filter entries overlapping from this timestamp
+
+ end_unix : typing.Optional[int]
+ Filter entries overlapping before this timestamp
+
+ time_off_type : typing.Optional[TimeOffType]
+ Filter by type: location, staff, or asset
+
+ resource_id : typing.Optional[str]
+ Filter by associated resource ID (staff/asset)
+
+ location_id : typing.Optional[str]
+ Filter by location ID
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[HolidayResponseModel]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.holidays.list(
+ start_unix=1,
+ end_unix=1,
+ time_off_type="staff",
+ resource_id="resource_id",
+ location_id="location_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(
+ start_unix=start_unix,
+ end_unix=end_unix,
+ time_off_type=time_off_type,
+ resource_id=resource_id,
+ location_id=location_id,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
+
+ async def create(
+ self,
+ *,
+ request: SmbCreateHolidayRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HolidayResponseModel:
+ """
+ Create a new holiday
+
+ Parameters
+ ----------
+ request : SmbCreateHolidayRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HolidayResponseModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, DateModel, SmbCreateHolidayRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.holidays.create(
+ request=SmbCreateHolidayRequest(
+ name="name",
+ start_date=DateModel(
+ year=1,
+ month=1,
+ day=1,
+ ),
+ end_date=DateModel(
+ year=1,
+ month=1,
+ day=1,
+ ),
+ time_off_type="staff",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def get(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HolidayResponseModel:
+ """
+ Get a specific holiday by ID
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HolidayResponseModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.holidays.get(
+ holiday_id="holiday_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get(
+ holiday_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ holiday_id: str,
+ *,
+ request: SmbUpdateHolidayRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HolidayResponseModel:
+ """
+ Update an existing holiday. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ request : SmbUpdateHolidayRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HolidayResponseModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateHolidayRequestPatch
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.holidays.update(
+ holiday_id="holiday_id",
+ request=SmbUpdateHolidayRequestPatch(),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ holiday_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a holiday
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.holidays.delete(
+ holiday_id="holiday_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ holiday_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/holidays/raw_client.py b/src/elevenlabs/reception/holidays/raw_client.py
new file mode 100644
index 000000000..e21a4b1d1
--- /dev/null
+++ b/src/elevenlabs/reception/holidays/raw_client.py
@@ -0,0 +1,744 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.holiday_response_model import HolidayResponseModel
+from ...types.smb_create_holiday_request import SmbCreateHolidayRequest
+from ...types.smb_update_holiday_request_patch import SmbUpdateHolidayRequestPatch
+from ...types.time_off_type import TimeOffType
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawHolidaysClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self,
+ *,
+ start_unix: typing.Optional[int] = None,
+ end_unix: typing.Optional[int] = None,
+ time_off_type: typing.Optional[TimeOffType] = None,
+ resource_id: typing.Optional[str] = None,
+ location_id: typing.Optional[str] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.List[HolidayResponseModel]]:
+ """
+ Get all holidays/time-off entries for the current workspace with optional filters
+
+ Parameters
+ ----------
+ start_unix : typing.Optional[int]
+ Filter entries overlapping from this timestamp
+
+ end_unix : typing.Optional[int]
+ Filter entries overlapping before this timestamp
+
+ time_off_type : typing.Optional[TimeOffType]
+ Filter by type: location, staff, or asset
+
+ resource_id : typing.Optional[str]
+ Filter by associated resource ID (staff/asset)
+
+ location_id : typing.Optional[str]
+ Filter by location ID
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[HolidayResponseModel]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/holidays",
+ method="GET",
+ params={
+ "start_unix": start_unix,
+ "end_unix": end_unix,
+ "time_off_type": time_off_type,
+ "resource_id": resource_id,
+ "location_id": location_id,
+ },
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[HolidayResponseModel],
+ construct_type(
+ type_=typing.List[HolidayResponseModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ *,
+ request: SmbCreateHolidayRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[HolidayResponseModel]:
+ """
+ Create a new holiday
+
+ Parameters
+ ----------
+ request : SmbCreateHolidayRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[HolidayResponseModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/holidays",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateHolidayRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ HolidayResponseModel,
+ construct_type(
+ type_=HolidayResponseModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def get(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[HolidayResponseModel]:
+ """
+ Get a specific holiday by ID
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[HolidayResponseModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/holidays/{jsonable_encoder(holiday_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ HolidayResponseModel,
+ construct_type(
+ type_=HolidayResponseModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ holiday_id: str,
+ *,
+ request: SmbUpdateHolidayRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[HolidayResponseModel]:
+ """
+ Update an existing holiday. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ request : SmbUpdateHolidayRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[HolidayResponseModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/holidays/{jsonable_encoder(holiday_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateHolidayRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ HolidayResponseModel,
+ construct_type(
+ type_=HolidayResponseModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a holiday
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/holidays/{jsonable_encoder(holiday_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawHolidaysClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self,
+ *,
+ start_unix: typing.Optional[int] = None,
+ end_unix: typing.Optional[int] = None,
+ time_off_type: typing.Optional[TimeOffType] = None,
+ resource_id: typing.Optional[str] = None,
+ location_id: typing.Optional[str] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.List[HolidayResponseModel]]:
+ """
+ Get all holidays/time-off entries for the current workspace with optional filters
+
+ Parameters
+ ----------
+ start_unix : typing.Optional[int]
+ Filter entries overlapping from this timestamp
+
+ end_unix : typing.Optional[int]
+ Filter entries overlapping before this timestamp
+
+ time_off_type : typing.Optional[TimeOffType]
+ Filter by type: location, staff, or asset
+
+ resource_id : typing.Optional[str]
+ Filter by associated resource ID (staff/asset)
+
+ location_id : typing.Optional[str]
+ Filter by location ID
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[HolidayResponseModel]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/holidays",
+ method="GET",
+ params={
+ "start_unix": start_unix,
+ "end_unix": end_unix,
+ "time_off_type": time_off_type,
+ "resource_id": resource_id,
+ "location_id": location_id,
+ },
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[HolidayResponseModel],
+ construct_type(
+ type_=typing.List[HolidayResponseModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ *,
+ request: SmbCreateHolidayRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[HolidayResponseModel]:
+ """
+ Create a new holiday
+
+ Parameters
+ ----------
+ request : SmbCreateHolidayRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[HolidayResponseModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/holidays",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateHolidayRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ HolidayResponseModel,
+ construct_type(
+ type_=HolidayResponseModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def get(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[HolidayResponseModel]:
+ """
+ Get a specific holiday by ID
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[HolidayResponseModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/holidays/{jsonable_encoder(holiday_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ HolidayResponseModel,
+ construct_type(
+ type_=HolidayResponseModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ holiday_id: str,
+ *,
+ request: SmbUpdateHolidayRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[HolidayResponseModel]:
+ """
+ Update an existing holiday. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ request : SmbUpdateHolidayRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[HolidayResponseModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/holidays/{jsonable_encoder(holiday_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateHolidayRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ HolidayResponseModel,
+ construct_type(
+ type_=HolidayResponseModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ holiday_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a holiday
+
+ Parameters
+ ----------
+ holiday_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/holidays/{jsonable_encoder(holiday_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/knowledge_sources/__init__.py b/src/elevenlabs/reception/knowledge_sources/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/knowledge_sources/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/knowledge_sources/client.py b/src/elevenlabs/reception/knowledge_sources/client.py
new file mode 100644
index 000000000..9435fd8be
--- /dev/null
+++ b/src/elevenlabs/reception/knowledge_sources/client.py
@@ -0,0 +1,471 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ... import core
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.add_url_request import AddUrlRequest
+from ...types.smb_knowledge_source_db_model import SmbKnowledgeSourceDbModel
+from .raw_client import AsyncRawKnowledgeSourcesClient, RawKnowledgeSourcesClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class KnowledgeSourcesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawKnowledgeSourcesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawKnowledgeSourcesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawKnowledgeSourcesClient
+ """
+ return self._raw_client
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbKnowledgeSourceDbModel]:
+ """
+ List all knowledge sources for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbKnowledgeSourceDbModel]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.knowledge_sources.list()
+ """
+ _response = self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def upload(
+ self,
+ *,
+ file: core.File,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbKnowledgeSourceDbModel:
+ """
+ Upload a file as a knowledge source
+
+ Parameters
+ ----------
+ file : core.File
+ See core.File for more documentation
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbKnowledgeSourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.knowledge_sources.upload()
+ """
+ _response = self._raw_client.upload(file=file, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def get(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbKnowledgeSourceDbModel:
+ """
+ Get a specific knowledge source by ID
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbKnowledgeSourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.knowledge_sources.get(
+ source_id="source_id",
+ )
+ """
+ _response = self._raw_client.get(source_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def delete(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a knowledge source
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.knowledge_sources.delete(
+ source_id="source_id",
+ )
+ """
+ _response = self._raw_client.delete(source_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def add_url(
+ self,
+ *,
+ request: AddUrlRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbKnowledgeSourceDbModel:
+ """
+ Add a URL as a knowledge source
+
+ Parameters
+ ----------
+ request : AddUrlRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbKnowledgeSourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import AddUrlRequest, ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.knowledge_sources.add_url(
+ request=AddUrlRequest(
+ url="url",
+ ),
+ )
+ """
+ _response = self._raw_client.add_url(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncKnowledgeSourcesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawKnowledgeSourcesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawKnowledgeSourcesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawKnowledgeSourcesClient
+ """
+ return self._raw_client
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbKnowledgeSourceDbModel]:
+ """
+ List all knowledge sources for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbKnowledgeSourceDbModel]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.knowledge_sources.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ async def upload(
+ self,
+ *,
+ file: core.File,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbKnowledgeSourceDbModel:
+ """
+ Upload a file as a knowledge source
+
+ Parameters
+ ----------
+ file : core.File
+ See core.File for more documentation
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbKnowledgeSourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.knowledge_sources.upload()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.upload(
+ file=file, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def get(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbKnowledgeSourceDbModel:
+ """
+ Get a specific knowledge source by ID
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbKnowledgeSourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.knowledge_sources.get(
+ source_id="source_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get(
+ source_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a knowledge source
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.knowledge_sources.delete(
+ source_id="source_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ source_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def add_url(
+ self,
+ *,
+ request: AddUrlRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbKnowledgeSourceDbModel:
+ """
+ Add a URL as a knowledge source
+
+ Parameters
+ ----------
+ request : AddUrlRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbKnowledgeSourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AddUrlRequest, AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.knowledge_sources.add_url(
+ request=AddUrlRequest(
+ url="url",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.add_url(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/knowledge_sources/raw_client.py b/src/elevenlabs/reception/knowledge_sources/raw_client.py
new file mode 100644
index 000000000..15a8dbb25
--- /dev/null
+++ b/src/elevenlabs/reception/knowledge_sources/raw_client.py
@@ -0,0 +1,677 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ... import core
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.add_url_request import AddUrlRequest
+from ...types.smb_knowledge_source_db_model import SmbKnowledgeSourceDbModel
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawKnowledgeSourcesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.List[SmbKnowledgeSourceDbModel]]:
+ """
+ List all knowledge sources for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[SmbKnowledgeSourceDbModel]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/knowledge-sources",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbKnowledgeSourceDbModel],
+ construct_type(
+ type_=typing.List[SmbKnowledgeSourceDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def upload(
+ self,
+ *,
+ file: core.File,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbKnowledgeSourceDbModel]:
+ """
+ Upload a file as a knowledge source
+
+ Parameters
+ ----------
+ file : core.File
+ See core.File for more documentation
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbKnowledgeSourceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/knowledge-sources",
+ method="POST",
+ data={},
+ files={
+ "file": file,
+ },
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ force_multipart=True,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbKnowledgeSourceDbModel,
+ construct_type(
+ type_=SmbKnowledgeSourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def get(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbKnowledgeSourceDbModel]:
+ """
+ Get a specific knowledge source by ID
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbKnowledgeSourceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/knowledge-sources/{jsonable_encoder(source_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbKnowledgeSourceDbModel,
+ construct_type(
+ type_=SmbKnowledgeSourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a knowledge source
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/knowledge-sources/{jsonable_encoder(source_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def add_url(
+ self,
+ *,
+ request: AddUrlRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbKnowledgeSourceDbModel]:
+ """
+ Add a URL as a knowledge source
+
+ Parameters
+ ----------
+ request : AddUrlRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbKnowledgeSourceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/knowledge-sources/urls",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=AddUrlRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbKnowledgeSourceDbModel,
+ construct_type(
+ type_=SmbKnowledgeSourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawKnowledgeSourcesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.List[SmbKnowledgeSourceDbModel]]:
+ """
+ List all knowledge sources for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[SmbKnowledgeSourceDbModel]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/knowledge-sources",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbKnowledgeSourceDbModel],
+ construct_type(
+ type_=typing.List[SmbKnowledgeSourceDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def upload(
+ self,
+ *,
+ file: core.File,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbKnowledgeSourceDbModel]:
+ """
+ Upload a file as a knowledge source
+
+ Parameters
+ ----------
+ file : core.File
+ See core.File for more documentation
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbKnowledgeSourceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/knowledge-sources",
+ method="POST",
+ data={},
+ files={
+ "file": file,
+ },
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ force_multipart=True,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbKnowledgeSourceDbModel,
+ construct_type(
+ type_=SmbKnowledgeSourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def get(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbKnowledgeSourceDbModel]:
+ """
+ Get a specific knowledge source by ID
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbKnowledgeSourceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/knowledge-sources/{jsonable_encoder(source_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbKnowledgeSourceDbModel,
+ construct_type(
+ type_=SmbKnowledgeSourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ source_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a knowledge source
+
+ Parameters
+ ----------
+ source_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/knowledge-sources/{jsonable_encoder(source_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def add_url(
+ self,
+ *,
+ request: AddUrlRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbKnowledgeSourceDbModel]:
+ """
+ Add a URL as a knowledge source
+
+ Parameters
+ ----------
+ request : AddUrlRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbKnowledgeSourceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/knowledge-sources/urls",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=AddUrlRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbKnowledgeSourceDbModel,
+ construct_type(
+ type_=SmbKnowledgeSourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/locations/__init__.py b/src/elevenlabs/reception/locations/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/locations/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/locations/client.py b/src/elevenlabs/reception/locations/client.py
new file mode 100644
index 000000000..b142c7e1b
--- /dev/null
+++ b/src/elevenlabs/reception/locations/client.py
@@ -0,0 +1,485 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.location_response import LocationResponse
+from ...types.smb_location_request import SmbLocationRequest
+from ...types.smb_location_request_patch import SmbLocationRequestPatch
+from .raw_client import AsyncRawLocationsClient, RawLocationsClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class LocationsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawLocationsClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawLocationsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawLocationsClient
+ """
+ return self._raw_client
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[LocationResponse]:
+ """
+ List all business locations.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[LocationResponse]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.locations.list()
+ """
+ _response = self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def create(
+ self,
+ *,
+ request: SmbLocationRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LocationResponse:
+ """
+ Add a new business location.
+
+ Parameters
+ ----------
+ request : SmbLocationRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LocationResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbLocationRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.locations.create(
+ request=SmbLocationRequest(
+ name="name",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def get(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LocationResponse:
+ """
+ Get a single location by ID.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LocationResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.locations.get(
+ location_id="location_id",
+ )
+ """
+ _response = self._raw_client.get(location_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def update(
+ self,
+ location_id: str,
+ *,
+ request: SmbLocationRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LocationResponse:
+ """
+ Update an existing location. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ location_id : str
+
+ request : SmbLocationRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LocationResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbLocationRequestPatch
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.locations.update(
+ location_id="location_id",
+ request=SmbLocationRequestPatch(),
+ )
+ """
+ _response = self._raw_client.update(
+ location_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a location.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.locations.delete(
+ location_id="location_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ location_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncLocationsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawLocationsClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawLocationsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawLocationsClient
+ """
+ return self._raw_client
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[LocationResponse]:
+ """
+ List all business locations.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[LocationResponse]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.locations.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ async def create(
+ self,
+ *,
+ request: SmbLocationRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LocationResponse:
+ """
+ Add a new business location.
+
+ Parameters
+ ----------
+ request : SmbLocationRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LocationResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbLocationRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.locations.create(
+ request=SmbLocationRequest(
+ name="name",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def get(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LocationResponse:
+ """
+ Get a single location by ID.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LocationResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.locations.get(
+ location_id="location_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get(
+ location_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ location_id: str,
+ *,
+ request: SmbLocationRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LocationResponse:
+ """
+ Update an existing location. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ location_id : str
+
+ request : SmbLocationRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LocationResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbLocationRequestPatch
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.locations.update(
+ location_id="location_id",
+ request=SmbLocationRequestPatch(),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ location_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a location.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.locations.delete(
+ location_id="location_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ location_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/locations/raw_client.py b/src/elevenlabs/reception/locations/raw_client.py
new file mode 100644
index 000000000..8f92366d5
--- /dev/null
+++ b/src/elevenlabs/reception/locations/raw_client.py
@@ -0,0 +1,683 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.location_response import LocationResponse
+from ...types.smb_location_request import SmbLocationRequest
+from ...types.smb_location_request_patch import SmbLocationRequestPatch
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawLocationsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.List[LocationResponse]]:
+ """
+ List all business locations.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[LocationResponse]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/locations",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[LocationResponse],
+ construct_type(
+ type_=typing.List[LocationResponse], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ *,
+ request: SmbLocationRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[LocationResponse]:
+ """
+ Add a new business location.
+
+ Parameters
+ ----------
+ request : SmbLocationRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[LocationResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/locations",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbLocationRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ LocationResponse,
+ construct_type(
+ type_=LocationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def get(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[LocationResponse]:
+ """
+ Get a single location by ID.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[LocationResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/locations/{jsonable_encoder(location_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ LocationResponse,
+ construct_type(
+ type_=LocationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ location_id: str,
+ *,
+ request: SmbLocationRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[LocationResponse]:
+ """
+ Update an existing location. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ location_id : str
+
+ request : SmbLocationRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[LocationResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/locations/{jsonable_encoder(location_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbLocationRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ LocationResponse,
+ construct_type(
+ type_=LocationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a location.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/locations/{jsonable_encoder(location_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawLocationsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.List[LocationResponse]]:
+ """
+ List all business locations.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[LocationResponse]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/locations",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[LocationResponse],
+ construct_type(
+ type_=typing.List[LocationResponse], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ *,
+ request: SmbLocationRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[LocationResponse]:
+ """
+ Add a new business location.
+
+ Parameters
+ ----------
+ request : SmbLocationRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[LocationResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/locations",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbLocationRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ LocationResponse,
+ construct_type(
+ type_=LocationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def get(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[LocationResponse]:
+ """
+ Get a single location by ID.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[LocationResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/locations/{jsonable_encoder(location_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ LocationResponse,
+ construct_type(
+ type_=LocationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ location_id: str,
+ *,
+ request: SmbLocationRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[LocationResponse]:
+ """
+ Update an existing location. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ location_id : str
+
+ request : SmbLocationRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[LocationResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/locations/{jsonable_encoder(location_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbLocationRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ LocationResponse,
+ construct_type(
+ type_=LocationResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ location_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a location.
+
+ Parameters
+ ----------
+ location_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/locations/{jsonable_encoder(location_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/phone_numbers/__init__.py b/src/elevenlabs/reception/phone_numbers/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/phone_numbers/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/phone_numbers/client.py b/src/elevenlabs/reception/phone_numbers/client.py
new file mode 100644
index 000000000..456324856
--- /dev/null
+++ b/src/elevenlabs/reception/phone_numbers/client.py
@@ -0,0 +1,424 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.application_number_type import ApplicationNumberType
+from ...types.smb_phone_assignment_db_model import SmbPhoneAssignmentDbModel
+from .raw_client import AsyncRawPhoneNumbersClient, RawPhoneNumbersClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class PhoneNumbersClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawPhoneNumbersClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawPhoneNumbersClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawPhoneNumbersClient
+ """
+ return self._raw_client
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbPhoneAssignmentDbModel]:
+ """
+ List the workspace's phone numbers and the receptionist each one rings. A number with no `customer_facing_agent_id` is held by the workspace but not attached to a receptionist yet.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbPhoneAssignmentDbModel]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.phone_numbers.list()
+ """
+ _response = self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def create(
+ self,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ area_codes: typing.Optional[typing.Sequence[str]] = OMIT,
+ number_type: typing.Optional[ApplicationNumberType] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbPhoneAssignmentDbModel:
+ """
+ Give a receptionist a phone number. A number the workspace already holds but has not attached is used first. Otherwise, in the US and Canada, a number with one of the requested `area_codes` is taken from the pool or bought, falling back to any number in the business's country. In countries that require paperwork, the number is issued right away but takes public calls only once the workspace's own registration is approved (see `accepts_public_calls`). Counts toward the plan's phone number limit, and free plans can take only a few new numbers a day. Returns 404 when no number is available and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account and none is free.
+
+ Parameters
+ ----------
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ area_codes : typing.Optional[typing.Sequence[str]]
+ Preferred US or Canadian area codes, e.g. `["415", "628"]`. Codes outside the business's country are ignored, and any number is given when none of these is available.
+
+ number_type : typing.Optional[ApplicationNumberType]
+ Local or mobile, in a country that requires paperwork before a number takes calls. Leave unset to try mobile first. Ignored in the US and Canada.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbPhoneAssignmentDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.phone_numbers.create(
+ customer_facing_agent_id="customer_facing_agent_id",
+ )
+ """
+ _response = self._raw_client.create(
+ customer_facing_agent_id=customer_facing_agent_id,
+ xi_workspace_id=xi_workspace_id,
+ area_codes=area_codes,
+ number_type=number_type,
+ request_options=request_options,
+ )
+ return _response.data
+
+ def delete(
+ self,
+ phone_assignment_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> None:
+ """
+ Remove a phone number from the workspace. A pool number goes back to the pool it came from. A number the business brought from its own Twilio account, or one issued in a country that requires paperwork, is released at Twilio and cannot be recovered. Returns 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.phone_numbers.delete(
+ phone_assignment_id="phone_assignment_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ phone_assignment_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def update(
+ self,
+ phone_assignment_id: str,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbPhoneAssignmentDbModel:
+ """
+ Move a phone number to a different receptionist in the same workspace, which answers its calls from then on. Returns 409 `phone_number_not_attached` for a number no receptionist answers yet (attach it with `POST /v1/smb/phone-numbers/assignments`), and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number from now on.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbPhoneAssignmentDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.phone_numbers.update(
+ phone_assignment_id="phone_assignment_id",
+ customer_facing_agent_id="customer_facing_agent_id",
+ )
+ """
+ _response = self._raw_client.update(
+ phone_assignment_id,
+ customer_facing_agent_id=customer_facing_agent_id,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
+
+
+class AsyncPhoneNumbersClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawPhoneNumbersClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawPhoneNumbersClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawPhoneNumbersClient
+ """
+ return self._raw_client
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbPhoneAssignmentDbModel]:
+ """
+ List the workspace's phone numbers and the receptionist each one rings. A number with no `customer_facing_agent_id` is held by the workspace but not attached to a receptionist yet.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbPhoneAssignmentDbModel]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.phone_numbers.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ async def create(
+ self,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ area_codes: typing.Optional[typing.Sequence[str]] = OMIT,
+ number_type: typing.Optional[ApplicationNumberType] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbPhoneAssignmentDbModel:
+ """
+ Give a receptionist a phone number. A number the workspace already holds but has not attached is used first. Otherwise, in the US and Canada, a number with one of the requested `area_codes` is taken from the pool or bought, falling back to any number in the business's country. In countries that require paperwork, the number is issued right away but takes public calls only once the workspace's own registration is approved (see `accepts_public_calls`). Counts toward the plan's phone number limit, and free plans can take only a few new numbers a day. Returns 404 when no number is available and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account and none is free.
+
+ Parameters
+ ----------
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ area_codes : typing.Optional[typing.Sequence[str]]
+ Preferred US or Canadian area codes, e.g. `["415", "628"]`. Codes outside the business's country are ignored, and any number is given when none of these is available.
+
+ number_type : typing.Optional[ApplicationNumberType]
+ Local or mobile, in a country that requires paperwork before a number takes calls. Leave unset to try mobile first. Ignored in the US and Canada.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbPhoneAssignmentDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.phone_numbers.create(
+ customer_facing_agent_id="customer_facing_agent_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ customer_facing_agent_id=customer_facing_agent_id,
+ xi_workspace_id=xi_workspace_id,
+ area_codes=area_codes,
+ number_type=number_type,
+ request_options=request_options,
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ phone_assignment_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> None:
+ """
+ Remove a phone number from the workspace. A pool number goes back to the pool it came from. A number the business brought from its own Twilio account, or one issued in a country that requires paperwork, is released at Twilio and cannot be recovered. Returns 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.phone_numbers.delete(
+ phone_assignment_id="phone_assignment_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ phone_assignment_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ phone_assignment_id: str,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbPhoneAssignmentDbModel:
+ """
+ Move a phone number to a different receptionist in the same workspace, which answers its calls from then on. Returns 409 `phone_number_not_attached` for a number no receptionist answers yet (attach it with `POST /v1/smb/phone-numbers/assignments`), and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number from now on.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbPhoneAssignmentDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.phone_numbers.update(
+ phone_assignment_id="phone_assignment_id",
+ customer_facing_agent_id="customer_facing_agent_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ phone_assignment_id,
+ customer_facing_agent_id=customer_facing_agent_id,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/phone_numbers/raw_client.py b/src/elevenlabs/reception/phone_numbers/raw_client.py
new file mode 100644
index 000000000..ee98ac0b2
--- /dev/null
+++ b/src/elevenlabs/reception/phone_numbers/raw_client.py
@@ -0,0 +1,555 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.application_number_type import ApplicationNumberType
+from ...types.smb_phone_assignment_db_model import SmbPhoneAssignmentDbModel
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawPhoneNumbersClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.List[SmbPhoneAssignmentDbModel]]:
+ """
+ List the workspace's phone numbers and the receptionist each one rings. A number with no `customer_facing_agent_id` is held by the workspace but not attached to a receptionist yet.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[SmbPhoneAssignmentDbModel]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/phone-numbers/assignments",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbPhoneAssignmentDbModel],
+ construct_type(
+ type_=typing.List[SmbPhoneAssignmentDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ area_codes: typing.Optional[typing.Sequence[str]] = OMIT,
+ number_type: typing.Optional[ApplicationNumberType] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbPhoneAssignmentDbModel]:
+ """
+ Give a receptionist a phone number. A number the workspace already holds but has not attached is used first. Otherwise, in the US and Canada, a number with one of the requested `area_codes` is taken from the pool or bought, falling back to any number in the business's country. In countries that require paperwork, the number is issued right away but takes public calls only once the workspace's own registration is approved (see `accepts_public_calls`). Counts toward the plan's phone number limit, and free plans can take only a few new numbers a day. Returns 404 when no number is available and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account and none is free.
+
+ Parameters
+ ----------
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ area_codes : typing.Optional[typing.Sequence[str]]
+ Preferred US or Canadian area codes, e.g. `["415", "628"]`. Codes outside the business's country are ignored, and any number is given when none of these is available.
+
+ number_type : typing.Optional[ApplicationNumberType]
+ Local or mobile, in a country that requires paperwork before a number takes calls. Leave unset to try mobile first. Ignored in the US and Canada.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbPhoneAssignmentDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/phone-numbers/assignments",
+ method="POST",
+ json={
+ "customer_facing_agent_id": customer_facing_agent_id,
+ "area_codes": area_codes,
+ "number_type": number_type,
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbPhoneAssignmentDbModel,
+ construct_type(
+ type_=SmbPhoneAssignmentDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ phone_assignment_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[None]:
+ """
+ Remove a phone number from the workspace. A pool number goes back to the pool it came from. A number the business brought from its own Twilio account, or one issued in a country that requires paperwork, is released at Twilio and cannot be recovered. Returns 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[None]
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/phone-numbers/assignments/{jsonable_encoder(phone_assignment_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return HttpResponse(response=_response, data=None)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ phone_assignment_id: str,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbPhoneAssignmentDbModel]:
+ """
+ Move a phone number to a different receptionist in the same workspace, which answers its calls from then on. Returns 409 `phone_number_not_attached` for a number no receptionist answers yet (attach it with `POST /v1/smb/phone-numbers/assignments`), and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number from now on.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbPhoneAssignmentDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/phone-numbers/assignments/{jsonable_encoder(phone_assignment_id)}",
+ method="PATCH",
+ json={
+ "customer_facing_agent_id": customer_facing_agent_id,
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbPhoneAssignmentDbModel,
+ construct_type(
+ type_=SmbPhoneAssignmentDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawPhoneNumbersClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.List[SmbPhoneAssignmentDbModel]]:
+ """
+ List the workspace's phone numbers and the receptionist each one rings. A number with no `customer_facing_agent_id` is held by the workspace but not attached to a receptionist yet.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[SmbPhoneAssignmentDbModel]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/phone-numbers/assignments",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbPhoneAssignmentDbModel],
+ construct_type(
+ type_=typing.List[SmbPhoneAssignmentDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ area_codes: typing.Optional[typing.Sequence[str]] = OMIT,
+ number_type: typing.Optional[ApplicationNumberType] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbPhoneAssignmentDbModel]:
+ """
+ Give a receptionist a phone number. A number the workspace already holds but has not attached is used first. Otherwise, in the US and Canada, a number with one of the requested `area_codes` is taken from the pool or bought, falling back to any number in the business's country. In countries that require paperwork, the number is issued right away but takes public calls only once the workspace's own registration is approved (see `accepts_public_calls`). Counts toward the plan's phone number limit, and free plans can take only a few new numbers a day. Returns 404 when no number is available and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account and none is free.
+
+ Parameters
+ ----------
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ area_codes : typing.Optional[typing.Sequence[str]]
+ Preferred US or Canadian area codes, e.g. `["415", "628"]`. Codes outside the business's country are ignored, and any number is given when none of these is available.
+
+ number_type : typing.Optional[ApplicationNumberType]
+ Local or mobile, in a country that requires paperwork before a number takes calls. Leave unset to try mobile first. Ignored in the US and Canada.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbPhoneAssignmentDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/phone-numbers/assignments",
+ method="POST",
+ json={
+ "customer_facing_agent_id": customer_facing_agent_id,
+ "area_codes": area_codes,
+ "number_type": number_type,
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbPhoneAssignmentDbModel,
+ construct_type(
+ type_=SmbPhoneAssignmentDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ phone_assignment_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[None]:
+ """
+ Remove a phone number from the workspace. A pool number goes back to the pool it came from. A number the business brought from its own Twilio account, or one issued in a country that requires paperwork, is released at Twilio and cannot be recovered. Returns 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[None]
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/phone-numbers/assignments/{jsonable_encoder(phone_assignment_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return AsyncHttpResponse(response=_response, data=None)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ phone_assignment_id: str,
+ *,
+ customer_facing_agent_id: str,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbPhoneAssignmentDbModel]:
+ """
+ Move a phone number to a different receptionist in the same workspace, which answers its calls from then on. Returns 409 `phone_number_not_attached` for a number no receptionist answers yet (attach it with `POST /v1/smb/phone-numbers/assignments`), and 403 `telephony_managed_by_reseller` when the reseller supplies the workspace's numbers from its own Twilio account.
+
+ Parameters
+ ----------
+ phone_assignment_id : str
+
+ customer_facing_agent_id : str
+ The receptionist that answers calls to the number from now on.
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbPhoneAssignmentDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/phone-numbers/assignments/{jsonable_encoder(phone_assignment_id)}",
+ method="PATCH",
+ json={
+ "customer_facing_agent_id": customer_facing_agent_id,
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbPhoneAssignmentDbModel,
+ construct_type(
+ type_=SmbPhoneAssignmentDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/raw_client.py b/src/elevenlabs/reception/raw_client.py
new file mode 100644
index 000000000..b94010356
--- /dev/null
+++ b/src/elevenlabs/reception/raw_client.py
@@ -0,0 +1,13 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+
+
+class RawReceptionClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+
+class AsyncRawReceptionClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
diff --git a/src/elevenlabs/v_1_dubbing_realtime/__init__.py b/src/elevenlabs/reception/receptionists/__init__.py
similarity index 66%
rename from src/elevenlabs/v_1_dubbing_realtime/__init__.py
rename to src/elevenlabs/reception/receptionists/__init__.py
index d032ea55b..b846ca3a0 100644
--- a/src/elevenlabs/v_1_dubbing_realtime/__init__.py
+++ b/src/elevenlabs/reception/receptionists/__init__.py
@@ -6,17 +6,11 @@
from importlib import import_module
if typing.TYPE_CHECKING:
- from .types import (
- ReceiveDubbingStreamMessage,
- SendDubbingStreamMessage,
- TextToDialogueInputFormat,
- TextToDialogueOutputFormat,
- )
+ from . import procedures, rules, transfer_rules
_dynamic_imports: typing.Dict[str, str] = {
- "ReceiveDubbingStreamMessage": ".types",
- "SendDubbingStreamMessage": ".types",
- "TextToDialogueInputFormat": ".types",
- "TextToDialogueOutputFormat": ".types",
+ "procedures": ".procedures",
+ "rules": ".rules",
+ "transfer_rules": ".transfer_rules",
}
@@ -41,9 +35,4 @@ def __dir__():
return sorted(lazy_attrs)
-__all__ = [
- "ReceiveDubbingStreamMessage",
- "SendDubbingStreamMessage",
- "TextToDialogueInputFormat",
- "TextToDialogueOutputFormat",
-]
+__all__ = ["procedures", "rules", "transfer_rules"]
diff --git a/src/elevenlabs/reception/receptionists/client.py b/src/elevenlabs/reception/receptionists/client.py
new file mode 100644
index 000000000..1e1f0795e
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/client.py
@@ -0,0 +1,385 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from __future__ import annotations
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.customer_facing_config_patch import CustomerFacingConfigPatch
+from ...types.smb_customer_facing_agent_response import SmbCustomerFacingAgentResponse
+from ...types.smb_widget_appearance import SmbWidgetAppearance
+from .raw_client import AsyncRawReceptionistsClient, RawReceptionistsClient
+
+if typing.TYPE_CHECKING:
+ from .procedures.client import AsyncProceduresClient, ProceduresClient
+ from .rules.client import AsyncRulesClient, RulesClient
+ from .transfer_rules.client import AsyncTransferRulesClient, TransferRulesClient
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class ReceptionistsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawReceptionistsClient(client_wrapper=client_wrapper)
+ self._client_wrapper = client_wrapper
+ self._rules: typing.Optional[RulesClient] = None
+ self._procedures: typing.Optional[ProceduresClient] = None
+ self._transfer_rules: typing.Optional[TransferRulesClient] = None
+
+ @property
+ def with_raw_response(self) -> RawReceptionistsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawReceptionistsClient
+ """
+ return self._raw_client
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbCustomerFacingAgentResponse]:
+ """
+ List every customer-facing receptionist for the workspace.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbCustomerFacingAgentResponse]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.list()
+ """
+ _response = self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def update(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ config: typing.Optional[CustomerFacingConfigPatch] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ widget: typing.Optional[SmbWidgetAppearance] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbCustomerFacingAgentResponse:
+ """
+ Update a receptionist's display name, config and/or widget appearance.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ config : typing.Optional[CustomerFacingConfigPatch]
+
+ name : typing.Optional[str]
+
+ widget : typing.Optional[SmbWidgetAppearance]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbCustomerFacingAgentResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.update(
+ agent_id="agent_id",
+ )
+ """
+ _response = self._raw_client.update(
+ agent_id,
+ xi_workspace_id=xi_workspace_id,
+ config=config,
+ name=name,
+ widget=widget,
+ request_options=request_options,
+ )
+ return _response.data
+
+ def activate(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbCustomerFacingAgentResponse:
+ """
+ Re-activate a deactivated receptionist. Subject to the workspace's tier cap; raises ``quota_exceeded`` if no active slot is free.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbCustomerFacingAgentResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.activate(
+ agent_id="agent_id",
+ )
+ """
+ _response = self._raw_client.activate(
+ agent_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ @property
+ def rules(self):
+ if self._rules is None:
+ from .rules.client import RulesClient # noqa: E402
+
+ self._rules = RulesClient(client_wrapper=self._client_wrapper)
+ return self._rules
+
+ @property
+ def procedures(self):
+ if self._procedures is None:
+ from .procedures.client import ProceduresClient # noqa: E402
+
+ self._procedures = ProceduresClient(client_wrapper=self._client_wrapper)
+ return self._procedures
+
+ @property
+ def transfer_rules(self):
+ if self._transfer_rules is None:
+ from .transfer_rules.client import TransferRulesClient # noqa: E402
+
+ self._transfer_rules = TransferRulesClient(client_wrapper=self._client_wrapper)
+ return self._transfer_rules
+
+
+class AsyncReceptionistsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawReceptionistsClient(client_wrapper=client_wrapper)
+ self._client_wrapper = client_wrapper
+ self._rules: typing.Optional[AsyncRulesClient] = None
+ self._procedures: typing.Optional[AsyncProceduresClient] = None
+ self._transfer_rules: typing.Optional[AsyncTransferRulesClient] = None
+
+ @property
+ def with_raw_response(self) -> AsyncRawReceptionistsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawReceptionistsClient
+ """
+ return self._raw_client
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbCustomerFacingAgentResponse]:
+ """
+ List every customer-facing receptionist for the workspace.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbCustomerFacingAgentResponse]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ async def update(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ config: typing.Optional[CustomerFacingConfigPatch] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ widget: typing.Optional[SmbWidgetAppearance] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbCustomerFacingAgentResponse:
+ """
+ Update a receptionist's display name, config and/or widget appearance.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ config : typing.Optional[CustomerFacingConfigPatch]
+
+ name : typing.Optional[str]
+
+ widget : typing.Optional[SmbWidgetAppearance]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbCustomerFacingAgentResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.update(
+ agent_id="agent_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ agent_id,
+ xi_workspace_id=xi_workspace_id,
+ config=config,
+ name=name,
+ widget=widget,
+ request_options=request_options,
+ )
+ return _response.data
+
+ async def activate(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbCustomerFacingAgentResponse:
+ """
+ Re-activate a deactivated receptionist. Subject to the workspace's tier cap; raises ``quota_exceeded`` if no active slot is free.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbCustomerFacingAgentResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.activate(
+ agent_id="agent_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.activate(
+ agent_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ @property
+ def rules(self):
+ if self._rules is None:
+ from .rules.client import AsyncRulesClient # noqa: E402
+
+ self._rules = AsyncRulesClient(client_wrapper=self._client_wrapper)
+ return self._rules
+
+ @property
+ def procedures(self):
+ if self._procedures is None:
+ from .procedures.client import AsyncProceduresClient # noqa: E402
+
+ self._procedures = AsyncProceduresClient(client_wrapper=self._client_wrapper)
+ return self._procedures
+
+ @property
+ def transfer_rules(self):
+ if self._transfer_rules is None:
+ from .transfer_rules.client import AsyncTransferRulesClient # noqa: E402
+
+ self._transfer_rules = AsyncTransferRulesClient(client_wrapper=self._client_wrapper)
+ return self._transfer_rules
diff --git a/src/elevenlabs/reception/receptionists/procedures/__init__.py b/src/elevenlabs/reception/receptionists/procedures/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/procedures/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/receptionists/procedures/client.py b/src/elevenlabs/reception/receptionists/procedures/client.py
new file mode 100644
index 000000000..7d64a2c45
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/procedures/client.py
@@ -0,0 +1,447 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ....core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ....core.request_options import RequestOptions
+from ....types.smb_create_procedure_request import SmbCreateProcedureRequest
+from ....types.smb_procedure import SmbProcedure
+from ....types.smb_update_procedure_request import SmbUpdateProcedureRequest
+from .raw_client import AsyncRawProceduresClient, RawProceduresClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class ProceduresClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawProceduresClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawProceduresClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawProceduresClient
+ """
+ return self._raw_client
+
+ def list(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[SmbProcedure]:
+ """
+ List the procedures (SOPs) the named receptionist can run on calls.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbProcedure]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.procedures.list(
+ agent_id="agent_id",
+ )
+ """
+ _response = self._raw_client.list(agent_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbProcedure:
+ """
+ Add a procedure (SOP) to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbProcedure
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbCreateProcedureRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.procedures.create(
+ agent_id="agent_id",
+ request=SmbCreateProcedureRequest(
+ name="name",
+ trigger="trigger",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ agent_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def update(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ request: SmbUpdateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbProcedure:
+ """
+ Replace an existing procedure on the named receptionist. Send every field: an omitted `body` resets to empty.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ request : SmbUpdateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbProcedure
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateProcedureRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.procedures.update(
+ agent_id="agent_id",
+ procedure_id="procedure_id",
+ request=SmbUpdateProcedureRequest(
+ name="name",
+ trigger="trigger",
+ ),
+ )
+ """
+ _response = self._raw_client.update(
+ agent_id, procedure_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a procedure from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.procedures.delete(
+ agent_id="agent_id",
+ procedure_id="procedure_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ agent_id, procedure_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncProceduresClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawProceduresClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawProceduresClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawProceduresClient
+ """
+ return self._raw_client
+
+ async def list(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[SmbProcedure]:
+ """
+ List the procedures (SOPs) the named receptionist can run on calls.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbProcedure]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.procedures.list(
+ agent_id="agent_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(
+ agent_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbProcedure:
+ """
+ Add a procedure (SOP) to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbProcedure
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbCreateProcedureRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.procedures.create(
+ agent_id="agent_id",
+ request=SmbCreateProcedureRequest(
+ name="name",
+ trigger="trigger",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ agent_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ request: SmbUpdateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbProcedure:
+ """
+ Replace an existing procedure on the named receptionist. Send every field: an omitted `body` resets to empty.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ request : SmbUpdateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbProcedure
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateProcedureRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.procedures.update(
+ agent_id="agent_id",
+ procedure_id="procedure_id",
+ request=SmbUpdateProcedureRequest(
+ name="name",
+ trigger="trigger",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ agent_id, procedure_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a procedure from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.procedures.delete(
+ agent_id="agent_id",
+ procedure_id="procedure_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ agent_id, procedure_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/receptionists/procedures/raw_client.py b/src/elevenlabs/reception/receptionists/procedures/raw_client.py
new file mode 100644
index 000000000..235ae2ebb
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/procedures/raw_client.py
@@ -0,0 +1,587 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ....core.api_error import ApiError
+from ....core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ....core.http_response import AsyncHttpResponse, HttpResponse
+from ....core.jsonable_encoder import jsonable_encoder
+from ....core.parse_error import ParsingError
+from ....core.request_options import RequestOptions
+from ....core.serialization import convert_and_respect_annotation_metadata
+from ....core.unchecked_base_model import construct_type
+from ....errors.unprocessable_entity_error import UnprocessableEntityError
+from ....types.smb_create_procedure_request import SmbCreateProcedureRequest
+from ....types.smb_procedure import SmbProcedure
+from ....types.smb_update_procedure_request import SmbUpdateProcedureRequest
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawProceduresClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.List[SmbProcedure]]:
+ """
+ List the procedures (SOPs) the named receptionist can run on calls.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[SmbProcedure]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbProcedure],
+ construct_type(
+ type_=typing.List[SmbProcedure], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbProcedure]:
+ """
+ Add a procedure (SOP) to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbProcedure]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateProcedureRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbProcedure,
+ construct_type(
+ type_=SmbProcedure, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ request: SmbUpdateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbProcedure]:
+ """
+ Replace an existing procedure on the named receptionist. Send every field: an omitted `body` resets to empty.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ request : SmbUpdateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbProcedure]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures/{jsonable_encoder(procedure_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateProcedureRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbProcedure,
+ construct_type(
+ type_=SmbProcedure, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a procedure from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures/{jsonable_encoder(procedure_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawProceduresClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.List[SmbProcedure]]:
+ """
+ List the procedures (SOPs) the named receptionist can run on calls.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[SmbProcedure]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbProcedure],
+ construct_type(
+ type_=typing.List[SmbProcedure], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbProcedure]:
+ """
+ Add a procedure (SOP) to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbProcedure]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateProcedureRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbProcedure,
+ construct_type(
+ type_=SmbProcedure, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ request: SmbUpdateProcedureRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbProcedure]:
+ """
+ Replace an existing procedure on the named receptionist. Send every field: an omitted `body` resets to empty.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ request : SmbUpdateProcedureRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbProcedure]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures/{jsonable_encoder(procedure_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateProcedureRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbProcedure,
+ construct_type(
+ type_=SmbProcedure, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ agent_id: str,
+ procedure_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a procedure from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ procedure_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/procedures/{jsonable_encoder(procedure_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/receptionists/raw_client.py b/src/elevenlabs/reception/receptionists/raw_client.py
new file mode 100644
index 000000000..94a59ce0d
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/raw_client.py
@@ -0,0 +1,437 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.customer_facing_config_patch import CustomerFacingConfigPatch
+from ...types.smb_customer_facing_agent_response import SmbCustomerFacingAgentResponse
+from ...types.smb_widget_appearance import SmbWidgetAppearance
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawReceptionistsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.List[SmbCustomerFacingAgentResponse]]:
+ """
+ List every customer-facing receptionist for the workspace.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[SmbCustomerFacingAgentResponse]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/customer-facing-agents",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbCustomerFacingAgentResponse],
+ construct_type(
+ type_=typing.List[SmbCustomerFacingAgentResponse], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ config: typing.Optional[CustomerFacingConfigPatch] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ widget: typing.Optional[SmbWidgetAppearance] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbCustomerFacingAgentResponse]:
+ """
+ Update a receptionist's display name, config and/or widget appearance.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ config : typing.Optional[CustomerFacingConfigPatch]
+
+ name : typing.Optional[str]
+
+ widget : typing.Optional[SmbWidgetAppearance]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbCustomerFacingAgentResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}",
+ method="PATCH",
+ json={
+ "config": convert_and_respect_annotation_metadata(
+ object_=config, annotation=CustomerFacingConfigPatch, direction="write"
+ ),
+ "name": name,
+ "widget": convert_and_respect_annotation_metadata(
+ object_=widget, annotation=SmbWidgetAppearance, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbCustomerFacingAgentResponse,
+ construct_type(
+ type_=SmbCustomerFacingAgentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def activate(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbCustomerFacingAgentResponse]:
+ """
+ Re-activate a deactivated receptionist. Subject to the workspace's tier cap; raises ``quota_exceeded`` if no active slot is free.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbCustomerFacingAgentResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/activate",
+ method="POST",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbCustomerFacingAgentResponse,
+ construct_type(
+ type_=SmbCustomerFacingAgentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawReceptionistsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.List[SmbCustomerFacingAgentResponse]]:
+ """
+ List every customer-facing receptionist for the workspace.
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[SmbCustomerFacingAgentResponse]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/customer-facing-agents",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbCustomerFacingAgentResponse],
+ construct_type(
+ type_=typing.List[SmbCustomerFacingAgentResponse], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ config: typing.Optional[CustomerFacingConfigPatch] = OMIT,
+ name: typing.Optional[str] = OMIT,
+ widget: typing.Optional[SmbWidgetAppearance] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbCustomerFacingAgentResponse]:
+ """
+ Update a receptionist's display name, config and/or widget appearance.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ config : typing.Optional[CustomerFacingConfigPatch]
+
+ name : typing.Optional[str]
+
+ widget : typing.Optional[SmbWidgetAppearance]
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbCustomerFacingAgentResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}",
+ method="PATCH",
+ json={
+ "config": convert_and_respect_annotation_metadata(
+ object_=config, annotation=CustomerFacingConfigPatch, direction="write"
+ ),
+ "name": name,
+ "widget": convert_and_respect_annotation_metadata(
+ object_=widget, annotation=SmbWidgetAppearance, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbCustomerFacingAgentResponse,
+ construct_type(
+ type_=SmbCustomerFacingAgentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def activate(
+ self,
+ agent_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbCustomerFacingAgentResponse]:
+ """
+ Re-activate a deactivated receptionist. Subject to the workspace's tier cap; raises ``quota_exceeded`` if no active slot is free.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbCustomerFacingAgentResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/activate",
+ method="POST",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbCustomerFacingAgentResponse,
+ construct_type(
+ type_=SmbCustomerFacingAgentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/receptionists/rules/__init__.py b/src/elevenlabs/reception/receptionists/rules/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/rules/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/receptionists/rules/client.py b/src/elevenlabs/reception/receptionists/rules/client.py
new file mode 100644
index 000000000..86967a06b
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/rules/client.py
@@ -0,0 +1,359 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ....core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ....core.request_options import RequestOptions
+from ....types.agent_rule import AgentRule
+from ....types.smb_create_agent_rule_request import SmbCreateAgentRuleRequest
+from ....types.smb_update_agent_rule_request import SmbUpdateAgentRuleRequest
+from .raw_client import AsyncRawRulesClient, RawRulesClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RulesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawRulesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawRulesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawRulesClient
+ """
+ return self._raw_client
+
+ def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AgentRule:
+ """
+ Add a behavioral rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AgentRule
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbCreateAgentRuleRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.rules.create(
+ agent_id="agent_id",
+ request=SmbCreateAgentRuleRequest(
+ title="title",
+ description="description",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ agent_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AgentRule:
+ """
+ Replace an existing rule on the named receptionist. Send every field: an omitted `priority` resets to `strict`.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AgentRule
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateAgentRuleRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.rules.update(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ request=SmbUpdateAgentRuleRequest(
+ title="title",
+ description="description",
+ ),
+ )
+ """
+ _response = self._raw_client.update(
+ agent_id, rule_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.rules.delete(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ agent_id, rule_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncRulesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawRulesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawRulesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawRulesClient
+ """
+ return self._raw_client
+
+ async def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AgentRule:
+ """
+ Add a behavioral rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AgentRule
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbCreateAgentRuleRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.rules.create(
+ agent_id="agent_id",
+ request=SmbCreateAgentRuleRequest(
+ title="title",
+ description="description",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ agent_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AgentRule:
+ """
+ Replace an existing rule on the named receptionist. Send every field: an omitted `priority` resets to `strict`.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AgentRule
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateAgentRuleRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.rules.update(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ request=SmbUpdateAgentRuleRequest(
+ title="title",
+ description="description",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ agent_id, rule_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.rules.delete(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ agent_id, rule_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/receptionists/rules/raw_client.py b/src/elevenlabs/reception/receptionists/rules/raw_client.py
new file mode 100644
index 000000000..eb79b7707
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/rules/raw_client.py
@@ -0,0 +1,461 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ....core.api_error import ApiError
+from ....core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ....core.http_response import AsyncHttpResponse, HttpResponse
+from ....core.jsonable_encoder import jsonable_encoder
+from ....core.parse_error import ParsingError
+from ....core.request_options import RequestOptions
+from ....core.serialization import convert_and_respect_annotation_metadata
+from ....core.unchecked_base_model import construct_type
+from ....errors.unprocessable_entity_error import UnprocessableEntityError
+from ....types.agent_rule import AgentRule
+from ....types.smb_create_agent_rule_request import SmbCreateAgentRuleRequest
+from ....types.smb_update_agent_rule_request import SmbUpdateAgentRuleRequest
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawRulesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[AgentRule]:
+ """
+ Add a behavioral rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[AgentRule]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/rules",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateAgentRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ AgentRule,
+ construct_type(
+ type_=AgentRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[AgentRule]:
+ """
+ Replace an existing rule on the named receptionist. Send every field: an omitted `priority` resets to `strict`.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[AgentRule]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/rules/{jsonable_encoder(rule_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateAgentRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ AgentRule,
+ construct_type(
+ type_=AgentRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/rules/{jsonable_encoder(rule_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawRulesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[AgentRule]:
+ """
+ Add a behavioral rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[AgentRule]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/rules",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateAgentRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ AgentRule,
+ construct_type(
+ type_=AgentRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateAgentRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[AgentRule]:
+ """
+ Replace an existing rule on the named receptionist. Send every field: an omitted `priority` resets to `strict`.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateAgentRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[AgentRule]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/rules/{jsonable_encoder(rule_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateAgentRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ AgentRule,
+ construct_type(
+ type_=AgentRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/rules/{jsonable_encoder(rule_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/receptionists/transfer_rules/__init__.py b/src/elevenlabs/reception/receptionists/transfer_rules/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/transfer_rules/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/receptionists/transfer_rules/client.py b/src/elevenlabs/reception/receptionists/transfer_rules/client.py
new file mode 100644
index 000000000..3de0bd748
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/transfer_rules/client.py
@@ -0,0 +1,363 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ....core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ....core.request_options import RequestOptions
+from ....types.smb_create_transfer_rule_request import SmbCreateTransferRuleRequest
+from ....types.smb_transfer_rule import SmbTransferRule
+from ....types.smb_update_transfer_rule_request import SmbUpdateTransferRuleRequest
+from .raw_client import AsyncRawTransferRulesClient, RawTransferRulesClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class TransferRulesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawTransferRulesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawTransferRulesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawTransferRulesClient
+ """
+ return self._raw_client
+
+ def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbTransferRule:
+ """
+ Add a phone forwarding rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbTransferRule
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbCreateTransferRuleRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.transfer_rules.create(
+ agent_id="agent_id",
+ request=SmbCreateTransferRuleRequest(
+ label="label",
+ phone_number="phone_number",
+ condition="condition",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ agent_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbTransferRule:
+ """
+ Replace an existing transfer rule on the named receptionist. Send every field: an omitted `post_dial_digits` clears it.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbTransferRule
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateTransferRuleRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.transfer_rules.update(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ request=SmbUpdateTransferRuleRequest(
+ label="label",
+ phone_number="phone_number",
+ condition="condition",
+ ),
+ )
+ """
+ _response = self._raw_client.update(
+ agent_id, rule_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a transfer rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.receptionists.transfer_rules.delete(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ agent_id, rule_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+
+class AsyncTransferRulesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawTransferRulesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawTransferRulesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawTransferRulesClient
+ """
+ return self._raw_client
+
+ async def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbTransferRule:
+ """
+ Add a phone forwarding rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbTransferRule
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbCreateTransferRuleRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.transfer_rules.create(
+ agent_id="agent_id",
+ request=SmbCreateTransferRuleRequest(
+ label="label",
+ phone_number="phone_number",
+ condition="condition",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ agent_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbTransferRule:
+ """
+ Replace an existing transfer rule on the named receptionist. Send every field: an omitted `post_dial_digits` clears it.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbTransferRule
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateTransferRuleRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.transfer_rules.update(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ request=SmbUpdateTransferRuleRequest(
+ label="label",
+ phone_number="phone_number",
+ condition="condition",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ agent_id, rule_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a transfer rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.receptionists.transfer_rules.delete(
+ agent_id="agent_id",
+ rule_id="rule_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ agent_id, rule_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/receptionists/transfer_rules/raw_client.py b/src/elevenlabs/reception/receptionists/transfer_rules/raw_client.py
new file mode 100644
index 000000000..f205fa319
--- /dev/null
+++ b/src/elevenlabs/reception/receptionists/transfer_rules/raw_client.py
@@ -0,0 +1,461 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ....core.api_error import ApiError
+from ....core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ....core.http_response import AsyncHttpResponse, HttpResponse
+from ....core.jsonable_encoder import jsonable_encoder
+from ....core.parse_error import ParsingError
+from ....core.request_options import RequestOptions
+from ....core.serialization import convert_and_respect_annotation_metadata
+from ....core.unchecked_base_model import construct_type
+from ....errors.unprocessable_entity_error import UnprocessableEntityError
+from ....types.smb_create_transfer_rule_request import SmbCreateTransferRuleRequest
+from ....types.smb_transfer_rule import SmbTransferRule
+from ....types.smb_update_transfer_rule_request import SmbUpdateTransferRuleRequest
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawTransferRulesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbTransferRule]:
+ """
+ Add a phone forwarding rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbTransferRule]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/transfer-rules",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateTransferRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbTransferRule,
+ construct_type(
+ type_=SmbTransferRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbTransferRule]:
+ """
+ Replace an existing transfer rule on the named receptionist. Send every field: an omitted `post_dial_digits` clears it.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbTransferRule]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/transfer-rules/{jsonable_encoder(rule_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateTransferRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbTransferRule,
+ construct_type(
+ type_=SmbTransferRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a transfer rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/transfer-rules/{jsonable_encoder(rule_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawTransferRulesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def create(
+ self,
+ agent_id: str,
+ *,
+ request: SmbCreateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbTransferRule]:
+ """
+ Add a phone forwarding rule to the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ request : SmbCreateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbTransferRule]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/transfer-rules",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateTransferRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbTransferRule,
+ construct_type(
+ type_=SmbTransferRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ request: SmbUpdateTransferRuleRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbTransferRule]:
+ """
+ Replace an existing transfer rule on the named receptionist. Send every field: an omitted `post_dial_digits` clears it.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ request : SmbUpdateTransferRuleRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbTransferRule]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/transfer-rules/{jsonable_encoder(rule_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateTransferRuleRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbTransferRule,
+ construct_type(
+ type_=SmbTransferRule, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ agent_id: str,
+ rule_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a transfer rule from the named receptionist.
+
+ Parameters
+ ----------
+ agent_id : str
+
+ rule_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/customer-facing-agents/{jsonable_encoder(agent_id)}/transfer-rules/{jsonable_encoder(rule_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/services/__init__.py b/src/elevenlabs/reception/services/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/services/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/services/client.py b/src/elevenlabs/reception/services/client.py
new file mode 100644
index 000000000..e31d340c4
--- /dev/null
+++ b/src/elevenlabs/reception/services/client.py
@@ -0,0 +1,655 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.service_update_response import ServiceUpdateResponse
+from ...types.smb_create_service_request import SmbCreateServiceRequest
+from ...types.smb_service_db_model import SmbServiceDbModel
+from ...types.smb_service_kind import SmbServiceKind
+from ...types.smb_update_service_request_patch import SmbUpdateServiceRequestPatch
+from .raw_client import AsyncRawServicesClient, RawServicesClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class ServicesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawServicesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawServicesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawServicesClient
+ """
+ return self._raw_client
+
+ def list(
+ self,
+ *,
+ staff_id: typing.Optional[str] = None,
+ asset_id: typing.Optional[str] = None,
+ is_active: typing.Optional[bool] = None,
+ kind: typing.Optional[SmbServiceKind] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[SmbServiceDbModel]:
+ """
+ Get all services for the current workspace with optional filters
+
+ Parameters
+ ----------
+ staff_id : typing.Optional[str]
+
+ asset_id : typing.Optional[str]
+
+ is_active : typing.Optional[bool]
+
+ kind : typing.Optional[SmbServiceKind]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbServiceDbModel]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.services.list(
+ staff_id="staff_id",
+ asset_id="asset_id",
+ is_active=True,
+ kind="classic",
+ )
+ """
+ _response = self._raw_client.list(
+ staff_id=staff_id,
+ asset_id=asset_id,
+ is_active=is_active,
+ kind=kind,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
+
+ def create(
+ self,
+ *,
+ request: SmbCreateServiceRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbServiceDbModel:
+ """
+ Create a new service
+
+ Parameters
+ ----------
+ request : SmbCreateServiceRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbServiceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbCreateServiceRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.services.create(
+ request=SmbCreateServiceRequest(
+ name="name",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def get(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbServiceDbModel:
+ """
+ Get a specific service by ID
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbServiceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.services.get(
+ service_id="service_id",
+ )
+ """
+ _response = self._raw_client.get(service_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ServiceUpdateResponse:
+ """
+ Update an existing service. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ServiceUpdateResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateServiceRequestPatch
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.services.update(
+ service_id="service_id",
+ request=SmbUpdateServiceRequestPatch(),
+ )
+ """
+ _response = self._raw_client.update(
+ service_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a service
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.services.delete(
+ service_id="service_id",
+ )
+ """
+ _response = self._raw_client.delete(
+ service_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def confirm_update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ reprice: typing.Optional[bool] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ServiceUpdateResponse:
+ """
+ Save a service update after user confirmed price impact. Optionally reprice future events.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ reprice : typing.Optional[bool]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ServiceUpdateResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateServiceRequestPatch
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.services.confirm_update(
+ service_id="service_id",
+ reprice=True,
+ request=SmbUpdateServiceRequestPatch(),
+ )
+ """
+ _response = self._raw_client.confirm_update(
+ service_id,
+ request=request,
+ reprice=reprice,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
+
+
+class AsyncServicesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawServicesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawServicesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawServicesClient
+ """
+ return self._raw_client
+
+ async def list(
+ self,
+ *,
+ staff_id: typing.Optional[str] = None,
+ asset_id: typing.Optional[str] = None,
+ is_active: typing.Optional[bool] = None,
+ kind: typing.Optional[SmbServiceKind] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[SmbServiceDbModel]:
+ """
+ Get all services for the current workspace with optional filters
+
+ Parameters
+ ----------
+ staff_id : typing.Optional[str]
+
+ asset_id : typing.Optional[str]
+
+ is_active : typing.Optional[bool]
+
+ kind : typing.Optional[SmbServiceKind]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbServiceDbModel]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.services.list(
+ staff_id="staff_id",
+ asset_id="asset_id",
+ is_active=True,
+ kind="classic",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(
+ staff_id=staff_id,
+ asset_id=asset_id,
+ is_active=is_active,
+ kind=kind,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
+
+ async def create(
+ self,
+ *,
+ request: SmbCreateServiceRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbServiceDbModel:
+ """
+ Create a new service
+
+ Parameters
+ ----------
+ request : SmbCreateServiceRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbServiceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbCreateServiceRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.services.create(
+ request=SmbCreateServiceRequest(
+ name="name",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def get(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbServiceDbModel:
+ """
+ Get a specific service by ID
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbServiceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.services.get(
+ service_id="service_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get(
+ service_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ServiceUpdateResponse:
+ """
+ Update an existing service. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ServiceUpdateResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateServiceRequestPatch
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.services.update(
+ service_id="service_id",
+ request=SmbUpdateServiceRequestPatch(),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ service_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a service
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.services.delete(
+ service_id="service_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ service_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def confirm_update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ reprice: typing.Optional[bool] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ServiceUpdateResponse:
+ """
+ Save a service update after user confirmed price impact. Optionally reprice future events.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ reprice : typing.Optional[bool]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ServiceUpdateResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateServiceRequestPatch
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.services.confirm_update(
+ service_id="service_id",
+ reprice=True,
+ request=SmbUpdateServiceRequestPatch(),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.confirm_update(
+ service_id,
+ request=request,
+ reprice=reprice,
+ xi_workspace_id=xi_workspace_id,
+ request_options=request_options,
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/services/raw_client.py b/src/elevenlabs/reception/services/raw_client.py
new file mode 100644
index 000000000..c0a2102b2
--- /dev/null
+++ b/src/elevenlabs/reception/services/raw_client.py
@@ -0,0 +1,885 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.service_update_response import ServiceUpdateResponse
+from ...types.smb_create_service_request import SmbCreateServiceRequest
+from ...types.smb_service_db_model import SmbServiceDbModel
+from ...types.smb_service_kind import SmbServiceKind
+from ...types.smb_update_service_request_patch import SmbUpdateServiceRequestPatch
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawServicesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self,
+ *,
+ staff_id: typing.Optional[str] = None,
+ asset_id: typing.Optional[str] = None,
+ is_active: typing.Optional[bool] = None,
+ kind: typing.Optional[SmbServiceKind] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.List[SmbServiceDbModel]]:
+ """
+ Get all services for the current workspace with optional filters
+
+ Parameters
+ ----------
+ staff_id : typing.Optional[str]
+
+ asset_id : typing.Optional[str]
+
+ is_active : typing.Optional[bool]
+
+ kind : typing.Optional[SmbServiceKind]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[SmbServiceDbModel]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/services",
+ method="GET",
+ params={
+ "staff_id": staff_id,
+ "asset_id": asset_id,
+ "is_active": is_active,
+ "kind": kind,
+ },
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbServiceDbModel],
+ construct_type(
+ type_=typing.List[SmbServiceDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ *,
+ request: SmbCreateServiceRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbServiceDbModel]:
+ """
+ Create a new service
+
+ Parameters
+ ----------
+ request : SmbCreateServiceRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbServiceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/services",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateServiceRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbServiceDbModel,
+ construct_type(
+ type_=SmbServiceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def get(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbServiceDbModel]:
+ """
+ Get a specific service by ID
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbServiceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbServiceDbModel,
+ construct_type(
+ type_=SmbServiceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ServiceUpdateResponse]:
+ """
+ Update an existing service. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ServiceUpdateResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateServiceRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ServiceUpdateResponse,
+ construct_type(
+ type_=ServiceUpdateResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a service
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def confirm_update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ reprice: typing.Optional[bool] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ServiceUpdateResponse]:
+ """
+ Save a service update after user confirmed price impact. Optionally reprice future events.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ reprice : typing.Optional[bool]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ServiceUpdateResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}/confirm-update",
+ method="POST",
+ params={
+ "reprice": reprice,
+ },
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateServiceRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ServiceUpdateResponse,
+ construct_type(
+ type_=ServiceUpdateResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawServicesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self,
+ *,
+ staff_id: typing.Optional[str] = None,
+ asset_id: typing.Optional[str] = None,
+ is_active: typing.Optional[bool] = None,
+ kind: typing.Optional[SmbServiceKind] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.List[SmbServiceDbModel]]:
+ """
+ Get all services for the current workspace with optional filters
+
+ Parameters
+ ----------
+ staff_id : typing.Optional[str]
+
+ asset_id : typing.Optional[str]
+
+ is_active : typing.Optional[bool]
+
+ kind : typing.Optional[SmbServiceKind]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[SmbServiceDbModel]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/services",
+ method="GET",
+ params={
+ "staff_id": staff_id,
+ "asset_id": asset_id,
+ "is_active": is_active,
+ "kind": kind,
+ },
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbServiceDbModel],
+ construct_type(
+ type_=typing.List[SmbServiceDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ *,
+ request: SmbCreateServiceRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbServiceDbModel]:
+ """
+ Create a new service
+
+ Parameters
+ ----------
+ request : SmbCreateServiceRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbServiceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/services",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateServiceRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbServiceDbModel,
+ construct_type(
+ type_=SmbServiceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def get(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbServiceDbModel]:
+ """
+ Get a specific service by ID
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbServiceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbServiceDbModel,
+ construct_type(
+ type_=SmbServiceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ServiceUpdateResponse]:
+ """
+ Update an existing service. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ServiceUpdateResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateServiceRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ServiceUpdateResponse,
+ construct_type(
+ type_=ServiceUpdateResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ service_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a service
+
+ Parameters
+ ----------
+ service_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def confirm_update(
+ self,
+ service_id: str,
+ *,
+ request: SmbUpdateServiceRequestPatch,
+ reprice: typing.Optional[bool] = None,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ServiceUpdateResponse]:
+ """
+ Save a service update after user confirmed price impact. Optionally reprice future events.
+
+ Parameters
+ ----------
+ service_id : str
+
+ request : SmbUpdateServiceRequestPatch
+
+ reprice : typing.Optional[bool]
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ServiceUpdateResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/services/{jsonable_encoder(service_id)}/confirm-update",
+ method="POST",
+ params={
+ "reprice": reprice,
+ },
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateServiceRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ServiceUpdateResponse,
+ construct_type(
+ type_=ServiceUpdateResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/staff/__init__.py b/src/elevenlabs/reception/staff/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/staff/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/staff/client.py b/src/elevenlabs/reception/staff/client.py
new file mode 100644
index 000000000..a7c654684
--- /dev/null
+++ b/src/elevenlabs/reception/staff/client.py
@@ -0,0 +1,483 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.smb_create_staff_request import SmbCreateStaffRequest
+from ...types.smb_staff_resource_db_model import SmbStaffResourceDbModel
+from ...types.smb_update_staff_request_patch import SmbUpdateStaffRequestPatch
+from .raw_client import AsyncRawStaffClient, RawStaffClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class StaffClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawStaffClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawStaffClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawStaffClient
+ """
+ return self._raw_client
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbStaffResourceDbModel]:
+ """
+ Get all staff for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbStaffResourceDbModel]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.staff.list()
+ """
+ _response = self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def create(
+ self,
+ *,
+ request: SmbCreateStaffRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbStaffResourceDbModel:
+ """
+ Create a new staff member
+
+ Parameters
+ ----------
+ request : SmbCreateStaffRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbStaffResourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbCreateStaffRequest
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.staff.create(
+ request=SmbCreateStaffRequest(
+ name="name",
+ ),
+ )
+ """
+ _response = self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def get(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbStaffResourceDbModel:
+ """
+ Get a specific staff member by ID
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbStaffResourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.staff.get(
+ staff_id="staff_id",
+ )
+ """
+ _response = self._raw_client.get(staff_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ def update(
+ self,
+ staff_id: str,
+ *,
+ request: SmbUpdateStaffRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbStaffResourceDbModel:
+ """
+ Update an existing staff member. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ staff_id : str
+
+ request : SmbUpdateStaffRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbStaffResourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs, SmbUpdateStaffRequestPatch
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.staff.update(
+ staff_id="staff_id",
+ request=SmbUpdateStaffRequestPatch(),
+ )
+ """
+ _response = self._raw_client.update(
+ staff_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ def delete(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a staff member
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.staff.delete(
+ staff_id="staff_id",
+ )
+ """
+ _response = self._raw_client.delete(staff_id, xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+
+class AsyncStaffClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawStaffClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawStaffClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawStaffClient
+ """
+ return self._raw_client
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[SmbStaffResourceDbModel]:
+ """
+ Get all staff for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[SmbStaffResourceDbModel]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.staff.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(xi_workspace_id=xi_workspace_id, request_options=request_options)
+ return _response.data
+
+ async def create(
+ self,
+ *,
+ request: SmbCreateStaffRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbStaffResourceDbModel:
+ """
+ Create a new staff member
+
+ Parameters
+ ----------
+ request : SmbCreateStaffRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbStaffResourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbCreateStaffRequest
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.staff.create(
+ request=SmbCreateStaffRequest(
+ name="name",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def get(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbStaffResourceDbModel:
+ """
+ Get a specific staff member by ID
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbStaffResourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.staff.get(
+ staff_id="staff_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.get(
+ staff_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def update(
+ self,
+ staff_id: str,
+ *,
+ request: SmbUpdateStaffRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> SmbStaffResourceDbModel:
+ """
+ Update an existing staff member. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ staff_id : str
+
+ request : SmbUpdateStaffRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ SmbStaffResourceDbModel
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs, SmbUpdateStaffRequestPatch
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.staff.update(
+ staff_id="staff_id",
+ request=SmbUpdateStaffRequestPatch(),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.update(
+ staff_id, request=request, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
+
+ async def delete(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Delete a staff member
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.staff.delete(
+ staff_id="staff_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.delete(
+ staff_id, xi_workspace_id=xi_workspace_id, request_options=request_options
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/staff/raw_client.py b/src/elevenlabs/reception/staff/raw_client.py
new file mode 100644
index 000000000..4271d0a9b
--- /dev/null
+++ b/src/elevenlabs/reception/staff/raw_client.py
@@ -0,0 +1,683 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.smb_create_staff_request import SmbCreateStaffRequest
+from ...types.smb_staff_resource_db_model import SmbStaffResourceDbModel
+from ...types.smb_update_staff_request_patch import SmbUpdateStaffRequestPatch
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawStaffClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.List[SmbStaffResourceDbModel]]:
+ """
+ Get all staff for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[SmbStaffResourceDbModel]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/staff",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbStaffResourceDbModel],
+ construct_type(
+ type_=typing.List[SmbStaffResourceDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ *,
+ request: SmbCreateStaffRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbStaffResourceDbModel]:
+ """
+ Create a new staff member
+
+ Parameters
+ ----------
+ request : SmbCreateStaffRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbStaffResourceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/staff",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateStaffRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbStaffResourceDbModel,
+ construct_type(
+ type_=SmbStaffResourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def get(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbStaffResourceDbModel]:
+ """
+ Get a specific staff member by ID
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbStaffResourceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/staff/{jsonable_encoder(staff_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbStaffResourceDbModel,
+ construct_type(
+ type_=SmbStaffResourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def update(
+ self,
+ staff_id: str,
+ *,
+ request: SmbUpdateStaffRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[SmbStaffResourceDbModel]:
+ """
+ Update an existing staff member. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ staff_id : str
+
+ request : SmbUpdateStaffRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[SmbStaffResourceDbModel]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/staff/{jsonable_encoder(staff_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateStaffRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbStaffResourceDbModel,
+ construct_type(
+ type_=SmbStaffResourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def delete(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a staff member
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/staff/{jsonable_encoder(staff_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawStaffClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self, *, xi_workspace_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.List[SmbStaffResourceDbModel]]:
+ """
+ Get all staff for the current workspace
+
+ Parameters
+ ----------
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[SmbStaffResourceDbModel]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/staff",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[SmbStaffResourceDbModel],
+ construct_type(
+ type_=typing.List[SmbStaffResourceDbModel], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ *,
+ request: SmbCreateStaffRequest,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbStaffResourceDbModel]:
+ """
+ Create a new staff member
+
+ Parameters
+ ----------
+ request : SmbCreateStaffRequest
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbStaffResourceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/staff",
+ method="POST",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbCreateStaffRequest, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbStaffResourceDbModel,
+ construct_type(
+ type_=SmbStaffResourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def get(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbStaffResourceDbModel]:
+ """
+ Get a specific staff member by ID
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbStaffResourceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/staff/{jsonable_encoder(staff_id)}",
+ method="GET",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbStaffResourceDbModel,
+ construct_type(
+ type_=SmbStaffResourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def update(
+ self,
+ staff_id: str,
+ *,
+ request: SmbUpdateStaffRequestPatch,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[SmbStaffResourceDbModel]:
+ """
+ Update an existing staff member. Only the fields sent are changed.
+
+ Parameters
+ ----------
+ staff_id : str
+
+ request : SmbUpdateStaffRequestPatch
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[SmbStaffResourceDbModel]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/staff/{jsonable_encoder(staff_id)}",
+ method="PUT",
+ json={
+ "request": convert_and_respect_annotation_metadata(
+ object_=request, annotation=SmbUpdateStaffRequestPatch, direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ SmbStaffResourceDbModel,
+ construct_type(
+ type_=SmbStaffResourceDbModel, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def delete(
+ self,
+ staff_id: str,
+ *,
+ xi_workspace_id: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Delete a staff member
+
+ Parameters
+ ----------
+ staff_id : str
+
+ xi_workspace_id : typing.Optional[str]
+ The customer workspace a reseller's API key acts on.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/staff/{jsonable_encoder(staff_id)}",
+ method="DELETE",
+ headers={
+ "xi-workspace-id": str(xi_workspace_id) if xi_workspace_id is not None else None,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/subscriptions/__init__.py b/src/elevenlabs/reception/subscriptions/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/subscriptions/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/subscriptions/client.py b/src/elevenlabs/reception/subscriptions/client.py
new file mode 100644
index 000000000..ab48b68d0
--- /dev/null
+++ b/src/elevenlabs/reception/subscriptions/client.py
@@ -0,0 +1,439 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.assign_reseller_tier_request import AssignResellerTierRequest
+from .raw_client import AsyncRawSubscriptionsClient, RawSubscriptionsClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class SubscriptionsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawSubscriptionsClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawSubscriptionsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawSubscriptionsClient
+ """
+ return self._raw_client
+
+ def assign(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Subscribe a reseller-attributed workspace to one of the reseller's tiers
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import AssignResellerTierRequest, ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.subscriptions.assign(
+ workspace_id="workspace_id",
+ request=AssignResellerTierRequest(
+ tier_id="tier_id",
+ ),
+ )
+ """
+ _response = self._raw_client.assign(workspace_id, request=request, request_options=request_options)
+ return _response.data
+
+ def unassign(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.Dict[str, str]:
+ """
+ End a reseller-attributed workspace's subscription at the end of the current billing period
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.subscriptions.unassign(
+ workspace_id="workspace_id",
+ )
+ """
+ _response = self._raw_client.unassign(workspace_id, request_options=request_options)
+ return _response.data
+
+ def change(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Move a reseller-attributed workspace between the reseller's tiers. Upgrades apply immediately; downgrades and lateral moves take effect at the end of the billing period.
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import AssignResellerTierRequest, ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.subscriptions.change(
+ workspace_id="workspace_id",
+ request=AssignResellerTierRequest(
+ tier_id="tier_id",
+ ),
+ )
+ """
+ _response = self._raw_client.change(workspace_id, request=request, request_options=request_options)
+ return _response.data
+
+ def restore(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.Dict[str, str]:
+ """
+ Undo a pending unassignment so the subscription renews normally
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.subscriptions.restore(
+ workspace_id="workspace_id",
+ )
+ """
+ _response = self._raw_client.restore(workspace_id, request_options=request_options)
+ return _response.data
+
+ def cancel_pending_downgrade(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.Dict[str, str]:
+ """
+ Drop a scheduled downgrade, leaving the workspace on its current tier
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.subscriptions.cancel_pending_downgrade(
+ workspace_id="workspace_id",
+ )
+ """
+ _response = self._raw_client.cancel_pending_downgrade(workspace_id, request_options=request_options)
+ return _response.data
+
+
+class AsyncSubscriptionsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawSubscriptionsClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawSubscriptionsClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawSubscriptionsClient
+ """
+ return self._raw_client
+
+ async def assign(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Subscribe a reseller-attributed workspace to one of the reseller's tiers
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AssignResellerTierRequest, AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.subscriptions.assign(
+ workspace_id="workspace_id",
+ request=AssignResellerTierRequest(
+ tier_id="tier_id",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.assign(workspace_id, request=request, request_options=request_options)
+ return _response.data
+
+ async def unassign(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.Dict[str, str]:
+ """
+ End a reseller-attributed workspace's subscription at the end of the current billing period
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.subscriptions.unassign(
+ workspace_id="workspace_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.unassign(workspace_id, request_options=request_options)
+ return _response.data
+
+ async def change(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.Dict[str, str]:
+ """
+ Move a reseller-attributed workspace between the reseller's tiers. Upgrades apply immediately; downgrades and lateral moves take effect at the end of the billing period.
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AssignResellerTierRequest, AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.subscriptions.change(
+ workspace_id="workspace_id",
+ request=AssignResellerTierRequest(
+ tier_id="tier_id",
+ ),
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.change(workspace_id, request=request, request_options=request_options)
+ return _response.data
+
+ async def restore(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.Dict[str, str]:
+ """
+ Undo a pending unassignment so the subscription renews normally
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.subscriptions.restore(
+ workspace_id="workspace_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.restore(workspace_id, request_options=request_options)
+ return _response.data
+
+ async def cancel_pending_downgrade(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.Dict[str, str]:
+ """
+ Drop a scheduled downgrade, leaving the workspace on its current tier
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.Dict[str, str]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.subscriptions.cancel_pending_downgrade(
+ workspace_id="workspace_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.cancel_pending_downgrade(workspace_id, request_options=request_options)
+ return _response.data
diff --git a/src/elevenlabs/reception/subscriptions/raw_client.py b/src/elevenlabs/reception/subscriptions/raw_client.py
new file mode 100644
index 000000000..427d9b082
--- /dev/null
+++ b/src/elevenlabs/reception/subscriptions/raw_client.py
@@ -0,0 +1,611 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.assign_reseller_tier_request import AssignResellerTierRequest
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawSubscriptionsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def assign(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Subscribe a reseller-attributed workspace to one of the reseller's tiers
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription",
+ method="POST",
+ json=convert_and_respect_annotation_metadata(
+ object_=request, annotation=AssignResellerTierRequest, direction="write"
+ ),
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def unassign(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ End a reseller-attributed workspace's subscription at the end of the current billing period
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def change(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Move a reseller-attributed workspace between the reseller's tiers. Upgrades apply immediately; downgrades and lateral moves take effect at the end of the billing period.
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription",
+ method="PATCH",
+ json=convert_and_respect_annotation_metadata(
+ object_=request, annotation=AssignResellerTierRequest, direction="write"
+ ),
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def restore(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Undo a pending unassignment so the subscription renews normally
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription/restore",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def cancel_pending_downgrade(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.Dict[str, str]]:
+ """
+ Drop a scheduled downgrade, leaving the workspace on its current tier
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription/cancel-downgrade",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawSubscriptionsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def assign(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Subscribe a reseller-attributed workspace to one of the reseller's tiers
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription",
+ method="POST",
+ json=convert_and_respect_annotation_metadata(
+ object_=request, annotation=AssignResellerTierRequest, direction="write"
+ ),
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def unassign(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ End a reseller-attributed workspace's subscription at the end of the current billing period
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def change(
+ self,
+ workspace_id: str,
+ *,
+ request: AssignResellerTierRequest,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Move a reseller-attributed workspace between the reseller's tiers. Upgrades apply immediately; downgrades and lateral moves take effect at the end of the billing period.
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request : AssignResellerTierRequest
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription",
+ method="PATCH",
+ json=convert_and_respect_annotation_metadata(
+ object_=request, annotation=AssignResellerTierRequest, direction="write"
+ ),
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def restore(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Undo a pending unassignment so the subscription renews normally
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription/restore",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def cancel_pending_downgrade(
+ self, workspace_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.Dict[str, str]]:
+ """
+ Drop a scheduled downgrade, leaving the workspace on its current tier
+
+ Parameters
+ ----------
+ workspace_id : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.Dict[str, str]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/smb/reseller/workspaces/{jsonable_encoder(workspace_id)}/subscription/cancel-downgrade",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.Dict[str, str],
+ construct_type(
+ type_=typing.Dict[str, str], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/tiers/__init__.py b/src/elevenlabs/reception/tiers/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/tiers/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/tiers/client.py b/src/elevenlabs/reception/tiers/client.py
new file mode 100644
index 000000000..40d5f5fb2
--- /dev/null
+++ b/src/elevenlabs/reception/tiers/client.py
@@ -0,0 +1,102 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.reseller_tier_response import ResellerTierResponse
+from .raw_client import AsyncRawTiersClient, RawTiersClient
+
+
+class TiersClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawTiersClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawTiersClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawTiersClient
+ """
+ return self._raw_client
+
+ def list(self, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[ResellerTierResponse]:
+ """
+ The reseller's live tier ladder, lowest rank first. The first entry is the trial. Without tier management the rest are the builtin tiers. Retired tiers are omitted
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[ResellerTierResponse]
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.tiers.list()
+ """
+ _response = self._raw_client.list(request_options=request_options)
+ return _response.data
+
+
+class AsyncTiersClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawTiersClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawTiersClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawTiersClient
+ """
+ return self._raw_client
+
+ async def list(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[ResellerTierResponse]:
+ """
+ The reseller's live tier ladder, lowest rank first. The first entry is the trial. Without tier management the rest are the builtin tiers. Retired tiers are omitted
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[ResellerTierResponse]
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.tiers.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(request_options=request_options)
+ return _response.data
diff --git a/src/elevenlabs/reception/tiers/raw_client.py b/src/elevenlabs/reception/tiers/raw_client.py
new file mode 100644
index 000000000..167f482f1
--- /dev/null
+++ b/src/elevenlabs/reception/tiers/raw_client.py
@@ -0,0 +1,126 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.reseller_tier_response import ResellerTierResponse
+from pydantic import ValidationError
+
+
+class RawTiersClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[typing.List[ResellerTierResponse]]:
+ """
+ The reseller's live tier ladder, lowest rank first. The first entry is the trial. Without tier management the rest are the builtin tiers. Retired tiers are omitted
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[typing.List[ResellerTierResponse]]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/tier-ladder",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[ResellerTierResponse],
+ construct_type(
+ type_=typing.List[ResellerTierResponse], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawTiersClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[typing.List[ResellerTierResponse]]:
+ """
+ The reseller's live tier ladder, lowest rank first. The first entry is the trial. Without tier management the rest are the builtin tiers. Retired tiers are omitted
+
+ Parameters
+ ----------
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[typing.List[ResellerTierResponse]]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/tier-ladder",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ typing.List[ResellerTierResponse],
+ construct_type(
+ type_=typing.List[ResellerTierResponse], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/reception/workspaces/__init__.py b/src/elevenlabs/reception/workspaces/__init__.py
new file mode 100644
index 000000000..5cde0202d
--- /dev/null
+++ b/src/elevenlabs/reception/workspaces/__init__.py
@@ -0,0 +1,4 @@
+# This file was auto-generated by Fern from our API Definition.
+
+# isort: skip_file
+
diff --git a/src/elevenlabs/reception/workspaces/client.py b/src/elevenlabs/reception/workspaces/client.py
new file mode 100644
index 000000000..42f8899a4
--- /dev/null
+++ b/src/elevenlabs/reception/workspaces/client.py
@@ -0,0 +1,246 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.provision_reseller_workspace_response import ProvisionResellerWorkspaceResponse
+from ...types.provision_reseller_workspace_subscription import ProvisionResellerWorkspaceSubscription
+from ...types.reseller_workspaces_response import ResellerWorkspacesResponse
+from ...types.team_invite_request import TeamInviteRequest
+from .raw_client import AsyncRawWorkspacesClient, RawWorkspacesClient
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class WorkspacesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._raw_client = RawWorkspacesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> RawWorkspacesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ RawWorkspacesClient
+ """
+ return self._raw_client
+
+ def list(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ResellerWorkspacesResponse:
+ """
+ List workspaces attributed to the caller's reseller, with cursor-based pagination
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of workspaces per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerWorkspacesResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.workspaces.list(
+ cursor="cursor",
+ page_size=1,
+ )
+ """
+ _response = self._raw_client.list(cursor=cursor, page_size=page_size, request_options=request_options)
+ return _response.data
+
+ def create(
+ self,
+ *,
+ business_name: str,
+ subscription: typing.Optional[ProvisionResellerWorkspaceSubscription] = OMIT,
+ phone_number: typing.Optional[str] = OMIT,
+ members: typing.Optional[typing.Sequence[TeamInviteRequest]] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ProvisionResellerWorkspaceResponse:
+ """
+ Parameters
+ ----------
+ business_name : str
+
+ subscription : typing.Optional[ProvisionResellerWorkspaceSubscription]
+ Paid tier to subscribe to. Omitted leaves the workspace with no subscription.
+
+ phone_number : typing.Optional[str]
+ A free number from the reseller's phone pool, reserved for the workspace until onboarding binds it to the receptionist.
+
+ members : typing.Optional[typing.Sequence[TeamInviteRequest]]
+ People to invite once the workspace exists, capped by the tier's team size. Best-effort: each outcome is in `member_results`.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ProvisionResellerWorkspaceResponse
+ Successful Response
+
+ Examples
+ --------
+ from elevenlabs import ElevenLabs
+
+ client = ElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+ client.reception.workspaces.create(
+ business_name="business_name",
+ )
+ """
+ _response = self._raw_client.create(
+ business_name=business_name,
+ subscription=subscription,
+ phone_number=phone_number,
+ members=members,
+ request_options=request_options,
+ )
+ return _response.data
+
+
+class AsyncWorkspacesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._raw_client = AsyncRawWorkspacesClient(client_wrapper=client_wrapper)
+
+ @property
+ def with_raw_response(self) -> AsyncRawWorkspacesClient:
+ """
+ Retrieves a raw implementation of this client that returns raw responses.
+
+ Returns
+ -------
+ AsyncRawWorkspacesClient
+ """
+ return self._raw_client
+
+ async def list(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ResellerWorkspacesResponse:
+ """
+ List workspaces attributed to the caller's reseller, with cursor-based pagination
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of workspaces per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ResellerWorkspacesResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.workspaces.list(
+ cursor="cursor",
+ page_size=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.list(cursor=cursor, page_size=page_size, request_options=request_options)
+ return _response.data
+
+ async def create(
+ self,
+ *,
+ business_name: str,
+ subscription: typing.Optional[ProvisionResellerWorkspaceSubscription] = OMIT,
+ phone_number: typing.Optional[str] = OMIT,
+ members: typing.Optional[typing.Sequence[TeamInviteRequest]] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ProvisionResellerWorkspaceResponse:
+ """
+ Parameters
+ ----------
+ business_name : str
+
+ subscription : typing.Optional[ProvisionResellerWorkspaceSubscription]
+ Paid tier to subscribe to. Omitted leaves the workspace with no subscription.
+
+ phone_number : typing.Optional[str]
+ A free number from the reseller's phone pool, reserved for the workspace until onboarding binds it to the receptionist.
+
+ members : typing.Optional[typing.Sequence[TeamInviteRequest]]
+ People to invite once the workspace exists, capped by the tier's team size. Best-effort: each outcome is in `member_results`.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ProvisionResellerWorkspaceResponse
+ Successful Response
+
+ Examples
+ --------
+ import asyncio
+
+ from elevenlabs import AsyncElevenLabs
+
+ client = AsyncElevenLabs(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.reception.workspaces.create(
+ business_name="business_name",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.create(
+ business_name=business_name,
+ subscription=subscription,
+ phone_number=phone_number,
+ members=members,
+ request_options=request_options,
+ )
+ return _response.data
diff --git a/src/elevenlabs/reception/workspaces/raw_client.py b/src/elevenlabs/reception/workspaces/raw_client.py
new file mode 100644
index 000000000..e5b69c24e
--- /dev/null
+++ b/src/elevenlabs/reception/workspaces/raw_client.py
@@ -0,0 +1,321 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from json.decoder import JSONDecodeError
+
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
+from ...core.http_response import AsyncHttpResponse, HttpResponse
+from ...core.parse_error import ParsingError
+from ...core.request_options import RequestOptions
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.unchecked_base_model import construct_type
+from ...errors.unprocessable_entity_error import UnprocessableEntityError
+from ...types.provision_reseller_workspace_response import ProvisionResellerWorkspaceResponse
+from ...types.provision_reseller_workspace_subscription import ProvisionResellerWorkspaceSubscription
+from ...types.reseller_workspaces_response import ResellerWorkspacesResponse
+from ...types.team_invite_request import TeamInviteRequest
+from pydantic import ValidationError
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RawWorkspacesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ResellerWorkspacesResponse]:
+ """
+ List workspaces attributed to the caller's reseller, with cursor-based pagination
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of workspaces per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ResellerWorkspacesResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/workspaces",
+ method="GET",
+ params={
+ "cursor": cursor,
+ "page_size": page_size,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerWorkspacesResponse,
+ construct_type(
+ type_=ResellerWorkspacesResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ def create(
+ self,
+ *,
+ business_name: str,
+ subscription: typing.Optional[ProvisionResellerWorkspaceSubscription] = OMIT,
+ phone_number: typing.Optional[str] = OMIT,
+ members: typing.Optional[typing.Sequence[TeamInviteRequest]] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> HttpResponse[ProvisionResellerWorkspaceResponse]:
+ """
+ Parameters
+ ----------
+ business_name : str
+
+ subscription : typing.Optional[ProvisionResellerWorkspaceSubscription]
+ Paid tier to subscribe to. Omitted leaves the workspace with no subscription.
+
+ phone_number : typing.Optional[str]
+ A free number from the reseller's phone pool, reserved for the workspace until onboarding binds it to the receptionist.
+
+ members : typing.Optional[typing.Sequence[TeamInviteRequest]]
+ People to invite once the workspace exists, capped by the tier's team size. Best-effort: each outcome is in `member_results`.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[ProvisionResellerWorkspaceResponse]
+ Successful Response
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/workspaces",
+ method="POST",
+ json={
+ "business_name": business_name,
+ "subscription": convert_and_respect_annotation_metadata(
+ object_=subscription, annotation=ProvisionResellerWorkspaceSubscription, direction="write"
+ ),
+ "phone_number": phone_number,
+ "members": convert_and_respect_annotation_metadata(
+ object_=members, annotation=typing.Sequence[TeamInviteRequest], direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ProvisionResellerWorkspaceResponse,
+ construct_type(
+ type_=ProvisionResellerWorkspaceResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+
+class AsyncRawWorkspacesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self,
+ *,
+ cursor: typing.Optional[str] = None,
+ page_size: typing.Optional[int] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ResellerWorkspacesResponse]:
+ """
+ List workspaces attributed to the caller's reseller, with cursor-based pagination
+
+ Parameters
+ ----------
+ cursor : typing.Optional[str]
+ Pagination cursor from previous response
+
+ page_size : typing.Optional[int]
+ Number of workspaces per page
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ResellerWorkspacesResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/workspaces",
+ method="GET",
+ params={
+ "cursor": cursor,
+ "page_size": page_size,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ResellerWorkspacesResponse,
+ construct_type(
+ type_=ResellerWorkspacesResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
+ async def create(
+ self,
+ *,
+ business_name: str,
+ subscription: typing.Optional[ProvisionResellerWorkspaceSubscription] = OMIT,
+ phone_number: typing.Optional[str] = OMIT,
+ members: typing.Optional[typing.Sequence[TeamInviteRequest]] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[ProvisionResellerWorkspaceResponse]:
+ """
+ Parameters
+ ----------
+ business_name : str
+
+ subscription : typing.Optional[ProvisionResellerWorkspaceSubscription]
+ Paid tier to subscribe to. Omitted leaves the workspace with no subscription.
+
+ phone_number : typing.Optional[str]
+ A free number from the reseller's phone pool, reserved for the workspace until onboarding binds it to the receptionist.
+
+ members : typing.Optional[typing.Sequence[TeamInviteRequest]]
+ People to invite once the workspace exists, capped by the tier's team size. Best-effort: each outcome is in `member_results`.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[ProvisionResellerWorkspaceResponse]
+ Successful Response
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/smb/reseller/workspaces",
+ method="POST",
+ json={
+ "business_name": business_name,
+ "subscription": convert_and_respect_annotation_metadata(
+ object_=subscription, annotation=ProvisionResellerWorkspaceSubscription, direction="write"
+ ),
+ "phone_number": phone_number,
+ "members": convert_and_respect_annotation_metadata(
+ object_=members, annotation=typing.Sequence[TeamInviteRequest], direction="write"
+ ),
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ ProvisionResellerWorkspaceResponse,
+ construct_type(
+ type_=ProvisionResellerWorkspaceResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 422:
+ raise UnprocessableEntityError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ construct_type(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/elevenlabs/service_accounts/api_keys/client.py b/src/elevenlabs/service_accounts/api_keys/client.py
index 9e063d07c..578259013 100644
--- a/src/elevenlabs/service_accounts/api_keys/client.py
+++ b/src/elevenlabs/service_accounts/api_keys/client.py
@@ -135,7 +135,7 @@ def create(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[int]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -279,7 +279,7 @@ def update(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[BodyEditServiceAccountApiKeyV1ServiceAccountsServiceAccountUserIdApiKeysApiKeyIdPatchExpiresAtUnix]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -455,7 +455,7 @@ async def create(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[int]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -615,7 +615,7 @@ async def update(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[BodyEditServiceAccountApiKeyV1ServiceAccountsServiceAccountUserIdApiKeysApiKeyIdPatchExpiresAtUnix]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
diff --git a/src/elevenlabs/service_accounts/api_keys/raw_client.py b/src/elevenlabs/service_accounts/api_keys/raw_client.py
index 6761ded08..e782a1842 100644
--- a/src/elevenlabs/service_accounts/api_keys/raw_client.py
+++ b/src/elevenlabs/service_accounts/api_keys/raw_client.py
@@ -153,7 +153,7 @@ def create(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[int]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -346,7 +346,7 @@ def update(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[BodyEditServiceAccountApiKeyV1ServiceAccountsServiceAccountUserIdApiKeysApiKeyIdPatchExpiresAtUnix]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -606,7 +606,7 @@ async def create(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[int]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -799,7 +799,7 @@ async def update(
Maximum concurrent music generation requests for this API key. Only available for enterprise customers.
expires_at_unix : typing.Optional[BodyEditServiceAccountApiKeyV1ServiceAccountsServiceAccountUserIdApiKeysApiKeyIdPatchExpiresAtUnix]
- Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires).
+ Unix timestamp (in seconds) after which this API key stops working. When set, it must be at least 15 minutes and at most 90 days in the future. On create, omit or pass null for a key that never expires. On update, omit to leave it unchanged, or pass "clear" to remove the expiry (never expires). A workspace may disallow never-expiring keys, or allow them only on service account API keys; creating one or clearing an expiry then fails.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
diff --git a/src/elevenlabs/speech_to_text/client.py b/src/elevenlabs/speech_to_text/client.py
index aafabd890..a625325da 100644
--- a/src/elevenlabs/speech_to_text/client.py
+++ b/src/elevenlabs/speech_to_text/client.py
@@ -151,7 +151,7 @@ def convert(
Detect entities in the transcript. Can be 'all' to detect all entities, a single entity type or category string, or a list of entity types/categories. Categories include 'pii', 'phi', 'pci', 'other', 'offensive_language'. When enabled, detected entities will be returned in the 'entities' field with their text, type, and character positions.
no_verbatim : typing.Optional[bool]
- If true, the transcription will not have any filler words, false starts and non-speech sounds. Only supported with scribe_v2 model.
+ If true, the transcription will not have any filler words, false starts and non-speech sounds.
use_speaker_library : typing.Optional[bool]
Whether to use the speaker library for identifying known speakers during diarization. When enabled and diarize is true, detected speakers will be matched against registered speakers in the workspace's speaker library.
@@ -358,7 +358,7 @@ async def convert(
Detect entities in the transcript. Can be 'all' to detect all entities, a single entity type or category string, or a list of entity types/categories. Categories include 'pii', 'phi', 'pci', 'other', 'offensive_language'. When enabled, detected entities will be returned in the 'entities' field with their text, type, and character positions.
no_verbatim : typing.Optional[bool]
- If true, the transcription will not have any filler words, false starts and non-speech sounds. Only supported with scribe_v2 model.
+ If true, the transcription will not have any filler words, false starts and non-speech sounds.
use_speaker_library : typing.Optional[bool]
Whether to use the speaker library for identifying known speakers during diarization. When enabled and diarize is true, detected speakers will be matched against registered speakers in the workspace's speaker library.
diff --git a/src/elevenlabs/speech_to_text/raw_client.py b/src/elevenlabs/speech_to_text/raw_client.py
index b05a3ef97..bf2bbafb3 100644
--- a/src/elevenlabs/speech_to_text/raw_client.py
+++ b/src/elevenlabs/speech_to_text/raw_client.py
@@ -142,7 +142,7 @@ def convert(
Detect entities in the transcript. Can be 'all' to detect all entities, a single entity type or category string, or a list of entity types/categories. Categories include 'pii', 'phi', 'pci', 'other', 'offensive_language'. When enabled, detected entities will be returned in the 'entities' field with their text, type, and character positions.
no_verbatim : typing.Optional[bool]
- If true, the transcription will not have any filler words, false starts and non-speech sounds. Only supported with scribe_v2 model.
+ If true, the transcription will not have any filler words, false starts and non-speech sounds.
use_speaker_library : typing.Optional[bool]
Whether to use the speaker library for identifying known speakers during diarization. When enabled and diarize is true, detected speakers will be matched against registered speakers in the workspace's speaker library.
@@ -199,7 +199,7 @@ def convert(
"detect_speaker_roles": detect_speaker_roles,
"entity_redaction": json.dumps(jsonable_encoder(entity_redaction)),
"entity_redaction_mode": entity_redaction_mode,
- "keyterms": keyterms,
+ "keyterms": json.dumps(jsonable_encoder(keyterms)),
},
files={
**({"file": file} if file is not None else {}),
@@ -357,7 +357,7 @@ async def convert(
Detect entities in the transcript. Can be 'all' to detect all entities, a single entity type or category string, or a list of entity types/categories. Categories include 'pii', 'phi', 'pci', 'other', 'offensive_language'. When enabled, detected entities will be returned in the 'entities' field with their text, type, and character positions.
no_verbatim : typing.Optional[bool]
- If true, the transcription will not have any filler words, false starts and non-speech sounds. Only supported with scribe_v2 model.
+ If true, the transcription will not have any filler words, false starts and non-speech sounds.
use_speaker_library : typing.Optional[bool]
Whether to use the speaker library for identifying known speakers during diarization. When enabled and diarize is true, detected speakers will be matched against registered speakers in the workspace's speaker library.
@@ -414,7 +414,7 @@ async def convert(
"detect_speaker_roles": detect_speaker_roles,
"entity_redaction": json.dumps(jsonable_encoder(entity_redaction)),
"entity_redaction_mode": entity_redaction_mode,
- "keyterms": keyterms,
+ "keyterms": json.dumps(jsonable_encoder(keyterms)),
},
files={
**({"file": file} if file is not None else {}),
diff --git a/src/elevenlabs/studio/projects/raw_client.py b/src/elevenlabs/studio/projects/raw_client.py
index 47fc5054d..1a6e731ad 100644
--- a/src/elevenlabs/studio/projects/raw_client.py
+++ b/src/elevenlabs/studio/projects/raw_client.py
@@ -1,5 +1,6 @@
# This file was auto-generated by Fern from our API Definition.
+import json
import typing
from json.decoder import JSONDecodeError
@@ -304,7 +305,7 @@ def create(
"title": title,
"author": author,
"description": description,
- "genres": genres,
+ "genres": json.dumps(jsonable_encoder(genres)),
"target_audience": target_audience,
"language": language,
"content_type": content_type,
@@ -313,14 +314,14 @@ def create(
"isbn_number": isbn_number,
"acx_volume_normalization": acx_volume_normalization,
"volume_normalization": volume_normalization,
- "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
+ "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
"callback_url": callback_url,
"fiction": fiction,
"apply_text_normalization": apply_text_normalization,
"auto_convert": auto_convert,
"auto_assign_voices": auto_assign_voices,
"source_type": source_type,
- "voice_settings": voice_settings,
+ "voice_settings": json.dumps(jsonable_encoder(voice_settings)),
"create_publishing_read": create_publishing_read,
},
files={
@@ -961,7 +962,7 @@ async def create(
"title": title,
"author": author,
"description": description,
- "genres": genres,
+ "genres": json.dumps(jsonable_encoder(genres)),
"target_audience": target_audience,
"language": language,
"content_type": content_type,
@@ -970,14 +971,14 @@ async def create(
"isbn_number": isbn_number,
"acx_volume_normalization": acx_volume_normalization,
"volume_normalization": volume_normalization,
- "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
+ "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
"callback_url": callback_url,
"fiction": fiction,
"apply_text_normalization": apply_text_normalization,
"auto_convert": auto_convert,
"auto_assign_voices": auto_assign_voices,
"source_type": source_type,
- "voice_settings": voice_settings,
+ "voice_settings": json.dumps(jsonable_encoder(voice_settings)),
"create_publishing_read": create_publishing_read,
},
files={
diff --git a/src/elevenlabs/types/__init__.py b/src/elevenlabs/types/__init__.py
index e41999d7e..f61079066 100644
--- a/src/elevenlabs/types/__init__.py
+++ b/src/elevenlabs/types/__init__.py
@@ -17,6 +17,7 @@
AddPronunciationDictionaryResponseModelPermissionOnResource,
)
from .add_sharing_voice_request import AddSharingVoiceRequest
+ from .add_url_request import AddUrlRequest
from .add_voice_ivc_response_model import AddVoiceIvcResponseModel
from .add_voice_response_model import AddVoiceResponseModel
from .add_voice_to_user_voice_collection_response_model import AddVoiceToUserVoiceCollectionResponseModel
@@ -90,6 +91,7 @@
from .agent_platform_settings_response_model import AgentPlatformSettingsResponseModel
from .agent_queueing_config import AgentQueueingConfig
from .agent_response_payload import AgentResponsePayload
+ from .agent_rule import AgentRule
from .agent_simulated_chat_test_response_model import AgentSimulatedChatTestResponseModel
from .agent_smb_metadata import AgentSmbMetadata
from .agent_sort_by import AgentSortBy
@@ -196,6 +198,8 @@
)
from .api_integration_webhook_tool_config_input import ApiIntegrationWebhookToolConfigInput
from .api_integration_webhook_tool_config_output import ApiIntegrationWebhookToolConfigOutput
+ from .application_number_type import ApplicationNumberType
+ from .appointment_reminder_mode import AppointmentReminderMode
from .architect_dispatch_response_model import ArchitectDispatchResponseModel
from .array_json_schema_property_input import ArrayJsonSchemaPropertyInput
from .array_json_schema_property_input_items import ArrayJsonSchemaPropertyInputItems
@@ -215,6 +219,8 @@
from .asset_transcription import AssetTranscription
from .asset_transcription_data import AssetTranscriptionData
from .asset_transcription_status import AssetTranscriptionStatus
+ from .assign_reseller_tier_request import AssignResellerTierRequest
+ from .assign_reseller_tier_request_billing_period import AssignResellerTierRequestBillingPeriod
from .assignable_user_response_model import AssignableUserResponseModel
from .ast_addition_operator_node_input import AstAdditionOperatorNodeInput
from .ast_addition_operator_node_output import AstAdditionOperatorNodeOutput
@@ -406,6 +412,8 @@
from .bytedance_seedream_5_pro_request import BytedanceSeedream5ProRequest
from .bytedance_seedream_5_pro_request_aspect_ratio import BytedanceSeedream5ProRequestAspectRatio
from .bytedance_seedream_5_pro_request_resolution import BytedanceSeedream5ProRequestResolution
+ from .cal_com_connection_health_status import CalComConnectionHealthStatus
+ from .calendly_connection_health_status import CalendlyConnectionHealthStatus
from .call_result import CallResult
from .campaign_conversation_type import CampaignConversationType
from .cancel_calendar_event_params import CancelCalendarEventParams
@@ -752,6 +760,7 @@
)
from .convert_chapter_response_model import ConvertChapterResponseModel
from .convert_project_response_model import ConvertProjectResponseModel
+ from .country_code import CountryCode
from .crawl_status import CrawlStatus
from .crawl_type import CrawlType
from .create_agent_branch_response_model import CreateAgentBranchResponseModel
@@ -828,10 +837,15 @@
from .custom_llmapi_type import CustomLlmapiType
from .custom_sip_header import CustomSipHeader
from .custom_sip_header_with_dynamic_variable import CustomSipHeaderWithDynamicVariable
+ from .customer_facing_config_input import CustomerFacingConfigInput
+ from .customer_facing_config_output import CustomerFacingConfigOutput
+ from .customer_facing_config_patch import CustomerFacingConfigPatch
from .dashboard_call_success_chart_model import DashboardCallSuccessChartModel
from .dashboard_criteria_chart_model import DashboardCriteriaChartModel
from .dashboard_data_collection_chart_model import DashboardDataCollectionChartModel
from .data_collection_result_common_model import DataCollectionResultCommonModel
+ from .date_model import DateModel
+ from .day_of_week import DayOfWeek
from .default_sharing_group_config import DefaultSharingGroupConfig
from .default_sharing_group_config_permission_level import DefaultSharingGroupConfigPermissionLevel
from .default_sharing_group_response_model import DefaultSharingGroupResponseModel
@@ -895,17 +909,9 @@
from .dtmf_input_config import DtmfInputConfig
from .dub_order_item_request import DubOrderItemRequest
from .dubbed_segment import DubbedSegment
- from .dubbing_audio import DubbingAudio
- from .dubbing_audio_output_error import DubbingAudioOutputError
- from .dubbing_auth_error import DubbingAuthError
from .dubbing_bulk_source_segment_update_response import DubbingBulkSourceSegmentUpdateResponse
from .dubbing_bulk_target_segment_update_response import DubbingBulkTargetSegmentUpdateResponse
- from .dubbing_committed_transcript import DubbingCommittedTranscript
- from .dubbing_end_of_stream import DubbingEndOfStream
from .dubbing_error import DubbingError
- from .dubbing_input_audio_chunk import DubbingInputAudioChunk
- from .dubbing_input_error import DubbingInputError
- from .dubbing_invalid_request_error import DubbingInvalidRequestError
from .dubbing_language_list_response import DubbingLanguageListResponse
from .dubbing_language_outputs import DubbingLanguageOutputs
from .dubbing_language_response import DubbingLanguageResponse
@@ -914,28 +920,21 @@
from .dubbing_media_reference import DubbingMediaReference
from .dubbing_metadata_page_response_model import DubbingMetadataPageResponseModel
from .dubbing_metadata_response import DubbingMetadataResponse
- from .dubbing_partial_transcript import DubbingPartialTranscript
from .dubbing_project_list_response import DubbingProjectListResponse
from .dubbing_project_response import DubbingProjectResponse
from .dubbing_project_response_status import DubbingProjectResponseStatus
- from .dubbing_queue_overflow_error import DubbingQueueOverflowError
- from .dubbing_rate_limited_error import DubbingRateLimitedError
from .dubbing_regenerate_response import DubbingRegenerateResponse
from .dubbing_release_channel import DubbingReleaseChannel
from .dubbing_render_response_model import DubbingRenderResponseModel
from .dubbing_resource import DubbingResource
from .dubbing_segment_update_request import DubbingSegmentUpdateRequest
- from .dubbing_session_started import DubbingSessionStarted
from .dubbing_source_media_info import DubbingSourceMediaInfo
from .dubbing_source_segment_update_response import DubbingSourceSegmentUpdateResponse
from .dubbing_source_transcript_response import DubbingSourceTranscriptResponse
- from .dubbing_status import DubbingStatus
- from .dubbing_status_status import DubbingStatusStatus
from .dubbing_target_segment_update_request import DubbingTargetSegmentUpdateRequest
from .dubbing_target_segment_update_response import DubbingTargetSegmentUpdateResponse
from .dubbing_target_transcript_response import DubbingTargetTranscriptResponse
from .dubbing_target_transcript_segment import DubbingTargetTranscriptSegment
- from .dubbing_transcriber_error import DubbingTranscriberError
from .dubbing_transcript import DubbingTranscript
from .dubbing_transcript_character import DubbingTranscriptCharacter
from .dubbing_transcript_response_model import DubbingTranscriptResponseModel
@@ -945,8 +944,6 @@
from .dubbing_transcript_word import DubbingTranscriptWord
from .dubbing_transcripts_response_model import DubbingTranscriptsResponseModel
from .dubbing_transcripts_response_model_transcript_format import DubbingTranscriptsResponseModelTranscriptFormat
- from .dubbing_translation import DubbingTranslation
- from .dubbing_translation_error import DubbingTranslationError
from .dummy_tool_result_model import DummyToolResultModel
from .duplicate_speech_engine_request import DuplicateSpeechEngineRequest
from .dynamic_variable_assignment import DynamicVariableAssignment
@@ -974,6 +971,7 @@
from .eleven_v_3_request import ElevenV3Request
from .eleven_v_3_request_output_format import ElevenV3RequestOutputFormat
from .eleven_v_3_voice_settings import ElevenV3VoiceSettings
+ from .email_optional import EmailOptional
from .embed_variant import EmbedVariant
from .embedding_model_enum import EmbeddingModelEnum
from .end_call_tool_config import EndCallToolConfig
@@ -1258,6 +1256,8 @@
from .history_alignment_response_model import HistoryAlignmentResponseModel
from .history_alignments_response_model import HistoryAlignmentsResponseModel
from .history_item_response import HistoryItemResponse
+ from .holiday_response_model import HolidayResponseModel
+ from .holiday_type import HolidayType
from .html_export_options import HtmlExportOptions
from .http_request_model import HttpRequestModel
from .http_validation_error import HttpValidationError
@@ -1290,6 +1290,7 @@
from .image_schema import ImageSchema
from .image_subject import ImageSubject
from .inbound_sip_trunk_config_request_model import InboundSipTrunkConfigRequestModel
+ from .ingest_failure import IngestFailure
from .init_payload import InitPayload
from .initialise_context import InitialiseContext
from .initialize_connection import InitializeConnection
@@ -1303,10 +1304,12 @@
from .inline_video_reference import InlineVideoReference
from .inline_video_reference_mime_type import InlineVideoReferenceMimeType
from .input_audio_chunk_payload import InputAudioChunkPayload
+ from .intake_question_kind import IntakeQuestionKind
from .integer_schema import IntegerSchema
from .integration_type import IntegrationType
from .interaction_budget import InteractionBudget
from .internal_alerting_webhook_notifier import InternalAlertingWebhookNotifier
+ from .internal_kb_crawl_page_timing import InternalKbCrawlPageTiming
from .internal_sampling_config_response_model import InternalSamplingConfigResponseModel
from .invoice_response import InvoiceResponse
from .invoice_response_payment_intent_status import InvoiceResponsePaymentIntentStatus
@@ -1353,6 +1356,8 @@
from .knowledge_base_tool_info import KnowledgeBaseToolInfo
from .knowledge_base_tool_result_model import KnowledgeBaseToolResultModel
from .knowledge_base_tool_status import KnowledgeBaseToolStatus
+ from .knowledge_source_status import KnowledgeSourceStatus
+ from .knowledge_source_type import KnowledgeSourceType
from .language_added_response import LanguageAddedResponse
from .language_detection_tool_config import LanguageDetectionToolConfig
from .language_detection_tool_result_model import LanguageDetectionToolResultModel
@@ -1364,6 +1369,13 @@
from .language_response import LanguageResponse
from .languages_response import LanguagesResponse, LanguagesResponse_Pair, LanguagesResponse_Single
from .leave_message_params import LeaveMessageParams
+ from .lenient_country import LenientCountry
+ from .lenient_currency import LenientCurrency
+ from .lenient_optional_bool import LenientOptionalBool
+ from .lenient_optional_str import LenientOptionalStr
+ from .lenient_phone import LenientPhone
+ from .lenient_state import LenientState
+ from .lenient_vertical import LenientVertical
from .library_voice_response import LibraryVoiceResponse
from .library_voice_response_category import LibraryVoiceResponseCategory
from .list_agent_procedures_params import ListAgentProceduresParams
@@ -1431,6 +1443,7 @@
from .llm_usage_output import LlmUsageOutput
from .load_memory_entry_tool_error_status import LoadMemoryEntryToolErrorStatus
from .loadable_memory_entry import LoadableMemoryEntry
+ from .location_response import LocationResponse
from .lock_reason import LockReason
from .manual_source import ManualSource
from .manual_verification_file_response import ManualVerificationFileResponse
@@ -1481,6 +1494,7 @@
McpToolConfigOverrideOutputInputOverridesValue_Omit,
)
from .mcp_tool_config_override_output_tool_call_sound import McpToolConfigOverrideOutputToolCallSound
+ from .mcp_transport import McpTransport
from .media_codec import MediaCodec
from .media_generation_completed_response import MediaGenerationCompletedResponse
from .media_generation_create_response import MediaGenerationCreateResponse
@@ -1655,8 +1669,11 @@
from .pending_subscription_switch_response_model import PendingSubscriptionSwitchResponseModel
from .pending_subscription_switch_response_model_next_tier import PendingSubscriptionSwitchResponseModelNextTier
from .permission_type import PermissionType
+ from .phone_number import PhoneNumber
from .phone_number_agent_info import PhoneNumberAgentInfo
from .phone_number_dynamic_variable_transfer_destination import PhoneNumberDynamicVariableTransferDestination
+ from .phone_number_nullable import PhoneNumberNullable
+ from .phone_number_optional import PhoneNumberOptional
from .phone_number_sort_by import PhoneNumberSortBy
from .phone_number_transfer import PhoneNumberTransfer
from .phone_number_transfer_custom_sip_headers_item import (
@@ -1703,6 +1720,7 @@
from .pre_tool_speech_mode import PreToolSpeechMode
from .preview_audio_db_model import PreviewAudioDbModel
from .price import Price
+ from .pricing_mode import PricingMode
from .privacy_config_input import PrivacyConfigInput
from .privacy_config_output import PrivacyConfigOutput
from .private_key_jwt_response import PrivateKeyJwtResponse
@@ -1715,6 +1733,7 @@
from .procedure_type import ProcedureType
from .procedure_validation_error import ProcedureValidationError
from .procedure_version_ref import ProcedureVersionRef
+ from .processing_progress import ProcessingProgress
from .project_creation_meta_response_model import ProjectCreationMetaResponseModel
from .project_creation_meta_response_model_status import ProjectCreationMetaResponseModelStatus
from .project_creation_meta_type import ProjectCreationMetaType
@@ -1753,6 +1772,7 @@
from .project_video_response_model import ProjectVideoResponseModel
from .project_video_thumbnail_sheet_response_model import ProjectVideoThumbnailSheetResponseModel
from .project_voice_response_model import ProjectVoiceResponseModel
+ from .promotion_target import PromotionTarget
from .prompt_agent import PromptAgent
from .prompt_agent_api_model_input import PromptAgentApiModelInput
from .prompt_agent_api_model_input_backup_llm_config import (
@@ -1830,6 +1850,11 @@
from .pronunciation_dictionary_version_response_model_permission_on_resource import (
PronunciationDictionaryVersionResponseModelPermissionOnResource,
)
+ from .provision_reseller_workspace_response import ProvisionResellerWorkspaceResponse
+ from .provision_reseller_workspace_subscription import ProvisionResellerWorkspaceSubscription
+ from .provision_reseller_workspace_subscription_billing_period import (
+ ProvisionResellerWorkspaceSubscriptionBillingPeriod,
+ )
from .pydantic_pronunciation_dictionary_version_locator import PydanticPronunciationDictionaryVersionLocator
from .quality_preset_type import QualityPresetType
from .query_params_json_schema_input import QueryParamsJsonSchemaInput
@@ -1848,6 +1873,9 @@
from .rag_index_overview_response_model import RagIndexOverviewResponseModel
from .rag_index_status import RagIndexStatus
from .rag_retrieval_info import RagRetrievalInfo
+ from .raw_business_info import RawBusinessInfo
+ from .raw_item import RawItem
+ from .raw_location_info import RawLocationInfo
from .read_legal_terms import ReadLegalTerms
from .read_metadata_chapter_db_model import ReadMetadataChapterDbModel
from .reader_resource_response_model import ReaderResourceResponseModel
@@ -1875,6 +1903,19 @@
from .request_pvc_manual_verification_response_model import RequestPvcManualVerificationResponseModel
from .required_constraint import RequiredConstraint
from .required_constraints import RequiredConstraints
+ from .reseller_invoice_detail import ResellerInvoiceDetail
+ from .reseller_invoice_line import ResellerInvoiceLine
+ from .reseller_invoice_line_kind import ResellerInvoiceLineKind
+ from .reseller_invoice_status import ResellerInvoiceStatus
+ from .reseller_invoice_summary import ResellerInvoiceSummary
+ from .reseller_invoices_response import ResellerInvoicesResponse
+ from .reseller_tier_response import ResellerTierResponse
+ from .reseller_upcoming_payment import ResellerUpcomingPayment
+ from .reseller_upcoming_payments_response import ResellerUpcomingPaymentsResponse
+ from .reseller_workspace_subscription import ResellerWorkspaceSubscription
+ from .reseller_workspace_subscription_billing_period import ResellerWorkspaceSubscriptionBillingPeriod
+ from .reseller_workspace_summary import ResellerWorkspaceSummary
+ from .reseller_workspaces_response import ResellerWorkspacesResponse
from .resource_access_info import ResourceAccessInfo
from .resource_access_info_access_source import ResourceAccessInfoAccessSource
from .resource_access_info_anonymous_access_level_override import ResourceAccessInfoAnonymousAccessLevelOverride
@@ -1893,6 +1934,7 @@
from .review_response_model_reject_reasons_item import ReviewResponseModelRejectReasonsItem
from .review_response_model_review_status import ReviewResponseModelReviewStatus
from .review_status import ReviewStatus
+ from .rule_priority import RulePriority
from .safety_common_model_input import SafetyCommonModelInput
from .safety_common_model_output import SafetyCommonModelOutput
from .safety_evaluation import SafetyEvaluation
@@ -1944,6 +1986,8 @@
from .send_text_multi import SendTextMulti
from .sentiment_aggregate import SentimentAggregate
from .sentiment_analysis_settings import SentimentAnalysisSettings
+ from .service_location_type import ServiceLocationType
+ from .service_update_response import ServiceUpdateResponse
from .session_started_payload import SessionStartedPayload
from .session_started_payload_config import SessionStartedPayloadConfig
from .session_started_payload_config_commit_strategy import SessionStartedPayloadConfigCommitStrategy
@@ -1973,10 +2017,66 @@
from .skip_turn_tool_config import SkipTurnToolConfig
from .skip_turn_tool_response_model import SkipTurnToolResponseModel
from .slack_bot_auth_response import SlackBotAuthResponse
+ from .smb_add_on import SmbAddOn
+ from .smb_agent_info_response import SmbAgentInfoResponse
+ from .smb_agent_info_response_currency import SmbAgentInfoResponseCurrency
+ from .smb_agent_target import SmbAgentTarget
from .smb_agent_type import SmbAgentType
+ from .smb_asset_scrapable import SmbAssetScrapable
from .smb_client_access_config import SmbClientAccessConfig
+ from .smb_create_agent_rule_request import SmbCreateAgentRuleRequest
+ from .smb_create_holiday_request import SmbCreateHolidayRequest
+ from .smb_create_procedure_request import SmbCreateProcedureRequest
+ from .smb_create_service_request import SmbCreateServiceRequest
+ from .smb_create_staff_request import SmbCreateStaffRequest
+ from .smb_create_transfer_rule_request import SmbCreateTransferRuleRequest
+ from .smb_customer_facing_agent import SmbCustomerFacingAgent
+ from .smb_customer_facing_agent_deactivation_reason import SmbCustomerFacingAgentDeactivationReason
+ from .smb_customer_facing_agent_response import SmbCustomerFacingAgentResponse
+ from .smb_group_membership import SmbGroupMembership
+ from .smb_identity_verification_config import SmbIdentityVerificationConfig
+ from .smb_intake_question import SmbIntakeQuestion
+ from .smb_knowledge_source_db_model import SmbKnowledgeSourceDbModel
+ from .smb_location_deactivation_reason import SmbLocationDeactivationReason
+ from .smb_location_input import SmbLocationInput
+ from .smb_location_output import SmbLocationOutput
+ from .smb_location_request import SmbLocationRequest
+ from .smb_location_request_patch import SmbLocationRequestPatch
+ from .smb_notification_channel import SmbNotificationChannel
+ from .smb_phone_assignment_db_model import SmbPhoneAssignmentDbModel
+ from .smb_phone_assignment_db_model_provider import SmbPhoneAssignmentDbModelProvider
+ from .smb_phone_assignment_deactivation_reason import SmbPhoneAssignmentDeactivationReason
+ from .smb_phone_regulatory_status import SmbPhoneRegulatoryStatus
+ from .smb_procedure import SmbProcedure
+ from .smb_product_scrapable import SmbProductScrapable
+ from .smb_scraping_mode import SmbScrapingMode
+ from .smb_service_db_model import SmbServiceDbModel
+ from .smb_service_kind import SmbServiceKind
+ from .smb_service_promotion import SmbServicePromotion
+ from .smb_service_scrapable import SmbServiceScrapable
+ from .smb_service_variant import SmbServiceVariant
+ from .smb_sip_media_encryption import SmbSipMediaEncryption
+ from .smb_sip_transport import SmbSipTransport
+ from .smb_staff_resource_db_model import SmbStaffResourceDbModel
+ from .smb_staff_scrapable import SmbStaffScrapable
+ from .smb_tier_economics import SmbTierEconomics
+ from .smb_transfer_rule import SmbTransferRule
+ from .smb_turn_eagerness import SmbTurnEagerness
+ from .smb_update_agent_info_request import SmbUpdateAgentInfoRequest
+ from .smb_update_agent_info_request_currency import SmbUpdateAgentInfoRequestCurrency
+ from .smb_update_agent_rule_request import SmbUpdateAgentRuleRequest
+ from .smb_update_holiday_request_patch import SmbUpdateHolidayRequestPatch
+ from .smb_update_procedure_request import SmbUpdateProcedureRequest
+ from .smb_update_service_request_patch import SmbUpdateServiceRequestPatch
+ from .smb_update_staff_request_patch import SmbUpdateStaffRequestPatch
+ from .smb_update_transfer_rule_request import SmbUpdateTransferRuleRequest
+ from .smb_vertical import SmbVertical
+ from .smb_widget_appearance import SmbWidgetAppearance
+ from .smb_widget_appearance_placement import SmbWidgetAppearancePlacement
+ from .smb_widget_appearance_variant import SmbWidgetAppearanceVariant
from .sms_conversation_info import SmsConversationInfo
from .sms_conversation_info_direction import SmsConversationInfoDirection
+ from .sms_template_style import SmsTemplateStyle
from .soft_timeout_config import SoftTimeoutConfig
from .soft_timeout_config_override import SoftTimeoutConfigOverride
from .soft_timeout_config_override_config import SoftTimeoutConfigOverrideConfig
@@ -2030,6 +2130,7 @@
)
from .streaming_audio_chunk_with_timestamps_response import StreamingAudioChunkWithTimestampsResponse
from .string_schema import StringSchema
+ from .stripped_str import StrippedStr
from .studio_agent_settings_model import StudioAgentSettingsModel
from .studio_agent_tool_settings_model import StudioAgentToolSettingsModel
from .studio_clip_locator import StudioClipLocator
@@ -2048,6 +2149,7 @@
from .subscription_usage_response_model import SubscriptionUsageResponseModel
from .subtitle_order_item_request import SubtitleOrderItemRequest
from .suggested_audio_tag import SuggestedAudioTag
+ from .supported_lang import SupportedLang
from .supported_voice import SupportedVoice
from .system_data_collection_id import SystemDataCollectionId
from .system_evaluation_criteria import SystemEvaluationCriteria
@@ -2082,6 +2184,10 @@
SystemToolConfigOutputParams_TransferToNumber,
SystemToolConfigOutputParams_VoicemailDetection,
)
+ from .team_invite_outcome import TeamInviteOutcome
+ from .team_invite_request import TeamInviteRequest
+ from .team_invite_request_role import TeamInviteRequestRole
+ from .team_invite_result import TeamInviteResult
from .telephony_call_config_input import TelephonyCallConfigInput
from .telephony_call_config_output import TelephonyCallConfigOutput
from .telephony_direction import TelephonyDirection
@@ -2180,7 +2286,9 @@
from .ticket_search_match_field import TicketSearchMatchField
from .ticket_search_match_response_model import TicketSearchMatchResponseModel
from .ticket_status_change_response_model import TicketStatusChangeResponseModel
+ from .time_off_type import TimeOffType
from .time_range import TimeRange
+ from .time_range_model import TimeRangeModel
from .to_dialogue_settings_response_model import ToDialogueSettingsResponseModel
from .token_response_model import TokenResponseModel
from .tool import Tool
@@ -2319,6 +2427,10 @@
from .twilio_outbound_call_response import TwilioOutboundCallResponse
from .twilio_region_id import TwilioRegionId
from .txt_export_options import TxtExportOptions
+ from .unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6 import (
+ UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6,
+ )
+ from .unit_test_guardrail_trigger_evaluation_model import UnitTestGuardrailTriggerEvaluationModel
from .unit_test_run_response_model import UnitTestRunResponseModel
from .unit_test_run_response_model_test_info import (
UnitTestRunResponseModelTestInfo,
@@ -2338,6 +2450,7 @@
UnitTestToolCallParameterEval_Regex,
)
from .unit_test_workflow_node_transition_evaluation_node_id import UnitTestWorkflowNodeTransitionEvaluationNodeId
+ from .unix_timestamp import UnixTimestamp
from .update_agent_config_params import UpdateAgentConfigParams
from .update_agent_procedure_params import UpdateAgentProcedureParams
from .update_agent_rule_params import UpdateAgentRuleParams
@@ -2463,6 +2576,7 @@
from .webhook_auth_method_type import WebhookAuthMethodType
from .webhook_event_type import WebhookEventType
from .webhook_hmac_settings import WebhookHmacSettings
+ from .webhook_http_method import WebhookHttpMethod
from .webhook_target import WebhookTarget, WebhookTarget_All, WebhookTarget_Ids
from .webhook_target_all import WebhookTargetAll
from .webhook_target_ids import WebhookTargetIds
@@ -2492,6 +2606,7 @@
from .whats_app_call_permission_request_state import WhatsAppCallPermissionRequestState
from .whats_app_conversation_info import WhatsAppConversationInfo
from .whats_app_conversation_info_direction import WhatsAppConversationInfoDirection
+ from .whats_app_opening_message import WhatsAppOpeningMessage
from .whats_app_outbound_call_response import WhatsAppOutboundCallResponse
from .whats_app_outbound_message_response import WhatsAppOutboundMessageResponse
from .whats_app_recipient import WhatsAppRecipient
@@ -2674,6 +2789,7 @@
from .workflow_unconditional_model_output import WorkflowUnconditionalModelOutput
from .workflow_update_state_node_model_input import WorkflowUpdateStateNodeModelInput
from .workflow_update_state_node_model_output import WorkflowUpdateStateNodeModelOutput
+ from .working_hours import WorkingHours
from .workspace_analytics_query_response_model import WorkspaceAnalyticsQueryResponseModel
from .workspace_analytics_query_response_model_column_types_item import (
WorkspaceAnalyticsQueryResponseModelColumnTypesItem,
@@ -2703,6 +2819,7 @@
from .workspace_group_response_model_group_pvc_limit import WorkspaceGroupResponseModelGroupPvcLimit
from .workspace_group_response_model_group_usage_limit import WorkspaceGroupResponseModelGroupUsageLimit
from .workspace_member_response_model import WorkspaceMemberResponseModel
+ from .workspace_now import WorkspaceNow
from .workspace_resource_type import WorkspaceResourceType
from .workspace_service_account_list_response_model import WorkspaceServiceAccountListResponseModel
from .workspace_service_account_response_model import WorkspaceServiceAccountResponseModel
@@ -2720,6 +2837,7 @@
"AddPronunciationDictionaryResponseModel": ".add_pronunciation_dictionary_response_model",
"AddPronunciationDictionaryResponseModelPermissionOnResource": ".add_pronunciation_dictionary_response_model_permission_on_resource",
"AddSharingVoiceRequest": ".add_sharing_voice_request",
+ "AddUrlRequest": ".add_url_request",
"AddVoiceIvcResponseModel": ".add_voice_ivc_response_model",
"AddVoiceResponseModel": ".add_voice_response_model",
"AddVoiceToUserVoiceCollectionResponseModel": ".add_voice_to_user_voice_collection_response_model",
@@ -2783,6 +2901,7 @@
"AgentPlatformSettingsResponseModel": ".agent_platform_settings_response_model",
"AgentQueueingConfig": ".agent_queueing_config",
"AgentResponsePayload": ".agent_response_payload",
+ "AgentRule": ".agent_rule",
"AgentSimulatedChatTestResponseModel": ".agent_simulated_chat_test_response_model",
"AgentSmbMetadata": ".agent_smb_metadata",
"AgentSortBy": ".agent_sort_by",
@@ -2874,6 +2993,8 @@
"ApiIntegrationWebhookOverridesSchemaOverridesValue_Omit": ".api_integration_webhook_overrides_schema_overrides_value",
"ApiIntegrationWebhookToolConfigInput": ".api_integration_webhook_tool_config_input",
"ApiIntegrationWebhookToolConfigOutput": ".api_integration_webhook_tool_config_output",
+ "ApplicationNumberType": ".application_number_type",
+ "AppointmentReminderMode": ".appointment_reminder_mode",
"ArchitectDispatchResponseModel": ".architect_dispatch_response_model",
"ArrayJsonSchemaPropertyInput": ".array_json_schema_property_input",
"ArrayJsonSchemaPropertyInputItems": ".array_json_schema_property_input_items",
@@ -2893,6 +3014,8 @@
"AssetTranscription": ".asset_transcription",
"AssetTranscriptionData": ".asset_transcription_data",
"AssetTranscriptionStatus": ".asset_transcription_status",
+ "AssignResellerTierRequest": ".assign_reseller_tier_request",
+ "AssignResellerTierRequestBillingPeriod": ".assign_reseller_tier_request_billing_period",
"AssignableUserResponseModel": ".assignable_user_response_model",
"AstAdditionOperatorNodeInput": ".ast_addition_operator_node_input",
"AstAdditionOperatorNodeOutput": ".ast_addition_operator_node_output",
@@ -3072,6 +3195,8 @@
"BytedanceSeedream5ProRequest": ".bytedance_seedream_5_pro_request",
"BytedanceSeedream5ProRequestAspectRatio": ".bytedance_seedream_5_pro_request_aspect_ratio",
"BytedanceSeedream5ProRequestResolution": ".bytedance_seedream_5_pro_request_resolution",
+ "CalComConnectionHealthStatus": ".cal_com_connection_health_status",
+ "CalendlyConnectionHealthStatus": ".calendly_connection_health_status",
"CallResult": ".call_result",
"CampaignConversationType": ".campaign_conversation_type",
"CancelCalendarEventParams": ".cancel_calendar_event_params",
@@ -3346,6 +3471,7 @@
"ConversationalConfigApiModelWorkflowOverrideOutput": ".conversational_config_api_model_workflow_override_output",
"ConvertChapterResponseModel": ".convert_chapter_response_model",
"ConvertProjectResponseModel": ".convert_project_response_model",
+ "CountryCode": ".country_code",
"CrawlStatus": ".crawl_status",
"CrawlType": ".crawl_type",
"CreateAgentBranchResponseModel": ".create_agent_branch_response_model",
@@ -3420,10 +3546,15 @@
"CustomLlmapiType": ".custom_llmapi_type",
"CustomSipHeader": ".custom_sip_header",
"CustomSipHeaderWithDynamicVariable": ".custom_sip_header_with_dynamic_variable",
+ "CustomerFacingConfigInput": ".customer_facing_config_input",
+ "CustomerFacingConfigOutput": ".customer_facing_config_output",
+ "CustomerFacingConfigPatch": ".customer_facing_config_patch",
"DashboardCallSuccessChartModel": ".dashboard_call_success_chart_model",
"DashboardCriteriaChartModel": ".dashboard_criteria_chart_model",
"DashboardDataCollectionChartModel": ".dashboard_data_collection_chart_model",
"DataCollectionResultCommonModel": ".data_collection_result_common_model",
+ "DateModel": ".date_model",
+ "DayOfWeek": ".day_of_week",
"DefaultSharingGroupConfig": ".default_sharing_group_config",
"DefaultSharingGroupConfigPermissionLevel": ".default_sharing_group_config_permission_level",
"DefaultSharingGroupResponseModel": ".default_sharing_group_response_model",
@@ -3487,17 +3618,9 @@
"DtmfInputConfig": ".dtmf_input_config",
"DubOrderItemRequest": ".dub_order_item_request",
"DubbedSegment": ".dubbed_segment",
- "DubbingAudio": ".dubbing_audio",
- "DubbingAudioOutputError": ".dubbing_audio_output_error",
- "DubbingAuthError": ".dubbing_auth_error",
"DubbingBulkSourceSegmentUpdateResponse": ".dubbing_bulk_source_segment_update_response",
"DubbingBulkTargetSegmentUpdateResponse": ".dubbing_bulk_target_segment_update_response",
- "DubbingCommittedTranscript": ".dubbing_committed_transcript",
- "DubbingEndOfStream": ".dubbing_end_of_stream",
"DubbingError": ".dubbing_error",
- "DubbingInputAudioChunk": ".dubbing_input_audio_chunk",
- "DubbingInputError": ".dubbing_input_error",
- "DubbingInvalidRequestError": ".dubbing_invalid_request_error",
"DubbingLanguageListResponse": ".dubbing_language_list_response",
"DubbingLanguageOutputs": ".dubbing_language_outputs",
"DubbingLanguageResponse": ".dubbing_language_response",
@@ -3506,28 +3629,21 @@
"DubbingMediaReference": ".dubbing_media_reference",
"DubbingMetadataPageResponseModel": ".dubbing_metadata_page_response_model",
"DubbingMetadataResponse": ".dubbing_metadata_response",
- "DubbingPartialTranscript": ".dubbing_partial_transcript",
"DubbingProjectListResponse": ".dubbing_project_list_response",
"DubbingProjectResponse": ".dubbing_project_response",
"DubbingProjectResponseStatus": ".dubbing_project_response_status",
- "DubbingQueueOverflowError": ".dubbing_queue_overflow_error",
- "DubbingRateLimitedError": ".dubbing_rate_limited_error",
"DubbingRegenerateResponse": ".dubbing_regenerate_response",
"DubbingReleaseChannel": ".dubbing_release_channel",
"DubbingRenderResponseModel": ".dubbing_render_response_model",
"DubbingResource": ".dubbing_resource",
"DubbingSegmentUpdateRequest": ".dubbing_segment_update_request",
- "DubbingSessionStarted": ".dubbing_session_started",
"DubbingSourceMediaInfo": ".dubbing_source_media_info",
"DubbingSourceSegmentUpdateResponse": ".dubbing_source_segment_update_response",
"DubbingSourceTranscriptResponse": ".dubbing_source_transcript_response",
- "DubbingStatus": ".dubbing_status",
- "DubbingStatusStatus": ".dubbing_status_status",
"DubbingTargetSegmentUpdateRequest": ".dubbing_target_segment_update_request",
"DubbingTargetSegmentUpdateResponse": ".dubbing_target_segment_update_response",
"DubbingTargetTranscriptResponse": ".dubbing_target_transcript_response",
"DubbingTargetTranscriptSegment": ".dubbing_target_transcript_segment",
- "DubbingTranscriberError": ".dubbing_transcriber_error",
"DubbingTranscript": ".dubbing_transcript",
"DubbingTranscriptCharacter": ".dubbing_transcript_character",
"DubbingTranscriptResponseModel": ".dubbing_transcript_response_model",
@@ -3537,8 +3653,6 @@
"DubbingTranscriptWord": ".dubbing_transcript_word",
"DubbingTranscriptsResponseModel": ".dubbing_transcripts_response_model",
"DubbingTranscriptsResponseModelTranscriptFormat": ".dubbing_transcripts_response_model_transcript_format",
- "DubbingTranslation": ".dubbing_translation",
- "DubbingTranslationError": ".dubbing_translation_error",
"DummyToolResultModel": ".dummy_tool_result_model",
"DuplicateSpeechEngineRequest": ".duplicate_speech_engine_request",
"DynamicVariableAssignment": ".dynamic_variable_assignment",
@@ -3566,6 +3680,7 @@
"ElevenV3Request": ".eleven_v_3_request",
"ElevenV3RequestOutputFormat": ".eleven_v_3_request_output_format",
"ElevenV3VoiceSettings": ".eleven_v_3_voice_settings",
+ "EmailOptional": ".email_optional",
"EmbedVariant": ".embed_variant",
"EmbeddingModelEnum": ".embedding_model_enum",
"EndCallToolConfig": ".end_call_tool_config",
@@ -3812,6 +3927,8 @@
"HistoryAlignmentResponseModel": ".history_alignment_response_model",
"HistoryAlignmentsResponseModel": ".history_alignments_response_model",
"HistoryItemResponse": ".history_item_response",
+ "HolidayResponseModel": ".holiday_response_model",
+ "HolidayType": ".holiday_type",
"HtmlExportOptions": ".html_export_options",
"HttpRequestModel": ".http_request_model",
"HttpValidationError": ".http_validation_error",
@@ -3840,6 +3957,7 @@
"ImageSchema": ".image_schema",
"ImageSubject": ".image_subject",
"InboundSipTrunkConfigRequestModel": ".inbound_sip_trunk_config_request_model",
+ "IngestFailure": ".ingest_failure",
"InitPayload": ".init_payload",
"InitialiseContext": ".initialise_context",
"InitializeConnection": ".initialize_connection",
@@ -3853,10 +3971,12 @@
"InlineVideoReference": ".inline_video_reference",
"InlineVideoReferenceMimeType": ".inline_video_reference_mime_type",
"InputAudioChunkPayload": ".input_audio_chunk_payload",
+ "IntakeQuestionKind": ".intake_question_kind",
"IntegerSchema": ".integer_schema",
"IntegrationType": ".integration_type",
"InteractionBudget": ".interaction_budget",
"InternalAlertingWebhookNotifier": ".internal_alerting_webhook_notifier",
+ "InternalKbCrawlPageTiming": ".internal_kb_crawl_page_timing",
"InternalSamplingConfigResponseModel": ".internal_sampling_config_response_model",
"InvoiceResponse": ".invoice_response",
"InvoiceResponsePaymentIntentStatus": ".invoice_response_payment_intent_status",
@@ -3897,6 +4017,8 @@
"KnowledgeBaseToolInfo": ".knowledge_base_tool_info",
"KnowledgeBaseToolResultModel": ".knowledge_base_tool_result_model",
"KnowledgeBaseToolStatus": ".knowledge_base_tool_status",
+ "KnowledgeSourceStatus": ".knowledge_source_status",
+ "KnowledgeSourceType": ".knowledge_source_type",
"LanguageAddedResponse": ".language_added_response",
"LanguageDetectionToolConfig": ".language_detection_tool_config",
"LanguageDetectionToolResultModel": ".language_detection_tool_result_model",
@@ -3910,6 +4032,13 @@
"LanguagesResponse_Pair": ".languages_response",
"LanguagesResponse_Single": ".languages_response",
"LeaveMessageParams": ".leave_message_params",
+ "LenientCountry": ".lenient_country",
+ "LenientCurrency": ".lenient_currency",
+ "LenientOptionalBool": ".lenient_optional_bool",
+ "LenientOptionalStr": ".lenient_optional_str",
+ "LenientPhone": ".lenient_phone",
+ "LenientState": ".lenient_state",
+ "LenientVertical": ".lenient_vertical",
"LibraryVoiceResponse": ".library_voice_response",
"LibraryVoiceResponseCategory": ".library_voice_response_category",
"ListAgentProceduresParams": ".list_agent_procedures_params",
@@ -3975,6 +4104,7 @@
"LlmUsageOutput": ".llm_usage_output",
"LoadMemoryEntryToolErrorStatus": ".load_memory_entry_tool_error_status",
"LoadableMemoryEntry": ".loadable_memory_entry",
+ "LocationResponse": ".location_response",
"LockReason": ".lock_reason",
"ManualSource": ".manual_source",
"ManualVerificationFileResponse": ".manual_verification_file_response",
@@ -4019,6 +4149,7 @@
"McpToolConfigOverrideOutputInputOverridesValue_Llm": ".mcp_tool_config_override_output_input_overrides_value",
"McpToolConfigOverrideOutputInputOverridesValue_Omit": ".mcp_tool_config_override_output_input_overrides_value",
"McpToolConfigOverrideOutputToolCallSound": ".mcp_tool_config_override_output_tool_call_sound",
+ "McpTransport": ".mcp_transport",
"MediaCodec": ".media_codec",
"MediaGenerationCompletedResponse": ".media_generation_completed_response",
"MediaGenerationCreateResponse": ".media_generation_create_response",
@@ -4179,8 +4310,11 @@
"PendingSubscriptionSwitchResponseModel": ".pending_subscription_switch_response_model",
"PendingSubscriptionSwitchResponseModelNextTier": ".pending_subscription_switch_response_model_next_tier",
"PermissionType": ".permission_type",
+ "PhoneNumber": ".phone_number",
"PhoneNumberAgentInfo": ".phone_number_agent_info",
"PhoneNumberDynamicVariableTransferDestination": ".phone_number_dynamic_variable_transfer_destination",
+ "PhoneNumberNullable": ".phone_number_nullable",
+ "PhoneNumberOptional": ".phone_number_optional",
"PhoneNumberSortBy": ".phone_number_sort_by",
"PhoneNumberTransfer": ".phone_number_transfer",
"PhoneNumberTransferCustomSipHeadersItem": ".phone_number_transfer_custom_sip_headers_item",
@@ -4221,6 +4355,7 @@
"PreToolSpeechMode": ".pre_tool_speech_mode",
"PreviewAudioDbModel": ".preview_audio_db_model",
"Price": ".price",
+ "PricingMode": ".pricing_mode",
"PrivacyConfigInput": ".privacy_config_input",
"PrivacyConfigOutput": ".privacy_config_output",
"PrivateKeyJwtResponse": ".private_key_jwt_response",
@@ -4233,6 +4368,7 @@
"ProcedureType": ".procedure_type",
"ProcedureValidationError": ".procedure_validation_error",
"ProcedureVersionRef": ".procedure_version_ref",
+ "ProcessingProgress": ".processing_progress",
"ProjectCreationMetaResponseModel": ".project_creation_meta_response_model",
"ProjectCreationMetaResponseModelStatus": ".project_creation_meta_response_model_status",
"ProjectCreationMetaType": ".project_creation_meta_type",
@@ -4267,6 +4403,7 @@
"ProjectVideoResponseModel": ".project_video_response_model",
"ProjectVideoThumbnailSheetResponseModel": ".project_video_thumbnail_sheet_response_model",
"ProjectVoiceResponseModel": ".project_voice_response_model",
+ "PromotionTarget": ".promotion_target",
"PromptAgent": ".prompt_agent",
"PromptAgentApiModelInput": ".prompt_agent_api_model_input",
"PromptAgentApiModelInputBackupLlmConfig": ".prompt_agent_api_model_input_backup_llm_config",
@@ -4326,6 +4463,9 @@
"PronunciationDictionaryVersionLocator": ".pronunciation_dictionary_version_locator",
"PronunciationDictionaryVersionResponseModel": ".pronunciation_dictionary_version_response_model",
"PronunciationDictionaryVersionResponseModelPermissionOnResource": ".pronunciation_dictionary_version_response_model_permission_on_resource",
+ "ProvisionResellerWorkspaceResponse": ".provision_reseller_workspace_response",
+ "ProvisionResellerWorkspaceSubscription": ".provision_reseller_workspace_subscription",
+ "ProvisionResellerWorkspaceSubscriptionBillingPeriod": ".provision_reseller_workspace_subscription_billing_period",
"PydanticPronunciationDictionaryVersionLocator": ".pydantic_pronunciation_dictionary_version_locator",
"QualityPresetType": ".quality_preset_type",
"QueryParamsJsonSchemaInput": ".query_params_json_schema_input",
@@ -4344,6 +4484,9 @@
"RagIndexOverviewResponseModel": ".rag_index_overview_response_model",
"RagIndexStatus": ".rag_index_status",
"RagRetrievalInfo": ".rag_retrieval_info",
+ "RawBusinessInfo": ".raw_business_info",
+ "RawItem": ".raw_item",
+ "RawLocationInfo": ".raw_location_info",
"ReadLegalTerms": ".read_legal_terms",
"ReadMetadataChapterDbModel": ".read_metadata_chapter_db_model",
"ReaderResourceResponseModel": ".reader_resource_response_model",
@@ -4371,6 +4514,19 @@
"RequestPvcManualVerificationResponseModel": ".request_pvc_manual_verification_response_model",
"RequiredConstraint": ".required_constraint",
"RequiredConstraints": ".required_constraints",
+ "ResellerInvoiceDetail": ".reseller_invoice_detail",
+ "ResellerInvoiceLine": ".reseller_invoice_line",
+ "ResellerInvoiceLineKind": ".reseller_invoice_line_kind",
+ "ResellerInvoiceStatus": ".reseller_invoice_status",
+ "ResellerInvoiceSummary": ".reseller_invoice_summary",
+ "ResellerInvoicesResponse": ".reseller_invoices_response",
+ "ResellerTierResponse": ".reseller_tier_response",
+ "ResellerUpcomingPayment": ".reseller_upcoming_payment",
+ "ResellerUpcomingPaymentsResponse": ".reseller_upcoming_payments_response",
+ "ResellerWorkspaceSubscription": ".reseller_workspace_subscription",
+ "ResellerWorkspaceSubscriptionBillingPeriod": ".reseller_workspace_subscription_billing_period",
+ "ResellerWorkspaceSummary": ".reseller_workspace_summary",
+ "ResellerWorkspacesResponse": ".reseller_workspaces_response",
"ResourceAccessInfo": ".resource_access_info",
"ResourceAccessInfoAccessSource": ".resource_access_info_access_source",
"ResourceAccessInfoAnonymousAccessLevelOverride": ".resource_access_info_anonymous_access_level_override",
@@ -4387,6 +4543,7 @@
"ReviewResponseModelRejectReasonsItem": ".review_response_model_reject_reasons_item",
"ReviewResponseModelReviewStatus": ".review_response_model_review_status",
"ReviewStatus": ".review_status",
+ "RulePriority": ".rule_priority",
"SafetyCommonModelInput": ".safety_common_model_input",
"SafetyCommonModelOutput": ".safety_common_model_output",
"SafetyEvaluation": ".safety_evaluation",
@@ -4438,6 +4595,8 @@
"SendTextMulti": ".send_text_multi",
"SentimentAggregate": ".sentiment_aggregate",
"SentimentAnalysisSettings": ".sentiment_analysis_settings",
+ "ServiceLocationType": ".service_location_type",
+ "ServiceUpdateResponse": ".service_update_response",
"SessionStartedPayload": ".session_started_payload",
"SessionStartedPayloadConfig": ".session_started_payload_config",
"SessionStartedPayloadConfigCommitStrategy": ".session_started_payload_config_commit_strategy",
@@ -4467,10 +4626,66 @@
"SkipTurnToolConfig": ".skip_turn_tool_config",
"SkipTurnToolResponseModel": ".skip_turn_tool_response_model",
"SlackBotAuthResponse": ".slack_bot_auth_response",
+ "SmbAddOn": ".smb_add_on",
+ "SmbAgentInfoResponse": ".smb_agent_info_response",
+ "SmbAgentInfoResponseCurrency": ".smb_agent_info_response_currency",
+ "SmbAgentTarget": ".smb_agent_target",
"SmbAgentType": ".smb_agent_type",
+ "SmbAssetScrapable": ".smb_asset_scrapable",
"SmbClientAccessConfig": ".smb_client_access_config",
+ "SmbCreateAgentRuleRequest": ".smb_create_agent_rule_request",
+ "SmbCreateHolidayRequest": ".smb_create_holiday_request",
+ "SmbCreateProcedureRequest": ".smb_create_procedure_request",
+ "SmbCreateServiceRequest": ".smb_create_service_request",
+ "SmbCreateStaffRequest": ".smb_create_staff_request",
+ "SmbCreateTransferRuleRequest": ".smb_create_transfer_rule_request",
+ "SmbCustomerFacingAgent": ".smb_customer_facing_agent",
+ "SmbCustomerFacingAgentDeactivationReason": ".smb_customer_facing_agent_deactivation_reason",
+ "SmbCustomerFacingAgentResponse": ".smb_customer_facing_agent_response",
+ "SmbGroupMembership": ".smb_group_membership",
+ "SmbIdentityVerificationConfig": ".smb_identity_verification_config",
+ "SmbIntakeQuestion": ".smb_intake_question",
+ "SmbKnowledgeSourceDbModel": ".smb_knowledge_source_db_model",
+ "SmbLocationDeactivationReason": ".smb_location_deactivation_reason",
+ "SmbLocationInput": ".smb_location_input",
+ "SmbLocationOutput": ".smb_location_output",
+ "SmbLocationRequest": ".smb_location_request",
+ "SmbLocationRequestPatch": ".smb_location_request_patch",
+ "SmbNotificationChannel": ".smb_notification_channel",
+ "SmbPhoneAssignmentDbModel": ".smb_phone_assignment_db_model",
+ "SmbPhoneAssignmentDbModelProvider": ".smb_phone_assignment_db_model_provider",
+ "SmbPhoneAssignmentDeactivationReason": ".smb_phone_assignment_deactivation_reason",
+ "SmbPhoneRegulatoryStatus": ".smb_phone_regulatory_status",
+ "SmbProcedure": ".smb_procedure",
+ "SmbProductScrapable": ".smb_product_scrapable",
+ "SmbScrapingMode": ".smb_scraping_mode",
+ "SmbServiceDbModel": ".smb_service_db_model",
+ "SmbServiceKind": ".smb_service_kind",
+ "SmbServicePromotion": ".smb_service_promotion",
+ "SmbServiceScrapable": ".smb_service_scrapable",
+ "SmbServiceVariant": ".smb_service_variant",
+ "SmbSipMediaEncryption": ".smb_sip_media_encryption",
+ "SmbSipTransport": ".smb_sip_transport",
+ "SmbStaffResourceDbModel": ".smb_staff_resource_db_model",
+ "SmbStaffScrapable": ".smb_staff_scrapable",
+ "SmbTierEconomics": ".smb_tier_economics",
+ "SmbTransferRule": ".smb_transfer_rule",
+ "SmbTurnEagerness": ".smb_turn_eagerness",
+ "SmbUpdateAgentInfoRequest": ".smb_update_agent_info_request",
+ "SmbUpdateAgentInfoRequestCurrency": ".smb_update_agent_info_request_currency",
+ "SmbUpdateAgentRuleRequest": ".smb_update_agent_rule_request",
+ "SmbUpdateHolidayRequestPatch": ".smb_update_holiday_request_patch",
+ "SmbUpdateProcedureRequest": ".smb_update_procedure_request",
+ "SmbUpdateServiceRequestPatch": ".smb_update_service_request_patch",
+ "SmbUpdateStaffRequestPatch": ".smb_update_staff_request_patch",
+ "SmbUpdateTransferRuleRequest": ".smb_update_transfer_rule_request",
+ "SmbVertical": ".smb_vertical",
+ "SmbWidgetAppearance": ".smb_widget_appearance",
+ "SmbWidgetAppearancePlacement": ".smb_widget_appearance_placement",
+ "SmbWidgetAppearanceVariant": ".smb_widget_appearance_variant",
"SmsConversationInfo": ".sms_conversation_info",
"SmsConversationInfoDirection": ".sms_conversation_info_direction",
+ "SmsTemplateStyle": ".sms_template_style",
"SoftTimeoutConfig": ".soft_timeout_config",
"SoftTimeoutConfigOverride": ".soft_timeout_config_override",
"SoftTimeoutConfigOverrideConfig": ".soft_timeout_config_override_config",
@@ -4518,6 +4733,7 @@
"StreamingAudioChunkWithTimestampsAndVoiceSegmentsResponseModel": ".streaming_audio_chunk_with_timestamps_and_voice_segments_response_model",
"StreamingAudioChunkWithTimestampsResponse": ".streaming_audio_chunk_with_timestamps_response",
"StringSchema": ".string_schema",
+ "StrippedStr": ".stripped_str",
"StudioAgentSettingsModel": ".studio_agent_settings_model",
"StudioAgentToolSettingsModel": ".studio_agent_tool_settings_model",
"StudioClipLocator": ".studio_clip_locator",
@@ -4536,6 +4752,7 @@
"SubscriptionUsageResponseModel": ".subscription_usage_response_model",
"SubtitleOrderItemRequest": ".subtitle_order_item_request",
"SuggestedAudioTag": ".suggested_audio_tag",
+ "SupportedLang": ".supported_lang",
"SupportedVoice": ".supported_voice",
"SystemDataCollectionId": ".system_data_collection_id",
"SystemEvaluationCriteria": ".system_evaluation_criteria",
@@ -4566,6 +4783,10 @@
"SystemToolConfigOutputParams_TransferToAgent": ".system_tool_config_output_params",
"SystemToolConfigOutputParams_TransferToNumber": ".system_tool_config_output_params",
"SystemToolConfigOutputParams_VoicemailDetection": ".system_tool_config_output_params",
+ "TeamInviteOutcome": ".team_invite_outcome",
+ "TeamInviteRequest": ".team_invite_request",
+ "TeamInviteRequestRole": ".team_invite_request_role",
+ "TeamInviteResult": ".team_invite_result",
"TelephonyCallConfigInput": ".telephony_call_config_input",
"TelephonyCallConfigOutput": ".telephony_call_config_output",
"TelephonyDirection": ".telephony_direction",
@@ -4656,7 +4877,9 @@
"TicketSearchMatchField": ".ticket_search_match_field",
"TicketSearchMatchResponseModel": ".ticket_search_match_response_model",
"TicketStatusChangeResponseModel": ".ticket_status_change_response_model",
+ "TimeOffType": ".time_off_type",
"TimeRange": ".time_range",
+ "TimeRangeModel": ".time_range_model",
"ToDialogueSettingsResponseModel": ".to_dialogue_settings_response_model",
"TokenResponseModel": ".token_response_model",
"Tool": ".tool",
@@ -4785,6 +5008,8 @@
"TwilioOutboundCallResponse": ".twilio_outbound_call_response",
"TwilioRegionId": ".twilio_region_id",
"TxtExportOptions": ".txt_export_options",
+ "UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6": ".unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6",
+ "UnitTestGuardrailTriggerEvaluationModel": ".unit_test_guardrail_trigger_evaluation_model",
"UnitTestRunResponseModel": ".unit_test_run_response_model",
"UnitTestRunResponseModelTestInfo": ".unit_test_run_response_model_test_info",
"UnitTestRunResponseModelTestInfo_Llm": ".unit_test_run_response_model_test_info",
@@ -4800,6 +5025,7 @@
"UnitTestToolCallParameterEval_Llm": ".unit_test_tool_call_parameter_eval",
"UnitTestToolCallParameterEval_Regex": ".unit_test_tool_call_parameter_eval",
"UnitTestWorkflowNodeTransitionEvaluationNodeId": ".unit_test_workflow_node_transition_evaluation_node_id",
+ "UnixTimestamp": ".unix_timestamp",
"UpdateAgentConfigParams": ".update_agent_config_params",
"UpdateAgentProcedureParams": ".update_agent_procedure_params",
"UpdateAgentRuleParams": ".update_agent_rule_params",
@@ -4919,6 +5145,7 @@
"WebhookAuthMethodType": ".webhook_auth_method_type",
"WebhookEventType": ".webhook_event_type",
"WebhookHmacSettings": ".webhook_hmac_settings",
+ "WebhookHttpMethod": ".webhook_http_method",
"WebhookTarget": ".webhook_target",
"WebhookTargetAll": ".webhook_target_all",
"WebhookTargetIds": ".webhook_target_ids",
@@ -4946,6 +5173,7 @@
"WhatsAppCallPermissionRequestState": ".whats_app_call_permission_request_state",
"WhatsAppConversationInfo": ".whats_app_conversation_info",
"WhatsAppConversationInfoDirection": ".whats_app_conversation_info_direction",
+ "WhatsAppOpeningMessage": ".whats_app_opening_message",
"WhatsAppOutboundCallResponse": ".whats_app_outbound_call_response",
"WhatsAppOutboundMessageResponse": ".whats_app_outbound_message_response",
"WhatsAppRecipient": ".whats_app_recipient",
@@ -5088,6 +5316,7 @@
"WorkflowUnconditionalModelOutput": ".workflow_unconditional_model_output",
"WorkflowUpdateStateNodeModelInput": ".workflow_update_state_node_model_input",
"WorkflowUpdateStateNodeModelOutput": ".workflow_update_state_node_model_output",
+ "WorkingHours": ".working_hours",
"WorkspaceAnalyticsQueryResponseModel": ".workspace_analytics_query_response_model",
"WorkspaceAnalyticsQueryResponseModelColumnTypesItem": ".workspace_analytics_query_response_model_column_types_item",
"WorkspaceAnalyticsQueryResponseModelRowsItemItem": ".workspace_analytics_query_response_model_rows_item_item",
@@ -5109,6 +5338,7 @@
"WorkspaceGroupResponseModelGroupPvcLimit": ".workspace_group_response_model_group_pvc_limit",
"WorkspaceGroupResponseModelGroupUsageLimit": ".workspace_group_response_model_group_usage_limit",
"WorkspaceMemberResponseModel": ".workspace_member_response_model",
+ "WorkspaceNow": ".workspace_now",
"WorkspaceResourceType": ".workspace_resource_type",
"WorkspaceServiceAccountListResponseModel": ".workspace_service_account_list_response_model",
"WorkspaceServiceAccountResponseModel": ".workspace_service_account_response_model",
@@ -5150,6 +5380,7 @@ def __dir__():
"AddPronunciationDictionaryResponseModel",
"AddPronunciationDictionaryResponseModelPermissionOnResource",
"AddSharingVoiceRequest",
+ "AddUrlRequest",
"AddVoiceIvcResponseModel",
"AddVoiceResponseModel",
"AddVoiceToUserVoiceCollectionResponseModel",
@@ -5213,6 +5444,7 @@ def __dir__():
"AgentPlatformSettingsResponseModel",
"AgentQueueingConfig",
"AgentResponsePayload",
+ "AgentRule",
"AgentSimulatedChatTestResponseModel",
"AgentSmbMetadata",
"AgentSortBy",
@@ -5304,6 +5536,8 @@ def __dir__():
"ApiIntegrationWebhookOverridesSchemaOverridesValue_Omit",
"ApiIntegrationWebhookToolConfigInput",
"ApiIntegrationWebhookToolConfigOutput",
+ "ApplicationNumberType",
+ "AppointmentReminderMode",
"ArchitectDispatchResponseModel",
"ArrayJsonSchemaPropertyInput",
"ArrayJsonSchemaPropertyInputItems",
@@ -5323,6 +5557,8 @@ def __dir__():
"AssetTranscription",
"AssetTranscriptionData",
"AssetTranscriptionStatus",
+ "AssignResellerTierRequest",
+ "AssignResellerTierRequestBillingPeriod",
"AssignableUserResponseModel",
"AstAdditionOperatorNodeInput",
"AstAdditionOperatorNodeOutput",
@@ -5502,6 +5738,8 @@ def __dir__():
"BytedanceSeedream5ProRequest",
"BytedanceSeedream5ProRequestAspectRatio",
"BytedanceSeedream5ProRequestResolution",
+ "CalComConnectionHealthStatus",
+ "CalendlyConnectionHealthStatus",
"CallResult",
"CampaignConversationType",
"CancelCalendarEventParams",
@@ -5776,6 +6014,7 @@ def __dir__():
"ConversationalConfigApiModelWorkflowOverrideOutput",
"ConvertChapterResponseModel",
"ConvertProjectResponseModel",
+ "CountryCode",
"CrawlStatus",
"CrawlType",
"CreateAgentBranchResponseModel",
@@ -5850,10 +6089,15 @@ def __dir__():
"CustomLlmapiType",
"CustomSipHeader",
"CustomSipHeaderWithDynamicVariable",
+ "CustomerFacingConfigInput",
+ "CustomerFacingConfigOutput",
+ "CustomerFacingConfigPatch",
"DashboardCallSuccessChartModel",
"DashboardCriteriaChartModel",
"DashboardDataCollectionChartModel",
"DataCollectionResultCommonModel",
+ "DateModel",
+ "DayOfWeek",
"DefaultSharingGroupConfig",
"DefaultSharingGroupConfigPermissionLevel",
"DefaultSharingGroupResponseModel",
@@ -5917,17 +6161,9 @@ def __dir__():
"DtmfInputConfig",
"DubOrderItemRequest",
"DubbedSegment",
- "DubbingAudio",
- "DubbingAudioOutputError",
- "DubbingAuthError",
"DubbingBulkSourceSegmentUpdateResponse",
"DubbingBulkTargetSegmentUpdateResponse",
- "DubbingCommittedTranscript",
- "DubbingEndOfStream",
"DubbingError",
- "DubbingInputAudioChunk",
- "DubbingInputError",
- "DubbingInvalidRequestError",
"DubbingLanguageListResponse",
"DubbingLanguageOutputs",
"DubbingLanguageResponse",
@@ -5936,28 +6172,21 @@ def __dir__():
"DubbingMediaReference",
"DubbingMetadataPageResponseModel",
"DubbingMetadataResponse",
- "DubbingPartialTranscript",
"DubbingProjectListResponse",
"DubbingProjectResponse",
"DubbingProjectResponseStatus",
- "DubbingQueueOverflowError",
- "DubbingRateLimitedError",
"DubbingRegenerateResponse",
"DubbingReleaseChannel",
"DubbingRenderResponseModel",
"DubbingResource",
"DubbingSegmentUpdateRequest",
- "DubbingSessionStarted",
"DubbingSourceMediaInfo",
"DubbingSourceSegmentUpdateResponse",
"DubbingSourceTranscriptResponse",
- "DubbingStatus",
- "DubbingStatusStatus",
"DubbingTargetSegmentUpdateRequest",
"DubbingTargetSegmentUpdateResponse",
"DubbingTargetTranscriptResponse",
"DubbingTargetTranscriptSegment",
- "DubbingTranscriberError",
"DubbingTranscript",
"DubbingTranscriptCharacter",
"DubbingTranscriptResponseModel",
@@ -5967,8 +6196,6 @@ def __dir__():
"DubbingTranscriptWord",
"DubbingTranscriptsResponseModel",
"DubbingTranscriptsResponseModelTranscriptFormat",
- "DubbingTranslation",
- "DubbingTranslationError",
"DummyToolResultModel",
"DuplicateSpeechEngineRequest",
"DynamicVariableAssignment",
@@ -5996,6 +6223,7 @@ def __dir__():
"ElevenV3Request",
"ElevenV3RequestOutputFormat",
"ElevenV3VoiceSettings",
+ "EmailOptional",
"EmbedVariant",
"EmbeddingModelEnum",
"EndCallToolConfig",
@@ -6242,6 +6470,8 @@ def __dir__():
"HistoryAlignmentResponseModel",
"HistoryAlignmentsResponseModel",
"HistoryItemResponse",
+ "HolidayResponseModel",
+ "HolidayType",
"HtmlExportOptions",
"HttpRequestModel",
"HttpValidationError",
@@ -6270,6 +6500,7 @@ def __dir__():
"ImageSchema",
"ImageSubject",
"InboundSipTrunkConfigRequestModel",
+ "IngestFailure",
"InitPayload",
"InitialiseContext",
"InitializeConnection",
@@ -6283,10 +6514,12 @@ def __dir__():
"InlineVideoReference",
"InlineVideoReferenceMimeType",
"InputAudioChunkPayload",
+ "IntakeQuestionKind",
"IntegerSchema",
"IntegrationType",
"InteractionBudget",
"InternalAlertingWebhookNotifier",
+ "InternalKbCrawlPageTiming",
"InternalSamplingConfigResponseModel",
"InvoiceResponse",
"InvoiceResponsePaymentIntentStatus",
@@ -6327,6 +6560,8 @@ def __dir__():
"KnowledgeBaseToolInfo",
"KnowledgeBaseToolResultModel",
"KnowledgeBaseToolStatus",
+ "KnowledgeSourceStatus",
+ "KnowledgeSourceType",
"LanguageAddedResponse",
"LanguageDetectionToolConfig",
"LanguageDetectionToolResultModel",
@@ -6340,6 +6575,13 @@ def __dir__():
"LanguagesResponse_Pair",
"LanguagesResponse_Single",
"LeaveMessageParams",
+ "LenientCountry",
+ "LenientCurrency",
+ "LenientOptionalBool",
+ "LenientOptionalStr",
+ "LenientPhone",
+ "LenientState",
+ "LenientVertical",
"LibraryVoiceResponse",
"LibraryVoiceResponseCategory",
"ListAgentProceduresParams",
@@ -6405,6 +6647,7 @@ def __dir__():
"LlmUsageOutput",
"LoadMemoryEntryToolErrorStatus",
"LoadableMemoryEntry",
+ "LocationResponse",
"LockReason",
"ManualSource",
"ManualVerificationFileResponse",
@@ -6449,6 +6692,7 @@ def __dir__():
"McpToolConfigOverrideOutputInputOverridesValue_Llm",
"McpToolConfigOverrideOutputInputOverridesValue_Omit",
"McpToolConfigOverrideOutputToolCallSound",
+ "McpTransport",
"MediaCodec",
"MediaGenerationCompletedResponse",
"MediaGenerationCreateResponse",
@@ -6609,8 +6853,11 @@ def __dir__():
"PendingSubscriptionSwitchResponseModel",
"PendingSubscriptionSwitchResponseModelNextTier",
"PermissionType",
+ "PhoneNumber",
"PhoneNumberAgentInfo",
"PhoneNumberDynamicVariableTransferDestination",
+ "PhoneNumberNullable",
+ "PhoneNumberOptional",
"PhoneNumberSortBy",
"PhoneNumberTransfer",
"PhoneNumberTransferCustomSipHeadersItem",
@@ -6651,6 +6898,7 @@ def __dir__():
"PreToolSpeechMode",
"PreviewAudioDbModel",
"Price",
+ "PricingMode",
"PrivacyConfigInput",
"PrivacyConfigOutput",
"PrivateKeyJwtResponse",
@@ -6663,6 +6911,7 @@ def __dir__():
"ProcedureType",
"ProcedureValidationError",
"ProcedureVersionRef",
+ "ProcessingProgress",
"ProjectCreationMetaResponseModel",
"ProjectCreationMetaResponseModelStatus",
"ProjectCreationMetaType",
@@ -6697,6 +6946,7 @@ def __dir__():
"ProjectVideoResponseModel",
"ProjectVideoThumbnailSheetResponseModel",
"ProjectVoiceResponseModel",
+ "PromotionTarget",
"PromptAgent",
"PromptAgentApiModelInput",
"PromptAgentApiModelInputBackupLlmConfig",
@@ -6756,6 +7006,9 @@ def __dir__():
"PronunciationDictionaryVersionLocator",
"PronunciationDictionaryVersionResponseModel",
"PronunciationDictionaryVersionResponseModelPermissionOnResource",
+ "ProvisionResellerWorkspaceResponse",
+ "ProvisionResellerWorkspaceSubscription",
+ "ProvisionResellerWorkspaceSubscriptionBillingPeriod",
"PydanticPronunciationDictionaryVersionLocator",
"QualityPresetType",
"QueryParamsJsonSchemaInput",
@@ -6774,6 +7027,9 @@ def __dir__():
"RagIndexOverviewResponseModel",
"RagIndexStatus",
"RagRetrievalInfo",
+ "RawBusinessInfo",
+ "RawItem",
+ "RawLocationInfo",
"ReadLegalTerms",
"ReadMetadataChapterDbModel",
"ReaderResourceResponseModel",
@@ -6801,6 +7057,19 @@ def __dir__():
"RequestPvcManualVerificationResponseModel",
"RequiredConstraint",
"RequiredConstraints",
+ "ResellerInvoiceDetail",
+ "ResellerInvoiceLine",
+ "ResellerInvoiceLineKind",
+ "ResellerInvoiceStatus",
+ "ResellerInvoiceSummary",
+ "ResellerInvoicesResponse",
+ "ResellerTierResponse",
+ "ResellerUpcomingPayment",
+ "ResellerUpcomingPaymentsResponse",
+ "ResellerWorkspaceSubscription",
+ "ResellerWorkspaceSubscriptionBillingPeriod",
+ "ResellerWorkspaceSummary",
+ "ResellerWorkspacesResponse",
"ResourceAccessInfo",
"ResourceAccessInfoAccessSource",
"ResourceAccessInfoAnonymousAccessLevelOverride",
@@ -6817,6 +7086,7 @@ def __dir__():
"ReviewResponseModelRejectReasonsItem",
"ReviewResponseModelReviewStatus",
"ReviewStatus",
+ "RulePriority",
"SafetyCommonModelInput",
"SafetyCommonModelOutput",
"SafetyEvaluation",
@@ -6868,6 +7138,8 @@ def __dir__():
"SendTextMulti",
"SentimentAggregate",
"SentimentAnalysisSettings",
+ "ServiceLocationType",
+ "ServiceUpdateResponse",
"SessionStartedPayload",
"SessionStartedPayloadConfig",
"SessionStartedPayloadConfigCommitStrategy",
@@ -6897,10 +7169,66 @@ def __dir__():
"SkipTurnToolConfig",
"SkipTurnToolResponseModel",
"SlackBotAuthResponse",
+ "SmbAddOn",
+ "SmbAgentInfoResponse",
+ "SmbAgentInfoResponseCurrency",
+ "SmbAgentTarget",
"SmbAgentType",
+ "SmbAssetScrapable",
"SmbClientAccessConfig",
+ "SmbCreateAgentRuleRequest",
+ "SmbCreateHolidayRequest",
+ "SmbCreateProcedureRequest",
+ "SmbCreateServiceRequest",
+ "SmbCreateStaffRequest",
+ "SmbCreateTransferRuleRequest",
+ "SmbCustomerFacingAgent",
+ "SmbCustomerFacingAgentDeactivationReason",
+ "SmbCustomerFacingAgentResponse",
+ "SmbGroupMembership",
+ "SmbIdentityVerificationConfig",
+ "SmbIntakeQuestion",
+ "SmbKnowledgeSourceDbModel",
+ "SmbLocationDeactivationReason",
+ "SmbLocationInput",
+ "SmbLocationOutput",
+ "SmbLocationRequest",
+ "SmbLocationRequestPatch",
+ "SmbNotificationChannel",
+ "SmbPhoneAssignmentDbModel",
+ "SmbPhoneAssignmentDbModelProvider",
+ "SmbPhoneAssignmentDeactivationReason",
+ "SmbPhoneRegulatoryStatus",
+ "SmbProcedure",
+ "SmbProductScrapable",
+ "SmbScrapingMode",
+ "SmbServiceDbModel",
+ "SmbServiceKind",
+ "SmbServicePromotion",
+ "SmbServiceScrapable",
+ "SmbServiceVariant",
+ "SmbSipMediaEncryption",
+ "SmbSipTransport",
+ "SmbStaffResourceDbModel",
+ "SmbStaffScrapable",
+ "SmbTierEconomics",
+ "SmbTransferRule",
+ "SmbTurnEagerness",
+ "SmbUpdateAgentInfoRequest",
+ "SmbUpdateAgentInfoRequestCurrency",
+ "SmbUpdateAgentRuleRequest",
+ "SmbUpdateHolidayRequestPatch",
+ "SmbUpdateProcedureRequest",
+ "SmbUpdateServiceRequestPatch",
+ "SmbUpdateStaffRequestPatch",
+ "SmbUpdateTransferRuleRequest",
+ "SmbVertical",
+ "SmbWidgetAppearance",
+ "SmbWidgetAppearancePlacement",
+ "SmbWidgetAppearanceVariant",
"SmsConversationInfo",
"SmsConversationInfoDirection",
+ "SmsTemplateStyle",
"SoftTimeoutConfig",
"SoftTimeoutConfigOverride",
"SoftTimeoutConfigOverrideConfig",
@@ -6948,6 +7276,7 @@ def __dir__():
"StreamingAudioChunkWithTimestampsAndVoiceSegmentsResponseModel",
"StreamingAudioChunkWithTimestampsResponse",
"StringSchema",
+ "StrippedStr",
"StudioAgentSettingsModel",
"StudioAgentToolSettingsModel",
"StudioClipLocator",
@@ -6966,6 +7295,7 @@ def __dir__():
"SubscriptionUsageResponseModel",
"SubtitleOrderItemRequest",
"SuggestedAudioTag",
+ "SupportedLang",
"SupportedVoice",
"SystemDataCollectionId",
"SystemEvaluationCriteria",
@@ -6996,6 +7326,10 @@ def __dir__():
"SystemToolConfigOutputParams_TransferToAgent",
"SystemToolConfigOutputParams_TransferToNumber",
"SystemToolConfigOutputParams_VoicemailDetection",
+ "TeamInviteOutcome",
+ "TeamInviteRequest",
+ "TeamInviteRequestRole",
+ "TeamInviteResult",
"TelephonyCallConfigInput",
"TelephonyCallConfigOutput",
"TelephonyDirection",
@@ -7086,7 +7420,9 @@ def __dir__():
"TicketSearchMatchField",
"TicketSearchMatchResponseModel",
"TicketStatusChangeResponseModel",
+ "TimeOffType",
"TimeRange",
+ "TimeRangeModel",
"ToDialogueSettingsResponseModel",
"TokenResponseModel",
"Tool",
@@ -7215,6 +7551,8 @@ def __dir__():
"TwilioOutboundCallResponse",
"TwilioRegionId",
"TxtExportOptions",
+ "UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6",
+ "UnitTestGuardrailTriggerEvaluationModel",
"UnitTestRunResponseModel",
"UnitTestRunResponseModelTestInfo",
"UnitTestRunResponseModelTestInfo_Llm",
@@ -7230,6 +7568,7 @@ def __dir__():
"UnitTestToolCallParameterEval_Llm",
"UnitTestToolCallParameterEval_Regex",
"UnitTestWorkflowNodeTransitionEvaluationNodeId",
+ "UnixTimestamp",
"UpdateAgentConfigParams",
"UpdateAgentProcedureParams",
"UpdateAgentRuleParams",
@@ -7349,6 +7688,7 @@ def __dir__():
"WebhookAuthMethodType",
"WebhookEventType",
"WebhookHmacSettings",
+ "WebhookHttpMethod",
"WebhookTarget",
"WebhookTargetAll",
"WebhookTargetIds",
@@ -7376,6 +7716,7 @@ def __dir__():
"WhatsAppCallPermissionRequestState",
"WhatsAppConversationInfo",
"WhatsAppConversationInfoDirection",
+ "WhatsAppOpeningMessage",
"WhatsAppOutboundCallResponse",
"WhatsAppOutboundMessageResponse",
"WhatsAppRecipient",
@@ -7518,6 +7859,7 @@ def __dir__():
"WorkflowUnconditionalModelOutput",
"WorkflowUpdateStateNodeModelInput",
"WorkflowUpdateStateNodeModelOutput",
+ "WorkingHours",
"WorkspaceAnalyticsQueryResponseModel",
"WorkspaceAnalyticsQueryResponseModelColumnTypesItem",
"WorkspaceAnalyticsQueryResponseModelRowsItemItem",
@@ -7539,6 +7881,7 @@ def __dir__():
"WorkspaceGroupResponseModelGroupPvcLimit",
"WorkspaceGroupResponseModelGroupUsageLimit",
"WorkspaceMemberResponseModel",
+ "WorkspaceNow",
"WorkspaceResourceType",
"WorkspaceServiceAccountListResponseModel",
"WorkspaceServiceAccountResponseModel",
diff --git a/src/elevenlabs/types/dubbing_audio.py b/src/elevenlabs/types/add_url_request.py
similarity index 75%
rename from src/elevenlabs/types/dubbing_audio.py
rename to src/elevenlabs/types/add_url_request.py
index 210bef352..474fd2113 100644
--- a/src/elevenlabs/types/dubbing_audio.py
+++ b/src/elevenlabs/types/add_url_request.py
@@ -7,10 +7,13 @@
from ..core.unchecked_base_model import UncheckedBaseModel
-class DubbingAudio(UncheckedBaseModel):
- message_type: typing.Literal["audio"] = "audio"
- data: str
- sample_rate: int
+class AddUrlRequest(UncheckedBaseModel):
+ """
+ Request to add a URL for scraping.
+ """
+
+ url: str
+ crawl_entire_site: typing.Optional[bool] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/agent_rule.py b/src/elevenlabs/types/agent_rule.py
new file mode 100644
index 000000000..de05cc59f
--- /dev/null
+++ b/src/elevenlabs/types/agent_rule.py
@@ -0,0 +1,43 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .rule_priority import RulePriority
+from .stripped_str import StrippedStr
+from .unix_timestamp import UnixTimestamp
+
+
+class AgentRule(UncheckedBaseModel):
+ """
+ A single behavioral rule for the agent.
+ """
+
+ title: StrippedStr = pydantic.Field()
+ """
+ Title of the rule.
+ """
+
+ description: StrippedStr = pydantic.Field()
+ """
+ What the agent should do, in detail.
+ """
+
+ priority: typing.Optional[RulePriority] = pydantic.Field(default=None)
+ """
+ strict: the agent must always follow the rule; suggestion: a guideline.
+ """
+
+ id: typing.Optional[str] = None
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/application_number_type.py b/src/elevenlabs/types/application_number_type.py
new file mode 100644
index 000000000..6889a1be2
--- /dev/null
+++ b/src/elevenlabs/types/application_number_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ApplicationNumberType = typing.Union[typing.Literal["local", "mobile"], typing.Any]
diff --git a/src/elevenlabs/types/appointment_reminder_mode.py b/src/elevenlabs/types/appointment_reminder_mode.py
new file mode 100644
index 000000000..62c244734
--- /dev/null
+++ b/src/elevenlabs/types/appointment_reminder_mode.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AppointmentReminderMode = typing.Union[typing.Literal["reminder", "confirmation"], typing.Any]
diff --git a/src/elevenlabs/types/assign_reseller_tier_request.py b/src/elevenlabs/types/assign_reseller_tier_request.py
new file mode 100644
index 000000000..f491a58ad
--- /dev/null
+++ b/src/elevenlabs/types/assign_reseller_tier_request.py
@@ -0,0 +1,30 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .assign_reseller_tier_request_billing_period import AssignResellerTierRequestBillingPeriod
+
+
+class AssignResellerTierRequest(UncheckedBaseModel):
+ """
+ Put a workspace with no subscription onto one of the reseller's tiers.
+ """
+
+ tier_id: str
+ billing_period: typing.Optional[AssignResellerTierRequestBillingPeriod] = None
+ idempotency_key: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Client-generated key so a retried request cannot create or apply the same subscription change twice.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/assign_reseller_tier_request_billing_period.py b/src/elevenlabs/types/assign_reseller_tier_request_billing_period.py
new file mode 100644
index 000000000..fc809c956
--- /dev/null
+++ b/src/elevenlabs/types/assign_reseller_tier_request_billing_period.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AssignResellerTierRequestBillingPeriod = typing.Union[typing.Literal["monthly_period", "annual_period"], typing.Any]
diff --git a/src/elevenlabs/types/cal_com_connection_health_status.py b/src/elevenlabs/types/cal_com_connection_health_status.py
new file mode 100644
index 000000000..88f2e7793
--- /dev/null
+++ b/src/elevenlabs/types/cal_com_connection_health_status.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+CalComConnectionHealthStatus = typing.Union[typing.Literal["healthy", "needs_reauth"], typing.Any]
diff --git a/src/elevenlabs/types/calendly_connection_health_status.py b/src/elevenlabs/types/calendly_connection_health_status.py
new file mode 100644
index 000000000..f67dd3247
--- /dev/null
+++ b/src/elevenlabs/types/calendly_connection_health_status.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+CalendlyConnectionHealthStatus = typing.Union[typing.Literal["healthy", "needs_reauth"], typing.Any]
diff --git a/src/elevenlabs/types/conversation_summary_response_model.py b/src/elevenlabs/types/conversation_summary_response_model.py
index e53d5e8b1..699b2ab7b 100644
--- a/src/elevenlabs/types/conversation_summary_response_model.py
+++ b/src/elevenlabs/types/conversation_summary_response_model.py
@@ -21,7 +21,21 @@ class ConversationSummaryResponseModel(UncheckedBaseModel):
conversation_id: str
start_time_unix_secs: int
call_duration_secs: int
- message_count: int
+ message_count: int = pydantic.Field()
+ """
+ Number of transcript turns with text; tool-only turns are not counted.
+ """
+
+ user_message_count: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Number of user transcript turns with text; tool-only turns are not counted. `null` for older conversations before this field whose transcript was deleted.
+ """
+
+ agent_message_count: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Number of agent transcript turns with text; tool-only turns are not counted. `null` for older conversations before this field whose transcript was deleted.
+ """
+
status: ConversationSummaryResponseModelStatus
termination_reason: typing.Optional[str] = None
call_successful: EvaluationSuccessResult
diff --git a/src/elevenlabs/types/country_code.py b/src/elevenlabs/types/country_code.py
new file mode 100644
index 000000000..ea2a5788d
--- /dev/null
+++ b/src/elevenlabs/types/country_code.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+CountryCode = str
diff --git a/src/elevenlabs/types/customer_facing_config_input.py b/src/elevenlabs/types/customer_facing_config_input.py
new file mode 100644
index 000000000..b9f2acd15
--- /dev/null
+++ b/src/elevenlabs/types/customer_facing_config_input.py
@@ -0,0 +1,141 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .agent_rule import AgentRule
+from .llm import Llm
+from .llm_reasoning_effort import LlmReasoningEffort
+from .smb_procedure import SmbProcedure
+from .smb_transfer_rule import SmbTransferRule
+from .smb_turn_eagerness import SmbTurnEagerness
+from .stripped_str import StrippedStr
+from .supported_lang import SupportedLang
+
+
+class CustomerFacingConfigInput(UncheckedBaseModel):
+ additional_instructions: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Extra instructions for the agent (e.g., 'Always ask callers to spell out their name')
+ """
+
+ tone_traits: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Personality/tone trait keys that drive the Personality prompt section (e.g. ['professional', 'concise']).
+ """
+
+ details_to_collect: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Details the agent should always try to collect from callers (presets + custom labels, e.g. ['full name', 'phone number']).
+ """
+
+ llm: typing.Optional[Llm] = pydantic.Field(default=None)
+ """
+ Concrete LLM powering the receptionist. Constrained to SMB_ALLOWED_LLMS (see validate_reasoning_effort). None means no explicit model was chosen; the factory falls back to the historical default (SMB_DEFAULT_LEGACY_LLM) so configs predating this field keep their original model. New agents are created with SMB_DEFAULT_NEW_AGENT_LLM.
+ """
+
+ reasoning_effort: typing.Optional[LlmReasoningEffort] = pydantic.Field(default=None)
+ """
+ Reasoning effort for the receptionist's model. Must be one of the model's supported efforts (see LLM.available_reasoning_efforts) and is capped at MEDIUM for SMB (see SMB_RECEPTIONIST_REASONING_EFFORTS); use null for the model default / models without configurable reasoning.
+ """
+
+ disable_rag: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When true, the receptionist's knowledge base is injected in full into the system prompt instead of being retrieved via vector RAG on every turn. This removes the per-turn embedding + vector-search latency, but is only viable for small knowledge bases that fit within the prompt budget (KNOWLEDGE_BASE_IN_PROMPT_MAX_LEN). Knowledge bases too large to inline fall back to RAG at build time.
+ """
+
+ background_voice_detection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Filter out far-field human speech before transcription.
+ """
+
+ turn_eagerness: typing.Optional[SmbTurnEagerness] = pydantic.Field(default=None)
+ """
+ How quickly the receptionist decides the caller has finished speaking. Eager replies soonest; patient waits for a clearer end of turn.
+ """
+
+ voice_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ ElevenLabs voice ID
+ """
+
+ language: typing.Optional[SupportedLang] = pydantic.Field(default=None)
+ """
+ Primary language code
+ """
+
+ additional_languages: typing.Optional[typing.List[SupportedLang]] = pydantic.Field(default=None)
+ """
+ Additional language codes the agent can communicate in
+ """
+
+ first_message: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The first message the agent says when starting a conversation
+ """
+
+ disable_first_message_interruptions: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When true, callers cannot interrupt the receptionist while the first message is being delivered. Use when the greeting carries a recording or legal notice callers must hear in full.
+ """
+
+ enable_end_call_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the end_call system tool during conversations.
+ """
+
+ enable_skip_turn_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the skip_turn system tool during conversations.
+ """
+
+ enable_play_keypad_touch_tone_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the play_keypad_touch_tone (DTMF) system tool during conversations. When enabled, the receptionist can play touch-tone digits on a live call to navigate automated phone menus or answer carrier prompts such as a 'press 1 to accept' call-screening step.
+ """
+
+ agent_rules: typing.Optional[typing.List[AgentRule]] = pydantic.Field(default=None)
+ """
+ Behavioral rules this agent must follow.
+ """
+
+ transfer_rules: typing.Optional[typing.List[SmbTransferRule]] = pydantic.Field(default=None)
+ """
+ Phone numbers this agent can transfer calls to.
+ """
+
+ hide_caller_number_on_transfers: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Show the business's own number, rather than the caller's, as the caller ID on transferred calls.
+ """
+
+ record_after_transfers: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Keep recording after a call is transferred and add that audio to the call recording.
+ """
+
+ procedures: typing.Optional[typing.List[SmbProcedure]] = pydantic.Field(default=None)
+ """
+ Standard operating procedures (SOPs) this agent can run on calls.
+ """
+
+ enable_secure_mode: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, the receptionist may only look up or modify appointments and client records tied to the caller's verified phone number.
+ """
+
+ enable_spam_protection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, inbound calls to US numbers are screened before the receptionist answers: calls whose caller ID failed carrier (STIR/SHAKEN) verification are rejected, and unknown callers whose caller ID the carrier could not vouch for must press a key to be connected.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/customer_facing_config_output.py b/src/elevenlabs/types/customer_facing_config_output.py
new file mode 100644
index 000000000..96ce8768a
--- /dev/null
+++ b/src/elevenlabs/types/customer_facing_config_output.py
@@ -0,0 +1,141 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .agent_rule import AgentRule
+from .llm import Llm
+from .llm_reasoning_effort import LlmReasoningEffort
+from .smb_procedure import SmbProcedure
+from .smb_transfer_rule import SmbTransferRule
+from .smb_turn_eagerness import SmbTurnEagerness
+from .stripped_str import StrippedStr
+from .supported_lang import SupportedLang
+
+
+class CustomerFacingConfigOutput(UncheckedBaseModel):
+ additional_instructions: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Extra instructions for the agent (e.g., 'Always ask callers to spell out their name')
+ """
+
+ tone_traits: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Personality/tone trait keys that drive the Personality prompt section (e.g. ['professional', 'concise']).
+ """
+
+ details_to_collect: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Details the agent should always try to collect from callers (presets + custom labels, e.g. ['full name', 'phone number']).
+ """
+
+ llm: typing.Optional[Llm] = pydantic.Field(default=None)
+ """
+ Concrete LLM powering the receptionist. Constrained to SMB_ALLOWED_LLMS (see validate_reasoning_effort). None means no explicit model was chosen; the factory falls back to the historical default (SMB_DEFAULT_LEGACY_LLM) so configs predating this field keep their original model. New agents are created with SMB_DEFAULT_NEW_AGENT_LLM.
+ """
+
+ reasoning_effort: typing.Optional[LlmReasoningEffort] = pydantic.Field(default=None)
+ """
+ Reasoning effort for the receptionist's model. Must be one of the model's supported efforts (see LLM.available_reasoning_efforts) and is capped at MEDIUM for SMB (see SMB_RECEPTIONIST_REASONING_EFFORTS); use null for the model default / models without configurable reasoning.
+ """
+
+ disable_rag: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When true, the receptionist's knowledge base is injected in full into the system prompt instead of being retrieved via vector RAG on every turn. This removes the per-turn embedding + vector-search latency, but is only viable for small knowledge bases that fit within the prompt budget (KNOWLEDGE_BASE_IN_PROMPT_MAX_LEN). Knowledge bases too large to inline fall back to RAG at build time.
+ """
+
+ background_voice_detection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Filter out far-field human speech before transcription.
+ """
+
+ turn_eagerness: typing.Optional[SmbTurnEagerness] = pydantic.Field(default=None)
+ """
+ How quickly the receptionist decides the caller has finished speaking. Eager replies soonest; patient waits for a clearer end of turn.
+ """
+
+ voice_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ ElevenLabs voice ID
+ """
+
+ language: typing.Optional[SupportedLang] = pydantic.Field(default=None)
+ """
+ Primary language code
+ """
+
+ additional_languages: typing.Optional[typing.List[SupportedLang]] = pydantic.Field(default=None)
+ """
+ Additional language codes the agent can communicate in
+ """
+
+ first_message: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The first message the agent says when starting a conversation
+ """
+
+ disable_first_message_interruptions: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When true, callers cannot interrupt the receptionist while the first message is being delivered. Use when the greeting carries a recording or legal notice callers must hear in full.
+ """
+
+ enable_end_call_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the end_call system tool during conversations.
+ """
+
+ enable_skip_turn_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the skip_turn system tool during conversations.
+ """
+
+ enable_play_keypad_touch_tone_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the play_keypad_touch_tone (DTMF) system tool during conversations. When enabled, the receptionist can play touch-tone digits on a live call to navigate automated phone menus or answer carrier prompts such as a 'press 1 to accept' call-screening step.
+ """
+
+ agent_rules: typing.Optional[typing.List[AgentRule]] = pydantic.Field(default=None)
+ """
+ Behavioral rules this agent must follow.
+ """
+
+ transfer_rules: typing.Optional[typing.List[SmbTransferRule]] = pydantic.Field(default=None)
+ """
+ Phone numbers this agent can transfer calls to.
+ """
+
+ hide_caller_number_on_transfers: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Show the business's own number, rather than the caller's, as the caller ID on transferred calls.
+ """
+
+ record_after_transfers: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Keep recording after a call is transferred and add that audio to the call recording.
+ """
+
+ procedures: typing.Optional[typing.List[SmbProcedure]] = pydantic.Field(default=None)
+ """
+ Standard operating procedures (SOPs) this agent can run on calls.
+ """
+
+ enable_secure_mode: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, the receptionist may only look up or modify appointments and client records tied to the caller's verified phone number.
+ """
+
+ enable_spam_protection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, inbound calls to US numbers are screened before the receptionist answers: calls whose caller ID failed carrier (STIR/SHAKEN) verification are rejected, and unknown callers whose caller ID the carrier could not vouch for must press a key to be connected.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/customer_facing_config_patch.py b/src/elevenlabs/types/customer_facing_config_patch.py
new file mode 100644
index 000000000..061a614e0
--- /dev/null
+++ b/src/elevenlabs/types/customer_facing_config_patch.py
@@ -0,0 +1,127 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .llm import Llm
+from .llm_reasoning_effort import LlmReasoningEffort
+from .smb_turn_eagerness import SmbTurnEagerness
+from .stripped_str import StrippedStr
+from .supported_lang import SupportedLang
+
+
+class CustomerFacingConfigPatch(UncheckedBaseModel):
+ """
+ The endpoint-managed lists are written through their own routes, never here.
+ """
+
+ additional_instructions: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Extra instructions for the agent (e.g., 'Always ask callers to spell out their name')
+ """
+
+ tone_traits: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Personality/tone trait keys that drive the Personality prompt section (e.g. ['professional', 'concise']).
+ """
+
+ details_to_collect: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Details the agent should always try to collect from callers (presets + custom labels, e.g. ['full name', 'phone number']).
+ """
+
+ llm: typing.Optional[Llm] = pydantic.Field(default=None)
+ """
+ Concrete LLM powering the receptionist. Constrained to SMB_ALLOWED_LLMS (see validate_reasoning_effort). None means no explicit model was chosen; the factory falls back to the historical default (SMB_DEFAULT_LEGACY_LLM) so configs predating this field keep their original model. New agents are created with SMB_DEFAULT_NEW_AGENT_LLM.
+ """
+
+ reasoning_effort: typing.Optional[LlmReasoningEffort] = pydantic.Field(default=None)
+ """
+ Reasoning effort for the receptionist's model. Must be one of the model's supported efforts (see LLM.available_reasoning_efforts) and is capped at MEDIUM for SMB (see SMB_RECEPTIONIST_REASONING_EFFORTS); use null for the model default / models without configurable reasoning.
+ """
+
+ disable_rag: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When true, the receptionist's knowledge base is injected in full into the system prompt instead of being retrieved via vector RAG on every turn. This removes the per-turn embedding + vector-search latency, but is only viable for small knowledge bases that fit within the prompt budget (KNOWLEDGE_BASE_IN_PROMPT_MAX_LEN). Knowledge bases too large to inline fall back to RAG at build time.
+ """
+
+ background_voice_detection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Filter out far-field human speech before transcription.
+ """
+
+ turn_eagerness: typing.Optional[SmbTurnEagerness] = pydantic.Field(default=None)
+ """
+ How quickly the receptionist decides the caller has finished speaking. Eager replies soonest; patient waits for a clearer end of turn.
+ """
+
+ voice_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ ElevenLabs voice ID
+ """
+
+ language: typing.Optional[SupportedLang] = pydantic.Field(default=None)
+ """
+ Primary language code
+ """
+
+ additional_languages: typing.Optional[typing.List[SupportedLang]] = pydantic.Field(default=None)
+ """
+ Additional language codes the agent can communicate in
+ """
+
+ first_message: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The first message the agent says when starting a conversation
+ """
+
+ disable_first_message_interruptions: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When true, callers cannot interrupt the receptionist while the first message is being delivered. Use when the greeting carries a recording or legal notice callers must hear in full.
+ """
+
+ enable_end_call_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the end_call system tool during conversations.
+ """
+
+ enable_skip_turn_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the skip_turn system tool during conversations.
+ """
+
+ enable_play_keypad_touch_tone_tool: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow the play_keypad_touch_tone (DTMF) system tool during conversations. When enabled, the receptionist can play touch-tone digits on a live call to navigate automated phone menus or answer carrier prompts such as a 'press 1 to accept' call-screening step.
+ """
+
+ hide_caller_number_on_transfers: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Show the business's own number, rather than the caller's, as the caller ID on transferred calls.
+ """
+
+ record_after_transfers: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Keep recording after a call is transferred and add that audio to the call recording.
+ """
+
+ enable_secure_mode: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, the receptionist may only look up or modify appointments and client records tied to the caller's verified phone number.
+ """
+
+ enable_spam_protection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, inbound calls to US numbers are screened before the receptionist answers: calls whose caller ID failed carrier (STIR/SHAKEN) verification are rejected, and unknown callers whose caller ID the carrier could not vouch for must press a key to be connected.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/date_model.py b/src/elevenlabs/types/date_model.py
new file mode 100644
index 000000000..a8a75aa46
--- /dev/null
+++ b/src/elevenlabs/types/date_model.py
@@ -0,0 +1,37 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class DateModel(UncheckedBaseModel):
+ """
+ Represents a calendar date as individual numeric components.
+ """
+
+ year: int = pydantic.Field()
+ """
+ Year
+ """
+
+ month: int = pydantic.Field()
+ """
+ Month (1-12)
+ """
+
+ day: int = pydantic.Field()
+ """
+ Day of month (1-31)
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/day_of_week.py b/src/elevenlabs/types/day_of_week.py
new file mode 100644
index 000000000..0f17059a2
--- /dev/null
+++ b/src/elevenlabs/types/day_of_week.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+DayOfWeek = int
diff --git a/src/elevenlabs/types/dubbing_error.py b/src/elevenlabs/types/dubbing_error.py
index afb1c5dc1..665878993 100644
--- a/src/elevenlabs/types/dubbing_error.py
+++ b/src/elevenlabs/types/dubbing_error.py
@@ -8,8 +8,20 @@
class DubbingError(UncheckedBaseModel):
- message_type: typing.Literal["error"] = "error"
- error: str
+ code: str = pydantic.Field()
+ """
+ Stable identifier for the failure, safe to branch on. New codes are added over time, so we recommend treating an unrecognized value as `internal_error`.
+ """
+
+ message: str = pydantic.Field()
+ """
+ Human-readable description of the failure, for display. The wording may change at any time, so we recommend branching on `code` instead.
+ """
+
+ retryable: bool = pydantic.Field()
+ """
+ Whether resubmitting the same input could succeed. A value of false means the failure describes the input or the account, so an identical retry will fail the same way.
+ """
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/dubbing_input_audio_chunk.py b/src/elevenlabs/types/dubbing_input_audio_chunk.py
deleted file mode 100644
index dc2e0492e..000000000
--- a/src/elevenlabs/types/dubbing_input_audio_chunk.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingInputAudioChunk(UncheckedBaseModel):
- message_type: typing.Literal["input_audio_chunk"] = "input_audio_chunk"
- audio_base_64: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_input_error.py b/src/elevenlabs/types/dubbing_input_error.py
deleted file mode 100644
index 00031ac68..000000000
--- a/src/elevenlabs/types/dubbing_input_error.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingInputError(UncheckedBaseModel):
- message_type: typing.Literal["input_error"] = "input_error"
- error: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_invalid_request_error.py b/src/elevenlabs/types/dubbing_invalid_request_error.py
deleted file mode 100644
index 55ba12c03..000000000
--- a/src/elevenlabs/types/dubbing_invalid_request_error.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingInvalidRequestError(UncheckedBaseModel):
- message_type: typing.Literal["invalid_request"] = "invalid_request"
- error: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_partial_transcript.py b/src/elevenlabs/types/dubbing_partial_transcript.py
deleted file mode 100644
index 4619df245..000000000
--- a/src/elevenlabs/types/dubbing_partial_transcript.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingPartialTranscript(UncheckedBaseModel):
- message_type: typing.Literal["partial_transcript"] = "partial_transcript"
- text: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_queue_overflow_error.py b/src/elevenlabs/types/dubbing_queue_overflow_error.py
deleted file mode 100644
index 14c40968c..000000000
--- a/src/elevenlabs/types/dubbing_queue_overflow_error.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingQueueOverflowError(UncheckedBaseModel):
- message_type: typing.Literal["queue_overflow"] = "queue_overflow"
- error: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_rate_limited_error.py b/src/elevenlabs/types/dubbing_rate_limited_error.py
deleted file mode 100644
index 4939a9392..000000000
--- a/src/elevenlabs/types/dubbing_rate_limited_error.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingRateLimitedError(UncheckedBaseModel):
- message_type: typing.Literal["rate_limited"] = "rate_limited"
- error: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_session_started.py b/src/elevenlabs/types/dubbing_session_started.py
deleted file mode 100644
index ec0f9d27d..000000000
--- a/src/elevenlabs/types/dubbing_session_started.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingSessionStarted(UncheckedBaseModel):
- message_type: typing.Literal["session_started"] = "session_started"
- session_id: str
- client_session_id: typing.Optional[str] = None
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_status.py b/src/elevenlabs/types/dubbing_status.py
deleted file mode 100644
index a4ecc9520..000000000
--- a/src/elevenlabs/types/dubbing_status.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-from .dubbing_status_status import DubbingStatusStatus
-
-
-class DubbingStatus(UncheckedBaseModel):
- message_type: typing.Literal["status"] = "status"
- status: DubbingStatusStatus
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_status_status.py b/src/elevenlabs/types/dubbing_status_status.py
deleted file mode 100644
index 0a7b20a8a..000000000
--- a/src/elevenlabs/types/dubbing_status_status.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-DubbingStatusStatus = typing.Union[typing.Literal["started", "stopped"], typing.Any]
diff --git a/src/elevenlabs/types/dubbing_transcriber_error.py b/src/elevenlabs/types/dubbing_transcriber_error.py
deleted file mode 100644
index 206c633ca..000000000
--- a/src/elevenlabs/types/dubbing_transcriber_error.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingTranscriberError(UncheckedBaseModel):
- message_type: typing.Literal["transcriber_error"] = "transcriber_error"
- error: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_translation.py b/src/elevenlabs/types/dubbing_translation.py
deleted file mode 100644
index 2767ec382..000000000
--- a/src/elevenlabs/types/dubbing_translation.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingTranslation(UncheckedBaseModel):
- message_type: typing.Literal["translation"] = "translation"
- text: str
- segment_id: str
- start_s: float
- end_s: float
- speaker_id: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_translation_error.py b/src/elevenlabs/types/dubbing_translation_error.py
deleted file mode 100644
index 78aa7d2a9..000000000
--- a/src/elevenlabs/types/dubbing_translation_error.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-from ..core.unchecked_base_model import UncheckedBaseModel
-
-
-class DubbingTranslationError(UncheckedBaseModel):
- message_type: typing.Literal["translation_error"] = "translation_error"
- error: str
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/email_optional.py b/src/elevenlabs/types/email_optional.py
new file mode 100644
index 000000000..f8fc4da2d
--- /dev/null
+++ b/src/elevenlabs/types/email_optional.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+EmailOptional = str
diff --git a/src/elevenlabs/types/get_conversation_response_model.py b/src/elevenlabs/types/get_conversation_response_model.py
index 072e6055a..261be9fd3 100644
--- a/src/elevenlabs/types/get_conversation_response_model.py
+++ b/src/elevenlabs/types/get_conversation_response_model.py
@@ -29,6 +29,16 @@ class GetConversationResponseModel(UncheckedBaseModel):
metadata: ConversationHistoryMetadataCommonModel
analysis: typing.Optional[ConversationHistoryAnalysisCommonModel] = None
+ user_message_count: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Number of user transcript turns with text; tool-only turns are not counted. `null` for older conversations before this field whose transcript was deleted.
+ """
+
+ agent_message_count: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Number of agent transcript turns with text; tool-only turns are not counted. `null` for older conversations before this field whose transcript was deleted.
+ """
+
visited_agents: typing.Optional[typing.List[VisitedAgentRef]] = None
conversation_initiation_client_data: typing.Optional[ConversationInitiationClientDataRequestOutput] = None
environment: typing.Optional[str] = None
diff --git a/src/elevenlabs/types/holiday_response_model.py b/src/elevenlabs/types/holiday_response_model.py
new file mode 100644
index 000000000..61a62c615
--- /dev/null
+++ b/src/elevenlabs/types/holiday_response_model.py
@@ -0,0 +1,47 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .date_model import DateModel
+from .holiday_type import HolidayType
+from .time_off_type import TimeOffType
+from .time_range_model import TimeRangeModel
+
+
+class HolidayResponseModel(UncheckedBaseModel):
+ """
+ API response model. Exposes only the source-of-truth dates and hours.
+ """
+
+ name: str
+ start_date: DateModel
+ end_date: DateModel
+ holiday_type: typing.Optional[HolidayType] = None
+ override_hours: typing.Optional[typing.List[TimeRangeModel]] = pydantic.Field(default=None)
+ """
+ Replacement working hours when holiday_type is 'override'.
+ """
+
+ time_off_type: TimeOffType
+ resource_id: typing.Optional[str] = None
+ location_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ For LOCATION type: the location this closure applies to.
+ """
+
+ reason: typing.Optional[str] = None
+ id: str
+ created_at_unix: int
+ updated_at_unix: int
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/holiday_type.py b/src/elevenlabs/types/holiday_type.py
new file mode 100644
index 000000000..1a71818ce
--- /dev/null
+++ b/src/elevenlabs/types/holiday_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+HolidayType = typing.Union[typing.Literal["closed", "override"], typing.Any]
diff --git a/src/elevenlabs/types/ingest_failure.py b/src/elevenlabs/types/ingest_failure.py
new file mode 100644
index 000000000..4dc22de4c
--- /dev/null
+++ b/src/elevenlabs/types/ingest_failure.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+IngestFailure = typing.Union[
+ typing.Literal[
+ "blocked_url",
+ "dns_failure",
+ "host_unreachable",
+ "access_refused",
+ "crawl_timeout",
+ "no_pages",
+ "no_content",
+ "upstream_timeout",
+ "upstream_error",
+ "unknown",
+ ],
+ typing.Any,
+]
diff --git a/src/elevenlabs/types/intake_question_kind.py b/src/elevenlabs/types/intake_question_kind.py
new file mode 100644
index 000000000..f4b5bbd7e
--- /dev/null
+++ b/src/elevenlabs/types/intake_question_kind.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+IntakeQuestionKind = typing.Union[typing.Literal["text", "number", "choice"], typing.Any]
diff --git a/src/elevenlabs/types/internal_kb_crawl_page_timing.py b/src/elevenlabs/types/internal_kb_crawl_page_timing.py
new file mode 100644
index 000000000..5334bb5c9
--- /dev/null
+++ b/src/elevenlabs/types/internal_kb_crawl_page_timing.py
@@ -0,0 +1,30 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class InternalKbCrawlPageTiming(UncheckedBaseModel):
+ """
+ Per-document timing data for one crawled page.
+ """
+
+ url: str
+ doc_id: str
+ read_ms: typing.Optional[int] = None
+ index_ms: typing.Optional[int] = None
+ html_len: typing.Optional[int] = None
+ skipped: typing.Optional[bool] = None
+ error: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/knowledge_source_status.py b/src/elevenlabs/types/knowledge_source_status.py
new file mode 100644
index 000000000..ae5169628
--- /dev/null
+++ b/src/elevenlabs/types/knowledge_source_status.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+KnowledgeSourceStatus = typing.Union[typing.Literal["processing", "ready", "error"], typing.Any]
diff --git a/src/elevenlabs/types/knowledge_source_type.py b/src/elevenlabs/types/knowledge_source_type.py
new file mode 100644
index 000000000..0f6320ec8
--- /dev/null
+++ b/src/elevenlabs/types/knowledge_source_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+KnowledgeSourceType = typing.Union[typing.Literal["file", "url"], typing.Any]
diff --git a/src/elevenlabs/types/language_preset_input.py b/src/elevenlabs/types/language_preset_input.py
index 11239cc0f..43842b813 100644
--- a/src/elevenlabs/types/language_preset_input.py
+++ b/src/elevenlabs/types/language_preset_input.py
@@ -25,6 +25,11 @@ class LanguagePresetInput(UncheckedBaseModel):
The translation of the soft timeout message
"""
+ noisy_environment_message_translation: typing.Optional[LanguagePresetTranslation] = pydantic.Field(default=None)
+ """
+ The translation of the noisy environment message
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/language_preset_output.py b/src/elevenlabs/types/language_preset_output.py
index 231ec5fb3..eadacd81d 100644
--- a/src/elevenlabs/types/language_preset_output.py
+++ b/src/elevenlabs/types/language_preset_output.py
@@ -25,6 +25,11 @@ class LanguagePresetOutput(UncheckedBaseModel):
The translation of the soft timeout message
"""
+ noisy_environment_message_translation: typing.Optional[LanguagePresetTranslation] = pydantic.Field(default=None)
+ """
+ The translation of the noisy environment message
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/lenient_country.py b/src/elevenlabs/types/lenient_country.py
new file mode 100644
index 000000000..97c391e9c
--- /dev/null
+++ b/src/elevenlabs/types/lenient_country.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from .country_code import CountryCode
+
+LenientCountry = typing.Optional[CountryCode]
diff --git a/src/elevenlabs/types/lenient_currency.py b/src/elevenlabs/types/lenient_currency.py
new file mode 100644
index 000000000..3c8c2e9eb
--- /dev/null
+++ b/src/elevenlabs/types/lenient_currency.py
@@ -0,0 +1,57 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+LenientCurrency = typing.Union[
+ typing.Literal[
+ "USD",
+ "EUR",
+ "GBP",
+ "PLN",
+ "CAD",
+ "AUD",
+ "CHF",
+ "SEK",
+ "NOK",
+ "DKK",
+ "ISK",
+ "CZK",
+ "HUF",
+ "RON",
+ "BGN",
+ "JPY",
+ "CNY",
+ "TWD",
+ "INR",
+ "BRL",
+ "MXN",
+ "KRW",
+ "SGD",
+ "HKD",
+ "NZD",
+ "ZAR",
+ "AED",
+ "SAR",
+ "QAR",
+ "KWD",
+ "ILS",
+ "TRY",
+ "THB",
+ "IDR",
+ "MYR",
+ "PHP",
+ "VND",
+ "BDT",
+ "RUB",
+ "UAH",
+ "CLP",
+ "COP",
+ "ARS",
+ "PEN",
+ "EGP",
+ "NGN",
+ "KES",
+ "PKR",
+ ],
+ typing.Any,
+]
diff --git a/src/elevenlabs/types/lenient_optional_bool.py b/src/elevenlabs/types/lenient_optional_bool.py
new file mode 100644
index 000000000..9da045051
--- /dev/null
+++ b/src/elevenlabs/types/lenient_optional_bool.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+LenientOptionalBool = typing.Optional[bool]
diff --git a/src/elevenlabs/types/lenient_optional_str.py b/src/elevenlabs/types/lenient_optional_str.py
new file mode 100644
index 000000000..34923d036
--- /dev/null
+++ b/src/elevenlabs/types/lenient_optional_str.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+LenientOptionalStr = typing.Optional[str]
diff --git a/src/elevenlabs/types/lenient_phone.py b/src/elevenlabs/types/lenient_phone.py
new file mode 100644
index 000000000..fbd74753d
--- /dev/null
+++ b/src/elevenlabs/types/lenient_phone.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from .phone_number_nullable import PhoneNumberNullable
+
+LenientPhone = typing.Optional[PhoneNumberNullable]
diff --git a/src/elevenlabs/types/lenient_state.py b/src/elevenlabs/types/lenient_state.py
new file mode 100644
index 000000000..0afac27fd
--- /dev/null
+++ b/src/elevenlabs/types/lenient_state.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+LenientState = typing.Optional[str]
diff --git a/src/elevenlabs/types/lenient_vertical.py b/src/elevenlabs/types/lenient_vertical.py
new file mode 100644
index 000000000..6f23cd072
--- /dev/null
+++ b/src/elevenlabs/types/lenient_vertical.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+from .smb_vertical import SmbVertical
+
+LenientVertical = typing.Optional[SmbVertical]
diff --git a/src/elevenlabs/types/llm.py b/src/elevenlabs/types/llm.py
index dcb36bfe8..cafdc0103 100644
--- a/src/elevenlabs/types/llm.py
+++ b/src/elevenlabs/types/llm.py
@@ -26,6 +26,7 @@
"gpt-6-sol",
"gpt-6-luna",
"gpt-6.1-sol",
+ "gpt-6.1-terra",
"gpt-5-mini",
"gpt-5-nano",
"gpt-3.5-turbo",
diff --git a/src/elevenlabs/types/location_response.py b/src/elevenlabs/types/location_response.py
new file mode 100644
index 000000000..f24fc47f7
--- /dev/null
+++ b/src/elevenlabs/types/location_response.py
@@ -0,0 +1,66 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.serialization import FieldMetadata
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_location_deactivation_reason import SmbLocationDeactivationReason
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class LocationResponse(UncheckedBaseModel):
+ """
+ `SMBLocation` with `id` serialized as `_id` for MongoDB-style API consistency.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal name, e.g. 'Main Office' or 'Downtown Branch', shown in the dashboard and owner notifications.
+ """
+
+ address: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Street address.
+ """
+
+ notes: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Directions or other notes for customers, e.g. 'Free parking behind the building'.
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = None
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Name shown to customers; empty reuses name.
+ """
+
+ max_concurrent_appointments: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Maximum number of appointments that may overlap at this location at a single instant. Only enforced while the booking page setting concurrent_limit_enabled is on.
+ """
+
+ id: typing_extensions.Annotated[str, FieldMetadata(alias="_id"), pydantic.Field(alias="_id")]
+ deactivated_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Unix timestamp when this location was deactivated. None when active.
+ """
+
+ deactivation_reason: typing.Optional[SmbLocationDeactivationReason] = pydantic.Field(default=None)
+ """
+ Why this location was deactivated. None when active.
+ """
+
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/mcp_transport.py b/src/elevenlabs/types/mcp_transport.py
new file mode 100644
index 000000000..e588a6d16
--- /dev/null
+++ b/src/elevenlabs/types/mcp_transport.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+McpTransport = typing.Union[typing.Literal["SSE", "STREAMABLE_HTTP"], typing.Any]
diff --git a/src/elevenlabs/types/permission_type.py b/src/elevenlabs/types/permission_type.py
index dd383ce20..b57f1c8b6 100644
--- a/src/elevenlabs/types/permission_type.py
+++ b/src/elevenlabs/types/permission_type.py
@@ -33,6 +33,7 @@
"forced_alignment",
"convai_read",
"convai_write",
+ "agents_architect",
"music_generation",
"image_video_generation",
"flows",
diff --git a/src/elevenlabs/types/phone_number.py b/src/elevenlabs/types/phone_number.py
new file mode 100644
index 000000000..9b8b3dc9b
--- /dev/null
+++ b/src/elevenlabs/types/phone_number.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+PhoneNumber = str
diff --git a/src/elevenlabs/types/phone_number_nullable.py b/src/elevenlabs/types/phone_number_nullable.py
new file mode 100644
index 000000000..48e5aee3d
--- /dev/null
+++ b/src/elevenlabs/types/phone_number_nullable.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PhoneNumberNullable = typing.Optional[str]
diff --git a/src/elevenlabs/types/phone_number_optional.py b/src/elevenlabs/types/phone_number_optional.py
new file mode 100644
index 000000000..6bbdc9106
--- /dev/null
+++ b/src/elevenlabs/types/phone_number_optional.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+PhoneNumberOptional = str
diff --git a/src/elevenlabs/types/pricing_mode.py b/src/elevenlabs/types/pricing_mode.py
new file mode 100644
index 000000000..a21546451
--- /dev/null
+++ b/src/elevenlabs/types/pricing_mode.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PricingMode = typing.Union[typing.Literal["fixed", "quote"], typing.Any]
diff --git a/src/elevenlabs/types/processing_progress.py b/src/elevenlabs/types/processing_progress.py
new file mode 100644
index 000000000..4ce93433c
--- /dev/null
+++ b/src/elevenlabs/types/processing_progress.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ProcessingProgress = typing.Union[
+ typing.Literal["Converting", "Storing", "Scraping", "Crawling", "Extracting"], typing.Any
+]
diff --git a/src/elevenlabs/types/promotion_target.py b/src/elevenlabs/types/promotion_target.py
new file mode 100644
index 000000000..0204aed18
--- /dev/null
+++ b/src/elevenlabs/types/promotion_target.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PromotionTarget = typing.Union[typing.Literal["service", "add_on"], typing.Any]
diff --git a/src/elevenlabs/types/provision_reseller_workspace_response.py b/src/elevenlabs/types/provision_reseller_workspace_response.py
new file mode 100644
index 000000000..fcec6f003
--- /dev/null
+++ b/src/elevenlabs/types/provision_reseller_workspace_response.py
@@ -0,0 +1,38 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_workspace_subscription import ResellerWorkspaceSubscription
+from .team_invite_result import TeamInviteResult
+
+
+class ProvisionResellerWorkspaceResponse(UncheckedBaseModel):
+ workspace_id: str
+ business_name: str
+ billing_tier: typing.Optional[str] = None
+ receptionist_count: int
+ calls_last_30_days: int
+ created_at_unix: int
+ subscription: typing.Optional[ResellerWorkspaceSubscription] = pydantic.Field(default=None)
+ """
+ The reseller-managed subscription, when this workspace has one. None means nothing is sold here yet and a tier can be assigned.
+ """
+
+ has_payment_issue: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ A charge for this workspace is unpaid. Assigning or changing a tier is refused until it clears, so surface it rather than letting it fail.
+ """
+
+ member_results: typing.Optional[typing.List[TeamInviteResult]] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/provision_reseller_workspace_subscription.py b/src/elevenlabs/types/provision_reseller_workspace_subscription.py
new file mode 100644
index 000000000..149733226
--- /dev/null
+++ b/src/elevenlabs/types/provision_reseller_workspace_subscription.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .provision_reseller_workspace_subscription_billing_period import (
+ ProvisionResellerWorkspaceSubscriptionBillingPeriod,
+)
+
+
+class ProvisionResellerWorkspaceSubscription(UncheckedBaseModel):
+ tier_id: str
+ billing_period: typing.Optional[ProvisionResellerWorkspaceSubscriptionBillingPeriod] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/provision_reseller_workspace_subscription_billing_period.py b/src/elevenlabs/types/provision_reseller_workspace_subscription_billing_period.py
new file mode 100644
index 000000000..9c70c7d16
--- /dev/null
+++ b/src/elevenlabs/types/provision_reseller_workspace_subscription_billing_period.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ProvisionResellerWorkspaceSubscriptionBillingPeriod = typing.Union[
+ typing.Literal["monthly_period", "annual_period"], typing.Any
+]
diff --git a/src/elevenlabs/types/raw_business_info.py b/src/elevenlabs/types/raw_business_info.py
new file mode 100644
index 000000000..fb270421a
--- /dev/null
+++ b/src/elevenlabs/types/raw_business_info.py
@@ -0,0 +1,33 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .lenient_optional_str import LenientOptionalStr
+from .raw_location_info import RawLocationInfo
+
+
+class RawBusinessInfo(UncheckedBaseModel):
+ """
+ Business profile data extracted from a single page.
+ """
+
+ company_name: typing.Optional[LenientOptionalStr] = None
+ description: typing.Optional[LenientOptionalStr] = None
+ business_phone: typing.Optional[LenientOptionalStr] = None
+ locations: typing.Optional[typing.List[RawLocationInfo]] = None
+ business_country: typing.Optional[LenientOptionalStr] = None
+ business_state: typing.Optional[LenientOptionalStr] = None
+ suggested_currency: typing.Optional[LenientOptionalStr] = None
+ suggested_language: typing.Optional[LenientOptionalStr] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/raw_item.py b/src/elevenlabs/types/raw_item.py
new file mode 100644
index 000000000..32308bc60
--- /dev/null
+++ b/src/elevenlabs/types/raw_item.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class RawItem(UncheckedBaseModel):
+ """
+ A single item extracted from a page — could be a service, person, product, or asset.
+ """
+
+ name: str
+ description: typing.Optional[str] = None
+ price: typing.Optional[float] = None
+ duration_minutes: typing.Optional[int] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/raw_location_info.py b/src/elevenlabs/types/raw_location_info.py
new file mode 100644
index 000000000..649f4a96e
--- /dev/null
+++ b/src/elevenlabs/types/raw_location_info.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .lenient_optional_str import LenientOptionalStr
+
+
+class RawLocationInfo(UncheckedBaseModel):
+ """
+ A single branch/location extracted from a page.
+ """
+
+ name: typing.Optional[LenientOptionalStr] = None
+ address: typing.Optional[LenientOptionalStr] = None
+ operating_hours: typing.Optional[typing.Dict[str, typing.Any]] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/reseller_invoice_detail.py b/src/elevenlabs/types/reseller_invoice_detail.py
new file mode 100644
index 000000000..ab3f9092d
--- /dev/null
+++ b/src/elevenlabs/types/reseller_invoice_detail.py
@@ -0,0 +1,44 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_invoice_line import ResellerInvoiceLine
+from .reseller_invoice_status import ResellerInvoiceStatus
+
+
+class ResellerInvoiceDetail(UncheckedBaseModel):
+ invoice_id: str
+ workspace_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The workspace this charge paid for.
+ """
+
+ workspace_name: str
+ status: ResellerInvoiceStatus
+ amount_cents: int = pydantic.Field()
+ """
+ Invoice total, in the currency's minor unit.
+ """
+
+ currency: str
+ created_unix: int
+ paid_unix: typing.Optional[int] = None
+ pay_url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Stripe's hosted payment page, only while open.
+ """
+
+ pdf_url: typing.Optional[str] = None
+ lines: typing.List[ResellerInvoiceLine]
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/reseller_invoice_line.py b/src/elevenlabs/types/reseller_invoice_line.py
new file mode 100644
index 000000000..3a32db7f6
--- /dev/null
+++ b/src/elevenlabs/types/reseller_invoice_line.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_invoice_line_kind import ResellerInvoiceLineKind
+
+
+class ResellerInvoiceLine(UncheckedBaseModel):
+ """
+ One line of the workspace's invoice; an `adjustment` line covers any remainder, so lines sum to the charge.
+ """
+
+ kind: ResellerInvoiceLineKind
+ description: str
+ quantity: typing.Optional[int] = None
+ amount_cents: int = pydantic.Field()
+ """
+ Negative for a proration credit.
+ """
+
+ period_start_unix: int
+ period_end_unix: int
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/reseller_invoice_line_kind.py b/src/elevenlabs/types/reseller_invoice_line_kind.py
new file mode 100644
index 000000000..3e041c4ac
--- /dev/null
+++ b/src/elevenlabs/types/reseller_invoice_line_kind.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ResellerInvoiceLineKind = typing.Union[
+ typing.Literal["plan", "telephony", "overage", "proration", "adjustment"], typing.Any
+]
diff --git a/src/elevenlabs/types/reseller_invoice_status.py b/src/elevenlabs/types/reseller_invoice_status.py
new file mode 100644
index 000000000..47fd9daf7
--- /dev/null
+++ b/src/elevenlabs/types/reseller_invoice_status.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ResellerInvoiceStatus = typing.Union[typing.Literal["paid", "open", "void"], typing.Any]
diff --git a/src/elevenlabs/types/reseller_invoice_summary.py b/src/elevenlabs/types/reseller_invoice_summary.py
new file mode 100644
index 000000000..4f8839adf
--- /dev/null
+++ b/src/elevenlabs/types/reseller_invoice_summary.py
@@ -0,0 +1,46 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_invoice_status import ResellerInvoiceStatus
+
+
+class ResellerInvoiceSummary(UncheckedBaseModel):
+ """
+ One charge to the reseller's card, paying for one workspace's invoice.
+ """
+
+ invoice_id: str
+ workspace_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The workspace this charge paid for.
+ """
+
+ workspace_name: str
+ status: ResellerInvoiceStatus
+ amount_cents: int = pydantic.Field()
+ """
+ Invoice total, in the currency's minor unit.
+ """
+
+ currency: str
+ created_unix: int
+ paid_unix: typing.Optional[int] = None
+ pay_url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Stripe's hosted payment page, only while open.
+ """
+
+ pdf_url: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_committed_transcript.py b/src/elevenlabs/types/reseller_invoices_response.py
similarity index 66%
rename from src/elevenlabs/types/dubbing_committed_transcript.py
rename to src/elevenlabs/types/reseller_invoices_response.py
index d80d01347..7a21a817b 100644
--- a/src/elevenlabs/types/dubbing_committed_transcript.py
+++ b/src/elevenlabs/types/reseller_invoices_response.py
@@ -5,15 +5,13 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_invoice_summary import ResellerInvoiceSummary
-class DubbingCommittedTranscript(UncheckedBaseModel):
- message_type: typing.Literal["committed_transcript"] = "committed_transcript"
- text: str
- segment_id: str
- start_s: float
- end_s: float
- speaker_id: str
+class ResellerInvoicesResponse(UncheckedBaseModel):
+ invoices: typing.List[ResellerInvoiceSummary]
+ next_cursor: typing.Optional[str] = None
+ has_more: typing.Optional[bool] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/reseller_tier_response.py b/src/elevenlabs/types/reseller_tier_response.py
new file mode 100644
index 000000000..295b725c3
--- /dev/null
+++ b/src/elevenlabs/types/reseller_tier_response.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_tier_economics import SmbTierEconomics
+
+
+class ResellerTierResponse(UncheckedBaseModel):
+ """
+ A tier as the public API shows it: the offer, not the record derived from it.
+ """
+
+ tier_id: str
+ display_name: str
+ tier_economics: SmbTierEconomics
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/reseller_upcoming_payment.py b/src/elevenlabs/types/reseller_upcoming_payment.py
new file mode 100644
index 000000000..c732d2a7e
--- /dev/null
+++ b/src/elevenlabs/types/reseller_upcoming_payment.py
@@ -0,0 +1,36 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_workspace_subscription import ResellerWorkspaceSubscription
+
+
+class ResellerUpcomingPayment(UncheckedBaseModel):
+ """
+ A workspace's next renewal, estimated before Stripe drafts the invoice.
+ """
+
+ workspace_id: str
+ workspace_name: str
+ subscription: ResellerWorkspaceSubscription
+ plan_usd: float = pydantic.Field()
+ """
+ The plan the renewal charges upfront: the pending downgrade's tier when there is one.
+ """
+
+ overage_so_far_usd: float = pydantic.Field()
+ """
+ This period's usage beyond its included minutes so far, charged at the renewal and still growing.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/dubbing_audio_output_error.py b/src/elevenlabs/types/reseller_upcoming_payments_response.py
similarity index 74%
rename from src/elevenlabs/types/dubbing_audio_output_error.py
rename to src/elevenlabs/types/reseller_upcoming_payments_response.py
index 619943866..2bc4577f2 100644
--- a/src/elevenlabs/types/dubbing_audio_output_error.py
+++ b/src/elevenlabs/types/reseller_upcoming_payments_response.py
@@ -5,11 +5,11 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_upcoming_payment import ResellerUpcomingPayment
-class DubbingAudioOutputError(UncheckedBaseModel):
- message_type: typing.Literal["audio_output_error"] = "audio_output_error"
- error: str
+class ResellerUpcomingPaymentsResponse(UncheckedBaseModel):
+ payments: typing.List[ResellerUpcomingPayment]
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/reseller_workspace_subscription.py b/src/elevenlabs/types/reseller_workspace_subscription.py
new file mode 100644
index 000000000..f42426e5c
--- /dev/null
+++ b/src/elevenlabs/types/reseller_workspace_subscription.py
@@ -0,0 +1,54 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_workspace_subscription_billing_period import ResellerWorkspaceSubscriptionBillingPeriod
+
+
+class ResellerWorkspaceSubscription(UncheckedBaseModel):
+ """
+ A reseller-managed paid subscription, as the reseller can act on it.
+
+ Present only for a workspace the reseller actually sells to: untiered and
+ trial workspaces have no subscription to change or end, and are assigned to
+ instead. Projected from ``SMBBillingState`` rather than read from Stripe,
+ so it is the same state the grant path wrote.
+ """
+
+ tier_id: str
+ billing_period: typing.Optional[ResellerWorkspaceSubscriptionBillingPeriod] = pydantic.Field(default=None)
+ """
+ Cadence being billed. None only for a subscription mid-provisioning.
+ """
+
+ billing_period_end_unix: int = pydantic.Field()
+ """
+ When the current period ends, and so when a deferred change lands.
+ """
+
+ cancel_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ When Stripe will end the subscription. Set means a pending unassignment the reseller can still undo.
+ """
+
+ pending_downgrade_tier: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Tier this workspace drops to at the period boundary, if a downgrade is already scheduled.
+ """
+
+ pending_downgrade_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ When that scheduled downgrade takes effect.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/reseller_workspace_subscription_billing_period.py b/src/elevenlabs/types/reseller_workspace_subscription_billing_period.py
new file mode 100644
index 000000000..847bb4fcc
--- /dev/null
+++ b/src/elevenlabs/types/reseller_workspace_subscription_billing_period.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ResellerWorkspaceSubscriptionBillingPeriod = typing.Union[typing.Literal["monthly_period", "annual_period"], typing.Any]
diff --git a/src/elevenlabs/types/reseller_workspace_summary.py b/src/elevenlabs/types/reseller_workspace_summary.py
new file mode 100644
index 000000000..43631c47f
--- /dev/null
+++ b/src/elevenlabs/types/reseller_workspace_summary.py
@@ -0,0 +1,35 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_workspace_subscription import ResellerWorkspaceSubscription
+
+
+class ResellerWorkspaceSummary(UncheckedBaseModel):
+ workspace_id: str
+ business_name: str
+ billing_tier: typing.Optional[str] = None
+ receptionist_count: int
+ calls_last_30_days: int
+ created_at_unix: int
+ subscription: typing.Optional[ResellerWorkspaceSubscription] = pydantic.Field(default=None)
+ """
+ The reseller-managed subscription, when this workspace has one. None means nothing is sold here yet and a tier can be assigned.
+ """
+
+ has_payment_issue: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ A charge for this workspace is unpaid. Assigning or changing a tier is refused until it clears, so surface it rather than letting it fail.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/reseller_workspaces_response.py b/src/elevenlabs/types/reseller_workspaces_response.py
new file mode 100644
index 000000000..f13877232
--- /dev/null
+++ b/src/elevenlabs/types/reseller_workspaces_response.py
@@ -0,0 +1,23 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .reseller_workspace_summary import ResellerWorkspaceSummary
+
+
+class ResellerWorkspacesResponse(UncheckedBaseModel):
+ workspaces: typing.List[ResellerWorkspaceSummary]
+ next_cursor: typing.Optional[str] = None
+ has_more: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/rule_priority.py b/src/elevenlabs/types/rule_priority.py
new file mode 100644
index 000000000..ceaed3063
--- /dev/null
+++ b/src/elevenlabs/types/rule_priority.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+RulePriority = typing.Union[typing.Literal["strict", "suggestion"], typing.Any]
diff --git a/src/elevenlabs/types/service_location_type.py b/src/elevenlabs/types/service_location_type.py
new file mode 100644
index 000000000..a53df60dc
--- /dev/null
+++ b/src/elevenlabs/types/service_location_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+ServiceLocationType = typing.Union[typing.Literal["business", "customer"], typing.Any]
diff --git a/src/elevenlabs/types/dubbing_end_of_stream.py b/src/elevenlabs/types/service_update_response.py
similarity index 73%
rename from src/elevenlabs/types/dubbing_end_of_stream.py
rename to src/elevenlabs/types/service_update_response.py
index 32a23c68c..e8abd37e2 100644
--- a/src/elevenlabs/types/dubbing_end_of_stream.py
+++ b/src/elevenlabs/types/service_update_response.py
@@ -5,10 +5,12 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_service_db_model import SmbServiceDbModel
-class DubbingEndOfStream(UncheckedBaseModel):
- message_type: typing.Literal["end_of_stream"] = "end_of_stream"
+class ServiceUpdateResponse(UncheckedBaseModel):
+ service: typing.Optional[SmbServiceDbModel] = None
+ has_affected_events: bool
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/smb_add_on.py b/src/elevenlabs/types/smb_add_on.py
new file mode 100644
index 000000000..a8bc898d9
--- /dev/null
+++ b/src/elevenlabs/types/smb_add_on.py
@@ -0,0 +1,48 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+
+
+class SmbAddOn(UncheckedBaseModel):
+ """
+ A standalone add-on that can be tacked onto a service or rental booking.
+
+ An add-on is a small, free-form extra (e.g. "Hot towel", "Valet parking")
+ that extends the parent booking's duration and total price without
+ creating a separate calendar event.
+ """
+
+ id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Stable identifier used by booking requests and calendar snapshots. Survives name/price edits, so rebooking and reporting stay consistent.
+ """
+
+ name: StrippedStr
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Short owner-authored blurb shown to customers and voice agents when they're choosing add-ons. Empty string means no description.
+ """
+
+ add_duration_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Minutes added to the parent booking when this add-on is selected.
+ """
+
+ add_price: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ Amount added to the parent booking's total when this add-on is selected.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_agent_info_response.py b/src/elevenlabs/types/smb_agent_info_response.py
new file mode 100644
index 000000000..43b93a6b0
--- /dev/null
+++ b/src/elevenlabs/types/smb_agent_info_response.py
@@ -0,0 +1,62 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .country_code import CountryCode
+from .smb_agent_info_response_currency import SmbAgentInfoResponseCurrency
+from .tool_call_sound_type import ToolCallSoundType
+from .working_hours import WorkingHours
+from .workspace_now import WorkspaceNow
+
+
+class SmbAgentInfoResponse(UncheckedBaseModel):
+ """
+ Response model for agent info with computed workspace_now (flat structure).
+ """
+
+ business_name: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Name of the business.
+ """
+
+ business_country: typing.Optional[CountryCode] = pydantic.Field(default=None)
+ """
+ ISO 3166-1 alpha-2 country code where the business is based (e.g. 'US', 'PL', 'DE').
+ """
+
+ business_description: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ What the business does, given to the receptionist.
+ """
+
+ timezone: typing.Optional[str] = None
+ currency: typing.Optional[SmbAgentInfoResponseCurrency] = pydantic.Field(default=None)
+ """
+ Currency code for all prices (ISO 4217)
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = None
+ tool_call_sound: typing.Optional[ToolCallSoundType] = pydantic.Field(default=None)
+ """
+ Ambient sound played while any receptionist runs a tool (e.g. checking availability or looking up a client), filling the silence callers would otherwise hear. One sound for the whole workspace, because custom webhook and MCP tools are shared by every receptionist. Off when null.
+ """
+
+ id: str
+ created_at_unix: int
+ updated_at_unix: int
+ workspace_now: typing.Optional[WorkspaceNow] = pydantic.Field(default=None)
+ """
+ Current time in workspace timezone, computed on each request.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_agent_info_response_currency.py b/src/elevenlabs/types/smb_agent_info_response_currency.py
new file mode 100644
index 000000000..01b92054c
--- /dev/null
+++ b/src/elevenlabs/types/smb_agent_info_response_currency.py
@@ -0,0 +1,57 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbAgentInfoResponseCurrency = typing.Union[
+ typing.Literal[
+ "USD",
+ "EUR",
+ "GBP",
+ "PLN",
+ "CAD",
+ "AUD",
+ "CHF",
+ "SEK",
+ "NOK",
+ "DKK",
+ "ISK",
+ "CZK",
+ "HUF",
+ "RON",
+ "BGN",
+ "JPY",
+ "CNY",
+ "TWD",
+ "INR",
+ "BRL",
+ "MXN",
+ "KRW",
+ "SGD",
+ "HKD",
+ "NZD",
+ "ZAR",
+ "AED",
+ "SAR",
+ "QAR",
+ "KWD",
+ "ILS",
+ "TRY",
+ "THB",
+ "IDR",
+ "MYR",
+ "PHP",
+ "VND",
+ "BDT",
+ "RUB",
+ "UAH",
+ "CLP",
+ "COP",
+ "ARS",
+ "PEN",
+ "EGP",
+ "NGN",
+ "KES",
+ "PKR",
+ ],
+ typing.Any,
+]
diff --git a/src/elevenlabs/types/smb_agent_target.py b/src/elevenlabs/types/smb_agent_target.py
new file mode 100644
index 000000000..ad69f50f4
--- /dev/null
+++ b/src/elevenlabs/types/smb_agent_target.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbAgentTarget = typing.Union[typing.Literal["customer_facing", "assistant"], typing.Any]
diff --git a/src/elevenlabs/types/smb_asset_scrapable.py b/src/elevenlabs/types/smb_asset_scrapable.py
new file mode 100644
index 000000000..6e3a4e40a
--- /dev/null
+++ b/src/elevenlabs/types/smb_asset_scrapable.py
@@ -0,0 +1,44 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_group_membership import SmbGroupMembership
+from .stripped_str import StrippedStr
+
+
+class SmbAssetScrapable(UncheckedBaseModel):
+ """
+ Scrape-reachable subset of an asset (resource that can be booked).
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal/admin name of the asset, shown in the dashboard and owner notifications.
+ """
+
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Description of the asset.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_create_agent_rule_request.py b/src/elevenlabs/types/smb_create_agent_rule_request.py
new file mode 100644
index 000000000..0de19678a
--- /dev/null
+++ b/src/elevenlabs/types/smb_create_agent_rule_request.py
@@ -0,0 +1,39 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .rule_priority import RulePriority
+from .stripped_str import StrippedStr
+
+
+class SmbCreateAgentRuleRequest(UncheckedBaseModel):
+ """
+ Request model for creating a new agent rule.
+ """
+
+ title: StrippedStr = pydantic.Field()
+ """
+ Title of the rule.
+ """
+
+ description: StrippedStr = pydantic.Field()
+ """
+ What the agent should do, in detail.
+ """
+
+ priority: typing.Optional[RulePriority] = pydantic.Field(default=None)
+ """
+ strict: the agent must always follow the rule; suggestion: a guideline.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_create_holiday_request.py b/src/elevenlabs/types/smb_create_holiday_request.py
new file mode 100644
index 000000000..001439a46
--- /dev/null
+++ b/src/elevenlabs/types/smb_create_holiday_request.py
@@ -0,0 +1,40 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .date_model import DateModel
+from .holiday_type import HolidayType
+from .time_off_type import TimeOffType
+from .time_range_model import TimeRangeModel
+
+
+class SmbCreateHolidayRequest(UncheckedBaseModel):
+ name: str
+ start_date: DateModel
+ end_date: DateModel
+ holiday_type: typing.Optional[HolidayType] = None
+ override_hours: typing.Optional[typing.List[TimeRangeModel]] = pydantic.Field(default=None)
+ """
+ Replacement working hours when holiday_type is 'override'.
+ """
+
+ time_off_type: TimeOffType
+ resource_id: typing.Optional[str] = None
+ location_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ For LOCATION type: the location this closure applies to.
+ """
+
+ reason: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_create_procedure_request.py b/src/elevenlabs/types/smb_create_procedure_request.py
new file mode 100644
index 000000000..271505667
--- /dev/null
+++ b/src/elevenlabs/types/smb_create_procedure_request.py
@@ -0,0 +1,38 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+
+
+class SmbCreateProcedureRequest(UncheckedBaseModel):
+ """
+ Request model for creating a new procedure.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Name of the procedure.
+ """
+
+ trigger: StrippedStr = pydantic.Field()
+ """
+ When the receptionist should run the procedure, in natural language. The receptionist matches caller requests against it, e.g. 'When the caller wants to book an appointment'.
+ """
+
+ body: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Step-by-step instructions, as markdown.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_create_service_request.py b/src/elevenlabs/types/smb_create_service_request.py
new file mode 100644
index 000000000..1c1afdbd1
--- /dev/null
+++ b/src/elevenlabs/types/smb_create_service_request.py
@@ -0,0 +1,119 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .pricing_mode import PricingMode
+from .service_location_type import ServiceLocationType
+from .smb_add_on import SmbAddOn
+from .smb_group_membership import SmbGroupMembership
+from .smb_intake_question import SmbIntakeQuestion
+from .smb_service_kind import SmbServiceKind
+from .smb_service_promotion import SmbServicePromotion
+from .smb_service_variant import SmbServiceVariant
+from .stripped_str import StrippedStr
+
+
+class SmbCreateServiceRequest(UncheckedBaseModel):
+ pricing_mode: typing.Optional[PricingMode] = pydantic.Field(default=None)
+ """
+ 'fixed' (default): the item has a known price the agent can quote, and customers can book or order it directly. 'quote': the price depends on the job (renovation, catering, custom work), so no price or slot is offered; the agent collects the intake_questions and files a quote request instead. Takes effect only while quotes are enabled for the business. Group services cannot use 'quote'.
+ """
+
+ intake_questions: typing.Optional[typing.List[SmbIntakeQuestion]] = pydantic.Field(default=None)
+ """
+ Questions the agent asks before booking or ordering this item. Required for a useful ``pricing_mode='quote'`` item -- without them a quote request arrives with nothing to price -- but also valid on fixed-price items that need extra detail (current hair color before a dye job, allergies before a treatment).
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr
+ description: typing.Optional[StrippedStr] = None
+ variants: typing.Optional[typing.List[SmbServiceVariant]] = pydantic.Field(default=None)
+ """
+ Bookable options for this service. Always non-empty; ``variants[0]`` is the default option shown when callers don't pick a specific variant. Each entry has its own duration and (optional) price, and uniqueness is keyed by duration.
+ """
+
+ kind: typing.Optional[SmbServiceKind] = pydantic.Field(default=None)
+ """
+ Classic = staff-delivered; rental = asset-based; group = multi-participant session. Populated by the extraction category.
+ """
+
+ buffer_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Turnover/cleanup time reserved after each booking. Applies to every service kind; default 0 means no buffer.
+ """
+
+ service_location: typing.Optional[ServiceLocationType] = pydantic.Field(default=None)
+ """
+ Where the service is delivered. ``business`` = client visits the business location (default); ``customer`` = staff travels to the client. Only meaningful for ``kind='classic'``.
+ """
+
+ add_ons: typing.Optional[typing.List[SmbAddOn]] = pydantic.Field(default=None)
+ """
+ Optional extras scraped from the website that can be attached to a booking of this service.
+ """
+
+ max_participants: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Capacity for ``kind='group'``: how many seats a single session can sell across all registrations. Must be ``None`` for classic and rental services (those are always exclusive to one client per booking).
+ """
+
+ capacity: typing.Optional[int] = None
+ is_active: typing.Optional[bool] = None
+ any_staff_member: typing.Optional[bool] = None
+ staff_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Staff assigned to this service; must be empty for kind='rental'.
+ """
+
+ asset_ids: typing.Optional[typing.List[str]] = None
+ advance_booking_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ How far into the future customer-facing channels (public booking page, voice agent) may book this service. Applies to every kind.
+ """
+
+ location_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Locations where this service is offered; empty list means all locations.
+ """
+
+ display_on_booking_page: typing.Optional[bool] = None
+ travel_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Travel time in minutes added before/after appointments for customer-location services. Blocks the staff member's calendar but is not visible to the customer. Ignored when ``service_location='business'``.
+ """
+
+ travel_before: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Add travel time before the appointment (outbound trip).
+ """
+
+ travel_after: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Add travel time after the appointment (return trip).
+ """
+
+ promotions: typing.Optional[typing.List[SmbServicePromotion]] = pydantic.Field(default=None)
+ """
+ Time-bound discounts applicable to this service or specific variants.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_create_staff_request.py b/src/elevenlabs/types/smb_create_staff_request.py
new file mode 100644
index 000000000..1fec52d66
--- /dev/null
+++ b/src/elevenlabs/types/smb_create_staff_request.py
@@ -0,0 +1,83 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .phone_number_optional import PhoneNumberOptional
+from .smb_group_membership import SmbGroupMembership
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class SmbCreateStaffRequest(UncheckedBaseModel):
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal/admin name of the staff member, shown in the dashboard and owner notifications.
+ """
+
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Description or bio of the staff member.
+ """
+
+ is_active: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the staff member can be booked. Inactive staff keep their booking history.
+ """
+
+ email: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Email address of the staff member.
+ """
+
+ phone: typing.Optional[PhoneNumberOptional] = pydantic.Field(default=None)
+ """
+ Phone number of the staff member. Without a country code, +1 (US) is assumed.
+ """
+
+ sms_notifications_opted_in: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether this staff member currently receives SMS booking notifications. Defaults to opted out — a staff member must be explicitly opted in (mirroring the client SMS default); flipped to False automatically when they reply STOP to the workspace number.
+ """
+
+ photo_url: typing.Optional[str] = None
+ location_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Location this staff member is assigned to; empty means available at all locations.
+ """
+
+ working_hours: typing.Optional[WorkingHours] = pydantic.Field(default=None)
+ """
+ Custom working hours for this staff member. None means follow the assigned location's operating_hours (requires location_id).
+ """
+
+ display_on_booking_page: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether customers can see and pick this staff member by name on the booking page. False keeps them bookable, just not shown by name.
+ """
+
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Optional public-facing label. When empty, `name` is shown to customers too. `name` stays the internal/admin label used in the dashboard and business-owner notifications.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_create_transfer_rule_request.py b/src/elevenlabs/types/smb_create_transfer_rule_request.py
new file mode 100644
index 000000000..b08971bfd
--- /dev/null
+++ b/src/elevenlabs/types/smb_create_transfer_rule_request.py
@@ -0,0 +1,44 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .phone_number import PhoneNumber
+from .stripped_str import StrippedStr
+
+
+class SmbCreateTransferRuleRequest(UncheckedBaseModel):
+ """
+ Request model for creating a new transfer rule.
+ """
+
+ label: StrippedStr = pydantic.Field()
+ """
+ Name of the transfer destination, e.g. 'Alvin' or 'Billing team'.
+ """
+
+ phone_number: PhoneNumber = pydantic.Field()
+ """
+ Number to transfer to. Without a country code it is dialed locally in the business's country, so include the country code for a number abroad.
+ """
+
+ condition: StrippedStr = pydantic.Field()
+ """
+ What the caller does that triggers the transfer, e.g. 'The caller asks to speak to a human or to Alvin'. Describe only the trigger; do not restate the phone number or the word 'transfer'.
+ """
+
+ post_dial_digits: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ DTMF digits automatically played after the transfer destination picks up (e.g. '1' to answer a 'press 1 to accept' screen, or 'www1234' to key an extension after a pause). Valid characters are 0-9, *, #, w (0.5s pause) and W (1s pause). Twilio transfers only.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_customer_facing_agent.py b/src/elevenlabs/types/smb_customer_facing_agent.py
new file mode 100644
index 000000000..6727a486a
--- /dev/null
+++ b/src/elevenlabs/types/smb_customer_facing_agent.py
@@ -0,0 +1,44 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .customer_facing_config_input import CustomerFacingConfigInput
+from .smb_customer_facing_agent_deactivation_reason import SmbCustomerFacingAgentDeactivationReason
+
+
+class SmbCustomerFacingAgent(UncheckedBaseModel):
+ """
+ A single customer-facing receptionist agent.
+
+ A workspace can have multiple of these. Each entry owns its own ConvAI
+ agent id and full ``CustomerFacingConfig`` (voice, language, first message,
+ system tool toggles, agent rules, transfer rules).
+ """
+
+ agent_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ ConvAI agent id. Empty string is the placeholder seeded by the legacy API validator when migrating a single-agent payload; the agent-owning service resolves it from the workspace assignment.
+ """
+
+ config: typing.Optional[CustomerFacingConfigInput] = None
+ deactivated_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Unix timestamp when this receptionist was deactivated. None when active.
+ """
+
+ deactivation_reason: typing.Optional[SmbCustomerFacingAgentDeactivationReason] = pydantic.Field(default=None)
+ """
+ Why this receptionist was deactivated. None when active.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_customer_facing_agent_deactivation_reason.py b/src/elevenlabs/types/smb_customer_facing_agent_deactivation_reason.py
new file mode 100644
index 000000000..e63b60b14
--- /dev/null
+++ b/src/elevenlabs/types/smb_customer_facing_agent_deactivation_reason.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbCustomerFacingAgentDeactivationReason = typing.Union[typing.Literal["tier_downgrade", "user"], typing.Any]
diff --git a/src/elevenlabs/types/smb_customer_facing_agent_response.py b/src/elevenlabs/types/smb_customer_facing_agent_response.py
new file mode 100644
index 000000000..d0771e58d
--- /dev/null
+++ b/src/elevenlabs/types/smb_customer_facing_agent_response.py
@@ -0,0 +1,63 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .customer_facing_config_output import CustomerFacingConfigOutput
+from .smb_customer_facing_agent_deactivation_reason import SmbCustomerFacingAgentDeactivationReason
+from .smb_widget_appearance import SmbWidgetAppearance
+
+
+class SmbCustomerFacingAgentResponse(UncheckedBaseModel):
+ """
+ API response model that adds the display name from the ConvAI agent doc.
+ """
+
+ agent_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ ConvAI agent id. Empty string is the placeholder seeded by the legacy API validator when migrating a single-agent payload; the agent-owning service resolves it from the workspace assignment.
+ """
+
+ config: typing.Optional[CustomerFacingConfigOutput] = None
+ deactivated_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Unix timestamp when this receptionist was deactivated. None when active.
+ """
+
+ deactivation_reason: typing.Optional[SmbCustomerFacingAgentDeactivationReason] = pydantic.Field(default=None)
+ """
+ Why this receptionist was deactivated. None when active.
+ """
+
+ name: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Display name read from the ConvAI agent document (the single source of truth).
+ """
+
+ agent_exists: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the underlying ConvAI agent document still exists. False when the receptionist references a deleted agent and needs repair.
+ """
+
+ is_transfer_allowed: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether this receptionist can configure and use transfer rules.
+ """
+
+ widget: typing.Optional[SmbWidgetAppearance] = pydantic.Field(default=None)
+ """
+ How the website widget looks, read from the ConvAI agent's platform settings. Null when the agent document is missing. Unset labels mean the widget follows the agent's own language.
+ """
+
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_group_membership.py b/src/elevenlabs/types/smb_group_membership.py
new file mode 100644
index 000000000..d40878b85
--- /dev/null
+++ b/src/elevenlabs/types/smb_group_membership.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+
+
+class SmbGroupMembership(UncheckedBaseModel):
+ """
+ Membership of an item in a single user-defined group, with its display
+ rank inside that group.
+
+ `rank` is the 0-based position the item occupies within the group's
+ section in the dashboard. Items default to rank 0 when added to a group
+ and are rewritten by the dedicated reorder endpoints.
+ """
+
+ label: StrippedStr
+ rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ 0-based display position within this group in the dashboard. Change it with the reorder endpoint; send back the value you read to keep the order, a membership sent without it goes to position 0.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_identity_verification_config.py b/src/elevenlabs/types/smb_identity_verification_config.py
new file mode 100644
index 000000000..48de2a4cc
--- /dev/null
+++ b/src/elevenlabs/types/smb_identity_verification_config.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_notification_channel import SmbNotificationChannel
+
+
+class SmbIdentityVerificationConfig(UncheckedBaseModel):
+ """
+ Per-agent (receptionist) configuration for client identity verification codes.
+ """
+
+ enabled: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, the receptionist may only look up or modify a client's appointments and records after that client has completed OTP identity verification in this conversation.
+ """
+
+ channels: typing.Optional[typing.List[SmbNotificationChannel]] = None
+ sms_phone_number_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Twilio phone number ID used to send SMS verification codes.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_intake_question.py b/src/elevenlabs/types/smb_intake_question.py
new file mode 100644
index 000000000..2f5392596
--- /dev/null
+++ b/src/elevenlabs/types/smb_intake_question.py
@@ -0,0 +1,55 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .intake_question_kind import IntakeQuestionKind
+from .stripped_str import StrippedStr
+
+
+class SmbIntakeQuestion(UncheckedBaseModel):
+ """
+ One owner-authored question the agent asks before booking/ordering this item.
+
+ This is the structured counterpart to the agent-wide
+ ``CustomerFacingConfig.details_to_collect``: scoped to a single catalog
+ item, and typed so the answer is usable afterwards (rendered in the inbox,
+ filterable, and eventually an input to pricing) rather than just readable.
+ """
+
+ id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Stable identifier referenced by stored answers. Survives label edits so history stays attributable to the right question.
+ """
+
+ label: StrippedStr = pydantic.Field()
+ """
+ The question as the agent should ask it, e.g. 'How many rooms?'. Phrased by the owner; the agent may rephrase for conversational flow but must not change what is being asked.
+ """
+
+ kind: typing.Optional[IntakeQuestionKind] = None
+ options: typing.Optional[typing.List[StrippedStr]] = pydantic.Field(default=None)
+ """
+ Allowed answers for ``kind='choice'``. Must be empty for the other kinds.
+ """
+
+ required: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ On the public booking page this is enforced as a form constraint. On a voice call it is only an instruction to the agent: hard-rejecting a booking mid-conversation because the caller dodged a question is worse for the caller than a booking with a gap the owner can chase. Do not 'fix' this into a server-side constraint for the voice path.
+ """
+
+ is_active: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Retired questions are deactivated rather than deleted, so answers already stored against them keep resolving.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_knowledge_source_db_model.py b/src/elevenlabs/types/smb_knowledge_source_db_model.py
new file mode 100644
index 000000000..1b9d081b7
--- /dev/null
+++ b/src/elevenlabs/types/smb_knowledge_source_db_model.py
@@ -0,0 +1,51 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.serialization import FieldMetadata
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .ingest_failure import IngestFailure
+from .knowledge_source_status import KnowledgeSourceStatus
+from .knowledge_source_type import KnowledgeSourceType
+from .unix_timestamp import UnixTimestamp
+
+
+class SmbKnowledgeSourceDbModel(UncheckedBaseModel):
+ """
+ Database model for knowledge sources (files and URLs).
+
+ Inherits:
+ - id, workspace_id, from_db, to_db from BaseMongoDBModel
+ - owner_user_id from NonSharableCollectionMixin
+ - created_at_unix, updated_at_unix from SMBResourceDBModel
+ - source_type, source_url, etc. from SMBKnowledgeSourceBase
+ """
+
+ source_type: typing.Optional[KnowledgeSourceType] = None
+ source_url: typing.Optional[str] = None
+ last_scraped_at_unix: typing.Optional[int] = None
+ original_filename: typing.Optional[str] = None
+ content_type: typing.Optional[str] = None
+ file_size_bytes: typing.Optional[int] = None
+ status: typing.Optional[KnowledgeSourceStatus] = None
+ error_message: typing.Optional[str] = None
+ failure_reason: typing.Optional[IngestFailure] = None
+ crawl_entire_site: typing.Optional[bool] = None
+ scraped_pages_count: typing.Optional[int] = None
+ content_preview: typing.Optional[str] = None
+ processing_started_at_unix: typing.Optional[int] = None
+ id: typing_extensions.Annotated[str, FieldMetadata(alias="_id"), pydantic.Field(alias="_id")]
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+ updated_at_unix: typing.Optional[UnixTimestamp] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_location_deactivation_reason.py b/src/elevenlabs/types/smb_location_deactivation_reason.py
new file mode 100644
index 000000000..39a2be956
--- /dev/null
+++ b/src/elevenlabs/types/smb_location_deactivation_reason.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbLocationDeactivationReason = typing.Union[typing.Literal["tier_downgrade", "user"], typing.Any]
diff --git a/src/elevenlabs/types/smb_location_input.py b/src/elevenlabs/types/smb_location_input.py
new file mode 100644
index 000000000..24434501a
--- /dev/null
+++ b/src/elevenlabs/types/smb_location_input.py
@@ -0,0 +1,62 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_location_deactivation_reason import SmbLocationDeactivationReason
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class SmbLocationInput(UncheckedBaseModel):
+ """
+ A single business location stored inline in agent info.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal name, e.g. 'Main Office' or 'Downtown Branch', shown in the dashboard and owner notifications.
+ """
+
+ address: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Street address.
+ """
+
+ notes: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Directions or other notes for customers, e.g. 'Free parking behind the building'.
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = None
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Name shown to customers; empty reuses name.
+ """
+
+ max_concurrent_appointments: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Maximum number of appointments that may overlap at this location at a single instant. Only enforced while the booking page setting concurrent_limit_enabled is on.
+ """
+
+ id: str
+ deactivated_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Unix timestamp when this location was deactivated. None when active.
+ """
+
+ deactivation_reason: typing.Optional[SmbLocationDeactivationReason] = pydantic.Field(default=None)
+ """
+ Why this location was deactivated. None when active.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_location_output.py b/src/elevenlabs/types/smb_location_output.py
new file mode 100644
index 000000000..e1ef22aa9
--- /dev/null
+++ b/src/elevenlabs/types/smb_location_output.py
@@ -0,0 +1,64 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_location_deactivation_reason import SmbLocationDeactivationReason
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class SmbLocationOutput(UncheckedBaseModel):
+ """
+ A single business location stored inline in agent info.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal name, e.g. 'Main Office' or 'Downtown Branch', shown in the dashboard and owner notifications.
+ """
+
+ address: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Street address.
+ """
+
+ notes: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Directions or other notes for customers, e.g. 'Free parking behind the building'.
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = None
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Name shown to customers; empty reuses name.
+ """
+
+ max_concurrent_appointments: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Maximum number of appointments that may overlap at this location at a single instant. Only enforced while the booking page setting concurrent_limit_enabled is on.
+ """
+
+ id: str
+ deactivated_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Unix timestamp when this location was deactivated. None when active.
+ """
+
+ deactivation_reason: typing.Optional[SmbLocationDeactivationReason] = pydantic.Field(default=None)
+ """
+ Why this location was deactivated. None when active.
+ """
+
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_location_request.py b/src/elevenlabs/types/smb_location_request.py
new file mode 100644
index 000000000..90b55942c
--- /dev/null
+++ b/src/elevenlabs/types/smb_location_request.py
@@ -0,0 +1,56 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class SmbLocationRequest(UncheckedBaseModel):
+ """
+ Request model for creating or updating a location.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal name, e.g. 'Main Office' or 'Downtown Branch', shown in the dashboard and owner notifications.
+ """
+
+ address: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Street address.
+ """
+
+ notes: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Directions or other notes for customers, e.g. 'Free parking behind the building'.
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = pydantic.Field(default=None)
+ """
+ Per-location operating hours. On create, omit to have the server prefill from the most recently added active location.
+ """
+
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Name shown to customers; empty reuses name.
+ """
+
+ max_concurrent_appointments: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Maximum number of appointments that may overlap at this location at a single instant. Only enforced while the booking page setting concurrent_limit_enabled is on.
+ """
+
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_location_request_patch.py b/src/elevenlabs/types/smb_location_request_patch.py
new file mode 100644
index 000000000..9a67619f2
--- /dev/null
+++ b/src/elevenlabs/types/smb_location_request_patch.py
@@ -0,0 +1,52 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class SmbLocationRequestPatch(UncheckedBaseModel):
+ name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Internal name, e.g. 'Main Office' or 'Downtown Branch', shown in the dashboard and owner notifications.
+ """
+
+ address: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Street address.
+ """
+
+ notes: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Directions or other notes for customers, e.g. 'Free parking behind the building'.
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = pydantic.Field(default=None)
+ """
+ Per-location operating hours. On create, omit to have the server prefill from the most recently added active location.
+ """
+
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Name shown to customers; empty reuses name.
+ """
+
+ max_concurrent_appointments: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Maximum number of appointments that may overlap at this location at a single instant. Only enforced while the booking page setting concurrent_limit_enabled is on.
+ """
+
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_notification_channel.py b/src/elevenlabs/types/smb_notification_channel.py
new file mode 100644
index 000000000..82d57b1e8
--- /dev/null
+++ b/src/elevenlabs/types/smb_notification_channel.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbNotificationChannel = typing.Union[typing.Literal["email", "sms"], typing.Any]
diff --git a/src/elevenlabs/types/smb_phone_assignment_db_model.py b/src/elevenlabs/types/smb_phone_assignment_db_model.py
new file mode 100644
index 000000000..7c249e28d
--- /dev/null
+++ b/src/elevenlabs/types/smb_phone_assignment_db_model.py
@@ -0,0 +1,90 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.serialization import FieldMetadata
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .application_number_type import ApplicationNumberType
+from .country_code import CountryCode
+from .phone_number import PhoneNumber
+from .smb_phone_assignment_db_model_provider import SmbPhoneAssignmentDbModelProvider
+from .smb_phone_assignment_deactivation_reason import SmbPhoneAssignmentDeactivationReason
+from .smb_phone_regulatory_status import SmbPhoneRegulatoryStatus
+from .unix_timestamp import UnixTimestamp
+
+
+class SmbPhoneAssignmentDbModel(UncheckedBaseModel):
+ """
+ Persisted phone assignment; see ``SMBPhoneAssignmentBase`` for field semantics.
+ """
+
+ phone_number: typing.Optional[PhoneNumber] = pydantic.Field(default=None)
+ """
+ Phone number in E.164 format (for indexing/filtering)
+ """
+
+ is_byo: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ True when the phone is bring-your-own: registered by the workspace using their own telephony provider (Twilio credentials or SIP trunk). BYO phones are never part of the shared pool, do not count against the tier-based phone quota, and are deleted (rather than returned to the pool) on release.
+ """
+
+ provider: typing.Optional[SmbPhoneAssignmentDbModelProvider] = pydantic.Field(default=None)
+ """
+ Telephony provider for this phone number. Defaults to twilio for backwards compatibility with existing documents.
+ """
+
+ nanp_area_code: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ US/Canada NANP area code (NPA) as an integer.
+ """
+
+ customer_facing_agent_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Determines assignment status: None = pool (unassigned), non-None = assigned to this customer-facing agent. When set, inbound calls to this phone route to that agent.
+ """
+
+ deactivated_at_unix: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Unix timestamp when this assignment was deactivated. Drives the per-assignment 14-day grace cleanup. None when active.
+ """
+
+ deactivation_reason: typing.Optional[SmbPhoneAssignmentDeactivationReason] = pydantic.Field(default=None)
+ """
+ Why this assignment was deactivated. None when active.
+ """
+
+ regulatory_status: typing.Optional[SmbPhoneRegulatoryStatus] = pydantic.Field(default=None)
+ """
+ None for numbers from countries with no regulatory requirements. 'held' while the workspace's own application is under review, 'approved' once it passed and the number is fully usable.
+ """
+
+ regulatory_number_type: typing.Optional[ApplicationNumberType] = pydantic.Field(default=None)
+ """
+ Which regulated type this number was issued as. Set on numbers bought in a country that needs paperwork, so the request form can open on the type the workspace already holds. None for pool numbers, which need no application.
+ """
+
+ regulatory_country: typing.Optional[CountryCode] = pydantic.Field(default=None)
+ """
+ ISO country the regulated number was bought in. Recorded so a held number can be matched to the application it belongs to without inferring the country from the dialing prefix. None for pool numbers.
+ """
+
+ id: typing_extensions.Annotated[str, FieldMetadata(alias="_id"), pydantic.Field(alias="_id")]
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+ updated_at_unix: typing.Optional[UnixTimestamp] = None
+ is_active: typing.Optional[bool] = None
+ accepts_public_calls: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether inbound calls from the public may reach the agent.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_phone_assignment_db_model_provider.py b/src/elevenlabs/types/smb_phone_assignment_db_model_provider.py
new file mode 100644
index 000000000..0e432af0f
--- /dev/null
+++ b/src/elevenlabs/types/smb_phone_assignment_db_model_provider.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbPhoneAssignmentDbModelProvider = typing.Union[typing.Literal["twilio", "sip_trunk"], typing.Any]
diff --git a/src/elevenlabs/types/smb_phone_assignment_deactivation_reason.py b/src/elevenlabs/types/smb_phone_assignment_deactivation_reason.py
new file mode 100644
index 000000000..64ef9d321
--- /dev/null
+++ b/src/elevenlabs/types/smb_phone_assignment_deactivation_reason.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbPhoneAssignmentDeactivationReason = typing.Union[
+ typing.Literal["tier_downgrade", "no_entitlement", "user"], typing.Any
+]
diff --git a/src/elevenlabs/types/smb_phone_regulatory_status.py b/src/elevenlabs/types/smb_phone_regulatory_status.py
new file mode 100644
index 000000000..10c163dbb
--- /dev/null
+++ b/src/elevenlabs/types/smb_phone_regulatory_status.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbPhoneRegulatoryStatus = typing.Union[typing.Literal["held", "approved"], typing.Any]
diff --git a/src/elevenlabs/types/smb_procedure.py b/src/elevenlabs/types/smb_procedure.py
new file mode 100644
index 000000000..a55e1e78b
--- /dev/null
+++ b/src/elevenlabs/types/smb_procedure.py
@@ -0,0 +1,55 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+from .unix_timestamp import UnixTimestamp
+
+
+class SmbProcedure(UncheckedBaseModel):
+ """
+ A standard operating procedure (SOP) the receptionist can run on calls.
+
+ Like :class:`AgentRule`, this is user-owned config that lives on the agent's
+ :class:`CustomerFacingConfig` in agent-info. It is materialized into the
+ agents-cluster procedure store lazily, on the next agent rebuild. ``id`` is
+ the stable convai ``procedure_id`` so it survives rebuilds and version bumps.
+
+ ``body`` becomes the procedure's content.
+
+ ``source_key`` is set when the procedure was copied from an integration.
+ It is ``{provider_id}-{template_key}`` and is never translated, so the
+ settings UI can tell the copy from one the owner wrote after the name,
+ trigger, and steps have been localized.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Name of the procedure.
+ """
+
+ trigger: StrippedStr = pydantic.Field()
+ """
+ When the receptionist should run the procedure, in natural language. The receptionist matches caller requests against it, e.g. 'When the caller wants to book an appointment'.
+ """
+
+ body: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Step-by-step instructions, as markdown.
+ """
+
+ id: typing.Optional[str] = None
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+ source_key: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_product_scrapable.py b/src/elevenlabs/types/smb_product_scrapable.py
new file mode 100644
index 000000000..63009d169
--- /dev/null
+++ b/src/elevenlabs/types/smb_product_scrapable.py
@@ -0,0 +1,55 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .pricing_mode import PricingMode
+from .smb_group_membership import SmbGroupMembership
+from .stripped_str import StrippedStr
+
+
+class SmbProductScrapable(UncheckedBaseModel):
+ """
+ Scrape-reachable subset of a product (retail/catalog item).
+ """
+
+ pricing_mode: typing.Optional[PricingMode] = pydantic.Field(default=None)
+ """
+ 'fixed' (default): the item has a known price the agent can quote, and customers can book or order it directly. 'quote': the price depends on the job (renovation, catering, custom work), so no price or slot is offered; the agent collects the intake_questions and files a quote request instead. Takes effect only while quotes are enabled for the business. Group services cannot use 'quote'.
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Name of the product.
+ """
+
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Description of the product.
+ """
+
+ price: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ Price of the product; null for no listed price.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_scraping_mode.py b/src/elevenlabs/types/smb_scraping_mode.py
new file mode 100644
index 000000000..876878cff
--- /dev/null
+++ b/src/elevenlabs/types/smb_scraping_mode.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbScrapingMode = typing.Union[typing.Literal["single_page", "deep_scan", "quick_scan"], typing.Any]
diff --git a/src/elevenlabs/types/smb_service_db_model.py b/src/elevenlabs/types/smb_service_db_model.py
new file mode 100644
index 000000000..a1a10e5db
--- /dev/null
+++ b/src/elevenlabs/types/smb_service_db_model.py
@@ -0,0 +1,135 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.serialization import FieldMetadata
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .pricing_mode import PricingMode
+from .service_location_type import ServiceLocationType
+from .smb_add_on import SmbAddOn
+from .smb_group_membership import SmbGroupMembership
+from .smb_intake_question import SmbIntakeQuestion
+from .smb_service_kind import SmbServiceKind
+from .smb_service_promotion import SmbServicePromotion
+from .smb_service_variant import SmbServiceVariant
+from .stripped_str import StrippedStr
+from .unix_timestamp import UnixTimestamp
+
+
+class SmbServiceDbModel(UncheckedBaseModel):
+ """
+ Represents a bookable service (e.g., haircut, massage, consultation).
+ """
+
+ pricing_mode: typing.Optional[PricingMode] = pydantic.Field(default=None)
+ """
+ 'fixed' (default): the item has a known price the agent can quote, and customers can book or order it directly. 'quote': the price depends on the job (renovation, catering, custom work), so no price or slot is offered; the agent collects the intake_questions and files a quote request instead. Takes effect only while quotes are enabled for the business. Group services cannot use 'quote'.
+ """
+
+ intake_questions: typing.Optional[typing.List[SmbIntakeQuestion]] = pydantic.Field(default=None)
+ """
+ Questions the agent asks before booking or ordering this item. Required for a useful ``pricing_mode='quote'`` item -- without them a quote request arrives with nothing to price -- but also valid on fixed-price items that need extra detail (current hair color before a dye job, allergies before a treatment).
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr
+ description: typing.Optional[StrippedStr] = None
+ variants: typing.List[SmbServiceVariant]
+ kind: typing.Optional[SmbServiceKind] = pydantic.Field(default=None)
+ """
+ Classic = staff-delivered; rental = asset-based; group = multi-participant session. Populated by the extraction category.
+ """
+
+ buffer_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Turnover/cleanup time reserved after each booking. Applies to every service kind; default 0 means no buffer.
+ """
+
+ service_location: typing.Optional[ServiceLocationType] = pydantic.Field(default=None)
+ """
+ Where the service is delivered. ``business`` = client visits the business location (default); ``customer`` = staff travels to the client. Only meaningful for ``kind='classic'``.
+ """
+
+ add_ons: typing.Optional[typing.List[SmbAddOn]] = pydantic.Field(default=None)
+ """
+ Optional extras scraped from the website that can be attached to a booking of this service.
+ """
+
+ max_participants: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Capacity for ``kind='group'``: how many seats a single session can sell across all registrations. Must be ``None`` for classic and rental services (those are always exclusive to one client per booking).
+ """
+
+ capacity: typing.Optional[int] = None
+ is_active: typing.Optional[bool] = None
+ any_staff_member: typing.Optional[bool] = None
+ staff_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Staff assigned to this service; must be empty for kind='rental'.
+ """
+
+ asset_ids: typing.Optional[typing.List[str]] = None
+ advance_booking_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ How far into the future customer-facing channels (public booking page, voice agent) may book this service. Applies to every kind.
+ """
+
+ location_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Locations where this service is offered; empty list means all locations.
+ """
+
+ display_on_booking_page: typing.Optional[bool] = None
+ travel_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Travel time in minutes added before/after appointments for customer-location services. Blocks the staff member's calendar but is not visible to the customer. Ignored when ``service_location='business'``.
+ """
+
+ travel_before: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Add travel time before the appointment (outbound trip).
+ """
+
+ travel_after: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Add travel time after the appointment (return trip).
+ """
+
+ promotions: typing.Optional[typing.List[SmbServicePromotion]] = pydantic.Field(default=None)
+ """
+ Time-bound discounts applicable to this service or specific variants.
+ """
+
+ id: typing_extensions.Annotated[str, FieldMetadata(alias="_id"), pydantic.Field(alias="_id")]
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+ updated_at_unix: typing.Optional[UnixTimestamp] = None
+ duration_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Default option's duration; serialized for read compatibility.
+ """
+
+ price: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ Default option's price; serialized for read compatibility.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_service_kind.py b/src/elevenlabs/types/smb_service_kind.py
new file mode 100644
index 000000000..033a6d2a5
--- /dev/null
+++ b/src/elevenlabs/types/smb_service_kind.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbServiceKind = typing.Union[typing.Literal["classic", "rental", "group"], typing.Any]
diff --git a/src/elevenlabs/types/smb_service_promotion.py b/src/elevenlabs/types/smb_service_promotion.py
new file mode 100644
index 000000000..cac766d9b
--- /dev/null
+++ b/src/elevenlabs/types/smb_service_promotion.py
@@ -0,0 +1,60 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .promotion_target import PromotionTarget
+from .stripped_str import StrippedStr
+from .unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6 import (
+ UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6,
+)
+
+
+class SmbServicePromotion(UncheckedBaseModel):
+ """
+ A time-bound promotion on a service/variant or on add-ons.
+ """
+
+ id: typing.Optional[str] = None
+ name: StrippedStr
+ target: typing.Optional[PromotionTarget] = pydantic.Field(default=None)
+ """
+ Whether this promotion targets the service/variant price or add-on prices.
+ """
+
+ variant_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ When set (target=service), the promotion applies only to this variant.
+ """
+
+ add_on_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ When set (target=add_on), the promotion applies only to this add-on.
+ """
+
+ promotional_price: float = pydantic.Field()
+ """
+ The final price when this promotion is applied to a matching line item.
+ """
+
+ days_of_week: typing.Optional[UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6] = (
+ pydantic.Field(default=None)
+ )
+ """
+ Days when the promotion is active (0=Monday, 6=Sunday); empty means every day.
+ """
+
+ start_date: str
+ end_date: str
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_service_scrapable.py b/src/elevenlabs/types/smb_service_scrapable.py
new file mode 100644
index 000000000..43f460709
--- /dev/null
+++ b/src/elevenlabs/types/smb_service_scrapable.py
@@ -0,0 +1,81 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .pricing_mode import PricingMode
+from .service_location_type import ServiceLocationType
+from .smb_add_on import SmbAddOn
+from .smb_group_membership import SmbGroupMembership
+from .smb_service_kind import SmbServiceKind
+from .smb_service_variant import SmbServiceVariant
+from .stripped_str import StrippedStr
+
+
+class SmbServiceScrapable(UncheckedBaseModel):
+ """
+ Scrape-reachable subset of a service (classic, rental or group).
+
+ The extraction pipeline uses one LLM prompt per kind (so the model sees
+ kind-specific guidance), but every code path produces this single shape:
+ onboarding, imports and the unified ``smb_services`` collection all
+ discriminate by the ``kind`` field.
+ """
+
+ pricing_mode: typing.Optional[PricingMode] = pydantic.Field(default=None)
+ """
+ 'fixed' (default): the item has a known price the agent can quote, and customers can book or order it directly. 'quote': the price depends on the job (renovation, catering, custom work), so no price or slot is offered; the agent collects the intake_questions and files a quote request instead. Takes effect only while quotes are enabled for the business. Group services cannot use 'quote'.
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr
+ description: typing.Optional[StrippedStr] = None
+ variants: typing.Optional[typing.List[SmbServiceVariant]] = pydantic.Field(default=None)
+ """
+ Bookable options for this service. Always non-empty; ``variants[0]`` is the default option shown when callers don't pick a specific variant. Each entry has its own duration and (optional) price, and uniqueness is keyed by duration.
+ """
+
+ kind: typing.Optional[SmbServiceKind] = pydantic.Field(default=None)
+ """
+ Classic = staff-delivered; rental = asset-based; group = multi-participant session. Populated by the extraction category.
+ """
+
+ buffer_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Turnover/cleanup time reserved after each booking. Applies to every service kind; default 0 means no buffer.
+ """
+
+ service_location: typing.Optional[ServiceLocationType] = pydantic.Field(default=None)
+ """
+ Where the service is delivered. ``business`` = client visits the business location (default); ``customer`` = staff travels to the client. Only meaningful for ``kind='classic'``.
+ """
+
+ add_ons: typing.Optional[typing.List[SmbAddOn]] = pydantic.Field(default=None)
+ """
+ Optional extras scraped from the website that can be attached to a booking of this service.
+ """
+
+ max_participants: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Capacity for ``kind='group'``: how many seats a single session can sell across all registrations. Must be ``None`` for classic and rental services (those are always exclusive to one client per booking).
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_service_variant.py b/src/elevenlabs/types/smb_service_variant.py
new file mode 100644
index 000000000..a2a6e54d8
--- /dev/null
+++ b/src/elevenlabs/types/smb_service_variant.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class SmbServiceVariant(UncheckedBaseModel):
+ """
+ A variant of a service identified by its duration, with optional price override.
+ """
+
+ id: typing.Optional[str] = None
+ duration_minutes: int
+ price: typing.Optional[float] = None
+ is_active: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_sip_media_encryption.py b/src/elevenlabs/types/smb_sip_media_encryption.py
new file mode 100644
index 000000000..0e99adc3a
--- /dev/null
+++ b/src/elevenlabs/types/smb_sip_media_encryption.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbSipMediaEncryption = typing.Union[typing.Literal["disabled", "allowed", "required"], typing.Any]
diff --git a/src/elevenlabs/types/smb_sip_transport.py b/src/elevenlabs/types/smb_sip_transport.py
new file mode 100644
index 000000000..e1d56ba66
--- /dev/null
+++ b/src/elevenlabs/types/smb_sip_transport.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbSipTransport = typing.Union[typing.Literal["udp", "tcp", "tls"], typing.Any]
diff --git a/src/elevenlabs/types/smb_staff_resource_db_model.py b/src/elevenlabs/types/smb_staff_resource_db_model.py
new file mode 100644
index 000000000..313296f43
--- /dev/null
+++ b/src/elevenlabs/types/smb_staff_resource_db_model.py
@@ -0,0 +1,96 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.serialization import FieldMetadata
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .phone_number_optional import PhoneNumberOptional
+from .smb_group_membership import SmbGroupMembership
+from .stripped_str import StrippedStr
+from .unix_timestamp import UnixTimestamp
+from .working_hours import WorkingHours
+
+
+class SmbStaffResourceDbModel(UncheckedBaseModel):
+ """
+ Represents a staff member who can provide services.
+
+ Inherits all staff fields from SMBStaffBase and adds database-specific fields.
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal/admin name of the staff member, shown in the dashboard and owner notifications.
+ """
+
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Description or bio of the staff member.
+ """
+
+ is_active: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the staff member can be booked. Inactive staff keep their booking history.
+ """
+
+ email: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Email address of the staff member.
+ """
+
+ phone: typing.Optional[PhoneNumberOptional] = pydantic.Field(default=None)
+ """
+ Phone number of the staff member. Without a country code, +1 (US) is assumed.
+ """
+
+ sms_notifications_opted_in: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether this staff member currently receives SMS booking notifications. Defaults to opted out — a staff member must be explicitly opted in (mirroring the client SMS default); flipped to False automatically when they reply STOP to the workspace number.
+ """
+
+ photo_url: typing.Optional[str] = None
+ location_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Location this staff member is assigned to; empty means available at all locations.
+ """
+
+ working_hours: typing.Optional[WorkingHours] = pydantic.Field(default=None)
+ """
+ Custom working hours for this staff member. None means follow the assigned location's operating_hours (requires location_id).
+ """
+
+ display_on_booking_page: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether customers can see and pick this staff member by name on the booking page. False keeps them bookable, just not shown by name.
+ """
+
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Optional public-facing label. When empty, `name` is shown to customers too. `name` stays the internal/admin label used in the dashboard and business-owner notifications.
+ """
+
+ id: typing_extensions.Annotated[str, FieldMetadata(alias="_id"), pydantic.Field(alias="_id")]
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+ updated_at_unix: typing.Optional[UnixTimestamp] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_staff_scrapable.py b/src/elevenlabs/types/smb_staff_scrapable.py
new file mode 100644
index 000000000..789486a1c
--- /dev/null
+++ b/src/elevenlabs/types/smb_staff_scrapable.py
@@ -0,0 +1,44 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_group_membership import SmbGroupMembership
+from .stripped_str import StrippedStr
+
+
+class SmbStaffScrapable(UncheckedBaseModel):
+ """
+ Scrape-reachable subset of a staff/team member.
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Internal/admin name of the staff member, shown in the dashboard and owner notifications.
+ """
+
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Description or bio of the staff member.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_tier_economics.py b/src/elevenlabs/types/smb_tier_economics.py
new file mode 100644
index 000000000..1299b97e8
--- /dev/null
+++ b/src/elevenlabs/types/smb_tier_economics.py
@@ -0,0 +1,51 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class SmbTierEconomics(UncheckedBaseModel):
+ """
+ A tier's prices and quotas, in the fields a tier is created with.
+ """
+
+ assistant_daily_messages: int
+ pool_outbound_sms_daily_limit: int
+ max_phone_numbers: int
+ max_active_locations: int
+ knowledge_source_limit: int
+ concurrent_calls: int
+ max_customer_facing_agents: int
+ max_team_members: int
+ ivc_voice_limit: int
+ monthly_price_usd: float = pydantic.Field()
+ """
+ What one month is sold for. Also values an included minute, at this price over the included minutes
+ """
+
+ annual_price_usd: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ What a year up front is sold for, at a discount on twelve months. Required for a tier on the ladder, omitted for the trial
+ """
+
+ included_minutes_per_month: float = pydantic.Field()
+ """
+ Phone minutes included each month. Other channels draw on the same allowance more cheaply — a web minute costs half a phone minute, a chat message a tenth
+ """
+
+ overage_price_per_minute_usd: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ Charged per minute past the included ones, and may not undercut their value. Required for a tier on the ladder, omitted for the trial
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_transfer_rule.py b/src/elevenlabs/types/smb_transfer_rule.py
new file mode 100644
index 000000000..d52cc2cf5
--- /dev/null
+++ b/src/elevenlabs/types/smb_transfer_rule.py
@@ -0,0 +1,48 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .phone_number import PhoneNumber
+from .stripped_str import StrippedStr
+from .unix_timestamp import UnixTimestamp
+
+
+class SmbTransferRule(UncheckedBaseModel):
+ """
+ A configured phone number that the agent can transfer calls to.
+ """
+
+ label: StrippedStr = pydantic.Field()
+ """
+ Name of the transfer destination, e.g. 'Alvin' or 'Billing team'.
+ """
+
+ phone_number: PhoneNumber = pydantic.Field()
+ """
+ Number to transfer to. Without a country code it is dialed locally in the business's country, so include the country code for a number abroad.
+ """
+
+ condition: StrippedStr = pydantic.Field()
+ """
+ What the caller does that triggers the transfer, e.g. 'The caller asks to speak to a human or to Alvin'. Describe only the trigger; do not restate the phone number or the word 'transfer'.
+ """
+
+ post_dial_digits: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ DTMF digits automatically played after the transfer destination picks up (e.g. '1' to answer a 'press 1 to accept' screen, or 'www1234' to key an extension after a pause). Valid characters are 0-9, *, #, w (0.5s pause) and W (1s pause). Twilio transfers only.
+ """
+
+ id: typing.Optional[str] = None
+ created_at_unix: typing.Optional[UnixTimestamp] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_turn_eagerness.py b/src/elevenlabs/types/smb_turn_eagerness.py
new file mode 100644
index 000000000..94a303569
--- /dev/null
+++ b/src/elevenlabs/types/smb_turn_eagerness.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbTurnEagerness = typing.Union[typing.Literal["patient", "normal", "eager"], typing.Any]
diff --git a/src/elevenlabs/types/smb_update_agent_info_request.py b/src/elevenlabs/types/smb_update_agent_info_request.py
new file mode 100644
index 000000000..f45205737
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_agent_info_request.py
@@ -0,0 +1,53 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .country_code import CountryCode
+from .smb_update_agent_info_request_currency import SmbUpdateAgentInfoRequestCurrency
+from .tool_call_sound_type import ToolCallSoundType
+from .working_hours import WorkingHours
+
+
+class SmbUpdateAgentInfoRequest(UncheckedBaseModel):
+ """
+ Agent-info update payload used by backend route consumers.
+ """
+
+ business_name: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Name of the business.
+ """
+
+ business_country: typing.Optional[CountryCode] = pydantic.Field(default=None)
+ """
+ ISO 3166-1 alpha-2 country code where the business is based (e.g. 'US', 'PL', 'DE').
+ """
+
+ business_description: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ What the business does, given to the receptionist.
+ """
+
+ timezone: typing.Optional[str] = None
+ currency: typing.Optional[SmbUpdateAgentInfoRequestCurrency] = pydantic.Field(default=None)
+ """
+ Currency code for all prices (ISO 4217)
+ """
+
+ operating_hours: typing.Optional[WorkingHours] = None
+ tool_call_sound: typing.Optional[ToolCallSoundType] = pydantic.Field(default=None)
+ """
+ Ambient sound played while any receptionist runs a tool (e.g. checking availability or looking up a client), filling the silence callers would otherwise hear. One sound for the whole workspace, because custom webhook and MCP tools are shared by every receptionist. Off when null.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_update_agent_info_request_currency.py b/src/elevenlabs/types/smb_update_agent_info_request_currency.py
new file mode 100644
index 000000000..ff5ae5994
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_agent_info_request_currency.py
@@ -0,0 +1,57 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbUpdateAgentInfoRequestCurrency = typing.Union[
+ typing.Literal[
+ "USD",
+ "EUR",
+ "GBP",
+ "PLN",
+ "CAD",
+ "AUD",
+ "CHF",
+ "SEK",
+ "NOK",
+ "DKK",
+ "ISK",
+ "CZK",
+ "HUF",
+ "RON",
+ "BGN",
+ "JPY",
+ "CNY",
+ "TWD",
+ "INR",
+ "BRL",
+ "MXN",
+ "KRW",
+ "SGD",
+ "HKD",
+ "NZD",
+ "ZAR",
+ "AED",
+ "SAR",
+ "QAR",
+ "KWD",
+ "ILS",
+ "TRY",
+ "THB",
+ "IDR",
+ "MYR",
+ "PHP",
+ "VND",
+ "BDT",
+ "RUB",
+ "UAH",
+ "CLP",
+ "COP",
+ "ARS",
+ "PEN",
+ "EGP",
+ "NGN",
+ "KES",
+ "PKR",
+ ],
+ typing.Any,
+]
diff --git a/src/elevenlabs/types/smb_update_agent_rule_request.py b/src/elevenlabs/types/smb_update_agent_rule_request.py
new file mode 100644
index 000000000..77f6dfda9
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_agent_rule_request.py
@@ -0,0 +1,39 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .rule_priority import RulePriority
+from .stripped_str import StrippedStr
+
+
+class SmbUpdateAgentRuleRequest(UncheckedBaseModel):
+ """
+ Request model for updating an existing agent rule.
+ """
+
+ title: StrippedStr = pydantic.Field()
+ """
+ Title of the rule.
+ """
+
+ description: StrippedStr = pydantic.Field()
+ """
+ What the agent should do, in detail.
+ """
+
+ priority: typing.Optional[RulePriority] = pydantic.Field(default=None)
+ """
+ strict: the agent must always follow the rule; suggestion: a guideline.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_update_holiday_request_patch.py b/src/elevenlabs/types/smb_update_holiday_request_patch.py
new file mode 100644
index 000000000..cc8414d79
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_holiday_request_patch.py
@@ -0,0 +1,40 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .date_model import DateModel
+from .holiday_type import HolidayType
+from .time_off_type import TimeOffType
+from .time_range_model import TimeRangeModel
+
+
+class SmbUpdateHolidayRequestPatch(UncheckedBaseModel):
+ name: typing.Optional[str] = None
+ start_date: typing.Optional[DateModel] = None
+ end_date: typing.Optional[DateModel] = None
+ holiday_type: typing.Optional[HolidayType] = None
+ override_hours: typing.Optional[typing.List[TimeRangeModel]] = pydantic.Field(default=None)
+ """
+ Replacement working hours when holiday_type is 'override'.
+ """
+
+ time_off_type: typing.Optional[TimeOffType] = None
+ resource_id: typing.Optional[str] = None
+ location_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ For LOCATION type: the location this closure applies to.
+ """
+
+ reason: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_update_procedure_request.py b/src/elevenlabs/types/smb_update_procedure_request.py
new file mode 100644
index 000000000..88372f70b
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_procedure_request.py
@@ -0,0 +1,38 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .stripped_str import StrippedStr
+
+
+class SmbUpdateProcedureRequest(UncheckedBaseModel):
+ """
+ Request model for updating an existing procedure.
+ """
+
+ name: StrippedStr = pydantic.Field()
+ """
+ Name of the procedure.
+ """
+
+ trigger: StrippedStr = pydantic.Field()
+ """
+ When the receptionist should run the procedure, in natural language. The receptionist matches caller requests against it, e.g. 'When the caller wants to book an appointment'.
+ """
+
+ body: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Step-by-step instructions, as markdown.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_update_service_request_patch.py b/src/elevenlabs/types/smb_update_service_request_patch.py
new file mode 100644
index 000000000..8889e596e
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_service_request_patch.py
@@ -0,0 +1,129 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .pricing_mode import PricingMode
+from .service_location_type import ServiceLocationType
+from .smb_add_on import SmbAddOn
+from .smb_group_membership import SmbGroupMembership
+from .smb_intake_question import SmbIntakeQuestion
+from .smb_service_kind import SmbServiceKind
+from .smb_service_promotion import SmbServicePromotion
+from .smb_service_variant import SmbServiceVariant
+from .stripped_str import StrippedStr
+
+
+class SmbUpdateServiceRequestPatch(UncheckedBaseModel):
+ pricing_mode: typing.Optional[PricingMode] = pydantic.Field(default=None)
+ """
+ 'fixed' (default): the item has a known price the agent can quote, and customers can book or order it directly. 'quote': the price depends on the job (renovation, catering, custom work), so no price or slot is offered; the agent collects the intake_questions and files a quote request instead. Takes effect only while quotes are enabled for the business. Group services cannot use 'quote'.
+ """
+
+ intake_questions: typing.Optional[typing.List[SmbIntakeQuestion]] = pydantic.Field(default=None)
+ """
+ Questions the agent asks before booking or ordering this item. Required for a useful ``pricing_mode='quote'`` item -- without them a quote request arrives with nothing to price -- but also valid on fixed-price items that need extra detail (current hair color before a dye job, allergies before a treatment).
+ """
+
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: typing.Optional[StrippedStr] = None
+ description: typing.Optional[StrippedStr] = None
+ variants: typing.Optional[typing.List[SmbServiceVariant]] = pydantic.Field(default=None)
+ """
+ Bookable options for this service. Always non-empty; ``variants[0]`` is the default option shown when callers don't pick a specific variant. Each entry has its own duration and (optional) price, and uniqueness is keyed by duration.
+ """
+
+ kind: typing.Optional[SmbServiceKind] = pydantic.Field(default=None)
+ """
+ Classic = staff-delivered; rental = asset-based; group = multi-participant session. Populated by the extraction category.
+ """
+
+ buffer_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Turnover/cleanup time reserved after each booking. Applies to every service kind; default 0 means no buffer.
+ """
+
+ service_location: typing.Optional[ServiceLocationType] = pydantic.Field(default=None)
+ """
+ Where the service is delivered. ``business`` = client visits the business location (default); ``customer`` = staff travels to the client. Only meaningful for ``kind='classic'``.
+ """
+
+ add_ons: typing.Optional[typing.List[SmbAddOn]] = pydantic.Field(default=None)
+ """
+ Optional extras scraped from the website that can be attached to a booking of this service.
+ """
+
+ max_participants: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Capacity for ``kind='group'``: how many seats a single session can sell across all registrations. Must be ``None`` for classic and rental services (those are always exclusive to one client per booking).
+ """
+
+ capacity: typing.Optional[int] = None
+ is_active: typing.Optional[bool] = None
+ any_staff_member: typing.Optional[bool] = None
+ staff_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Staff assigned to this service; must be empty for kind='rental'.
+ """
+
+ asset_ids: typing.Optional[typing.List[str]] = None
+ advance_booking_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ How far into the future customer-facing channels (public booking page, voice agent) may book this service. Applies to every kind.
+ """
+
+ location_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Locations where this service is offered; empty list means all locations.
+ """
+
+ display_on_booking_page: typing.Optional[bool] = None
+ travel_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Travel time in minutes added before/after appointments for customer-location services. Blocks the staff member's calendar but is not visible to the customer. Ignored when ``service_location='business'``.
+ """
+
+ travel_before: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Add travel time before the appointment (outbound trip).
+ """
+
+ travel_after: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Add travel time after the appointment (return trip).
+ """
+
+ promotions: typing.Optional[typing.List[SmbServicePromotion]] = pydantic.Field(default=None)
+ """
+ Time-bound discounts applicable to this service or specific variants.
+ """
+
+ duration_minutes: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Sets the first variant's duration. Ignored when `variants` is sent.
+ """
+
+ price: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ Sets the first variant's price. Ignored when `variants` is sent.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_update_staff_request_patch.py b/src/elevenlabs/types/smb_update_staff_request_patch.py
new file mode 100644
index 000000000..0afe72d4c
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_staff_request_patch.py
@@ -0,0 +1,83 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .phone_number_optional import PhoneNumberOptional
+from .smb_group_membership import SmbGroupMembership
+from .stripped_str import StrippedStr
+from .working_hours import WorkingHours
+
+
+class SmbUpdateStaffRequestPatch(UncheckedBaseModel):
+ groups: typing.Optional[typing.List[SmbGroupMembership]] = pydantic.Field(default=None)
+ """
+ Group memberships for this item. Each entry carries the group label and the item's 0-based rank within that group.
+ """
+
+ ungrouped_rank: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Display position among items with no group; `null` sorts last. Change it with the reorder endpoint.
+ """
+
+ name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Internal/admin name of the staff member, shown in the dashboard and owner notifications.
+ """
+
+ description: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Description or bio of the staff member.
+ """
+
+ is_active: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the staff member can be booked. Inactive staff keep their booking history.
+ """
+
+ email: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Email address of the staff member.
+ """
+
+ phone: typing.Optional[PhoneNumberOptional] = pydantic.Field(default=None)
+ """
+ Phone number of the staff member. Without a country code, +1 (US) is assumed.
+ """
+
+ sms_notifications_opted_in: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether this staff member currently receives SMS booking notifications. Defaults to opted out — a staff member must be explicitly opted in (mirroring the client SMS default); flipped to False automatically when they reply STOP to the workspace number.
+ """
+
+ photo_url: typing.Optional[str] = None
+ location_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Location this staff member is assigned to; empty means available at all locations.
+ """
+
+ working_hours: typing.Optional[WorkingHours] = pydantic.Field(default=None)
+ """
+ Custom working hours for this staff member. None means follow the assigned location's operating_hours (requires location_id).
+ """
+
+ display_on_booking_page: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether customers can see and pick this staff member by name on the booking page. False keeps them bookable, just not shown by name.
+ """
+
+ customer_facing_name: typing.Optional[StrippedStr] = pydantic.Field(default=None)
+ """
+ Optional public-facing label. When empty, `name` is shown to customers too. `name` stays the internal/admin label used in the dashboard and business-owner notifications.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_update_transfer_rule_request.py b/src/elevenlabs/types/smb_update_transfer_rule_request.py
new file mode 100644
index 000000000..eb6106b4a
--- /dev/null
+++ b/src/elevenlabs/types/smb_update_transfer_rule_request.py
@@ -0,0 +1,44 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .phone_number import PhoneNumber
+from .stripped_str import StrippedStr
+
+
+class SmbUpdateTransferRuleRequest(UncheckedBaseModel):
+ """
+ Request model for updating an existing transfer rule.
+ """
+
+ label: StrippedStr = pydantic.Field()
+ """
+ Name of the transfer destination, e.g. 'Alvin' or 'Billing team'.
+ """
+
+ phone_number: PhoneNumber = pydantic.Field()
+ """
+ Number to transfer to. Without a country code it is dialed locally in the business's country, so include the country code for a number abroad.
+ """
+
+ condition: StrippedStr = pydantic.Field()
+ """
+ What the caller does that triggers the transfer, e.g. 'The caller asks to speak to a human or to Alvin'. Describe only the trigger; do not restate the phone number or the word 'transfer'.
+ """
+
+ post_dial_digits: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ DTMF digits automatically played after the transfer destination picks up (e.g. '1' to answer a 'press 1 to accept' screen, or 'www1234' to key an extension after a pause). Valid characters are 0-9, *, #, w (0.5s pause) and W (1s pause). Twilio transfers only.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_vertical.py b/src/elevenlabs/types/smb_vertical.py
new file mode 100644
index 000000000..3b741a2e4
--- /dev/null
+++ b/src/elevenlabs/types/smb_vertical.py
@@ -0,0 +1,25 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbVertical = typing.Union[
+ typing.Literal[
+ "salon_barbershop",
+ "nail_beauty",
+ "spa",
+ "medical",
+ "veterinary",
+ "fitness",
+ "home_services",
+ "photography",
+ "consulting",
+ "restaurant",
+ "dental",
+ "auto_service",
+ "tutoring",
+ "legal",
+ "real_estate",
+ "other",
+ ],
+ typing.Any,
+]
diff --git a/src/elevenlabs/types/smb_widget_appearance.py b/src/elevenlabs/types/smb_widget_appearance.py
new file mode 100644
index 000000000..a0c5c7ffd
--- /dev/null
+++ b/src/elevenlabs/types/smb_widget_appearance.py
@@ -0,0 +1,41 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .smb_widget_appearance_placement import SmbWidgetAppearancePlacement
+from .smb_widget_appearance_variant import SmbWidgetAppearanceVariant
+
+
+class SmbWidgetAppearance(UncheckedBaseModel):
+ """
+ How the website widget looks -- the only part of its config SMB exposes.
+
+ Unlike the rest of a receptionist's settings this is not SMB data: it is
+ written straight onto the ConvAI agent's ``platform_settings.widget``. The
+ value types mirror ConvAI's ``WidgetConfig`` by hand because
+ ``xi_reception`` must not depend on ``xi_agents``; they are the widget's
+ public API, so they are stable.
+
+ A ``None`` label means "no override", which keeps the widget following the
+ agent's language instead of freezing today's translation into the config.
+ """
+
+ orb_color_1: str
+ orb_color_2: str
+ variant: SmbWidgetAppearanceVariant
+ placement: SmbWidgetAppearancePlacement
+ dismissible: bool
+ main_label: typing.Optional[str] = None
+ start_call: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/smb_widget_appearance_placement.py b/src/elevenlabs/types/smb_widget_appearance_placement.py
new file mode 100644
index 000000000..57ec66d7c
--- /dev/null
+++ b/src/elevenlabs/types/smb_widget_appearance_placement.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbWidgetAppearancePlacement = typing.Union[
+ typing.Literal["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"], typing.Any
+]
diff --git a/src/elevenlabs/types/smb_widget_appearance_variant.py b/src/elevenlabs/types/smb_widget_appearance_variant.py
new file mode 100644
index 000000000..de7d515e4
--- /dev/null
+++ b/src/elevenlabs/types/smb_widget_appearance_variant.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmbWidgetAppearanceVariant = typing.Union[typing.Literal["tiny", "compact", "full"], typing.Any]
diff --git a/src/elevenlabs/types/sms_template_style.py b/src/elevenlabs/types/sms_template_style.py
new file mode 100644
index 000000000..31d725b24
--- /dev/null
+++ b/src/elevenlabs/types/sms_template_style.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+SmsTemplateStyle = typing.Union[typing.Literal["friendly", "professional", "concise"], typing.Any]
diff --git a/src/elevenlabs/types/stripped_str.py b/src/elevenlabs/types/stripped_str.py
new file mode 100644
index 000000000..9e43cacb2
--- /dev/null
+++ b/src/elevenlabs/types/stripped_str.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+StrippedStr = str
diff --git a/src/elevenlabs/types/supported_lang.py b/src/elevenlabs/types/supported_lang.py
new file mode 100644
index 000000000..384cf7a19
--- /dev/null
+++ b/src/elevenlabs/types/supported_lang.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+SupportedLang = str
diff --git a/src/elevenlabs/types/team_invite_outcome.py b/src/elevenlabs/types/team_invite_outcome.py
new file mode 100644
index 000000000..c389903fe
--- /dev/null
+++ b/src/elevenlabs/types/team_invite_outcome.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+TeamInviteOutcome = typing.Union[typing.Literal["invited", "failed"], typing.Any]
diff --git a/src/elevenlabs/types/dubbing_auth_error.py b/src/elevenlabs/types/team_invite_request.py
similarity index 74%
rename from src/elevenlabs/types/dubbing_auth_error.py
rename to src/elevenlabs/types/team_invite_request.py
index f0c96ebce..ab41f7aaa 100644
--- a/src/elevenlabs/types/dubbing_auth_error.py
+++ b/src/elevenlabs/types/team_invite_request.py
@@ -5,11 +5,12 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
+from .team_invite_request_role import TeamInviteRequestRole
-class DubbingAuthError(UncheckedBaseModel):
- message_type: typing.Literal["auth_error"] = "auth_error"
- error: str
+class TeamInviteRequest(UncheckedBaseModel):
+ email: str
+ role: typing.Optional[TeamInviteRequestRole] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/team_invite_request_role.py b/src/elevenlabs/types/team_invite_request_role.py
new file mode 100644
index 000000000..33f3ba10b
--- /dev/null
+++ b/src/elevenlabs/types/team_invite_request_role.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+TeamInviteRequestRole = typing.Union[typing.Literal["workspace_admin", "workspace_member"], typing.Any]
diff --git a/src/elevenlabs/types/team_invite_result.py b/src/elevenlabs/types/team_invite_result.py
new file mode 100644
index 000000000..ee73c5c3e
--- /dev/null
+++ b/src/elevenlabs/types/team_invite_result.py
@@ -0,0 +1,23 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .team_invite_outcome import TeamInviteOutcome
+
+
+class TeamInviteResult(UncheckedBaseModel):
+ email: str
+ outcome: TeamInviteOutcome
+ error_status: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/time_off_type.py b/src/elevenlabs/types/time_off_type.py
new file mode 100644
index 000000000..50d8a00a4
--- /dev/null
+++ b/src/elevenlabs/types/time_off_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+TimeOffType = typing.Union[typing.Literal["staff", "asset", "location"], typing.Any]
diff --git a/src/elevenlabs/types/time_range_model.py b/src/elevenlabs/types/time_range_model.py
new file mode 100644
index 000000000..8f5521183
--- /dev/null
+++ b/src/elevenlabs/types/time_range_model.py
@@ -0,0 +1,43 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class TimeRangeModel(UncheckedBaseModel):
+ """
+ Represents a time-of-day range (e.g., 09:00-17:00) commonly used for
+ working hours, available hours, or recurring schedules.
+ """
+
+ start_hour: int = pydantic.Field()
+ """
+ Start hour (0-23)
+ """
+
+ start_minute: int = pydantic.Field()
+ """
+ Start minute (0-59)
+ """
+
+ end_hour: int = pydantic.Field()
+ """
+ End hour (0-24, where 24:00 means midnight end-of-day)
+ """
+
+ end_minute: int = pydantic.Field()
+ """
+ End minute (0-59)
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/turn_config.py b/src/elevenlabs/types/turn_config.py
index fd073d383..85dd41599 100644
--- a/src/elevenlabs/types/turn_config.py
+++ b/src/elevenlabs/types/turn_config.py
@@ -73,6 +73,16 @@ class TurnConfig(UncheckedBaseModel):
Configuration for soft timeout functionality. Provides immediate feedback during longer LLM responses.
"""
+ noisy_environment_detection: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ When enabled, the agent politely suggests the user move somewhere quieter when it hears other voices in the background. This improves transcription and turn-taking accuracy.
+ """
+
+ noisy_environment_message: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ What the agent says when it detects a noisy environment.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/turn_config_override.py b/src/elevenlabs/types/turn_config_override.py
index 4820f18f8..526986872 100644
--- a/src/elevenlabs/types/turn_config_override.py
+++ b/src/elevenlabs/types/turn_config_override.py
@@ -14,6 +14,11 @@ class TurnConfigOverride(UncheckedBaseModel):
Configuration for soft timeout functionality. Provides immediate feedback during longer LLM responses.
"""
+ noisy_environment_message: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ What the agent says when it detects a noisy environment.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/turn_config_override_config.py b/src/elevenlabs/types/turn_config_override_config.py
index af5124c7f..4ec7974e6 100644
--- a/src/elevenlabs/types/turn_config_override_config.py
+++ b/src/elevenlabs/types/turn_config_override_config.py
@@ -14,6 +14,11 @@ class TurnConfigOverrideConfig(UncheckedBaseModel):
Configures overrides for nested fields.
"""
+ noisy_environment_message: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether to allow overriding the noisy_environment_message field.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/turn_config_workflow_override.py b/src/elevenlabs/types/turn_config_workflow_override.py
index 07ba7eedf..62fea9607 100644
--- a/src/elevenlabs/types/turn_config_workflow_override.py
+++ b/src/elevenlabs/types/turn_config_workflow_override.py
@@ -77,6 +77,11 @@ class TurnConfigWorkflowOverride(UncheckedBaseModel):
Configuration for soft timeout functionality. Provides immediate feedback during longer LLM responses.
"""
+ noisy_environment_message: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ What the agent says when it detects a noisy environment.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6.py b/src/elevenlabs/types/unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6.py
new file mode 100644
index 000000000..857e6102f
--- /dev/null
+++ b/src/elevenlabs/types/unique_list_annotated_int_field_info_annotation_none_type_required_true_metadata_ge_ge_0_le_le_6.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+UniqueListAnnotatedIntFieldInfoAnnotationNoneTypeRequiredTrueMetadataGeGe0LeLe6 = typing.List[int]
diff --git a/src/elevenlabs/types/unit_test_guardrail_trigger_evaluation_model.py b/src/elevenlabs/types/unit_test_guardrail_trigger_evaluation_model.py
new file mode 100644
index 000000000..7ab1564f1
--- /dev/null
+++ b/src/elevenlabs/types/unit_test_guardrail_trigger_evaluation_model.py
@@ -0,0 +1,23 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class UnitTestGuardrailTriggerEvaluationModel(UncheckedBaseModel):
+ type: typing.Optional[typing.Literal["any"]] = pydantic.Field(default=None)
+ """
+ Match any guardrail triggered by the generated turn.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/unit_test_tool_call_evaluation_model_input.py b/src/elevenlabs/types/unit_test_tool_call_evaluation_model_input.py
index 43be869d3..c8e84fe18 100644
--- a/src/elevenlabs/types/unit_test_tool_call_evaluation_model_input.py
+++ b/src/elevenlabs/types/unit_test_tool_call_evaluation_model_input.py
@@ -6,6 +6,7 @@
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
from .referenced_tool_common_model import ReferencedToolCommonModel
+from .unit_test_guardrail_trigger_evaluation_model import UnitTestGuardrailTriggerEvaluationModel
from .unit_test_tool_call_parameter import UnitTestToolCallParameter
from .unit_test_workflow_node_transition_evaluation_node_id import UnitTestWorkflowNodeTransitionEvaluationNodeId
@@ -33,6 +34,11 @@ class UnitTestToolCallEvaluationModelInput(UncheckedBaseModel):
Configuration for testing workflow node transitions. When set, the test will verify the agent transitions to the specified workflow node.
"""
+ guardrail_trigger: typing.Optional[UnitTestGuardrailTriggerEvaluationModel] = pydantic.Field(default=None)
+ """
+ Evaluate guardrails triggered by the generated agent turn.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/unit_test_tool_call_evaluation_model_output.py b/src/elevenlabs/types/unit_test_tool_call_evaluation_model_output.py
index 407c9e5f6..de3070dd8 100644
--- a/src/elevenlabs/types/unit_test_tool_call_evaluation_model_output.py
+++ b/src/elevenlabs/types/unit_test_tool_call_evaluation_model_output.py
@@ -6,6 +6,7 @@
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
from .referenced_tool_common_model import ReferencedToolCommonModel
+from .unit_test_guardrail_trigger_evaluation_model import UnitTestGuardrailTriggerEvaluationModel
from .unit_test_tool_call_parameter import UnitTestToolCallParameter
from .unit_test_workflow_node_transition_evaluation_node_id import UnitTestWorkflowNodeTransitionEvaluationNodeId
@@ -33,6 +34,11 @@ class UnitTestToolCallEvaluationModelOutput(UncheckedBaseModel):
Configuration for testing workflow node transitions. When set, the test will verify the agent transitions to the specified workflow node.
"""
+ guardrail_trigger: typing.Optional[UnitTestGuardrailTriggerEvaluationModel] = pydantic.Field(default=None)
+ """
+ Evaluate guardrails triggered by the generated agent turn.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/elevenlabs/types/unix_timestamp.py b/src/elevenlabs/types/unix_timestamp.py
new file mode 100644
index 000000000..3a2016ee2
--- /dev/null
+++ b/src/elevenlabs/types/unix_timestamp.py
@@ -0,0 +1,3 @@
+# This file was auto-generated by Fern from our API Definition.
+
+UnixTimestamp = int
diff --git a/src/elevenlabs/types/webhook_http_method.py b/src/elevenlabs/types/webhook_http_method.py
new file mode 100644
index 000000000..3391d1446
--- /dev/null
+++ b/src/elevenlabs/types/webhook_http_method.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+WebhookHttpMethod = typing.Union[typing.Literal["GET", "POST", "PUT", "PATCH", "DELETE"], typing.Any]
diff --git a/src/elevenlabs/types/whats_app_call_permission_request.py b/src/elevenlabs/types/whats_app_call_permission_request.py
index f3ef855ae..2cd07b8a5 100644
--- a/src/elevenlabs/types/whats_app_call_permission_request.py
+++ b/src/elevenlabs/types/whats_app_call_permission_request.py
@@ -11,6 +11,9 @@
class WhatsAppCallPermissionRequest(UncheckedBaseModel):
state: WhatsAppCallPermissionRequestState
requested_at_unix: typing.Optional[int] = None
+ responded_at_unix: typing.Optional[int] = None
+ permanent: typing.Optional[bool] = None
+ granted_by_user_call: typing.Optional[bool] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/whats_app_conversation_info.py b/src/elevenlabs/types/whats_app_conversation_info.py
index fb8f83a63..7df153532 100644
--- a/src/elevenlabs/types/whats_app_conversation_info.py
+++ b/src/elevenlabs/types/whats_app_conversation_info.py
@@ -5,8 +5,10 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2
from ..core.unchecked_base_model import UncheckedBaseModel
+from .call_result import CallResult
from .whats_app_call_permission_request import WhatsAppCallPermissionRequest
from .whats_app_conversation_info_direction import WhatsAppConversationInfoDirection
+from .whats_app_opening_message import WhatsAppOpeningMessage
from .whats_app_recipient import WhatsAppRecipient
@@ -17,6 +19,8 @@ class WhatsAppConversationInfo(UncheckedBaseModel):
awaiting_first_user_message: typing.Optional[bool] = None
recipient: typing.Optional[WhatsAppRecipient] = None
call_permission_request: typing.Optional[WhatsAppCallPermissionRequest] = None
+ call_result: typing.Optional[CallResult] = None
+ opening_message: typing.Optional[WhatsAppOpeningMessage] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/elevenlabs/types/whats_app_opening_message.py b/src/elevenlabs/types/whats_app_opening_message.py
new file mode 100644
index 000000000..fbb73b9f7
--- /dev/null
+++ b/src/elevenlabs/types/whats_app_opening_message.py
@@ -0,0 +1,33 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+
+
+class WhatsAppOpeningMessage(UncheckedBaseModel):
+ """
+ The template a business-initiated conversation opened with, and how far it got.
+ """
+
+ template_name: str
+ wamid: typing.Optional[str] = None
+ sent_at_unix: int
+ delivered_at_unix: typing.Optional[int] = None
+ read_at_unix: typing.Optional[int] = None
+ replied_at_unix: typing.Optional[int] = None
+ failed_at_unix: typing.Optional[int] = None
+ error_code: typing.Optional[str] = None
+ pricing_category: typing.Optional[str] = None
+ billable: typing.Optional[bool] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/widget_config.py b/src/elevenlabs/types/widget_config.py
index 0005d6ea5..ea6c3a670 100644
--- a/src/elevenlabs/types/widget_config.py
+++ b/src/elevenlabs/types/widget_config.py
@@ -254,6 +254,11 @@ class WidgetConfig(UncheckedBaseModel):
Whether the widget opens fullscreen on mobile
"""
+ transcript_speech_sync_enabled: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether voice call transcripts are revealed as the agent speaks
+ """
+
language_selector: typing.Optional[bool] = pydantic.Field(default=None)
"""
Whether to show the language selector
diff --git a/src/elevenlabs/types/widget_config_response.py b/src/elevenlabs/types/widget_config_response.py
index f6a4de497..24205f946 100644
--- a/src/elevenlabs/types/widget_config_response.py
+++ b/src/elevenlabs/types/widget_config_response.py
@@ -255,6 +255,11 @@ class WidgetConfigResponse(UncheckedBaseModel):
Whether the widget opens fullscreen on mobile
"""
+ transcript_speech_sync_enabled: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether voice call transcripts are revealed as the agent speaks
+ """
+
language: str
supported_language_overrides: typing.Optional[typing.List[str]] = None
language_presets: typing.Optional[typing.Dict[str, WidgetLanguagePresetResponse]] = pydantic.Field(default=None)
diff --git a/src/elevenlabs/types/working_hours.py b/src/elevenlabs/types/working_hours.py
new file mode 100644
index 000000000..0f3412af8
--- /dev/null
+++ b/src/elevenlabs/types/working_hours.py
@@ -0,0 +1,25 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .time_range_model import TimeRangeModel
+
+
+class WorkingHours(UncheckedBaseModel):
+ hours: typing.Optional[typing.Dict[str, typing.List[TimeRangeModel]]] = None
+ timezone: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Timezone these wall-clock hours are interpreted in. None means inherit the business timezone (agent_info.timezone); use ``effective_timezone(business_tz)`` to resolve the cascade.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/types/workspace_group_permission.py b/src/elevenlabs/types/workspace_group_permission.py
index c67588c0d..49e67c2f1 100644
--- a/src/elevenlabs/types/workspace_group_permission.py
+++ b/src/elevenlabs/types/workspace_group_permission.py
@@ -15,6 +15,7 @@
"audio_native",
"conversational_ai",
"conversational_ai_read",
+ "architect",
"voice_isolator",
"ai_speech_classifier",
"synthid_detector",
diff --git a/src/elevenlabs/types/workspace_now.py b/src/elevenlabs/types/workspace_now.py
new file mode 100644
index 000000000..c45a6afa6
--- /dev/null
+++ b/src/elevenlabs/types/workspace_now.py
@@ -0,0 +1,35 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .date_model import DateModel
+
+
+class WorkspaceNow(UncheckedBaseModel):
+ today: DateModel
+ hour: int = pydantic.Field()
+ """
+ Current hour (0-23)
+ """
+
+ minute: int = pydantic.Field()
+ """
+ Current minute (0-59)
+ """
+
+ fetched_at_ms: int = pydantic.Field()
+ """
+ Unix timestamp in milliseconds when this was generated
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/elevenlabs/v_1_dubbing_realtime/types/receive_dubbing_stream_message.py b/src/elevenlabs/v_1_dubbing_realtime/types/receive_dubbing_stream_message.py
deleted file mode 100644
index 7f788801e..000000000
--- a/src/elevenlabs/v_1_dubbing_realtime/types/receive_dubbing_stream_message.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-from ...types.dubbing_audio import DubbingAudio
-from ...types.dubbing_audio_output_error import DubbingAudioOutputError
-from ...types.dubbing_auth_error import DubbingAuthError
-from ...types.dubbing_committed_transcript import DubbingCommittedTranscript
-from ...types.dubbing_error import DubbingError
-from ...types.dubbing_input_error import DubbingInputError
-from ...types.dubbing_invalid_request_error import DubbingInvalidRequestError
-from ...types.dubbing_partial_transcript import DubbingPartialTranscript
-from ...types.dubbing_queue_overflow_error import DubbingQueueOverflowError
-from ...types.dubbing_rate_limited_error import DubbingRateLimitedError
-from ...types.dubbing_session_started import DubbingSessionStarted
-from ...types.dubbing_status import DubbingStatus
-from ...types.dubbing_transcriber_error import DubbingTranscriberError
-from ...types.dubbing_translation import DubbingTranslation
-from ...types.dubbing_translation_error import DubbingTranslationError
-
-ReceiveDubbingStreamMessage = typing.Union[
- DubbingSessionStarted,
- DubbingStatus,
- DubbingPartialTranscript,
- DubbingCommittedTranscript,
- DubbingTranslation,
- DubbingAudio,
- DubbingError,
- DubbingAuthError,
- DubbingRateLimitedError,
- DubbingQueueOverflowError,
- DubbingInvalidRequestError,
- DubbingInputError,
- DubbingTranscriberError,
- DubbingTranslationError,
- DubbingAudioOutputError,
-]
diff --git a/src/elevenlabs/v_1_dubbing_realtime/types/send_dubbing_stream_message.py b/src/elevenlabs/v_1_dubbing_realtime/types/send_dubbing_stream_message.py
deleted file mode 100644
index 4bd521a9c..000000000
--- a/src/elevenlabs/v_1_dubbing_realtime/types/send_dubbing_stream_message.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-from ...types.dubbing_end_of_stream import DubbingEndOfStream
-from ...types.dubbing_input_audio_chunk import DubbingInputAudioChunk
-
-SendDubbingStreamMessage = typing.Union[DubbingInputAudioChunk, DubbingEndOfStream]
diff --git a/src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_input_format.py b/src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_input_format.py
deleted file mode 100644
index 75c03e404..000000000
--- a/src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_input_format.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-TextToDialogueInputFormat = typing.Union[
- typing.Literal["pcm_8000", "pcm_16000", "pcm_22050", "pcm_24000", "pcm_44100", "pcm_48000", "ulaw_8000"], typing.Any
-]
diff --git a/src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_output_format.py b/src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_output_format.py
deleted file mode 100644
index 8c8dbbc2c..000000000
--- a/src/elevenlabs/v_1_dubbing_realtime/types/text_to_dialogue_output_format.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-TextToDialogueOutputFormat = typing.Union[
- typing.Literal["pcm_8000", "pcm_16000", "pcm_22050", "pcm_24000", "pcm_44100", "pcm_48000", "ulaw_8000"], typing.Any
-]
From 98328d4531c44fd23d97c463f79efe9098a51cb2 Mon Sep 17 00:00:00 2001
From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com>
Date: Mon, 2 Nov 2026 12:17:10 +0000
Subject: [PATCH 2/2] [fern-replay] Applied customizations
Patches with unresolved conflicts (3):
- patch-560b8934: fix: send list-of-primitive multipart fields as repeated form fields (#819) (#825)
- patch-a8e155fd: Fix tests on Python 3.13+, add 3.13/3.14 to CI, bump to 2.73.1 (#898)
- patch-f5d53e09: Bump version to 2.74.1 (#902)
Run `fern-replay resolve` to apply these customizations.
---
.fern/replay.lock | 8 +++++++-
src/elevenlabs/audio_native/raw_client.py | 5 ++---
src/elevenlabs/dubbing/project/raw_client.py | 1 -
src/elevenlabs/music/finetunes/raw_client.py | 5 ++---
src/elevenlabs/music/raw_client.py | 5 ++---
src/elevenlabs/speech_to_text/raw_client.py | 4 ++--
src/elevenlabs/studio/projects/raw_client.py | 13 ++++++-------
7 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/.fern/replay.lock b/.fern/replay.lock
index 039652c25..d97c8ec52 100644
--- a/.fern/replay.lock
+++ b/.fern/replay.lock
@@ -132,7 +132,13 @@ generations:
cli_version: unknown
generator_versions:
fernapi/fern-python-sdk: 4.64.1
-current_generation: a3a347317428654851f6d421af7bb1280e90ce71
+ - commit_sha: c54518fba4cfafaa778bbdfa4f1aaa6239a756a1
+ tree_hash: 66b4d41bd2509accc15fe6fe2cf83171d13bb0b9
+ timestamp: 2026-11-02T12:17:04.820Z
+ cli_version: unknown
+ generator_versions:
+ fernapi/fern-python-sdk: 4.64.1
+current_generation: c54518fba4cfafaa778bbdfa4f1aaa6239a756a1
patches:
- id: patch-560b8934
content_hash: sha256:7cc64e2c0e717976480e69331fa8402968c0ed67dc8d7dd94b304a0ad98e606a
diff --git a/src/elevenlabs/audio_native/raw_client.py b/src/elevenlabs/audio_native/raw_client.py
index 85caf294f..8b6c0fe35 100644
--- a/src/elevenlabs/audio_native/raw_client.py
+++ b/src/elevenlabs/audio_native/raw_client.py
@@ -1,6 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
-import json
import typing
from json.decoder import JSONDecodeError
@@ -122,7 +121,7 @@ def create(
"model_id": model_id,
"auto_convert": auto_convert,
"apply_text_normalization": apply_text_normalization,
- "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
+ "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
},
files={
**({"file": file} if file is not None else {}),
@@ -467,7 +466,7 @@ async def create(
"model_id": model_id,
"auto_convert": auto_convert,
"apply_text_normalization": apply_text_normalization,
- "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
+ "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
},
files={
**({"file": file} if file is not None else {}),
diff --git a/src/elevenlabs/dubbing/project/raw_client.py b/src/elevenlabs/dubbing/project/raw_client.py
index 1122835b9..697700417 100644
--- a/src/elevenlabs/dubbing/project/raw_client.py
+++ b/src/elevenlabs/dubbing/project/raw_client.py
@@ -1,6 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
-import json
import typing
from json.decoder import JSONDecodeError
diff --git a/src/elevenlabs/music/finetunes/raw_client.py b/src/elevenlabs/music/finetunes/raw_client.py
index f3fc21640..022b07635 100644
--- a/src/elevenlabs/music/finetunes/raw_client.py
+++ b/src/elevenlabs/music/finetunes/raw_client.py
@@ -1,6 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
-import json
import typing
from json.decoder import JSONDecodeError
@@ -167,7 +166,7 @@ def create(
data={
"name": name,
"primary_genre": primary_genre,
- "tags": json.dumps(jsonable_encoder(tags)),
+ "tags": tags,
"visibility": visibility,
"model_id": model_id,
},
@@ -622,7 +621,7 @@ async def create(
data={
"name": name,
"primary_genre": primary_genre,
- "tags": json.dumps(jsonable_encoder(tags)),
+ "tags": tags,
"visibility": visibility,
"model_id": model_id,
},
diff --git a/src/elevenlabs/music/raw_client.py b/src/elevenlabs/music/raw_client.py
index 95f97fbe0..b688f9aa4 100644
--- a/src/elevenlabs/music/raw_client.py
+++ b/src/elevenlabs/music/raw_client.py
@@ -9,7 +9,6 @@
from ..core.api_error import ApiError
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.http_response import AsyncHttpResponse, HttpResponse
-from ..core.jsonable_encoder import jsonable_encoder
from ..core.parse_error import ParsingError
from ..core.request_options import RequestOptions
from ..core.serialization import convert_and_respect_annotation_metadata
@@ -113,7 +112,7 @@ def video_to_music(
},
data={
"description": description,
- "tags": json.dumps(jsonable_encoder(tags)),
+ "tags": tags,
"model_id": model_id,
"add_sfx": add_sfx,
"separate_tracks": separate_tracks,
@@ -963,7 +962,7 @@ async def video_to_music(
},
data={
"description": description,
- "tags": json.dumps(jsonable_encoder(tags)),
+ "tags": tags,
"model_id": model_id,
"add_sfx": add_sfx,
"separate_tracks": separate_tracks,
diff --git a/src/elevenlabs/speech_to_text/raw_client.py b/src/elevenlabs/speech_to_text/raw_client.py
index bf2bbafb3..115ec2f8d 100644
--- a/src/elevenlabs/speech_to_text/raw_client.py
+++ b/src/elevenlabs/speech_to_text/raw_client.py
@@ -199,7 +199,7 @@ def convert(
"detect_speaker_roles": detect_speaker_roles,
"entity_redaction": json.dumps(jsonable_encoder(entity_redaction)),
"entity_redaction_mode": entity_redaction_mode,
- "keyterms": json.dumps(jsonable_encoder(keyterms)),
+ "keyterms": keyterms,
},
files={
**({"file": file} if file is not None else {}),
@@ -414,7 +414,7 @@ async def convert(
"detect_speaker_roles": detect_speaker_roles,
"entity_redaction": json.dumps(jsonable_encoder(entity_redaction)),
"entity_redaction_mode": entity_redaction_mode,
- "keyterms": json.dumps(jsonable_encoder(keyterms)),
+ "keyterms": keyterms,
},
files={
**({"file": file} if file is not None else {}),
diff --git a/src/elevenlabs/studio/projects/raw_client.py b/src/elevenlabs/studio/projects/raw_client.py
index 1a6e731ad..47fc5054d 100644
--- a/src/elevenlabs/studio/projects/raw_client.py
+++ b/src/elevenlabs/studio/projects/raw_client.py
@@ -1,6 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
-import json
import typing
from json.decoder import JSONDecodeError
@@ -305,7 +304,7 @@ def create(
"title": title,
"author": author,
"description": description,
- "genres": json.dumps(jsonable_encoder(genres)),
+ "genres": genres,
"target_audience": target_audience,
"language": language,
"content_type": content_type,
@@ -314,14 +313,14 @@ def create(
"isbn_number": isbn_number,
"acx_volume_normalization": acx_volume_normalization,
"volume_normalization": volume_normalization,
- "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
+ "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
"callback_url": callback_url,
"fiction": fiction,
"apply_text_normalization": apply_text_normalization,
"auto_convert": auto_convert,
"auto_assign_voices": auto_assign_voices,
"source_type": source_type,
- "voice_settings": json.dumps(jsonable_encoder(voice_settings)),
+ "voice_settings": voice_settings,
"create_publishing_read": create_publishing_read,
},
files={
@@ -962,7 +961,7 @@ async def create(
"title": title,
"author": author,
"description": description,
- "genres": json.dumps(jsonable_encoder(genres)),
+ "genres": genres,
"target_audience": target_audience,
"language": language,
"content_type": content_type,
@@ -971,14 +970,14 @@ async def create(
"isbn_number": isbn_number,
"acx_volume_normalization": acx_volume_normalization,
"volume_normalization": volume_normalization,
- "pronunciation_dictionary_locators": json.dumps(jsonable_encoder(pronunciation_dictionary_locators)),
+ "pronunciation_dictionary_locators": pronunciation_dictionary_locators,
"callback_url": callback_url,
"fiction": fiction,
"apply_text_normalization": apply_text_normalization,
"auto_convert": auto_convert,
"auto_assign_voices": auto_assign_voices,
"source_type": source_type,
- "voice_settings": json.dumps(jsonable_encoder(voice_settings)),
+ "voice_settings": voice_settings,
"create_publishing_read": create_publishing_read,
},
files={