# RedNote User Posts Scraper (`maximedupre/rednote-user-posts-scraper`) Actor

Scrape public RedNote/Xiaohongshu user post cards from profile URLs or IDs. Export titles, authors, post type, cover media, like counts, source profile URLs, and scrape time.

- **URL**: https://apify.com/maximedupre/rednote-user-posts-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$4.45 / 1,000 posts

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 user posts scraper for Xiaohongshu profiles

RedNote User Posts Scraper exports public post cards from [RedNote / Xiaohongshu](https://www.rednote.com/) profile pages. Paste RedNote or Xiaohongshu profile URLs, or raw profile IDs, and get one clean dataset row per public post card with title, author, post type, cover media, like count, profile mapping, source order, and scrape time.

Use this RedNote user posts scraper for creator research, influencer monitoring, China market research, content review, social media reporting, and public profile audits where you need the posts shown on a RedNote creator profile in a structured export instead of copying cards by hand.

For a quick first run, keep the prefilled profile target and `Posts per profile` set to `30`. The Actor saves only usable public post rows. Invalid, unavailable, blocked, private, or zero-result targets are reported in logs instead of creating placeholder rows.

### ✅ What this Actor does

- Scrapes public RedNote / Xiaohongshu user post cards from profile pages.
- Accepts RedNote profile URLs, Xiaohongshu profile URLs, and raw profile IDs.
- Saves one dataset item per successfully scraped public post card.
- Extracts post titles, author details, post type, cover image URLs, media dimensions, visible like counts, source order, and scrape timestamp.
- Preserves the submitted input and normalized profile URL so you can map every post back to the profile you submitted.
- Runs on public profile pages and does not ask for RedNote cookies, login, or API keys.
- Caps each profile at the public profile-page surface currently exposed by RedNote: up to 30 post cards.

This Actor is focused on user post cards from profile pages. It does not scrape RedNote search results, post comments, replies, followers, following lists, private profiles, logged-in-only data, or full post-detail pages.

### 📦 Data you can export

Each output item represents one public RedNote user post card. Core fields include:

- `sourceInput` and `inputIndex` - the submitted profile target and its row number.
- `sourceProfileUrl`, `resolvedProfileUrl`, and `profileId` - profile links and stable profile identifier.
- `author.userId`, `author.nickname`, and `author.avatarUrl`.
- `postId`, `postUrl`, and `xsecToken` when RedNote exposes them.
- `type` - the source post type, such as `video` when visible.
- `title` - the public post card title.
- `coverUrl` and `media` - cover image URLs plus width and height when available.
- `likesCount` and `likesCountText` - parsed and source-visible like count.
- `isPinned`, `sourceOrder`, and `scrapedAt`.

You can open the dataset in Apify, export it as JSON, CSV, Excel, XML, RSS, or HTML, call it through the Apify API, schedule repeat runs, or send results to webhooks and integrations.

### 🚀 Common use cases

- Export recent public post cards from RedNote creators.
- Review a creator's visible profile posts before outreach.
- Track RedNote / Xiaohongshu creator content for brand monitoring.
- Build creator or KOL research spreadsheets with titles, cover images, and likes.
- Feed RedNote post-card data into dashboards, alerts, or AI workflows.
- Schedule repeat checks for the same public profile list.
- Compare public profile post cards across multiple creators.

### ▶️ How to run it

1. Open the Input tab.
2. Add one RedNote or Xiaohongshu profile target per line in `Profile targets`.
3. Use full profile URLs when you have them, or paste raw profile IDs.
4. Keep `Posts per profile` at `30` for the full public profile-page card surface.
5. Run the Actor and open the dataset, or pull the rows through the Apify API.

### 🛠️ Input

#### 🧪 Example input

```json
{
	"profileTargets": [
		"https://www.rednote.com/user/profile/639946a0000000002702b173"
	],
	"maxPostsPerProfile": 30
}
````

#### 🎯 Profile targets

Add one profile target per line. Supported target forms:

- `https://www.rednote.com/user/profile/639946a0000000002702b173`
- `https://www.xiaohongshu.com/user/profile/639946a0000000002702b173`
- `639946a0000000002702b173`

#### 🔢 Posts per profile

Set how many public post cards to save from each submitted profile. The default and maximum are `30`, matching the current public profile-page surface RedNote exposes.

### 📊 Output example

```json
{
	"sourceInput": "https://www.rednote.com/user/profile/639946a0000000002702b173",
	"inputIndex": 0,
	"sourceProfileUrl": "https://www.rednote.com/user/profile/639946a0000000002702b173",
	"resolvedProfileUrl": "https://www.rednote.com/user/profile/639946a0000000002702b173",
	"profileId": "639946a0000000002702b173",
	"author": {
		"userId": "639946a0000000002702b173",
		"nickname": "Creator name",
		"avatarUrl": "https://sns-avatar-qc.xhscdn.com/avatar/example.jpg"
	},
	"postId": null,
	"postUrl": null,
	"xsecToken": "ABc...",
	"type": "video",
	"title": "Example public post title",
	"coverUrl": "http://sns-web-i10.rednotecdn.com/example.webp",
	"media": [
		{
			"type": "image",
			"url": "http://sns-web-i10.rednotecdn.com/example.webp",
			"width": 1011,
			"height": 1348
		}
	],
	"likesCount": 203,
	"likesCountText": "203",
	"isPinned": false,
	"sourceOrder": 1,
	"scrapedAt": "2026-06-02T17:20:00.000Z"
}
```

Fields can be `null` when RedNote does not expose that value for a specific public card. For example, the public profile page may expose a card title and cover image without a stable post ID.

### 💰 Pricing

This Actor uses pay-per-event pricing. You are charged for each public post card saved to the dataset. Targets that are invalid, unavailable, private, blocked, or return no usable public post cards do not create dataset rows.

### ⚠️ Limits and caveats

- RedNote currently exposes up to 30 public post cards on the profile page surface this Actor uses.
- Output is based on public profile-page cards, not full post-detail pages.
- Comments, replies, publish timestamps, collects, shares, and full media galleries are not part of this Actor's current contract unless RedNote exposes them in the public card data.
- Private, restricted, deleted, or unavailable profiles may return no rows.
- Source pages can change. If a run stops returning expected public post cards, file an issue from the Actor page.

### ❓ FAQ

#### Does this RedNote user posts scraper need cookies or login?

No. It is designed for public profile-page post cards and does not ask for RedNote cookies, a RedNote login, or a RedNote API key.

#### Can I scrape more than 30 posts per profile?

Not with the current public profile-page surface. The Actor caps `Posts per profile` at `30` so the input form matches the data RedNote currently exposes publicly.

#### Does it scrape comments or full post details?

No. This Actor saves user post cards from profile pages. It does not scrape comments, replies, followers, following lists, or full post-detail pages.

#### Can I export the results to CSV or Excel?

Yes. Open the dataset after the run and export it as JSON, CSV, Excel, XML, RSS, or HTML, or access the same data through the Apify API.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~rednote-user-posts-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [RedNote Profile Scraper ↗](https://apify.com/maximedupre/rednote-profile-scraper) - Export public RedNote profile identity, bio, avatars, and follower metrics.
- [Douyin Analytics Scraper ↗](https://apify.com/maximedupre/douyin-analytics-scraper) - Collect Douyin hot search trend ranks, hot values, and source timestamps.
- [TikTok Profile Mention Scraper ↗](https://apify.com/maximedupre/tiktok-profile-mention-scraper) - Find public TikTok videos that mention selected profile handles.
- [TikTok Hashtag Search Scraper ↗](https://apify.com/maximedupre/tiktok-hashtag-search-scraper) - Export ranked TikTok hashtag ideas and public hashtag metrics.
- [TikTok Keywords Discovery Tool ↗](https://apify.com/maximedupre/tiktok-keywords-discovery-tool) - Collect TikTok autocomplete keyword suggestions from seed terms.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `profileTargets` (type: `array`):

Add one RedNote/Xiaohongshu profile per line. Use full profile URLs such as https://www.rednote.com/user/profile/639946a0000000002702b173 or paste raw profile IDs.

## `maxPostsPerProfile` (type: `integer`):

Maximum public post cards to save from each profile. RedNote currently exposes up to 30 cards on the public profile page.

## Actor input object example

```json
{
  "profileTargets": [
    "https://www.rednote.com/user/profile/639946a0000000002702b173"
  ],
  "maxPostsPerProfile": 30
}
```

# Actor output Schema

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

Open the dataset with post titles, authors, post type, cover media, like counts, source profile URLs, profile mapping, source order, and scrape timestamps.

# 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 = {
    "profileTargets": [
        "https://www.rednote.com/user/profile/639946a0000000002702b173"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/rednote-user-posts-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 = { "profileTargets": ["https://www.rednote.com/user/profile/639946a0000000002702b173"] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/rednote-user-posts-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "profileTargets": [
    "https://www.rednote.com/user/profile/639946a0000000002702b173"
  ]
}' |
apify call maximedupre/rednote-user-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/rednote-user-posts-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RedNote User Posts Scraper",
        "description": "Scrape public RedNote/Xiaohongshu user post cards from profile URLs or IDs. Export titles, authors, post type, cover media, like counts, source profile URLs, and scrape time.",
        "version": "0.1",
        "x-build-id": "hhQsDNhORsRJzQ7xN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~rednote-user-posts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-rednote-user-posts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~rednote-user-posts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-rednote-user-posts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~rednote-user-posts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-rednote-user-posts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "profileTargets"
                ],
                "properties": {
                    "profileTargets": {
                        "title": "Profile targets",
                        "type": "array",
                        "description": "Add one RedNote/Xiaohongshu profile per line. Use full profile URLs such as https://www.rednote.com/user/profile/639946a0000000002702b173 or paste raw profile IDs.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "maxPostsPerProfile": {
                        "title": "Posts per profile",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum public post cards to save from each profile. RedNote currently exposes up to 30 cards on the public profile page.",
                        "default": 30
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
