# Changelog of Xiaohongshu Keyword Search Scraper (`opspilot.cc/xiaohongshu-keyword-search-scraper`) Actor

- **URL**: https://apify.com/opspilot.cc/xiaohongshu-keyword-search-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/opspilot.cc/xiaohongshu-keyword-search-scraper.md

## Changelog

### 0.3.0 - 2026-08-13

#### Removed

- **Upstream pricing stripped from README**: README no longer mentions the per-page upstream cost or the per-page cost line. Pricing is the Actor maintainer's decision via Apify Console.
- **`estimatedUpstreamCostUsd` SUMMARY field removed**: was a 1:1 mirror of upstream pricing.
- **`$0.01 per request` comment removed** from `src/main.js`.

#### Verified

- Unit + integration tests still pass.

### 0.1.10 - 2026-08-03

#### Added

- `page` input (1-10) for explicit pagination
- `searchId` and `searchSessionId` inputs (required for page >= 2)
- SUMMARY fields: `nextSearchId`, `nextSearchSessionId`, `actualRequests`, `actualPages`
- README "Pagination" section with two-step pattern diagram
- Integration test scenario 5: 3-page pagination with mid-stream `hasMore=false` break

#### Removed

- `maxItems` input (cap matched real upstream capacity of ~20 notes per page)
- `MAX_PAGES_PER_RUN` constant (Skill §17.4 explicitly relaxed for this Actor)
- `MAX_ITEMS_HARD_CAP` constant (no longer needed without `maxItems`)

### 0.1.9 - 2026-07-31

#### Added

- `sortType` input (6 enum values, default `general`)
- `noteType` input (4 enum values, default `不限`)
- `timeFilter` input (4 enum values, default `不限`)
- README "Common filter recipes" section

#### Fixed

- `enumTitles` schema validation: switch to `Array<string>` matching `enum` order

### 0.1.5 - 2026-07-30

#### Changed

- Free-tier quota statement: 5 runs per day

### 0.1.0 - 2026-07-30

#### Added

- Xiaohongshu keyword note search using the App V2 search endpoint
- Native sort, note type, publishing time, and AI-mode controls
- Automatic `search_id` and `search_session_id` pagination
- Duplicate removal, normalized Dataset records, and raw result preservation
- Run summary with request count, stop reason, and estimated source cost
- Unit and two-page integration tests

### 0.2.0 - 2026-08-12

#### Changed

- **Switched to inline `environmentVariables`** (skill §4.1 owner-self-use pattern): `TIKHUB_API_KEY` and `TIKHUB_BASE_URL` are now baked into the Actor build. Users no longer need to add the `TIKHUB_API_KEY` secret in the Apify Console before their first run. The Actor description's "no setup or API key required" promise is now actually true at runtime.
- **`TIKHUB_BASE_URL` default**: explicit inline value `https://api.tikhub.io` (was previously relying on the code-level `DEFAULT_BASE_URL` fallback). Inline mode ships the base URL alongside the key.

#### Verified

- Local smoke test against the live upstream with the inline key — request returned 200 with expected payload shape.
- All 5 integration scenarios still pass (unit + integration = 6 suites).

### 0.4 - 2026-09-02

- **Internal rename (no API / no UI change)**: file `src/tikhub_client.js` → `src/upstream_client.js`; class `TikHubClient` → `UpstreamClient`; `actor.json` env keys `TIKHUB_API_KEY` / `TIKHUB_BASE_URL` → `UPSTREAM_API_KEY` / `UPSTREAM_BASE_URL`. Inline raw values unchanged. Per our internal SOP §100 (no upstream brand name in user-facing surfaces), the visible name "TikHub" no longer appears in actor.json / main.js / client class name. Existing deployments transition seamlessly because this Actor uses inline keys, not Secret refs.
- **Description**: rewritten in zh + en bilingual with SEO keywords (跨境电商 / 内容营销 / 舆情监控 / 市场研究) and emoji. No behaviour change.
