# RedNote Xiaohongshu Scraper: Video Downloader & Notes (`stanvanrooy6/rednote-xiaohongshu-scraper`) Actor

Scrape RedNote (Xiaohongshu, 小红书) notes, watermark-free videos, creator profiles and explore feeds without login: title, text, tags, images, video, engagement and author. Paste note or app share links.

- **URL**: https://apify.com/stanvanrooy6/rednote-xiaohongshu-scraper.md
- **Developed by:** [Stan Van Rooy](https://apify.com/stanvanrooy6) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.
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

## RedNote Xiaohongshu Scraper: Video Downloader & Note Scraper 📕

**Free-plan sample:** Apify Free accounts can collect up to **100 result rows total per run**, shared across all inputs. Upgrade your [Apify plan](https://console.apify.com/billing/subscription) for larger runs. Normal Actor charges apply. The sample resets each run; it is not a daily or monthly quota.

> 小红书无水印视频下载与笔记采集：无需登录、无需 Cookie。粘贴笔记链接或 App 分享链接，下载高清视频、图片与完整笔记数据（标题、正文、话题标签、互动数据、作者信息）；支持博主主页与发现页。

The RedNote Xiaohongshu Scraper extracts **public note data, source video URLs, image galleries, and creator profiles** from RedNote (Xiaohongshu, 小红书) with **no customer login, no cookies, and no Chinese phone number required**. Returns source video URLs for video notes and image URLs for supported notes. No customer account is required. Public access can still be challenged or unavailable. Paste note links, app share texts (`xhslink.com`), creator profile links, or scrape the trending explore feed, then click Start.

Supported notes return with **title, full text, hashtags, all image URLs, source video URLs and durations for video notes, likes, collects, comments, shares, author details, and publish time**. Built for creators researching video content, brands tracking Chinese consumer trends, influencer discovery, and competitor analysis.

### 💎 Scraper Capabilities and Features

| Feature | Verified Capability | Technical Notes |
|---|---|---|
| **Account Requirements** | **None (100% Anonymous)** | No customer Xiaohongshu account, cookies, or phone number required |
| **Media Links** | **Source video & image URLs** | Returns direct video URLs for video notes and image URLs for image galleries |
| **Mobile App Share Links** | **Paste raw share text with emojis** | Parses `xhslink.com` and `xhslink.cn` short links automatically |
| **Explore Feed** | **12 categories supported** | Explore trending notes across Fashion, Cosmetics, Food, Travel, and more |
| **Precision Filtering** | **Keywords, media type, dates, engagement** | Filter by note type (image/video), likes, comments, and UTC publish date |
| **Export Formats** | **JSON, CSV, and Excel** | Download structured data via Apify Console or integrate with the REST API |
| **Access Limitations** | **Public guest access** | Public access can still be challenged, rate-limited, or unavailable |

### 🚀 How to scrape RedNote (Xiaohongshu)

1. Add what you want, in any mix:
   - **Note links**: copy a note link from xiaohongshu.com, or tap Share in the RedNote app and copy the link (`xhslink.com/...`). Pasting the whole share text works too.
   - **Profile links**: a creator's profile link or profile share link.
   - **Explore feed**: switch it on and pick categories to collect trending notes.
2. Click **Start**.
3. Download the results as JSON, CSV or Excel, or read them from the Apify API.

No RedNote account, no browser extension, no cookies to copy.

### 📊 What data do you get?

**Per note (one row each)**

- Note ID and a link that opens for anyone
- Type (image or video), title and full description text
- Hashtags / topics
- All image URLs, the cover image, and the video file URL and duration for video notes
- Likes, collects, comments and shares as numbers, plus the counts exactly as RedNote shows them (for example `6.9万`)
- Author: user ID, nickname, avatar and profile link
- Publish time and last update time (UTC)
- IP location label when RedNote shows one (for example `马来西亚`)

**Per profile (one row each)**

- Nickname, RED ID, bio, gender, IP location, location and profession tags, avatar
- Exact totals: notes posted, likes received, collects received
- Followers, following and likes plus collects as RedNote shows them to logged-out visitors (rounded bands such as `1万+`)
- The latest notes on the profile page (about 30): title, type, likes, cover, publish time, pinned or not

### 📥 Input

| Field | Type | Notes |
|---|---|---|
| `noteUrls` | array | Note links from xiaohongshu.com (with their `xsec_token`), app share links (`xhslink.com`, `xhslink.cn`) or whole share texts. |
| `profileUrls` | array | Creator profile links or profile share links. |
| `includeExplore` | boolean | Also read the public explore feed. Default `false`. |
| `exploreCategories` | array | `recommended` (default), `fashion`, `food`, `cosmetics`, `movies_tv`, `career`, `relationships`, `home`, `gaming`, `travel`, `fitness`, `video`. |
| `maxExploreNotes` | integer | Notes per explore category, 1 to 500. Default `30`. |
| `noteType` | string | Filter content type: `all` (default), `image`, or `video`. |
| `keywords` | array | Keep retrieved notes containing these literal words or phrases. |
| `excludeKeywords` | array | Exclude notes containing any of these words or phrases. |
| `keywordMatch` | string | Require `any` (default) or `all` inclusion keywords to match. |
| `dateFrom`, `dateTo` | string | UTC publication date window (`YYYY-MM-DD`). |
| `minLikes` | integer | Filter for notes with at least this many likes. |
| `minComments` | integer | Filter for notes with at least this many comments. |
| `knownNoteIds` | array | Note IDs from earlier runs to skip before fetching details or charging, up to 10,000. |
| `maxExploreNotesScanned` | integer | Safety ceiling on explore notes inspected per category (1 to 1,000). |
| `proxyConfiguration` | object | Advanced. Apify Proxy by default, with residential IPs as a fallback. |

**Explore feed example with video & engagement filters:**

```json
{
  "includeExplore": true,
  "exploreCategories": ["cosmetics", "fashion"],
  "noteType": "video",
  "minLikes": 500,
  "dateFrom": "2026-08-01",
  "maxExploreNotes": 50
}
```

### 📤 Output

Example note row:

```json
{
  "kind": "note",
  "note_id": "6a8d0d0c000000002a025ca6",
  "url": "https://www.xiaohongshu.com/explore/6a8d0d0c000000002a025ca6?xsec_token=...&xsec_source=pc_feed",
  "note_type": "video",
  "title": "现在看桑卓董真的好体面啊",
  "description": "#我的前半生[话题]# #电视剧[话题]#",
  "tags": ["我的前半生", "电视剧"],
  "images": ["http://sns-webpic-qc.xhscdn.com/..."],
  "image_count": 1,
  "cover_url": "http://sns-webpic-qc.xhscdn.com/...",
  "video_url": "http://sns-video-zl.xhscdn.com/stream/...",
  "video_duration_sec": 37,
  "likes": 69000,
  "collects": 1987,
  "comments": 950,
  "shares": 525,
  "counts_as_shown": {"likes": "6.9万", "collects": "1987", "comments": "950", "shares": "525"},
  "author": {
    "user_id": "5ba2ec80e1242f000195384a",
    "nickname": "爆火情报局",
    "avatar_url": "https://sns-avatar-qc.xhscdn.com/avatar/...",
    "profile_url": "https://www.xiaohongshu.com/user/profile/5ba2ec80e1242f000195384a?xsec_token=..."
  },
  "published_at": "2026-08-29T02:53:32Z",
  "updated_at": "2026-08-29T02:53:32Z",
  "ip_location": null,
  "source": "explore:recommended",
  "input_url": "https://www.xiaohongshu.com/explore",
  "scraped_at": "2026-09-26T21:00:00Z"
}
```

Links that do not open (a deleted or private note, a link without its token, a link that is not from RedNote) get a row with `kind: "error"` and a plain explanation, **free of charge**.

The dataset has two views: **Notes** and **Profiles**.

### ✨ Why this RedNote scraper

- **No customer login.** Reads public data visible to logged-out visitors on xiaohongshu.com. No customer account or cookies required. Public access can still be challenged or unavailable.
- **Share links just work.** Paste what the RedNote app gives you, even the full share text with emoji and Chinese around the link.
- **Full note data, not previews.** High-resolution image URLs, source video URLs for video notes, hashtags, and all four engagement counts (likes, collects, comments, shares) as numbers and as shown.
- **Pay only for results.** $5 per 1,000 notes, and you are never charged for a link that does not open.

### 💡 Use cases

- **Brand and product research**: collect what people post about a product, a category or a competitor you found on RedNote.
- **Influencer discovery**: pull creator profiles with their totals and latest notes to shortlist partners.
- **Trend tracking**: read the explore feed on a schedule and see what is trending.
- **Content analysis**: titles, hashtags and engagement for thousands of notes as a dataset.
- **Archiving**: keep a copy of notes and media links you need to reference.

### 🔌 RedNote API: run it from code

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("stanvanrooy6/rednote-xiaohongshu-scraper").call(run_input={
    "noteUrls": ["http://xhslink.com/o/32cITRQ8kgS"],
    "includeExplore": True,
    "exploreCategories": ["recommended"],
    "maxExploreNotes": 50,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["kind"], row.get("title"), row.get("likes"))
```

### ⚠️ Limits and good to know

- **Large runs keep going.** RedNote pauses a single connection after about 100 notes in a row. The Actor moves to a fresh connection before that and after any pause, so long runs continue. If RedNote keeps pausing, the run stops cleanly, keeps (and charges only) what it saved, and lists the links it did not reach as free `not_read` rows.
- **Only public, logged-out content.** Keyword search and comments on RedNote need a login, so this Actor does not offer them. It never logs in, never uses cookies from you and never solves captchas.
- **Links need their token.** RedNote only opens a note for logged-out visitors when the link carries its `xsec_token`. Copy the full link from the site or use a share link from the app; a bare `/explore/<id>` link gets a free error row.
- **Profile note lists have no links.** For logged-out visitors, RedNote hides the IDs of the notes on a profile page, so `latest_notes` has titles, likes, covers and dates but no note links. Follower counts are the rounded bands RedNote shows (`1万+`); notes posted, likes and collects are exact.
- **Explore categories can be older.** Logged-out category feeds (food, travel and so on) can show notes that are months or years old. The recommended feed shows current notes.
- **Media links.** Image and video URLs are the ones RedNote serves at the time of the run. Download files soon after the run if you need them.

### 💰 Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Note | $0.005 ($5 per 1,000 notes) |
| Profile | $0.005 per profile row |
| Actor start | $0.002 per GB of memory (512 MB by default, so one start event) |

Error rows are free. Higher Apify plans pay less per event (Silver 10% off, Gold and up 20% off). You can cap the cost of any run with the maximum cost per run setting; the run stops cleanly when it is reached.

### 🎯 Example inputs

**One note from a share text**

```json
{"noteUrls": ["【标题】 http://xhslink.com/o/32cITRQ8kgS 复制本条信息，打开【小红书】App查看精彩内容！"]}
```

**Creator profiles**

```json
{"profileUrls": ["https://www.xiaohongshu.com/user/profile/5ba2ec80e1242f000195384a?xsec_token=..."]}
```

**Trending notes in three categories**

```json
{"includeExplore": true, "exploreCategories": ["recommended", "fashion", "cosmetics"], "maxExploreNotes": 30}
```

### ❓ FAQ

#### Is RedNote the same as Xiaohongshu?

Yes. RedNote is the international name of Xiaohongshu (小红书, "Little Red Book"). This Actor works with links from xiaohongshu.com and the RedNote app's share links.

#### Do I need a RedNote account?

No. The Actor reads public pages the way a logged-out visitor sees them.

#### Can I scrape RedNote search results or comments?

Not with this Actor. RedNote asks for a login for search and comments, and this Actor does not log in.

#### Why did a note link give an error row?

The note may be deleted or private, or the link lost its `xsec_token`. Copy the link again from the site, or use the app's share link. Error rows are not charged.

#### How do I export RedNote data to Excel or CSV?

Open the run's dataset and choose Excel or CSV, or use the dataset API with `format=csv` or `format=xlsx`.

#### Is it legal to scrape RedNote?

The Actor collects publicly visible content only and no private data. You are responsible for how you use the data; respect the platform's terms, privacy law (including China's PIPL) and takedown requests.

#### Can you add a field or an option I need?

Yes, open an issue on the Issues tab with an example link.

### 🤝 Feedback and feature requests

Found a bug or need a field? Open an issue on the Issues tab with the link you used. Issues are answered quickly.

### 🔗 Related scrapers

- **[TikTok Transcript Scraper](https://apify.com/stanvanrooy6/tiktok-transcript-scraper)**: transcripts, captions and subtitles of TikTok videos.
- **[TikTok Profile Scraper](https://apify.com/stanvanrooy6/tiktok-profile-scraper)**: TikTok profiles and their full post feed.
- **[TikTok Comments Scraper](https://apify.com/stanvanrooy6/tiktok-comments-scraper)**: comments and replies of TikTok videos.
- **[TikTok Search Scraper](https://apify.com/stanvanrooy6/tiktok-search-scraper)**: TikTok videos by keyword.

### Filter notes and skip previous results

Filter note links and explore results with `noteType` (`all`, `image`, `video`), inclusive UTC `dateFrom` / `dateTo` (`YYYY-MM-DD`), `minLikes`, and `minComments`. Engagement filters use the displayed counts, which RedNote may round. Notes with unknown dates or counts are excluded when the corresponding filter requires them. Profile rows and their embedded summaries are unchanged by note filters.

`keywords` matches literal words or phrases in the retrieved title, description and tags, case-insensitively. Set `keywordMatch` to `any` or `all`. `excludeKeywords` removes notes containing any excluded phrase. This is filtering of public notes already retrieved, not RedNote keyword search. It does not extract comment threads or full creator history.

Pass previous `note_id` values in `knownNoteIds` to skip up to 10,000 already collected notes before fetching their details or charging. The actor does not persist a monitoring collection automatically; your workflow supplies these IDs on each run.

`maxExploreNotes` is the maximum number of matching notes saved per category. The actor keeps looking past nonmatching notes. `maxExploreNotesScanned` bounds how many note pages it checks per category (1 to 1,000); when omitted, the budget is the greater of 100 or `maxExploreNotes`. Previously known notes do not spend this budget. Each category also has a limit of 30 feed refreshes, and stops when a refresh offers no new notes. The available feed, run budget and shared Free-plan cap can stop it earlier.

Only matching notes are charged. The Output tab includes a `SUMMARY` report with delivered, filtered, skipped and scanned counts plus each category's stopping reason. Exhausting a public feed does not mean the full history was collected. Profile rows explicitly report `history_complete: false` and `notes_scope: "public_profile_page_summaries"`.

```json
{
  "includeExplore": true,
  "exploreCategories": ["food"],
  "noteType": "video",
  "minLikes": 100,
  "maxExploreNotes": 10,
  "maxExploreNotesScanned": 100,
  "knownNoteIds": []
}
```

# Actor input Schema

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

RedNote (Xiaohongshu) note links, one per line. Paste a link from xiaohongshu.com (it includes an xsec\_token) or a share link from the app such as http://xhslink.com/o/... The whole share text copied from the app works too.

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

Creator profile links such as https://www.xiaohongshu.com/user/profile/<id>?xsec\_token=... or a profile share link. Each profile returns one row with the creator's details and a summary of the latest notes on the profile page.

## `includeExplore` (type: `boolean`):

Also scrape trending notes from the public RedNote explore feed (full note details for each).

## `exploreCategories` (type: `array`):

Which explore feeds to read. Recommended is the main feed.

## `maxExploreNotes` (type: `integer`):

Maximum matching notes to save per explore category (1 to 500), subject to available public notes, scan budget, run budget and Free-plan cap.

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

Apify Proxy is used by default, with residential IPs as a fallback when RedNote keeps pausing a connection.

## `keywords` (type: `array`):

Keep retrieved content containing these literal words or phrases, case-insensitive. This filters retrieved content; it does not extend source coverage.

## `excludeKeywords` (type: `array`):

Exclude content containing any of these literal words or phrases, case-insensitive.

## `keywordMatch` (type: `string`):

Require any or all inclusion keywords. Exclusions always take precedence.

## `noteType` (type: `string`):

Keep image notes, video notes, or both. Applies to note links and explore results; profile rows are unchanged.

## `dateFrom` (type: `string`):

Keep notes published on or after this UTC date, YYYY-MM-DD. Notes without a publication date are excluded.

## `dateTo` (type: `string`):

Keep notes published on or before this UTC date, YYYY-MM-DD.

## `minLikes` (type: `integer`):

Minimum displayed likes. RedNote may round large counts; unknown counts are excluded when this is positive.

## `minComments` (type: `integer`):

Minimum displayed comment count. This filters notes; it does not extract comment text.

## `knownNoteIds` (type: `array`):

note\_id values from earlier results, up to 10,000. Known notes are skipped before fetching details or charging. Apply manually or pass previous IDs in your scheduled workflow.

## `maxExploreNotesScanned` (type: `integer`):

Stop after checking this many note pages per category, even if fewer notes match. Known IDs do not use this budget. If omitted, check up to the greater of 100 or Max notes per explore category. Feed refreshes are also limited to 30.

## Actor input object example

```json
{
  "noteUrls": [],
  "profileUrls": [],
  "includeExplore": true,
  "exploreCategories": [
    "recommended"
  ],
  "maxExploreNotes": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "keywordMatch": "any",
  "noteType": "all",
  "minLikes": 0,
  "minComments": 0
}
```

# Actor output Schema

## `notes` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `allRows` (type: `string`):

No description

## `summary` (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": [],
    "includeExplore": true,
    "exploreCategories": [
        "recommended"
    ],
    "maxExploreNotes": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stanvanrooy6/rednote-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 = {
    "noteUrls": [],
    "profileUrls": [],
    "includeExplore": True,
    "exploreCategories": ["recommended"],
    "maxExploreNotes": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("stanvanrooy6/rednote-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 '{
  "noteUrls": [],
  "profileUrls": [],
  "includeExplore": true,
  "exploreCategories": [
    "recommended"
  ],
  "maxExploreNotes": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call stanvanrooy6/rednote-xiaohongshu-scraper --silent --output-dataset

```

## MCP server setup

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