# Changelog of Medium User Search Scraper (`codingfrontend/medium-user-search-scraper`) Actor

- **URL**: https://apify.com/codingfrontend/medium-user-search-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/codingfrontend/medium-user-search-scraper.md

## Changelog

### \[4.0.0] - 2026-08-31

#### Changed

- Replaced fragile DOM-card pagination and profile visits with one fingerprinted browser session and Medium's anonymous people-search GraphQL response.
- Added bounded fair allocation across single and multiple keyword modes, strict input validation, and global profile deduplication.
- Expanded normalized output with stable IDs, membership/account flags, social counts, avatar variants, raw public source data, and extraction provenance.
- Added matching input, output, dataset, and key-value-store schemas plus bounded local/cloud QA inputs.
- Strengthened local dataset validation for schema-required fields, unique profiles, valid URLs and dates, and empty-value rejection.

### \[3.0.0] - 2026-05-22

#### Changed

- Pre-queue `ceil(maxItems/5)` pages per keyword upfront for parallel processing via `maxConcurrency: 5`
- Increased concurrency from 3 → 5
- Removed sequential next-page chaining from handler — all pages prepared in `main.js`

All notable changes to the Medium User Search Scraper are documented here.

### \[1.1.0] - 2026-05-21

#### Added

- **Multiple keywords support**: New `keywords` array input — find users matching multiple keywords in parallel.
- **Parallel processing**: Added `maxConcurrency: 3` to PlaywrightCrawler.
- Input schema updated with `keywords` (stringList) field.
- Fixed final log to correctly report `state.totalScraped`.

#### Changed

- `validateInput` now accepts and passes through `keywords` array.

### \[1.0.0] - 2026-05-21

#### Added

- Initial production release of the Medium User Search Scraper.
- Medium internal search API-based architecture for user/author discovery.
- Supports keyword-based user search with configurable result count.
- Modular project structure:
  - `src/main.js` — entry point with input validation and crawler init.
  - `src/routes.js` — Crawlee router factory.
  - `src/routes/handlers.js` — page handler with pagination logic.
  - `src/extractors/` — user profile data extraction logic.
  - `src/filters/` — URL-based deduplication.
  - `src/schema/input.js` — input validation (keyword, maxItems).
  - `src/utils/` — URL builder, helpers, and API call utilities.
  - `src/errors/` — `ScraperError`, `ErrorTypes`, `ErrorHandler`.
- Output fields: `username`, `displayName`, `bio`, `followerCount`, `profileUrl`, `avatar`.
- `.actor/actor.json`, `input_schema.json`, `dataset_schema.json` for Apify platform compatibility.
- Dataset views in `dataset_schema.json` for Apify Storage table display.
- `validate-datasets.js` for local dataset output validation.
- `Dockerfile` for Apify cloud deployment.
- `README.md` with full Apify usage guide.
