# RedNote (Xiaohongshu) Scraper | All-In-One (`toolzerhub/rednote-xiaohongshu-scraper`) Actor

Extract RedNote (Xiaohongshu) posts, profiles, comments, products, and topics in one Actor. Add a post link, profile link, keyword, or product ID and get titles, captions, like, comment and save counts, author details, prices, and review scores.

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

## Pricing

from $2.40 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## RedNote (Xiaohongshu) Scraper

Pull RedNote (Xiaohongshu) posts, profiles, comments, products, topics, and feeds from one Actor. Give it a post link, a profile link, a keyword, or a product ID, and it returns structured rows — titles, captions, like/comment/save counts, author details, prices, and review scores. No login or session cookie required: the fields a session would carry — `xsec_token`, `cookie`, `session` — are stripped from input before a request is ever built, not merely left unused.

### Modes

Set **`scraperType`** to pick what this run collects. Each mode takes its own identifier below the picker.

| Mode | Returns | Needs | Or use the focused Actor |
|---|---|---|---|
| Post details | One image or video post's full record | `post_id_or_url` and `content_type` | [RedNote Post Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-post-scraper) |
| Post comments | A post's comments, with optional nested replies | `post_id_or_url` | [RedNote Comments Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-comments-scraper) |
| Profile details | One profile's public data | `profile_id_or_url` | [RedNote Profile Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-profile-scraper) |
| Profile posts | Every public post on a profile | `profile_id_or_url` | [RedNote Profile Posts Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-profile-posts-scraper) |
| Profile favorites | A profile's publicly visible saved posts | `profile_id_or_url` | [RedNote Favorites Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-favorites-scraper) |
| Search posts | Posts matching a keyword | `query` | [RedNote Search Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-search-scraper) |
| Search profiles | Profiles matching a keyword | `query` | [RedNote Profile Search Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-profile-search-scraper) |
| Search images | Image-only posts matching a keyword | `query` | [RedNote Image Search Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-image-search-scraper) |
| Search products | Product listings matching a keyword | `query` | [RedNote Product Search Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-product-search-scraper) |
| Search groups | Interest groups matching a keyword | `query` | [RedNote Group Search Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-group-search-scraper) |
| Topic details | One topic's public metadata | `topic_id` | [RedNote Topic Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-topic-scraper) |
| Topic notes | Posts tagged with a topic | `topic_id` | [RedNote Topic Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-topic-scraper) |
| Product details | One product's raw detail record | `product_id` | [RedNote Product Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-product-scraper) |
| Product review overview | A product's average score and review count | `product_id` | [RedNote Product Reviews Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-product-reviews-scraper) |
| Product reviews | Every individual review for a product | `product_id` | [RedNote Product Reviews Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-product-reviews-scraper) |
| Product recommendations | Products RedNote recommends alongside one product | `product_id` | [RedNote Product Recommendations Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-product-recommendations-scraper) |
| Creator inspiration | Content-idea prompts for creators | none | [RedNote Creator Inspiration Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-creator-inspiration-scraper) |
| Hot creator inspiration | Currently trending content-idea prompts | none | [RedNote Creator Inspiration Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-creator-inspiration-scraper) |
| Home feed | The public RedNote home feed | none | [RedNote Home Feed Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-home-feed-scraper) |
| Hot trends | The current hot-topics list | none | [RedNote Hot Trends Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-hot-trends-scraper) |

**`scraperType`** is the only field this Actor marks required. Every other field is mode-specific, and most identifier fields raise a plain error when they're missing rather than an empty run — `Provide a public post URL or post ID`, `Provide a public profile URL or profile ID`, `Provide a search query`, `Provide a topic ID`, `Provide a product ID`. Post Details additionally requires `content_type` on top of the post identifier, and stops with `Choose whether the post is an image post or video post` if it's left unset — there's no default, because the two content types hit different endpoints.

### One Actor or sixteen?

The twenty modes above are also sold as sixteen focused Actors (a few pair two closely related modes, like Topic Details and Topic Notes, behind one Actor). Reach for a focused Actor once you know exactly which dataset you're pulling at scale — a post's comment tree, one profile's posts, product reviews for one listing. Reach for this Actor when a research project spans several of those — a topic's metadata plus its posts plus each poster's profile, say — because that's one Actor integration instead of switching between several.

### Input

```json
{
  "scraperType": "postDetails",
  "post_id_or_url": "https://www.xiaohongshu.com/explore/64f...",
  "content_type": "image"
}
```

`post_id_or_url` and `profile_id_or_url` both accept a bare ID or a page URL. `topic_id` and `product_id` do not — RedNote's topic and product pages carry a URL that doesn't resolve to the ID directly, so both modes need the ID itself. `maxItems` (default `100`, `0` for no limit) caps every paginated mode; Post Details, Profile Details, Topic Details, Product Details, and Product Review Overview each return a single record instead.

### Output

Field names vary by mode. Across the twenty, the ones you'll see most are:

| Field | Contents |
|---|---|
| **`id`**, **`title`**, **`desc`**, **`type`** | Post identifiers, title, and content type |
| **`user`** | Author record |
| **`liked_count`**, **`comments_count`**, **`share_count`**, **`collected_count`** | Post engagement |
| **`red_id`**, **`nickname`**, **`fans`**, **`follows`** | Profile data |
| **`content`**, **`like_count`**, **`time`** | Comment data |
| **`avgScore`**, **`total`**, **`reviewId`**, **`itemScore`** | Product review data |
| **`price_info`**, **`vendor`**, **`stock_status`** | Product listing data |
| **`rank`**, **`hot`**, **`hot_value`**, **`trend`** | Hot-topics data |

```json
{
  "id": "64f8a2b1000000001203abcd",
  "title": "Weekend recipe idea",
  "desc": "Simple pasta dish for two",
  "type": "normal",
  "user": { "nickname": "creator123", "userid": "5f3a..." },
  "liked_count": "1.2k",
  "comments_count": "89"
}
```

### Questions

**I ran Profile Favorites on a public profile and got zero rows. Is that broken?**
No. RedNote keeps favorites private by default, and every public profile checked while building this Actor returned an empty favorites list regardless of how active or public the account otherwise was. A profile with a public favorites tab will return rows; most don't have one. An empty run here is the platform's own visibility setting, not a failed request.

**Can I paste a topic or product page URL into `topic_id` or `product_id`?**
No — unlike `post_id_or_url` and `profile_id_or_url`, these two fields need the bare ID, not the page link. RedNote's topic and product URLs don't resolve back to the ID the way post and profile URLs do.

**Product Details returns one big `module` field instead of separate price and title columns. Why?**
That mode intentionally ships the raw card/module tree rather than flattened fields — the real product data (title, price, images) lives inside per-card blocks whose structure varies by card type, and not every variant has been verified against a live response. Use Search Products or Product Recommendations for pre-flattened `title`/`price` columns; use Product Details when you need the full raw structure.

**What's the difference between Product Review Overview and Product Reviews?**
Overview returns one summary record — average score, total review count, purchase-history count — and nothing else; the individual review sample RedNote's own overview endpoint bundles alongside those stats is deliberately dropped, because it's a partial, unflattened sample of the same reviews Product Reviews paginates properly. Use Product Reviews when you need the actual review text and ratings.

**Does Hot Trends support a region filter?**
No. The `region` field exists in this Actor's shared schema for other modes, but Hot Trends doesn't use it — the request is unparameterized beyond pagination.

**Do the add-ons (`addonPostDetails`, `addonProfileDetails`, `addonProductDetails`) always add a billed request?**
Only when they return something. Profile Posts, Search Profiles, and Search Products each apply their add-on as a follow-up request per row; a failed or empty follow-up leaves the original row in place, unbilled, rather than dropping it.

**Is a RedNote login or session cookie ever required?**
No. Session-specific fields — `xsec_token`, `xsec_source`, `cookie`, `session` — are stripped from every request before it's built, across all twenty modes.

### Related Actors

| Actor | Purpose |
|---|---|
| [RedNote Post Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-post-scraper) | One post's full record |
| [RedNote Comments Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-comments-scraper) | One post's comments |
| [RedNote Profile Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-profile-scraper) | One profile's public data |
| [RedNote Search Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-search-scraper) | Keyword search across posts |
| [RedNote Product Reviews Scraper](https://apify.com/toolzerhub/rednote-xiaohongshu-product-reviews-scraper) | One product's review summary and full review list |

# Actor input Schema

## `scraperType` (type: `string`):

Choose the dataset for this run, then fill in the section for that mode below.

## `post_id_or_url` (type: `string`):

Public RedNote post ID or full post URL.

## `content_type` (type: `string`):

Kind of content to return. In post detail mode this is detected from the post itself unless you pick image or video here.

## `include_replies` (type: `boolean`):

Also collect replies for each returned top-level comment.

## `comment_sort` (type: `string`):

Order for post comments.

## `profile_id_or_url` (type: `string`):

Public RedNote profile ID or full profile URL.

## `addonPostDetails` (type: `boolean`):

Fetch full post detail for every post found. This makes one extra request per post and adds a charge per enriched row.

## `query` (type: `string`):

Words or phrase to search for.

## `sort` (type: `string`):

Order for post search.

## `time_range` (type: `string`):

Time window for post search.

## `ai_mode` (type: `boolean`):

Limit post search to AI-generated content when the source identifies it.

## `addonProfileDetails` (type: `boolean`):

Fetch full profile detail for every profile found. This makes one extra request per profile and adds a charge per enriched row.

## `topic_id` (type: `string`):

A RedNote topic ID, as returned in the `topic_id` field of a topic search result. A topic page URL is not accepted — paste the ID itself.

## `topic_sort` (type: `string`):

Order for posts in a topic.

## `product_id` (type: `string`):

A RedNote product ID, as returned by the Product Search Actor. A product page URL is not accepted — paste the ID itself.

## `review_sort` (type: `string`):

Order for product reviews.

## `only_with_images` (type: `boolean`):

Limit product reviews to reviews containing images.

## `addonProductDetails` (type: `boolean`):

Fetch full product detail for every product found. This makes one extra request per product and adds a charge per enriched row.

## `category` (type: `string`):

Optional category for the home feed.

## `include_images` (type: `boolean`):

Include image material in the home feed.

## `inspiration_category` (type: `integer`):

Optional numeric category for creator inspiration.

## `region` (type: `string`):

Optional region code for localized feeds and trends.

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

Maximum rows to save. Set 0 to keep collecting until the source is exhausted.

## Actor input object example

```json
{
  "scraperType": "postDetails",
  "post_id_or_url": "https://www.xiaohongshu.com/explore/69280b85000000001e00971c",
  "content_type": "all",
  "include_replies": false,
  "comment_sort": "latest",
  "profile_id_or_url": "https://www.xiaohongshu.com/user/profile/61b46d790000000010008153",
  "addonPostDetails": false,
  "query": "matcha",
  "sort": "relevance",
  "time_range": "all",
  "ai_mode": false,
  "addonProfileDetails": false,
  "topic_id": "5c0f88613767f600014c79f8",
  "topic_sort": "trending",
  "product_id": "6627305f3152260001509721",
  "review_sort": "relevance",
  "only_with_images": false,
  "addonProductDetails": false,
  "category": "recommended",
  "include_images": true,
  "inspiration_category": 0,
  "region": "US",
  "maxItems": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Every record collected during this run

# 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 = {
    "post_id_or_url": "https://www.xiaohongshu.com/explore/69280b85000000001e00971c",
    "profile_id_or_url": "https://www.xiaohongshu.com/user/profile/61b46d790000000010008153",
    "query": "matcha",
    "topic_id": "5c0f88613767f600014c79f8",
    "product_id": "6627305f3152260001509721",
    "category": "recommended",
    "region": "US",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("toolzerhub/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 = {
    "post_id_or_url": "https://www.xiaohongshu.com/explore/69280b85000000001e00971c",
    "profile_id_or_url": "https://www.xiaohongshu.com/user/profile/61b46d790000000010008153",
    "query": "matcha",
    "topic_id": "5c0f88613767f600014c79f8",
    "product_id": "6627305f3152260001509721",
    "category": "recommended",
    "region": "US",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("toolzerhub/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 '{
  "post_id_or_url": "https://www.xiaohongshu.com/explore/69280b85000000001e00971c",
  "profile_id_or_url": "https://www.xiaohongshu.com/user/profile/61b46d790000000010008153",
  "query": "matcha",
  "topic_id": "5c0f88613767f600014c79f8",
  "product_id": "6627305f3152260001509721",
  "category": "recommended",
  "region": "US",
  "maxItems": 20
}' |
apify call toolzerhub/rednote-xiaohongshu-scraper --silent --output-dataset

```

## MCP server setup

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