# Changelog of YouTube Channel · Uploads & Metadata (`corent1robert/youtube-channel-videos-scraper`) Actor

- **URL**: https://apify.com/corent1robert/youtube-channel-videos-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/youtube-channel-videos-scraper.md

## Changelog

All notable changes to this Actor will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### \[1.7.3] - 2026-09-07

#### Added

- **Actor Standby:** HTTP lookup `GET`/`POST /lookup` — **one** channel URL or `@handle`, hard cap **5 videos** (not full history). Console **Start** still writes the dataset as before (full public upload history).
- OpenAPI spec for the Standby tab (`web_server_openapi.json`).

**Apify actor version:** 1.40

### \[1.7.2] - 2026-08-24

#### Fixed

- One failing channel no longer fails the whole run — that channel is skipped; other URLs still export.

#### Changed

- Store categories: `VIDEOS`, `SOCIAL_MEDIA`. Listing stays public.

**Apify actor version:** 1.39

### \[1.7.1] - 2026-04-28

#### Changed

- **Store / README copy:** Shorter outcome-first English — URLs and **@handles**, one row per video (titles, IDs, dates, descriptions), full public upload history called out plainly.

**Apify actor version:** 1.37

### \[1.7.0] - 2026-04-28

#### Removed

- **YouTube Data API mode** — **`listingMethod`**, **`youtubeApiKey`**, and **`YOUTUBE_API_KEY`** are no longer supported. Listing runs exclusively via **InnerTube** (built-in client). Removed **`src/lib/officialApiList.js`** and related code paths.

#### Changed

- **`youtubeShortDetect.js`** — kept InnerTube helpers only (removed Data API helpers).

**Apify actor version:** 1.36

### \[1.6.7] - 2026-04-28

#### Fixed

- **Dataset schema validation:** Nullable fields (**`durationSeconds`**, **`viewsCount`**, **`description`**, **`publishedDisplay`**, **`publishedAtUtcPlus2`**) — Apify rejects **`null`** when the schema only allows **`integer`** / **`string`**. Types updated to **`["integer","null"]`** or **`["string","null"]`** where rows omit values.

**Apify actor version:** 1.35

### \[1.6.6] - 2026-04-28

#### Changed

- **README:** Benefit-led rewrite — audience & outcomes first; Console steps minimal; optional JSON framed as “if you want…”; plain-language limitation & field cheat sheet; developer/local notes last.

**Apify actor version:** 1.34

### \[1.6.5] - 2026-04-28

#### Changed

- **Store / Console copy:** Simplified **`input_schema`** and **`actor.json`** blurbs — outcome-first (paste links → titles, IDs, dates, descriptions), full-catalog framing aligned with marketplace guidance.

**Apify actor version:** 1.33

### \[1.6.4] - 2026-04-28

#### Changed

- **Console input:** Removed **Optional limit** / **Stop after N videos** — exports are **unlimited** by default (full uploads catalog). Use **`maxVideos`** in JSON/API only when you need a global cap (**`10`** recommended for **Apify scheduled smoke tests**).

**Apify actor version:** 1.32

### \[1.6.3] - 2026-04-28

#### Changed

- **Console input:** Removed **What to include** / **Include video descriptions** — descriptions now load **by default**. Turn off per run via **`fetchDescriptions`: `false`** in JSON/API only.

**Apify actor version:** 1.31

### \[1.6.2] - 2026-04-28

#### Added

- **`durationSeconds`** — integer seconds per row (`null` when unparseable): InnerTube uses the same listing duration overlay / `lengthSeconds` parsing as **`videoKind`**; Official API uses **`videos.list`** **`contentDetails.duration`**.

**Apify actor version:** 1.30

### \[1.6.1] - 2026-04-28

#### Fixed

- **`videoKind` (InnerTube):** uploads playlist rows are **`PlaylistVideo`** with **`watch?v=`** links and horizontal thumbnails (~336×188) even for Shorts — badges/reel URLs were almost never present. Classification now treats **`duration ≤ 180s`** (excluding LIVE/upcoming overlays) as **`short`**, matching real-world uploads feeds (e.g. `@handle` URLs).

**Apify actor version:** 1.29

### \[1.6.0] - 2026-04-28

#### Added

- **`videoKind`** dataset / CSV column: **`short`**, **`long`**, or **`unknown`**. InnerTube uses listing render types (Reel / Shorts layout), **`SHORTS`** badges, and **`reelWatchEndpoint`** / **`/shorts/`** URLs. **Official API** adds one **`videos.list`** batch per playlist page (snippet thumbnails + **`contentDetails.duration`**) — portrait thumbnail + duration ≤ 3 min ⇒ **`short`** (API does not expose an official Short flag).

**Apify actor version:** 1.28

### \[1.5.0] - 2026-04-28

#### Removed

- **Transcripts / captions text:** **`fetchTranscripts`**, **`transcriptLanguage`**, and dataset columns **`transcript`** / **`transcriptLanguage`** — InnerTube transcript fetching was unreliable (blocked or empty). Output schema and CSV match the remaining fields only.

**Apify actor version:** 1.27

### \[1.4.6] - 2026-04-28

#### Changed

- **Transcripts (`fetchTranscripts`):** **`getTranscript()`** is retried up to **4 times** with backoff — YouTube often returns **HTTP 400** on the transcript InnerTube endpoint intermittently ([upstream discussion](https://github.com/LuanRT/YouTube.js/issues/1102)).
- **Transcript parsing:** segment text is collected from any snippet node (not only strict **`TranscriptSegment`** typing).

#### Known limitation

- Even with retries, transcripts can stay **empty** when YouTube blocks the transcript endpoint or the video has **no captions**. Plain **`timedtext`** requests often return **empty** bodies from datacenter IPs without a full browser cookie flow — retries help only when the InnerTube **`get_transcript`** call intermittently succeeds.

**Apify actor version:** 1.26

### \[1.4.5] - 2026-04-28

#### Fixed

- **Listing stats:** InnerTube often sends **`8.4K • 1h ago`** without the word **`views`**. We now treat the left segment as **`viewsDisplay`** when it looks like a compact count, so **`viewsCount`** fills and **`publishedRelative`** stays parsable.
- **`publishedAtUtcPlus2`:** added English short forms (**`1h ago`**, **`2d ago`**, **`3w ago`**, including after **`Streamed`**) so approximate ISO timestamps work again on compact rows.

**Apify actor version:** 1.25

### \[1.4.4] - 2026-04-28

#### Fixed

- **Console input:** one **What to include** block — **`fetchTranscripts`** no longer sets **`sectionCaption`** (Apify closes a section when the next field defines a new caption; duplicating it opened a second identical section).

**Apify actor version:** 1.24

### \[1.4.3] - 2026-04-28

#### Changed

- **`fetchDescriptions`** default is now **`false`**, aligned with **`fetchTranscripts`** — lighter Console/API runs unless descriptions are explicitly enabled.

**Apify actor version:** 1.23

### \[1.4.2] - 2026-04-28

#### Changed

- **Branding / copy:** removed the third-party client package name from **README**, **CHANGELOG**, and **source comments**. Runtime import uses the dependency alias **`innertube-client`**.
- **`package.json`:** depend on **`innertube-client`** (npm alias to the upstream InnerTube package). The lockfile still resolves the upstream tarball for installs.

**Apify actor version:** 1.22

### \[1.4.1] - 2026-04-28

#### Changed

- **Console input:** removed **Listing method** and **YouTube Data API key** — default listing stays built-in (`innertube`). **`listingMethod`** / **`youtubeApiKey`** were later available via **JSON / API only** until removal in **1.7.0**.

**Apify actor version:** 1.21

### \[1.4.0] - 2026-04-28

#### Added

- Optional **`transcript`** and **`transcriptLanguage`** (recommended mode): spoken captions via **`getInfo`** → **`getTranscript()`** on the InnerTube client. Console **`fetchTranscripts`** (default **off**); optional JSON **`transcriptLanguage`** (API-only). **Official API** rows stay **`null`** for transcript fields.

**Apify actor version:** 1.20

### \[1.3.2] - 2026-04-28

#### Changed

- **Store listing (`actor.json`):** **`title`** and **`description`** aligned with **`seoTitle`** / **`seoDescription`** — outcomes-first copy; no InnerTube jargon on the storefront.

**Apify actor version:** 1.19

### \[1.3.1] - 2026-04-28

#### Changed

- **Console input** simplified: fewer fields in the form — advanced options (**`descriptionConcurrency`**, **`verboseLogs`**, **`writeOutputCsv`**) remain available via **API / JSON** (see README).
- **`maxVideos`** prefill **10** in the platform form (cheap scheduled / smoke runs); empty the field for a **full catalog** run.
- InnerTube **description** requests run in **parallel batches** (default concurrency **24** in code).
- Local **`output.csv`**: semicolon-separated fields; long text normalized to **single-line** cells for Excel-style tools.

**Apify actor version:** 1.18

### \[1.3.0] - 2026-04-29

#### Added

- **`description`** column. **YouTube Data API:** from **`snippet.description`** on playlist items (same quota). **Listing without API key:** optional input **`fetchDescriptions`** — calls **`getBasicInfo`** per video (`short_description`); slow on huge channels.

**Apify actor version:** 1.17

### \[1.2.3] - 2026-04-29

#### Added

- **`publishedAtUtcPlus2`** — ISO datetime string with **fixed offset `+02:00`** (IANA **`Etc/GMT-2`**). **Listing:** derived from **`publishedRelative`** English phrases (`minutes`/`days`/`weeks`/`months`…) minus **`Date.now()`** at row emit time — inherently approximate for vague labels. **Data API:** exact reformatted wall time from **`snippet.publishedAt`**.

**Apify actor version:** 1.16

### \[1.2.1] - 2026-04-29

#### Added

- **`viewsCount`** — integer (rounded) parsed from **`viewsDisplay`** (`K`/`M`/`B`, comma thousands, decimal like `5.1K`). **`null`** when parsing fails or **Data API** rows.

**Apify actor version:** 1.14

### \[1.2.0] - 2026-04-29

#### Added

- Dataset / CSV: **`viewsDisplay`** and **`publishedRelative`** — parsed from the listing footer line when present (`views`/`vues • relative time`). **`publishedDisplay`** remains the **full raw line** for compatibility. **YouTube Data API** rows leave the split columns empty (`publishedDisplay` stays ISO 8601).

**Apify actor version:** 1.13

### \[1.1.11] - 2026-04-29

#### Changed

- Console and **RUN\_LOG** copy simplified for operators: no **InnerTube** wording; shorter banner, progress lines (`on page`, `collected`, `elapsed`), and clearer mode labels (**no API key** vs **YouTube Data API**).

**Apify actor version:** 1.12

### \[1.1.10] - 2026-04-29

#### Fixed

- **InnerTube:** list each channel via the **uploads playlist** (`UU…` browse) instead of only the **Videos** tab grid. YouTube often **ends channel-tab continuation early** (~5k rows) while the uploads playlist paginates to the **full catalog** (same idea as Official API playlist listing). Fallback to the Videos tab if playlist open fails.

**Apify actor version:** 1.11

### \[1.1.9] - 2026-04-29

#### Fixed

- InnerTube **upload total** for %/ETA: when the channel **header** has no `videos_count` (common on Home), the Actor fetches the **About** tab once and reads **`metadata.video_count`** (e.g. `5,952 videos`). Falls back to the previous message if About is unavailable.

**Apify actor version:** 1.10

### \[1.1.8] - 2026-04-29

#### Fixed

- Progress lines (**`RUN_LOG`** content) are also emitted with **`log.info`** so **`apify run`** shows **live pagination / ETA** in the terminal, not only in KV.

**Apify actor version:** 1.9

### \[1.1.7] - 2026-04-29

#### Fixed

- InnerTube channel listing: some layouts populate **`RichItem`** or **`LockupView`** while **`feed.videos`** stays empty — the Actor now resolves rows via **`videosForListing`** (memo fallback). Longer shell walk / retries.

**Apify actor version:** 1.8

### \[1.1.6] - 2026-04-28

#### Changed

- Dataset / CSV: removed **`publishedAt`** and **`playlistPosition`**. Single date column **`publishedDisplay`** — InnerTube keeps listing text; Official API stores **ISO 8601** from `snippet.publishedAt` there.
- Removed input **`enrichPublishedAt`** (redundant).

**Apify actor version:** 1.7

### \[1.1.5] - 2026-04-28

#### Added

- **RUN\_LOG** and Apify status: per-**page** lines (videos on page, channel total) with **progress %** and **ETA** when a **global `maxVideos` cap** is set; Official API also uses **`pageInfo.totalResults`** for playlist progress. Without a cap, logs show **throughput** (`vid/min`) and elapsed time — total count is unknown until the run finishes.

**Apify actor version:** 1.6

### \[1.1.4] - 2026-04-28

#### Added

- Input **`enrichPublishedAt`** (InnerTube): optional **`getBasicInfo`** per video to populate **`publishedAt`** from watch-page microformat when present — slower than listing alone.

**Apify actor version:** 1.5

### \[1.1.3] - 2026-04-28

#### Fixed

- InnerTube listing: handle **empty first pages** (continuation shells), **retry** `getVideos` with backoff, and drop **`retrieve_player: false`** which could contribute to empty grids.
- Clear **English error** when YouTube still returns no rows after retries (suggest Official API mode).

**Apify actor version:** 1.4

### \[1.1.2] - 2026-04-28

#### Added

- Optional **`output.csv`** when running **`apify run`** locally (UTF-8 BOM; `writeOutputCsv` input, default on). Apify Cloud unchanged (Dataset download only).

**Apify actor version:** 1.3

### \[1.1.1] - 2026-04-28

#### Fixed

- Suppress **`[YOUTUBEJS]`** parser spam on `console.warn` from the bundled InnerTube client (rich titles / attachment runs).

**Apify actor version:** 1.2

### \[1.1.0] - 2026-04-28

#### Added

- **InnerTube** listing mode (default) — full uploads pagination **without** Google API key.
- Dataset fields **`publishedDisplay`** (InnerTube) alongside **`publishedAt`** (Official API).

#### Changed

- **Official API** mode is optional (`listingMethod`: `officialApi`).

**Apify actor version:** 1.1

***

### \[1.0.0] - 2026-04-28

#### Added

- Initial release: full uploads list per channel via **YouTube Data API v3** (`channels.list` + `playlistItems` pagination).
- Inputs: channel URLs / handles, optional global cap (default full catalog), optional verbose logs.
- API key from input or **`YOUTUBE_API_KEY`** environment variable.

**Apify actor version:** 1.0 (see `.actor/actor.json`).
