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.
Files changed (413) hide show
  1. wxcli/__init__.py +4 -0
  2. wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
  3. wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
  4. wxcli/_playbook/.claude/rules/cleanup.md +29 -0
  5. wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
  6. wxcli/_playbook/.claude/rules/org-health.md +14 -0
  7. wxcli/_playbook/.claude/settings.json +8 -0
  8. wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
  9. wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
  10. wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
  11. wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
  12. wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
  13. wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
  14. wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
  15. wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
  16. wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
  17. wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
  18. wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
  19. wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
  20. wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
  21. wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
  22. wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
  23. wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
  24. wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
  25. wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
  26. wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
  27. wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
  28. wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
  29. wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
  30. wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
  31. wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
  32. wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
  33. wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
  34. wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
  35. wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
  36. wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
  37. wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
  38. wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
  39. wxcli/_playbook/CLAUDE.md +373 -0
  40. wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
  41. wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
  42. wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
  43. wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
  44. wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
  45. wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
  46. wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
  47. wxcli/_playbook/docs/reference/admin-partner.md +357 -0
  48. wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
  49. wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
  50. wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
  51. wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
  52. wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
  53. wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
  54. wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
  55. wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
  56. wxcli/_playbook/docs/reference/authentication.md +965 -0
  57. wxcli/_playbook/docs/reference/call-control.md +1205 -0
  58. wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
  59. wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
  60. wxcli/_playbook/docs/reference/call-routing.md +2304 -0
  61. wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
  62. wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
  63. wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
  64. wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
  65. wxcli/_playbook/docs/reference/devices-core.md +1869 -0
  66. wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
  67. wxcli/_playbook/docs/reference/devices-platform.md +467 -0
  68. wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
  69. wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
  70. wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
  71. wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
  72. wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
  73. wxcli/_playbook/docs/reference/meetings-content.md +473 -0
  74. wxcli/_playbook/docs/reference/meetings-core.md +903 -0
  75. wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
  76. wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
  77. wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
  78. wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
  79. wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
  80. wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
  81. wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
  82. wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
  83. wxcli/_playbook/docs/reference/provisioning.md +1366 -0
  84. wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
  85. wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
  86. wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
  87. wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
  88. wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
  89. wxcli/_version.py +24 -0
  90. wxcli/auth.py +137 -0
  91. wxcli/commands/__init__.py +0 -0
  92. wxcli/commands/_registry.py +181 -0
  93. wxcli/commands/activation_email.py +103 -0
  94. wxcli/commands/admin_recordings.py +585 -0
  95. wxcli/commands/analytics.py +105 -0
  96. wxcli/commands/announcement_playlists.py +219 -0
  97. wxcli/commands/announcements.py +519 -0
  98. wxcli/commands/archive_users.py +36 -0
  99. wxcli/commands/attachment_actions.py +60 -0
  100. wxcli/commands/audit_events.py +83 -0
  101. wxcli/commands/authorizations.py +113 -0
  102. wxcli/commands/auto_attendant.py +642 -0
  103. wxcli/commands/broadworks_billing_reports.py +126 -0
  104. wxcli/commands/broadworks_enterprises.py +160 -0
  105. wxcli/commands/broadworks_subscribers.py +319 -0
  106. wxcli/commands/broadworks_workspaces.py +108 -0
  107. wxcli/commands/call_controls.py +1304 -0
  108. wxcli/commands/call_park.py +494 -0
  109. wxcli/commands/call_pickup.py +229 -0
  110. wxcli/commands/call_queue.py +1878 -0
  111. wxcli/commands/call_recording.py +707 -0
  112. wxcli/commands/call_routing.py +1610 -0
  113. wxcli/commands/call_settings_for_me_phase_5.py +212 -0
  114. wxcli/commands/caller_reputation.py +169 -0
  115. wxcli/commands/calling_service.py +305 -0
  116. wxcli/commands/cc_address_book.py +770 -0
  117. wxcli/commands/cc_agent_greetings.py +242 -0
  118. wxcli/commands/cc_agent_summaries.py +39 -0
  119. wxcli/commands/cc_agent_wellbeing.py +216 -0
  120. wxcli/commands/cc_agents.py +425 -0
  121. wxcli/commands/cc_ai_assistant.py +55 -0
  122. wxcli/commands/cc_ai_feature.py +294 -0
  123. wxcli/commands/cc_audio_files.py +149 -0
  124. wxcli/commands/cc_auto_csat.py +311 -0
  125. wxcli/commands/cc_aux_code.py +458 -0
  126. wxcli/commands/cc_business_hour.py +353 -0
  127. wxcli/commands/cc_call_monitoring.py +228 -0
  128. wxcli/commands/cc_callbacks.py +194 -0
  129. wxcli/commands/cc_campaign.py +212 -0
  130. wxcli/commands/cc_captures.py +39 -0
  131. wxcli/commands/cc_contact_list.py +169 -0
  132. wxcli/commands/cc_contact_number.py +295 -0
  133. wxcli/commands/cc_data_sources.py +235 -0
  134. wxcli/commands/cc_desktop_layout.py +380 -0
  135. wxcli/commands/cc_desktop_profile.py +322 -0
  136. wxcli/commands/cc_dial_number.py +511 -0
  137. wxcli/commands/cc_dial_plan.py +347 -0
  138. wxcli/commands/cc_dnc.py +101 -0
  139. wxcli/commands/cc_entry_point.py +545 -0
  140. wxcli/commands/cc_ewt.py +51 -0
  141. wxcli/commands/cc_flow.py +477 -0
  142. wxcli/commands/cc_global_vars.py +430 -0
  143. wxcli/commands/cc_holiday_list.py +335 -0
  144. wxcli/commands/cc_journey.py +1261 -0
  145. wxcli/commands/cc_legacy_flows.py +49 -0
  146. wxcli/commands/cc_multimedia_profile.py +436 -0
  147. wxcli/commands/cc_notification.py +51 -0
  148. wxcli/commands/cc_outdial_ani.py +604 -0
  149. wxcli/commands/cc_overrides.py +341 -0
  150. wxcli/commands/cc_queue.py +1083 -0
  151. wxcli/commands/cc_queue_stats.py +55 -0
  152. wxcli/commands/cc_realtime.py +51 -0
  153. wxcli/commands/cc_resource_collection.py +312 -0
  154. wxcli/commands/cc_search.py +46 -0
  155. wxcli/commands/cc_site.py +400 -0
  156. wxcli/commands/cc_skill.py +350 -0
  157. wxcli/commands/cc_skill_profile.py +289 -0
  158. wxcli/commands/cc_subscriptions.py +426 -0
  159. wxcli/commands/cc_summaries.py +130 -0
  160. wxcli/commands/cc_tasks.py +844 -0
  161. wxcli/commands/cc_team.py +325 -0
  162. wxcli/commands/cc_user_profiles.py +349 -0
  163. wxcli/commands/cc_users.py +701 -0
  164. wxcli/commands/cc_work_types.py +363 -0
  165. wxcli/commands/cdr.py +89 -0
  166. wxcli/commands/classifications.py +38 -0
  167. wxcli/commands/cleanup.py +1427 -0
  168. wxcli/commands/client_settings.py +72 -0
  169. wxcli/commands/conference.py +328 -0
  170. wxcli/commands/configure.py +72 -0
  171. wxcli/commands/converged_recordings.py +347 -0
  172. wxcli/commands/converged_recordings_export.py +310 -0
  173. wxcli/commands/cq_playlists.py +42 -0
  174. wxcli/commands/cucm.py +2794 -0
  175. wxcli/commands/cucm_config.py +129 -0
  176. wxcli/commands/customer_assist.py +373 -0
  177. wxcli/commands/data_sources.py +227 -0
  178. wxcli/commands/dect_devices.py +787 -0
  179. wxcli/commands/device_configurations.py +77 -0
  180. wxcli/commands/device_dynamic_settings.py +320 -0
  181. wxcli/commands/device_settings.py +1489 -0
  182. wxcli/commands/devices.py +280 -0
  183. wxcli/commands/domains.py +142 -0
  184. wxcli/commands/ecm.py +178 -0
  185. wxcli/commands/emergency_services.py +827 -0
  186. wxcli/commands/events.py +83 -0
  187. wxcli/commands/external_voicemail.py +52 -0
  188. wxcli/commands/groups.py +206 -0
  189. wxcli/commands/guest_management.py +76 -0
  190. wxcli/commands/hds.py +340 -0
  191. wxcli/commands/hot_desk.py +67 -0
  192. wxcli/commands/hot_desking_members.py +118 -0
  193. wxcli/commands/hot_desking_portal.py +124 -0
  194. wxcli/commands/hunt_group.py +577 -0
  195. wxcli/commands/hybrid_clusters.py +71 -0
  196. wxcli/commands/hybrid_connectors.py +67 -0
  197. wxcli/commands/identity_org.py +159 -0
  198. wxcli/commands/init_playbook.py +155 -0
  199. wxcli/commands/licenses.py +106 -0
  200. wxcli/commands/live_monitoring.py +40 -0
  201. wxcli/commands/location_call_handling.py +577 -0
  202. wxcli/commands/location_schedules.py +341 -0
  203. wxcli/commands/location_settings.py +1297 -0
  204. wxcli/commands/location_voicemail.py +494 -0
  205. wxcli/commands/locations.py +336 -0
  206. wxcli/commands/meeting_captions.py +110 -0
  207. wxcli/commands/meeting_chats.py +63 -0
  208. wxcli/commands/meeting_invitees.py +234 -0
  209. wxcli/commands/meeting_messages.py +28 -0
  210. wxcli/commands/meeting_participants.py +278 -0
  211. wxcli/commands/meeting_polls.py +111 -0
  212. wxcli/commands/meeting_preferences.py +515 -0
  213. wxcli/commands/meeting_qa.py +78 -0
  214. wxcli/commands/meeting_qualities.py +43 -0
  215. wxcli/commands/meeting_reports.py +101 -0
  216. wxcli/commands/meeting_session_types.py +105 -0
  217. wxcli/commands/meeting_site.py +57 -0
  218. wxcli/commands/meeting_slido.py +44 -0
  219. wxcli/commands/meeting_summaries.py +92 -0
  220. wxcli/commands/meeting_tracking_codes.py +233 -0
  221. wxcli/commands/meeting_transcripts.py +230 -0
  222. wxcli/commands/meetings.py +1997 -0
  223. wxcli/commands/memberships.py +164 -0
  224. wxcli/commands/messages.py +213 -0
  225. wxcli/commands/mode_management.py +244 -0
  226. wxcli/commands/my_call_settings.py +3577 -0
  227. wxcli/commands/numbers.py +405 -0
  228. wxcli/commands/operating_modes.py +410 -0
  229. wxcli/commands/org_contacts.py +284 -0
  230. wxcli/commands/org_health_cli.py +55 -0
  231. wxcli/commands/org_settings.py +71 -0
  232. wxcli/commands/organizations.py +83 -0
  233. wxcli/commands/paging_group.py +257 -0
  234. wxcli/commands/partner_admins.py +141 -0
  235. wxcli/commands/partner_reports.py +188 -0
  236. wxcli/commands/partner_tags.py +216 -0
  237. wxcli/commands/people.py +279 -0
  238. wxcli/commands/person_call_settings.py +71 -0
  239. wxcli/commands/pstn.py +280 -0
  240. wxcli/commands/recording_report.py +154 -0
  241. wxcli/commands/report_templates.py +38 -0
  242. wxcli/commands/reports.py +144 -0
  243. wxcli/commands/resource_group_memberships.py +160 -0
  244. wxcli/commands/resource_groups.py +67 -0
  245. wxcli/commands/roles.py +63 -0
  246. wxcli/commands/room_tabs.py +160 -0
  247. wxcli/commands/rooms.py +225 -0
  248. wxcli/commands/scim_bulk.py +46 -0
  249. wxcli/commands/scim_groups.py +246 -0
  250. wxcli/commands/scim_schemas.py +82 -0
  251. wxcli/commands/scim_users.py +283 -0
  252. wxcli/commands/security_audit.py +54 -0
  253. wxcli/commands/service_apps.py +51 -0
  254. wxcli/commands/single_number_reach.py +209 -0
  255. wxcli/commands/team_memberships.py +155 -0
  256. wxcli/commands/teams.py +153 -0
  257. wxcli/commands/ucm_profile.py +42 -0
  258. wxcli/commands/update.py +219 -0
  259. wxcli/commands/user_settings.py +5116 -0
  260. wxcli/commands/video_mesh.py +1090 -0
  261. wxcli/commands/virtual_extensions.py +502 -0
  262. wxcli/commands/virtual_line_settings.py +2072 -0
  263. wxcli/commands/webhooks.py +176 -0
  264. wxcli/commands/wholesale_billing_reports.py +147 -0
  265. wxcli/commands/wholesale_provisioning.py +523 -0
  266. wxcli/commands/workspace_locations.py +339 -0
  267. wxcli/commands/workspace_metrics.py +103 -0
  268. wxcli/commands/workspace_personalization.py +70 -0
  269. wxcli/commands/workspace_settings.py +3347 -0
  270. wxcli/commands/workspaces.py +279 -0
  271. wxcli/commands/xapi.py +114 -0
  272. wxcli/config.py +139 -0
  273. wxcli/errors.py +77 -0
  274. wxcli/main.py +210 -0
  275. wxcli/migration/CLAUDE.md +106 -0
  276. wxcli/migration/__init__.py +1 -0
  277. wxcli/migration/advisory/CLAUDE.md +196 -0
  278. wxcli/migration/advisory/__init__.py +46 -0
  279. wxcli/migration/advisory/advisor.py +107 -0
  280. wxcli/migration/advisory/advisory_patterns.py +2552 -0
  281. wxcli/migration/advisory/recommendation_rules.py +835 -0
  282. wxcli/migration/cucm/CLAUDE.md +74 -0
  283. wxcli/migration/cucm/__init__.py +5 -0
  284. wxcli/migration/cucm/connection.py +265 -0
  285. wxcli/migration/cucm/discovery.py +225 -0
  286. wxcli/migration/cucm/extractors/__init__.py +1 -0
  287. wxcli/migration/cucm/extractors/announcements.py +92 -0
  288. wxcli/migration/cucm/extractors/base.py +90 -0
  289. wxcli/migration/cucm/extractors/device_profiles.py +98 -0
  290. wxcli/migration/cucm/extractors/devices.py +193 -0
  291. wxcli/migration/cucm/extractors/e911.py +103 -0
  292. wxcli/migration/cucm/extractors/features.py +309 -0
  293. wxcli/migration/cucm/extractors/helpers.py +73 -0
  294. wxcli/migration/cucm/extractors/informational.py +295 -0
  295. wxcli/migration/cucm/extractors/locations.py +221 -0
  296. wxcli/migration/cucm/extractors/moh.py +100 -0
  297. wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
  298. wxcli/migration/cucm/extractors/routing.py +493 -0
  299. wxcli/migration/cucm/extractors/shared_lines.py +146 -0
  300. wxcli/migration/cucm/extractors/templates.py +229 -0
  301. wxcli/migration/cucm/extractors/tier4.py +173 -0
  302. wxcli/migration/cucm/extractors/users.py +240 -0
  303. wxcli/migration/cucm/extractors/voicemail.py +243 -0
  304. wxcli/migration/cucm/extractors/workspaces.py +88 -0
  305. wxcli/migration/cucm/unity_connection.py +304 -0
  306. wxcli/migration/execute/CLAUDE.md +372 -0
  307. wxcli/migration/execute/__init__.py +303 -0
  308. wxcli/migration/execute/batch.py +277 -0
  309. wxcli/migration/execute/dependency.py +483 -0
  310. wxcli/migration/execute/engine.py +964 -0
  311. wxcli/migration/execute/handlers.py +2232 -0
  312. wxcli/migration/execute/planner.py +1939 -0
  313. wxcli/migration/execute/runtime.py +571 -0
  314. wxcli/migration/export/CLAUDE.md +49 -0
  315. wxcli/migration/export/__init__.py +8 -0
  316. wxcli/migration/export/csv_export.py +126 -0
  317. wxcli/migration/export/deployment_plan.py +479 -0
  318. wxcli/migration/export/json_export.py +60 -0
  319. wxcli/migration/models.py +941 -0
  320. wxcli/migration/phone_models.py +50 -0
  321. wxcli/migration/preflight/CLAUDE.md +52 -0
  322. wxcli/migration/preflight/__init__.py +89 -0
  323. wxcli/migration/preflight/checks.py +911 -0
  324. wxcli/migration/preflight/runner.py +293 -0
  325. wxcli/migration/rate_limiter.py +144 -0
  326. wxcli/migration/report/CLAUDE.md +245 -0
  327. wxcli/migration/report/__init__.py +7 -0
  328. wxcli/migration/report/appendix.py +2437 -0
  329. wxcli/migration/report/assembler.py +183 -0
  330. wxcli/migration/report/charts.py +263 -0
  331. wxcli/migration/report/executive.py +776 -0
  332. wxcli/migration/report/explainer.py +704 -0
  333. wxcli/migration/report/helpers.py +74 -0
  334. wxcli/migration/report/ingest.py +152 -0
  335. wxcli/migration/report/notice_templates.py +192 -0
  336. wxcli/migration/report/score.py +375 -0
  337. wxcli/migration/report/styles.py +1052 -0
  338. wxcli/migration/report/user_diff.py +1052 -0
  339. wxcli/migration/report/user_notice.py +425 -0
  340. wxcli/migration/state.py +139 -0
  341. wxcli/migration/store.py +860 -0
  342. wxcli/migration/transform/CLAUDE.md +107 -0
  343. wxcli/migration/transform/__init__.py +12 -0
  344. wxcli/migration/transform/analysis_pipeline.py +453 -0
  345. wxcli/migration/transform/analyzers/__init__.py +142 -0
  346. wxcli/migration/transform/analyzers/css_permission.py +189 -0
  347. wxcli/migration/transform/analyzers/css_routing.py +335 -0
  348. wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
  349. wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
  350. wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
  351. wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
  352. wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
  353. wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
  354. wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
  355. wxcli/migration/transform/analyzers/missing_data.py +300 -0
  356. wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
  357. wxcli/migration/transform/analyzers/shared_line.py +170 -0
  358. wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
  359. wxcli/migration/transform/analyzers/workspace_license.py +212 -0
  360. wxcli/migration/transform/cross_reference.py +1136 -0
  361. wxcli/migration/transform/cucm_pattern.py +246 -0
  362. wxcli/migration/transform/decisions.py +301 -0
  363. wxcli/migration/transform/e164.py +145 -0
  364. wxcli/migration/transform/engine.py +256 -0
  365. wxcli/migration/transform/mappers/CLAUDE.md +123 -0
  366. wxcli/migration/transform/mappers/__init__.py +76 -0
  367. wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
  368. wxcli/migration/transform/mappers/base.py +190 -0
  369. wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
  370. wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
  371. wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
  372. wxcli/migration/transform/mappers/css_mapper.py +868 -0
  373. wxcli/migration/transform/mappers/dect_mapper.py +367 -0
  374. wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
  375. wxcli/migration/transform/mappers/device_mapper.py +227 -0
  376. wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
  377. wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
  378. wxcli/migration/transform/mappers/e911_mapper.py +129 -0
  379. wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
  380. wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
  381. wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
  382. wxcli/migration/transform/mappers/line_mapper.py +310 -0
  383. wxcli/migration/transform/mappers/location_mapper.py +235 -0
  384. wxcli/migration/transform/mappers/moh_mapper.py +114 -0
  385. wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
  386. wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
  387. wxcli/migration/transform/mappers/routing_mapper.py +821 -0
  388. wxcli/migration/transform/mappers/snr_mapper.py +201 -0
  389. wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
  390. wxcli/migration/transform/mappers/user_mapper.py +264 -0
  391. wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
  392. wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
  393. wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
  394. wxcli/migration/transform/normalizers.py +2008 -0
  395. wxcli/migration/transform/pattern_converter.py +106 -0
  396. wxcli/migration/transform/pipeline.py +271 -0
  397. wxcli/migration/transform/rules.py +255 -0
  398. wxcli/org_health/CLAUDE.md +63 -0
  399. wxcli/org_health/__init__.py +7 -0
  400. wxcli/org_health/analyze.py +93 -0
  401. wxcli/org_health/checks.py +458 -0
  402. wxcli/org_health/collector.py +62 -0
  403. wxcli/org_health/models.py +78 -0
  404. wxcli/org_health/report.py +300 -0
  405. wxcli/output.py +101 -0
  406. wxcli-1.2.0.dist-info/METADATA +505 -0
  407. wxcli-1.2.0.dist-info/RECORD +413 -0
  408. wxcli-1.2.0.dist-info/WHEEL +5 -0
  409. wxcli-1.2.0.dist-info/entry_points.txt +2 -0
  410. wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
  411. wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
  412. wxcli-1.2.0.dist-info/scm_version.json +8 -0
  413. 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`).