wxcli 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wxcli/__init__.py +4 -0
- wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
- wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
- wxcli/_playbook/.claude/rules/cleanup.md +29 -0
- wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
- wxcli/_playbook/.claude/rules/org-health.md +14 -0
- wxcli/_playbook/.claude/settings.json +8 -0
- wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
- wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
- wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
- wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
- wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
- wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
- wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
- wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
- wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
- wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
- wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
- wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
- wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
- wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
- wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
- wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
- wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
- wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
- wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
- wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
- wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
- wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
- wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
- wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
- wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
- wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
- wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
- wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
- wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
- wxcli/_playbook/CLAUDE.md +373 -0
- wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
- wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
- wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
- wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
- wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
- wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
- wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
- wxcli/_playbook/docs/reference/admin-partner.md +357 -0
- wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
- wxcli/_playbook/docs/reference/authentication.md +965 -0
- wxcli/_playbook/docs/reference/call-control.md +1205 -0
- wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
- wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
- wxcli/_playbook/docs/reference/call-routing.md +2304 -0
- wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
- wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
- wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
- wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
- wxcli/_playbook/docs/reference/devices-core.md +1869 -0
- wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
- wxcli/_playbook/docs/reference/devices-platform.md +467 -0
- wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
- wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
- wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
- wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
- wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
- wxcli/_playbook/docs/reference/meetings-content.md +473 -0
- wxcli/_playbook/docs/reference/meetings-core.md +903 -0
- wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
- wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
- wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
- wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
- wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
- wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
- wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
- wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
- wxcli/_playbook/docs/reference/provisioning.md +1366 -0
- wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
- wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
- wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
- wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
- wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
- wxcli/_version.py +24 -0
- wxcli/auth.py +137 -0
- wxcli/commands/__init__.py +0 -0
- wxcli/commands/_registry.py +181 -0
- wxcli/commands/activation_email.py +103 -0
- wxcli/commands/admin_recordings.py +585 -0
- wxcli/commands/analytics.py +105 -0
- wxcli/commands/announcement_playlists.py +219 -0
- wxcli/commands/announcements.py +519 -0
- wxcli/commands/archive_users.py +36 -0
- wxcli/commands/attachment_actions.py +60 -0
- wxcli/commands/audit_events.py +83 -0
- wxcli/commands/authorizations.py +113 -0
- wxcli/commands/auto_attendant.py +642 -0
- wxcli/commands/broadworks_billing_reports.py +126 -0
- wxcli/commands/broadworks_enterprises.py +160 -0
- wxcli/commands/broadworks_subscribers.py +319 -0
- wxcli/commands/broadworks_workspaces.py +108 -0
- wxcli/commands/call_controls.py +1304 -0
- wxcli/commands/call_park.py +494 -0
- wxcli/commands/call_pickup.py +229 -0
- wxcli/commands/call_queue.py +1878 -0
- wxcli/commands/call_recording.py +707 -0
- wxcli/commands/call_routing.py +1610 -0
- wxcli/commands/call_settings_for_me_phase_5.py +212 -0
- wxcli/commands/caller_reputation.py +169 -0
- wxcli/commands/calling_service.py +305 -0
- wxcli/commands/cc_address_book.py +770 -0
- wxcli/commands/cc_agent_greetings.py +242 -0
- wxcli/commands/cc_agent_summaries.py +39 -0
- wxcli/commands/cc_agent_wellbeing.py +216 -0
- wxcli/commands/cc_agents.py +425 -0
- wxcli/commands/cc_ai_assistant.py +55 -0
- wxcli/commands/cc_ai_feature.py +294 -0
- wxcli/commands/cc_audio_files.py +149 -0
- wxcli/commands/cc_auto_csat.py +311 -0
- wxcli/commands/cc_aux_code.py +458 -0
- wxcli/commands/cc_business_hour.py +353 -0
- wxcli/commands/cc_call_monitoring.py +228 -0
- wxcli/commands/cc_callbacks.py +194 -0
- wxcli/commands/cc_campaign.py +212 -0
- wxcli/commands/cc_captures.py +39 -0
- wxcli/commands/cc_contact_list.py +169 -0
- wxcli/commands/cc_contact_number.py +295 -0
- wxcli/commands/cc_data_sources.py +235 -0
- wxcli/commands/cc_desktop_layout.py +380 -0
- wxcli/commands/cc_desktop_profile.py +322 -0
- wxcli/commands/cc_dial_number.py +511 -0
- wxcli/commands/cc_dial_plan.py +347 -0
- wxcli/commands/cc_dnc.py +101 -0
- wxcli/commands/cc_entry_point.py +545 -0
- wxcli/commands/cc_ewt.py +51 -0
- wxcli/commands/cc_flow.py +477 -0
- wxcli/commands/cc_global_vars.py +430 -0
- wxcli/commands/cc_holiday_list.py +335 -0
- wxcli/commands/cc_journey.py +1261 -0
- wxcli/commands/cc_legacy_flows.py +49 -0
- wxcli/commands/cc_multimedia_profile.py +436 -0
- wxcli/commands/cc_notification.py +51 -0
- wxcli/commands/cc_outdial_ani.py +604 -0
- wxcli/commands/cc_overrides.py +341 -0
- wxcli/commands/cc_queue.py +1083 -0
- wxcli/commands/cc_queue_stats.py +55 -0
- wxcli/commands/cc_realtime.py +51 -0
- wxcli/commands/cc_resource_collection.py +312 -0
- wxcli/commands/cc_search.py +46 -0
- wxcli/commands/cc_site.py +400 -0
- wxcli/commands/cc_skill.py +350 -0
- wxcli/commands/cc_skill_profile.py +289 -0
- wxcli/commands/cc_subscriptions.py +426 -0
- wxcli/commands/cc_summaries.py +130 -0
- wxcli/commands/cc_tasks.py +844 -0
- wxcli/commands/cc_team.py +325 -0
- wxcli/commands/cc_user_profiles.py +349 -0
- wxcli/commands/cc_users.py +701 -0
- wxcli/commands/cc_work_types.py +363 -0
- wxcli/commands/cdr.py +89 -0
- wxcli/commands/classifications.py +38 -0
- wxcli/commands/cleanup.py +1427 -0
- wxcli/commands/client_settings.py +72 -0
- wxcli/commands/conference.py +328 -0
- wxcli/commands/configure.py +72 -0
- wxcli/commands/converged_recordings.py +347 -0
- wxcli/commands/converged_recordings_export.py +310 -0
- wxcli/commands/cq_playlists.py +42 -0
- wxcli/commands/cucm.py +2794 -0
- wxcli/commands/cucm_config.py +129 -0
- wxcli/commands/customer_assist.py +373 -0
- wxcli/commands/data_sources.py +227 -0
- wxcli/commands/dect_devices.py +787 -0
- wxcli/commands/device_configurations.py +77 -0
- wxcli/commands/device_dynamic_settings.py +320 -0
- wxcli/commands/device_settings.py +1489 -0
- wxcli/commands/devices.py +280 -0
- wxcli/commands/domains.py +142 -0
- wxcli/commands/ecm.py +178 -0
- wxcli/commands/emergency_services.py +827 -0
- wxcli/commands/events.py +83 -0
- wxcli/commands/external_voicemail.py +52 -0
- wxcli/commands/groups.py +206 -0
- wxcli/commands/guest_management.py +76 -0
- wxcli/commands/hds.py +340 -0
- wxcli/commands/hot_desk.py +67 -0
- wxcli/commands/hot_desking_members.py +118 -0
- wxcli/commands/hot_desking_portal.py +124 -0
- wxcli/commands/hunt_group.py +577 -0
- wxcli/commands/hybrid_clusters.py +71 -0
- wxcli/commands/hybrid_connectors.py +67 -0
- wxcli/commands/identity_org.py +159 -0
- wxcli/commands/init_playbook.py +155 -0
- wxcli/commands/licenses.py +106 -0
- wxcli/commands/live_monitoring.py +40 -0
- wxcli/commands/location_call_handling.py +577 -0
- wxcli/commands/location_schedules.py +341 -0
- wxcli/commands/location_settings.py +1297 -0
- wxcli/commands/location_voicemail.py +494 -0
- wxcli/commands/locations.py +336 -0
- wxcli/commands/meeting_captions.py +110 -0
- wxcli/commands/meeting_chats.py +63 -0
- wxcli/commands/meeting_invitees.py +234 -0
- wxcli/commands/meeting_messages.py +28 -0
- wxcli/commands/meeting_participants.py +278 -0
- wxcli/commands/meeting_polls.py +111 -0
- wxcli/commands/meeting_preferences.py +515 -0
- wxcli/commands/meeting_qa.py +78 -0
- wxcli/commands/meeting_qualities.py +43 -0
- wxcli/commands/meeting_reports.py +101 -0
- wxcli/commands/meeting_session_types.py +105 -0
- wxcli/commands/meeting_site.py +57 -0
- wxcli/commands/meeting_slido.py +44 -0
- wxcli/commands/meeting_summaries.py +92 -0
- wxcli/commands/meeting_tracking_codes.py +233 -0
- wxcli/commands/meeting_transcripts.py +230 -0
- wxcli/commands/meetings.py +1997 -0
- wxcli/commands/memberships.py +164 -0
- wxcli/commands/messages.py +213 -0
- wxcli/commands/mode_management.py +244 -0
- wxcli/commands/my_call_settings.py +3577 -0
- wxcli/commands/numbers.py +405 -0
- wxcli/commands/operating_modes.py +410 -0
- wxcli/commands/org_contacts.py +284 -0
- wxcli/commands/org_health_cli.py +55 -0
- wxcli/commands/org_settings.py +71 -0
- wxcli/commands/organizations.py +83 -0
- wxcli/commands/paging_group.py +257 -0
- wxcli/commands/partner_admins.py +141 -0
- wxcli/commands/partner_reports.py +188 -0
- wxcli/commands/partner_tags.py +216 -0
- wxcli/commands/people.py +279 -0
- wxcli/commands/person_call_settings.py +71 -0
- wxcli/commands/pstn.py +280 -0
- wxcli/commands/recording_report.py +154 -0
- wxcli/commands/report_templates.py +38 -0
- wxcli/commands/reports.py +144 -0
- wxcli/commands/resource_group_memberships.py +160 -0
- wxcli/commands/resource_groups.py +67 -0
- wxcli/commands/roles.py +63 -0
- wxcli/commands/room_tabs.py +160 -0
- wxcli/commands/rooms.py +225 -0
- wxcli/commands/scim_bulk.py +46 -0
- wxcli/commands/scim_groups.py +246 -0
- wxcli/commands/scim_schemas.py +82 -0
- wxcli/commands/scim_users.py +283 -0
- wxcli/commands/security_audit.py +54 -0
- wxcli/commands/service_apps.py +51 -0
- wxcli/commands/single_number_reach.py +209 -0
- wxcli/commands/team_memberships.py +155 -0
- wxcli/commands/teams.py +153 -0
- wxcli/commands/ucm_profile.py +42 -0
- wxcli/commands/update.py +219 -0
- wxcli/commands/user_settings.py +5116 -0
- wxcli/commands/video_mesh.py +1090 -0
- wxcli/commands/virtual_extensions.py +502 -0
- wxcli/commands/virtual_line_settings.py +2072 -0
- wxcli/commands/webhooks.py +176 -0
- wxcli/commands/wholesale_billing_reports.py +147 -0
- wxcli/commands/wholesale_provisioning.py +523 -0
- wxcli/commands/workspace_locations.py +339 -0
- wxcli/commands/workspace_metrics.py +103 -0
- wxcli/commands/workspace_personalization.py +70 -0
- wxcli/commands/workspace_settings.py +3347 -0
- wxcli/commands/workspaces.py +279 -0
- wxcli/commands/xapi.py +114 -0
- wxcli/config.py +139 -0
- wxcli/errors.py +77 -0
- wxcli/main.py +210 -0
- wxcli/migration/CLAUDE.md +106 -0
- wxcli/migration/__init__.py +1 -0
- wxcli/migration/advisory/CLAUDE.md +196 -0
- wxcli/migration/advisory/__init__.py +46 -0
- wxcli/migration/advisory/advisor.py +107 -0
- wxcli/migration/advisory/advisory_patterns.py +2552 -0
- wxcli/migration/advisory/recommendation_rules.py +835 -0
- wxcli/migration/cucm/CLAUDE.md +74 -0
- wxcli/migration/cucm/__init__.py +5 -0
- wxcli/migration/cucm/connection.py +265 -0
- wxcli/migration/cucm/discovery.py +225 -0
- wxcli/migration/cucm/extractors/__init__.py +1 -0
- wxcli/migration/cucm/extractors/announcements.py +92 -0
- wxcli/migration/cucm/extractors/base.py +90 -0
- wxcli/migration/cucm/extractors/device_profiles.py +98 -0
- wxcli/migration/cucm/extractors/devices.py +193 -0
- wxcli/migration/cucm/extractors/e911.py +103 -0
- wxcli/migration/cucm/extractors/features.py +309 -0
- wxcli/migration/cucm/extractors/helpers.py +73 -0
- wxcli/migration/cucm/extractors/informational.py +295 -0
- wxcli/migration/cucm/extractors/locations.py +221 -0
- wxcli/migration/cucm/extractors/moh.py +100 -0
- wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
- wxcli/migration/cucm/extractors/routing.py +493 -0
- wxcli/migration/cucm/extractors/shared_lines.py +146 -0
- wxcli/migration/cucm/extractors/templates.py +229 -0
- wxcli/migration/cucm/extractors/tier4.py +173 -0
- wxcli/migration/cucm/extractors/users.py +240 -0
- wxcli/migration/cucm/extractors/voicemail.py +243 -0
- wxcli/migration/cucm/extractors/workspaces.py +88 -0
- wxcli/migration/cucm/unity_connection.py +304 -0
- wxcli/migration/execute/CLAUDE.md +372 -0
- wxcli/migration/execute/__init__.py +303 -0
- wxcli/migration/execute/batch.py +277 -0
- wxcli/migration/execute/dependency.py +483 -0
- wxcli/migration/execute/engine.py +964 -0
- wxcli/migration/execute/handlers.py +2232 -0
- wxcli/migration/execute/planner.py +1939 -0
- wxcli/migration/execute/runtime.py +571 -0
- wxcli/migration/export/CLAUDE.md +49 -0
- wxcli/migration/export/__init__.py +8 -0
- wxcli/migration/export/csv_export.py +126 -0
- wxcli/migration/export/deployment_plan.py +479 -0
- wxcli/migration/export/json_export.py +60 -0
- wxcli/migration/models.py +941 -0
- wxcli/migration/phone_models.py +50 -0
- wxcli/migration/preflight/CLAUDE.md +52 -0
- wxcli/migration/preflight/__init__.py +89 -0
- wxcli/migration/preflight/checks.py +911 -0
- wxcli/migration/preflight/runner.py +293 -0
- wxcli/migration/rate_limiter.py +144 -0
- wxcli/migration/report/CLAUDE.md +245 -0
- wxcli/migration/report/__init__.py +7 -0
- wxcli/migration/report/appendix.py +2437 -0
- wxcli/migration/report/assembler.py +183 -0
- wxcli/migration/report/charts.py +263 -0
- wxcli/migration/report/executive.py +776 -0
- wxcli/migration/report/explainer.py +704 -0
- wxcli/migration/report/helpers.py +74 -0
- wxcli/migration/report/ingest.py +152 -0
- wxcli/migration/report/notice_templates.py +192 -0
- wxcli/migration/report/score.py +375 -0
- wxcli/migration/report/styles.py +1052 -0
- wxcli/migration/report/user_diff.py +1052 -0
- wxcli/migration/report/user_notice.py +425 -0
- wxcli/migration/state.py +139 -0
- wxcli/migration/store.py +860 -0
- wxcli/migration/transform/CLAUDE.md +107 -0
- wxcli/migration/transform/__init__.py +12 -0
- wxcli/migration/transform/analysis_pipeline.py +453 -0
- wxcli/migration/transform/analyzers/__init__.py +142 -0
- wxcli/migration/transform/analyzers/css_permission.py +189 -0
- wxcli/migration/transform/analyzers/css_routing.py +335 -0
- wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
- wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
- wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
- wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
- wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
- wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
- wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
- wxcli/migration/transform/analyzers/missing_data.py +300 -0
- wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
- wxcli/migration/transform/analyzers/shared_line.py +170 -0
- wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
- wxcli/migration/transform/analyzers/workspace_license.py +212 -0
- wxcli/migration/transform/cross_reference.py +1136 -0
- wxcli/migration/transform/cucm_pattern.py +246 -0
- wxcli/migration/transform/decisions.py +301 -0
- wxcli/migration/transform/e164.py +145 -0
- wxcli/migration/transform/engine.py +256 -0
- wxcli/migration/transform/mappers/CLAUDE.md +123 -0
- wxcli/migration/transform/mappers/__init__.py +76 -0
- wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
- wxcli/migration/transform/mappers/base.py +190 -0
- wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
- wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
- wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
- wxcli/migration/transform/mappers/css_mapper.py +868 -0
- wxcli/migration/transform/mappers/dect_mapper.py +367 -0
- wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
- wxcli/migration/transform/mappers/device_mapper.py +227 -0
- wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
- wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
- wxcli/migration/transform/mappers/e911_mapper.py +129 -0
- wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
- wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
- wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
- wxcli/migration/transform/mappers/line_mapper.py +310 -0
- wxcli/migration/transform/mappers/location_mapper.py +235 -0
- wxcli/migration/transform/mappers/moh_mapper.py +114 -0
- wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
- wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
- wxcli/migration/transform/mappers/routing_mapper.py +821 -0
- wxcli/migration/transform/mappers/snr_mapper.py +201 -0
- wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
- wxcli/migration/transform/mappers/user_mapper.py +264 -0
- wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
- wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
- wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
- wxcli/migration/transform/normalizers.py +2008 -0
- wxcli/migration/transform/pattern_converter.py +106 -0
- wxcli/migration/transform/pipeline.py +271 -0
- wxcli/migration/transform/rules.py +255 -0
- wxcli/org_health/CLAUDE.md +63 -0
- wxcli/org_health/__init__.py +7 -0
- wxcli/org_health/analyze.py +93 -0
- wxcli/org_health/checks.py +458 -0
- wxcli/org_health/collector.py +62 -0
- wxcli/org_health/models.py +78 -0
- wxcli/org_health/report.py +300 -0
- wxcli/output.py +101 -0
- wxcli-1.2.0.dist-info/METADATA +505 -0
- wxcli-1.2.0.dist-info/RECORD +413 -0
- wxcli-1.2.0.dist-info/WHEEL +5 -0
- wxcli-1.2.0.dist-info/entry_points.txt +2 -0
- wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
- wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
- wxcli-1.2.0.dist-info/scm_version.json +8 -0
- wxcli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1091 @@
|
|
|
1
|
+
<!-- Created by playbook session 2026-03-19 -->
|
|
2
|
+
# Messaging Bots & Adaptive Cards Reference
|
|
3
|
+
|
|
4
|
+
Developer reference for building Webex bots and integrations. Covers bot fundamentals, adaptive card patterns, the `attachment-actions` and `room-tabs` CLI groups, and cross-domain calling + messaging recipes.
|
|
5
|
+
|
|
6
|
+
For space/team/membership CRUD, see [`messaging-spaces.md`](messaging-spaces.md).
|
|
7
|
+
|
|
8
|
+
## Sources
|
|
9
|
+
|
|
10
|
+
- OpenAPI spec: `specs/webex-messaging.json`
|
|
11
|
+
- developer.webex.com Messaging APIs
|
|
12
|
+
- Webex Bot Framework documentation
|
|
13
|
+
|
|
14
|
+
## Required Scopes
|
|
15
|
+
|
|
16
|
+
| Command Group | Bot Token | User Token | Admin Token |
|
|
17
|
+
|--------------|-----------|-----------|-------------|
|
|
18
|
+
| `messages` (create/list/get/delete) | `spark:messages_write`, `spark:messages_read` | `spark:messages_write`, `spark:messages_read` | Not supported (use compliance API) |
|
|
19
|
+
| `attachment-actions` (show/create) | `spark:messages_read` | `spark:messages_read` | Not supported |
|
|
20
|
+
| `room-tabs` (CRUD) | Not supported | `spark:rooms_read`, `spark:rooms_write` (moderator required) | `spark-admin:rooms_read`, `spark-admin:rooms_write` |
|
|
21
|
+
| `webhooks` (CRUD) | `spark:webhooks_read`, `spark:webhooks_write` | `spark:webhooks_read`, `spark:webhooks_write` | `spark:webhooks_read`, `spark:webhooks_write` |
|
|
22
|
+
| `rooms` (create/list) | `spark:rooms_read`, `spark:rooms_write` | `spark:rooms_read`, `spark:rooms_write` | `spark-admin:rooms_read`, `spark-admin:rooms_write` |
|
|
23
|
+
| `memberships` (CRUD) | `spark:memberships_read` (read only; cannot add/remove except self) | `spark:memberships_read`, `spark:memberships_write` | `spark-admin:memberships_read`, `spark-admin:memberships_write` |
|
|
24
|
+
|
|
25
|
+
> **Note:** Bot tokens have a fixed scope set — you cannot request additional scopes beyond what is granted at bot creation. User and admin tokens must explicitly request the scopes listed above during the OAuth flow.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 1. Bot Fundamentals
|
|
30
|
+
|
|
31
|
+
A Webex bot is a special Webex user with its own always-on access token — no human login, no session expiry. Bots are created at [developer.webex.com](https://developer.webex.com) → My Apps → Create a Bot.
|
|
32
|
+
|
|
33
|
+
### What a Bot Can and Cannot Do
|
|
34
|
+
|
|
35
|
+
| Capability | Bot Token | User Token | Admin Token |
|
|
36
|
+
|-----------|-----------|-----------|-------------|
|
|
37
|
+
| Send messages | Yes (spaces it's in) | Yes (spaces they're in) | No |
|
|
38
|
+
| Create spaces | Yes | Yes | Yes |
|
|
39
|
+
| Join spaces | No (must be added by a user) | Yes (if invited or discoverable) | N/A |
|
|
40
|
+
| Create teams | No | Yes | Yes |
|
|
41
|
+
| Manage memberships | No (except removing self) | Yes (if moderator) | Yes |
|
|
42
|
+
| See all messages | Only @mentions + 1:1 | All in their spaces | Compliance API only |
|
|
43
|
+
| Admin operations | No | No | Yes |
|
|
44
|
+
| Use `spark-admin:` scopes | No | No | Yes |
|
|
45
|
+
|
|
46
|
+
### Bot Token Scopes
|
|
47
|
+
|
|
48
|
+
Bot tokens have a fixed scope set — you cannot request additional scopes:
|
|
49
|
+
|
|
50
|
+
- `spark:messages_read` — read messages in spaces the bot belongs to
|
|
51
|
+
- `spark:messages_write` — send messages to spaces
|
|
52
|
+
- `spark:rooms_read` — list and read space details
|
|
53
|
+
- `spark:memberships_read` — list space members
|
|
54
|
+
- `spark:kms` — required for E2E encryption key management
|
|
55
|
+
|
|
56
|
+
### Configuring a Bot Token
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
wxcli configure
|
|
60
|
+
# Enter the bot's access token when prompted
|
|
61
|
+
wxcli whoami # Verify — should show the bot's display name
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Detecting Token Type from `wxcli whoami`
|
|
65
|
+
|
|
66
|
+
The `/people/me` endpoint (called by `wxcli whoami`) returns a `type` field:
|
|
67
|
+
|
|
68
|
+
| Token Type | `type` field | Notes |
|
|
69
|
+
|-----------|-------------|-------|
|
|
70
|
+
| Bot | `bot` | Display name often ends with "(bot)" or similar; email is bot-specific |
|
|
71
|
+
| User | `person` | Normal human name and email |
|
|
72
|
+
| Admin | `person` | Same as user — admin privileges come from scopes and org roles, not token type |
|
|
73
|
+
|
|
74
|
+
The key discriminator: if `type` is `bot`, it is a bot token. If `type` is `person`, check the intended scopes — admin vs. regular user depends on token scopes, not the `/people/me` type field.
|
|
75
|
+
|
|
76
|
+
> **`wxcli whoami` does not display the `type` field.** It shows display name, email, org ID, roles, and token expiry. To distinguish bot from user via CLI, use `wxcli people list-me -o json` and check the `type` field in the JSON output, or call `/people/me` via Raw HTTP and inspect the `type` field directly.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 2. Sending Messages
|
|
81
|
+
|
|
82
|
+
Three tiers of message complexity. Plain text and markdown use direct CLI options. Adaptive cards require `--json-body`.
|
|
83
|
+
|
|
84
|
+
| Tier | Format | CLI Approach |
|
|
85
|
+
|------|--------|-------------|
|
|
86
|
+
| Plain text | `--text "Hello"` | Direct CLI option |
|
|
87
|
+
| Markdown | `--markdown "**Bold**"` | Direct CLI option |
|
|
88
|
+
| Adaptive card | `--json-body '{...}'` | JSON body required |
|
|
89
|
+
|
|
90
|
+
For plain text (`--text`) and markdown (`--markdown`) message patterns, see [`messaging-spaces.md`](messaging-spaces.md).
|
|
91
|
+
|
|
92
|
+
### Adaptive Card
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
wxcli messages create --json-body '{
|
|
96
|
+
"roomId": "ROOM_ID",
|
|
97
|
+
"text": "Fallback text for clients that cannot render cards",
|
|
98
|
+
"attachments": [{
|
|
99
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
100
|
+
"content": { ... card payload ... }
|
|
101
|
+
}]
|
|
102
|
+
}'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Critical:** The `text` field is required even when sending a card. It is the fallback for clients that cannot render adaptive cards (email notifications, older Webex versions, API consumers). Omitting it is not an error but the card may be invisible to some recipients.
|
|
106
|
+
|
|
107
|
+
For the complete card payload, see the recipe catalog in Section 3.
|
|
108
|
+
|
|
109
|
+
### Raw HTTP
|
|
110
|
+
|
|
111
|
+
**Send a message with an adaptive card:**
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
POST https://webexapis.com/v1/messages
|
|
115
|
+
Authorization: Bearer BOT_OR_USER_TOKEN
|
|
116
|
+
Content-Type: application/json
|
|
117
|
+
|
|
118
|
+
{
|
|
119
|
+
"roomId": "ROOM_ID",
|
|
120
|
+
"text": "Fallback text for clients that cannot render cards",
|
|
121
|
+
"attachments": [{
|
|
122
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
123
|
+
"content": { ... card payload ... }
|
|
124
|
+
}]
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
curl -X POST "https://webexapis.com/v1/messages" \
|
|
130
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
131
|
+
-H "Content-Type: application/json" \
|
|
132
|
+
-d '{
|
|
133
|
+
"roomId": "ROOM_ID",
|
|
134
|
+
"text": "Fallback text for clients that cannot render cards",
|
|
135
|
+
"attachments": [{
|
|
136
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
137
|
+
"content": {
|
|
138
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
139
|
+
"type": "AdaptiveCard",
|
|
140
|
+
"version": "1.3",
|
|
141
|
+
"body": [
|
|
142
|
+
{"type": "TextBlock", "text": "Hello from Raw HTTP", "weight": "Bolder"}
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
}]
|
|
146
|
+
}'
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Send a plain text message:**
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
curl -X POST "https://webexapis.com/v1/messages" \
|
|
153
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
154
|
+
-H "Content-Type: application/json" \
|
|
155
|
+
-d '{"roomId": "ROOM_ID", "text": "Hello, plain text message"}'
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Send a markdown message:**
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
curl -X POST "https://webexapis.com/v1/messages" \
|
|
162
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
163
|
+
-H "Content-Type: application/json" \
|
|
164
|
+
-d '{"roomId": "ROOM_ID", "markdown": "**Bold** and _italic_ message"}'
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 3. Adaptive Card Recipe Catalog
|
|
170
|
+
|
|
171
|
+
Each recipe below is copy-paste ready. Replace `ROOM_ID` with the target space ID.
|
|
172
|
+
|
|
173
|
+
For interactive recipes (those with `Action.Submit`): the user's card response is captured via webhook (`attachmentActions` resource) and retrieved with `wxcli attachment-actions show ACTION_ID`. See Section 5.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
### Recipe 1: Notification Card
|
|
178
|
+
|
|
179
|
+
**Use case:** CI/CD alerts, monitoring notifications, status updates — informational only, no user input.
|
|
180
|
+
|
|
181
|
+
**What it looks like:** A title in large bold text, a fact table with key-value details (repo, branch, status), and a "View Dashboard" button that opens a URL.
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
wxcli messages create --json-body '{
|
|
185
|
+
"roomId": "ROOM_ID",
|
|
186
|
+
"text": "Build notification",
|
|
187
|
+
"attachments": [{
|
|
188
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
189
|
+
"content": {
|
|
190
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
191
|
+
"type": "AdaptiveCard",
|
|
192
|
+
"version": "1.3",
|
|
193
|
+
"body": [
|
|
194
|
+
{
|
|
195
|
+
"type": "TextBlock",
|
|
196
|
+
"text": "Build Passed",
|
|
197
|
+
"size": "Large",
|
|
198
|
+
"weight": "Bolder",
|
|
199
|
+
"color": "Good"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"type": "FactSet",
|
|
203
|
+
"facts": [
|
|
204
|
+
{"title": "Repository", "value": "myapp"},
|
|
205
|
+
{"title": "Branch", "value": "main"},
|
|
206
|
+
{"title": "Commit", "value": "a1b2c3d"},
|
|
207
|
+
{"title": "Duration", "value": "2m 14s"}
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
],
|
|
211
|
+
"actions": [
|
|
212
|
+
{
|
|
213
|
+
"type": "Action.OpenUrl",
|
|
214
|
+
"title": "View Dashboard",
|
|
215
|
+
"url": "https://ci.example.com/builds/123"
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
}]
|
|
220
|
+
}'
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
No webhook needed — this card has no user input.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
### Recipe 2: Approval Flow
|
|
228
|
+
|
|
229
|
+
**Use case:** Change approvals, expense approvals, access requests.
|
|
230
|
+
|
|
231
|
+
**What it looks like:** A title, description, a fact table with request details, and two buttons: "Approve" and "Reject". Clicking either fires a webhook.
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
wxcli messages create --json-body '{
|
|
235
|
+
"roomId": "ROOM_ID",
|
|
236
|
+
"text": "Approval request pending",
|
|
237
|
+
"attachments": [{
|
|
238
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
239
|
+
"content": {
|
|
240
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
241
|
+
"type": "AdaptiveCard",
|
|
242
|
+
"version": "1.3",
|
|
243
|
+
"body": [
|
|
244
|
+
{
|
|
245
|
+
"type": "TextBlock",
|
|
246
|
+
"text": "Change Approval Required",
|
|
247
|
+
"size": "Large",
|
|
248
|
+
"weight": "Bolder"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"type": "TextBlock",
|
|
252
|
+
"text": "A change request requires your approval.",
|
|
253
|
+
"wrap": true
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"type": "FactSet",
|
|
257
|
+
"facts": [
|
|
258
|
+
{"title": "Requester", "value": "Alice Smith"},
|
|
259
|
+
{"title": "Change ID", "value": "CHG-00412"},
|
|
260
|
+
{"title": "Description", "value": "Upgrade firewall firmware"},
|
|
261
|
+
{"title": "Window", "value": "2026-03-20 02:00 UTC"}
|
|
262
|
+
]
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
"actions": [
|
|
266
|
+
{
|
|
267
|
+
"type": "Action.Submit",
|
|
268
|
+
"title": "Approve",
|
|
269
|
+
"data": {"decision": "approved", "changeId": "CHG-00412"}
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"type": "Action.Submit",
|
|
273
|
+
"title": "Reject",
|
|
274
|
+
"style": "destructive",
|
|
275
|
+
"data": {"decision": "rejected", "changeId": "CHG-00412"}
|
|
276
|
+
}
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
}]
|
|
280
|
+
}'
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Handling the response:**
|
|
284
|
+
|
|
285
|
+
1. Set up a webhook for `attachmentActions` resource (see Section 8).
|
|
286
|
+
2. When the user clicks Approve or Reject, your webhook receives the action ID.
|
|
287
|
+
3. Retrieve the response:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
wxcli attachment-actions show ACTION_ID
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
The `inputs` field will contain the `data` values from the button clicked, e.g. `{"decision": "approved", "changeId": "CHG-00412"}`.
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
### Recipe 3: Form / Survey
|
|
298
|
+
|
|
299
|
+
**Use case:** Feedback collection, incident reports, onboarding forms.
|
|
300
|
+
|
|
301
|
+
**What it looks like:** A form with a text input, a dropdown selection, a date picker, and a Submit button.
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
wxcli messages create --json-body '{
|
|
305
|
+
"roomId": "ROOM_ID",
|
|
306
|
+
"text": "Feedback form",
|
|
307
|
+
"attachments": [{
|
|
308
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
309
|
+
"content": {
|
|
310
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
311
|
+
"type": "AdaptiveCard",
|
|
312
|
+
"version": "1.3",
|
|
313
|
+
"body": [
|
|
314
|
+
{
|
|
315
|
+
"type": "TextBlock",
|
|
316
|
+
"text": "Service Feedback",
|
|
317
|
+
"size": "Large",
|
|
318
|
+
"weight": "Bolder"
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"type": "Input.Text",
|
|
322
|
+
"id": "comments",
|
|
323
|
+
"placeholder": "Describe your experience",
|
|
324
|
+
"isMultiline": true,
|
|
325
|
+
"label": "Comments"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"type": "Input.ChoiceSet",
|
|
329
|
+
"id": "rating",
|
|
330
|
+
"label": "Overall Rating",
|
|
331
|
+
"style": "compact",
|
|
332
|
+
"choices": [
|
|
333
|
+
{"title": "5 - Excellent", "value": "5"},
|
|
334
|
+
{"title": "4 - Good", "value": "4"},
|
|
335
|
+
{"title": "3 - Average", "value": "3"},
|
|
336
|
+
{"title": "2 - Poor", "value": "2"},
|
|
337
|
+
{"title": "1 - Very Poor", "value": "1"}
|
|
338
|
+
]
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"type": "Input.Date",
|
|
342
|
+
"id": "incidentDate",
|
|
343
|
+
"label": "Date of Incident (if applicable)"
|
|
344
|
+
}
|
|
345
|
+
],
|
|
346
|
+
"actions": [
|
|
347
|
+
{
|
|
348
|
+
"type": "Action.Submit",
|
|
349
|
+
"title": "Submit Feedback"
|
|
350
|
+
}
|
|
351
|
+
]
|
|
352
|
+
}
|
|
353
|
+
}]
|
|
354
|
+
}'
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Retrieving form inputs:**
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
wxcli attachment-actions show ACTION_ID
|
|
361
|
+
# Response inputs: {"comments": "...", "rating": "4", "incidentDate": "2026-03-19"}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
### Recipe 4: Status Dashboard
|
|
367
|
+
|
|
368
|
+
**Use case:** System status boards, deployment progress, call queue metrics.
|
|
369
|
+
|
|
370
|
+
**What it looks like:** A two-column layout. Left column shows service names; right column shows colored status indicators (green = operational, red = degraded).
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
wxcli messages create --json-body '{
|
|
374
|
+
"roomId": "ROOM_ID",
|
|
375
|
+
"text": "System status update",
|
|
376
|
+
"attachments": [{
|
|
377
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
378
|
+
"content": {
|
|
379
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
380
|
+
"type": "AdaptiveCard",
|
|
381
|
+
"version": "1.3",
|
|
382
|
+
"body": [
|
|
383
|
+
{
|
|
384
|
+
"type": "TextBlock",
|
|
385
|
+
"text": "System Status — 2026-03-19 14:30 UTC",
|
|
386
|
+
"size": "Medium",
|
|
387
|
+
"weight": "Bolder"
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"type": "ColumnSet",
|
|
391
|
+
"columns": [
|
|
392
|
+
{
|
|
393
|
+
"type": "Column",
|
|
394
|
+
"width": "stretch",
|
|
395
|
+
"items": [
|
|
396
|
+
{"type": "TextBlock", "text": "API Gateway", "weight": "Bolder"},
|
|
397
|
+
{"type": "TextBlock", "text": "Call Queue"},
|
|
398
|
+
{"type": "TextBlock", "text": "Voicemail"},
|
|
399
|
+
{"type": "TextBlock", "text": "Recording"}
|
|
400
|
+
]
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"type": "Column",
|
|
404
|
+
"width": "auto",
|
|
405
|
+
"items": [
|
|
406
|
+
{"type": "TextBlock", "text": "Operational", "color": "Good"},
|
|
407
|
+
{"type": "TextBlock", "text": "Degraded", "color": "Attention"},
|
|
408
|
+
{"type": "TextBlock", "text": "Operational", "color": "Good"},
|
|
409
|
+
{"type": "TextBlock", "text": "Operational", "color": "Good"}
|
|
410
|
+
]
|
|
411
|
+
}
|
|
412
|
+
]
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"type": "TextBlock",
|
|
416
|
+
"text": "Call Queue: elevated latency detected. Engineering investigating.",
|
|
417
|
+
"wrap": true,
|
|
418
|
+
"color": "Attention",
|
|
419
|
+
"size": "Small"
|
|
420
|
+
}
|
|
421
|
+
]
|
|
422
|
+
}
|
|
423
|
+
}]
|
|
424
|
+
}'
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
No webhook needed — informational only.
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
### Recipe 5: Incident Alert
|
|
432
|
+
|
|
433
|
+
**Use case:** PagerDuty-style on-call alerts, calling queue overflow notifications.
|
|
434
|
+
|
|
435
|
+
**What it looks like:** A red-accented header, incident details table, an "Acknowledge" button (Action.Submit) and a "View Runbook" button (Action.OpenUrl).
|
|
436
|
+
|
|
437
|
+
```bash
|
|
438
|
+
wxcli messages create --json-body '{
|
|
439
|
+
"roomId": "ROOM_ID",
|
|
440
|
+
"text": "INCIDENT: High priority alert — action required",
|
|
441
|
+
"attachments": [{
|
|
442
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
443
|
+
"content": {
|
|
444
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
445
|
+
"type": "AdaptiveCard",
|
|
446
|
+
"version": "1.3",
|
|
447
|
+
"body": [
|
|
448
|
+
{
|
|
449
|
+
"type": "TextBlock",
|
|
450
|
+
"text": "INCIDENT: Call Queue Overflow",
|
|
451
|
+
"size": "Large",
|
|
452
|
+
"weight": "Bolder",
|
|
453
|
+
"color": "Attention"
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
"type": "TextBlock",
|
|
457
|
+
"text": "Queue wait time exceeded threshold. Immediate action required.",
|
|
458
|
+
"wrap": true
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"type": "FactSet",
|
|
462
|
+
"facts": [
|
|
463
|
+
{"title": "Queue", "value": "Support — Tier 1"},
|
|
464
|
+
{"title": "Wait Time", "value": "18 minutes"},
|
|
465
|
+
{"title": "Calls Waiting", "value": "24"},
|
|
466
|
+
{"title": "Agents Available", "value": "2"},
|
|
467
|
+
{"title": "Incident ID", "value": "INC-20260319-001"}
|
|
468
|
+
]
|
|
469
|
+
}
|
|
470
|
+
],
|
|
471
|
+
"actions": [
|
|
472
|
+
{
|
|
473
|
+
"type": "Action.Submit",
|
|
474
|
+
"title": "Acknowledge",
|
|
475
|
+
"data": {"action": "acknowledge", "incidentId": "INC-20260319-001"}
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
"type": "Action.OpenUrl",
|
|
479
|
+
"title": "View Runbook",
|
|
480
|
+
"url": "https://wiki.example.com/runbooks/call-queue-overflow"
|
|
481
|
+
}
|
|
482
|
+
]
|
|
483
|
+
}
|
|
484
|
+
}]
|
|
485
|
+
}'
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**Handling acknowledgement:** Set up a webhook for `attachmentActions`. When the on-call engineer clicks Acknowledge, retrieve the response with `wxcli attachment-actions show ACTION_ID` and update your incident management system.
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
### Recipe 6: Dropdown Menu
|
|
493
|
+
|
|
494
|
+
**Use case:** Configuration selection, routing preference, environment targeting. The simplest interactive pattern — good starting point for any bot that needs a single user choice.
|
|
495
|
+
|
|
496
|
+
```bash
|
|
497
|
+
wxcli messages create --json-body '{
|
|
498
|
+
"roomId": "ROOM_ID",
|
|
499
|
+
"text": "Please select a deployment target",
|
|
500
|
+
"attachments": [{
|
|
501
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
502
|
+
"content": {
|
|
503
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
504
|
+
"type": "AdaptiveCard",
|
|
505
|
+
"version": "1.3",
|
|
506
|
+
"body": [
|
|
507
|
+
{
|
|
508
|
+
"type": "TextBlock",
|
|
509
|
+
"text": "Select Deployment Target",
|
|
510
|
+
"size": "Medium",
|
|
511
|
+
"weight": "Bolder"
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
"type": "Input.ChoiceSet",
|
|
515
|
+
"id": "environment",
|
|
516
|
+
"label": "Environment",
|
|
517
|
+
"style": "compact",
|
|
518
|
+
"placeholder": "Choose...",
|
|
519
|
+
"choices": [
|
|
520
|
+
{"title": "Development", "value": "dev"},
|
|
521
|
+
{"title": "Staging", "value": "staging"},
|
|
522
|
+
{"title": "Production", "value": "prod"}
|
|
523
|
+
]
|
|
524
|
+
}
|
|
525
|
+
],
|
|
526
|
+
"actions": [
|
|
527
|
+
{
|
|
528
|
+
"type": "Action.Submit",
|
|
529
|
+
"title": "Deploy"
|
|
530
|
+
}
|
|
531
|
+
]
|
|
532
|
+
}
|
|
533
|
+
}]
|
|
534
|
+
}'
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
**Retrieving the selection:**
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
wxcli attachment-actions show ACTION_ID
|
|
541
|
+
# Response inputs: {"environment": "staging"}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### Raw HTTP — Sending Cards
|
|
545
|
+
|
|
546
|
+
All card recipes use the same endpoint. The only variable is the card payload in the `attachments` array.
|
|
547
|
+
|
|
548
|
+
```
|
|
549
|
+
POST https://webexapis.com/v1/messages
|
|
550
|
+
Authorization: Bearer BOT_OR_USER_TOKEN
|
|
551
|
+
Content-Type: application/json
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
**Notification card (Recipe 1):**
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
curl -X POST "https://webexapis.com/v1/messages" \
|
|
558
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
559
|
+
-H "Content-Type: application/json" \
|
|
560
|
+
-d '{
|
|
561
|
+
"roomId": "ROOM_ID",
|
|
562
|
+
"text": "Build notification",
|
|
563
|
+
"attachments": [{
|
|
564
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
565
|
+
"content": {
|
|
566
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
567
|
+
"type": "AdaptiveCard",
|
|
568
|
+
"version": "1.3",
|
|
569
|
+
"body": [
|
|
570
|
+
{"type": "TextBlock", "text": "Build Passed", "size": "Large", "weight": "Bolder", "color": "Good"},
|
|
571
|
+
{"type": "FactSet", "facts": [
|
|
572
|
+
{"title": "Repository", "value": "myapp"},
|
|
573
|
+
{"title": "Branch", "value": "main"},
|
|
574
|
+
{"title": "Commit", "value": "a1b2c3d"},
|
|
575
|
+
{"title": "Duration", "value": "2m 14s"}
|
|
576
|
+
]}
|
|
577
|
+
],
|
|
578
|
+
"actions": [
|
|
579
|
+
{"type": "Action.OpenUrl", "title": "View Dashboard", "url": "https://ci.example.com/builds/123"}
|
|
580
|
+
]
|
|
581
|
+
}
|
|
582
|
+
}]
|
|
583
|
+
}'
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**Approval flow (Recipe 2):**
|
|
587
|
+
|
|
588
|
+
```bash
|
|
589
|
+
curl -X POST "https://webexapis.com/v1/messages" \
|
|
590
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
591
|
+
-H "Content-Type: application/json" \
|
|
592
|
+
-d '{
|
|
593
|
+
"roomId": "ROOM_ID",
|
|
594
|
+
"text": "Approval request pending",
|
|
595
|
+
"attachments": [{
|
|
596
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
597
|
+
"content": {
|
|
598
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
599
|
+
"type": "AdaptiveCard",
|
|
600
|
+
"version": "1.3",
|
|
601
|
+
"body": [
|
|
602
|
+
{"type": "TextBlock", "text": "Change Approval Required", "size": "Large", "weight": "Bolder"},
|
|
603
|
+
{"type": "TextBlock", "text": "A change request requires your approval.", "wrap": true},
|
|
604
|
+
{"type": "FactSet", "facts": [
|
|
605
|
+
{"title": "Requester", "value": "Alice Smith"},
|
|
606
|
+
{"title": "Change ID", "value": "CHG-00412"},
|
|
607
|
+
{"title": "Description", "value": "Upgrade firewall firmware"},
|
|
608
|
+
{"title": "Window", "value": "2026-03-20 02:00 UTC"}
|
|
609
|
+
]}
|
|
610
|
+
],
|
|
611
|
+
"actions": [
|
|
612
|
+
{"type": "Action.Submit", "title": "Approve", "data": {"decision": "approved", "changeId": "CHG-00412"}},
|
|
613
|
+
{"type": "Action.Submit", "title": "Reject", "style": "destructive", "data": {"decision": "rejected", "changeId": "CHG-00412"}}
|
|
614
|
+
]
|
|
615
|
+
}
|
|
616
|
+
}]
|
|
617
|
+
}'
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
**Form / survey (Recipe 3), incident alert (Recipe 5), dropdown menu (Recipe 6):** Same endpoint and pattern — replace the `content` object with the corresponding card payload from the recipe above.
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## 4. Webex Adaptive Cards — Supported Features and Gaps
|
|
625
|
+
|
|
626
|
+
Webex supports **Adaptive Cards schema version 1.3**.
|
|
627
|
+
|
|
628
|
+
Adaptive Cards with `"version": "1.3"` are accepted by the Webex Messages API, including `Action.ToggleVisibility` (a 1.2+ feature). Card was sent successfully to a test room with HTTP 200.
|
|
629
|
+
|
|
630
|
+
### Supported Elements
|
|
631
|
+
|
|
632
|
+
| Category | Elements |
|
|
633
|
+
|----------|---------|
|
|
634
|
+
| Container | `AdaptiveCard`, `Container`, `ColumnSet`, `Column`, `ActionSet` |
|
|
635
|
+
| Display | `TextBlock`, `RichTextBlock`, `TextRun`, `Image`, `ImageSet`, `FactSet` |
|
|
636
|
+
| Input | `Input.Text`, `Input.Number`, `Input.Date`, `Input.Time`, `Input.Toggle`, `Input.ChoiceSet` |
|
|
637
|
+
| Actions | `Action.Submit`, `Action.OpenUrl`, `Action.ShowCard`, `Action.ToggleVisibility` |
|
|
638
|
+
|
|
639
|
+
### Known Gaps
|
|
640
|
+
|
|
641
|
+
| Feature | Status | Workaround |
|
|
642
|
+
|---------|--------|-----------|
|
|
643
|
+
| `Media` element | Not supported | Link to media via `Action.OpenUrl` instead |
|
|
644
|
+
| `Action.Execute` (v1.4+) | Not supported | Use `Action.Submit` |
|
|
645
|
+
| `fallback` property on elements | Partially supported; behavior inconsistent across clients | Test on all target clients |
|
|
646
|
+
| `fallbackText` card property | Not supported | Use `text` field on the message instead |
|
|
647
|
+
| `requires` property | Not supported | — |
|
|
648
|
+
| `speak` property | Not supported | — |
|
|
649
|
+
| `ColumnSet` `height` property | Not supported | — |
|
|
650
|
+
| Card actions limit | Max 20 actions per card | Use `ActionSet` inside containers to distribute actions |
|
|
651
|
+
| Card payload size | 4KB maximum | Cards larger than 4KB silently fail to render; keep fact sets and text compact |
|
|
652
|
+
|
|
653
|
+
### Rendering Notes
|
|
654
|
+
|
|
655
|
+
Card rendering varies between Webex desktop, mobile, and web clients. Test interactive cards (inputs, buttons) on all target client types. The `color` property on TextBlock (`Good`, `Attention`, `Warning`, `Accent`, `Dark`, `Light`) renders differently on light vs. dark themes.
|
|
656
|
+
|
|
657
|
+
### References
|
|
658
|
+
|
|
659
|
+
- Full Adaptive Cards schema reference: [adaptivecards.io/explorer/](https://adaptivecards.io/explorer/)
|
|
660
|
+
- Webex Cards guide: [developer.webex.com/docs/buttons-and-cards](https://developer.webex.com/docs/buttons-and-cards)
|
|
661
|
+
- Webex Buttons and Cards Designer: [developer.webex.com/buttons-and-cards-designer](https://developer.webex.com/buttons-and-cards-designer)
|
|
662
|
+
|
|
663
|
+
---
|
|
664
|
+
|
|
665
|
+
## 5. Attachment Actions (`attachment-actions` CLI group — 2 commands)
|
|
666
|
+
|
|
667
|
+
Attachment actions represent a user's response to an adaptive card `Action.Submit` button. This is how bots receive user input from cards.
|
|
668
|
+
|
|
669
|
+
### Command Reference
|
|
670
|
+
|
|
671
|
+
| Command | What It Does |
|
|
672
|
+
|---------|-------------|
|
|
673
|
+
| `wxcli attachment-actions create-an-attachment` | Submit a card response programmatically (testing/automation) |
|
|
674
|
+
| `wxcli attachment-actions show ACTION_ID` | Get a user's card response and input values |
|
|
675
|
+
|
|
676
|
+
### The Card Interaction Flow
|
|
677
|
+
|
|
678
|
+
```
|
|
679
|
+
1. Bot sends message with adaptive card
|
|
680
|
+
wxcli messages create --json-body '{"roomId":"...","text":"fallback","attachments":[...]}'
|
|
681
|
+
|
|
682
|
+
2. User clicks Action.Submit in the card
|
|
683
|
+
→ Webex fires webhook: resource=attachmentActions, event=created
|
|
684
|
+
|
|
685
|
+
3. Webhook payload contains the action ID
|
|
686
|
+
|
|
687
|
+
4. Bot retrieves the user's inputs
|
|
688
|
+
wxcli attachment-actions show ACTION_ID
|
|
689
|
+
|
|
690
|
+
5. Bot processes inputs and sends follow-up message
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
### Command Details
|
|
694
|
+
|
|
695
|
+
**Get attachment action details:**
|
|
696
|
+
|
|
697
|
+
```bash
|
|
698
|
+
wxcli attachment-actions show ACTION_ID
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
Response fields:
|
|
702
|
+
|
|
703
|
+
| Field | Description |
|
|
704
|
+
|-------|-------------|
|
|
705
|
+
| `id` | The attachment action ID (from the webhook payload) |
|
|
706
|
+
| `type` | Always `submit` |
|
|
707
|
+
| `messageId` | ID of the message that contained the card |
|
|
708
|
+
| `inputs` | Object with key-value pairs from the card's input fields |
|
|
709
|
+
| `personId` | ID of the person who submitted the response |
|
|
710
|
+
| `roomId` | ID of the space where the card was submitted |
|
|
711
|
+
| `created` | Timestamp of submission |
|
|
712
|
+
|
|
713
|
+
**Create an attachment action (programmatic/testing):**
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
wxcli attachment-actions create-an-attachment \
|
|
717
|
+
--type submit \
|
|
718
|
+
--message-id MSG_ID \
|
|
719
|
+
--json-body '{"type":"submit","messageId":"MSG_ID","inputs":{"decision":"approved"}}'
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
For complex input payloads, use `--json-body` to pass the full body directly.
|
|
723
|
+
|
|
724
|
+
### Retrieving Inputs by Recipe
|
|
725
|
+
|
|
726
|
+
After `wxcli attachment-actions show ACTION_ID`, the `inputs` field maps to the `id` values defined in your card's input elements:
|
|
727
|
+
|
|
728
|
+
| Recipe | `inputs` example |
|
|
729
|
+
|--------|-----------------|
|
|
730
|
+
| Approval Flow (Recipe 2) | `{"decision": "approved", "changeId": "CHG-00412"}` |
|
|
731
|
+
| Form/Survey (Recipe 3) | `{"comments": "Great service", "rating": "4", "incidentDate": "2026-03-19"}` |
|
|
732
|
+
| Incident Alert (Recipe 5) | `{"action": "acknowledge", "incidentId": "INC-20260319-001"}` |
|
|
733
|
+
| Dropdown Menu (Recipe 6) | `{"environment": "staging"}` |
|
|
734
|
+
|
|
735
|
+
### Raw HTTP
|
|
736
|
+
|
|
737
|
+
**Get attachment action details:**
|
|
738
|
+
|
|
739
|
+
```
|
|
740
|
+
GET https://webexapis.com/v1/attachment/actions/{actionId}
|
|
741
|
+
Authorization: Bearer BOT_OR_USER_TOKEN
|
|
742
|
+
```
|
|
743
|
+
|
|
744
|
+
```bash
|
|
745
|
+
curl -s "https://webexapis.com/v1/attachment/actions/ACTION_ID" \
|
|
746
|
+
-H "Authorization: Bearer $TOKEN"
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
Returns `id`, `type`, `messageId`, `inputs`, `personId`, `roomId`, `created`.
|
|
750
|
+
|
|
751
|
+
**Create an attachment action (programmatic/testing):**
|
|
752
|
+
|
|
753
|
+
```
|
|
754
|
+
POST https://webexapis.com/v1/attachment/actions
|
|
755
|
+
Authorization: Bearer BOT_OR_USER_TOKEN
|
|
756
|
+
Content-Type: application/json
|
|
757
|
+
|
|
758
|
+
{
|
|
759
|
+
"type": "submit",
|
|
760
|
+
"messageId": "MSG_ID",
|
|
761
|
+
"inputs": {"decision": "approved"}
|
|
762
|
+
}
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
```bash
|
|
766
|
+
curl -X POST "https://webexapis.com/v1/attachment/actions" \
|
|
767
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
768
|
+
-H "Content-Type: application/json" \
|
|
769
|
+
-d '{"type": "submit", "messageId": "MSG_ID", "inputs": {"decision": "approved"}}'
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
## 6. Room Tabs (`room-tabs` CLI group — 5 commands)
|
|
775
|
+
|
|
776
|
+
> **Room tabs require a user token (moderator), NOT a bot token.** Bot tokens cannot create or manage room tabs. The authenticated user must be a moderator of the space.
|
|
777
|
+
|
|
778
|
+
Room tabs embed web content — dashboards, wikis, tools, status pages — directly in a Webex space's tab bar. Users in the space can access the embedded content without leaving Webex.
|
|
779
|
+
|
|
780
|
+
### Command Reference
|
|
781
|
+
|
|
782
|
+
| Command | What It Does |
|
|
783
|
+
|---------|-------------|
|
|
784
|
+
| `wxcli room-tabs list --room-id ROOM_ID` | List all tabs in a space |
|
|
785
|
+
| `wxcli room-tabs create --room-id ROOM_ID --content-url URL --display-name "Name"` | Add a tab to a space |
|
|
786
|
+
| `wxcli room-tabs show TAB_ID` | Get tab details (URL, display name, creator) |
|
|
787
|
+
| `wxcli room-tabs update TAB_ID [--content-url URL] [--display-name "Name"]` | Update tab URL or display name |
|
|
788
|
+
| `wxcli room-tabs delete TAB_ID` | Remove a tab from a space |
|
|
789
|
+
|
|
790
|
+
### Command Details
|
|
791
|
+
|
|
792
|
+
**List tabs in a space:**
|
|
793
|
+
|
|
794
|
+
```bash
|
|
795
|
+
wxcli room-tabs list --room-id ROOM_ID
|
|
796
|
+
```
|
|
797
|
+
|
|
798
|
+
**Create a tab:**
|
|
799
|
+
|
|
800
|
+
```bash
|
|
801
|
+
wxcli room-tabs create \
|
|
802
|
+
--room-id ROOM_ID \
|
|
803
|
+
--content-url "https://dashboard.example.com/calls" \
|
|
804
|
+
--display-name "Call Dashboard"
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
- `--content-url` must use HTTPS
|
|
808
|
+
- `--display-name` is the label shown in the tab bar
|
|
809
|
+
- All three options are required for `create`
|
|
810
|
+
|
|
811
|
+
**Update a tab:**
|
|
812
|
+
|
|
813
|
+
```bash
|
|
814
|
+
wxcli room-tabs update TAB_ID --content-url "https://dashboard.example.com/v2/calls"
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
Only include the options you want to change.
|
|
818
|
+
|
|
819
|
+
**Delete a tab:**
|
|
820
|
+
|
|
821
|
+
```bash
|
|
822
|
+
wxcli room-tabs delete TAB_ID --force
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
Without `--force`, the CLI prompts for confirmation.
|
|
826
|
+
|
|
827
|
+
### Raw HTTP
|
|
828
|
+
|
|
829
|
+
**List tabs in a space:**
|
|
830
|
+
|
|
831
|
+
```
|
|
832
|
+
GET https://webexapis.com/v1/room/tabs?roomId={roomId}
|
|
833
|
+
Authorization: Bearer USER_TOKEN
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
```bash
|
|
837
|
+
curl -s "https://webexapis.com/v1/room/tabs?roomId=ROOM_ID" \
|
|
838
|
+
-H "Authorization: Bearer $TOKEN"
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
**Create a tab:**
|
|
842
|
+
|
|
843
|
+
```
|
|
844
|
+
POST https://webexapis.com/v1/room/tabs
|
|
845
|
+
Authorization: Bearer USER_TOKEN
|
|
846
|
+
Content-Type: application/json
|
|
847
|
+
|
|
848
|
+
{
|
|
849
|
+
"roomId": "ROOM_ID",
|
|
850
|
+
"contentUrl": "https://dashboard.example.com/calls",
|
|
851
|
+
"displayName": "Call Dashboard"
|
|
852
|
+
}
|
|
853
|
+
```
|
|
854
|
+
|
|
855
|
+
```bash
|
|
856
|
+
curl -X POST "https://webexapis.com/v1/room/tabs" \
|
|
857
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
858
|
+
-H "Content-Type: application/json" \
|
|
859
|
+
-d '{"roomId": "ROOM_ID", "contentUrl": "https://dashboard.example.com/calls", "displayName": "Call Dashboard"}'
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
**Get tab details:**
|
|
863
|
+
|
|
864
|
+
```bash
|
|
865
|
+
curl -s "https://webexapis.com/v1/room/tabs/TAB_ID" \
|
|
866
|
+
-H "Authorization: Bearer $TOKEN"
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
**Update a tab:**
|
|
870
|
+
|
|
871
|
+
```bash
|
|
872
|
+
curl -X PUT "https://webexapis.com/v1/room/tabs/TAB_ID" \
|
|
873
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
874
|
+
-H "Content-Type: application/json" \
|
|
875
|
+
-d '{"roomId": "ROOM_ID", "contentUrl": "https://dashboard.example.com/v2/calls", "displayName": "Call Dashboard"}'
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
**Delete a tab:**
|
|
879
|
+
|
|
880
|
+
```bash
|
|
881
|
+
curl -X DELETE "https://webexapis.com/v1/room/tabs/TAB_ID" \
|
|
882
|
+
-H "Authorization: Bearer $TOKEN"
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
---
|
|
886
|
+
|
|
887
|
+
## 7. Cross-Domain Recipes (Calling + Messaging)
|
|
888
|
+
|
|
889
|
+
These patterns bridge Webex Calling events with Webex Messaging to build integrated workflows.
|
|
890
|
+
|
|
891
|
+
### Recipe A: Call Queue Alert → Space Notification
|
|
892
|
+
|
|
893
|
+
Trigger a card notification to an ops space when a call queue exceeds a wait time threshold.
|
|
894
|
+
|
|
895
|
+
```
|
|
896
|
+
1. Create webhook for telephony_calls events (see webhooks-events.md)
|
|
897
|
+
wxcli webhooks create \
|
|
898
|
+
--name "Queue Monitor" \
|
|
899
|
+
--target-url https://your-bot.com/webhook \
|
|
900
|
+
--resource telephony_calls \
|
|
901
|
+
--event updated
|
|
902
|
+
|
|
903
|
+
2. In webhook handler, parse event data:
|
|
904
|
+
- Check queue wait time or overflow status
|
|
905
|
+
- If threshold exceeded, trigger notification
|
|
906
|
+
|
|
907
|
+
3. Send incident alert card to ops space:
|
|
908
|
+
wxcli messages create --json-body '{
|
|
909
|
+
"roomId": "OPS_SPACE_ROOM_ID",
|
|
910
|
+
"text": "Queue overflow alert",
|
|
911
|
+
"attachments": [{ ... Recipe 5 incident alert payload ... }]
|
|
912
|
+
}'
|
|
913
|
+
|
|
914
|
+
4. Capture acknowledgement via attachmentActions webhook
|
|
915
|
+
wxcli attachment-actions show ACTION_ID
|
|
916
|
+
```
|
|
917
|
+
|
|
918
|
+
### Recipe B: Voicemail → 1:1 Space Notification
|
|
919
|
+
|
|
920
|
+
Notify a user in their 1:1 bot space when they receive a new voicemail.
|
|
921
|
+
|
|
922
|
+
```
|
|
923
|
+
1. Create webhook for voicemail events
|
|
924
|
+
wxcli webhooks create \
|
|
925
|
+
--name "Voicemail Notifier" \
|
|
926
|
+
--target-url https://your-bot.com/webhook \
|
|
927
|
+
--resource telephony_mwi \
|
|
928
|
+
--event updated
|
|
929
|
+
|
|
930
|
+
2. In webhook handler, extract:
|
|
931
|
+
- personId (who received the voicemail)
|
|
932
|
+
- caller info, timestamp
|
|
933
|
+
|
|
934
|
+
3. Create or look up the 1:1 space between bot and user
|
|
935
|
+
wxcli messages create --to-person-id PERSON_ID --text "You have a new voicemail"
|
|
936
|
+
# Creating a message to a person ID creates the 1:1 space automatically
|
|
937
|
+
|
|
938
|
+
4. Send notification card with caller details and portal link:
|
|
939
|
+
wxcli messages create --json-body '{
|
|
940
|
+
"toPersonId": "PERSON_ID",
|
|
941
|
+
"text": "New voicemail",
|
|
942
|
+
"attachments": [{
|
|
943
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
944
|
+
"content": {
|
|
945
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
946
|
+
"type": "AdaptiveCard",
|
|
947
|
+
"version": "1.3",
|
|
948
|
+
"body": [
|
|
949
|
+
{"type": "TextBlock", "text": "New Voicemail", "weight": "Bolder", "size": "Medium"},
|
|
950
|
+
{
|
|
951
|
+
"type": "FactSet",
|
|
952
|
+
"facts": [
|
|
953
|
+
{"title": "From", "value": "{{callerName}}"},
|
|
954
|
+
{"title": "Number", "value": "{{callerNumber}}"},
|
|
955
|
+
{"title": "Received", "value": "{{timestamp}}"}
|
|
956
|
+
]
|
|
957
|
+
}
|
|
958
|
+
],
|
|
959
|
+
"actions": [
|
|
960
|
+
{"type": "Action.OpenUrl", "title": "Listen to Voicemail", "url": "https://calling.webex.com/voicemail"}
|
|
961
|
+
]
|
|
962
|
+
}
|
|
963
|
+
}]
|
|
964
|
+
}'
|
|
965
|
+
```
|
|
966
|
+
|
|
967
|
+
### Recipe C: Automated Incident Response
|
|
968
|
+
|
|
969
|
+
When a calling issue is detected, automatically create an incident space, add responders, and post a diagnostics card.
|
|
970
|
+
|
|
971
|
+
```
|
|
972
|
+
1. Detect the calling issue (CDR anomaly, webhook pattern, monitoring alert)
|
|
973
|
+
|
|
974
|
+
2. Create a dedicated incident space:
|
|
975
|
+
wxcli rooms create --title "Incident-2026-03-19-CQ-Overflow"
|
|
976
|
+
|
|
977
|
+
3. Add on-call responders by email:
|
|
978
|
+
wxcli memberships create --room-id ROOM_ID --person-email oncall@example.com
|
|
979
|
+
wxcli memberships create --room-id ROOM_ID --person-email teamlead@example.com
|
|
980
|
+
|
|
981
|
+
4. Post a status dashboard card with diagnostics:
|
|
982
|
+
wxcli messages create --room-id ROOM_ID --json-body '{
|
|
983
|
+
... Recipe 4 status dashboard payload with current metrics ...
|
|
984
|
+
}'
|
|
985
|
+
|
|
986
|
+
5. Post a follow-up incident alert card with Acknowledge + Runbook buttons:
|
|
987
|
+
wxcli messages create --room-id ROOM_ID --json-body '{
|
|
988
|
+
... Recipe 5 incident alert payload ...
|
|
989
|
+
}'
|
|
990
|
+
|
|
991
|
+
6. Pin important messages and track acknowledgements via attachmentActions webhooks
|
|
992
|
+
```
|
|
993
|
+
|
|
994
|
+
For space and membership management commands (`rooms create`, `memberships create`), see [`messaging-spaces.md`](messaging-spaces.md).
|
|
995
|
+
|
|
996
|
+
### Raw HTTP — Cross-Domain Patterns
|
|
997
|
+
|
|
998
|
+
The cross-domain recipes above chain multiple API calls. Here are the Raw HTTP equivalents for the key operations used in these recipes.
|
|
999
|
+
|
|
1000
|
+
**Create a webhook (for telephony or messaging events):**
|
|
1001
|
+
|
|
1002
|
+
```bash
|
|
1003
|
+
curl -X POST "https://webexapis.com/v1/webhooks" \
|
|
1004
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
1005
|
+
-H "Content-Type: application/json" \
|
|
1006
|
+
-d '{
|
|
1007
|
+
"name": "Queue Monitor",
|
|
1008
|
+
"targetUrl": "https://your-bot.com/webhook",
|
|
1009
|
+
"resource": "telephony_calls",
|
|
1010
|
+
"event": "updated"
|
|
1011
|
+
}'
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
**Send a 1:1 message by person ID:**
|
|
1015
|
+
|
|
1016
|
+
```bash
|
|
1017
|
+
curl -X POST "https://webexapis.com/v1/messages" \
|
|
1018
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
1019
|
+
-H "Content-Type: application/json" \
|
|
1020
|
+
-d '{"toPersonId": "PERSON_ID", "text": "You have a new voicemail"}'
|
|
1021
|
+
```
|
|
1022
|
+
|
|
1023
|
+
**Create an incident space:**
|
|
1024
|
+
|
|
1025
|
+
```bash
|
|
1026
|
+
curl -X POST "https://webexapis.com/v1/rooms" \
|
|
1027
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
1028
|
+
-H "Content-Type: application/json" \
|
|
1029
|
+
-d '{"title": "Incident-2026-03-19-CQ-Overflow"}'
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
**Add a member to a space:**
|
|
1033
|
+
|
|
1034
|
+
```bash
|
|
1035
|
+
curl -X POST "https://webexapis.com/v1/memberships" \
|
|
1036
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
1037
|
+
-H "Content-Type: application/json" \
|
|
1038
|
+
-d '{"roomId": "ROOM_ID", "personEmail": "oncall@example.com"}'
|
|
1039
|
+
```
|
|
1040
|
+
|
|
1041
|
+
**Get attachment action response (after webhook fires):**
|
|
1042
|
+
|
|
1043
|
+
```bash
|
|
1044
|
+
curl -s "https://webexapis.com/v1/attachment/actions/ACTION_ID" \
|
|
1045
|
+
-H "Authorization: Bearer $TOKEN"
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
---
|
|
1049
|
+
|
|
1050
|
+
## 8. Webhook Signpost
|
|
1051
|
+
|
|
1052
|
+
For full webhook CRUD, event setup, messaging resource event payloads, bot webhook patterns, and HMAC verification, see [`webhooks-events.md`](webhooks-events.md) — especially sections 4b (messaging events) and 6b (bot webhook loop).
|
|
1053
|
+
|
|
1054
|
+
**Example — create a bot listener webhook:**
|
|
1055
|
+
|
|
1056
|
+
```bash
|
|
1057
|
+
wxcli webhooks create \
|
|
1058
|
+
--name "Bot Listener" \
|
|
1059
|
+
--target-url "https://your-bot.com/webhook" \
|
|
1060
|
+
--resource messages \
|
|
1061
|
+
--event created
|
|
1062
|
+
```
|
|
1063
|
+
|
|
1064
|
+
---
|
|
1065
|
+
|
|
1066
|
+
## Gotchas (Cross-Cutting)
|
|
1067
|
+
|
|
1068
|
+
1. **Bot rate limits.** Bots share the same rate limits as other API consumers: 5 requests/second per token for most endpoints. Bursting messages (e.g., posting alerts to many spaces simultaneously) will hit 429 responses. Implement exponential backoff with jitter. The `Retry-After` header tells you how long to wait.
|
|
1069
|
+
|
|
1070
|
+
2. **Webhook reliability.** Webex retries failed webhook deliveries (non-2xx responses) but with limited retries. If your webhook endpoint is down for extended periods, events are lost. Webex marks webhooks as `disabled` after sustained delivery failures — monitor webhook status with `wxcli webhooks list` and re-enable by updating the webhook. There is no replay/catch-up mechanism for missed events.
|
|
1071
|
+
|
|
1072
|
+
3. **Card rendering differences across clients.** Adaptive cards render differently on Webex desktop (Windows/Mac), mobile (iOS/Android), and web. Key differences: `ColumnSet` alignment, `color` property appearance on dark vs. light themes, and `Input.Date`/`Input.Time` picker UX. Always test interactive cards on all target client types before deploying to production.
|
|
1073
|
+
|
|
1074
|
+
4. **Card payload size limit (4KB).** Cards exceeding 4KB silently fail to render — the message is delivered with only the fallback `text` visible. Large FactSet entries and embedded Base64 images are the most common culprits. Keep cards compact; link to external content via `Action.OpenUrl` instead of embedding it.
|
|
1075
|
+
|
|
1076
|
+
5. **Bot cannot see all messages in group spaces.** Bots only receive messages where they are explicitly @mentioned. In 1:1 spaces, bots receive all messages. This is by design and cannot be changed via scopes or configuration. Design bot interaction flows around the @mention pattern in group spaces.
|
|
1077
|
+
|
|
1078
|
+
6. **Attachment action retrieval requires the original bot/user token.** Only the bot or user that posted the original card message can call `GET /attachment/actions/{id}` to retrieve the user's response. A different bot or user token gets 404.
|
|
1079
|
+
|
|
1080
|
+
7. **`Action.Submit` data vs. inputs.** The `data` object on `Action.Submit` is merged with the user's input values when retrieved via the attachment actions API. If a `data` key has the same name as an `Input` field `id`, the input value takes precedence. Use distinct key names to avoid collisions.
|
|
1081
|
+
|
|
1082
|
+
---
|
|
1083
|
+
|
|
1084
|
+
## 9. See Also
|
|
1085
|
+
|
|
1086
|
+
- [`messaging-spaces.md`](messaging-spaces.md) — Space and team CRUD, membership management, ECM, HDS
|
|
1087
|
+
- [`webhooks-events.md`](webhooks-events.md) — Webhook CRUD, event payloads, HMAC verification, telephony and messaging events
|
|
1088
|
+
- [`authentication.md`](authentication.md) — Token types, scopes, OAuth flows, bot token configuration
|
|
1089
|
+
- [Adaptive Cards Designer](https://adaptivecards.io/designer/) — Visual card builder (adaptivecards.io)
|
|
1090
|
+
- [Webex Buttons and Cards Designer](https://developer.webex.com/buttons-and-cards-designer) — Webex-specific card preview
|
|
1091
|
+
- [Webex Cards Guide](https://developer.webex.com/docs/buttons-and-cards) — Official Webex guide for supported elements and gaps
|