# Changelog of Zoom Scraper | 🎥Downloader & 📄 Transcript (`dz_omar/zoom-scraper`) Actor

- **URL**: https://apify.com/dz\_omar/zoom-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/dz\_omar/zoom-scraper.md

## Changelog

All notable changes to the Zoom Scraper actor are documented here.

### \[2.0.0] — 2026-08-30

A correctness release. Three of these were silently producing wrong or missing
results rather than errors, so a run could look successful and still be unusable.

#### Fixed

- **Subtitle files are now valid.** Every transcript exported for a Zoom Clip ended
  each cue at `00:00:00,000`, because the clip transcript names its end time
  differently from a cloud recording's and only one of the two names was
  recognised. Media players reject a cue that ends before it starts, so every
  Clips SRT and VTT the actor produced was unusable as a subtitle file. Transcript
  timing is now read from any of the shapes Zoom returns, normalised, and — where a
  source genuinely provides no end time — estimated from the segment and clamped so
  cues never overlap.

- **Government recordings (`zoomgov.com`) are supported.** Recordings hosted on
  government tenants — agencies, courts, city councils, public hearings — were
  rejected before anything was requested, and would have failed anyway because the
  recording lookup was always sent to the commercial domain. Both are fixed:
  government and vanity subdomains are recognised, and each recording is looked up
  on its own host.

- **The recording you linked is the one you get.** On a replay page holding several
  recordings ("Total 2 Recordings"), selecting the second one still returned the
  first one's video and transcript. The recording is now identified from the link
  you paste, falling back to the page only when the link does not carry one.

- **Meeting join links are no longer treated as recordings.** `zoom.us/j/…`,
  `/w/…`, `/my/…` and similar were accepted as recordings and fetched pointlessly
  before failing with a confusing message. They are now reported immediately as not
  being recording links. Lookalike hostnames (`notzoom.us.evil.com`) are rejected
  outright.

- **Speaker names are kept on clips.** Clips label speakers differently from cloud
  recordings; those labels were being dropped.

- **Newer Zoom Events links work.** Event links that carry the session in a query
  parameter are now read, alongside the older path-based form.

- **Recorded-at timestamps no longer shift by timezone.** Clip timestamps were
  converted to a local-format string and parsed back, which moved the value
  depending on where the run executed. The original timestamp is preserved.

- **Clip length is reported correctly** (it was being divided by 1000 and reported
  as zero).

- **An interrupted run resumes for real.** Progress was written to storage that the
  platform clears on every restart, so a resumed run always began again from the
  first link. It is now written somewhere that survives.

- **A single unexpected error no longer kills the run.** An unhandled rejection
  terminated the process immediately, discarding results already extracted and
  marking the run failed.

#### Changed

- **Every submitted link now returns a row.** Previously only successful links
  appeared in the results and anything else vanished, which made a partly-working
  run indistinguishable from a broken one. Each row carries a `status`
  (`success`, `partial_success`, `failed`, `skipped`), and a plain-language `error`
  explaining anything that did not work.

- **Clearer result fields.** `Title` is now `title`; `duration`,
  `duration_seconds`, `source_size_mb`, `video_name`, `video_downloaded`,
  `has_transcript` and `transcript_info.segment_count` are new; every row carries
  `_source` and `source_url`. A new **Overview** dataset view summarises a run at a
  glance.

- **A link that is not a Zoom recording ends the run successfully**, with a row
  explaining what was wrong, instead of counting as an actor failure.

- **Requests fail fast when a recording is genuinely gone.** A definitive refusal
  from Zoom is no longer retried three times before reporting the same answer.

- **Video transfers are sized from a measurement of the actual file**, so a run
  requests the memory and time it needs rather than a fixed maximum.

#### Known limitations

- **Passcode-protected and sign-in-required recordings cannot be read.** The actor
  has no browser session of yours, so a recording that prompts for a passcode in a
  browser returns `failed`. Most `/rec/` share links are protected this way.
- Zoom Events extraction is unchanged in behaviour beyond the link-format fix above;
  it could not be re-verified end to end against a live accessible event session.

### \[1.0.0] — 2025-08-11

- Initial release: cloud recordings, Zoom Events, and Zoom Clips; video download to
  storage; transcripts in SRT, VTT, TXT and XML.
