Skip to main content
Use Webex through Corsair: one client, typed API calls. Create a bot in the Webex developer portal and use its access token, or a personal access token for a quick test. A personal access token expires 12 hours after it is issued; a bot token does not, so use a bot for anything that runs unattended. The bot only sees spaces it has been added to. The token goes in Authorization: Bearer and every call is against https://webexapis.com/v1.
  • Errors carry a trackingId, not a code. A failure is { message, errors: [{ description }], trackingId }. Cisco support asks for that trackingId, so the plugin keeps it on the error and appends it to the message rather than discarding it. The per-field description is preferred over the summary message, because it says which field failed.
  • 401 and 403 mean different things. A 401 is a missing, expired or revoked token; a 403 is a working token without the scope for this call. The plugin maps them to an auth error and a permission error respectively, since only the first needs a new credential.
  • Lists page by a Link header. Webex returns { items: [...] } and puts the next page in a Link header with rel="next", not a cursor in the body. Each list returns that URL as nextLink; pass it back as nextLink to read the next page. The plugin only follows a nextLink on https://webexapis.com for the same list, since the token is sent with it.
  • max caps at 1,000. A larger value is rejected before the request rather than silently clamped.
  • A message list needs a room. Webex requires roomId; add parentId to read the replies in one thread of that room.
  • A message needs both a destination and content. roomId, toPersonId or toPersonEmail for where, and text, markdown, html or one file URL in files for what. Webex takes one file per message.
  • Updates send the required fields again. Webex requires title on a room update, roomId plus text or markdown on a message edit, and name plus targetUrl on a webhook update, even when they do not change. A message can be edited at most 10 times, and a message with a file cannot be edited.
  • A webhook’s secret is the HMAC key Webex signs deliveries with. It is the value worth capturing at creation, but it never reaches the event log: only hasSecret is recorded.
  • status: 'active' turns a webhook back on after Webex disabled it for failed deliveries. Webex refuses inactive, so delete a webhook to stop it.
  • A bot sees only what it is part of. It lists the spaces it was added to, and in a group space it can list only the messages that mention it (mentionedPeople: 'me'); listing the whole space answers 403.
  • Deletes answer 204 with no body, so each one states what it did rather than returning an empty object.
  • A voice clip and a transcript are both message objects. isVoiceClip and contentType say which kind a message is, rather than there being a separate resource.
What you get:
  • 28 typed API operations

Setup

1

Install

2

Add the plugin

corsair.ts
With multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

4

Connect a tenant

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.

Example API calls

List the spaces you are in
Post a message to a space
See the full list on the API page.

What’s next

API reference

Every webex.api.* operation with input and output types.

Connect / OAuth

createLink, Hub delivery, and tenant connect flows.

Use with agents

Expose this plugin’s operations as MCP tools.