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,586 @@
|
|
|
1
|
+
# Admin: Organization Management
|
|
2
|
+
|
|
3
|
+
Organizations, org settings, contacts, roles, and domain management for Webex admin operations.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Organizations](#1-organizations)
|
|
8
|
+
2. [Organization Settings](#2-organization-settings)
|
|
9
|
+
3. [Organization Contacts](#3-organization-contacts)
|
|
10
|
+
4. [Roles](#4-roles)
|
|
11
|
+
5. [Domain Management](#5-domain-management)
|
|
12
|
+
6. [Recipes](#6-recipes)
|
|
13
|
+
7. [Gotchas](#7-gotchas)
|
|
14
|
+
|
|
15
|
+
## Sources
|
|
16
|
+
|
|
17
|
+
- OpenAPI spec: `specs/webex-admin.json` -- Organizations, Organization Settings, Organization Contacts, Roles, Domain Management tags
|
|
18
|
+
- [Webex Developer Docs -- Organizations](https://developer.webex.com/docs/api/v1/organizations)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Required Scopes
|
|
23
|
+
|
|
24
|
+
| Scope | Purpose |
|
|
25
|
+
|-------|---------|
|
|
26
|
+
| `identity:organizations_read` | Read organization details and settings. Required for `organizations list`, `organizations show`, `org-settings show`. |
|
|
27
|
+
| `identity:organizations_rw` | Write organization settings and manage domains. Required for `org-settings create`, all `domains` commands. |
|
|
28
|
+
| `identity:contacts_rw` | Create, update, delete organization contacts. Required for all `org-contacts` write commands. |
|
|
29
|
+
| `identity:contacts_read` | Read organization contacts. Required for `org-contacts list`, `org-contacts show`. Without this scope (or `identity:contacts_rw`), the API returns 403 Forbidden. A standard admin token alone is not sufficient. |
|
|
30
|
+
| (admin token) | `roles list` and `roles show` require a valid admin token. No additional scopes documented. |
|
|
31
|
+
| (full admin) | `organizations delete` requires full administrator privileges. |
|
|
32
|
+
|
|
33
|
+
**Note:** Scope names for organizations and domains use the `identity:` prefix, not the `spark-admin:` prefix used by Calling APIs. This is a common source of 401/403 errors when reusing Calling tokens for admin operations.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 1. Organizations
|
|
38
|
+
|
|
39
|
+
Manage Webex organizations. Most admin tokens are scoped to a single org, so `organizations list` typically returns one item.
|
|
40
|
+
|
|
41
|
+
### CLI Commands
|
|
42
|
+
|
|
43
|
+
| Command | Description | HTTP Method | Path |
|
|
44
|
+
|---------|-------------|-------------|------|
|
|
45
|
+
| `wxcli organizations list` | List organizations | `GET` | `/v1/organizations` |
|
|
46
|
+
| `wxcli organizations show` | Get organization details | `GET` | `/v1/organizations/{orgId}` |
|
|
47
|
+
| `wxcli organizations delete` | Delete an organization | `DELETE` | `/v1/organizations/{orgId}` |
|
|
48
|
+
|
|
49
|
+
### CLI Examples
|
|
50
|
+
|
|
51
|
+
**List all organizations visible to the current token:**
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
wxcli organizations list
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Get details for a specific org (returns JSON with display name, creation date, etc.):**
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
wxcli organizations show Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Delete an organization (prompts for confirmation):**
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
wxcli organizations delete Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Delete without confirmation prompt (use with extreme caution):**
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
wxcli organizations delete Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0 --force
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Raw HTTP Fallback
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# List organizations
|
|
79
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
80
|
+
"https://webexapis.com/v1/organizations" | jq '.items[]'
|
|
81
|
+
|
|
82
|
+
# Get organization details
|
|
83
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
84
|
+
"https://webexapis.com/v1/organizations/$ORG_ID" | jq .
|
|
85
|
+
|
|
86
|
+
# Delete organization (irreversible!)
|
|
87
|
+
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \
|
|
88
|
+
"https://webexapis.com/v1/organizations/$ORG_ID"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Gotchas
|
|
92
|
+
|
|
93
|
+
- **`organizations delete` is destructive and irreversible.** Deleting an organization removes all users, licenses, devices, and configuration permanently. The CLI prompts for confirmation unless `--force` is passed. There is no undo.
|
|
94
|
+
|
|
95
|
+
- **`organizations list` typically returns one org.** Unless your token is a partner/MSP token with cross-org access, you will only see the single organization the token belongs to. Partner tokens return multiple orgs — wxcli uses this behavior for multi-org detection: if `organizations list` returns more than one result, wxcli treats the token as a partner token and prompts for customer org selection during `wxcli configure`.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 2. Organization Settings
|
|
100
|
+
|
|
101
|
+
Read and write org-level settings (key/value pairs). The `create` command is a POST-as-upsert -- it creates the setting if it does not exist, or updates it if it already does.
|
|
102
|
+
|
|
103
|
+
### CLI Commands
|
|
104
|
+
|
|
105
|
+
| Command | Description | HTTP Method | Path |
|
|
106
|
+
|---------|-------------|-------------|------|
|
|
107
|
+
| `wxcli org-settings show` | Get an organization setting by key | `GET` | `/v1/settings/organizations/{orgId}/settings/{settingKey}` |
|
|
108
|
+
| `wxcli org-settings create` | Create or update an organization setting | `POST` | `/v1/settings/organizations/{orgId}/settings` |
|
|
109
|
+
|
|
110
|
+
### CLI Examples
|
|
111
|
+
|
|
112
|
+
**Read a specific setting by key:**
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
wxcli org-settings show Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0 callingBehavior
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Set/update a boolean setting:**
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
wxcli org-settings create Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0 \
|
|
122
|
+
--key callingBehavior --value
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Set a setting to false:**
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
wxcli org-settings create Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0 \
|
|
129
|
+
--key callingBehavior --no-value
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Use --json-body for non-boolean or complex settings:**
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
wxcli org-settings create Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xMjM0 \
|
|
136
|
+
--json-body '{"key": "myCustomSetting", "value": "customValue"}'
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Raw HTTP Fallback
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Read a setting
|
|
143
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
144
|
+
"https://webexapis.com/v1/settings/organizations/$ORG_ID/settings/callingBehavior" | jq .
|
|
145
|
+
|
|
146
|
+
# Create or update a setting
|
|
147
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
148
|
+
-H "Content-Type: application/json" \
|
|
149
|
+
-d '{"key": "callingBehavior", "value": true}' \
|
|
150
|
+
"https://webexapis.com/v1/settings/organizations/$ORG_ID/settings"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Gotchas
|
|
154
|
+
|
|
155
|
+
- **`org-settings create` is POST-as-upsert.** Despite the command name `create`, this endpoint creates the setting if it does not exist or updates it if it already does. There is no separate `update` command. The HTTP method is POST, not PUT or PATCH.
|
|
156
|
+
|
|
157
|
+
- **`org-settings show` value type.** The `--value/--no-value` flag on `org-settings create` only supports boolean settings. The OpenAPI schema (`updateOrgSettingObject`) defines the `value` field as `type: boolean`. For any non-boolean values, use `--json-body`.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 3. Organization Contacts
|
|
162
|
+
|
|
163
|
+
Manage organization-level contacts (shared directory entries). Contacts use a SCIM-like schema with `urn:cisco:codev:identity:contact:core:1.0`.
|
|
164
|
+
|
|
165
|
+
### CLI Commands
|
|
166
|
+
|
|
167
|
+
| Command | Description | HTTP Method | Path |
|
|
168
|
+
|---------|-------------|-------------|------|
|
|
169
|
+
| `wxcli org-contacts create` | Create a contact | `POST` | `/v1/contacts/organizations/{orgId}/contacts` |
|
|
170
|
+
| `wxcli org-contacts show` | Get a contact by ID | `GET` | `/v1/contacts/organizations/{orgId}/contacts/{contactId}` |
|
|
171
|
+
| `wxcli org-contacts update` | Update a contact | `PATCH` | `/v1/contacts/organizations/{orgId}/contacts/{contactId}` |
|
|
172
|
+
| `wxcli org-contacts delete` | Delete a contact | `DELETE` | `/v1/contacts/organizations/{orgId}/contacts/{contactId}` |
|
|
173
|
+
| `wxcli org-contacts list` | Search/list contacts | `GET` | `/v1/contacts/organizations/{orgId}/contacts/search` |
|
|
174
|
+
| `wxcli org-contacts create-bulk` | Bulk create or update contacts | `POST` | `/v1/contacts/organizations/{orgId}/contacts/bulk` |
|
|
175
|
+
| `wxcli org-contacts create-delete` | Bulk delete contacts | `POST` | `/v1/contacts/organizations/{orgId}/contacts/bulk/delete` |
|
|
176
|
+
|
|
177
|
+
### CLI Examples
|
|
178
|
+
|
|
179
|
+
**List all contacts in an org:**
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
wxcli org-contacts list $ORG_ID
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Search contacts by keyword:**
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
wxcli org-contacts list $ORG_ID --keyword "Smith" --source CH
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Create a single contact:**
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
wxcli org-contacts create $ORG_ID \
|
|
195
|
+
--schemas "urn:cisco:codev:identity:contact:core:1.0" \
|
|
196
|
+
--source CH \
|
|
197
|
+
--display-name "Jane Smith" \
|
|
198
|
+
--first-name "Jane" \
|
|
199
|
+
--last-name "Smith" \
|
|
200
|
+
--company-name "Acme Corp" \
|
|
201
|
+
--primary-contact-method EMAIL
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Get contact details:**
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
wxcli org-contacts show $ORG_ID $CONTACT_ID
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Update a contact's company name:**
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
wxcli org-contacts update $ORG_ID $CONTACT_ID \
|
|
214
|
+
--company-name "New Corp Name"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Delete a contact (with confirmation prompt):**
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
wxcli org-contacts delete $ORG_ID $CONTACT_ID
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Bulk create/update contacts via --json-body:**
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
wxcli org-contacts create-bulk $ORG_ID \
|
|
227
|
+
--schemas "urn:cisco:codev:identity:contact:core:1.0" \
|
|
228
|
+
--json-body '{
|
|
229
|
+
"schemas": "urn:cisco:codev:identity:contact:core:1.0",
|
|
230
|
+
"contacts": [
|
|
231
|
+
{
|
|
232
|
+
"displayName": "Alice Johnson",
|
|
233
|
+
"firstName": "Alice",
|
|
234
|
+
"lastName": "Johnson",
|
|
235
|
+
"source": "CH",
|
|
236
|
+
"primaryContactMethod": "EMAIL",
|
|
237
|
+
"emails": [{"value": "alice@example.com", "type": "work"}]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"displayName": "Bob Williams",
|
|
241
|
+
"firstName": "Bob",
|
|
242
|
+
"lastName": "Williams",
|
|
243
|
+
"source": "CH",
|
|
244
|
+
"primaryContactMethod": "PHONE",
|
|
245
|
+
"phoneNumbers": [{"value": "+14155551234", "type": "work"}]
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
}'
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Bulk delete contacts:**
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
wxcli org-contacts create-delete $ORG_ID \
|
|
255
|
+
--schemas "urn:cisco:codev:identity:contact:core:1.0" \
|
|
256
|
+
--json-body '{
|
|
257
|
+
"schemas": "urn:cisco:codev:identity:contact:core:1.0",
|
|
258
|
+
"contactIds": ["contact-id-1", "contact-id-2"]
|
|
259
|
+
}'
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Raw HTTP Fallback
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# List/search contacts
|
|
266
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
267
|
+
"https://webexapis.com/v1/contacts/organizations/$ORG_ID/contacts/search?keyword=Smith" | jq .
|
|
268
|
+
|
|
269
|
+
# Create a contact
|
|
270
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
271
|
+
-H "Content-Type: application/json" \
|
|
272
|
+
-d '{
|
|
273
|
+
"schemas": "urn:cisco:codev:identity:contact:core:1.0",
|
|
274
|
+
"source": "CH",
|
|
275
|
+
"displayName": "Jane Smith",
|
|
276
|
+
"firstName": "Jane",
|
|
277
|
+
"lastName": "Smith",
|
|
278
|
+
"primaryContactMethod": "EMAIL",
|
|
279
|
+
"emails": [{"value": "jane@example.com", "type": "work"}]
|
|
280
|
+
}' \
|
|
281
|
+
"https://webexapis.com/v1/contacts/organizations/$ORG_ID/contacts"
|
|
282
|
+
|
|
283
|
+
# Update a contact (PATCH)
|
|
284
|
+
curl -s -X PATCH -H "Authorization: Bearer $TOKEN" \
|
|
285
|
+
-H "Content-Type: application/json" \
|
|
286
|
+
-d '{"companyName": "Updated Corp"}' \
|
|
287
|
+
"https://webexapis.com/v1/contacts/organizations/$ORG_ID/contacts/$CONTACT_ID"
|
|
288
|
+
|
|
289
|
+
# Delete a contact
|
|
290
|
+
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \
|
|
291
|
+
"https://webexapis.com/v1/contacts/organizations/$ORG_ID/contacts/$CONTACT_ID"
|
|
292
|
+
|
|
293
|
+
# Bulk create/update
|
|
294
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
295
|
+
-H "Content-Type: application/json" \
|
|
296
|
+
-d '{
|
|
297
|
+
"schemas": "urn:cisco:codev:identity:contact:core:1.0",
|
|
298
|
+
"contacts": [...]
|
|
299
|
+
}' \
|
|
300
|
+
"https://webexapis.com/v1/contacts/organizations/$ORG_ID/contacts/bulk"
|
|
301
|
+
|
|
302
|
+
# Bulk delete
|
|
303
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
304
|
+
-H "Content-Type: application/json" \
|
|
305
|
+
-d '{
|
|
306
|
+
"schemas": "urn:cisco:codev:identity:contact:core:1.0",
|
|
307
|
+
"contactIds": ["id1", "id2"]
|
|
308
|
+
}' \
|
|
309
|
+
"https://webexapis.com/v1/contacts/organizations/$ORG_ID/contacts/bulk/delete"
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Gotchas
|
|
313
|
+
|
|
314
|
+
- **`org-contacts list` uses a search endpoint.** The list command hits `/contacts/search`, not a plain list endpoint. Without any filters (`--keyword`, `--source`), it returns all contacts, but the response key is `result`, not `items`. The CLI handles this automatically.
|
|
315
|
+
|
|
316
|
+
- **`org-contacts create` requires `--schemas` and `--source`.** Both are mandatory. The schema value is always `"urn:cisco:codev:identity:contact:core:1.0"`. Source must be `CH` (Control Hub) or `Webex4Broadworks`.
|
|
317
|
+
|
|
318
|
+
- **Bulk operations (`create-bulk`, `create-delete`) require `--json-body`.** The CLI flags for these commands only accept `--schemas`. The actual contact list or contact ID list must be passed via `--json-body` with the full JSON payload.
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## 4. Roles
|
|
323
|
+
|
|
324
|
+
List and inspect Webex admin roles. Roles are used when assigning admin privileges to users via the People API. Role IDs are needed when creating or updating a person's `roles` array.
|
|
325
|
+
|
|
326
|
+
### CLI Commands
|
|
327
|
+
|
|
328
|
+
| Command | Description | HTTP Method | Path |
|
|
329
|
+
|---------|-------------|-------------|------|
|
|
330
|
+
| `wxcli roles list` | List all available roles | `GET` | `/v1/roles` |
|
|
331
|
+
| `wxcli roles show` | Get details for a specific role | `GET` | `/v1/roles/{roleId}` |
|
|
332
|
+
|
|
333
|
+
### CLI Examples
|
|
334
|
+
|
|
335
|
+
**List all roles:**
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
wxcli roles list
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**List roles as JSON (to get full role metadata):**
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
wxcli roles list -o json
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Get details for a specific role:**
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
wxcli roles show Y2lzY29zcGFyazovL3VzL1JPTEUvOTZhYmMyYWEtM2RjYy0xMWU1LWExNTItZmUzNDgxOWNkYzlh
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Raw HTTP Fallback
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# List all roles
|
|
357
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
358
|
+
"https://webexapis.com/v1/roles" | jq '.items[] | {id, name}'
|
|
359
|
+
|
|
360
|
+
# Get a specific role
|
|
361
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
362
|
+
"https://webexapis.com/v1/roles/$ROLE_ID" | jq .
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 5. Domain Management
|
|
368
|
+
|
|
369
|
+
Manage domain verification and claiming for a Webex organization. Domain verification proves ownership via DNS TXT records; claiming associates the domain with the org for user provisioning.
|
|
370
|
+
|
|
371
|
+
### CLI Commands
|
|
372
|
+
|
|
373
|
+
| Command | Description | HTTP Method | Path |
|
|
374
|
+
|---------|-------------|-------------|------|
|
|
375
|
+
| `wxcli domains get-domain-verification` | Get DNS verification token for a domain | `POST` | `/v1/identity/organizations/{orgId}/actions/getDomainVerificationToken` |
|
|
376
|
+
| `wxcli domains verify-domain` | Verify a domain (after DNS TXT record is set) | `POST` | `/v1/identity/organizations/{orgId}/actions/verifyDomain` |
|
|
377
|
+
| `wxcli domains claim-domain` | Claim a verified domain for the org | `POST` | `/v1/identity/organizations/{orgId}/actions/claimDomain` |
|
|
378
|
+
| `wxcli domains unverify-domain` | Remove verification from a domain | `POST` | `/v1/identity/organizations/{orgId}/actions/unverifyDomain` |
|
|
379
|
+
| `wxcli domains unclaim-domain` | Release a claimed domain | `POST` | `/v1/identity/organizations/{orgId}/actions/unclaimDomain` |
|
|
380
|
+
|
|
381
|
+
### CLI Examples
|
|
382
|
+
|
|
383
|
+
**Step 1 -- Get the DNS verification token:**
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
wxcli domains get-domain-verification $ORG_ID --domain "example.com"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
This returns a token value. Create a DNS TXT record for `example.com` with the returned token.
|
|
390
|
+
|
|
391
|
+
**Step 2 -- Verify the domain (after DNS propagation):**
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
wxcli domains verify-domain $ORG_ID --domain "example.com"
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Step 3 -- Claim the domain:**
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
wxcli domains claim-domain $ORG_ID
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**Verify and claim in a single step:**
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
wxcli domains verify-domain $ORG_ID --domain "example.com" --claim-domain true
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Force-claim a domain (even if users exist on other orgs):**
|
|
410
|
+
|
|
411
|
+
```bash
|
|
412
|
+
wxcli domains claim-domain $ORG_ID --force-domain-claim true
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**Claim domain without searching/marking existing users:**
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
wxcli domains claim-domain $ORG_ID --claim-domain-only true
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**Unverify a domain:**
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
wxcli domains unverify-domain $ORG_ID --domain "example.com"
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Unverify and remove pending domain:**
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
wxcli domains unverify-domain $ORG_ID --domain "example.com" --remove-pending true
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**Unclaim (release) a domain:**
|
|
434
|
+
|
|
435
|
+
```bash
|
|
436
|
+
wxcli domains unclaim-domain $ORG_ID --domain "example.com"
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### Raw HTTP Fallback
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
# Get verification token
|
|
443
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
444
|
+
-H "Content-Type: application/json" \
|
|
445
|
+
-d '{"domain": "example.com"}' \
|
|
446
|
+
"https://webexapis.com/v1/identity/organizations/$ORG_ID/actions/getDomainVerificationToken" | jq .
|
|
447
|
+
|
|
448
|
+
# Verify domain
|
|
449
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
450
|
+
-H "Content-Type: application/json" \
|
|
451
|
+
-d '{"domain": "example.com"}' \
|
|
452
|
+
"https://webexapis.com/v1/identity/organizations/$ORG_ID/actions/verifyDomain" | jq .
|
|
453
|
+
|
|
454
|
+
# Claim domain
|
|
455
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
456
|
+
-H "Content-Type: application/json" \
|
|
457
|
+
-d '{}' \
|
|
458
|
+
"https://webexapis.com/v1/identity/organizations/$ORG_ID/actions/claimDomain" | jq .
|
|
459
|
+
|
|
460
|
+
# Unverify domain
|
|
461
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
462
|
+
-H "Content-Type: application/json" \
|
|
463
|
+
-d '{"domain": "example.com"}' \
|
|
464
|
+
"https://webexapis.com/v1/identity/organizations/$ORG_ID/actions/unverifyDomain" | jq .
|
|
465
|
+
|
|
466
|
+
# Unclaim domain
|
|
467
|
+
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
|
|
468
|
+
-H "Content-Type: application/json" \
|
|
469
|
+
-d '{"domain": "example.com"}' \
|
|
470
|
+
"https://webexapis.com/v1/identity/organizations/$ORG_ID/actions/unclaimDomain" | jq .
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Gotchas
|
|
474
|
+
|
|
475
|
+
- **Domain commands are all POST, not GET/PUT/DELETE.** Every domain management command uses POST to an action-style URL (e.g., `/actions/verifyDomain`). This is an RPC-style API, not REST-style.
|
|
476
|
+
|
|
477
|
+
- **DNS propagation delay.** After adding the TXT record for domain verification, allow time for DNS propagation before calling `verify-domain`. If verification fails, wait and retry -- it can take up to 48 hours in worst cases. The OpenAPI spec documents two errors: 400 ("The domain can't be verified. This error happens if the user didn't request a token before trying to verify the domain") and 409 ("The domain has already been claimed by another organization"). The `verify-domain` endpoint requires `identity:organizations_rw` scope; without it, the API returns 401 with error code 200003 ("Sorry, you don't have sufficient privileges"). The exact error body for DNS-not-yet-propagated (as distinct from the 400 "didn't request a token" error) could not be tested without a real domain setup. <!-- Partially verified via live API 2026-03-19: confirmed 401/200003 without identity:organizations_rw scope. DNS propagation error body still unverified — would require adding a real domain TXT record -->
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## 6. Recipes
|
|
482
|
+
|
|
483
|
+
### Recipe: Domain Verification Workflow
|
|
484
|
+
|
|
485
|
+
Complete end-to-end flow for adding a domain to your Webex org.
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
# 1. Get the verification token
|
|
489
|
+
wxcli domains get-domain-verification $ORG_ID --domain "newdomain.com"
|
|
490
|
+
# Response includes a token like: "webex-verification=abc123def456"
|
|
491
|
+
|
|
492
|
+
# 2. Add DNS TXT record (outside wxcli -- use your DNS provider)
|
|
493
|
+
# Record type: TXT
|
|
494
|
+
# Name: @ (or newdomain.com)
|
|
495
|
+
# Value: webex-verification=abc123def456
|
|
496
|
+
# Wait for DNS propagation (can take up to 48 hours, typically 15-60 minutes)
|
|
497
|
+
|
|
498
|
+
# 3. Verify the domain
|
|
499
|
+
wxcli domains verify-domain $ORG_ID --domain "newdomain.com"
|
|
500
|
+
|
|
501
|
+
# 4. Claim the domain for user provisioning
|
|
502
|
+
wxcli domains claim-domain $ORG_ID
|
|
503
|
+
|
|
504
|
+
# Or combine steps 3 and 4:
|
|
505
|
+
wxcli domains verify-domain $ORG_ID --domain "newdomain.com" --claim-domain true
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Recipe: Bulk Import Organization Contacts
|
|
509
|
+
|
|
510
|
+
Import a batch of contacts from a prepared JSON file.
|
|
511
|
+
|
|
512
|
+
```bash
|
|
513
|
+
# Prepare contacts.json:
|
|
514
|
+
# {
|
|
515
|
+
# "schemas": "urn:cisco:codev:identity:contact:core:1.0",
|
|
516
|
+
# "contacts": [
|
|
517
|
+
# {
|
|
518
|
+
# "displayName": "Alice Johnson",
|
|
519
|
+
# "firstName": "Alice",
|
|
520
|
+
# "lastName": "Johnson",
|
|
521
|
+
# "source": "CH",
|
|
522
|
+
# "primaryContactMethod": "EMAIL",
|
|
523
|
+
# "emails": [{"value": "alice@example.com", "type": "work"}]
|
|
524
|
+
# },
|
|
525
|
+
# {
|
|
526
|
+
# "displayName": "Bob Williams",
|
|
527
|
+
# "firstName": "Bob",
|
|
528
|
+
# "lastName": "Williams",
|
|
529
|
+
# "source": "CH",
|
|
530
|
+
# "primaryContactMethod": "PHONE",
|
|
531
|
+
# "phoneNumbers": [{"value": "+14155551234", "type": "work"}]
|
|
532
|
+
# }
|
|
533
|
+
# ]
|
|
534
|
+
# }
|
|
535
|
+
|
|
536
|
+
wxcli org-contacts create-bulk $ORG_ID \
|
|
537
|
+
--schemas "urn:cisco:codev:identity:contact:core:1.0" \
|
|
538
|
+
--json-body "$(cat contacts.json)"
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
### Recipe: List Admin Roles and Find a Specific Role
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
# List all roles in table format
|
|
545
|
+
wxcli roles list
|
|
546
|
+
|
|
547
|
+
# Get full JSON output to see role names and IDs
|
|
548
|
+
wxcli roles list -o json
|
|
549
|
+
|
|
550
|
+
# Once you have the role ID, inspect it
|
|
551
|
+
wxcli roles show $ROLE_ID
|
|
552
|
+
|
|
553
|
+
# Common admin roles to look for:
|
|
554
|
+
# - Full Administrator
|
|
555
|
+
# - Read-Only Administrator
|
|
556
|
+
# - User and Device Administrator
|
|
557
|
+
# - Device Administrator
|
|
558
|
+
# - Compliance Officer
|
|
559
|
+
# - Webex Calling Detailed Call History API access
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### Recipe: Inspect Your Own Org
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
# List orgs to get your org ID
|
|
566
|
+
wxcli organizations list
|
|
567
|
+
|
|
568
|
+
# Get full org details (creation date, display name, etc.)
|
|
569
|
+
wxcli organizations show $ORG_ID -o json
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## 7. Gotchas
|
|
575
|
+
|
|
576
|
+
Cross-cutting gotchas that apply across multiple sections. Section-specific gotchas are inline above.
|
|
577
|
+
|
|
578
|
+
- **Scope confusion: `identity:` vs `spark-admin:`.** Organization, settings, contacts, and domain APIs use `identity:*` scopes (e.g., `identity:organizations_read`). Webex Calling APIs use `spark-admin:*` scopes. A token with only `spark-admin:` scopes will get 401/403 on organization management endpoints. Verify your integration or service app has the correct `identity:` scopes.
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## See Also
|
|
583
|
+
|
|
584
|
+
- **[provisioning.md](provisioning.md)** -- For Webex Calling locations within an org, see the provisioning reference. Organization management sets up the org container; provisioning configures calling-specific resources inside it.
|
|
585
|
+
- **[authentication.md](authentication.md)** -- OAuth scopes, token types, and service app configuration. Pay special attention to `identity:*` scopes for the endpoints in this doc.
|
|
586
|
+
- **[reporting-analytics.md](reporting-analytics.md)** -- CDR and analytics APIs that operate at the org level. Requires different scopes (`spark-admin:calling_cdr_read`, `analytics:read_all`).
|