Fetches the transcript from a password-protected Zoom cloud recording, even when you're not the meeting host and Zoom blocks the normal transcript export.
Zoom lets a meeting host download a recording's transcript as a .vtt file. If you were a participant but not the host, Zoom shows you the full transcript live in the recording page's "Audio Transcript" panel — but gives you no way to export it.
This tool drives a real (headless) browser to the recording's share URL, submits the passcode, and reconstructs a standards-compliant WebVTT file from what's rendered in the "Audio Transcript" panel — the same content you'd see and could laboriously copy-paste by hand, just automated and with correct speaker/timestamp structure preserved.
It only accesses recordings you're already authorized to view (you provide the real passcode) — it doesn't bypass, guess, or brute-force anything.
Requires pipx (installs Python CLI tools into isolated environments, not your system Python):
brew install pipx # if you don't already have itClone and install:
git clone git@github.com:jimloco/zoom-transcript-scraper.git
pipx install ./zoom-transcript-scraperThis puts a zoom-transcript-scraper command on your PATH (in ~/.local/bin), usable from any directory — no poetry needed afterward.
One-time browser setup (Playwright needs its own Chromium binary, separate from any browser you have installed). Use the playwright executable pipx placed inside the tool's own isolated venv — a bare python3 -m playwright won't work, since Playwright isn't installed on your system Python:
~/.local/pipx/venvs/zoom-transcript-scraper/bin/playwright install chromiumBehind a corporate TLS-inspecting proxy (e.g. ZScaler)? Both
pipx installandplaywright install chromiumcan fail with a certificate error, because they use their own bundled TLS stacks instead of your OS trust store. Fixes:
pipx install: prefix withUV_NATIVE_TLS=1playwright install chromium: export the macOS Keychain to a PEM and point Node at it:security find-certificate -a -p /Library/Keychains/System.keychain > /tmp/roots.pem security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> /tmp/roots.pem NODE_EXTRA_CA_CERTS=/tmp/roots.pem ~/.local/pipx/venvs/zoom-transcript-scraper/bin/playwright install chromium rm -f /tmp/roots.pem
pipx install copies the code into its own isolated venv, so it won't pick up source edits automatically:
pipx install ./zoom-transcript-scraper --forcezoom-transcript-scraper --url "<zoom recording share URL>" --password "<passcode>"The .vtt file is written to the current directory by default. Example:
zoom-transcript-scraper \
--url "https://your-company.zoom.us/rec/share/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
--password "abc123" \
--output-dir ~/DownloadsProgress is printed to stderr as it runs (opening the page, submitting the passcode, waiting for the transcript panel, scraping entries); the final output path is printed to stdout on success.
| Flag | Required | Description |
|---|---|---|
--url |
yes | Zoom recording share URL |
--password |
yes | Recording passcode |
--output-dir |
no (default: .) |
Where to write the .vtt file (and --inspect artifacts, if used) |
--debug |
no | Run with a visible browser window instead of headless, for manual inspection |
--inspect |
no | Dump the page's DOM, network responses, console log, and a screenshot to <output-dir>/inspect_<timestamp>/ — useful if Zoom changes its page and something breaks |
The output filename follows Zoom's own recording-export naming convention, derived from the recording's true UTC start time (not the ambiguous, timezone-less local-time label shown on the page):
GMT{YYYYMMDD}-{HHMMSS}_Recording.transcript.vtt
| Message | Meaning |
|---|---|
Zoom rejected the provided recording passcode... |
Wrong passcode — double check it |
Timed out waiting for the transcript panel to render. |
The page didn't load as expected in time; try --debug --inspect to see what happened |
This recording has no transcript available. |
The recording exists but has no transcript to fetch |
Could not determine the recording's true UTC start time. |
Zoom's metadata API response wasn't captured; usually transient — retry |
A Claude Code skill at ~/.claude/skills/zoom-transcript/SKILL.md lets Claude fetch transcripts on your behalf — just share a recording URL and passcode in conversation. It self-installs this tool via pipx the first time it's used if the command isn't already on your PATH.
- One recording per run (no batch mode)
- Passcode-only auth (no Zoom account/SSO login flow)
- No GUI, no packaging/distribution beyond local
pipx install
See docs/ for the full project charter, requirements, functional spec, and implementation spec.
This project uses Poetry (not pipx) for local development — dependency management, tests, and linting:
poetry install
poetry run playwright install chromium
poetry run pytest # tests
poetry run pylint src/zoom_transcript_scraper # must stay at 10.00/10
poetry run tox # full CI-equivalent checkRun the CLI locally during development without a global install:
poetry run zoom-transcript-scraper --url "..." --password "..."poetry install can silently install into the wrong (shared, non-isolated) Python interpreter if Poetry itself was installed via plain pip install poetry into a project-reachable Python. After the first poetry install on a fresh clone, verify isolation actually worked:
poetry env info --path
poetry run python -c "import sys; print(sys.prefix != sys.base_prefix)"The second command must print True. If it prints False, or the env path points at a shared Homebrew/system Python rather than something under .venv/, see workflow/actions/python-project-setup-workflow.md in the ai-native-development framework repo for the fix (reinstall Poetry itself via pipx).