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 thattrackingId, so the plugin keeps it on the error and appends it to the message rather than discarding it. The per-fielddescriptionis preferred over the summarymessage, 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
Linkheader. Webex returns{ items: [...] }and puts the next page in aLinkheader withrel="next", not a cursor in the body. Each list returns that URL asnextLink; pass it back asnextLinkto read the next page. The plugin only follows anextLinkonhttps://webexapis.comfor the same list, since the token is sent with it. maxcaps at 1,000. A larger value is rejected before the request rather than silently clamped.- A message list needs a room. Webex requires
roomId; addparentIdto read the replies in one thread of that room. - A message needs both a destination and content.
roomId,toPersonIdortoPersonEmailfor where, andtext,markdown,htmlor one file URL infilesfor what. Webex takes one file per message. - Updates send the required fields again. Webex requires
titleon a room update,roomIdplustextormarkdownon a message edit, andnameplustargetUrlon 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
secretis the HMAC key Webex signs deliveries with. It is the value worth capturing at creation, but it never reaches the event log: onlyhasSecretis recorded. status: 'active'turns a webhook back on after Webex disabled it for failed deliveries. Webex refusesinactive, 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.
isVoiceClipandcontentTypesay which kind a message is, rather than there being a separate resource.
- 28 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
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 inWhat’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.