Webex · AsyncAPI Specification
Review
Version
View Spec
View on GitHub
CallingCollaborationCommunicationEnterpriseMessagingVideo ConferencingAsyncAPIWebhooksEvents
AsyncAPI Specification
aid: webex:asyncapi-review
name: Cisco Webex AsyncAPI Review
kind: review
date: '2026-05-29'
reviewer: API Evangelist
subject: Cisco Webex public WebSocket / event-driven API surface
verdict: no-public-websocket-api
summary: >-
Cisco Webex does not expose a documented, public WebSocket endpoint for the
core Webex platform (Messaging, Meetings, Calling, Devices, Admin) that
developers are expected to connect to directly. The Webex Developer Portal at
developer.webex.com documents event delivery exclusively as HTTP webhooks
(resource/event filters such as messages:created, memberships:updated,
rooms:updated, attachmentActions:created, meetings:started, telephony events,
etc.) signed and validated via a per-webhook secret. The Webex JavaScript SDK
and Node bot frameworks (webex-node-bot-framework, webex-js-sdk) can listen
for events over a WebSocket transport, but that transport is the internal
"Mercury" connection (host pattern wss://mercury-connection-a.wbx2.com/...,
with sessionId-scoped subscriptions, KMS-encrypted payloads, and rotating
registration URLs) which is NOT published as a public protocol on
developer.webex.com. Cisco's own developer blog "Using Websockets with the
Webex JavaScript SDK" frames the capability as an SDK convenience, not as a
WebSocket API contract: developers call webex.[resource].listen() and
on(event) rather than opening a socket. Webex Contact Center
(developer.webex-cx.com) does document a Subscribe Notification WebSocket
API, but it is a separate product, the wss:// URL is generated per
subscription (not a fixed published endpoint), and it is outside the scope
requested for this review (core Webex Webhooks / Devices / Calling /
Messaging / Mercury). Because there is no documented, fixed, public wss://
endpoint for the core Webex platform, no documented WebSocket message
schema, and no documented WebSocket auth / subprotocol contract for direct
client use, an AsyncAPI 2.6 spec that faithfully describes a Webex-hosted
channel cannot be produced without fabrication. An AsyncAPI 2.6 spec was
therefore NOT generated.
findings:
- id: webhooks-are-the-documented-event-channel
label: Documented Webex event delivery is HTTP webhooks
detail: >-
The Webex Webhooks guide and /v1/webhooks REST endpoints describe a
classic POST-callback model. Developers create a webhook with a name,
targetUrl, resource (messages, memberships, rooms, attachmentActions,
meetings, recordings, telephony_calls, etc.), event (created, updated,
deleted, started, ended), optional filter expression, and a secret used
to compute an X-Spark-Signature HMAC-SHA1 over the request body. This is
a request/response webhook contract better expressed as OpenAPI callbacks
or AsyncAPI's HTTP binding, not a WebSocket binding.
documented_resources_events:
- messages:created
- messages:deleted
- memberships:created
- memberships:updated
- memberships:deleted
- rooms:created
- rooms:updated
- attachmentActions:created
- meetings:started
- meetings:ended
- recordings:created
- telephony_calls (call lifecycle resource)
- id: mercury-is-internal-undocumented
label: Mercury WebSocket is an internal, undocumented transport
detail: >-
Mercury is Cisco's internal pub/sub WebSocket fabric used by Webex
clients and the official SDKs (see @webex/internal-plugin-mercury on
npm, and webex-js-sdk source). Observed registration URLs follow the
pattern wss://mercury-connection-a.wbx2.com/v1/apps/wx2/registrations/
{id}/messages with sessionId-scoped subscriptions, but neither the URL,
handshake, frame schema, KMS key exchange, nor lifecycle is published as
a stable public API on developer.webex.com. The npm package name itself
is namespaced "@webex/internal-plugin-*". Per the project's hard rule
against fabrication, Mercury must not be modeled as a public AsyncAPI
channel.
- id: js-sdk-websockets-are-sdk-sugar
label: "Webex JS SDK websockets are SDK sugar over Mercury"
detail: >-
The developer blog "Using Websockets with the Webex JavaScript SDK"
(developer.webex.com/blog/using-websockets-with-the-webex-javascript-sdk)
shows webex.memberships.listen(), webex.rooms.listen(),
webex.messages.listen(), and webex.attachmentActions.listen() followed by
on('created'|'updated'|'deleted') handlers. The post is explicit that
"websockets are created programmatically with the help of the JavaScript
SDK" - i.e. the contract is the SDK surface, not a documented wire
protocol. There is no published wss:// URL, no documented authentication
handshake (beyond reusing the OAuth access token through the SDK), and
no documented frame schema for third-party WebSocket clients.
- id: devices-xapi-uses-rest-and-websocket-via-roomos
label: Devices xAPI is documented over HTTPS / RoomOS, not as a public Webex WS
detail: >-
Webex Device xAPI (developer.webex.com/docs/api/v1/xapi) exposes
RoomOS device commands and status via REST endpoints /v1/xapi/command
and /v1/xapi/status, plus device-side JSON-RPC. RoomOS itself supports
direct device WebSocket / SSH access on the local device for on-prem
integrations, but that is a device-local interface, not a Webex-cloud
WebSocket endpoint, and is documented as part of RoomOS xAPI, not as a
cloud WS API. It is not modelable as a single Webex-hosted AsyncAPI
channel.
- id: calling-events-are-webhooks
label: Webex Calling lifecycle events are delivered via webhooks
detail: >-
Webex Calling exposes telephony events (call answered, call ended,
voicemail, etc.) through the same /v1/webhooks pipeline using the
telephony_calls resource family and via Webhooks for Webex Calling user
events. No documented public WebSocket channel exists for direct
subscription to calling events.
- id: contact-center-ws-is-separate-product
label: Webex Contact Center WebSocket API is documented but out of scope
detail: >-
developer.webex-cx.com documents a Subscribe Notification API that, after
registration, returns a per-subscription wss:// URL used for Agent
Login / Logout / State Change and related agent desktop events. This
surface is a separate product (Webex Contact Center / WxCC), the wss
URL is dynamically issued per subscription rather than a fixed published
endpoint, and the task explicitly scoped the review to "Webhooks, Devices,
Calling, Messaging, WS / Cloud Resources Layer / Mercury" on the core
Webex platform. If desired, WxCC could be reviewed separately and may
warrant its own AsyncAPI 2.6 spec on the Contact Center repo.
pages_checked:
- url: https://developer.webex.com/
result: Webex Developer landing page. Navigation lists Messaging, Meetings,
Calling, Devices, Webhooks, Bots, Embedded Apps, Admin, Authentication,
Contact Center, Instant Connect, Agentic Apps. No dedicated WebSocket /
Mercury / Streaming section.
- url: https://developer.webex.com/docs
result: Getting Started hub. WebSocket / persistent connection is not a
top-level documented section for the core platform.
- url: https://developer.webex.com/docs/api/v1/webhooks
result: REST endpoints for /v1/webhooks (Create, List, Get, Update, Delete).
Documents resource, event, filter, targetUrl, secret, status fields and
X-Spark-Signature HMAC-SHA1 verification. No WebSocket alternative.
- url: https://developer.webex.com/docs/api/guides/webhooks
result: Webhooks guide. Confirms HTTP POST delivery model with signed
payloads as the standard event channel.
- url: https://developer.webex.com/blog/using-websockets-with-the-webex-javascript-sdk
result: Blog post showing webex.[resource].listen() + on('created'|...) in
the Webex JS SDK. Frames websockets as an SDK convenience; no public
wss:// URL, handshake, or message schema is published. Implementation
is delegated to the SDK, which internally uses Mercury.
- url: https://developer.webex.com/docs/api/v1/xapi
result: Devices xAPI documented as REST /v1/xapi/command and /v1/xapi/status,
with RoomOS JSON-RPC on-device for local integrations. No Webex-cloud WS
endpoint.
- url: https://www.npmjs.com/package/@webex/internal-plugin-mercury
result: npm package name explicitly marked "internal-plugin". Confirms
Mercury is internal SDK plumbing, not a public protocol.
- url: https://developer.webex-cx.com/
result: Separate Contact Center developer portal. Documents Subscribe
Notification API that returns a per-subscription wss:// URL for agent
desktop events. Out of scope for this core Webex review.
recommendation: >-
Continue documenting Cisco Webex's core eventing surface as HTTP webhooks
(apis.yml already references the webhooks endpoints in OpenAPI). Do NOT
publish an AsyncAPI 2.6 spec for Mercury or for the JS SDK websocket
convenience - Mercury is internal, undocumented, and subject to change
without notice. If Cisco later promotes a public, documented wss:// endpoint
on developer.webex.com (for example a public Mercury successor, or a stable
streaming API for Calling / Messaging / Devices), revisit and produce an
AsyncAPI 2.6 spec at that time. Separately, consider reviewing Webex Contact
Center (developer.webex-cx.com) Subscribe Notification API for a dedicated
WxCC AsyncAPI spec under a Contact Center scope.
artifacts_produced:
spec: null
review: asyncapi/review.yml