Perhaps this could also be titled “Covid: two years after meeting platforms got the biggest test of their lives”.

Zoom saw 3300% growth in annual meeting minutes reported in October 2020. The simplification of it all is refreshing and they will continue to have a place in the workforce.

Enterprise customers are planning for the long term and even with a strong job market, offices continue to close, and buildings are sold off to be turned into luxury apartments. These customers want extensibility over simplicity.

Slightly more feature rich and extensible comes Cisco WebEx, which had been investing in developer relations, partner training and api evangelist marketing campaigns for years.

Whichever platform used, here are five trends observed from the field:

Bulk Scheduling

With the growth in online meetings, so too has the burden of scheduling. From education to corporate events and trainings to tele-justice and public services; customers have utilized APIs from both Microsoft Graph and Cisco Webex to read and write calendars and send meeting invites. Customers have even integrated business and marketing platforms like Brightspace and Workday.

For more complex multiparty scheduling, Microsoft Booking’s API is a great standalone service that can untether you to the platforms scheduling limitations by easily being incorporated into a custom built application or workflow.


With growth in active users comes increased ticket count in the help desk, which I still believe has the most potential, and is he best start for any organization looking to automate business processes.

User account provisioning, onboarding, and entitlement updates can all be accomplished through APIs and a simple form in a browser.

Things like scheduling rights can be read from active directory or Azure AD and applied as a scheduled task using my favorite: Eventbridge + Lambda.

Speaking of scheduled tasks, one downfall of the WebEx APIs is that some backend processes require authentication using an interactive Oauth flow as opposed to Microsoft Graph APIs administrative consent option. A workaround that I’ve found is to do a one time Oauth login in a browser using David Staudt’s webexteams-auth-sample repository on GitHub. After obtaining the access token and refresh token, I place it in DynamoDB with the client id and use Eventbridge + Lambda to keep it “fresh”

At the beginning of the pandemic when schools made last minute decisions to go online-only, virtual classrooms using teams and meetings platforms had to be spun up practically overnight. With the teacher-class-student-parent relationships already in a backend database, these classrooms could be setup automatically and kept in sync.

Conferences that were forced to pivot to a virtual model could utilize signups in Google Sheets or Microsoft Excel to create online events.

Adoption of teams platforms increased as people worked from home, and organizations needed to quickly rollout spaces for different communication circles. For this, distribution lists could be synced to spaces in real time using Microsoft Graph Subscriptions API.


With the ability to show not only who joined a meeting, and who stayed the whole time, WebEx can tell who paid attention by checking if the window was minimized or in the background. This is useful for corporate learning where sessions are graded. Polls and Q&A can also be collected and aggregated, along with tracking codes and other metadata, ready for be displayed in a Power Bi, Tableau or Domo dashboard.

At last years Devnet Create, I gave a talk called “Don’t Let Your Data Go To Waste: AI/ML Applications for Webex” which was all about observability of the workplace to show trends of positive and negative words from teams messages and meeting transcriptions. This event data can be piped into libraries like NLTK, SciKit-Learn and SciPy to train and classify the data, or for a quick pre-learned model, AWS Comprehend.

Governance and Compliance

Whether a company requires all conversations involving certain users to be archived, or a K-12 school wants any conversations which may violate the honor code, or inappropriate conversations to alert administration, organizations understand that control of information is important.

With the proper compliance officer roles in WebEx APIs, events can be pulled into an indexed database with a simple search engine web page.

Recordings and transcriptions of all users can also be downloaded in bulk with an admin account using the WebEx APIs. Once archived, the user can only delete their copy.

While controls are in place in Webex Control hub to whitelist messaging to certain domains, sometimes more granular controls are required for different business units. Compliance roles can be used to listen for join events and allow or remove users based on email or domain at the team or space level rather for an entire organization.


Whether it’s a legal requirement that the public have access to hearings – which may still mandate social distancing, or corporate earnings calls and marketing events, being able to live stream is gaining a lot of traction.

WebEx and Zoom both have a limited number of “Top Shelf” streaming integrations such as Vbrick, IBM, YouTube and Facebook, but any RTMP/RTMPS is supported using a URL and Authentication Key.

Using Amazon IVS (interactive video service), Cloudfront, S3 and the VideoJS library, streaming resources can be created, ingested and multiplexed out to the internet using minimal corporate bandwidth.

Using tools like OBS (Open Broadcaster Software), streams can be first ingested in real time editing software to add labels, secondary audio sources, switch between video feeds, or add picture-in-picture to your online event.

Webex Teams recently released support for Adaptive Cards, which allow the user to interact with a teams user (typically a bot) without leaving the page. This is great for taking quick polls, and also piping data from other applications like help desk, travel and expenses, crm, etc.

I love that Cisco adopted the Microsoft standard for Adaptive Cards instead of trying to create their own unnecessarily. The website, has great documentation, and a designer to help get started. There is an author sdk as well, but I find that using a templating system such as Jinja2 does the job without learning anything new.

I teach a class at our companywide conference every year called UC Automation, and I thought what a better way to teach about Buttons and Cards (aka Adaptive Cards) than by using it in the class itself. A month prior to the conference, I sent a poll to everyone that registered so they could pick the topics they want to hear about most.

UC Automation: Drinking From the Firehose

To use Adaptive Cards in Webex Teams, I created an example in 🐍Python

First install prerequisites:

pip install requests
pip install webexteamssdk
pip install flask

brew install ngrok
ngrok http 3000


import json
import os
import requests
from webexteamssdk import WebexTeamAPI, ApiError
from flask import Flask, request
app = Flask(__name__)

For prototyping, we use ngrok.
We'll request the tunnel and parse the url to use for a webhook
tunnel = json.loads(
  requests.request('GET', url = 'http://localhost:4040/api/tunnels'
public_url = tunnel['tunnels'][0]['public_url']

Specify the webex token and roomId to use
token = os.environ['token']
roomId = os.environ['roomId']

Using webexteamssdk but also need requests
for attachment action endpoint which is not in sdk yet!
wbx = WebexTeamsAPI(access_token = token)
headers = {
  'Authorization': 'Bearer ' + token

Register webhook to ngrok for attachmentActions
for webhook in wbx.webhooks.list():

  name = 'Development - ngrok',
  targetUrl = public_url,
  resource = 'attachmentActions',
  event = 'created'

Paste Card from to a file named card.json 
attachments = []
attachment = {}
attachment['contentType'] = "application/"
attachment['content'] = json.loads(open('card.json').read())

Send Message
  roomId = roomId, 
  markdown = '.', 
  attachments = attachments

Receive Data in Webhook and Request Action Payload
@app.route('/', methods = ['POST'])
def index():
  action = request.json['data']['id']
  results = requests.request('GET',
  headers = headers,
  url = f '{wbx.base_url}attachment/actions/{action}'
  return ('', 200, None)

if __name__ == '__main__': = 3000, use_reloader = True)

Just like with the messages webhook resource, the payload does not include the data, but rather an action id that is used along with the token to retrieve the data, shown below:

{'created': '2019-11-08T21:47:14.436Z',
 'id': 'asdfasdfasdfasdf',
 'inputs': {
  'comments': 'Here’s a great idea.  Get a real job!'
 'messageId': 'qwerqwerqwerqwerqwerqwer',
 'personId': 'fghjfghjfghjfghjfghjfghj',
 'roomId': 'vbnmbnmvbnmvbnmvbnmvbnm',
 'type': 'submit'}

For my UC Automation class, I stored the results in AWS. Below is a fun script to gather the results and display them with emojis.

from boto3 import *
table = resource('dynamodb').Table('count')

results = table.get_item(Key={'use': 'uc250'})
results = rd.replace_decimals(results['Item'])
del results['use']
results = list(results.items())

for topic in results:
    chart = 😎
    for i in range(0, int(topic[1])):
        chart = chart+'😎 '
    print(topic[0]+': '+chart)

$ python

expressway: 😎 😎 😎 😎 
guest: 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 
cucm: 😎 😎 😎 😎 😎 😎 😎 
buttons: 😎 😎 😎 😎 😎 
admin: 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 😎 
xapi: 😎 😎 😎 
browser: 😎 😎 
curri: 😎 😎  
cms: 😎 
meetings: 😎 😎 😎 

Apart from sharing URIs and Patterns between clusters, ILS naturally shares UDS data, including home cluster.

In the example below, only a single _cisco-uds._tcp record can exist due to a shared dns zone, however using feature group templates to control the home cluster setting means the user will be “found” and home cluster information will be relayed with the request so the client finds it’s home.

I was asked to help come up with a Proof of Concept using DNA Center APIs for Cisco Live 2018. After a few days in the sandbox, my group decided on an app that gives granular data on power usage using energy wise along with actionable outcomes.

Along with granular cost analysis per IDF, per switch or per port, there is an included calculator for instant cost-benefit analysis. For instance, it takes 7.85kWh or $0.83/mo to power a Cisco 9971 phone but only 2.52kWh or $0.27 to power a newer, more efficient Cisco 8841 phone. At a cost of $250 per, over the span of 10 years, replacing 1,000 phones save $68,133 in power savings alone!

Since I didn’t think I could sit at my first Cisco Live and work a booth talking about charts all day, I decided to add a little “pizazz”. I made a IP Phone app that enrolls your desk phone to your cell phone as a paired device. Typically energy wise is smart enough to turn off your phones screen after 5PM or on the weekends, but with Meraki Scanning API and a location-aware network, phones (and other devices) can turn off and on as needed. Think of a stadium full of APs – leaving a couple on for probing new users and lighting up more as needed!

Pro Tip: When using Meraki Scanning API at an event like Cisco Live with 30,000 people, you may want to tune the power down on the AP, or be ready to re write the body-parser library to handle more throughput and to clean your laptop hard drive every 30 minutes 🙂

Camp Create is a part of Cisco’s DevNet Create conference and each year they pick about 30 people in groups of 5 and assign a topic. Think of it like a hackathon with some constraints to work with and a coach to guide you.

Since my wife is a teacher, I decided to pick the Education track, and our app “Roll Call” solved the challenge of both: taking roll, and gathering assignments through Cisco Spark and Cisco Meraki APIs.

Having worked with the Cisco Spark APIs, I took on making a bot that serves as the front end to gather assignments and take roll, but also guided the group around the design to make sure everything came together.

One of our group members did a talk on Microsoft’s Face API, and had the idea to use facial recognition to sign onto the WiFi. To track the user to the classroom, Meraki’s Scanning API sends the Device MAC address to a database that stores only the last 10 minutes, and flags those students as “online”

Once the bones were in place, taking roll and asking for assignments was simple.

When you change your dogs food, they get sick all over the place, they just can’t stomach change. As an IT professional, the dog food we know and love changes frequently.. The technology you spent all that time learning about last year is obsolete.

Don’t get mad, adapt! As a collaboration engineer, my title didn’t exist 20 years ago. During the TDM to VoIP migration, analog teleco guys were forced to adapt or find new work. When virtualization came on the map, the ability for one person to manage hundreds of servers meant that the early adopters got a new title and quite possibly a pay raise, while the ones late to the game found themselves no longer needed.

This blog is adapting, too. Let me throw out a few buzzwords: API, IoT, REST. Knowing what they mean and why they are important might save you from being the next casualty of change. It’s about asking more from technology. People don’t expect their GPS to just give them directions anymore. They want voice navigation with social networking that tells you where the cops are hiding, and they want it to predict when you’re leaving to go to work and tell you how to traffic is. From a development perspective, the GPS apps with the most APIs get the most love, and almost everything is OPEN, meaning you or I could “tap” into that technology, helping both parties.

I recently gave a presentation on coding along with the CTO of the company, Vinu Thomas. One of the points he made that really stuck was this: try to automate your own job. If you’re smart enough to do that, I promise you’ll be just fine.

I started asking during phone migrations: why do I have to tell the router what the new phone’s mac address is, if the switch already knows? Why can’t the switch and the router work this out between themselves ? Why do call center agents have to login to their phone every day if they also login to their computers ? I think we’re almost there, if not already. Both of these use cases: extension mobility and ios-xe have APIs. So do yourself a favor, hang in there, and learn Python.. or Ruby or my favorite: Node.js