# Xiaohongshu Scraper: RedNote Notes, Profiles, Trending (`datagleaner/xiaohongshu-rednote-scraper`) Actor

Xiaohongshu (RedNote, 小红书) scraper: note details from a link, creator profiles with followers and recent notes, and trending feeds by category. $3 per 1,000 notes or profiles. No login, no browser. No keyword search or comments.

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

## Pricing

$3.00 / 1,000 notes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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: notes, creator profiles and trending feeds

**Get public Xiaohongshu (RedNote, 小红书, Little Red Book) notes, creator profiles and trending category feeds as JSON, CSV or Excel.** Note links give full text, tags, images, video link and like, collect, comment and share counts; profile links give followers, bio, location and the newest notes; feeds give what the site is recommending in fashion, food, beauty, gaming, travel and more. No login, no account, no browser. **$3 per 1,000 notes or profiles ($0.003 each).**

#### Why this one

- **No login and no cookies.** It reads only public pages, so there is no account to get banned and no session to refresh.
- **One price for everything.** $0.003 per note row or profile record. The newest notes inside a profile (`recentNotes`, up to about 30) are included in the profile price.
- **Paste what you have.** Note links (with the `xsec_token` Xiaohongshu puts in shared links), `xhslink.com` short links, or the whole share text the app copies; profile links with or without a token.
- **Trending without a keyword.** The recommended feed and ten category feeds, each page about 35 notes; set `fetchNoteDetails` to expand every note into the full note.
- **Counts as numbers.** "1.7万" arrives as `17000`; timestamps are ISO 8601.
- **Upfront about what it cannot do.** No keyword search and no comment scraping: both need a logged-in session or request signing, so they are not offered. Feeds are the site's recommendations, not a ranked top list, and can include older notes.

#### Minimal input

```json
{"feedChannels": ["food"], "maxItems": 10}
```

Or a profile: `{"profileUrls": ["https://www.xiaohongshu.com/user/profile/<userId>"]}`. An empty input runs 5 notes from the recommended feed.

#### Sample output rows

A full note and a profile, from platform runs on 2026-10-11 (links and long fields shortened; image and video links are signed and expire):

```json
{
  "recordType": "note",
  "noteId": "6a74330100000000350154bf",
  "title": "入了好看的新杯子🧊",
  "description": "#杯子也有高颜值 #小众杯子  #小众水杯 #高颜值玻璃杯 #高颜值杯子 #杯子颜值控 #让你喝水有仪式感的水杯...",
  "type": "video",
  "author": {
    "userId": "5657b081b8ce1a502dd11621",
    "nickname": "岛里",
    "avatarUrl": "https://sns-avatar-qc.xhscdn.com/..."
  },
  "tags": [
    "杯子也有高颜值",
    "小众杯子",
    "小众水杯"
  ],
  "likes": 9025,
  "collects": 1687,
  "comments": 78,
  "shares": 727,
  "publishedAt": "2026-08-07T01:09:03Z",
  "createdAt": "2026-08-06T07:08:49Z",
  "updatedAt": "2026-08-06T07:08:50Z",
  "imageUrls": [
    "https://sns-webpic-qc.xhscdn.com/..."
  ],
  "videoDurationSec": 17,
  "videoUrl": "https://sns-video-zl.xhscdn.com/stream/...",
  "titleEnglish": null,
  "url": "https://www.xiaohongshu.com/explore/6a74330100000000350154bf?xsec_token=...",
  "isFull": true,
  "scrapedAt": "2026-10-11T06:10:45Z",
  "input": "https://www.xiaohongshu.com/explore/6a74330100000000350154bf?xsec_token=..."
}
```

```json
{
  "recordType": "profile",
  "userId": "5657b081b8ce1a502dd11621",
  "nickname": "岛里",
  "redId": "27760756276",
  "description": "一个专注于多巴胺美学的生活方式品牌\n让有趣的奇思妙想都在岛里实现🏖",
  "ipLocation": "浙江",
  "gender": "male",
  "avatarUrl": "https://sns-avatar-qc.xhscdn.com/...",
  "followers": 10000,
  "following": 10,
  "likesAndCollects": 10000,
  "notesCount": 2094,
  "recentNotes": [
    {
      "title": "好看的餐具可以拯救世界✨🍽️🥂",
      "type": "video",
      "likes": 2844,
      "publishedAt": "2026-09-14T04:51:00Z",
      "videoDurationSec": null,
      "coverUrl": "https://sns-webpic-qc.xhscdn.com/...",
      "pinned": true
    }
  ],
  "url": "https://www.xiaohongshu.com/user/profile/5657b081b8ce1a502dd11621",
  "scrapedAt": "2026-10-11T06:10:49Z",
  "input": "https://www.xiaohongshu.com/user/profile/5657b081b8ce1a502dd11621"
}
```

#### Price

**$3 per 1,000 notes or profiles** ($0.003 each). 1,000 feed notes cost $3.00; 50 note links plus 10 profiles cost $0.18. Set a maximum charge on the run and it stops when it is reached.

### What it does

- **Note details.** Give it note links (with the `xsec_token` Xiaohongshu puts in shared links) and get title, full text, tags, image links, video link (`videoUrl`) and length, like, collect, comment and share counts, publish time and `createdAt`. A note link can also be an `xhslink.com` short link or the share text the app copies; the link inside it is followed. A short link only works if it leads to a link that carries an `xsec_token`; older short links do not and are skipped. A bare note ID does not work.
- **Trending discovery feeds.** Pull the public recommended feed or a category: fashion, food, beauty, film and TV, career, relationships, home, gaming, travel, fitness. Each page gives about 35 notes the site recommends (they can be old) with title, author, likes, creation time and cover. Optionally expand each into the full note.
- **Profiles.** Name, RED ID, bio, IP location, gender, followers, following, likes and collects, note count, plus the user's newest notes (up to about 30) in `recentNotes`. In the rare case the site shows a profile note's ID, that note comes as its own note row instead and is billed like a feed note.

### What it does not do

Keyword search and comment scraping need a logged-in session or Xiaohongshu's request signing, so they are not offered. Profile notes cannot be expanded into full notes, because Xiaohongshu hides their IDs from guests; for that reason they come inside the profile record as `recentNotes` and are not billed as separate rows (a profile note whose ID the site does show becomes its own billed note row, without full details).

### Use cases

Tracking trending topics by category, content research for brands and creators, following a creator's recent posts, building a Chinese lifestyle content dataset.

### Input

| Field | What it does |
|---|---|
| `noteUrls` | Note links, `xhslink.com` short links or pasted share text. The `xsec_token` part of the link is required. |
| `profileUrls` | Profile links, e.g. `https://www.xiaohongshu.com/user/profile/<userId>` (token optional), or `xhslink.com` short links. |
| `feedChannels` | Any of `recommend`, `fashion`, `food`, `cosmetics`, `movie_and_tv`, `career`, `love`, `household_product`, `gaming`, `travel`, `fitness`. |
| `maxItems` | Notes per feed channel or profile (default 20, max 500). |
| `fetchNoteDetails` | Expand feed notes into full notes, one extra request each (default false). |
| `requestDelaySecs` | Pause between requests (default 3 seconds). |
| `proxyConfiguration` | Optional Apify Proxy settings. Default is no proxy. |

```json
{
  "noteUrls": ["https://www.xiaohongshu.com/explore/6a806816000000003400d263?xsec_token=AB-TptKasaeUkLXsxJNrR2kZ3EjFdgY2ttd9WGCqfwfMA=&xsec_source=pc_feed"],
  "profileUrls": ["https://www.xiaohongshu.com/user/profile/69129eb000000000370059f0"],
  "feedChannels": ["food"],
  "maxItems": 20,
  "fetchNoteDetails": false
}
```

With an empty input it runs a built-in example: 5 notes from the recommended feed. Inputs that give nothing (bad link, missing `xsec_token`, removed note) are skipped and named in the run's status message (the first three, with a count of the rest).

### Output

A full note (from `noteUrls`, or a feed note with `fetchNoteDetails`):

```json
{
  "recordType": "note",
  "noteId": "6a806816000000003400d263",
  "title": "短甲天花板｜不用延长也自带高级感",
  "description": "...",
  "type": "normal",
  "author": {"userId": "69129eb000000000370059f0", "nickname": "裙摆小陈", "avatarUrl": "https://..."},
  "tags": ["短款美甲", "通勤美甲"],
  "likes": 1700, "collects": 783, "comments": null, "shares": 145,
  "publishedAt": "2026-08-18T12:00:07Z",
  "createdAt": "2026-08-18T12:00:07Z",
  "updatedAt": "2026-08-18T12:00:07Z",
  "imageUrls": ["https://..."],
  "videoDurationSec": null,
  "videoUrl": null,
  "titleEnglish": null,
  "url": "https://www.xiaohongshu.com/explore/6a806816000000003400d263?xsec_token=...",
  "isFull": true,
  "scrapedAt": "2026-10-08T15:30:00Z",
  "input": "feed:food"
}
```

Image and cover URLs are signed and expire, so download them soon after the run. Feed note cards have `isFull: false` and carry `noteId`, `title`, `type`, `author`, `likes`, `publishedAt`, `createdAt`, `videoDurationSec`, `coverUrl` and `url`. Profile records have `recordType: "profile"` with `userId`, `nickname`, `redId`, `description`, `ipLocation`, `gender`, `avatarUrl`, `followers`, `following`, `likesAndCollects`, `notesCount`, `recentNotes` (title, type, likes, `publishedAt`, `videoDurationSec`, `coverUrl`, `pinned`) and `url`. Counts the site shows as "1.7万" are converted to numbers (17000).

### Pricing

Pay per event: **$0.003 per note**. Each note row and each profile record counts as one `note`; `recentNotes` inside a profile are not charged; a profile note the site gives with its ID is a note row and is charged. Example: 1,000 feed notes cost $3.00. Set a max charge in the run options and the Actor stops when it is reached.

### Use with Python

```python
## pip install apify-client
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagleaner/xiaohongshu-rednote-scraper").call(
    run_input={"feedChannels": ["food"], "maxItems": 10}
)
if run is None:
    raise SystemExit("Run did not start")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item.get("title"), item.get("likes"), item.get("url"))
```

### Use with JavaScript / Node.js

```js
// npm install apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagleaner/xiaohongshu-rednote-scraper').call({
    feedChannels: ['food'],
    maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.title, item.likes, item.url);
```

### Use it from n8n, Make, Zapier or an AI agent

Actor ID: `datagleaner/xiaohongshu-rednote-scraper`

Minimal input:

```
{"feedChannels": ["food"], "maxItems": 10}
```

Each tool below runs this Actor with your own Apify API token.

- **n8n:** add the **Apify** node (`@apify/n8n-nodes-apify`). On n8n Cloud you install it from the community node registry. Choose **Run an Actor and get dataset**, set Actor to `datagleaner/xiaohongshu-rednote-scraper` and paste the input above.
- **Make:** use the Apify app's **Run an Actor** module, then **Get Dataset Items** to read the results. **Watch Actor Runs** can trigger a scenario when a run finishes.
- **Zapier:** use the Apify action **Run Actor**, then the search **Fetch dataset items**. The trigger **Finished Actor run** starts a Zap when a run ends.
- **AI agents (MCP):** connect to `https://mcp.apify.com?tools=datagleaner/xiaohongshu-rednote-scraper`. In Claude Code:

  ```
  claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/xiaohongshu-rednote-scraper"
  ```

  Then run `/mcp` to sign in to Apify in your browser. After that, ask in plain language, for example: "Get the 10 newest notes on this Xiaohongshu profile, https://www.xiaohongshu.com/user/profile/69129eb000000000370059f0, and list each title with its like count."
- **LangChain (Python):**

```python
## pip install langchain-apify, then set APIFY_TOKEN in your environment
import json
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("datagleaner/xiaohongshu-rednote-scraper")
result = tool.invoke({"run_input": json.loads('{"feedChannels": ["food"], "maxItems": 10}')})
```

### Limits

- Note links need the `xsec_token`; links without it return nothing.
- Feeds are recommendations: repeat loads give new notes but no date or keyword control. Duplicates are dropped.
- The default pacing is 3 seconds per request, so expanding 100 feed notes into full notes takes about 5 minutes.
- It reads www.xiaohongshu.com and falls back to the international www.rednote.com if the first is unreachable from the run's network.
- Xiaohongshu may add a login wall at any time; the run then ends with a clear message and keeps what it already saved.

### FAQ

**Is there a Xiaohongshu API for this?** Xiaohongshu has no public data API. This Actor works as one: call it from the Apify API, Python, JavaScript or MCP and get JSON back.

**Does it need a Xiaohongshu account or login?** No. It reads only public pages.

**Can it scrape a Xiaohongshu profile?** Yes. Each profile gives one profile record with up to about 30 of the user's newest notes in `recentNotes`.

**Can it get trending Xiaohongshu notes?** Yes, from the recommended feed and ten category feeds. These are Xiaohongshu's own recommendations, not a ranked top list.

**Can I search by keyword or get comments?** Not currently.

### Responsible use

Only public pages are read. The data may include personal information (names, bios, locations); how you store and use it is your responsibility under the laws that apply to you, including China's PIPL and the GDPR.

### Feedback

If this Actor saved you time, a rating on its Store page helps others find it. Problems or requests: open an issue on the Issues tab.

# Actor input Schema

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

Note links copied from Xiaohongshu / RedNote, e.g. `https://www.xiaohongshu.com/explore/<id>?xsec_token=...`, an `xhslink.com` short link, or the share text the app copies. The `xsec_token` part is required: Xiaohongshu refuses a bare note ID or a link without it. Returns the full note (text, tags, counts, images, video link).

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

User profile links, e.g. `https://www.xiaohongshu.com/user/profile/<userId>` (a token is optional), or an `xhslink.com` short link. Returns one profile record with follower and like counts, and its newest notes (up to about 30) in `recentNotes` with title, likes, publish time and cover.

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

Public discovery feeds. Each page load returns about 35 notes the site recommends (not necessarily recent) with title, author, like count, creation time and cover. Leave note URLs and profile URLs empty to scrape these.

## `maxItems` (type: `integer`):

Stop after this many notes per channel or profile. A feed page gives about 35 notes; more pages are fetched by reloading, and can repeat notes (duplicates are dropped). A profile page gives at most about 30.

## `fetchNoteDetails` (type: `boolean`):

Feed notes carry a note ID and token, so each can be expanded into the full note (text, tags, publish time, comment, collect and share counts, video link) with one extra request. Profile notes cannot be expanded: Xiaohongshu hides their IDs from guests.

## `requestDelaySecs` (type: `number`):

Politeness pacing with random jitter.

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

Optional. Default is no proxy. Use Apify Proxy if Xiaohongshu blocks your run.

## Actor input object example

```json
{
  "noteUrls": [],
  "profileUrls": [],
  "feedChannels": [
    "recommend"
  ],
  "maxItems": 20,
  "fetchNoteDetails": false,
  "requestDelaySecs": 3
}
```

# Actor output Schema

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

No description

## `fullNotes` (type: `string`):

No description

## `profiles` (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 = {
    "noteUrls": [],
    "profileUrls": [],
    "feedChannels": [
        "recommend"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datagleaner/xiaohongshu-rednote-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 = {
    "noteUrls": [],
    "profileUrls": [],
    "feedChannels": ["recommend"],
}

# Run the Actor and wait for it to finish
run = client.actor("datagleaner/xiaohongshu-rednote-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 '{
  "noteUrls": [],
  "profileUrls": [],
  "feedChannels": [
    "recommend"
  ]
}' |
apify call datagleaner/xiaohongshu-rednote-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datagleaner/xiaohongshu-rednote-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/62b4hy4Cagx20uhCs/builds/E6QwQrhoRLet9S9bK/openapi.json
