# Changelog of DuckDuckGo Videos Scraper (`searchapi/duckduckgo-videos-scraper`) Actor

- **URL**: https://apify.com/searchapi/duckduckgo-videos-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/searchapi/duckduckgo-videos-scraper.md

## Changelog

### 3.1.0

- Removed the public debugging input and kept internal request tokens out of dataset records.
- Added a 20-field minimum, nested search metadata, and a dataset audit for schema parity, ordering, timestamps, duplicate IDs, and sensitive fields.
- Verified the structured video extractor against the current DuckDuckGo Videos page and prepared a truthful live sample.

### 3.0.0

- Replaced the Firefox scroll workflow with validated structured-response extraction.
- Added single-query, multi-query, fair-interleaving, one-item, filter, pagination, and no-results modes.
- Corrected DuckDuckGo's positional video-filter parameters and Safe Search mapping.
- Added stable IDs, deduplication, numeric field normalization, rich source-backed output, and empty-field cleanup.
- Added bounded retries, response/content-type validation, cookie continuity, consistent request headers, and optional proxy sessions.
- Removed the Playwright runtime and aligned the Node 22 Docker image and exact production dependencies.

All notable changes to the DuckDuckGo Videos Scraper are documented here.

### \[2.0.1] - 2026-06-13

#### Verified

- End-to-end run against `duckduckgo.com` (`?iax=videos&ia=videos`) for query "artificial intelligence" returned **20/20 records** with all fields populated:
  - 20/20 have `title`, `url`, `embedUrl`, `duration`, `durationSeconds`, `publisher`, `channel`, `thumbnail`, `publishedAt`, `description`
  - 19/20 have `viewCount` (some new uploads don't have view counts yet)
  - `duration` correctly parsed in both `mm:ss` and `h:mm:ss` formats
  - `embedUrl` correctly points to the `/embed/` variant for YouTube
- API intercept (`/v.js?o=json`) approach in `main.js` is working as designed.

### \[2.0.0] - 2026-06-12

#### Added

- **Schema expanded** from 32 to **54 fields**.
- **New fields**: `type`, `resultType`, `titleHtml`, `link`, `publisher`, `channelId`, `channelAvatar`, `uploader`, `uploaderUrl`, `date`, `thumbnailUrl`, `category`, `isAd`, `isSponsored`, `resolution`, `width`, `height`, `aspectRatio`, `query`, `searchUrl`, `market`, `searchMetadata`.
- **New view**: `fullDetails` — all 54 fields.
- **INPUT.json** added at project root for local validation.

### \[2.0.0] - 2026-06-12 (DDG refactor)

#### Added

- **Identity & metadata**: `position`, `page`, `videoId`, `embedUrl`, `platform`.
- **Channel**: `channel`, `channelUrl`, `channelVerified`, `channelFollowers`, `uploaderVerified`.
- **Engagement**: `duration` + `durationSeconds`, `viewCount` + `views`, `likeCount`, `dislikeCount`, `commentCount`.
- **Dates**: `publishedAt`, `publishedAtRaw`.
- **Media**: `thumbnail`, `description`, `tags`.
- **Flags**: `isLive`, `isShort`, `qualityOptions`.
- **Run context**: `searchQuery`, `country`, `language`, `scrapedAt`.
- **Shared validator/normalizer** wired to `_canonical/`.

### \[1.0.0] - 2025-05-20

#### Added

- Initial production release of the DuckDuckGo Videos Scraper.
- `PlaywrightCrawler`-based architecture using Firefox (`apify/actor-node-playwright-firefox`).
- Modular project structure.
- `validate-datasets.js` for local dataset output validation.
- `Dockerfile` using `apify/actor-node-playwright-firefox` image.
- `README.md` with full Apify usage guide.
