# Xiaohongshu shop product reviews API

> The first page of buyers' reviews of a product in Xiaohongshu's shop: stars, text, the variant bought, photos and likes. The app gives no further page.

Canonical page: https://okdata.online/apis/xiaohongshu/shop/products/reviews/list/

- **Endpoint**: `GET /v1/xiaohongshu/shop/products/reviews/list`
- **ID**: `xiaohongshu.shop.products.reviews.list`
- **Price**: $0.02 per call · about 12 reviews per page
- **Returns**: a page of about 12 reviews (`data.items`, Review objects)
- **Status**: beta
- **Good for**: Product research, Word of mouth

## Price

One call costs $0.02 and returns one page of about 12 reviews. Collecting 1,000 reviews takes about 84 calls, $1.68 in total. Each page is a separate call; failed calls are not charged.

## Parameters

| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| `id` | string | yes |  | The product ID (24 hex characters), from the shop product search. (e.g. `6441fb9a6cd6140001acf7b4`) |
| `sort` | string: relevance / latest | no | `relevance` | Result order. |
| `cursor` | string | no |  | Opaque cursor from page.next_cursor of the previous call. Each page is a separate call. |
| `view` | string: compact / standard / full | no | `standard` | How much of each object comes back. full adds platform-specific fields under ext. |
| `fields` | string | no |  | Comma-separated fields to keep, to save tokens. |

cursor, view and fields work as described in [Requests](https://okdata.online/docs/requests/).

## Returned fields

Each item is a [Review](https://okdata.online/docs/objects/review/).

| Field | Type | Description |
|---|---|---|
| `id` | string | Review ID. |
| `product_id` | string | ID of the product reviewed. |
| `rating` | number \| null | Stars, 1 to 5. |
| `text` | string | Review text; empty when the buyer left only stars. |
| `published_at` | string \| null | When it was posted, ISO 8601 in UTC (a day for platforms that show only the date). |
| `author_name` | string \| null | Reviewer name as the shop shows it, often masked. |
| `variant` | string \| null | The variant bought. |
| `images` | string[] \| null | Photos attached to the review. |
| `likes` | integer \| null | Likes on the review. |
| `verified_purchase` | boolean \| null | Whether the shop marks it as a verified purchase. |

## Request examples

### cURL

```bash
curl -G "https://api.okdata.online/v1/xiaohongshu/shop/products/reviews/list" \
  -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=6441fb9a6cd6140001acf7b4'
```

### Python

```python
import os
import requests

resp = requests.get(
    "https://api.okdata.online/v1/xiaohongshu/shop/products/reviews/list",
    headers={"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"},
    params={"id": "6441fb9a6cd6140001acf7b4"},
    timeout=60,
)
body = resp.json()
if body["code"] != "ok":
    raise RuntimeError(f"{body['code']}: {body['message']} (charged: {body['charged']})")

for row in body["data"]["items"]:
    print(row["rating"], row["text"][:80])
print("cost: $" + body["meta"]["billing"]["amount"])
```

### TypeScript

```ts
const url = new URL('https://api.okdata.online/v1/xiaohongshu/shop/products/reviews/list');
url.searchParams.set('id', "6441fb9a6cd6140001acf7b4");

const res = await fetch(url, {
  headers: {
    Authorization: `Bearer ${process.env.OKDATA_API_KEY}`,
  },
});
const body = await res.json();
if (body.code !== 'ok') throw new Error(`${body.code}: ${body.message}`);

for (const row of body.data.items) {
  console.log(row.rating, row.text.slice(0, 80));
}
console.log('cost: $' + body.meta.billing.amount);
```

### MCP

```json
{
  "name": "call",
  "arguments": {
    "endpoint": "xiaohongshu.shop.products.reviews.list",
    "params": {
      "id": "6441fb9a6cd6140001acf7b4"
    }
  }
}
```

Or ask an agent that has the MCP server connected:

> Use Xiaohongshu shop product reviews, read the first two pages and sum up what buyers like and what they complain about.

## Response example

```json
{
  "code": "ok",
  "request_id": "0f6c2a8e-4b1d-4e0a-9a51-3c7d2b9e1f20",
  "data": {
    "items": [
      {
        "id": "424335956727206176",
        "product_id": "6441fb9a6cd6140001acf7b4",
        "rating": 5,
        "text": "做工扎实，研磨均匀，出门露营带着很方便。",
        "published_at": "2024-11-21T00:00:00Z",
        "author_name": "甜**",
        "variant": "颜色分类：棕橘色",
        "images": [
          "https://cdn.example.com/review/1.jpg"
        ],
        "likes": 42,
        "verified_purchase": null
      }
    ]
  },
  "page": {
    "next_cursor": "eyJvIjoyMH0",
    "has_more": true
  },
  "warnings": [],
  "meta": {
    "capability": "xiaohongshu.shop.products.reviews.list",
    "billing": {
      "amount": "0.02",
      "currency": "USD",
      "balance_after": "9.98"
    },
    "unavailable": {},
    "cached": false,
    "replayed": false,
    "fetched_at": "2026-11-11T08:00:00Z"
  }
}
```

## Errors

Errors share one shape and are never charged, except a timeout, whose charge is unknown until looked up. The full table: https://okdata.online/docs/errors/

## Questions

### How much does the Xiaohongshu shop product reviews API cost?

One call costs $0.02 and returns one page of about 12 reviews. Collecting 1,000 reviews takes about 84 calls, $1.68 in total. Each page is a separate call; failed calls are not charged.

### How do I get the next page?

Pass page.next_cursor from the response back as the cursor parameter. When page.has_more is false there is nothing left. Every page is its own call at $0.02.

### Do I need a Xiaohongshu (RedNote) account, cookies or a QR login?

No. You send only your okdata API key. The data is public data from Xiaohongshu (RedNote); nothing is fetched with your own Xiaohongshu (RedNote) account.

### Am I charged when a call fails?

No. Every error response says charged: false, except a timeout, which says charged: null until the outcome is known. Resend with the same Idempotency-Key and you are never charged twice.

### What if Xiaohongshu (RedNote) does not show a field?

The field is null, and meta.unavailable names it with the reason: platform (the platform never shows it) or capability (we cannot fetch it yet).

## More Xiaohongshu (RedNote) endpoints

- [Xiaohongshu note search](https://okdata.online/apis/xiaohongshu/notes/search/): $0.02 per call · about 20 notes per page
- [Xiaohongshu note detail](https://okdata.online/apis/xiaohongshu/notes/get/): $0.02 per call
- [Xiaohongshu note comments](https://okdata.online/apis/xiaohongshu/notes/comments/list/): $0.02 per call · about 10 comments per page
- [Xiaohongshu account profile](https://okdata.online/apis/xiaohongshu/users/get/): $0.02 per call
- [Xiaohongshu account notes](https://okdata.online/apis/xiaohongshu/users/notes/list/): $0.02 per call · about 20 notes per page
- [Xiaohongshu hot topics](https://okdata.online/apis/xiaohongshu/trends/list/): $0.02 per call · about 20 board entries per page
- [Xiaohongshu PGY creator search](https://okdata.online/apis/xiaohongshu/pgy/creators/search/): $0.04 per call · about 20 creators per page
- [Xiaohongshu PGY creator detail](https://okdata.online/apis/xiaohongshu/pgy/creators/get/): $0.04 per call
- [Xiaohongshu shop product search](https://okdata.online/apis/xiaohongshu/shop/products/search/): $0.02 per call · about 20 products per page

## Answers that use this endpoint

- [How do I mine competitors' product reviews to find what buyers complain about?](https://okdata.online/answers/product-review-mining/): Pick 10 to 20 competing products, pull a few hundred of their buyer reviews, separate the low stars from the five stars and let an LLM group the complaints by theme and count them. On TikTok Shop, 2,400 reviews across 15 products cost $0.244; adding 20 Xiaohongshu shop products costs $0.80 more.
- [How do I collect Xiaohongshu shop product prices and buyer reviews?](https://okdata.online/answers/xiaohongshu-shop-products-reviews/): Search the Xiaohongshu shop by keyword, 20 products with current and original prices in yuan for $0.02 a page, then fetch each product's first page of buyer reviews for $0.02. Prices plus reviews in two sort orders for 30 competing products cost $1.24.
