# Changelog of Telegram Channel Scraper (`viremo-labs/telegram-channel-scraper`) Actor

- **URL**: https://apify.com/viremo-labs/telegram-channel-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/viremo-labs/telegram-channel-scraper.md

## Telegram Channel Scraper changelog

### 2026-10-25 — normalizer 1.2.3, actual voice-player duration

- Widget voice duration now reads the current `tgme_widget_message_voice_duration` class as well as the legacy selector. A public same-post voice witness exposed the missing duration despite a valid voice URL.
- Dataset keys, monitor text hashes/baselines and billing catalog are unchanged.

### 2026-10-25 — normalizer 1.2.2, rare-media gap audit

- Widget sticker URLs now include animated `.tgs` and video sticker media when exposed by the public page; data-URI placeholder images are not exported as file URLs.
- Sticker and round-message video elements are no longer also classified as regular videos. Round-message presence does not require an available thumbnail.
- MTProto story mapping excludes deleted/skipped/unrecognized story placeholders instead of producing empty story rows.
- Record keys and dataset contract remain `1.2.0`; media downloads, voting, joining and story view marking are not introduced.

### 2026-10-25 — normalizer 1.2.1, diverse-source field audit

- Widget `maxPosts` now selects the newest posts on each page before traversing older pages. Previously a small limit could select the oldest cards on the latest page.
- Widget date filters now compare normalized UTC days, matching MTProto.
- Exact widget post URLs also apply UTC-day filters, exclude undated posts from date-bound requests and surface parse diagnostics in the run summary.
- Forwarded channel display names use the chats already returned by MTProto when no explicit forwarded-from name is present. No extra identity lookup is made.
- Document/sticker image dimensions are preserved from `DocumentAttributeImageSize`.
- Widget text keeps visible word separators at `<br>` and block boundaries instead of joining adjacent words.
- Existing four-character public usernames are accepted in channel inputs, post URLs, mentions and related links.
- MTProto refuses standalone group history before fetching it; topic discovery excludes megagroups, matching the documented public-channel scope.
- Legacy widget baseline text gets a one-time separator-only alignment without a paid edit event. Real whitespace-only edits on that migration scan are indistinguishable; later scans use the new per-message marker. The marker stays internal.
- Dataset shape remains contract `1.2.0`. Monitor baselines are not silently reset; corrected windows can contain newly observed, billable message IDs.

### 2026-10-24 — automation contract 1.2.0

- Added opt-in `monitorOutput: "changes"`: initial baseline window, then only new/text-edited messages, with channel context retained. Switching projection does not reset baseline or change prices.
- Added `changedChannelFields` for semantic title, description, badge and discussion changes, independent of message fingerprints.
- Removed paid pseudo-change events caused solely by old posts leaving the observed window.
- Unreliable scans retain prior message IDs within a bounded window to avoid rebilling temporarily missing cards on recovery.

### 2026-10-24 — extraction reliability, normalizer 1.1.1

- Fixed MTProto `postUrls` serialization: exact IDs use `InputMessageID` objects.
- Fixed history pagination when source pages contain service/empty messages; stalled cursors report partial coverage.
- Matched poll vote totals by opaque binary option IDs, not lossy UTF-8 decoding.
- Preserved exposed forward-origin usernames from Telegram's existing response metadata.
- Corrected decimal-comma compact counters such as `1,2K` and existing empty-channel classification.
- MTProto date-window filtering now excludes undated messages consistently with widget mode.
- Flood waits are respected without rotating accounts to evade a source limit.
- Added bounded collection preflight before Zod element validation to limit oversized-array issue allocation.
- Added daily official-documentation snapshots and drift checks to the private operations watchdog; no automatic dependency upgrades.

### 2026-10-01 — automation contract 1.1.0

- Added SHA-256 `textHash` for content-edit checks, plus explicit text/date/views quality flags.
- Change events now identify added and edited post ids, including edits discovered alongside new posts. `eventId` and change-event `canonicalId` identify a run occurrence; message ids remain stable.
- Normalized output timestamps to UTC and documented timestamp/null semantics.
- Billing summary now counts confirmed charges rather than all delivered monitor rows, including the last charged row at a spend limit.
- Added readable-markup diagnostics, pagination fallback, custom-emoji reaction ids and relative author URLs.
- Store first-run form prefills a five-post sample; API default limits stay unchanged.

### 2026-09-27 — parser and monitor corrections

- Fixed reply posts that incorrectly extracted the quoted parent text.
- Restored channel author links in MTProto output.
- Profile-only runs no longer report history truncation.
- Added an Actor-level custom-event spend ceiling and explicit billing reconciliation.
- Strengthened the widget health smoke check with real post fields.

### 2026-09-15 — first-run example

- Added a removable `durov` channel prefill in the Store form, without injecting a channel into API inputs.
