# Xiaohongshu (RedNote) Scraper - Notes, Profiles & Feeds (`scrapewise/xiaohongshu-scraper`) Actor

Scrape Xiaohongshu (RedNote, Little Red Book, 小红书) without login: full notes by link, public profiles with their latest notes, and the home feed and topic channels. Title, text, tags, likes, saves, comments, shares, images, video link, author. Errors free.

- **URL**: https://apify.com/scrapewise/xiaohongshu-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Social media
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.10 / 1,000 full note delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Xiaohongshu (RedNote) Scraper

Xiaohongshu Scraper turns **public Xiaohongshu (RedNote, 小红书) content** into clean JSON, CSV or Excel, **without login or cookies**. Paste note links, or **search by keyword**, and get the full note: title, text, hashtags, **likes, saves, comments and shares**, publishing date, every image, the **video file link** and the author. Add profile links to get the public profile (followers, notes posted, total likes and saves, bio, IP location, tags) with the notes on its first page, or read the home feed and the topic channels.

**Full notes from US$ 6.00 per 1,000. Profiles US$ 20.00 per 1,000. No monthly fee, no start fee. Error rows are free.**

### At a glance

- **Full note (from a link, or a feed note opened):** US$ 6.00 per 1,000
- **Note card (feed or profile, not opened):** US$ 3.50 per 1,000
- **Profile:** US$ 20.00 per 1,000
- **Fee per run start:** None
- **Inputs:** Keywords (best in Chinese), note links (with their `xsec_token`, or without it for notes indexed by search engines), profile links or ids, home feed and topic channels
- **Error rows (expired link, missing token, profile not found):** Free, with an `errorCode`

### One real row

A note link from a cloud run of 2026-09-30:

```json
{
  "type": "note",
  "id": "6455b3d7000000000800e27f",
  "url": "https://www.xiaohongshu.com/explore/6455b3d7000000000800e27f?xsec_token=ABj6wOII3wKf1doBy-UiXlhHC-HP-A9ammCgjhvhiT1L8%3D&xsec_source=pc_feed",
  "noteType": "normal",
  "title": "听我说！苏州平江路要早上7点就去，美的嘞",
  "desc": "Hi，大家好，我是逃喵喵🍃。\n\t\n我来过苏州啦！！好激动好激动呀，平江路被称为是“苏州古城的缩影”...",
  "tags": ["翻翻上周好天气", "阳光是最好的滤镜", "苏州", "苏州平江路", "平江路", "苏州旅游", "..."],
  "likedCount": 1619,
  "collectedCount": 1323,
  "commentCount": 151,
  "shareCount": 502,
  "publishedAt": "2023-05-06T01:56:39Z",
  "imageCount": 14,
  "images": [
    "https://sns-webpic-qc.xhscdn.com/202610010452/c455a6de62d55f1b94054fdb8a89f838/1000g0082etmn6f4h40005o2pg4ag9ap9ig46b28!nd_dft_wlteh_webp_3",
    "..."
  ],
  "videoUrl": null,
  "authorNickname": "逃喵喵",
  "authorId": "60598115000000000100ab29",
  "detailLevel": "full"
}
```

And a profile row from the same run:

```json
{
  "type": "profile",
  "id": "5c32c9bb000000000502cb54",
  "nickname": "圆了个圆",
  "redId": "lxy17_",
  "bio": "我想我会一直在路上",
  "ipLocation": "江西",
  "tags": ["金牛座", "江西南昌", "旅行博主", "探店博主"],
  "followers": 10000,
  "followersText": "1万+",
  "notesPosted": 389,
  "notesLikedTotal": 317205,
  "notesCollectedTotal": 179950,
  "firstPageNotes": 32
}
```

### Search by keyword

Xiaohongshu's own search page needs an account. This Actor never logs in, so it finds the notes for each keyword through public web search engines (notes Xiaohongshu itself exposes to them), then opens each note in full: text, tags, likes, saves, comments, shares, date, images, video link and author. Each row carries the `searchKeyword` it came from and the engine that found it (`discoveredVia`).

```json
{
  "searchKeywords": ["露营", "露营装备"],
  "maxNotesPerKeyword": 50,
  "expandKeywords": true
}
```

- **Use Chinese terms.** Search engines index Xiaohongshu notes by their Chinese text: `露营` (camping) returned 40 notes on the first two result pages in our tests, `护肤` (skincare) 83 with variations, while `skincare routine` returned 1.
- **These are indexed notes, not the newest posts.** Search engines pick up a note weeks or months after it goes live, so most results are a few months old (in our 2026-10-17 tests the newest were from July 2026). There is no "latest" sort and no date filter. For fresh posts use the home feed (`recommend`).
- **`expandKeywords`** (default on) adds a few variations of each keyword (the keyword + 推荐, 攻略, 分享, 教程) when the exact keyword runs out, which adds notes the exact term did not find. With variations, a Chinese keyword usually reaches 80 to 150 notes.
- Every delivered note is charged as a full note (US$ 6.00 per 1,000). A note that does not open is skipped and **not charged**; the same note found by two keywords is delivered and charged once.

### What you can do with it

- **Influencer vetting (KOL / KOC):** notes posted, total likes and saves, tags and IP location of a creator, plus their latest notes and how each one performed.
- **Campaign tracking:** paste the links of the notes of a campaign and get likes, saves, comments and shares on a schedule.
- **Content and trend research on Chinese consumers:** what the home feed recommends today, and what notes exist on a topic (`露营`, `护肤`, `上海美食`), with full text and hashtags.
- **Media archiving:** every image link and the MP4 video link of each note.

### Input

| Field | What it does |
|---|---|
| `noteUrls` | Note links copied from the browser: `https://www.xiaohongshu.com/explore/<id>?xsec_token=...`. A link without the token, or a bare note id, is tried too (notes indexed by search engines open without it). Short `xhslink.com` links are tried; one that does not resolve to a note comes back as a free `NOTE_UNAVAILABLE` row |
| `searchKeywords` | Keywords, best in Chinese (`露营`, `护肤`). Notes found through search engines, each opened in full. Aliases: `keywords`, `searchQueries`, `query` |
| `maxNotesPerKeyword` | Default 30: full notes per keyword. Alias: `maxResults` |
| `expandKeywords` | Default on: also searches a few variations of each keyword (+ 推荐, 攻略, 分享, 教程) to reach the limit |
| `profileUrls` | `https://www.xiaohongshu.com/user/profile/<id>` or the 24-character user id |
| `includeProfileNotes` | Default on: one row per note on the profile's first page |
| `feedChannels` | `recommend` (home feed), `fashion`, `food`, `cosmetics`, `movies`, `career`, `love`, `home`, `gaming`, `travel`, `fitness` (Chinese names also work) |
| `maxItemsPerChannel` | Default 30; each page brings about 30 notes |
| `openFeedNotes` | Opens each feed note for the full details (charged as a full note) |
| `onlyNew` | For scheduled runs: delivers, and charges, only notes not delivered in earlier runs (per profile, channel and keyword). Alias: `onlyNewNotes` |

```json
{
  "noteUrls": ["https://www.xiaohongshu.com/explore/6455b3d7000000000800e27f?xsec_token=ABj6wOII3wKf1doBy-UiXlhHC-HP-A9ammCgjhvhiT1L8%3D&xsec_source=pc_feed"],
  "profileUrls": ["5c32c9bb000000000502cb54"],
  "feedChannels": ["recommend"],
  "maxItemsPerChannel": 60,
  "openFeedNotes": true
}
```

### Schedule it daily: only new notes

Turn on `onlyNew`, save the input as a Task and attach a daily Schedule:

```json
{ "profileUrls": ["5c32c9bb000000000502cb54"], "feedChannels": ["recommend"], "maxItemsPerChannel": 30, "onlyNew": true }
```

- The first run delivers the profile with its first-page notes and the feed up to your limit, and remembers what it read.
- Every run after that delivers, and charges, only the notes that were not delivered before. The profile row comes only together with a new note, so a quiet profile costs nothing; the run ends green with the status "No new notes since the last run".
- The home feed is a fresh recommendation on every page, so `onlyNew` there means "never the same note twice", not "posted since yesterday".
- It works for keywords too: a scheduled keyword run delivers only the indexed notes it had not delivered before.
- The memory lives in a Key-Value Store named `xiaohongshu-scraper-only-new` in your own Apify account, one record per profile, channel and keyword. Delete it to start over. Note links are always returned.

### Output fields

Notes: `id`, `url` (ready to open, with its token when Xiaohongshu gives one), `xsecToken`, `noteType` (`normal` = images, `video`), `title`, `desc`, `tags`, `likedCount`, `collectedCount`, `commentCount`, `shareCount`, `publishedAt`, `lastUpdatedAt`, `ipLocation` (when Xiaohongshu shows it), `imageCount`, `images`, `coverUrl`, `videoUrl` (MP4), `videoDurationSec`, `authorNickname`, `authorId`, `authorUrl`, `isPinned` (profile notes), `detailLevel` (`full` or `card`), `searchKeyword` and `discoveredVia` (`brave`, `duckduckgo` or `bing`; keyword search only, `null` otherwise), `source`, `scrapedAt`.

Note cards (feed or profile, not opened) carry `title`, `noteType`, `likedCount`, `coverUrl`, author and, from the feed, `id` and `url`; the other counters are `null`.

Profiles: `id`, `url`, `nickname`, `redId`, `bio`, `ipLocation`, `gender`, `tags`, `followers`, `following`, `likesAndCollects` (with the `...Text` value exactly as shown, like `1万+`), `notesPosted`, `notesLikedTotal`, `notesCollectedTotal` (exact), `firstPageNotes`.

Only what Xiaohongshu shows publicly about an author: nickname and public id. Never photos. No comments are collected.

#### Error codes (never charged)

| errorCode | Meaning |
|---|---|
| `XSEC_TOKEN_REQUIRED` | The link has no `xsec_token` (or is a bare id) and the note did not open without it. Only notes indexed by search engines open without a token; copy the link from the browser with its token |
| `NOTE_UNAVAILABLE` | Deleted or private note, expired token, or an `xhslink.com` short link that did not resolve to a note |
| `PROFILE_NOT_FOUND` | No public profile with this id |
| `NO_RESULTS` | Nothing new for this input (duplicate or empty), or no indexed notes for a keyword (try a Chinese term) |
| `INVALID_URL`, `INVALID_INPUT` | A value the Actor does not understand |
| `BLOCKED` | Xiaohongshu or the search engines did not answer after retries; run again |
| `NOT_REACHED`, `UNEXPECTED` | The run timeout arrived, or something unforeseen broke; only that input is lost |

### Pricing

| Event | Per 1,000 |
|---|---|
| Full note delivered | US$ 6.00 |
| Note card delivered | US$ 3.50 |
| Profile delivered | US$ 20.00 |

Duplicates and error rows are free, and there is no Apify compute bill on top.

### FAQ

**How does keyword search work without an account?** Xiaohongshu's search page is blank for a visitor without an account, but Xiaohongshu exposes many notes to web search engines, and those notes open for a logged-out visitor. The Actor searches the engines for `site:xiaohongshu.com/explore <your keyword>`, collects the note ids, and opens each note. So you get notes indexed by search engines (usually a few months old), not the live in-app ranking, and Chinese keywords work far better than English ones.

**Why no comments?** The comment list only loads for logged-in users. This Actor never logs in and never uses cookies, so it reads only what a logged-out visitor can see.

**What is `xsec_token` and where do I get it?** It is a signed token Xiaohongshu adds to every note link it hands out; the note page does not open without it. Open the note in a browser and copy the address bar: `https://www.xiaohongshu.com/explore/<id>?xsec_token=...&xsec_source=...`. Notes from the home feed and opened feed notes already come with their token in the `url` and `xsecToken` fields, so you can feed them back as `noteUrls`.

**Is this a Xiaohongshu API alternative?** Yes, for public data. Xiaohongshu has no public API; this Actor returns notes, profiles and feeds as JSON, CSV or Excel through the Apify API, without login, cookies or app keys. Anything that needs an account (the in-app search ranking, comments, private notes) is out of scope.

**Is RedNote the same as Xiaohongshu / Little Red Book?** Yes. Xiaohongshu (小红书) is the Chinese name, Little Red Book its literal translation, and RedNote the English name the app uses internationally. This Actor reads the same site, `xiaohongshu.com`.

### Limitations

- **No comments, and keyword search covers indexed notes only:** the in-app search and comments need a logged-in account, and this Actor never logs in. Keyword results come from web search engines: mostly notes a few months old, no newest-first sort, few results for English terms.
- **A fresh note needs its `xsec_token`.** Links copied from the website carry it; notes indexed by search engines also open without it. `xhslink.com` short links from the app are tried, with no promise: if one does not resolve to a note, or the token expired, the row comes back as a free `NOTE_UNAVAILABLE`.
- **Profile notes have no link.** For logged-out visitors Xiaohongshu blanks the note ids on profile pages, so those rows carry title, type, likes, date and cover, but cannot be opened. Only the first page (about 30 notes) is shown without login.
- **Topic channels serve older notes.** To logged-out visitors the topic channels (food, travel...) come from an older selection (notes from 2023, measured on 2026-09-30). The home feed (`recommend`) is current and brings new notes on every page.
- Image and video links are signed by Xiaohongshu and expire after some time; download them soon after the run.
- Only public content. This Actor reads public pages only and respects the site's terms.

### Changelog

- **2026-10-17:** keyword search (`searchKeywords`, `maxNotesPerKeyword`, `expandKeywords`): notes found through web search engines, each opened in full, with `searchKeyword` and `discoveredVia`. Same price as a note by link. Note links without `xsec_token` (and bare ids) are now tried before being refused.
- **2026-10-04:** `onlyNew` (alias `onlyNewNotes`) for scheduled runs: only notes not delivered before are returned and charged; the profile row comes only with a new note. Same price.
- **2026-09-30, 0.1:** first release. Notes by link (web links with their token; xhslink.com short links tried), profiles with first-page notes, home feed and topic channels, optional full details for feed notes, free error rows.

# Actor input Schema

## `noteUrls` (type: `array`):

Note links copied from the browser, one per line, like https://www.xiaohongshu.com/explore/<id>?xsec_token=... A link without its xsec_token (or a bare note id) is tried too: notes indexed by search engines open without it; one that does not open returns a free XSEC_TOKEN_REQUIRED row. Short xhslink.com share links are tried; one that does not resolve to a note comes back as a free NOTE_UNAVAILABLE row. Each note returns its text, tags, likes, saves, comments, shares, date, all images and the video link, charged as a full note. Also accepts 'urls' or 'startUrls'.

## `searchKeywords` (type: `array`):

Keywords, one per line, best in Chinese (露营, 护肤, 上海美食). Xiaohongshu search needs an account, so the Actor finds notes for each keyword through public search engines and opens each one in full (text, tags, likes, saves, comments, shares, date, images, video link), charged as a full note. Results are notes indexed by search engines, usually a few months old, not the newest posts; English terms return few notes. Each row carries searchKeyword and discoveredVia. Also accepts 'keywords', 'searchQueries' or 'query'.

## `maxNotesPerKeyword` (type: `integer`):

Maximum full notes for each keyword (default 30). A Chinese keyword usually yields 30 to 50 indexed notes, and 80 to 150 with the variations below. Notes that do not open are skipped and not charged. Also accepts 'maxResults'.

## `expandKeywords` (type: `boolean`):

On (default): when a keyword runs out of notes, the Actor also searches a few variations (the keyword + 推荐, 攻略, 分享, 教程) to reach your limit. Off: only the exact keyword.

## `profileUrls` (type: `array`):

Profiles, one per line, as a link like https://www.xiaohongshu.com/user/profile/<id> or the 24-character user id. Returns one profile row (nickname, red id, bio, IP location, tags, followers, following, notes posted, total likes and saves) and, with the option below, the notes on its first page. Also accepts 'profiles' or 'userIds'.

## `includeProfileNotes` (type: `boolean`):

On (default): adds one row per note on the profile's first page (up to about 30) with title, type, likes, date, cover and pinned flag, charged as note cards. Xiaohongshu hides the note ids there from logged-out visitors, so these rows have no link. Turn off to get only the profile row.

## `feedChannels` (type: `array`):

Feed channels, one per line: recommend (the home feed, fresh notes and new ones on every page) or a topic channel: fashion, food, cosmetics, movies, career, love, home, gaming, travel, fitness. Chinese names (推荐, 穿搭, 美食...) also work. To logged-out visitors Xiaohongshu serves the topic channels from an older selection (notes from 2023, measured on 2026-09-30); the home feed is current. Also accepts 'channels'.

## `maxItemsPerChannel` (type: `integer`):

Maximum notes for each feed channel (default 30). Each page brings about 30 recommended notes and more pages bring new ones, so 90 reads about 3 pages. Each note card is charged, or each full note with 'Open each feed note' on. Also accepts 'maxItems'.

## `openFeedNotes` (type: `boolean`):

Off (default): feed notes come as cards (title, type, likes, cover, author, link), charged as note cards. On: each feed note is opened for its text, tags, saves, comments, shares, date, all images and the video link, and is charged as a full note instead. Slower run.

## `onlyNew` (type: `boolean`):

For scheduled runs. Remembers which notes of each profile and channel were already delivered (in a named key-value store in your account, 'xiaohongshu-scraper-only-new') and skips them on the next runs: skipped notes are not charged and do not count against the limit. The profile row comes only on the first run or together with a new note. On the first run, every feed note read is marked as seen, even past the limit. Note links are always returned. Also accepts 'onlyNewNotes'.

## `proxyConfiguration` (type: `object`):

Apify Proxy, on by default, is strongly recommended: Xiaohongshu blocks one IP after about 20 pages, and the Actor rotates IPs to keep going. Keep the default.

## Actor input object example

```json
{
  "maxNotesPerKeyword": 30,
  "expandKeywords": true,
  "includeProfileNotes": true,
  "feedChannels": [
    "recommend"
  ],
  "maxItemsPerChannel": 30,
  "openFeedNotes": false,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "feedChannels": [
        "recommend"
    ],
    "maxItemsPerChannel": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/xiaohongshu-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "feedChannels": ["recommend"],
    "maxItemsPerChannel": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/xiaohongshu-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "feedChannels": [
    "recommend"
  ],
  "maxItemsPerChannel": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/xiaohongshu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/xiaohongshu-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yEXbJRYg2mWzT3d4s/builds/hY3wR1k1LdgA4fLrp/openapi.json
