# Changelog of WeChat Article Scraper API – 公众号 Search, Full Text & Markdown (`deadc0dex/wechat-article-scraper`) Actor

- **URL**: https://apify.com/deadc0dex/wechat-article-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/deadc0dex/wechat-article-scraper.md

## Changelog

### 2.1 (2026-10-16) — build 2.1.x

- Fix: post-fetch filters (`minWordCount`, `onlyOriginal`, `matchTerms`) now refill. `search_and_read` / `keyword_digest` keep a reserve of candidates (2× + 5, max 100) and read more articles in waves until `maxItemsPerInput` rows pass (before: `minWordCount 300` could return 2 of 3). Only rows that pass are billed; never more than requested are read per wave. Summary `perTask[].refillWaves` says when it happened.
- New free warning: when Sogou's relevance order puts articles older than a year in the results (e.g. 7 of the top 10 for 大模型 on 2026-10-16) and no `dateFrom` is set, the summary warns and suggests `dateFrom: "7d"` or `sortBy: "latest"`; insights rows list `STALE_RESULTS`; `perTask[].staleOverOneYear` counts them. Default sort is unchanged (relevance).
- No input/output, price or listing changes.

### 2.0 (2026-10-15) — build 2.0.x

- Fix: the `capabilities` manifest, `dryRun` estimate and `maxCostUsd` planning quoted draft prices ($0.0001 search row, $0.004 full text) instead of the real $0.0025 / $0.012 in builds 1.1.3–1.1.7. Prices are now read from the run's own pricing at run time; charges were always correct.
- Fix: `operation: "keyword_digest"` was listed in the manifest but rejected by the input schema; it is now accepted. New fields in the schema: `matchTerms`, `minWordCount`, `onlyOriginal`, `trackMetrics`.
- Fix: `include: ["insights"]` tried to charge an event that does not exist; the insights row is now free.
- Change: reaching your own `maxItems` no longer adds a `BUDGET_REACHED` error row (runs said "1 errors" when everything asked for was delivered). The summary says `stopReason: "maxItems"`, `moreAvailable: true` and a warning. `maxCostUsd` and charge-limit stops still return `BUDGET_REACHED`.
- New: `keyword_digest` research workflow (keyword → full text → one free insights row: top terms, accounts, timeline, original share, heuristic sentiment); `trackMetrics` snapshot mode (isNew, firstSeenAt, rank change, content edits); trust fields (`isPartial`, `unavailableFields`, `collectionWarnings`, per-keyword requested vs returned); computed metrics (reading minutes, images per 1k words, keyword hits).

### 1.1 (2026-10-13)

- Sogou: mobile endpoint `weixinwap` first (on Apify the desktop page refused the first request in 3 of 4 v1.0 benchmark runs), then desktop, then cool-down + the other endpoint with fresh cookies, Apify proxy only as last resort. Each block slows the pacing instead of firing more requests; concurrent failures count once.
- Lean/table search rows: no Sogou link check by default (url omitted; `include: ["resolveLinks"]` brings it back as a shortened signed link). Median lean search row 282 → 140 tokens; 10-row lean search: 12 → 1 request, 6.9 s → 2.2 s run time.
- Picture/text posts: stop reading at the end of their metadata (~0.4 MB instead of ~2.6 MB). Early-stop check scans only the new tail.
- Full text: 5 articles in flight (was 4): 10 full articles ~13 s (was ~18–20 s).
- Fix: a keyword now reads one more page when Sogou lists only 9 results on a page, so maxItemsPerInput is filled.

### 1.0 (2026-10-13) — build 1.0.8

- Operations: search_articles, search_and_read, article_details, capabilities (+ auto). dryRun, deltaKey monitoring, lean/table output, fields/include, maxCostUsd, date/account/text filters, EN→ZH query expansion.
- Sogou fallback chain: desktop → WAP endpoint → Apify proxy session → BLOCKED row.
- Full article pages streamed and cut after the body (~0.6 MB of ~3.5 MB).
- Migrated accounts → NOT_FOUND with the new link; long links → BLOCKED with fix; expired signed links → NOT_FOUND.
