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,899 @@
1
+ # Meetings Infrastructure: Video Mesh, Participants, and Invitees
2
+
3
+ Reference for Webex Meetings infrastructure management. Covers the 43 commands across 3 CLI groups that an IT admin uses to monitor Video Mesh on-premises media processing, manage meeting participants in real time, and configure meeting invitees pre-meeting. Sourced from the Webex Meetings API (OpenAPI spec: `specs/webex-meetings.json`).
4
+
5
+ ## Sources
6
+
7
+ - OpenAPI spec: `specs/webex-meetings.json`
8
+ - [developer.webex.com Video Mesh APIs](https://developer.webex.com/docs/api/v1/video-mesh)
9
+ - [developer.webex.com Meeting Participants APIs](https://developer.webex.com/docs/api/v1/meeting-participants)
10
+ - [developer.webex.com Meeting Invitees APIs](https://developer.webex.com/docs/api/v1/meeting-invitees)
11
+
12
+ ---
13
+
14
+ ## Table of Contents
15
+
16
+ 1. [Meetings Infrastructure Overview](#1-meetings-infrastructure-overview)
17
+ 2. [Video Mesh: Clusters and Nodes](#2-video-mesh-clusters-and-nodes)
18
+ 3. [Video Mesh: Availability](#3-video-mesh-availability)
19
+ 4. [Video Mesh: Utilization and Overflow](#4-video-mesh-utilization-and-overflow)
20
+ 5. [Video Mesh: Call Redirects and Client Distribution](#5-video-mesh-call-redirects-and-client-distribution)
21
+ 6. [Video Mesh: Test Results](#6-video-mesh-test-results)
22
+ 7. [Video Mesh: On-Demand Tests](#7-video-mesh-on-demand-tests)
23
+ 8. [Video Mesh: Event Thresholds](#8-video-mesh-event-thresholds)
24
+ 9. [Meeting Participants](#9-meeting-participants)
25
+ 10. [Meeting Invitees](#10-meeting-invitees)
26
+ 11. [Raw HTTP Endpoints](#11-raw-http-endpoints)
27
+ 12. [Gotchas](#12-gotchas)
28
+ 13. [See Also](#13-see-also)
29
+
30
+ ---
31
+
32
+ ## 1. Meetings Infrastructure Overview
33
+
34
+ This doc covers three distinct API surfaces that support the Webex Meetings infrastructure:
35
+
36
+ - **Video Mesh** (30 commands) -- on-premises media processing nodes that keep meeting traffic local. The API is read-only for monitoring and analytics, plus event threshold configuration. Cluster and node provisioning is done through the Webex Control Hub UI, not via API.
37
+ - **Meeting Participants** (7 commands) -- real-time management of who is in a meeting. List, query, admit from lobby, mute/unmute, expel, and call out to SIP devices.
38
+ - **Meeting Invitees** (6 commands) -- pre-meeting management of who is invited. CRUD operations on the invitation list before the meeting starts.
39
+
40
+ ```
41
+ Video Mesh (on-prem media nodes)
42
+ ├── Clusters (grouping of nodes)
43
+ │ ├── Availability, Utilization, Overflow
44
+ │ ├── Call Redirects, Client Distribution
45
+ │ └── Test Results (network, reachability, media health)
46
+ ├── Nodes (individual media processing servers)
47
+ │ └── Availability, Test Results
48
+ └── Event Thresholds (alert configuration)
49
+
50
+ Meeting Lifecycle
51
+ ├── Invitees (pre-meeting: who to invite)
52
+ └── Participants (in-meeting: who joined, lobby, mute, expel, SIP callout)
53
+ ```
54
+
55
+ **CLI groups in this doc:**
56
+
57
+ | CLI Group | Resource | Commands |
58
+ |-----------|----------|---------|
59
+ | `video-mesh` | Video Mesh clusters, nodes, analytics | 30 |
60
+ | `meeting-participants` | Meeting participants | 7 |
61
+ | `meeting-invitees` | Meeting invitees | 6 |
62
+
63
+ ---
64
+
65
+ ## 2. Video Mesh: Clusters and Nodes
66
+
67
+ **CLI group:** `video-mesh`
68
+ **API base:** `https://webexapis.com/v1/videoMesh`
69
+
70
+ Video Mesh deploys on-premises media processing nodes that keep real-time media (audio, video, content sharing) local to reduce bandwidth to the cloud. Clusters group multiple nodes for redundancy and load balancing. All cluster and node management (provisioning, registration, decommissioning) is done through the Webex Control Hub -- the API provides monitoring and analytics only.
71
+
72
+ ### Commands
73
+
74
+ | Command | CLI | HTTP Method | What It Does |
75
+ |---------|-----|------------|-------------|
76
+ | List clusters | `wxcli video-mesh list-clusters-video-mesh` | GET /videoMesh/clusters | List all Video Mesh clusters in the org |
77
+ | Show cluster | `wxcli video-mesh show --cluster-id ID` | GET /videoMesh/clusters/{clusterId} | Get details for a single cluster |
78
+
79
+ ### Key Parameters
80
+
81
+ #### `list-clusters-video-mesh`
82
+
83
+ | Option | Description |
84
+ |--------|-------------|
85
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
86
+ | `--output table\|json` | Output format (default: table) |
87
+
88
+ #### `show`
89
+
90
+ | Option | Required | Description |
91
+ |--------|:--------:|-------------|
92
+ | `--cluster-id ID` | Yes | The unique Video Mesh Cluster ID |
93
+ | `--org-id ORG_ID` | No | Organization ID (auto-injected from config) |
94
+
95
+ ### Raw HTTP
96
+
97
+ ```python
98
+ import requests
99
+
100
+ BASE = "https://webexapis.com/v1"
101
+ headers = {"Authorization": f"Bearer {token}"}
102
+
103
+ # List all Video Mesh clusters
104
+ resp = requests.get(f"{BASE}/videoMesh/clusters", headers=headers, params={"orgId": org_id})
105
+ clusters = resp.json().get("items", [])
106
+ # Each item: {"clusterId", "clusterName", "releaseChannel", ...}
107
+
108
+ # Get a single cluster
109
+ resp = requests.get(f"{BASE}/videoMesh/clusters/{cluster_id}", headers=headers, params={"orgId": org_id})
110
+ cluster = resp.json()
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 3. Video Mesh: Availability
116
+
117
+ Monitor the availability of clusters and individual nodes over time.
118
+
119
+ ### Commands
120
+
121
+ | Command | CLI | HTTP Method | What It Does |
122
+ |---------|-----|------------|-------------|
123
+ | List cluster availability | `wxcli video-mesh list-availability-clusters` | GET /videoMesh/clusters/availability | Availability for all clusters in the org |
124
+ | Show cluster availability | `wxcli video-mesh show-availability-clusters --cluster-id ID` | GET /videoMesh/clusters/availability/{clusterId} | Availability for a single cluster |
125
+ | List node availability | `wxcli video-mesh list-availability-nodes` | GET /videoMesh/nodes/availability | Availability for all nodes in the org |
126
+ | Show node availability | `wxcli video-mesh show-availability-nodes --node-id ID` | GET /videoMesh/nodes/availability/{nodeId} | Availability for a single node |
127
+
128
+ ### Key Parameters (shared across availability commands)
129
+
130
+ | Option | Description |
131
+ |--------|-------------|
132
+ | `--from DATETIME` | Start of time range (ISO 8601). Required for analytics queries. |
133
+ | `--to DATETIME` | End of time range (ISO 8601). Required for analytics queries. |
134
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
135
+ | `--output table\|json` | Output format (default: table) |
136
+
137
+ ### Raw HTTP
138
+
139
+ ```python
140
+ BASE = "https://webexapis.com/v1"
141
+
142
+ # List cluster availability over a time range
143
+ params = {
144
+ "orgId": org_id,
145
+ "from": "2026-03-01T00:00:00Z",
146
+ "to": "2026-03-28T00:00:00Z"
147
+ }
148
+ resp = requests.get(f"{BASE}/videoMesh/clusters/availability", headers=headers, params=params)
149
+ data = resp.json().get("items", [])
150
+ # Each item contains: orgId, from, to, items[{clusterName, clusterId, availabilitySegments[...]}]
151
+
152
+ # Get availability for a single node
153
+ resp = requests.get(f"{BASE}/videoMesh/nodes/availability/{node_id}", headers=headers, params=params)
154
+ node_avail = resp.json()
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 4. Video Mesh: Utilization and Overflow
160
+
161
+ Monitor resource utilization across clusters and track when calls overflow to the cloud.
162
+
163
+ ### Commands
164
+
165
+ | Command | CLI | HTTP Method | What It Does |
166
+ |---------|-----|------------|-------------|
167
+ | List utilization | `wxcli video-mesh list-utilization-video-mesh` | GET /videoMesh/utilization | Utilization for all clusters in the org |
168
+ | Cluster utilization | `wxcli video-mesh list-utilization-clusters` | GET /videoMesh/clusters/utilization | Detailed utilization for specific cluster |
169
+ | Cloud overflow | `wxcli video-mesh list-cloud-overflow` | GET /videoMesh/cloudOverflow | Overflow to cloud details |
170
+
171
+ ### Key Parameters (shared across utilization and overflow commands)
172
+
173
+ | Option | Description |
174
+ |--------|-------------|
175
+ | `--from DATETIME` | Start of time range (ISO 8601). Required. |
176
+ | `--to DATETIME` | End of time range (ISO 8601). Required. |
177
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
178
+ | `--output table\|json` | Output format (default: table) |
179
+
180
+ #### `list-utilization-clusters` (additional)
181
+
182
+ | Option | Description |
183
+ |--------|-------------|
184
+ | `--cluster-id ID` | The unique Video Mesh Cluster ID |
185
+
186
+ ### Raw HTTP
187
+
188
+ ```python
189
+ BASE = "https://webexapis.com/v1"
190
+
191
+ # List utilization across all clusters
192
+ params = {"orgId": org_id, "from": "2026-03-01T00:00:00Z", "to": "2026-03-28T00:00:00Z"}
193
+ resp = requests.get(f"{BASE}/videoMesh/utilization", headers=headers, params=params)
194
+ utilization = resp.json().get("items", [])
195
+ # Response contains: timestamp, clusters[{utilizationMetrics: {avgCpu, activeCalls, activePrivateCalls, ...}}]
196
+
197
+ # Cloud overflow details
198
+ resp = requests.get(f"{BASE}/videoMesh/cloudOverflow", headers=headers, params=params)
199
+ overflow = resp.json().get("items", [])
200
+ # Response contains: timestamp, overflowDetails[{overflowReason, overflowCount, possibleRemediation}]
201
+ ```
202
+
203
+ ---
204
+
205
+ ## 5. Video Mesh: Call Redirects and Client Distribution
206
+
207
+ Track call redirect patterns across clusters and analyze client type distribution.
208
+
209
+ ### Commands
210
+
211
+ | Command | CLI | HTTP Method | What It Does |
212
+ |---------|-----|------------|-------------|
213
+ | List call redirects | `wxcli video-mesh list-call-redirects-video-mesh` | GET /videoMesh/callRedirects | Redirect details for all clusters |
214
+ | Cluster call redirects | `wxcli video-mesh list-call-redirects-clusters` | GET /videoMesh/clusters/callRedirects | Redirect details for a specific cluster |
215
+ | Client type distribution | `wxcli video-mesh list` | GET /videoMesh/clientTypeDistribution | Client types across all clusters |
216
+ | Cluster client distribution | `wxcli video-mesh list-clusters-client-type-distribution` | GET /videoMesh/clientTypeDistribution/clusters | Client types for a specific cluster |
217
+
218
+ ### Key Parameters (shared across these commands)
219
+
220
+ | Option | Description |
221
+ |--------|-------------|
222
+ | `--from DATETIME` | Start of time range (ISO 8601). Required. |
223
+ | `--to DATETIME` | End of time range (ISO 8601). Required. |
224
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
225
+ | `--output table\|json` | Output format (default: table) |
226
+
227
+ #### Cluster-specific commands (additional)
228
+
229
+ | Option | Description |
230
+ |--------|-------------|
231
+ | `--cluster-id ID` | The unique Video Mesh Cluster ID |
232
+
233
+ ### Raw HTTP
234
+
235
+ ```python
236
+ BASE = "https://webexapis.com/v1"
237
+
238
+ # List call redirects across all clusters
239
+ params = {"orgId": org_id, "from": "2026-03-01T00:00:00Z", "to": "2026-03-28T00:00:00Z"}
240
+ resp = requests.get(f"{BASE}/videoMesh/callRedirects", headers=headers, params=params)
241
+ redirects = resp.json().get("items", [])
242
+
243
+ # Get client type distribution for a specific cluster
244
+ params["clusterId"] = cluster_id
245
+ resp = requests.get(f"{BASE}/videoMesh/clientTypeDistribution/clusters", headers=headers, params=params)
246
+ distribution = resp.json().get("items", [])
247
+ ```
248
+
249
+ ---
250
+
251
+ ## 6. Video Mesh: Test Results
252
+
253
+ Periodic and on-demand test results for network connectivity, reachability, and media health monitoring across clusters and nodes. Test results are available at three levels: org-wide, per-cluster, and per-node.
254
+
255
+ ### Commands
256
+
257
+ **Network Tests:**
258
+
259
+ | Command | CLI | HTTP Method | What It Does |
260
+ |---------|-----|------------|-------------|
261
+ | List network tests | `wxcli video-mesh list-network-test` | GET /videoMesh/testResults/networkTest | Network test results for all clusters |
262
+ | Cluster network tests | `wxcli video-mesh list-clusters-network-test` | GET /videoMesh/testResults/networkTest/clusters | Network test results for a cluster |
263
+ | Node network tests | `wxcli video-mesh list-nodes-network-test` | GET /videoMesh/testResults/networkTest/nodes | Network test results for a node |
264
+
265
+ **Reachability Tests (V2):**
266
+
267
+ | Command | CLI | HTTP Method | What It Does |
268
+ |---------|-----|------------|-------------|
269
+ | List reachability tests | `wxcli video-mesh list-reachability-test` | GET /videoMesh/testResults/reachabilityTest | Reachability results for all clusters |
270
+ | Cluster reachability tests | `wxcli video-mesh list-clusters-reachability-test` | GET /videoMesh/testResults/reachabilityTest/clusters | Reachability results for a cluster |
271
+ | Node reachability tests | `wxcli video-mesh list-nodes-reachability-test` | GET /videoMesh/testResults/reachabilityTest/nodes | Reachability results for a node |
272
+
273
+ **Media Health Monitor Tests (V2):**
274
+
275
+ | Command | CLI | HTTP Method | What It Does |
276
+ |---------|-----|------------|-------------|
277
+ | List media health tests | `wxcli video-mesh list-media-health-monitor-test` | GET /videoMesh/testResults/mediaHealthMonitorTest | Media health results for all clusters |
278
+ | Cluster media health tests | `wxcli video-mesh list-clusters-media-health-monitor-test` | GET /videoMesh/testResults/mediaHealthMonitorTest/clusters | Media health results for a cluster |
279
+ | Node media health tests | `wxcli video-mesh list-nodes-media-health-monitor-test` | GET /videoMesh/testResults/mediaHealthMonitorTest/nodes | Media health results for a node |
280
+
281
+ ### Key Parameters
282
+
283
+ #### Org-wide test commands
284
+
285
+ | Option | Description |
286
+ |--------|-------------|
287
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
288
+ | `--output table\|json` | Output format (default: table) |
289
+
290
+ #### Cluster-level test commands (additional)
291
+
292
+ | Option | Description |
293
+ |--------|-------------|
294
+ | `--cluster-id ID` | The unique Video Mesh Cluster ID |
295
+
296
+ #### Node-level test commands (additional)
297
+
298
+ | Option | Description |
299
+ |--------|-------------|
300
+ | `--node-id ID` | The unique Video Mesh Node ID |
301
+
302
+ ### Raw HTTP
303
+
304
+ ```python
305
+ BASE = "https://webexapis.com/v1"
306
+
307
+ # List network test results for the org
308
+ resp = requests.get(f"{BASE}/videoMesh/testResults/networkTest", headers=headers,
309
+ params={"orgId": org_id})
310
+ results = resp.json().get("items", [])
311
+
312
+ # Get reachability test results for a specific cluster
313
+ resp = requests.get(f"{BASE}/videoMesh/testResults/reachabilityTest/clusters", headers=headers,
314
+ params={"orgId": org_id, "clusterId": cluster_id})
315
+ reach_results = resp.json().get("items", [])
316
+
317
+ # Get media health test results for a specific node
318
+ resp = requests.get(f"{BASE}/videoMesh/testResults/mediaHealthMonitorTest/nodes", headers=headers,
319
+ params={"orgId": org_id, "nodeId": node_id})
320
+ health_results = resp.json().get("items", [])
321
+ ```
322
+
323
+ ### V2 Changes (Reachability and Media Health)
324
+
325
+ The V2 endpoints for reachability and media health monitoring include two improvements over V1:
326
+ 1. On-demand test results are returned alongside periodic test results.
327
+ 2. The destination IP address of the destination cluster is now included in the JSON response.
328
+
329
+ ---
330
+
331
+ ## 7. Video Mesh: On-Demand Tests
332
+
333
+ Trigger diagnostic tests on specific nodes or clusters and retrieve results. On-demand tests are asynchronous -- you trigger them, then poll for status and results.
334
+
335
+ ### Commands
336
+
337
+ | Command | CLI | HTTP Method | What It Does |
338
+ |---------|-----|------------|-------------|
339
+ | Trigger node test | `wxcli video-mesh create --node-id ID` | POST /videoMesh/triggerTest/nodes/{nodeId} | Trigger on-demand test for a node |
340
+ | Trigger cluster test | `wxcli video-mesh create-clusters --cluster-id ID` | POST /videoMesh/triggerTest/clusters/{clusterId} | Trigger on-demand test for a cluster |
341
+ | Get test results | `wxcli video-mesh list-test-results` | GET /videoMesh/testResults | Get triggered test results |
342
+ | Get test status | `wxcli video-mesh list-test-status` | GET /videoMesh/testStatus | Get triggered test status |
343
+
344
+ ### Key Parameters
345
+
346
+ #### `create` (trigger node test)
347
+
348
+ | Option | Required | Description |
349
+ |--------|:--------:|-------------|
350
+ | `--node-id ID` | Yes | Unique ID of the Video Mesh node to test |
351
+ | `--org-id ORG_ID` | No | Organization ID (auto-injected from config) |
352
+
353
+ #### `create-clusters` (trigger cluster test)
354
+
355
+ | Option | Required | Description |
356
+ |--------|:--------:|-------------|
357
+ | `--cluster-id ID` | Yes | Unique ID of the Video Mesh cluster to test |
358
+ | `--org-id ORG_ID` | No | Organization ID (auto-injected from config) |
359
+
360
+ #### `list-test-results` and `list-test-status`
361
+
362
+ | Option | Description |
363
+ |--------|-------------|
364
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
365
+ | `--output table\|json` | Output format (default: table) |
366
+
367
+ ### Workflow: Run an On-Demand Test
368
+
369
+ ```bash
370
+ # 1. Trigger an on-demand test for a node
371
+ wxcli video-mesh create --node-id NODE_ID
372
+
373
+ # 2. Poll test status until complete
374
+ wxcli video-mesh list-test-status --output json
375
+
376
+ # 3. Get the results once complete
377
+ wxcli video-mesh list-test-results --output json
378
+ ```
379
+
380
+ ### Raw HTTP
381
+
382
+ ```python
383
+ BASE = "https://webexapis.com/v1"
384
+
385
+ # Trigger on-demand test for a node
386
+ resp = requests.post(f"{BASE}/videoMesh/triggerTest/nodes/{node_id}", headers=headers,
387
+ params={"orgId": org_id})
388
+
389
+ # Trigger on-demand test for a cluster
390
+ resp = requests.post(f"{BASE}/videoMesh/triggerTest/clusters/{cluster_id}", headers=headers,
391
+ params={"orgId": org_id})
392
+
393
+ # Check test status
394
+ resp = requests.get(f"{BASE}/videoMesh/testStatus", headers=headers, params={"orgId": org_id})
395
+ status = resp.json()
396
+
397
+ # Get test results
398
+ resp = requests.get(f"{BASE}/videoMesh/testResults", headers=headers, params={"orgId": org_id})
399
+ results = resp.json()
400
+ ```
401
+
402
+ ---
403
+
404
+ ## 8. Video Mesh: Event Thresholds
405
+
406
+ Configure alerting thresholds for Video Mesh events. These thresholds determine when notifications are triggered for cluster and node health events.
407
+
408
+ ### Commands
409
+
410
+ | Command | CLI | HTTP Method | What It Does |
411
+ |---------|-----|------------|-------------|
412
+ | List thresholds | `wxcli video-mesh list-event-thresholds` | GET /videoMesh/eventThresholds | List all event threshold configurations |
413
+ | Show threshold | `wxcli video-mesh show-event-thresholds --event-threshold-id ID` | GET /videoMesh/eventThresholds/{eventThresholdId} | Get a specific threshold config |
414
+ | Update thresholds | `wxcli video-mesh update --json-body JSON` | PATCH /videoMesh/eventThresholds | Update threshold values (partial update) |
415
+ | Reset thresholds | `wxcli video-mesh create-reset` | POST /videoMesh/eventThresholds/reset | Reset all thresholds to defaults |
416
+
417
+ ### Key Parameters
418
+
419
+ #### `list-event-thresholds`
420
+
421
+ | Option | Description |
422
+ |--------|-------------|
423
+ | `--org-id ORG_ID` | Organization ID (auto-injected from config) |
424
+ | `--output table\|json` | Output format (default: table) |
425
+
426
+ #### `show-event-thresholds`
427
+
428
+ | Option | Required | Description |
429
+ |--------|:--------:|-------------|
430
+ | `--event-threshold-id ID` | Yes | The unique event threshold ID |
431
+ | `--org-id ORG_ID` | No | Organization ID (auto-injected from config) |
432
+
433
+ #### `update` (PATCH)
434
+
435
+ This command requires `--json-body` because the request body contains nested objects:
436
+
437
+ ```bash
438
+ wxcli video-mesh update --json-body '{
439
+ "eventThresholds": [
440
+ {
441
+ "eventThresholdId": "THRESHOLD_ID_1",
442
+ "thresholdConfig": {
443
+ "minThreshold": 80
444
+ }
445
+ }
446
+ ]
447
+ }'
448
+ ```
449
+
450
+ ### Raw HTTP
451
+
452
+ ```python
453
+ BASE = "https://webexapis.com/v1"
454
+
455
+ # List all event thresholds
456
+ resp = requests.get(f"{BASE}/videoMesh/eventThresholds", headers=headers, params={"orgId": org_id})
457
+ thresholds = resp.json()
458
+ # Response: {orgId, eventThresholds: [{entityId, eventScope, eventName, eventThresholdId, thresholdConfig: {minThreshold, defaultMinThreshold}}]}
459
+
460
+ # Update a threshold (PATCH - partial update)
461
+ body = {
462
+ "eventThresholds": [
463
+ {
464
+ "eventThresholdId": threshold_id,
465
+ "thresholdConfig": {"minThreshold": 80}
466
+ }
467
+ ]
468
+ }
469
+ resp = requests.patch(f"{BASE}/videoMesh/eventThresholds", headers=headers, json=body,
470
+ params={"orgId": org_id})
471
+ result = resp.json()
472
+ # Response includes failedEventThresholdIds array for any that failed to update
473
+
474
+ # Reset all thresholds to defaults
475
+ resp = requests.post(f"{BASE}/videoMesh/eventThresholds/reset", headers=headers,
476
+ params={"orgId": org_id})
477
+ ```
478
+
479
+ ### Threshold Response Fields
480
+
481
+ | Field | Description |
482
+ |-------|-------------|
483
+ | `eventThresholdId` | Unique identifier for the threshold |
484
+ | `entityId` | The entity (cluster/node) this threshold applies to |
485
+ | `eventScope` | Scope of the event (e.g., cluster-level, node-level) |
486
+ | `eventName` | Name of the monitored event |
487
+ | `thresholdConfig.minThreshold` | Current threshold value |
488
+ | `thresholdConfig.defaultMinThreshold` | Factory default threshold value |
489
+
490
+ ---
491
+
492
+ ## 9. Meeting Participants
493
+
494
+ **CLI group:** `meeting-participants`
495
+ **API base:** `https://webexapis.com/v1/meetingParticipants`
496
+
497
+ Manage participants during a live meeting or query historical participant data from ended meetings. This API supports listing who joined, admitting from the lobby, muting/unmuting, expelling, and calling out to SIP devices to add them to the meeting.
498
+
499
+ ### Commands
500
+
501
+ | Command | CLI | HTTP Method | What It Does |
502
+ |---------|-----|------------|-------------|
503
+ | List participants | `wxcli meeting-participants list --meeting-id ID` | GET /meetingParticipants | List participants for a meeting |
504
+ | Show participant | `wxcli meeting-participants show --participant-id ID` | GET /meetingParticipants/{participantId} | Get participant details |
505
+ | Update participant | `wxcli meeting-participants update --participant-id ID` | PUT /meetingParticipants/{participantId} | Mute, unmute, admit, or expel a participant |
506
+ | Query by email | `wxcli meeting-participants create --json-body JSON` | POST /meetingParticipants/query | Query participants by email addresses |
507
+ | Admit participants | `wxcli meeting-participants create-admit --json-body JSON` | POST /meetingParticipants/admit | Admit participants from the lobby |
508
+ | Call out SIP | `wxcli meeting-participants create-callout --json-body JSON` | POST /meetingParticipants/callout | Dial a SIP URI to add to meeting |
509
+ | Cancel callout | `wxcli meeting-participants create-cancel-callout --json-body JSON` | POST /meetingParticipants/cancelCallout | Cancel a pending SIP callout |
510
+
511
+ ### Key Parameters
512
+
513
+ #### `list`
514
+
515
+ | Option | Description |
516
+ |--------|-------------|
517
+ | `--meeting-id ID` | The unique meeting identifier. Personal room meeting IDs are not supported. |
518
+ | `--breakout-session-id ID` | Filter to participants who joined a specific breakout session (ended meetings only) |
519
+ | `--meeting-start-time-from DATETIME` | Filter meetings starting after this time (ISO 8601, exclusive). Default: 1 month before `meetingStartTimeTo`. |
520
+ | `--meeting-start-time-to DATETIME` | Filter meetings starting before this time (ISO 8601, exclusive) |
521
+ | `--host-email EMAIL` | Admin-only: specify a host's email to list their meeting's participants |
522
+ | `--join-time-from DATETIME` | Participants who joined after this time (ISO 8601, inclusive). Default: 7 days before `joinTimeTo`. |
523
+ | `--join-time-to DATETIME` | Participants who joined before this time (ISO 8601, exclusive). Interval between `joinTimeFrom` and `joinTimeTo` must be within 90 days. |
524
+ | `--max N` | Max participants per page, up to 100 |
525
+ | `--output table\|json` | Output format (default: table) |
526
+
527
+ #### `update` (PUT)
528
+
529
+ | Option | Description |
530
+ |--------|-------------|
531
+ | `--participant-id ID` | The participant to update (path parameter) |
532
+ | `--muted true\|false` | Mute or unmute the participant |
533
+ | `--admit true\|false` | Admit the participant from the lobby |
534
+ | `--expel true\|false` | Remove the participant from the meeting |
535
+
536
+ #### `create` (Query by Email -- POST)
537
+
538
+ This command uses `--json-body` because the request body contains an array of emails:
539
+
540
+ ```bash
541
+ wxcli meeting-participants create --meeting-id MEETING_ID --json-body '{
542
+ "emails": ["user1@example.com", "user2@example.com"],
543
+ "joinTimeFrom": "2026-03-01T00:00:00Z",
544
+ "joinTimeTo": "2026-03-28T00:00:00Z"
545
+ }'
546
+ ```
547
+
548
+ #### `create-admit` (Admit from Lobby -- POST)
549
+
550
+ Admits up to 100 participants at once. Each `participantId` must share the same meeting prefix as `meetingId`.
551
+
552
+ ```bash
553
+ wxcli meeting-participants create-admit --json-body '{
554
+ "items": [
555
+ {"participantId": "PARTICIPANT_ID_1"},
556
+ {"participantId": "PARTICIPANT_ID_2", "breakoutSessionId": "SESSION_ID"}
557
+ ]
558
+ }'
559
+ ```
560
+
561
+ #### `create-callout` (SIP Callout -- POST)
562
+
563
+ Dials a SIP address or phone number to add them to the meeting. Useful for bringing room devices into a meeting.
564
+
565
+ ```bash
566
+ wxcli meeting-participants create-callout --json-body '{
567
+ "meetingId": "MEETING_ID",
568
+ "address": "roomdevice@example.com",
569
+ "addressType": "sipAddress",
570
+ "displayName": "Conference Room A"
571
+ }'
572
+ ```
573
+
574
+ | Body Field | Description |
575
+ |------------|-------------|
576
+ | `meetingId` | The meeting to add the participant to |
577
+ | `meetingNumber` | Alternative: use meeting number instead of ID |
578
+ | `address` | SIP URI or phone number to dial |
579
+ | `addressType` | `sipAddress` (default) |
580
+ | `displayName` | Display name for the called participant |
581
+ | `invitationCorrelationId` | Optional correlation ID for tracking |
582
+
583
+ #### `create-cancel-callout` (Cancel Pending Callout -- POST)
584
+
585
+ ```bash
586
+ wxcli meeting-participants create-cancel-callout --json-body '{
587
+ "participantId": "PARTICIPANT_ID"
588
+ }'
589
+ ```
590
+
591
+ ### Participant Response Fields
592
+
593
+ | Field | Description |
594
+ |-------|-------------|
595
+ | `id` | Unique participant identifier |
596
+ | `meetingId` | Meeting the participant is in |
597
+ | `hostEmail` | Email of the meeting host |
598
+ | `displayName` | Participant display name |
599
+ | `email` | Participant email |
600
+ | `orgId` | Participant's organization ID |
601
+ | `state` | Current state: `lobby`, `joined`, `end` |
602
+ | `muted` | Whether participant is muted |
603
+ | `host` | Whether participant is the host |
604
+ | `coHost` | Whether participant is a co-host |
605
+ | `invitee` | Whether participant was an invitee |
606
+ | `video` | Video state: `on`, `off` |
607
+ | `devices` | Array of devices used: `{joinedTime, leftTime, deviceType, audioType, callType, phoneNumber, correlationId, durationSecond}` |
608
+
609
+ ### Raw HTTP
610
+
611
+ ```python
612
+ BASE = "https://webexapis.com/v1"
613
+
614
+ # List participants for a meeting
615
+ params = {"meetingId": meeting_id, "max": 50}
616
+ resp = requests.get(f"{BASE}/meetingParticipants", headers=headers, params=params)
617
+ participants = resp.json().get("items", [])
618
+
619
+ # Get a specific participant
620
+ resp = requests.get(f"{BASE}/meetingParticipants/{participant_id}", headers=headers)
621
+ participant = resp.json()
622
+
623
+ # Mute a participant
624
+ body = {"muted": True}
625
+ resp = requests.put(f"{BASE}/meetingParticipants/{participant_id}", headers=headers, json=body)
626
+
627
+ # Expel a participant
628
+ body = {"expel": True}
629
+ resp = requests.put(f"{BASE}/meetingParticipants/{participant_id}", headers=headers, json=body)
630
+
631
+ # Admit participants from lobby
632
+ body = {"items": [{"participantId": p_id} for p_id in participant_ids]}
633
+ resp = requests.post(f"{BASE}/meetingParticipants/admit", headers=headers, json=body)
634
+ # Returns 204 No Content on success
635
+
636
+ # Call out to a SIP device
637
+ body = {
638
+ "meetingId": meeting_id,
639
+ "address": "roomdevice@example.com",
640
+ "addressType": "sipAddress",
641
+ "displayName": "Conference Room A"
642
+ }
643
+ resp = requests.post(f"{BASE}/meetingParticipants/callout", headers=headers, json=body)
644
+ # Response: {participantId, address, addressType, state: "pending", meetingId, ...}
645
+
646
+ # Cancel a pending callout
647
+ body = {"participantId": participant_id}
648
+ resp = requests.post(f"{BASE}/meetingParticipants/cancelCallout", headers=headers, json=body)
649
+ # Returns 204 No Content on success
650
+ ```
651
+
652
+ ---
653
+
654
+ ## 10. Meeting Invitees
655
+
656
+ **CLI group:** `meeting-invitees`
657
+ **API base:** `https://webexapis.com/v1/meetingInvitees`
658
+
659
+ Manage who is invited to a meeting before it starts. Invitees are the pre-meeting invitation list -- distinct from participants, who are the people who actually join the meeting. Invitees can be regular attendees, co-hosts, or panelists (for webinars).
660
+
661
+ ### Commands
662
+
663
+ | Command | CLI | HTTP Method | What It Does |
664
+ |---------|-----|------------|-------------|
665
+ | List invitees | `wxcli meeting-invitees list --meeting-id ID` | GET /meetingInvitees | List invitees for a meeting |
666
+ | Create invitee | `wxcli meeting-invitees create --meeting-id ID --email user@example.com` | POST /meetingInvitees | Invite a person to a meeting |
667
+ | Bulk insert | `wxcli meeting-invitees create-bulk-insert --json-body JSON` | POST /meetingInvitees/bulkInsert | Invite multiple people at once |
668
+ | Show invitee | `wxcli meeting-invitees show --meeting-invitee-id ID` | GET /meetingInvitees/{meetingInviteeId} | Get invitee details |
669
+ | Update invitee | `wxcli meeting-invitees update --meeting-invitee-id ID` | PUT /meetingInvitees/{meetingInviteeId} | Update invitee role (co-host, panelist) |
670
+ | Delete invitee | `wxcli meeting-invitees delete --meeting-invitee-id ID --force` | DELETE /meetingInvitees/{meetingInviteeId} | Remove an invitee |
671
+
672
+ ### Key Parameters
673
+
674
+ #### `list`
675
+
676
+ | Option | Description |
677
+ |--------|-------------|
678
+ | `--meeting-id ID` | The meeting to list invitees for. Supports meeting series, scheduled meetings, and ended/ongoing instances. Personal room meeting IDs are not supported. |
679
+ | `--host-email EMAIL` | Admin-only: specify a host's email to list their meeting's invitees |
680
+ | `--panelist true\|false\|null` | Webinar filter: `true` = panelists only, `false` = attendees only, `null` (default) = both |
681
+ | `--max N` | Max invitees per page, up to 100 |
682
+ | `--output table\|json` | Output format (default: table) |
683
+
684
+ #### `create`
685
+
686
+ | Option | Required | Description |
687
+ |--------|:--------:|-------------|
688
+ | `--meeting-id ID` | Yes | The meeting to invite the person to |
689
+ | `--email EMAIL` | Yes | Email address of the invitee |
690
+ | `--display-name TEXT` | No | Display name for the invitee |
691
+ | `--co-host true\|false` | No | Grant co-host role |
692
+ | `--panelist true\|false` | No | Set as panelist (webinars only) |
693
+ | `--send-email true\|false` | No | Send invitation email (default: `true`) |
694
+ | `--host-email EMAIL` | No | Admin-only: specify host email |
695
+
696
+ #### `create-bulk-insert`
697
+
698
+ Requires `--json-body` because the request body contains an array of invitees:
699
+
700
+ ```bash
701
+ wxcli meeting-invitees create-bulk-insert --json-body '{
702
+ "meetingId": "MEETING_ID",
703
+ "hostEmail": "host@example.com",
704
+ "items": [
705
+ {"email": "user1@example.com", "displayName": "User One", "coHost": false},
706
+ {"email": "user2@example.com", "displayName": "User Two", "coHost": true, "sendEmail": false},
707
+ {"email": "panelist@example.com", "panelist": true}
708
+ ]
709
+ }'
710
+ ```
711
+
712
+ #### `update`
713
+
714
+ | Option | Description |
715
+ |--------|-------------|
716
+ | `--meeting-invitee-id ID` | The invitee to update (path parameter) |
717
+ | `--email EMAIL` | Updated email address |
718
+ | `--display-name TEXT` | Updated display name |
719
+ | `--co-host true\|false` | Grant or revoke co-host role |
720
+ | `--panelist true\|false` | Set or remove panelist role (webinars) |
721
+ | `--send-email true\|false` | Send update notification email |
722
+ | `--host-email EMAIL` | Admin-only: specify host email |
723
+
724
+ ### Invitee Response Fields
725
+
726
+ | Field | Description |
727
+ |-------|-------------|
728
+ | `id` | Unique invitee identifier |
729
+ | `meetingId` | Meeting the invitee is associated with |
730
+ | `email` | Invitee email address |
731
+ | `displayName` | Invitee display name |
732
+ | `coHost` | Whether invitee is a co-host |
733
+ | `panelist` | Whether invitee is a panelist (webinars) |
734
+
735
+ ### Raw HTTP
736
+
737
+ ```python
738
+ BASE = "https://webexapis.com/v1"
739
+
740
+ # List invitees for a meeting
741
+ params = {"meetingId": meeting_id, "max": 100}
742
+ resp = requests.get(f"{BASE}/meetingInvitees", headers=headers, params=params)
743
+ invitees = resp.json().get("items", [])
744
+ # Each item: {id, meetingId, email, displayName, coHost, panelist}
745
+
746
+ # Invite a person
747
+ body = {
748
+ "meetingId": meeting_id,
749
+ "email": "user@example.com",
750
+ "displayName": "Jane Doe",
751
+ "coHost": False,
752
+ "sendEmail": True
753
+ }
754
+ resp = requests.post(f"{BASE}/meetingInvitees", headers=headers, json=body)
755
+ invitee_id = resp.json().get("id")
756
+
757
+ # Bulk invite multiple people
758
+ body = {
759
+ "meetingId": meeting_id,
760
+ "items": [
761
+ {"email": "user1@example.com", "displayName": "User One"},
762
+ {"email": "user2@example.com", "coHost": True, "sendEmail": False}
763
+ ]
764
+ }
765
+ resp = requests.post(f"{BASE}/meetingInvitees/bulkInsert", headers=headers, json=body)
766
+ created = resp.json().get("items", [])
767
+
768
+ # Update invitee to co-host
769
+ body = {"email": "user@example.com", "coHost": True, "sendEmail": False}
770
+ resp = requests.put(f"{BASE}/meetingInvitees/{invitee_id}", headers=headers, json=body)
771
+
772
+ # Delete invitee
773
+ resp = requests.delete(f"{BASE}/meetingInvitees/{invitee_id}", headers=headers)
774
+ ```
775
+
776
+ ---
777
+
778
+ ## 11. Raw HTTP Endpoints
779
+
780
+ All 43 endpoints across the 3 CLI groups documented in this reference.
781
+
782
+ ### Video Mesh (30 endpoints)
783
+
784
+ | Endpoint | Method | CLI Command | Category |
785
+ |----------|--------|------------|----------|
786
+ | `/videoMesh/clusters` | GET | `video-mesh list-clusters-video-mesh` | Clusters |
787
+ | `/videoMesh/clusters/{clusterId}` | GET | `video-mesh show` | Clusters |
788
+ | `/videoMesh/clusters/availability` | GET | `video-mesh list-availability-clusters` | Availability |
789
+ | `/videoMesh/clusters/availability/{clusterId}` | GET | `video-mesh show-availability-clusters` | Availability |
790
+ | `/videoMesh/nodes/availability` | GET | `video-mesh list-availability-nodes` | Availability |
791
+ | `/videoMesh/nodes/availability/{nodeId}` | GET | `video-mesh show-availability-nodes` | Availability |
792
+ | `/videoMesh/utilization` | GET | `video-mesh list-utilization-video-mesh` | Utilization |
793
+ | `/videoMesh/clusters/utilization` | GET | `video-mesh list-utilization-clusters` | Utilization |
794
+ | `/videoMesh/cloudOverflow` | GET | `video-mesh list-cloud-overflow` | Overflow |
795
+ | `/videoMesh/callRedirects` | GET | `video-mesh list-call-redirects-video-mesh` | Redirects |
796
+ | `/videoMesh/clusters/callRedirects` | GET | `video-mesh list-call-redirects-clusters` | Redirects |
797
+ | `/videoMesh/clientTypeDistribution` | GET | `video-mesh list` | Client Distribution |
798
+ | `/videoMesh/clientTypeDistribution/clusters` | GET | `video-mesh list-clusters-client-type-distribution` | Client Distribution |
799
+ | `/videoMesh/testResults/networkTest` | GET | `video-mesh list-network-test` | Test Results |
800
+ | `/videoMesh/testResults/networkTest/clusters` | GET | `video-mesh list-clusters-network-test` | Test Results |
801
+ | `/videoMesh/testResults/networkTest/nodes` | GET | `video-mesh list-nodes-network-test` | Test Results |
802
+ | `/videoMesh/testResults/reachabilityTest` | GET | `video-mesh list-reachability-test` | Test Results |
803
+ | `/videoMesh/testResults/reachabilityTest/clusters` | GET | `video-mesh list-clusters-reachability-test` | Test Results |
804
+ | `/videoMesh/testResults/reachabilityTest/nodes` | GET | `video-mesh list-nodes-reachability-test` | Test Results |
805
+ | `/videoMesh/testResults/mediaHealthMonitorTest` | GET | `video-mesh list-media-health-monitor-test` | Test Results |
806
+ | `/videoMesh/testResults/mediaHealthMonitorTest/clusters` | GET | `video-mesh list-clusters-media-health-monitor-test` | Test Results |
807
+ | `/videoMesh/testResults/mediaHealthMonitorTest/nodes` | GET | `video-mesh list-nodes-media-health-monitor-test` | Test Results |
808
+ | `/videoMesh/triggerTest/nodes/{nodeId}` | POST | `video-mesh create` | On-Demand Tests |
809
+ | `/videoMesh/triggerTest/clusters/{clusterId}` | POST | `video-mesh create-clusters` | On-Demand Tests |
810
+ | `/videoMesh/testResults` | GET | `video-mesh list-test-results` | On-Demand Tests |
811
+ | `/videoMesh/testStatus` | GET | `video-mesh list-test-status` | On-Demand Tests |
812
+ | `/videoMesh/eventThresholds` | GET | `video-mesh list-event-thresholds` | Event Thresholds |
813
+ | `/videoMesh/eventThresholds/{eventThresholdId}` | GET | `video-mesh show-event-thresholds` | Event Thresholds |
814
+ | `/videoMesh/eventThresholds` | PATCH | `video-mesh update` | Event Thresholds |
815
+ | `/videoMesh/eventThresholds/reset` | POST | `video-mesh create-reset` | Event Thresholds |
816
+
817
+ ### Meeting Participants (7 endpoints)
818
+
819
+ | Endpoint | Method | CLI Command |
820
+ |----------|--------|------------|
821
+ | `/meetingParticipants` | GET | `meeting-participants list` |
822
+ | `/meetingParticipants/{participantId}` | GET | `meeting-participants show` |
823
+ | `/meetingParticipants/{participantId}` | PUT | `meeting-participants update` |
824
+ | `/meetingParticipants/query` | POST | `meeting-participants create` |
825
+ | `/meetingParticipants/admit` | POST | `meeting-participants create-admit` |
826
+ | `/meetingParticipants/callout` | POST | `meeting-participants create-callout` |
827
+ | `/meetingParticipants/cancelCallout` | POST | `meeting-participants create-cancel-callout` |
828
+
829
+ ### Meeting Invitees (6 endpoints)
830
+
831
+ | Endpoint | Method | CLI Command |
832
+ |----------|--------|------------|
833
+ | `/meetingInvitees` | GET | `meeting-invitees list` |
834
+ | `/meetingInvitees` | POST | `meeting-invitees create` |
835
+ | `/meetingInvitees/bulkInsert` | POST | `meeting-invitees create-bulk-insert` |
836
+ | `/meetingInvitees/{meetingInviteeId}` | GET | `meeting-invitees show` |
837
+ | `/meetingInvitees/{meetingInviteeId}` | PUT | `meeting-invitees update` |
838
+ | `/meetingInvitees/{meetingInviteeId}` | DELETE | `meeting-invitees delete` |
839
+
840
+ ---
841
+
842
+ ## 12. Gotchas
843
+
844
+ ### Video Mesh
845
+
846
+ 1. **Video Mesh API is read-only for infrastructure.** You cannot create, register, or decommission clusters or nodes via the API. All provisioning is done through the Webex Control Hub UI. The API provides monitoring, analytics, and event threshold configuration only.
847
+
848
+ 2. **All Video Mesh endpoints require an admin token with `spark-admin:video_mesh_read` scope.** User tokens and bot tokens will get 403 Forbidden.
849
+
850
+ 3. **Time-range parameters (`from`, `to`) are required for most analytics endpoints.** Utilization, overflow, call redirects, and client distribution endpoints all require `from` and `to` in ISO 8601 format. Omitting them will result in an error or unexpected empty results.
851
+
852
+ 4. **Event threshold `update` uses PATCH, not PUT.** This means partial update semantics -- you only need to send the thresholds you want to change. The response includes a `failedEventThresholdIds` array listing any threshold IDs that failed to update.
853
+
854
+ 5. **`create-reset` resets all thresholds to factory defaults with no undo.** The only way to restore custom thresholds after a reset is to manually re-apply them via `update`.
855
+
856
+ 6. **On-demand tests are asynchronous.** After triggering a test via `create` or `create-clusters`, you must poll `list-test-status` to check completion, then retrieve results via `list-test-results`. Tests may take several minutes to complete.
857
+
858
+ 7. **The `list` command maps to client type distribution, not a general resource list.** `wxcli video-mesh list` returns client type distribution details (GET /videoMesh/clientTypeDistribution), which may be surprising. Use `list-clusters-video-mesh` to list clusters.
859
+
860
+ ### Meeting Participants
861
+
862
+ 8. **The `create` command is actually "Query by Email" (POST to /meetingParticipants/query).** Despite the CLI name suggesting creation, this command searches for participants by email address. The CLI name follows the generator's convention of mapping POST to `create`.
863
+
864
+ 9. **`update` can mute, unmute, admit, or expel a participant during a live meeting.** Set `muted: true/false` to mute/unmute, `admit: true` to admit from lobby, or `expel: true` to remove. Only one action should be performed per call.
865
+
866
+ 10. **`create-callout` dials a SIP URI to add a device to the meeting.** This is useful for bridging room devices (Webex Room Kit, SIP-registered phones) into a Webex meeting. The callout is asynchronous -- the response returns `state: "pending"` initially.
867
+
868
+ 11. **`create-cancel-callout` cancels a pending SIP callout before the device answers.** Once the device has answered and joined the meeting, use `update` with `expel: true` instead.
869
+
870
+ 12. **`create-admit` has a 100-item limit per request.** Each `participantId` in the `items` array must share the same meeting prefix as the `meetingId`.
871
+
872
+ 13. **Personal room meeting IDs are not supported for the participant list endpoint.** Attempting to use a personal room meeting ID will return an error.
873
+
874
+ 14. **The `joinTimeFrom`/`joinTimeTo` interval must be within 90 days.** Exceeding this range will result in a 400 error.
875
+
876
+ ### Meeting Invitees
877
+
878
+ 15. **Invitees are pre-meeting; participants are in-meeting.** These are separate API surfaces. Invitees represent who was invited (before the meeting). Participants represent who actually joined (during/after the meeting).
879
+
880
+ 16. **`sendEmail` defaults to `true`.** When creating an invitee, the invitation email is sent automatically unless you explicitly set `sendEmail: false`. This is important for bulk operations where you may not want to send hundreds of emails.
881
+
882
+ 17. **`create-bulk-insert` accepts multiple invitees at once** via the `items` array in the JSON body. Each item can have independent `coHost`, `panelist`, and `sendEmail` settings.
883
+
884
+ 18. **The `panelist` filter on `list` is for webinars only.** For regular meetings, this parameter has no effect. Set to `true` for panelists, `false` for attendees, or omit for both.
885
+
886
+ 19. **Invitee `update` uses PUT (full replacement), not PATCH.** You must include all fields you want to keep, not just the ones you are changing.
887
+
888
+ 20. **Duplicate invitee creation returns 409 Conflict.** If the email address is already invited to the meeting, the API returns a 409 error rather than silently updating.
889
+
890
+ ---
891
+
892
+ ## 13. See Also
893
+
894
+ - [`meetings-core.md`](meetings-core.md) — Meeting CRUD, templates, controls, registrants, interpreters, breakouts, surveys
895
+ - [`meetings-content.md`](meetings-content.md) — Transcripts, captions, chats, summaries, meeting messages
896
+ - [`meetings-settings.md`](meetings-settings.md) — Preferences, session types, tracking codes, site settings, polls, Q&A, reports
897
+ - [`admin-hybrid.md`](admin-hybrid.md) -- Hybrid clusters and connectors (Video Mesh nodes are hybrid infrastructure)
898
+ - [`reporting-analytics.md`](reporting-analytics.md) -- Meeting quality analytics and CDR reporting
899
+ - [`authentication.md`](authentication.md) -- Token types, scopes, OAuth flows