# Changelog of RedNote Creator Monitoring (`protocol/rednote-api`) Actor

- **URL**: https://apify.com/protocol/rednote-api/changelog.md
- **Full Actor documentation**: https://apify.com/protocol/rednote-api.md

## Changelog

All notable changes to the RedNote API Actor and its `output.v1` output contract are documented here. The Actor follows the Apify Store convention of additive-within-v1 evolution; any breaking change to row shape ships as a new `output.v2` schema with migration notice — `v1` consumers are never broken silently.

### v2.0.0

- **Per-surface data oneOf enforced at the charge gate (BREAKING).** The
  per-surface `data` `oneOf` in `output.v1.schema.json` is now enforced at the
  charge gate via runtime AJV validation (reverses D-019 — `ajv` +
  `ajv-formats` moved from devDependencies to dependencies). Rows whose `data`
  does not match their surface subschema are rewritten to the canon-04 error row
  (`requestStatus: "error"`, `data: null`, `confidence: "experimental"`, URL
  preserved) and are **not charged**. This is a breaking change from v1.0.0:
  consumers who relied on the old permissive validation (any object in `data`)
  will now see invalid rows as error rows instead of billed `ok` rows.
  **Migration:** ensure your downstream code handles `requestStatus: "error"`
  rows gracefully (they were always possible per the schema, just not enforced
  at the gate). The schema also now accepts the pipeline's exploded per-card
  row shapes (`{ noteCard: {...} }` on search and creator surfaces) alongside
  the page-level shapes (`{ noteCards: [...] }`, `{ basicInfo, interactions,
  tags, notes }`), and `notes` is optional on `creatorProfile` (the pipeline
  strips it from the profile row — notes are emitted as separate rows).
  `noteId`/`noteUrl` are optional on the `noteCard` definition (creator-tab
  cards carry only preview fields).
- **Tier 1 deterministic intelligence (additive).** Added the `intelligence`
  namespace to enriched `ok` rows: `engagementQualityScore` (composite 0–1,
  `null` on divide-by-zero), `creatorMomentum` (within-sample rolling-average
  engagement, post cadence, most-recent-vs-median delta), and
  `contentFingerprint` (hashtags, topics, noteType, language, hasVideo,
  imageCount). Every sub-field is tagged `method: "deterministic"`,
  `scope: "within-sample"`. Attached on Mode 2 profile rows and Mode 3 post
  rows; absent on Mode 1 search rows and on any row where enrichment degraded.
  Billed via the new `intelligence_basic` event (name frozen, price being
  finalized). A row without the namespace still validates against `output.v1`.
  Also in this release: repositioned as *RedNote Creator Monitoring* — creator
  profiles lead, recurring-monitoring recipe, per-surface sample rows,
  additive `scheduled_run` disclosure.
- **Individual EQS signals (D-030, additive).** Added four additive optional
  Tier-1 sub-fields to the `intelligence` namespace — `engagementRate`,
  `saveRatio`, `commentRatio`, `i18nCount` — surfacing the individual ratios
  behind the composite `engagementQualityScore` and the normalized audience
  size that is its denominator. No `schemaVersion` bump: the composite three
  remain required, the four new fields are additive and always populated on an
  enriched row (`value: null` on the post surface, which exposes no follower
  count). `saveRatio` (collects/likes) is RedNote's distinctive save signal — no
  incumbent surfaces it. Every sub-field carries `method: "deterministic"`,
  `scope: "within-sample"`, `x-confidence-tier: "best_effort"`.
- **Networking** — Migrated the HTTP path from `got-scraping` to **impit** for
  TLS + HTTP/2 browser fingerprinting (anonymous-first fetcher, `src/fetcher.ts`).

### v1.0.0

Pre-intelligence baseline. Single permissive `data` object validation (any
object accepted at the charge gate — see the v2.0.0 BREAKING note above).
Creator profile (GA), discovery / keyword search (GA, bounded depth), and
post / note detail (Bounded Beta, cookie-only) surfaces. Pay-Per-Event billing
with `discovery_result`, `creator_profile`, `creator_note`, `post_detail`,
and `scheduled_run` events. Chinese-number normalization on every metric, with
the raw string and an `approx` flag preserved.
