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