wxcli 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wxcli/__init__.py +4 -0
- wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
- wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
- wxcli/_playbook/.claude/rules/cleanup.md +29 -0
- wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
- wxcli/_playbook/.claude/rules/org-health.md +14 -0
- wxcli/_playbook/.claude/settings.json +8 -0
- wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
- wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
- wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
- wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
- wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
- wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
- wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
- wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
- wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
- wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
- wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
- wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
- wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
- wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
- wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
- wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
- wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
- wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
- wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
- wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
- wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
- wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
- wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
- wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
- wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
- wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
- wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
- wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
- wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
- wxcli/_playbook/CLAUDE.md +373 -0
- wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
- wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
- wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
- wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
- wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
- wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
- wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
- wxcli/_playbook/docs/reference/admin-partner.md +357 -0
- wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
- wxcli/_playbook/docs/reference/authentication.md +965 -0
- wxcli/_playbook/docs/reference/call-control.md +1205 -0
- wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
- wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
- wxcli/_playbook/docs/reference/call-routing.md +2304 -0
- wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
- wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
- wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
- wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
- wxcli/_playbook/docs/reference/devices-core.md +1869 -0
- wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
- wxcli/_playbook/docs/reference/devices-platform.md +467 -0
- wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
- wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
- wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
- wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
- wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
- wxcli/_playbook/docs/reference/meetings-content.md +473 -0
- wxcli/_playbook/docs/reference/meetings-core.md +903 -0
- wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
- wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
- wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
- wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
- wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
- wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
- wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
- wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
- wxcli/_playbook/docs/reference/provisioning.md +1366 -0
- wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
- wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
- wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
- wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
- wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
- wxcli/_version.py +24 -0
- wxcli/auth.py +137 -0
- wxcli/commands/__init__.py +0 -0
- wxcli/commands/_registry.py +181 -0
- wxcli/commands/activation_email.py +103 -0
- wxcli/commands/admin_recordings.py +585 -0
- wxcli/commands/analytics.py +105 -0
- wxcli/commands/announcement_playlists.py +219 -0
- wxcli/commands/announcements.py +519 -0
- wxcli/commands/archive_users.py +36 -0
- wxcli/commands/attachment_actions.py +60 -0
- wxcli/commands/audit_events.py +83 -0
- wxcli/commands/authorizations.py +113 -0
- wxcli/commands/auto_attendant.py +642 -0
- wxcli/commands/broadworks_billing_reports.py +126 -0
- wxcli/commands/broadworks_enterprises.py +160 -0
- wxcli/commands/broadworks_subscribers.py +319 -0
- wxcli/commands/broadworks_workspaces.py +108 -0
- wxcli/commands/call_controls.py +1304 -0
- wxcli/commands/call_park.py +494 -0
- wxcli/commands/call_pickup.py +229 -0
- wxcli/commands/call_queue.py +1878 -0
- wxcli/commands/call_recording.py +707 -0
- wxcli/commands/call_routing.py +1610 -0
- wxcli/commands/call_settings_for_me_phase_5.py +212 -0
- wxcli/commands/caller_reputation.py +169 -0
- wxcli/commands/calling_service.py +305 -0
- wxcli/commands/cc_address_book.py +770 -0
- wxcli/commands/cc_agent_greetings.py +242 -0
- wxcli/commands/cc_agent_summaries.py +39 -0
- wxcli/commands/cc_agent_wellbeing.py +216 -0
- wxcli/commands/cc_agents.py +425 -0
- wxcli/commands/cc_ai_assistant.py +55 -0
- wxcli/commands/cc_ai_feature.py +294 -0
- wxcli/commands/cc_audio_files.py +149 -0
- wxcli/commands/cc_auto_csat.py +311 -0
- wxcli/commands/cc_aux_code.py +458 -0
- wxcli/commands/cc_business_hour.py +353 -0
- wxcli/commands/cc_call_monitoring.py +228 -0
- wxcli/commands/cc_callbacks.py +194 -0
- wxcli/commands/cc_campaign.py +212 -0
- wxcli/commands/cc_captures.py +39 -0
- wxcli/commands/cc_contact_list.py +169 -0
- wxcli/commands/cc_contact_number.py +295 -0
- wxcli/commands/cc_data_sources.py +235 -0
- wxcli/commands/cc_desktop_layout.py +380 -0
- wxcli/commands/cc_desktop_profile.py +322 -0
- wxcli/commands/cc_dial_number.py +511 -0
- wxcli/commands/cc_dial_plan.py +347 -0
- wxcli/commands/cc_dnc.py +101 -0
- wxcli/commands/cc_entry_point.py +545 -0
- wxcli/commands/cc_ewt.py +51 -0
- wxcli/commands/cc_flow.py +477 -0
- wxcli/commands/cc_global_vars.py +430 -0
- wxcli/commands/cc_holiday_list.py +335 -0
- wxcli/commands/cc_journey.py +1261 -0
- wxcli/commands/cc_legacy_flows.py +49 -0
- wxcli/commands/cc_multimedia_profile.py +436 -0
- wxcli/commands/cc_notification.py +51 -0
- wxcli/commands/cc_outdial_ani.py +604 -0
- wxcli/commands/cc_overrides.py +341 -0
- wxcli/commands/cc_queue.py +1083 -0
- wxcli/commands/cc_queue_stats.py +55 -0
- wxcli/commands/cc_realtime.py +51 -0
- wxcli/commands/cc_resource_collection.py +312 -0
- wxcli/commands/cc_search.py +46 -0
- wxcli/commands/cc_site.py +400 -0
- wxcli/commands/cc_skill.py +350 -0
- wxcli/commands/cc_skill_profile.py +289 -0
- wxcli/commands/cc_subscriptions.py +426 -0
- wxcli/commands/cc_summaries.py +130 -0
- wxcli/commands/cc_tasks.py +844 -0
- wxcli/commands/cc_team.py +325 -0
- wxcli/commands/cc_user_profiles.py +349 -0
- wxcli/commands/cc_users.py +701 -0
- wxcli/commands/cc_work_types.py +363 -0
- wxcli/commands/cdr.py +89 -0
- wxcli/commands/classifications.py +38 -0
- wxcli/commands/cleanup.py +1427 -0
- wxcli/commands/client_settings.py +72 -0
- wxcli/commands/conference.py +328 -0
- wxcli/commands/configure.py +72 -0
- wxcli/commands/converged_recordings.py +347 -0
- wxcli/commands/converged_recordings_export.py +310 -0
- wxcli/commands/cq_playlists.py +42 -0
- wxcli/commands/cucm.py +2794 -0
- wxcli/commands/cucm_config.py +129 -0
- wxcli/commands/customer_assist.py +373 -0
- wxcli/commands/data_sources.py +227 -0
- wxcli/commands/dect_devices.py +787 -0
- wxcli/commands/device_configurations.py +77 -0
- wxcli/commands/device_dynamic_settings.py +320 -0
- wxcli/commands/device_settings.py +1489 -0
- wxcli/commands/devices.py +280 -0
- wxcli/commands/domains.py +142 -0
- wxcli/commands/ecm.py +178 -0
- wxcli/commands/emergency_services.py +827 -0
- wxcli/commands/events.py +83 -0
- wxcli/commands/external_voicemail.py +52 -0
- wxcli/commands/groups.py +206 -0
- wxcli/commands/guest_management.py +76 -0
- wxcli/commands/hds.py +340 -0
- wxcli/commands/hot_desk.py +67 -0
- wxcli/commands/hot_desking_members.py +118 -0
- wxcli/commands/hot_desking_portal.py +124 -0
- wxcli/commands/hunt_group.py +577 -0
- wxcli/commands/hybrid_clusters.py +71 -0
- wxcli/commands/hybrid_connectors.py +67 -0
- wxcli/commands/identity_org.py +159 -0
- wxcli/commands/init_playbook.py +155 -0
- wxcli/commands/licenses.py +106 -0
- wxcli/commands/live_monitoring.py +40 -0
- wxcli/commands/location_call_handling.py +577 -0
- wxcli/commands/location_schedules.py +341 -0
- wxcli/commands/location_settings.py +1297 -0
- wxcli/commands/location_voicemail.py +494 -0
- wxcli/commands/locations.py +336 -0
- wxcli/commands/meeting_captions.py +110 -0
- wxcli/commands/meeting_chats.py +63 -0
- wxcli/commands/meeting_invitees.py +234 -0
- wxcli/commands/meeting_messages.py +28 -0
- wxcli/commands/meeting_participants.py +278 -0
- wxcli/commands/meeting_polls.py +111 -0
- wxcli/commands/meeting_preferences.py +515 -0
- wxcli/commands/meeting_qa.py +78 -0
- wxcli/commands/meeting_qualities.py +43 -0
- wxcli/commands/meeting_reports.py +101 -0
- wxcli/commands/meeting_session_types.py +105 -0
- wxcli/commands/meeting_site.py +57 -0
- wxcli/commands/meeting_slido.py +44 -0
- wxcli/commands/meeting_summaries.py +92 -0
- wxcli/commands/meeting_tracking_codes.py +233 -0
- wxcli/commands/meeting_transcripts.py +230 -0
- wxcli/commands/meetings.py +1997 -0
- wxcli/commands/memberships.py +164 -0
- wxcli/commands/messages.py +213 -0
- wxcli/commands/mode_management.py +244 -0
- wxcli/commands/my_call_settings.py +3577 -0
- wxcli/commands/numbers.py +405 -0
- wxcli/commands/operating_modes.py +410 -0
- wxcli/commands/org_contacts.py +284 -0
- wxcli/commands/org_health_cli.py +55 -0
- wxcli/commands/org_settings.py +71 -0
- wxcli/commands/organizations.py +83 -0
- wxcli/commands/paging_group.py +257 -0
- wxcli/commands/partner_admins.py +141 -0
- wxcli/commands/partner_reports.py +188 -0
- wxcli/commands/partner_tags.py +216 -0
- wxcli/commands/people.py +279 -0
- wxcli/commands/person_call_settings.py +71 -0
- wxcli/commands/pstn.py +280 -0
- wxcli/commands/recording_report.py +154 -0
- wxcli/commands/report_templates.py +38 -0
- wxcli/commands/reports.py +144 -0
- wxcli/commands/resource_group_memberships.py +160 -0
- wxcli/commands/resource_groups.py +67 -0
- wxcli/commands/roles.py +63 -0
- wxcli/commands/room_tabs.py +160 -0
- wxcli/commands/rooms.py +225 -0
- wxcli/commands/scim_bulk.py +46 -0
- wxcli/commands/scim_groups.py +246 -0
- wxcli/commands/scim_schemas.py +82 -0
- wxcli/commands/scim_users.py +283 -0
- wxcli/commands/security_audit.py +54 -0
- wxcli/commands/service_apps.py +51 -0
- wxcli/commands/single_number_reach.py +209 -0
- wxcli/commands/team_memberships.py +155 -0
- wxcli/commands/teams.py +153 -0
- wxcli/commands/ucm_profile.py +42 -0
- wxcli/commands/update.py +219 -0
- wxcli/commands/user_settings.py +5116 -0
- wxcli/commands/video_mesh.py +1090 -0
- wxcli/commands/virtual_extensions.py +502 -0
- wxcli/commands/virtual_line_settings.py +2072 -0
- wxcli/commands/webhooks.py +176 -0
- wxcli/commands/wholesale_billing_reports.py +147 -0
- wxcli/commands/wholesale_provisioning.py +523 -0
- wxcli/commands/workspace_locations.py +339 -0
- wxcli/commands/workspace_metrics.py +103 -0
- wxcli/commands/workspace_personalization.py +70 -0
- wxcli/commands/workspace_settings.py +3347 -0
- wxcli/commands/workspaces.py +279 -0
- wxcli/commands/xapi.py +114 -0
- wxcli/config.py +139 -0
- wxcli/errors.py +77 -0
- wxcli/main.py +210 -0
- wxcli/migration/CLAUDE.md +106 -0
- wxcli/migration/__init__.py +1 -0
- wxcli/migration/advisory/CLAUDE.md +196 -0
- wxcli/migration/advisory/__init__.py +46 -0
- wxcli/migration/advisory/advisor.py +107 -0
- wxcli/migration/advisory/advisory_patterns.py +2552 -0
- wxcli/migration/advisory/recommendation_rules.py +835 -0
- wxcli/migration/cucm/CLAUDE.md +74 -0
- wxcli/migration/cucm/__init__.py +5 -0
- wxcli/migration/cucm/connection.py +265 -0
- wxcli/migration/cucm/discovery.py +225 -0
- wxcli/migration/cucm/extractors/__init__.py +1 -0
- wxcli/migration/cucm/extractors/announcements.py +92 -0
- wxcli/migration/cucm/extractors/base.py +90 -0
- wxcli/migration/cucm/extractors/device_profiles.py +98 -0
- wxcli/migration/cucm/extractors/devices.py +193 -0
- wxcli/migration/cucm/extractors/e911.py +103 -0
- wxcli/migration/cucm/extractors/features.py +309 -0
- wxcli/migration/cucm/extractors/helpers.py +73 -0
- wxcli/migration/cucm/extractors/informational.py +295 -0
- wxcli/migration/cucm/extractors/locations.py +221 -0
- wxcli/migration/cucm/extractors/moh.py +100 -0
- wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
- wxcli/migration/cucm/extractors/routing.py +493 -0
- wxcli/migration/cucm/extractors/shared_lines.py +146 -0
- wxcli/migration/cucm/extractors/templates.py +229 -0
- wxcli/migration/cucm/extractors/tier4.py +173 -0
- wxcli/migration/cucm/extractors/users.py +240 -0
- wxcli/migration/cucm/extractors/voicemail.py +243 -0
- wxcli/migration/cucm/extractors/workspaces.py +88 -0
- wxcli/migration/cucm/unity_connection.py +304 -0
- wxcli/migration/execute/CLAUDE.md +372 -0
- wxcli/migration/execute/__init__.py +303 -0
- wxcli/migration/execute/batch.py +277 -0
- wxcli/migration/execute/dependency.py +483 -0
- wxcli/migration/execute/engine.py +964 -0
- wxcli/migration/execute/handlers.py +2232 -0
- wxcli/migration/execute/planner.py +1939 -0
- wxcli/migration/execute/runtime.py +571 -0
- wxcli/migration/export/CLAUDE.md +49 -0
- wxcli/migration/export/__init__.py +8 -0
- wxcli/migration/export/csv_export.py +126 -0
- wxcli/migration/export/deployment_plan.py +479 -0
- wxcli/migration/export/json_export.py +60 -0
- wxcli/migration/models.py +941 -0
- wxcli/migration/phone_models.py +50 -0
- wxcli/migration/preflight/CLAUDE.md +52 -0
- wxcli/migration/preflight/__init__.py +89 -0
- wxcli/migration/preflight/checks.py +911 -0
- wxcli/migration/preflight/runner.py +293 -0
- wxcli/migration/rate_limiter.py +144 -0
- wxcli/migration/report/CLAUDE.md +245 -0
- wxcli/migration/report/__init__.py +7 -0
- wxcli/migration/report/appendix.py +2437 -0
- wxcli/migration/report/assembler.py +183 -0
- wxcli/migration/report/charts.py +263 -0
- wxcli/migration/report/executive.py +776 -0
- wxcli/migration/report/explainer.py +704 -0
- wxcli/migration/report/helpers.py +74 -0
- wxcli/migration/report/ingest.py +152 -0
- wxcli/migration/report/notice_templates.py +192 -0
- wxcli/migration/report/score.py +375 -0
- wxcli/migration/report/styles.py +1052 -0
- wxcli/migration/report/user_diff.py +1052 -0
- wxcli/migration/report/user_notice.py +425 -0
- wxcli/migration/state.py +139 -0
- wxcli/migration/store.py +860 -0
- wxcli/migration/transform/CLAUDE.md +107 -0
- wxcli/migration/transform/__init__.py +12 -0
- wxcli/migration/transform/analysis_pipeline.py +453 -0
- wxcli/migration/transform/analyzers/__init__.py +142 -0
- wxcli/migration/transform/analyzers/css_permission.py +189 -0
- wxcli/migration/transform/analyzers/css_routing.py +335 -0
- wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
- wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
- wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
- wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
- wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
- wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
- wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
- wxcli/migration/transform/analyzers/missing_data.py +300 -0
- wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
- wxcli/migration/transform/analyzers/shared_line.py +170 -0
- wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
- wxcli/migration/transform/analyzers/workspace_license.py +212 -0
- wxcli/migration/transform/cross_reference.py +1136 -0
- wxcli/migration/transform/cucm_pattern.py +246 -0
- wxcli/migration/transform/decisions.py +301 -0
- wxcli/migration/transform/e164.py +145 -0
- wxcli/migration/transform/engine.py +256 -0
- wxcli/migration/transform/mappers/CLAUDE.md +123 -0
- wxcli/migration/transform/mappers/__init__.py +76 -0
- wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
- wxcli/migration/transform/mappers/base.py +190 -0
- wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
- wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
- wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
- wxcli/migration/transform/mappers/css_mapper.py +868 -0
- wxcli/migration/transform/mappers/dect_mapper.py +367 -0
- wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
- wxcli/migration/transform/mappers/device_mapper.py +227 -0
- wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
- wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
- wxcli/migration/transform/mappers/e911_mapper.py +129 -0
- wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
- wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
- wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
- wxcli/migration/transform/mappers/line_mapper.py +310 -0
- wxcli/migration/transform/mappers/location_mapper.py +235 -0
- wxcli/migration/transform/mappers/moh_mapper.py +114 -0
- wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
- wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
- wxcli/migration/transform/mappers/routing_mapper.py +821 -0
- wxcli/migration/transform/mappers/snr_mapper.py +201 -0
- wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
- wxcli/migration/transform/mappers/user_mapper.py +264 -0
- wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
- wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
- wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
- wxcli/migration/transform/normalizers.py +2008 -0
- wxcli/migration/transform/pattern_converter.py +106 -0
- wxcli/migration/transform/pipeline.py +271 -0
- wxcli/migration/transform/rules.py +255 -0
- wxcli/org_health/CLAUDE.md +63 -0
- wxcli/org_health/__init__.py +7 -0
- wxcli/org_health/analyze.py +93 -0
- wxcli/org_health/checks.py +458 -0
- wxcli/org_health/collector.py +62 -0
- wxcli/org_health/models.py +78 -0
- wxcli/org_health/report.py +300 -0
- wxcli/output.py +101 -0
- wxcli-1.2.0.dist-info/METADATA +505 -0
- wxcli-1.2.0.dist-info/RECORD +413 -0
- wxcli-1.2.0.dist-info/WHEEL +5 -0
- wxcli-1.2.0.dist-info/entry_points.txt +2 -0
- wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
- wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
- wxcli-1.2.0.dist-info/scm_version.json +8 -0
- wxcli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1394 @@
|
|
|
1
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
2
|
+
# Person Call Settings — Call Handling Reference
|
|
3
|
+
|
|
4
|
+
## Sources
|
|
5
|
+
|
|
6
|
+
- wxc_sdk v1.30.0 (PersonSettingsApi)
|
|
7
|
+
- OpenAPI spec: specs/webex-cloud-calling.json
|
|
8
|
+
- developer.webex.com Person Call Settings APIs
|
|
9
|
+
|
|
10
|
+
Person-level call handling settings control how incoming calls are routed, filtered, and alerted for individual Webex Calling users. All APIs live under `PersonSettingsApi` (accessed via `api.person_settings.*`) and share a common base class pattern.
|
|
11
|
+
|
|
12
|
+
> **SDK access path:** `api.person_settings.<feature>`
|
|
13
|
+
> **REST base:** `people/{person_id}/features/{feature}` (with some remapped to `telephony/config/people/{person_id}/...`)
|
|
14
|
+
> **Also available for:** Workspaces, Virtual Lines (same API classes, different URL selectors)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Admin vs User-Only Access
|
|
19
|
+
|
|
20
|
+
Not all person call handling endpoints support admin-level access. Four features are **user-only** — they exist only at `/telephony/config/people/me/settings/{feature}` and require user-level OAuth. An admin cannot read or write these settings for another user.
|
|
21
|
+
|
|
22
|
+
| Feature | Admin Access | Admin REST Path | User REST Path |
|
|
23
|
+
|---------|-------------|-----------------|----------------|
|
|
24
|
+
| Call Forwarding | **Yes** | `/people/{id}/features/callForwarding` | `/people/me/features/callForwarding` |
|
|
25
|
+
| Call Waiting | **Yes** | `/people/{id}/features/callWaiting` | `/people/me/features/callWaiting` |
|
|
26
|
+
| Do Not Disturb | **Yes** | `/people/{id}/features/doNotDisturb` | `/people/me/features/doNotDisturb` |
|
|
27
|
+
| Simultaneous Ring | **No — user-only** | N/A | `/telephony/config/people/me/settings/simultaneousRing` |
|
|
28
|
+
| Sequential Ring | **No — user-only** | N/A | `/telephony/config/people/me/settings/sequentialRing` |
|
|
29
|
+
| Single Number Reach | **Yes** | `/telephony/config/people/{id}/singleNumberReach` | `/telephony/config/people/me/singleNumberReach` |
|
|
30
|
+
| Selective Accept | **Yes** | `/telephony/config/people/{id}/selectiveAccept` | `/telephony/config/people/me/selectiveAccept` |
|
|
31
|
+
| Selective Forward | **Yes** | `/telephony/config/people/{id}/selectiveForward` | `/telephony/config/people/me/selectiveForward` |
|
|
32
|
+
| Selective Reject | **Yes** | `/telephony/config/people/{id}/selectiveReject` | `/telephony/config/people/me/selectiveReject` |
|
|
33
|
+
| Priority Alert | **No — user-only** | N/A | `/telephony/config/people/me/settings/priorityAlert` |
|
|
34
|
+
| Call Notify | **No — user-only** | N/A | `/telephony/config/people/me/settings/callNotify` |
|
|
35
|
+
|
|
36
|
+
> **Call Notify** (`callNotify`) is a user-only feature not yet documented in this file. It follows the same criteria-based pattern as Priority Alert but sends email/text notifications instead of changing ring patterns.
|
|
37
|
+
|
|
38
|
+
### Beta: User Self-Service Endpoints
|
|
39
|
+
|
|
40
|
+
> **Beta API** — These endpoints are tagged as beta and may change without notice.
|
|
41
|
+
|
|
42
|
+
The following settings are available as user self-service endpoints (`/telephony/config/people/me/settings/...`) but are currently in beta:
|
|
43
|
+
|
|
44
|
+
| Setting | GET | PUT | Path Suffix |
|
|
45
|
+
|---------|-----|-----|-------------|
|
|
46
|
+
| Call Policies | Yes | Yes | `callPolicies` |
|
|
47
|
+
| Executive Screening | Yes | Yes | `executive/screening` |
|
|
48
|
+
| Executive Call Filtering | Yes | Yes | `executive/callFiltering` |
|
|
49
|
+
| Call Filtering Criteria | Yes | Yes (+ POST/DELETE) | `executive/callFiltering/criteria/{id}` |
|
|
50
|
+
| Do Not Disturb | Yes | Yes | `doNotDisturb` |
|
|
51
|
+
| Executive Alert | Yes | Yes | `executive/alert` |
|
|
52
|
+
| Country Config | Yes | - | `../countries/{countryCode}` |
|
|
53
|
+
| Announcement Languages | Yes | - | `../announcementLanguages` |
|
|
54
|
+
|
|
55
|
+
These require **user-level OAuth** (not admin tokens). The admin-path equivalents (`/people/{personId}/...`) exist for DND, executive screening/filtering, and executive alert but NOT for call policies.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Required Scopes
|
|
60
|
+
|
|
61
|
+
| Scope | Grants | Used By |
|
|
62
|
+
|-------|--------|---------|
|
|
63
|
+
| `spark-admin:people_read` | Read any person's call handling settings | Admin tokens |
|
|
64
|
+
| `spark-admin:people_write` | Modify any person's call handling settings | Admin tokens |
|
|
65
|
+
| `spark:people_read` | Read own call handling settings | User tokens (personal) |
|
|
66
|
+
| `spark:people_write` | Modify own call handling settings | User tokens (personal) |
|
|
67
|
+
| `spark-admin:telephony_config_read` | Read telephony config (used by Single Number Reach, some remapped endpoints) | Admin tokens |
|
|
68
|
+
| `spark-admin:telephony_config_write` | Modify telephony config (used by Single Number Reach, some remapped endpoints) | Admin tokens |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Common Patterns
|
|
73
|
+
|
|
74
|
+
All call handling APIs extend `PersonSettingsApiChild`, which builds endpoint URLs from a `feature` string:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
people/{person_id}/features/{feature}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Some features are remapped to `telephony/config/people/{person_id}/{feature}` at the SDK level (selective accept/forward/reject, music on hold, etc.). This is transparent to the caller.
|
|
81
|
+
|
|
82
|
+
Every feature API follows the same read/configure (or read/update) pattern. All methods accept an optional `org_id` parameter for partner administrators operating across organizations.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 1. Call Forwarding
|
|
87
|
+
|
|
88
|
+
Controls where incoming calls are sent when the user cannot or does not want to answer. Three forwarding modes plus business continuity.
|
|
89
|
+
|
|
90
|
+
**SDK path:** `api.person_settings.forwarding`
|
|
91
|
+
**Feature slug:** `callForwarding`
|
|
92
|
+
**Admin REST path:** `/people/{person_id}/features/callForwarding`
|
|
93
|
+
**API class:** `PersonForwardingApi`
|
|
94
|
+
|
|
95
|
+
### Data Models
|
|
96
|
+
|
|
97
|
+
#### `PersonForwardingSetting`
|
|
98
|
+
|
|
99
|
+
Top-level container returned by `read()` and accepted by `configure()`.
|
|
100
|
+
|
|
101
|
+
| Field | Type | Description |
|
|
102
|
+
|-------|------|-------------|
|
|
103
|
+
| `call_forwarding` | `CallForwardingPerson` | Always / Busy / No-Answer settings |
|
|
104
|
+
| `business_continuity` | `CallForwardingCommon` | Forwarding when phone is disconnected from network (power outage, Internet failure) |
|
|
105
|
+
|
|
106
|
+
#### `CallForwardingPerson`
|
|
107
|
+
|
|
108
|
+
| Field | Type | Description |
|
|
109
|
+
|-------|------|-------------|
|
|
110
|
+
| `always` | `CallForwardingAlways` | Forward ALL incoming calls |
|
|
111
|
+
| `busy` | `CallForwardingCommon` | Forward when phone is in use |
|
|
112
|
+
| `no_answer` | `CallForwardingNoAnswer` | Forward when unanswered |
|
|
113
|
+
|
|
114
|
+
#### `CallForwardingAlways` (extends `CallForwardingCommon`)
|
|
115
|
+
|
|
116
|
+
| Field | Type | Description |
|
|
117
|
+
|-------|------|-------------|
|
|
118
|
+
| `enabled` | `bool` | Enable/disable |
|
|
119
|
+
| `destination` | `str` (optional) | Destination number |
|
|
120
|
+
| `destination_voicemail_enabled` | `bool` (optional) | Send to destination's voicemail (internal numbers only) |
|
|
121
|
+
| `ring_reminder_enabled` | `bool` | Play brief tone on person's phone when a call is forwarded |
|
|
122
|
+
|
|
123
|
+
#### `CallForwardingNoAnswer` (extends `CallForwardingCommon`)
|
|
124
|
+
|
|
125
|
+
| Field | Type | Description |
|
|
126
|
+
|-------|------|-------------|
|
|
127
|
+
| `enabled` | `bool` | Enable/disable |
|
|
128
|
+
| `destination` | `str` (optional) | Destination number |
|
|
129
|
+
| `destination_voicemail_enabled` | `bool` (optional) | Send to destination's voicemail |
|
|
130
|
+
| `number_of_rings` | `int` | Rings before forwarding (default: 3) |
|
|
131
|
+
| `system_max_number_of_rings` | `int` (optional, read-only) | System-wide max rings allowed |
|
|
132
|
+
|
|
133
|
+
#### `CallForwardingCommon` (used for Busy and Business Continuity)
|
|
134
|
+
|
|
135
|
+
| Field | Type | Description |
|
|
136
|
+
|-------|------|-------------|
|
|
137
|
+
| `enabled` | `bool` | Enable/disable |
|
|
138
|
+
| `destination` | `str` (optional) | Destination number |
|
|
139
|
+
| `destination_voicemail_enabled` | `bool` (optional) | Send to destination's voicemail |
|
|
140
|
+
|
|
141
|
+
### Methods
|
|
142
|
+
|
|
143
|
+
#### Read
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
PersonForwardingApi.read(
|
|
147
|
+
entity_id: str,
|
|
148
|
+
org_id: str = None
|
|
149
|
+
) -> PersonForwardingSetting
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Scopes:** `spark-admin:people_read` or `spark:people_read`
|
|
153
|
+
|
|
154
|
+
#### Configure
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
PersonForwardingApi.configure(
|
|
158
|
+
entity_id: str,
|
|
159
|
+
forwarding: PersonForwardingSetting,
|
|
160
|
+
org_id: str = None
|
|
161
|
+
) -> None
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Scopes:** `spark-admin:people_write` or `spark:people_write`
|
|
165
|
+
|
|
166
|
+
**Note:** The `system_max_number_of_rings` field is excluded from the update payload automatically.
|
|
167
|
+
|
|
168
|
+
#### Factory Default
|
|
169
|
+
|
|
170
|
+
All data models provide a `.default()` static method to generate a reset-to-defaults instance:
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
forwarding = PersonForwardingSetting.default()
|
|
174
|
+
# Sets: always=disabled, busy=disabled, no_answer=disabled (3 rings),
|
|
175
|
+
# business_continuity=disabled
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Example: Reset Call Forwarding for All Users
|
|
179
|
+
|
|
180
|
+
From `examples/reset_call_forwarding.py` — uses the async API to reset forwarding in bulk:
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
from wxc_sdk.all_types import PersonForwardingSetting
|
|
184
|
+
from wxc_sdk.as_api import AsWebexSimpleApi
|
|
185
|
+
|
|
186
|
+
async with AsWebexSimpleApi() as api:
|
|
187
|
+
calling_users = [user for user in await api.people.list(calling_data=True)
|
|
188
|
+
if user.location_id]
|
|
189
|
+
|
|
190
|
+
forwarding = PersonForwardingSetting.default()
|
|
191
|
+
await asyncio.gather(*[
|
|
192
|
+
api.person_settings.forwarding.configure(
|
|
193
|
+
entity_id=user.person_id,
|
|
194
|
+
forwarding=forwarding
|
|
195
|
+
)
|
|
196
|
+
for user in calling_users
|
|
197
|
+
])
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Example: Enable Always-Forward
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
settings = api.person_settings.forwarding.read(entity_id=person_id)
|
|
204
|
+
settings.call_forwarding.always = CallForwardingAlways(
|
|
205
|
+
enabled=True,
|
|
206
|
+
destination='+12223334444',
|
|
207
|
+
destination_voicemail_enabled=True,
|
|
208
|
+
ring_reminder_enabled=True
|
|
209
|
+
)
|
|
210
|
+
api.person_settings.forwarding.configure(entity_id=person_id, forwarding=settings)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### CLI Examples
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# Read call forwarding settings for a person
|
|
217
|
+
wxcli user-settings show-call-forwarding Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
218
|
+
|
|
219
|
+
# Enable always-forward to a destination (uses --json-body for nested settings)
|
|
220
|
+
wxcli user-settings update-call-forwarding Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
221
|
+
--json-body '{"callForwarding":{"always":{"enabled":true,"destination":"+12223334444","ringReminderEnabled":true}}}'
|
|
222
|
+
|
|
223
|
+
# Enable no-answer forwarding with 5 rings
|
|
224
|
+
wxcli user-settings update-call-forwarding Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
225
|
+
--json-body '{"callForwarding":{"noAnswer":{"enabled":true,"destination":"+15556667777","numberOfRings":5}}}'
|
|
226
|
+
|
|
227
|
+
# Enable business continuity forwarding
|
|
228
|
+
wxcli user-settings update-call-forwarding Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
229
|
+
--json-body '{"businessContinuity":{"enabled":true,"destination":"+18889990000"}}'
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Raw HTTP
|
|
233
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from wxc_sdk import WebexSimpleApi
|
|
237
|
+
api = WebexSimpleApi()
|
|
238
|
+
BASE = "https://webexapis.com/v1"
|
|
239
|
+
|
|
240
|
+
# GET — read call forwarding settings
|
|
241
|
+
result = api.session.rest_get(f"{BASE}/people/{person_id}/features/callForwarding")
|
|
242
|
+
# Returns: {"callForwarding": {"always": {...}, "busy": {...}, "noAnswer": {...}}, "businessContinuity": {...}}
|
|
243
|
+
|
|
244
|
+
# PUT — update call forwarding settings
|
|
245
|
+
body = {
|
|
246
|
+
"callForwarding": {
|
|
247
|
+
"always": {
|
|
248
|
+
"enabled": True,
|
|
249
|
+
"destination": "+12223334444",
|
|
250
|
+
"destinationVoicemailEnabled": True,
|
|
251
|
+
"ringReminderEnabled": True
|
|
252
|
+
},
|
|
253
|
+
"busy": {"enabled": False},
|
|
254
|
+
"noAnswer": {"enabled": True, "destination": "+15556667777", "numberOfRings": 5}
|
|
255
|
+
},
|
|
256
|
+
"businessContinuity": {"enabled": True, "destination": "+18889990000"}
|
|
257
|
+
}
|
|
258
|
+
api.session.rest_put(f"{BASE}/people/{person_id}/features/callForwarding", json=body)
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Gotchas
|
|
262
|
+
|
|
263
|
+
- `systemMaxNumberOfRings` is read-only; omit it from the PUT body.
|
|
264
|
+
- Call forwarding requires `--json-body` in the CLI because the payload has nested objects (`callForwarding.always`, `callForwarding.busy`, etc.).
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 2. Call Waiting
|
|
269
|
+
|
|
270
|
+
Controls whether a user can place an active call on hold to answer a second incoming call. A tone alerts the user of the incoming call.
|
|
271
|
+
|
|
272
|
+
**SDK path:** `api.person_settings.call_waiting`
|
|
273
|
+
**Feature slug:** `callWaiting`
|
|
274
|
+
**Admin REST path:** `/people/{person_id}/features/callWaiting`
|
|
275
|
+
**API class:** `CallWaitingApi`
|
|
276
|
+
|
|
277
|
+
### Data Model
|
|
278
|
+
|
|
279
|
+
No separate model — returns and accepts a simple `bool`.
|
|
280
|
+
|
|
281
|
+
### Methods
|
|
282
|
+
|
|
283
|
+
#### Read
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
CallWaitingApi.read(
|
|
287
|
+
entity_id: str,
|
|
288
|
+
org_id: str = None
|
|
289
|
+
) -> bool
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Returns `True` if call waiting is enabled.
|
|
293
|
+
|
|
294
|
+
**Scopes:** `spark-admin:people_read` or `spark:people_read`
|
|
295
|
+
|
|
296
|
+
#### Configure
|
|
297
|
+
|
|
298
|
+
```python
|
|
299
|
+
CallWaitingApi.configure(
|
|
300
|
+
entity_id: str,
|
|
301
|
+
enabled: bool,
|
|
302
|
+
org_id: str = None
|
|
303
|
+
) -> None
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Scopes:** `spark-admin:people_write` or `spark:people_write`
|
|
307
|
+
|
|
308
|
+
### Example
|
|
309
|
+
|
|
310
|
+
```python
|
|
311
|
+
# Check if call waiting is enabled
|
|
312
|
+
is_enabled = api.person_settings.call_waiting.read(entity_id=person_id)
|
|
313
|
+
|
|
314
|
+
# Disable call waiting
|
|
315
|
+
api.person_settings.call_waiting.configure(entity_id=person_id, enabled=False)
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### CLI Examples
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# Read call waiting settings for a person
|
|
322
|
+
wxcli user-settings show-call-waiting Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
323
|
+
|
|
324
|
+
# Enable call waiting
|
|
325
|
+
wxcli user-settings update-call-waiting Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --enabled
|
|
326
|
+
|
|
327
|
+
# Disable call waiting
|
|
328
|
+
wxcli user-settings update-call-waiting Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --no-enabled
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Raw HTTP
|
|
332
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
333
|
+
|
|
334
|
+
```python
|
|
335
|
+
from wxc_sdk import WebexSimpleApi
|
|
336
|
+
api = WebexSimpleApi()
|
|
337
|
+
BASE = "https://webexapis.com/v1"
|
|
338
|
+
|
|
339
|
+
# GET — read call waiting
|
|
340
|
+
result = api.session.rest_get(f"{BASE}/people/{person_id}/features/callWaiting")
|
|
341
|
+
# Returns: {"enabled": true}
|
|
342
|
+
|
|
343
|
+
# PUT — update call waiting
|
|
344
|
+
api.session.rest_put(f"{BASE}/people/{person_id}/features/callWaiting", json={"enabled": False})
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## 3. Do Not Disturb (DND)
|
|
350
|
+
|
|
351
|
+
When enabled, all incoming calls receive busy treatment. Optionally plays a ring splash (brief tone) on the desktop phone as a reminder.
|
|
352
|
+
|
|
353
|
+
**SDK path:** `api.person_settings.dnd`
|
|
354
|
+
**Feature slug:** `doNotDisturb`
|
|
355
|
+
**Admin REST path:** `/people/{person_id}/features/doNotDisturb`
|
|
356
|
+
**API class:** `DndApi`
|
|
357
|
+
|
|
358
|
+
### Data Model — `DND`
|
|
359
|
+
|
|
360
|
+
| Field | Type | Description |
|
|
361
|
+
|-------|------|-------------|
|
|
362
|
+
| `enabled` | `bool` (optional) | Enable/disable DND |
|
|
363
|
+
| `ring_splash_enabled` | `bool` (optional) | Play brief ring reminder tone on desktop phone for incoming calls |
|
|
364
|
+
| `webex_go_override_enabled` | `bool` (optional) | When `true`, mobile device still rings even if DND is on |
|
|
365
|
+
|
|
366
|
+
### Methods
|
|
367
|
+
|
|
368
|
+
#### Read
|
|
369
|
+
|
|
370
|
+
```python
|
|
371
|
+
DndApi.read(
|
|
372
|
+
entity_id: str,
|
|
373
|
+
org_id: str = None
|
|
374
|
+
) -> DND
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**Scopes:** `spark-admin:people_read` or `spark:people_read`
|
|
378
|
+
|
|
379
|
+
#### Configure
|
|
380
|
+
|
|
381
|
+
```python
|
|
382
|
+
DndApi.configure(
|
|
383
|
+
entity_id: str,
|
|
384
|
+
dnd_settings: DND,
|
|
385
|
+
org_id: str = None
|
|
386
|
+
) -> None
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**Scopes:** `spark-admin:people_write` or `spark:people_write`
|
|
390
|
+
|
|
391
|
+
### Example
|
|
392
|
+
|
|
393
|
+
```python
|
|
394
|
+
from wxc_sdk.person_settings.dnd import DND
|
|
395
|
+
|
|
396
|
+
# Enable DND with ring splash
|
|
397
|
+
api.person_settings.dnd.configure(
|
|
398
|
+
entity_id=person_id,
|
|
399
|
+
dnd_settings=DND(enabled=True, ring_splash_enabled=True)
|
|
400
|
+
)
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### CLI Examples
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
# Read DND settings for a person
|
|
407
|
+
wxcli user-settings show-do-not-disturb Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
408
|
+
|
|
409
|
+
# Enable DND with ring splash
|
|
410
|
+
wxcli user-settings update-do-not-disturb Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
411
|
+
--enabled --ring-splash-enabled
|
|
412
|
+
|
|
413
|
+
# Disable DND
|
|
414
|
+
wxcli user-settings update-do-not-disturb Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --no-enabled
|
|
415
|
+
|
|
416
|
+
# Enable DND but keep mobile ringing (Webex Go override)
|
|
417
|
+
wxcli user-settings update-do-not-disturb Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
418
|
+
--enabled --webex-go-override-enabled
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Raw HTTP
|
|
422
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
423
|
+
|
|
424
|
+
```python
|
|
425
|
+
from wxc_sdk import WebexSimpleApi
|
|
426
|
+
api = WebexSimpleApi()
|
|
427
|
+
BASE = "https://webexapis.com/v1"
|
|
428
|
+
|
|
429
|
+
# GET — read DND settings
|
|
430
|
+
result = api.session.rest_get(f"{BASE}/people/{person_id}/features/doNotDisturb")
|
|
431
|
+
# Returns: {"enabled": true, "ringSplashEnabled": true}
|
|
432
|
+
|
|
433
|
+
# PUT — update DND settings
|
|
434
|
+
api.session.rest_put(f"{BASE}/people/{person_id}/features/doNotDisturb", json={
|
|
435
|
+
"enabled": True,
|
|
436
|
+
"ringSplashEnabled": True
|
|
437
|
+
})
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 4. Simultaneous Ring
|
|
443
|
+
|
|
444
|
+
> **Admin access: Not available.** This endpoint only exists at `/telephony/config/people/me/settings/simultaneousRing` (user-level OAuth). No admin-level path exists — `/telephony/config/people/{personId}/simultaneousRing` returns 404.
|
|
445
|
+
|
|
446
|
+
Ring the user's office phone and up to 10 additional phone numbers at the same time when an incoming call arrives. Supports schedule-based criteria to control when simultaneous ring is active.
|
|
447
|
+
|
|
448
|
+
**SDK path:** `api.person_settings.sim_ring`
|
|
449
|
+
**Feature slug:** `simultaneousRing`
|
|
450
|
+
**API class:** `SimRingApi`
|
|
451
|
+
|
|
452
|
+
### Data Models
|
|
453
|
+
|
|
454
|
+
#### `SimRing`
|
|
455
|
+
|
|
456
|
+
| Field | Type | Description |
|
|
457
|
+
|-------|------|-------------|
|
|
458
|
+
| `enabled` | `bool` (optional) | Enable/disable simultaneous ring |
|
|
459
|
+
| `do_not_ring_if_on_call_enabled` | `bool` (optional) | Suppress ringing additional numbers when already on a call |
|
|
460
|
+
| `phone_numbers` | `list[SimRingNumber]` (optional) | Up to 10 numbers to ring simultaneously |
|
|
461
|
+
| `criteria` | `list[SelectiveCrit]` (optional, read-only) | Schedule-based criteria list (managed via criteria sub-endpoints) |
|
|
462
|
+
| `criterias_enabled` | `bool` (optional) | Enable/disable schedule-based criteria |
|
|
463
|
+
|
|
464
|
+
#### `SimRingNumber`
|
|
465
|
+
|
|
466
|
+
| Field | Type | Description |
|
|
467
|
+
|-------|------|-------------|
|
|
468
|
+
| `phone_number` | `str` (optional, E.164) | Phone number to ring |
|
|
469
|
+
| `answer_confirmation_required_enabled` | `bool` (optional) | Require called party to press 1 to accept |
|
|
470
|
+
|
|
471
|
+
#### `SimRingCriteria` (extends `SelectiveCriteria`)
|
|
472
|
+
|
|
473
|
+
Uses `ringEnabled` as the enabled attribute. See [Shared Criteria Model](#shared-criteria-model-selectivecriteria) below.
|
|
474
|
+
|
|
475
|
+
### Methods
|
|
476
|
+
|
|
477
|
+
#### Read Settings
|
|
478
|
+
|
|
479
|
+
```python
|
|
480
|
+
SimRingApi.read(
|
|
481
|
+
entity_id: str,
|
|
482
|
+
org_id: str = None
|
|
483
|
+
) -> SimRing
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
#### Configure Settings
|
|
487
|
+
|
|
488
|
+
```python
|
|
489
|
+
SimRingApi.configure(
|
|
490
|
+
entity_id: str,
|
|
491
|
+
settings: SimRing,
|
|
492
|
+
org_id: str = None
|
|
493
|
+
) -> None
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Note:** The `criteria` list is excluded from the update payload. Criteria are managed via dedicated CRUD methods.
|
|
497
|
+
|
|
498
|
+
#### Criteria CRUD
|
|
499
|
+
|
|
500
|
+
```python
|
|
501
|
+
SimRingApi.create_criteria(entity_id: str, settings: SimRingCriteria, org_id: str = None) -> str
|
|
502
|
+
SimRingApi.read_criteria(entity_id: str, id: str, org_id: str = None) -> SimRingCriteria
|
|
503
|
+
SimRingApi.configure_criteria(entity_id: str, id: str, settings: SimRingCriteria, org_id: str = None) -> None
|
|
504
|
+
SimRingApi.delete_criteria(entity_id: str, id: str, org_id: str = None) -> None
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
`create_criteria` returns the new criteria ID.
|
|
508
|
+
|
|
509
|
+
### CLI Examples
|
|
510
|
+
|
|
511
|
+
No dedicated CLI commands for Simultaneous Ring. Use Raw HTTP or the SDK.
|
|
512
|
+
|
|
513
|
+
### Raw HTTP
|
|
514
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
515
|
+
|
|
516
|
+
```python
|
|
517
|
+
from wxc_sdk import WebexSimpleApi
|
|
518
|
+
api = WebexSimpleApi()
|
|
519
|
+
BASE = "https://webexapis.com/v1"
|
|
520
|
+
|
|
521
|
+
# GET — read simultaneous ring settings
|
|
522
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/simultaneousRing")
|
|
523
|
+
# Returns: {"enabled": true, "doNotRingIfOnCallEnabled": false, "phoneNumbers": [...], "criterias": [...]}
|
|
524
|
+
|
|
525
|
+
# PUT — update simultaneous ring settings (criteria list excluded)
|
|
526
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/simultaneousRing", json={
|
|
527
|
+
"enabled": True,
|
|
528
|
+
"doNotRingIfOnCallEnabled": True,
|
|
529
|
+
"phoneNumbers": [
|
|
530
|
+
{"phoneNumber": "+12223334444", "answerConfirmationRequiredEnabled": False}
|
|
531
|
+
]
|
|
532
|
+
})
|
|
533
|
+
|
|
534
|
+
# Criteria CRUD
|
|
535
|
+
# POST — create criteria (returns ID in Location header)
|
|
536
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/simultaneousRing/criteria", json={...})
|
|
537
|
+
# GET — read single criteria
|
|
538
|
+
api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/simultaneousRing/criteria/{criteria_id}")
|
|
539
|
+
# PUT — update criteria
|
|
540
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/simultaneousRing/criteria/{criteria_id}", json={...})
|
|
541
|
+
# DELETE — delete criteria
|
|
542
|
+
api.session.rest_delete(f"{BASE}/telephony/config/people/{person_id}/simultaneousRing/criteria/{criteria_id}")
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Gotchas
|
|
546
|
+
|
|
547
|
+
- **User-only endpoint.** No admin-level path exists. The paths `telephony/config/people/{personId}/simultaneousRing` and `people/{personId}/features/simultaneousRing` both return 404 with an admin token. Only `/telephony/config/people/me/settings/simultaneousRing` works, and it requires user-level OAuth.
|
|
548
|
+
- `SimRingApi` may not be imported into `PersonSettingsApi` in some SDK versions.
|
|
549
|
+
- The `criteria` list is excluded from the update payload. Criteria are managed via dedicated CRUD methods.
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
## 5. Sequential Ring
|
|
554
|
+
|
|
555
|
+
> **Admin access: Not available.** This endpoint only exists at `/telephony/config/people/me/settings/sequentialRing` (user-level OAuth). No admin-level path exists — `/telephony/config/people/{personId}/sequentialRing` returns 404.
|
|
556
|
+
|
|
557
|
+
Ring up to five phone numbers one after another when an incoming call arrives. Configurable ring counts per number, optional primary-line-first behavior, and schedule-based criteria.
|
|
558
|
+
|
|
559
|
+
**SDK path:** `api.person_settings.sequential_ring`
|
|
560
|
+
**Feature slug:** `sequentialRing`
|
|
561
|
+
**API class:** `SequentialRingApi`
|
|
562
|
+
|
|
563
|
+
### Data Models
|
|
564
|
+
|
|
565
|
+
#### `SequentialRing`
|
|
566
|
+
|
|
567
|
+
| Field | Type | Description |
|
|
568
|
+
|-------|------|-------------|
|
|
569
|
+
| `enabled` | `bool` (optional) | Enable/disable sequential ring |
|
|
570
|
+
| `ring_base_location_first_enabled` | `bool` (optional) | Ring primary (Webex Calling) line first |
|
|
571
|
+
| `base_location_number_of_rings` | `int` (optional) | Number of rings on primary line before advancing |
|
|
572
|
+
| `continue_if_base_location_is_busy_enabled` | `bool` (optional) | If primary line is busy, proceed to sequential numbers |
|
|
573
|
+
| `calls_to_voicemail_enabled` | `bool` (optional) | Send to voicemail if no sequential number answers |
|
|
574
|
+
| `phone_numbers` | `list[SequentialRingNumber]` (optional) | Up to 5 numbers to ring in sequence |
|
|
575
|
+
| `criteria` | `list[SelectiveCrit]` (optional, read-only) | Schedule-based criteria |
|
|
576
|
+
|
|
577
|
+
#### `SequentialRingNumber`
|
|
578
|
+
|
|
579
|
+
| Field | Type | Description |
|
|
580
|
+
|-------|------|-------------|
|
|
581
|
+
| `phone_number` | `str` (optional) | Phone number in sequence |
|
|
582
|
+
| `answer_confirmation_required_enabled` | `bool` (optional) | Require called party to press 1 to accept |
|
|
583
|
+
| `number_of_rings` | `int` (optional) | Rings before advancing to next number |
|
|
584
|
+
|
|
585
|
+
#### `SequentialRingCriteria` (extends `SelectiveCriteria`)
|
|
586
|
+
|
|
587
|
+
Uses `ringEnabled` as the enabled attribute. See [Shared Criteria Model](#shared-criteria-model-selectivecriteria) below.
|
|
588
|
+
|
|
589
|
+
### Methods
|
|
590
|
+
|
|
591
|
+
#### Read Settings
|
|
592
|
+
|
|
593
|
+
```python
|
|
594
|
+
SequentialRingApi.read(
|
|
595
|
+
entity_id: str,
|
|
596
|
+
org_id: str = None
|
|
597
|
+
) -> SequentialRing
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
#### Configure Settings
|
|
601
|
+
|
|
602
|
+
```python
|
|
603
|
+
SequentialRingApi.configure(
|
|
604
|
+
entity_id: str,
|
|
605
|
+
settings: SequentialRing,
|
|
606
|
+
org_id: str = None
|
|
607
|
+
) -> None
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
**Note:** The `criteria` list is excluded from the update payload. Criteria are managed separately.
|
|
611
|
+
|
|
612
|
+
#### Criteria CRUD
|
|
613
|
+
|
|
614
|
+
```python
|
|
615
|
+
SequentialRingApi.create_criteria(entity_id: str, settings: SequentialRingCriteria, org_id: str = None) -> str
|
|
616
|
+
SequentialRingApi.read_criteria(entity_id: str, id: str, org_id: str = None) -> SequentialRingCriteria
|
|
617
|
+
SequentialRingApi.configure_criteria(entity_id: str, id: str, settings: SequentialRingCriteria, org_id: str = None) -> None
|
|
618
|
+
SequentialRingApi.delete_criteria(entity_id: str, id: str, org_id: str = None) -> None
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
### CLI Examples
|
|
622
|
+
|
|
623
|
+
No dedicated CLI commands for Sequential Ring. Use Raw HTTP or the SDK.
|
|
624
|
+
|
|
625
|
+
### Raw HTTP
|
|
626
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
627
|
+
|
|
628
|
+
```python
|
|
629
|
+
from wxc_sdk import WebexSimpleApi
|
|
630
|
+
api = WebexSimpleApi()
|
|
631
|
+
BASE = "https://webexapis.com/v1"
|
|
632
|
+
|
|
633
|
+
# GET — read sequential ring settings
|
|
634
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/sequentialRing")
|
|
635
|
+
# Returns: {"enabled": true, "ringBaseLocationFirstEnabled": true, "baseLocationNumberOfRings": 3, ...}
|
|
636
|
+
|
|
637
|
+
# PUT — update sequential ring settings (criteria list excluded)
|
|
638
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/sequentialRing", json={
|
|
639
|
+
"enabled": True,
|
|
640
|
+
"ringBaseLocationFirstEnabled": True,
|
|
641
|
+
"baseLocationNumberOfRings": 3,
|
|
642
|
+
"continueIfBaseLocationIsBusyEnabled": True,
|
|
643
|
+
"callsToVoicemailEnabled": True,
|
|
644
|
+
"phoneNumbers": [
|
|
645
|
+
{"phoneNumber": "+12223334444", "answerConfirmationRequiredEnabled": False, "numberOfRings": 3}
|
|
646
|
+
]
|
|
647
|
+
})
|
|
648
|
+
|
|
649
|
+
# Criteria CRUD
|
|
650
|
+
# POST — create criteria
|
|
651
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/sequentialRing/criteria", json={...})
|
|
652
|
+
# GET — read single criteria
|
|
653
|
+
api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/sequentialRing/criteria/{criteria_id}")
|
|
654
|
+
# PUT — update criteria
|
|
655
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/sequentialRing/criteria/{criteria_id}", json={...})
|
|
656
|
+
# DELETE — delete criteria
|
|
657
|
+
api.session.rest_delete(f"{BASE}/telephony/config/people/{person_id}/sequentialRing/criteria/{criteria_id}")
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
### Gotchas
|
|
661
|
+
|
|
662
|
+
- **User-only endpoint.** No admin-level path exists. The paths `telephony/config/people/{personId}/sequentialRing` and `people/{personId}/features/sequentialRing` both return 404 with an admin token. Only `/telephony/config/people/me/settings/sequentialRing` works, and it requires user-level OAuth.
|
|
663
|
+
- `SequentialRingApi` may not be imported into `PersonSettingsApi` in some SDK versions.
|
|
664
|
+
- The `criteria` list is excluded from the update payload. Criteria are managed via dedicated CRUD methods.
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
## 6. Single Number Reach
|
|
669
|
+
|
|
670
|
+
Ring remote destinations (mobile, home, etc.) alongside or instead of the office phone. Unlike Simultaneous Ring, Single Number Reach operates at the `telephony/config` level and manages individual number entries with their own IDs.
|
|
671
|
+
|
|
672
|
+
**SDK path:** `api.person_settings.single_number_reach`
|
|
673
|
+
**REST base:** `telephony/config/people/{person_id}/singleNumberReach`
|
|
674
|
+
**API class:** `SingleNumberReachApi`
|
|
675
|
+
|
|
676
|
+
### Data Models
|
|
677
|
+
|
|
678
|
+
#### `SingleNumberReach`
|
|
679
|
+
|
|
680
|
+
| Field | Type | Description |
|
|
681
|
+
|-------|------|-------------|
|
|
682
|
+
| `enabled` | `bool` (optional) | Enable/disable Single Number Reach |
|
|
683
|
+
| `alert_all_numbers_for_click_to_dial_calls_enabled` | `bool` (optional) | Ring SNR numbers for click-to-dial calls |
|
|
684
|
+
| `numbers` | `list[SingleNumberReachNumber]` (optional) | Array of SNR number entries |
|
|
685
|
+
|
|
686
|
+
#### `SingleNumberReachNumber`
|
|
687
|
+
|
|
688
|
+
| Field | Type | Description |
|
|
689
|
+
|-------|------|-------------|
|
|
690
|
+
| `id` | `str` (optional) | SNR entry ID (base64-encoded phone number; changes if number is modified) |
|
|
691
|
+
| `phone_number` | `str` (optional) | Phone number in E.164 format |
|
|
692
|
+
| `enabled` | `bool` (optional) | Enable/disable this specific number |
|
|
693
|
+
| `name` | `str` (optional) | Display name for this entry |
|
|
694
|
+
| `do_not_forward_calls_enabled` | `bool` (optional) | Skip call forwarding settings for this number |
|
|
695
|
+
| `answer_confirmation_enabled` | `bool` (optional) | Prompt recipient to press a key before connecting |
|
|
696
|
+
|
|
697
|
+
### Methods
|
|
698
|
+
|
|
699
|
+
#### Read Settings
|
|
700
|
+
|
|
701
|
+
```python
|
|
702
|
+
SingleNumberReachApi.read(
|
|
703
|
+
person_id: str
|
|
704
|
+
) -> SingleNumberReach
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
**Scopes:** `spark-admin:telephony_config_read`
|
|
708
|
+
|
|
709
|
+
#### Update Settings
|
|
710
|
+
|
|
711
|
+
```python
|
|
712
|
+
SingleNumberReachApi.update(
|
|
713
|
+
person_id: str,
|
|
714
|
+
alert_all_numbers_for_click_to_dial_calls_enabled: bool = None
|
|
715
|
+
) -> None
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
**Scopes:** `spark-admin:telephony_config_write`
|
|
719
|
+
|
|
720
|
+
**Note:** This only updates the top-level `alert_all_numbers_for_click_to_dial_calls_enabled` flag. Individual numbers are managed via the SNR number CRUD methods below.
|
|
721
|
+
|
|
722
|
+
#### SNR Number CRUD
|
|
723
|
+
|
|
724
|
+
```python
|
|
725
|
+
SingleNumberReachApi.create_snr(person_id: str, settings: SingleNumberReachNumber) -> str
|
|
726
|
+
SingleNumberReachApi.update_snr(person_id: str, settings: SingleNumberReachNumber) -> str
|
|
727
|
+
SingleNumberReachApi.delete_snr(person_id: str, id: str, org_id: str = None) -> None
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
- `create_snr` returns the new entry ID.
|
|
731
|
+
- `update_snr` returns the (possibly changed) entry ID. The `settings.id` field is used to identify the target entry. **Important:** The ID can change if the phone number is modified, since the ID is base64-encoded phone number data.
|
|
732
|
+
- The `id` field is excluded from the create/update request body automatically.
|
|
733
|
+
|
|
734
|
+
#### Available Phone Numbers
|
|
735
|
+
|
|
736
|
+
```python
|
|
737
|
+
SingleNumberReachApi.available_phone_numbers(
|
|
738
|
+
location_id: str,
|
|
739
|
+
phone_number: list[str] = None,
|
|
740
|
+
org_id: str = None
|
|
741
|
+
) -> Generator[AvailableNumber, None, None]
|
|
742
|
+
```
|
|
743
|
+
|
|
744
|
+
Lists service and standard PSTN numbers at a location that are available for SNR assignment.
|
|
745
|
+
|
|
746
|
+
**Scopes:** `spark-admin:telephony_config_read`
|
|
747
|
+
|
|
748
|
+
### CLI Examples
|
|
749
|
+
|
|
750
|
+
```bash
|
|
751
|
+
# Read Single Number Reach settings for a person
|
|
752
|
+
wxcli single-number-reach list-single-number-reach Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
753
|
+
|
|
754
|
+
# Update top-level SNR settings (alert all numbers for click-to-dial)
|
|
755
|
+
wxcli single-number-reach update Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
756
|
+
--alert-all-numbers-for-click-to-dial-calls-enabled
|
|
757
|
+
|
|
758
|
+
# Create an SNR number entry
|
|
759
|
+
wxcli single-number-reach create Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
760
|
+
--phone-number "+12223334444" --enabled --name "Mobile" \
|
|
761
|
+
--answer-confirmation-enabled
|
|
762
|
+
|
|
763
|
+
# Update an SNR number entry
|
|
764
|
+
wxcli single-number-reach update-numbers Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
765
|
+
--json-body '{"enabled": false}'
|
|
766
|
+
|
|
767
|
+
# Delete an SNR number entry
|
|
768
|
+
wxcli single-number-reach delete Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 MTIyMjMzMzQ0NDQ=
|
|
769
|
+
|
|
770
|
+
# List available phone numbers for SNR at a location
|
|
771
|
+
wxcli single-number-reach list Y2lzY29zcGFyazovL3VzL0xPQ0FUSU9OLzU2Nzg=
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
### Raw HTTP
|
|
775
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
776
|
+
|
|
777
|
+
```python
|
|
778
|
+
from wxc_sdk import WebexSimpleApi
|
|
779
|
+
api = WebexSimpleApi()
|
|
780
|
+
BASE = "https://webexapis.com/v1"
|
|
781
|
+
|
|
782
|
+
# GET — read Single Number Reach settings
|
|
783
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/singleNumberReach")
|
|
784
|
+
# Returns: {"enabled": true, "alertAllNumbersForClickToDialCallsEnabled": false, "numbers": [...]}
|
|
785
|
+
|
|
786
|
+
# PUT — update top-level SNR settings
|
|
787
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/singleNumberReach", json={
|
|
788
|
+
"alertAllNumbersForClickToDialCallsEnabled": True
|
|
789
|
+
})
|
|
790
|
+
|
|
791
|
+
# SNR Number CRUD
|
|
792
|
+
# POST — create an SNR number entry
|
|
793
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/singleNumberReach/numbers", json={
|
|
794
|
+
"phoneNumber": "+12223334444",
|
|
795
|
+
"enabled": True,
|
|
796
|
+
"name": "Mobile",
|
|
797
|
+
"doNotForwardCallsEnabled": False,
|
|
798
|
+
"answerConfirmationEnabled": True
|
|
799
|
+
})
|
|
800
|
+
|
|
801
|
+
# PUT — update an SNR number entry
|
|
802
|
+
api.session.rest_put(
|
|
803
|
+
f"{BASE}/telephony/config/people/{person_id}/singleNumberReach/numbers/{snr_number_id}",
|
|
804
|
+
json={"enabled": False}
|
|
805
|
+
)
|
|
806
|
+
|
|
807
|
+
# DELETE — delete an SNR number entry
|
|
808
|
+
api.session.rest_delete(
|
|
809
|
+
f"{BASE}/telephony/config/people/{person_id}/singleNumberReach/numbers/{snr_number_id}"
|
|
810
|
+
)
|
|
811
|
+
|
|
812
|
+
# GET — list available phone numbers for SNR at a location
|
|
813
|
+
result = api.session.rest_get(
|
|
814
|
+
f"{BASE}/telephony/config/locations/{location_id}/singleNumberReach/availableNumbers"
|
|
815
|
+
)
|
|
816
|
+
```
|
|
817
|
+
|
|
818
|
+
### Gotchas
|
|
819
|
+
|
|
820
|
+
- SNR number IDs are base64-encoded phone numbers. The ID changes if the phone number is modified.
|
|
821
|
+
- The `update` method only updates the top-level `alertAllNumbersForClickToDialCallsEnabled` flag. Individual numbers are managed via the SNR number CRUD methods (`create`, `update-numbers`, `delete`).
|
|
822
|
+
- The `id` field is excluded from the create/update request body automatically.
|
|
823
|
+
|
|
824
|
+
---
|
|
825
|
+
|
|
826
|
+
## 7. Selective Accept
|
|
827
|
+
|
|
828
|
+
Accept calls only from specific callers or during specific schedules. Calls not matching any enabled criteria are rejected.
|
|
829
|
+
|
|
830
|
+
**SDK path:** `api.person_settings.selective_accept`
|
|
831
|
+
**Feature slug:** `selectiveAccept`
|
|
832
|
+
**REST path (remapped):** `telephony/config/people/{person_id}/selectiveAccept`
|
|
833
|
+
**API class:** `SelectiveAcceptApi`
|
|
834
|
+
|
|
835
|
+
### Data Models
|
|
836
|
+
|
|
837
|
+
#### `SelectiveAccept`
|
|
838
|
+
|
|
839
|
+
| Field | Type | Description |
|
|
840
|
+
|-------|------|-------------|
|
|
841
|
+
| `enabled` | `bool` (optional) | Enable/disable selective accept |
|
|
842
|
+
| `criteria` | `list[SelectiveCrit]` (optional, read-only) | List of criteria summaries |
|
|
843
|
+
|
|
844
|
+
#### `SelectiveAcceptCriteria` (extends `SelectiveCriteria`)
|
|
845
|
+
|
|
846
|
+
Uses `acceptEnabled` as the enabled attribute and `phoneNumbers` for the number list. See [Shared Criteria Model](#shared-criteria-model-selectivecriteria) below.
|
|
847
|
+
|
|
848
|
+
### Methods
|
|
849
|
+
|
|
850
|
+
#### Read Settings
|
|
851
|
+
|
|
852
|
+
```python
|
|
853
|
+
SelectiveAcceptApi.read(
|
|
854
|
+
entity_id: str,
|
|
855
|
+
org_id: str = None
|
|
856
|
+
) -> SelectiveAccept
|
|
857
|
+
```
|
|
858
|
+
|
|
859
|
+
#### Configure Settings
|
|
860
|
+
|
|
861
|
+
```python
|
|
862
|
+
SelectiveAcceptApi.configure(
|
|
863
|
+
entity_id: str,
|
|
864
|
+
settings: SelectiveAccept,
|
|
865
|
+
org_id: str = None
|
|
866
|
+
) -> None
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
#### Criteria CRUD
|
|
870
|
+
|
|
871
|
+
```python
|
|
872
|
+
SelectiveAcceptApi.create_criteria(entity_id: str, settings: SelectiveAcceptCriteria, org_id: str = None) -> str
|
|
873
|
+
SelectiveAcceptApi.read_criteria(entity_id: str, id: str, org_id: str = None) -> SelectiveAcceptCriteria
|
|
874
|
+
SelectiveAcceptApi.configure_criteria(entity_id: str, id: str, settings: SelectiveAcceptCriteria, org_id: str = None) -> None
|
|
875
|
+
SelectiveAcceptApi.delete_criteria(entity_id: str, id: str, org_id: str = None) -> None
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
### CLI Examples
|
|
879
|
+
|
|
880
|
+
```bash
|
|
881
|
+
# List selective accept criteria for a person
|
|
882
|
+
wxcli user-settings list-selective-accept Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
883
|
+
|
|
884
|
+
# Enable selective accept
|
|
885
|
+
wxcli user-settings update-selective-accept Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --enabled
|
|
886
|
+
|
|
887
|
+
# Disable selective accept
|
|
888
|
+
wxcli user-settings update-selective-accept Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --no-enabled
|
|
889
|
+
|
|
890
|
+
# Create a selective accept criteria
|
|
891
|
+
wxcli user-settings create-criteria-selective-accept Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
892
|
+
--accept-enabled --schedule-name "Business Hours" \
|
|
893
|
+
--anonymous-callers-enabled --no-unavailable-callers-enabled
|
|
894
|
+
|
|
895
|
+
# Read a specific criteria
|
|
896
|
+
wxcli user-settings show-criteria-selective-accept Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 CRITERIA_ID
|
|
897
|
+
|
|
898
|
+
# Delete a criteria
|
|
899
|
+
wxcli user-settings delete-criteria-selective-accept Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 CRITERIA_ID
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
### Raw HTTP
|
|
903
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
904
|
+
|
|
905
|
+
```python
|
|
906
|
+
from wxc_sdk import WebexSimpleApi
|
|
907
|
+
api = WebexSimpleApi()
|
|
908
|
+
BASE = "https://webexapis.com/v1"
|
|
909
|
+
|
|
910
|
+
# GET — read selective accept settings
|
|
911
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/selectiveAccept")
|
|
912
|
+
# Returns: {"enabled": true, "criterias": [...]}
|
|
913
|
+
|
|
914
|
+
# PUT — update selective accept (enable/disable only; criteria managed separately)
|
|
915
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/selectiveAccept", json={
|
|
916
|
+
"enabled": True
|
|
917
|
+
})
|
|
918
|
+
|
|
919
|
+
# Criteria CRUD
|
|
920
|
+
# POST — create criteria (returns ID in Location header)
|
|
921
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/selectiveAccept/criteria", json={
|
|
922
|
+
"acceptEnabled": True,
|
|
923
|
+
"scheduleName": "Business Hours",
|
|
924
|
+
"scheduleType": "businessHours",
|
|
925
|
+
"callsFrom": "SELECT_PHONE_NUMBERS",
|
|
926
|
+
"phoneNumbers": ["+12223334444"],
|
|
927
|
+
"anonymousCallersEnabled": False,
|
|
928
|
+
"unavailableCallersEnabled": False
|
|
929
|
+
})
|
|
930
|
+
# GET — read single criteria
|
|
931
|
+
api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/selectiveAccept/criteria/{criteria_id}")
|
|
932
|
+
# PUT — update criteria
|
|
933
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/selectiveAccept/criteria/{criteria_id}", json={...})
|
|
934
|
+
# DELETE — delete criteria
|
|
935
|
+
api.session.rest_delete(f"{BASE}/telephony/config/people/{person_id}/selectiveAccept/criteria/{criteria_id}")
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
### Gotchas
|
|
939
|
+
|
|
940
|
+
- The REST endpoint is remapped to `telephony/config/people/{person_id}/selectiveAccept` (not `people/{person_id}/features/selectiveAccept`).
|
|
941
|
+
- Criteria use `acceptEnabled` (not `enabled`) as the REST API field name for the criteria-level enable flag. The SDK normalizes this to `enabled`.
|
|
942
|
+
- The `criteria` list in the top-level settings is read-only. Criteria are managed via dedicated CRUD commands/methods.
|
|
943
|
+
|
|
944
|
+
---
|
|
945
|
+
|
|
946
|
+
## 8. Selective Forward
|
|
947
|
+
|
|
948
|
+
Forward calls to a specific destination based on caller identity and/or schedule. **Takes precedence over standard call forwarding settings.**
|
|
949
|
+
|
|
950
|
+
**SDK path:** `api.person_settings.selective_forward`
|
|
951
|
+
**Feature slug:** `selectiveForward`
|
|
952
|
+
**REST path (remapped):** `telephony/config/people/{person_id}/selectiveForward`
|
|
953
|
+
**API class:** `SelectiveForwardApi`
|
|
954
|
+
|
|
955
|
+
### Data Models
|
|
956
|
+
|
|
957
|
+
#### `SelectiveForward`
|
|
958
|
+
|
|
959
|
+
| Field | Type | Description |
|
|
960
|
+
|-------|------|-------------|
|
|
961
|
+
| `enabled` | `bool` (optional) | Enable/disable selective forward |
|
|
962
|
+
| `default_phone_number_to_forward` | `str` (optional) | Default forward destination |
|
|
963
|
+
| `ring_reminder_enabled` | `bool` (optional) | Play ring reminder tone for forwarded calls |
|
|
964
|
+
| `destination_voicemail_enabled` | `bool` (optional) | Forward to destination's voicemail (internal numbers only) |
|
|
965
|
+
| `criteria` | `list[SelectiveCrit]` (optional, read-only) | Criteria summaries |
|
|
966
|
+
|
|
967
|
+
#### `SelectiveForwardCriteria` (extends `SelectiveCriteria`)
|
|
968
|
+
|
|
969
|
+
Uses `forwardEnabled` as the enabled attribute and `numbers` (not `phoneNumbers`) for the number list.
|
|
970
|
+
|
|
971
|
+
Additional fields beyond the base `SelectiveCriteria`:
|
|
972
|
+
|
|
973
|
+
| Field | Type | Description |
|
|
974
|
+
|-------|------|-------------|
|
|
975
|
+
| `forward_to_phone_number` | `str` (optional) | Per-criteria forward destination (overrides default) |
|
|
976
|
+
| `send_to_voicemail_enabled` | `bool` (optional) | Forward to voicemail instead |
|
|
977
|
+
|
|
978
|
+
### Methods
|
|
979
|
+
|
|
980
|
+
Same pattern as Selective Accept:
|
|
981
|
+
|
|
982
|
+
```python
|
|
983
|
+
SelectiveForwardApi.read(entity_id: str, org_id: str = None) -> SelectiveForward
|
|
984
|
+
SelectiveForwardApi.configure(entity_id: str, settings: SelectiveForward, org_id: str = None) -> None
|
|
985
|
+
|
|
986
|
+
SelectiveForwardApi.create_criteria(entity_id: str, settings: SelectiveForwardCriteria, org_id: str = None) -> str
|
|
987
|
+
SelectiveForwardApi.read_criteria(entity_id: str, id: str, org_id: str = None) -> SelectiveForwardCriteria
|
|
988
|
+
SelectiveForwardApi.configure_criteria(entity_id: str, id: str, settings: SelectiveForwardCriteria, org_id: str = None) -> None
|
|
989
|
+
SelectiveForwardApi.delete_criteria(entity_id: str, id: str, org_id: str = None) -> None
|
|
990
|
+
```
|
|
991
|
+
|
|
992
|
+
### CLI Examples
|
|
993
|
+
|
|
994
|
+
```bash
|
|
995
|
+
# List selective forward settings and criteria for a person
|
|
996
|
+
wxcli user-settings list-selective-forward Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
997
|
+
|
|
998
|
+
# Enable selective forward with a default destination
|
|
999
|
+
wxcli user-settings update-selective-forward Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
1000
|
+
--enabled --default-phone-number-to-forward "+15556667777" --ring-reminder-enabled
|
|
1001
|
+
|
|
1002
|
+
# Disable selective forward
|
|
1003
|
+
wxcli user-settings update-selective-forward Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --no-enabled
|
|
1004
|
+
|
|
1005
|
+
# Create a selective forward criteria (forward external calls to voicemail)
|
|
1006
|
+
wxcli user-settings create-criteria-selective-forward Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
1007
|
+
--forward-to-phone-number "+18889990000" --send-to-voicemail-enabled \
|
|
1008
|
+
--forward-enabled
|
|
1009
|
+
|
|
1010
|
+
# Read a specific criteria
|
|
1011
|
+
wxcli user-settings show-criteria-selective-forward Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 CRITERIA_ID
|
|
1012
|
+
|
|
1013
|
+
# Delete a criteria
|
|
1014
|
+
wxcli user-settings delete-criteria-selective-forward Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 CRITERIA_ID
|
|
1015
|
+
```
|
|
1016
|
+
|
|
1017
|
+
### Raw HTTP
|
|
1018
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
1019
|
+
|
|
1020
|
+
```python
|
|
1021
|
+
from wxc_sdk import WebexSimpleApi
|
|
1022
|
+
api = WebexSimpleApi()
|
|
1023
|
+
BASE = "https://webexapis.com/v1"
|
|
1024
|
+
|
|
1025
|
+
# GET — read selective forward settings
|
|
1026
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/selectiveForward")
|
|
1027
|
+
# Returns: {"enabled": true, "defaultPhoneNumberToForward": "+1...", "ringReminderEnabled": false, ...}
|
|
1028
|
+
|
|
1029
|
+
# PUT — update selective forward settings (criteria managed separately)
|
|
1030
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/selectiveForward", json={
|
|
1031
|
+
"enabled": True,
|
|
1032
|
+
"defaultPhoneNumberToForward": "+15556667777",
|
|
1033
|
+
"ringReminderEnabled": True,
|
|
1034
|
+
"destinationVoicemailEnabled": False
|
|
1035
|
+
})
|
|
1036
|
+
|
|
1037
|
+
# Criteria CRUD
|
|
1038
|
+
# POST — create criteria
|
|
1039
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/selectiveForward/criteria", json={
|
|
1040
|
+
"forwardEnabled": True,
|
|
1041
|
+
"forwardToPhoneNumber": "+18889990000",
|
|
1042
|
+
"sendToVoicemailEnabled": False,
|
|
1043
|
+
"callsFrom": "ANY_EXTERNAL"
|
|
1044
|
+
})
|
|
1045
|
+
# GET — read single criteria
|
|
1046
|
+
api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/selectiveForward/criteria/{criteria_id}")
|
|
1047
|
+
# PUT — update criteria
|
|
1048
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/selectiveForward/criteria/{criteria_id}", json={...})
|
|
1049
|
+
# DELETE — delete criteria
|
|
1050
|
+
api.session.rest_delete(f"{BASE}/telephony/config/people/{person_id}/selectiveForward/criteria/{criteria_id}")
|
|
1051
|
+
```
|
|
1052
|
+
|
|
1053
|
+
### Gotchas
|
|
1054
|
+
|
|
1055
|
+
- Selective Forward uses `forwardEnabled` (not `enabled`) and `numbers` (not `phoneNumbers`) for its criteria enabled attr and number list, respectively. This differs from Selective Accept and Selective Reject.
|
|
1056
|
+
- Selective Forward takes precedence over standard call forwarding settings.
|
|
1057
|
+
- The REST endpoint is remapped to `telephony/config/people/{person_id}/selectiveForward`.
|
|
1058
|
+
- Each criteria can override the default forward destination via `forwardToPhoneNumber`.
|
|
1059
|
+
|
|
1060
|
+
---
|
|
1061
|
+
|
|
1062
|
+
## 9. Selective Reject
|
|
1063
|
+
|
|
1064
|
+
Reject calls from specific callers or during specific schedules. **Takes precedence over Selective Accept.**
|
|
1065
|
+
|
|
1066
|
+
**SDK path:** `api.person_settings.selective_reject`
|
|
1067
|
+
**Feature slug:** `selectiveReject`
|
|
1068
|
+
**REST path (remapped):** `telephony/config/people/{person_id}/selectiveReject`
|
|
1069
|
+
**API class:** `SelectiveRejectApi`
|
|
1070
|
+
|
|
1071
|
+
### Data Models
|
|
1072
|
+
|
|
1073
|
+
#### `SelectiveReject`
|
|
1074
|
+
|
|
1075
|
+
| Field | Type | Description |
|
|
1076
|
+
|-------|------|-------------|
|
|
1077
|
+
| `enabled` | `bool` (optional) | Enable/disable selective reject |
|
|
1078
|
+
| `criteria` | `list[SelectiveCrit]` (optional, read-only) | Criteria summaries |
|
|
1079
|
+
|
|
1080
|
+
#### `SelectiveRejectCriteria` (extends `SelectiveCriteria`)
|
|
1081
|
+
|
|
1082
|
+
Uses `rejectEnabled` as the enabled attribute and `phoneNumbers` for the number list. See [Shared Criteria Model](#shared-criteria-model-selectivecriteria) below.
|
|
1083
|
+
|
|
1084
|
+
### Methods
|
|
1085
|
+
|
|
1086
|
+
Same pattern:
|
|
1087
|
+
|
|
1088
|
+
```python
|
|
1089
|
+
SelectiveRejectApi.read(entity_id: str, org_id: str = None) -> SelectiveReject
|
|
1090
|
+
SelectiveRejectApi.configure(entity_id: str, settings: SelectiveReject, org_id: str = None) -> None
|
|
1091
|
+
|
|
1092
|
+
SelectiveRejectApi.create_criteria(entity_id: str, settings: SelectiveRejectCriteria, org_id: str = None) -> str
|
|
1093
|
+
SelectiveRejectApi.read_criteria(entity_id: str, id: str, org_id: str = None) -> SelectiveRejectCriteria
|
|
1094
|
+
SelectiveRejectApi.configure_criteria(entity_id: str, id: str, settings: SelectiveRejectCriteria, org_id: str = None) -> None
|
|
1095
|
+
SelectiveRejectApi.delete_criteria(entity_id: str, id: str, org_id: str = None) -> None
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
### CLI Examples
|
|
1099
|
+
|
|
1100
|
+
```bash
|
|
1101
|
+
# List selective reject criteria for a person
|
|
1102
|
+
wxcli user-settings list-selective-reject Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0
|
|
1103
|
+
|
|
1104
|
+
# Enable selective reject
|
|
1105
|
+
wxcli user-settings update-selective-reject Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --enabled
|
|
1106
|
+
|
|
1107
|
+
# Disable selective reject
|
|
1108
|
+
wxcli user-settings update-selective-reject Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 --no-enabled
|
|
1109
|
+
|
|
1110
|
+
# Create a selective reject criteria (reject anonymous callers)
|
|
1111
|
+
wxcli user-settings create-criteria-selective-reject Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 \
|
|
1112
|
+
--reject-enabled --anonymous-callers-enabled --no-unavailable-callers-enabled
|
|
1113
|
+
|
|
1114
|
+
# Read a specific criteria
|
|
1115
|
+
wxcli user-settings show-criteria-selective-reject Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 CRITERIA_ID
|
|
1116
|
+
|
|
1117
|
+
# Delete a criteria
|
|
1118
|
+
wxcli user-settings delete-criteria-selective-reject Y2lzY29zcGFyazovL3VzL1BFT1BMRS8xMjM0 CRITERIA_ID
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
### Raw HTTP
|
|
1122
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
1123
|
+
|
|
1124
|
+
```python
|
|
1125
|
+
from wxc_sdk import WebexSimpleApi
|
|
1126
|
+
api = WebexSimpleApi()
|
|
1127
|
+
BASE = "https://webexapis.com/v1"
|
|
1128
|
+
|
|
1129
|
+
# GET — read selective reject settings
|
|
1130
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/selectiveReject")
|
|
1131
|
+
# Returns: {"enabled": true, "criterias": [...]}
|
|
1132
|
+
|
|
1133
|
+
# PUT — update selective reject (enable/disable only; criteria managed separately)
|
|
1134
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/selectiveReject", json={
|
|
1135
|
+
"enabled": True
|
|
1136
|
+
})
|
|
1137
|
+
|
|
1138
|
+
# Criteria CRUD
|
|
1139
|
+
# POST — create criteria
|
|
1140
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/selectiveReject/criteria", json={
|
|
1141
|
+
"rejectEnabled": True,
|
|
1142
|
+
"callsFrom": "SELECT_PHONE_NUMBERS",
|
|
1143
|
+
"phoneNumbers": ["+15551234567"],
|
|
1144
|
+
"anonymousCallersEnabled": True,
|
|
1145
|
+
"unavailableCallersEnabled": False
|
|
1146
|
+
})
|
|
1147
|
+
# GET — read single criteria
|
|
1148
|
+
api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/selectiveReject/criteria/{criteria_id}")
|
|
1149
|
+
# PUT — update criteria
|
|
1150
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/selectiveReject/criteria/{criteria_id}", json={...})
|
|
1151
|
+
# DELETE — delete criteria
|
|
1152
|
+
api.session.rest_delete(f"{BASE}/telephony/config/people/{person_id}/selectiveReject/criteria/{criteria_id}")
|
|
1153
|
+
```
|
|
1154
|
+
|
|
1155
|
+
### Gotchas
|
|
1156
|
+
|
|
1157
|
+
- Selective Reject takes precedence over Selective Accept. If both are enabled with overlapping criteria, the reject rule wins.
|
|
1158
|
+
- The REST endpoint is remapped to `telephony/config/people/{person_id}/selectiveReject`.
|
|
1159
|
+
- Criteria use `rejectEnabled` (not `enabled`) as the REST API field name.
|
|
1160
|
+
|
|
1161
|
+
---
|
|
1162
|
+
|
|
1163
|
+
## 10. Priority Alert
|
|
1164
|
+
|
|
1165
|
+
> **Admin access: Not available.** This endpoint only exists at `/telephony/config/people/me/settings/priorityAlert` (user-level OAuth). No admin-level path exists — `/telephony/config/people/{personId}/priorityAlert` returns 404.
|
|
1166
|
+
|
|
1167
|
+
Play a distinctive ring pattern for calls matching specific criteria (caller identity, schedule). Useful for VIP caller identification.
|
|
1168
|
+
|
|
1169
|
+
**SDK path:** `api.person_settings.priority_alert`
|
|
1170
|
+
**Feature slug:** `priorityAlert`
|
|
1171
|
+
**API class:** `PriorityAlertApi`
|
|
1172
|
+
|
|
1173
|
+
### Data Models
|
|
1174
|
+
|
|
1175
|
+
#### `PriorityAlert`
|
|
1176
|
+
|
|
1177
|
+
| Field | Type | Description |
|
|
1178
|
+
|-------|------|-------------|
|
|
1179
|
+
| `enabled` | `bool` (optional) | Enable/disable priority alert |
|
|
1180
|
+
| `criteria` | `list[SelectiveCrit]` (optional, read-only) | Criteria summaries |
|
|
1181
|
+
|
|
1182
|
+
#### `PriorityAlertCriteria` (extends `SelectiveCriteria`)
|
|
1183
|
+
|
|
1184
|
+
Uses `notificationEnabled` as the enabled attribute. See [Shared Criteria Model](#shared-criteria-model-selectivecriteria) below.
|
|
1185
|
+
|
|
1186
|
+
### Methods
|
|
1187
|
+
|
|
1188
|
+
Same pattern:
|
|
1189
|
+
|
|
1190
|
+
```python
|
|
1191
|
+
PriorityAlertApi.read(entity_id: str, org_id: str = None) -> PriorityAlert
|
|
1192
|
+
PriorityAlertApi.configure(entity_id: str, settings: PriorityAlert, org_id: str = None) -> None
|
|
1193
|
+
|
|
1194
|
+
PriorityAlertApi.create_criteria(entity_id: str, settings: PriorityAlertCriteria, org_id: str = None) -> str
|
|
1195
|
+
PriorityAlertApi.read_criteria(entity_id: str, id: str, org_id: str = None) -> PriorityAlertCriteria
|
|
1196
|
+
PriorityAlertApi.configure_criteria(entity_id: str, id: str, settings: PriorityAlertCriteria, org_id: str = None) -> None
|
|
1197
|
+
PriorityAlertApi.delete_criteria(entity_id: str, id: str, org_id: str = None) -> None
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
### CLI Examples
|
|
1201
|
+
|
|
1202
|
+
No dedicated CLI commands for Priority Alert. Use Raw HTTP or the SDK.
|
|
1203
|
+
|
|
1204
|
+
### Raw HTTP
|
|
1205
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
1206
|
+
|
|
1207
|
+
```python
|
|
1208
|
+
from wxc_sdk import WebexSimpleApi
|
|
1209
|
+
api = WebexSimpleApi()
|
|
1210
|
+
BASE = "https://webexapis.com/v1"
|
|
1211
|
+
|
|
1212
|
+
# GET — read priority alert settings
|
|
1213
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/priorityAlert")
|
|
1214
|
+
# Returns: {"enabled": true, "criterias": [...]}
|
|
1215
|
+
|
|
1216
|
+
# PUT — update priority alert (enable/disable only; criteria managed separately)
|
|
1217
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/priorityAlert", json={
|
|
1218
|
+
"enabled": True
|
|
1219
|
+
})
|
|
1220
|
+
|
|
1221
|
+
# Criteria CRUD
|
|
1222
|
+
# POST — create criteria
|
|
1223
|
+
api.session.rest_post(f"{BASE}/telephony/config/people/{person_id}/priorityAlert/criteria", json={
|
|
1224
|
+
"notificationEnabled": True,
|
|
1225
|
+
"callsFrom": "SELECT_PHONE_NUMBERS",
|
|
1226
|
+
"phoneNumbers": ["+12223334444"],
|
|
1227
|
+
"anonymousCallersEnabled": False,
|
|
1228
|
+
"unavailableCallersEnabled": False
|
|
1229
|
+
})
|
|
1230
|
+
# GET — read single criteria
|
|
1231
|
+
api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/priorityAlert/criteria/{criteria_id}")
|
|
1232
|
+
# PUT — update criteria
|
|
1233
|
+
api.session.rest_put(f"{BASE}/telephony/config/people/{person_id}/priorityAlert/criteria/{criteria_id}", json={...})
|
|
1234
|
+
# DELETE — delete criteria
|
|
1235
|
+
api.session.rest_delete(f"{BASE}/telephony/config/people/{person_id}/priorityAlert/criteria/{criteria_id}")
|
|
1236
|
+
```
|
|
1237
|
+
|
|
1238
|
+
### Gotchas
|
|
1239
|
+
|
|
1240
|
+
- **User-only endpoint.** No admin-level path exists. The path `telephony/config/people/{personId}/priorityAlert` returns 404 with an admin token. Only `/telephony/config/people/me/settings/priorityAlert` works, and it requires user-level OAuth.
|
|
1241
|
+
- `PriorityAlertApi` may not be imported into `PersonSettingsApi` in some SDK versions.
|
|
1242
|
+
- Criteria use `notificationEnabled` (not `enabled`) as the REST API field name.
|
|
1243
|
+
- Priority Alert only changes the ring pattern; it does not affect call routing or acceptance.
|
|
1244
|
+
|
|
1245
|
+
---
|
|
1246
|
+
|
|
1247
|
+
## Shared Criteria Model (`SelectiveCriteria`)
|
|
1248
|
+
|
|
1249
|
+
All schedule/caller-based features (Simultaneous Ring, Sequential Ring, Selective Accept/Forward/Reject, Priority Alert) share a common criteria model. Each feature subclasses `SelectiveCriteria` with a different `_enabled_attr` value.
|
|
1250
|
+
|
|
1251
|
+
### `SelectiveCriteria` Fields
|
|
1252
|
+
|
|
1253
|
+
| Field | Type | Description |
|
|
1254
|
+
|-------|------|-------------|
|
|
1255
|
+
| `id` | `str` (optional) | Unique criteria ID (excluded from create/update payloads) |
|
|
1256
|
+
| `schedule_name` | `str` (optional) | Name of the schedule. Omit both `schedule_name` and `schedule_type` for all-hours/all-days |
|
|
1257
|
+
| `schedule_type` | `ScheduleType` (optional) | `businessHours` or `holidays` |
|
|
1258
|
+
| `schedule_level` | `SelectiveScheduleLevel` (optional) | `GROUP` or `GLOBAL` |
|
|
1259
|
+
| `calls_from` | `SelectiveFrom` (optional) | Which callers trigger this criteria |
|
|
1260
|
+
| `anonymous_callers_enabled` | `bool` (optional) | Allow private/anonymous numbers (only when `calls_from=SELECT_PHONE_NUMBERS`) |
|
|
1261
|
+
| `unavailable_callers_enabled` | `bool` (optional) | Allow unavailable numbers (only when `calls_from=SELECT_PHONE_NUMBERS`) |
|
|
1262
|
+
| `phone_numbers` | `list[str]` (optional, E.164) | Specific numbers (only when `calls_from=SELECT_PHONE_NUMBERS`) |
|
|
1263
|
+
| `enabled` | `bool` (optional) | Enable/disable this criteria. Criteria with `enabled=false` take priority |
|
|
1264
|
+
|
|
1265
|
+
### `SelectiveFrom` Enum
|
|
1266
|
+
|
|
1267
|
+
| Value | Meaning |
|
|
1268
|
+
|-------|---------|
|
|
1269
|
+
| `ANY_PHONE_NUMBER` | All incoming numbers |
|
|
1270
|
+
| `SELECT_PHONE_NUMBERS` | Only specific numbers (use with `phone_numbers`, `anonymous_callers_enabled`, `unavailable_callers_enabled`) |
|
|
1271
|
+
| `ANY_INTERNAL` | Any internal number |
|
|
1272
|
+
| `ANY_EXTERNAL` | Any external number |
|
|
1273
|
+
|
|
1274
|
+
### `SelectiveCrit` (Summary Model)
|
|
1275
|
+
|
|
1276
|
+
Returned in the top-level settings `criteria` list (read-only summaries):
|
|
1277
|
+
|
|
1278
|
+
| Field | Type | Description |
|
|
1279
|
+
|-------|------|-------------|
|
|
1280
|
+
| `id` | `str` (optional) | Criteria ID |
|
|
1281
|
+
| `schedule_name` | `str` (optional) | Schedule name |
|
|
1282
|
+
| `source` | `SelectiveSource` (optional) | `ALL_NUMBERS` or `SPECIFIC_NUMBERS` |
|
|
1283
|
+
| `enabled` | `bool` (optional) | Whether this criteria is active |
|
|
1284
|
+
|
|
1285
|
+
### Enabled Attribute Mapping by Feature
|
|
1286
|
+
|
|
1287
|
+
The REST API uses different field names for the "enabled" flag on each criteria type. The SDK normalizes this to `enabled` on the Python model.
|
|
1288
|
+
|
|
1289
|
+
| Feature | REST API `_enabled_attr` | REST API `_phone_numbers` attr |
|
|
1290
|
+
|---------|--------------------------|-------------------------------|
|
|
1291
|
+
| Simultaneous Ring | `ringEnabled` | `phoneNumbers` |
|
|
1292
|
+
| Sequential Ring | `ringEnabled` | `phoneNumbers` |
|
|
1293
|
+
| Selective Accept | `acceptEnabled` | `phoneNumbers` |
|
|
1294
|
+
| Selective Forward | `forwardEnabled` | `numbers` |
|
|
1295
|
+
| Selective Reject | `rejectEnabled` | `phoneNumbers` |
|
|
1296
|
+
| Priority Alert | `notificationEnabled` | `phoneNumbers` |
|
|
1297
|
+
|
|
1298
|
+
---
|
|
1299
|
+
|
|
1300
|
+
## Precedence Order
|
|
1301
|
+
|
|
1302
|
+
When multiple selective features are enabled simultaneously, the following precedence applies:
|
|
1303
|
+
|
|
1304
|
+
1. **Selective Reject** — highest priority; rejects matching calls outright
|
|
1305
|
+
2. **Selective Accept** — only accepts calls matching criteria
|
|
1306
|
+
3. **Selective Forward** — forwards matching calls; takes precedence over standard call forwarding
|
|
1307
|
+
4. **Standard Call Forwarding** (Always > Busy > No Answer > Business Continuity)
|
|
1308
|
+
|
|
1309
|
+
<!-- Verified via wxc_sdk source (selective_reject.py) and OpenAPI spec 2026-03-19: Both sources confirm "This setting [Selective Reject] takes precedence over Selectively Accept Calls." The precedence order Selective Reject > Selective Accept > Selective Forward > Standard Forwarding is confirmed. Full interaction with Priority Alert and ring features remains undocumented in source. -->
|
|
1310
|
+
|
|
1311
|
+
---
|
|
1312
|
+
|
|
1313
|
+
## "Me" API Variants
|
|
1314
|
+
|
|
1315
|
+
For user-token access (a person managing their own settings), the SDK provides parallel APIs under `api.me.*`:
|
|
1316
|
+
|
|
1317
|
+
| Feature | Admin API (`person_settings.*`) | User API (`me.*`) |
|
|
1318
|
+
|---------|-------------------------------|-------------------|
|
|
1319
|
+
| Forwarding | `forwarding` | `forwarding` (`MeForwardingApi`) |
|
|
1320
|
+
| Call Waiting | `call_waiting` | `call_waiting` (`MeCallWaitingApi`) |
|
|
1321
|
+
| DND | `dnd` | `dnd` (`MeDNDApi`) |
|
|
1322
|
+
| Simultaneous Ring | N/A in SDK¹ | `sim_ring` (`MeSimRingApi`) |
|
|
1323
|
+
| Sequential Ring | N/A in SDK¹ | `sequential_ring` (`MeSequentialRingApi`) |
|
|
1324
|
+
| Single Number Reach | `single_number_reach` | `snr` (`MeSNRApi`) |
|
|
1325
|
+
| Selective Accept | `selective_accept` | `selective_accept` (`MeSelectiveAcceptApi`) |
|
|
1326
|
+
| Selective Forward | `selective_forward` | `selective_forward` (`MeSelectiveForwardApi`) |
|
|
1327
|
+
| Selective Reject | `selective_reject` | `selective_reject` (`MeSelectiveRejectApi`) |
|
|
1328
|
+
| Priority Alert | N/A in SDK¹ | `priority_alert` (`MePriorityAlertApi`) |
|
|
1329
|
+
|
|
1330
|
+
> **¹ "N/A in SDK" means the SDK class is not wired to `PersonSettingsApi`** — and **no admin-level REST endpoint exists** for these features. Simultaneous Ring, Sequential Ring, and Priority Alert are user-only: they only work at `/telephony/config/people/me/settings/{feature}` with user-level OAuth. An admin cannot read or write these settings for another user. The Raw HTTP examples in sections 4, 5, and 10 above show the `{person_id}` path pattern used by the SDK internally, but these paths return 404 when called with an admin token against another user.
|
|
1331
|
+
|
|
1332
|
+
---
|
|
1333
|
+
|
|
1334
|
+
## URL Routing Internals
|
|
1335
|
+
|
|
1336
|
+
The `PersonSettingsApiChild` base class builds endpoints based on the `selector` parameter:
|
|
1337
|
+
|
|
1338
|
+
| Selector | URL Template |
|
|
1339
|
+
|----------|-------------|
|
|
1340
|
+
| `person` (default) | `people/{person_id}/features/{feature}{path}` |
|
|
1341
|
+
| `workspace` | `workspaces/{person_id}/features/{feature}{path}` |
|
|
1342
|
+
| `location` | `telephony/config/locations/{person_id}/{feature}{path}` |
|
|
1343
|
+
| `virtual_line` | `telephony/config/virtualLines/{person_id}/{feature}{path}` |
|
|
1344
|
+
|
|
1345
|
+
Some feature/selector combinations are remapped to different URL bases. For persons, the following features use `telephony/config/people/{person_id}/` instead of `people/{person_id}/features/`:
|
|
1346
|
+
|
|
1347
|
+
- `selectiveAccept`
|
|
1348
|
+
- `selectiveForward`
|
|
1349
|
+
- `selectiveReject`
|
|
1350
|
+
- `musicOnHold`
|
|
1351
|
+
- `emergencyCallbackNumber`
|
|
1352
|
+
- `outgoingPermission/` (and sub-paths)
|
|
1353
|
+
- `agent`
|
|
1354
|
+
|
|
1355
|
+
---
|
|
1356
|
+
|
|
1357
|
+
## Source Files
|
|
1358
|
+
|
|
1359
|
+
| File | Contents |
|
|
1360
|
+
|------|----------|
|
|
1361
|
+
| `wxc_sdk/person_settings/__init__.py` | `PersonSettingsApi` — parent class aggregating all sub-APIs |
|
|
1362
|
+
| `wxc_sdk/person_settings/common.py` | `PersonSettingsApiChild` base class, `ApiSelector` enum |
|
|
1363
|
+
| `wxc_sdk/person_settings/forwarding.py` | `PersonForwardingApi`, forwarding data models |
|
|
1364
|
+
| `wxc_sdk/person_settings/call_waiting.py` | `CallWaitingApi` |
|
|
1365
|
+
| `wxc_sdk/person_settings/dnd.py` | `DndApi`, `DND` model |
|
|
1366
|
+
| `wxc_sdk/person_settings/sim_ring.py` | `SimRingApi`, `SimRing`, `SimRingNumber`, `SimRingCriteria` |
|
|
1367
|
+
| `wxc_sdk/person_settings/sequential_ring.py` | `SequentialRingApi`, `SequentialRing`, `SequentialRingNumber`, `SequentialRingCriteria` |
|
|
1368
|
+
| `wxc_sdk/person_settings/single_number_reach/__init__.py` | `SingleNumberReachApi`, `SingleNumberReach`, `SingleNumberReachNumber` |
|
|
1369
|
+
| `wxc_sdk/person_settings/selective_accept.py` | `SelectiveAcceptApi`, `SelectiveAccept`, `SelectiveAcceptCriteria` |
|
|
1370
|
+
| `wxc_sdk/person_settings/selective_forward.py` | `SelectiveForwardApi`, `SelectiveForward`, `SelectiveForwardCriteria` |
|
|
1371
|
+
| `wxc_sdk/person_settings/selective_reject.py` | `SelectiveRejectApi`, `SelectiveReject`, `SelectiveRejectCriteria` |
|
|
1372
|
+
| `wxc_sdk/person_settings/priority_alert.py` | `PriorityAlertApi`, `PriorityAlert`, `PriorityAlertCriteria` |
|
|
1373
|
+
| `wxc_sdk/common/selective.py` | `SelectiveCriteria` base, `SelectiveCrit`, `SelectiveFrom`, `SelectiveScheduleLevel` |
|
|
1374
|
+
| `examples/reset_call_forwarding.py` | Bulk reset forwarding example |
|
|
1375
|
+
|
|
1376
|
+
---
|
|
1377
|
+
|
|
1378
|
+
## Gotchas (Cross-Cutting)
|
|
1379
|
+
|
|
1380
|
+
- **Four features are user-only (no admin access):** Simultaneous Ring, Sequential Ring, Priority Alert, and Call Notify only exist at `/telephony/config/people/me/settings/{feature}` and require user-level OAuth. There is no admin-level path — an admin cannot read or write these settings for another user. All other call handling features in this doc support admin-level access.
|
|
1381
|
+
- **Selective features remapped URLs:** Selective Accept, Selective Forward, and Selective Reject all use `telephony/config/people/{person_id}/` instead of `people/{person_id}/features/`. This remapping is transparent in the SDK but matters for raw HTTP and CLI usage.
|
|
1382
|
+
- **Enabled attribute naming varies by feature:** Each criteria-based feature uses a different REST field name for its enabled flag (`ringEnabled`, `acceptEnabled`, `forwardEnabled`, `rejectEnabled`, `notificationEnabled`). The SDK normalizes all of these to `enabled` on the Python model, but CLI `--json-body` and raw HTTP payloads must use the REST field names.
|
|
1383
|
+
- **Criteria are managed separately:** For all criteria-based features (Sim Ring, Sequential Ring, Selective Accept/Forward/Reject, Priority Alert), the `criteria` list in the top-level settings response is read-only. Create, update, and delete criteria via their dedicated CRUD endpoints.
|
|
1384
|
+
- **SDK import gaps:** `SimRingApi`, `SequentialRingApi`, and `PriorityAlertApi` may not be wired into `PersonSettingsApi` in some SDK versions. These are also user-only features with no admin-level REST endpoints (see above).
|
|
1385
|
+
- **No CLI for Sim Ring, Sequential Ring, or Priority Alert:** These features do not have wxcli command groups. Use Raw HTTP or the SDK.
|
|
1386
|
+
- **Selective Forward uses `numbers` not `phoneNumbers`:** Unlike all other criteria-based features that use `phoneNumbers` for their number list, Selective Forward criteria use `numbers`.
|
|
1387
|
+
- **Nested settings require `--json-body` in CLI:** Call forwarding and other nested payloads cannot be expressed with simple CLI flags. Use `--json-body '{"key": {...}}'` for these.
|
|
1388
|
+
|
|
1389
|
+
---
|
|
1390
|
+
|
|
1391
|
+
## See Also
|
|
1392
|
+
|
|
1393
|
+
- **[Location Call Settings — Core](location-calling-core.md)** — Location-level call forwarding, call intercept, and ECBN settings that serve as defaults for person-level overrides
|
|
1394
|
+
- **[self-service-call-settings.md](self-service-call-settings.md)** -- User-level `/people/me/` endpoints for self-service call settings, including 6 user-only settings with no admin path.
|