Using the Zoom API to deal with webinar panelists

In response to the pandemic my school is using Zoom Webinars for various performances. Our student Improv group has done a number of performances. The cast all need to be “panelists” in Zoom parlance, and when you duplicate a Webinar it does not duplicate the panelists. That’s a pain since there are a lot of panelists, and for each you need a name and e-mail address.

I finally got tired of dealing with it and spent a few minutes figuring out the Zoom API. If I ever have a little more time, I’ll make a Google Apps Manager (GAM) knock off that I’ll call ZAM! In the meantime, perhaps someone else will find this helpful.

First, Zoom has good documentation of its API. To start, you will need to build an app to get credentials. For my scripts, I’m using JSON Web Tokens (JWT) for authentication. I found this post in the Zoom Dev Forums helpful as a starting point.

Get information on a Zoom user

Here is a short Python script to get information on a user to give a little idea on how to use the API.

import jwt   # pip3 install pyjwt --user
import http.client
import datetime
import json
import sys

api_key = '********' # replace with credentials from
api_sec = '********' # your app in Zoom Marketplace

# generate JWT
payload = {
'iss': api_key,
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2)
}

jwt_encoded = str(jwt.encode(payload, api_sec), 'utf-8')


# call API: get user list
conn = http.client.HTTPSConnection("api.zoom.us")
headers = {
'authorization': "Bearer %s" % jwt_encoded,
'content-type': "application/json"
}
email = str(sys.argv[1])
conn.request("GET", "/v2/users/" +  email, headers=headers)
res = conn.getresponse()
response_string = res.read().decode('utf-8')

user_json = json.loads(response_string)
json_formatted_str = json.dumps(user_json, indent=2)
print(json_formatted_str)

You can use this like this:

# python3.7 zoom-user.py user@domain.com

{
  "id": "xxxxxxxxxxx",
  "first_name": "John",
  "last_name": "Smith",
  "email": "user@domain.com",
  "type": 2,
  "role_name": "Admin",
  "pmi": 111111111,
  "use_pmi": false,
  "personal_meeting_url": "https://myschool.zoom.us/j/111111111?pwd=UmVTASDFc3pXUTNpOFZNb34A09",
  "timezone": "America/Chicago",
  "verified": 0,
  "dept": "",
  "created_at": "2020-04-13T02:42:31Z",
  "last_login_time": "2020-05-22T19:38:06Z",
  "last_client_version": "4.6.20561.0413(mac)",
  "pic_url": "https://lh3.googleusercontent.com/a-/AOh14GgQadfagrA8l4U9fhsbZ1hOTMSvDxE3gGQ",
  "host_key": "111861",
  "jid": "3timqwabrvs00ayurhg_ha@xmpp.zoom.us",
  "group_ids": [
    "qCpDwoo5T1qS4cn8RSy8rQ"
  ],
  "im_group_ids": [],
  "account_id": "fhsbZ1cOTMSvDxE3g",
  "language": "en-US",
  "phone_country": "",
  "phone_number": "",
  "status": "active",
  "job_title": "",
  "location": ""
}

Note: I’ve redacted/change all of the ID and info above for obvious reasons.

Getting a list of all webinars panelists

This Python script lists all of the panelist names and email addresses.

import jwt   # pip3 install pyjwt --user
import http.client
import datetime
import json
import sys

api_key = '********' # replace with credentials from
api_sec = '********' # your app in Zoom Marketplace

# generate JWT
payload = {
'iss': api_key,
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2)
}

jwt_encoded = str(jwt.encode(payload, api_sec), 'utf-8')

# call API: get webinar panelists
conn = http.client.HTTPSConnection("api.zoom.us")
headers = {
'authorization': "Bearer %s" % jwt_encoded,
'content-type': "application/json"
}
webinarid = str(sys.argv[1])
conn.request("GET", "/v2/webinars/" + webinarid + "/panelists", headers=headers)
res = conn.getresponse()
response_string = res.read().decode('utf-8')
response_json = json.loads(response_string)

for panelist in response_json["panelists"]:
    print(panelist["name"],  panelist["email"])

Here is an example of the script in action listing panelists for webinar id 91119118113:

# python3.7 zoom-webinar-panelists.py 91119118113
John Smith jsmith@domain.com
Jane Smith jane.smith@anotherdomain.com

Adding Panelists to a Webinar

Next is a Python script to add a panelist to a webinar. It takes the webinar ID, panelist name and email address as parameters.

import jwt   # pip3 install pyjwt --user
import http.client
import datetime
import json
import sys

api_key = '********' # replace with credentials from
api_sec = '********' # your app in Zoom Marketplace

# generate JWT
payload = {
'iss': api_key,
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2)
}

jwt_encoded = str(jwt.encode(payload, api_sec), 'utf-8')

# call API: add panelist
conn = http.client.HTTPSConnection("api.zoom.us")
headers = {
'authorization': "Bearer %s" % jwt_encoded,
'content-type': "application/json"
}

num_arguments = len(sys.argv)-1
webinar = str(sys.argv[1])
email = sys.argv[num_arguments]
name = ""
i = 2
while i < num_arguments:
    name = name + sys.argv[i] + " "
    i = i+1
name = name.rstrip()
print(name, email,webinar)
body = "{\"panelists\":[{\"name\":\"" + name + "\",\"email\":\"" + email + "\"}]}"

webinar = str(sys.argv[1])
conn.request("POST", "/v2/webinars/" + webinar + "/panelists", body, headers=headers)
res = conn.getresponse()
response_string = res.read().decode('utf-8')

Here is an exampling of using the script to add “John Q. Public” john.q.public@domain.com to webinar id 91119118113:

python3.7 zoom-webinar-panelists-add.py 91119118113 John Q. Public john.q.public@domain.com

{"id":"91119118113","updated_at":"2020-05-25T23:25:22Z"}

Closing Thoughts

Using these ideas in these two scripts, I can easily copy panelists from one webinar to another. Hopefully this is enough to get you started using the Zoom API. As I mentioned at the start, I think it would be awesome to have a tool like GAM but for Zoom. I’d much rather manage Zoom from the command line.