# Test authentication (requires env vars set)
_token = get_zoom_token()
assert isinstance(_token, str) and len(_token) > 0zoom
This notebook provides utilities for downloading Zoom meeting transcripts:
- Authentication: Server-to-Server OAuth with Zoom API
- List recordings: Search recent meetings with recordings
- Download transcripts: Fetch VTT transcript files
- Batch operations: Download multiple transcripts in parallel
Key functions: - get_zoom_token(): Authenticate with Zoom using OAuth credentials - list_recordings(): List meetings with recordings from recent days - download_transcript(): Download transcript for a specific meeting - make_filename(): Generate safe filenames for transcripts
Authentication
Zoom’s Server-to-Server OAuth requires three credentials: - ZOOM_CLIENT_ID - Your app’s client ID - ZOOM_CLIENT_SECRET - Your app’s client secret - ZOOM_ACCOUNT_ID - Your Zoom account ID
Set these as environment variables or in a .env file.
get_zoom_token
def get_zoom_token(
)->str:
Get Zoom access token using Server-to-Server OAuth.
List Recordings
Search for meetings with recordings from the last N days. The API returns paginated results, so we fetch all pages.
list_recordings
def list_recordings(
days:int=45
)->list:
List meetings with recordings from the last N days.
# Test listing recordings
_meetings = list_recordings(days=45)
[m['topic'] for m in meetings][:2]["Hamel Husain's Personal Meeting Room", 'Jason and Hamel Husain']
Download Transcripts
Download the VTT transcript file for a specific meeting. Returns None if no transcript is available.
download_transcript
def download_transcript(
meeting_id:str, token:str
)->str | None:
Download transcript for a meeting ID.
# Test downloading a transcript
transcript = download_transcript(str(_meetings[1]['id']), _token)
len(transcript), transcript[:10](36933, 'WEBVTT\r\n\r\n')
Filename Generation
Generate safe, readable filenames for downloaded transcripts combining date, topic, and meeting ID.
make_filename
def make_filename(
meeting:dict
)->str:
Generate safe filename for a meeting transcript.
Here is how it works
[make_filename(m) for m in _meetings[:3]]['2025-11-07-Hamel-Husains-Personal-Meeting-Room-2878882507.vtt',
'2025-11-06-Jason-and-Hamel-Husain-81703724721.vtt',
'2025-11-06-Jason-and-Hamel-Husain-81703724721.vtt']
CLI Interface
Command-line interface for downloading Zoom transcripts with multiple modes: - Direct download by meeting ID - Search and select meetings interactively - Batch download all matching meetings
main
def main(
meeting_id:str=<typer.models.ArgumentInfo object at 0x7f008af22de0>,
search:str=<typer.models.OptionInfo object at 0x7f008af206e0>,
days:int=<typer.models.OptionInfo object at 0x7f008af22fc0>,
output:Path=<typer.models.OptionInfo object at 0x7f008af22f30>
):
Download Zoom meeting transcripts.
Examples: zoom.py 123456789 # Print to stdout (pipe to other tools) zoom.py 123456789 -o file.vtt # Download to file zoom.py -s “Jason” # Search, select one or ‘a’ for all zoom.py -s “” # List all meetings