Xiaohongshu API endpoint
Returns one public Xiaohongshu note normalized from the site's server-rendered page state: note id, type, title, description text (including hashtags), topic tags, image URLs, an optional stable video URL with duration, publish time, author card, and public interaction counters. Pass url with the note_url returned by /xiaohongshu/explore. The URL must be an xiaohongshu.com /explore/<id> or /discovery/item/<id> link carrying its xsec_token; a note id alone is not accessible anonymously, and a stale token returns not-found, so re-run /xiaohongshu/explore to mint a fresh one. Comments are not included because the anonymous page state does not carry them.
/xiaohongshu/noteQuery parameters:
url (optional) — the note_url returned by /xiaohongshu/explore, which must carry its short-lived xsec_token. It must be an https/http xiaohongshu.com (www. or m.) URL using the /explore/<id> or /discovery/item/<id> path with a 24-character hex note id. Pass either url, or both note_id and xsec_token; a note id alone is not credential-free and is rejected.note_id (optional) — a 24-character hex note id from an explore card; requires xsec_token. Must agree with url when both are supplied.xsec_token (optional) — the short-lived feed-issued token that accompanies note_id. The token is issued per feed render and expires; when it does, the note is reported as 404 and a fresh one must come from a new explore call.Notable response behavior:
note_id and url are the requested note's canonical identity; url is rebuilt on the canonical explore path with the supplied token.type is the upstream note media type, such as normal (image note) or video. image_urls holds the note's public image URLs; video_url and video_duration_seconds are present only when the note carries a playable video stream.description is the note's public text including its inline hashtags; tags holds the resolved topic tags with their ids and names when the page carries them.published_at is RFC 3339 in UTC. stats holds integer liked_count, collected_count, comment_count, and share_count; upstream abbreviates large values in Chinese units (for example 1.4万) and they are normalized to integers here.author is a public card only (user_id, nickname, avatar_url). No account, contact, or private field is returned.xsec_token, or an invalid note id is rejected with 400 before any upstream request. A removed note or a stale token is 404. A login or risk-control gate (HTTP 200 challenge page, redirect to /login, HTTP 461, or HTTP 403/406/429) is reported as an upstream 503.| Field | In the sample | Value in the sample |
|---|---|---|
| note_id | Has a value | |
| url | Has a value | xiaohongshu.com |
| type | Has a value | “normal” |
| title | Has a value | “促膝长谈” |
| description | Has a value | 138 characters |
| tags | Has a value | 10 entries |
| image_urls | Has a value | 1 entry |
| published_at | Has a value | 2026-10-05 |
| author.user_id | Has a value | |
| author.nickname | Has a value | |
| author.avatar_url | Has a value | sns-avatar-qc.xhscdn.com |
| stats.liked_count | Has a value | 48,000 |
| stats.collected_count | Has a value | 2,950 |
| stats.comment_count | Has a value | 985 |
| stats.share_count | Has a value | 1,828 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| url | string | No | Note URL carrying xsec_token, normally the note_url returned by /xiaohongshu/explore. Pass url, or both note_id and xsec_token. | https://www.xiaohongshu.com/explore/0123456789abcdef01234567?xsec_token=SYNTHETIC-EXAMPLE-TOKEN-0001&xsec_source=pc_feed | |
| note_id | string | No | 24-character hex note id from an explore card (requires xsec_token) | 0123456789abcdef01234567 | |
| xsec_token | string | No | Short-lived feed-issued token that accompanies note_id | SYNTHETIC-EXAMPLE-TOKEN-0001 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/xiaohongshu/note" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"note_id": "0123456789abcdef01234567",
"url": "https://www.xiaohongshu.com/explore/0123456789abcdef01234567?xsec_token=SYNTHETIC-EXAMPLE-TOKEN-0001&xsec_source=pc_feed",
"type": "video",
"title": "Synthetic example note",
"description": "Synthetic example description text #synthetic",
"tags": [
{
"id": "00000000",
"name": "synthetic_tag"
}
],
"image_urls": [
"https://sns-img.example.test/synthetic-cover.jpg"
],
"video_url": "https://sns-video.example.test/synthetic-video.mp4",
"video_duration_seconds": 12,
"published_at": "2026-09-22T04:03:46Z",
"author": {
"user_id": "000000000000000000000002",
"nickname": "synthetic_user",
"avatar_url": "https://sns-avatar.example.test/synthetic-avatar.jpg"
},
"stats": {
"liked_count": 42,
"collected_count": 7,
"comment_count": 3,
"share_count": 1
}
}
}Request schema
No body schema
Response schema
#/definitions/xiaohongshu.noteResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | xiaohongshu.NoteResponse | No | ||||
| data.author | xiaohongshu.NoteAuthor | No | ||||
| data.author.avatar_url | string | No | ||||
| data.author.nickname | string | No | synthetic_user | |||
| data.author.user_id | string | No | 000000000000000000000002 | |||
| data.description | string | No | ||||
| data.image_urls | array | No | ||||
| data.note_id | string | No | 0123456789abcdef01234567 | |||
| data.published_at | string | No | 2026-09-22T04:03:46Z | |||
| data.stats | xiaohongshu.NoteStats | No | ||||
| data.stats.collected_count | integer | No | ||||
| data.stats.comment_count | integer | No | ||||
| data.stats.liked_count | integer | No | ||||
| data.stats.share_count | integer | No | ||||
| data.tags | array | No | ||||
| data.tags[].id | string | No | ||||
| data.tags[].name | string | No | 美食 | |||
| data.title | string | No | ||||
| data.type | string | No | video | |||
| data.url | string | No | ||||
| data.video_duration_seconds | integer | No | ||||
| data.video_url | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/xiaohongshu/note" \
-H "x-api-key: $CRAWLORA_API_KEY"