# RedNote (Xiaohongshu) User Profile Scraper (`dami_studio/rednote-profile-scraper`) Actor

Scrape public RedNote (Xiaohongshu) profiles by URL or user ID: nickname, RedNote ID, avatar, bio, exact follower counts, likes and collects, verification, IP location, gender, profession, recent notes. No login. $2.90 per 1,000 - the lowest per-profile price of any active RedNote actor.

- **URL**: https://apify.com/dami\_studio/rednote-profile-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 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) User Profile Scraper / API

Give it RedNote profile links or user IDs. Get back the profile: nickname, RedNote ID, avatar,
banner, bio, follower count, following count, likes + collects, verification badge, IP location,
gender, city, profession, and the user's recent notes with likes, collects and comments on each.

No login. No cookies to paste. No browser — this is a plain HTTP scraper, which is why it is cheap.

**$2.90 per 1,000 profiles ($0.0029 each), plus $0.003 each time a run starts — the lowest
per-profile price of any RedNote / Xiaohongshu Actor on the Apify Store with an active user base.**
Resolved against the live Store on 10 August 2026, comparing every rival at its own cheapest volume
tier: the next cheapest is `actorzlab/rednote-scraper` (18 monthly users) at $3.00 per 1,000, the
dedicated `zen-studio/rednote-user-profile-scraper` (111 monthly users) is $4.99 per 1,000 and $5.99
on the free plan, and the two highest-priced, `sian.agency/xiaohongshu-rednote-scraper` (327 monthly
users) and `zhorex/rednote-xiaohongshu-scraper` (198 monthly users), are $37.50 and $40.00 per 1,000.
You are charged per profile actually returned — blocked pages, missing users and empty runs cost
nothing.

### What you get per profile

Real values from a real row (`5b723a65c756070001d43c6c`, scraped 2026-08-10):

| Field | Value |
|---|---|
| `userId` | `5b723a65c756070001d43c6c` |
| `url` | the profile URL that was fetched |
| `nickname` | `无糖小馒头` |
| `redId` | `607277765` — the "小红书号" people search each other by |
| `avatar` | `https://sns-avatar-qc.xhscdn.com/avatar/1040g2jo321mc2hj8no2g4adsdrt6af3c9k9v6p8?…` |
| `bannerImage` | the profile header image |
| `description` | `十年美食无人问，一朝绑匪天下知。` |
| `followerCount` | `1306` |
| `followerCountText` | `1306` — the exact string the page showed |
| `followerCountIsExact` | `true` |
| `followingCount` | `67` |
| `likesAndCollectsCount` | `93700` |
| `likesAndCollectsCountText` | `93.7K` |
| `countsAreApproximate` | `true` — set when either count above was abbreviated |
| `ipLocation` | `浙江` |
| `gender` | `male` / `female` / `null` |
| `location` | `浙江杭州` — the city chip on the profile, when set |
| `profession` | `FoodBlogger` — the profession chip, when set |
| `isVerified` / `verifiedType` / `verifiedReason` | `true` / `2` / `电视台` |
| `tags` | `["25岁", "浙江杭州", "FoodBlogger"]` |
| `recentNoteCount` / `recentNotes` | `[{ title, type, likedCount, collectedCount, commentCount, pinned, coverImage }, …]` |
| `source`, `scrapedAt` | provenance |

### Field coverage — measured, not guessed

220 profiles pulled from RedNote's live explore feed on 2026-08-10, one run, nothing excluded:

| Field | Filled |
|---|---|
| `nickname`, `redId`, `avatar`, `bannerImage` | 100% |
| `followerCount`, `followerCountText`, `likesAndCollectsCount` | 100% |
| `recentNotes` (6.9 notes per profile on average) | 100% |
| `followingCount` | 97.7% |
| `description` | 90.0% |
| `ipLocation` | 81.4% |
| `gender` | 74.1% |
| `tags` | 70.9% |
| `location` | 47.3% |
| `profession` | 40.0% |
| `verifiedReason` | 6.4% |
| `isVerified` = true | 5.9% |

Inside `recentNotes`: `type`, `collectedCount`, `commentCount` and `coverImage` on 100%,
`likedCount` on 96.5%, `title` on 98.4%.

The fields below 100% are blank because the creator left them blank — most people have no profession
chip and only 5% of accounts are verified. Nothing here is null because the scraper failed to read it.

### Follower counts: exact for most accounts

RedNote gives the exact number up to about 10,000 followers and abbreviates above it. Across those
220 profiles, **52.7% came back exact** (`5911`, `1306`, `83`) and the rest abbreviated to one
decimal (`194.8K`, `15.9K`). Both readings are returned:

- `followerCount` — a number, so you can sort and filter.
- `followerCountText` — the original string.
- `followerCountIsExact` — `true` when the string was a plain integer.

`countsAreApproximate` is `true` whenever the follower or likes figure was abbreviated. `194.8K`
becomes `194800`, which is within 0.05% of the truth — not a bucket floor.

### Input

```json
{
  "profileUrls": [
    "https://www.xiaohongshu.com/user/profile/5b723a65c756070001d43c6c",
    "620f2fbd000000001000e44c"
  ],
  "maxNotesPerProfile": 10
}
```

Bare 24-character user IDs work as well as full URLs. `maxItems` is a cap, not a target: leave it at
`0` and you get one row per URL you supplied.

`includeExploreFeed` is an optional extra that tops the list up with authors from RedNote's public
explore feed, so you can try the Actor without hunting for links first. It is off by default.

### Throughput

Two runs on the Apify platform, 2026-08-10: 220 of 220 profiles in 47 seconds, and 240 of 240 in
72 seconds, at 8 concurrent requests. About 47 KB of traffic per profile.

The Actor opens each profile through RedNote's mobile page. That page needs an `xsec_token`, which
the Actor mints for itself from the public explore feed at the start of every run — one request, and
the token then opens every profile in the queue. You never have to supply one.

The one thing that can go wrong is that mint. RedNote meters its server-rendered pages per exit
address, and on a busy day it answers with an empty client-render shell instead. The Actor walks
several exit pools looking for one that answers. If none does, you get a single uncharged
`TOKEN_UNAVAILABLE` row and the run stops immediately rather than burning your compute — re-run a few
minutes later, or paste a token from your own browser into the `xsecToken` input. A token stays valid
for at least an hour and works for every profile.

### Limits, stated plainly

**No note permalinks.** The profile page identifies each recent note by a 32-character hash, not by
the 24-character note ID that `/explore/<id>` accepts. There is no way to turn one into the other, so
the Actor returns each note's title, type, likes, collects, comments and cover image, and does not
emit a `url` it knows would 404. If you need note bodies, use the companion
[RedNote Scraper](https://apify.com/dami_studio/rednote-scraper), which reads note pages directly.

**There is no lifetime note total.** The profile shows following, followers and likes+collects. It
does not show "posted N notes", so the Actor does not invent one. `recentNoteCount` is how many
recent notes are in that row, not the user's career total.

**The explore feed is a bonus, not a feature.** It yields about thirty authors per page and is
refused more often than a profile page. When it is on and RedNote refuses it, you get one uncharged
`FEED_UNAVAILABLE` row and the run carries on with the URLs you supplied.

**A user ID that does not exist looks identical to a refusal.** RedNote serves the same login shell
for both, so the diagnostic row mentions both possibilities. Check the ID before assuming you were
rate-limited.

**Bios are as written.** RedNote's own "还没有简介" placeholder ("no bio yet") is site text, not user
text, so it comes back as `null`.

**No email or phone.** RedNote does not publish either on a profile, so neither is in the output.

### Billing

$2.90 per 1,000 profiles, plus $0.003 when the run starts. One charge per profile row actually
returned. Blocked pages, missing users, `TOKEN_UNAVAILABLE` and empty runs produce `_diagnostic` rows
that cost nothing. An empty input returns one labelled `_sample` row so you can see the shape, also
free.

A 100-profile run costs $0.293. A 1,000-profile run costs $2.903. Flat rate — no volume tiers, no
plan gates, so those are the numbers on the free plan and on Diamond alike.

### FAQ

**Do I need a RedNote account or cookies?**
No. Everything here is the public, signed-out profile page.

**Is RedNote the same thing as Xiaohongshu?**
Yes. 小红书 / Xiaohongshu is the Chinese name; RedNote is what most English speakers call it.

**How do I find a user ID?**
Open any RedNote post, click the author, and copy the URL. The 24-character hex string after
`/user/profile/` is the ID. Paste either the whole URL or just that string.

**Do I get exact follower counts?**
For most accounts, yes — RedNote publishes the exact number up to roughly 10,000 followers. Above
that it abbreviates to one decimal place (`194.8K`). `followerCountIsExact` tells you which you got;
it was `true` on 52.1% of a 240-profile sample.

**Can I get a user's full note history?**
No. You get up to 30 recent notes from the first page of the profile, with their engagement counts
but without permalinks.

**What is the `xsecToken` input for?**
Nothing, normally — leave it empty and the Actor mints its own. It exists only so you can unblock a
run that reported `TOKEN_UNAVAILABLE`, by pasting the `xsec_token` out of your browser's address bar.

**What happens if a profile is deleted or the ID is wrong?**
You get an uncharged diagnostic row with an `errorCode` and a hint. You are not billed for it.

**Can it run on a schedule?**
Yes, like any Actor.

**How does the price compare?**
$2.90 per 1,000 profiles — the lowest per-profile price of any RedNote / Xiaohongshu Actor on the
Store with an active user base. Every rival was compared at its own cheapest volume tier, not its
headline rate: `actorzlab/rednote-scraper` is $3.00 per 1,000, the dedicated
`zen-studio/rednote-user-profile-scraper` is $4.99 (and $5.99 on the free plan),
`socialdatax/socialdatax-xhs-data-api` and `habit.zhou/xiaohongshu-pro-scraper` are $4.99 and $5.00,
and the two at the top of the market are $37.50 and $40.00. Prices checked 2026-08-10.

# Actor input Schema

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

The main input. RedNote profile links (https://www.xiaohongshu.com/user/profile/...) or bare 24-character user IDs. One row is returned per URL. If your links still carry the ?xsec\_token=... they came with, keep it - it saves the Actor a request.

## `maxNotesPerProfile` (type: `integer`):

How many of the profile's recent notes to include (0-30). Each note carries its title, type, likes, collects, comments and cover image. Set 0 to skip them.

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

Cap on profiles returned. Leave at 0 to return one row for every profile URL you supply. You are charged per profile actually returned.

## `includeExploreFeed` (type: `boolean`):

Optional discovery helper: top up the list with the authors of posts on RedNote's public explore feed. Off by default. A refused feed costs nothing and does not stop the run.

## `xsecToken` (type: `string`):

Leave empty. The Actor mints its own token from RedNote's public explore feed on every run. If a run ever reports TOKEN\_UNAVAILABLE, open xiaohongshu.com in a browser, click any creator, and paste the xsec\_token from the address bar here - one token works for every profile and stays valid for at least an hour.

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

Leave this alone unless you have your own proxies. The Actor takes a fresh Apify Proxy exit address for every request, which is what keeps this target answering. Supplying your own proxy URLs replaces that rotation - do it only if your pool is larger.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.xiaohongshu.com/user/profile/5b723a65c756070001d43c6c",
    "https://www.xiaohongshu.com/user/profile/620f2fbd000000001000e44c"
  ],
  "maxNotesPerProfile": 10,
  "maxItems": 0,
  "includeExploreFeed": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "profileUrls": [
        "https://www.xiaohongshu.com/user/profile/5b723a65c756070001d43c6c",
        "https://www.xiaohongshu.com/user/profile/620f2fbd000000001000e44c"
    ],
    "maxNotesPerProfile": 10,
    "maxItems": 0,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/rednote-profile-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 = {
    "profileUrls": [
        "https://www.xiaohongshu.com/user/profile/5b723a65c756070001d43c6c",
        "https://www.xiaohongshu.com/user/profile/620f2fbd000000001000e44c",
    ],
    "maxNotesPerProfile": 10,
    "maxItems": 0,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/rednote-profile-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 '{
  "profileUrls": [
    "https://www.xiaohongshu.com/user/profile/5b723a65c756070001d43c6c",
    "https://www.xiaohongshu.com/user/profile/620f2fbd000000001000e44c"
  ],
  "maxNotesPerProfile": 10,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call dami_studio/rednote-profile-scraper --silent --output-dataset

```

## MCP server setup

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