샤오홍슈 마케팅 데이터, 계정·VPN 없이 API로 모으는 법
샤오홍슈 마케팅에 쓸 노트 검색, 인기 검색어, 인플루언서, 댓글 데이터를 계정·VPN 없이 API 키 하나로 받는 법을 호출 결과와 함께 보여 드려요.
샤오홍슈 마케팅에 필요한 데이터는 SocialCrawl API 키 하나로 받을 수 있어요. 브랜드 노트 검색, 인기 검색어 보드, 인플루언서 프로필, 댓글까지 호출 여섯 개면 돼요. 샤오홍슈 계정도, 쿠키도, VPN도 필요 없어요.
샤오홍슈(小红书, 레드노트)는 검색해서 쓰는 사람이 많은 중국 SNS예요. 샤오홍슈가 2024년 상반기 검색 데이터로 낸 보고서를 보면 이용자의 70%가 검색 기능을 쓰고, 한 사람이 하루 평균 6번 검색해요. 샤오홍슈가 직접 집계한 숫자이고, ZDNet Korea에 실린 보도자료(2024년 8월 14일)에서 볼 수 있어요. 브랜드 키워드에 어떤 노트가 뜨는지부터 보는 게 샤오홍슈 마케팅의 출발점이에요.
예제는 2026년 10월 2일(한국 시간)에 韩国护肤(한국 스킨케어)로 직접 호출한 결과예요. 표본이 하루치에 호출당 3행 안팎이라 트렌드 분석은 못 해요. 호출이 어떤 모양인지 보는 예시로 봐 주세요.
샤오홍슈 마케팅 데이터를 모으기 전에 준비할 것
API 키를 환경 변수 SOCIALCRAWL_API_KEY에 넣고 curl이나 평소 쓰는 HTTP 클라이언트를 준비하세요. 검색어는 중국어 간체로 넣어요. 한국어 검색어는 해 보지 않아서 결과를 몰라요.
모든 호출은 GET이고 샤오홍슈 로그인 없이 돼요. 기본 주소는 https://www.socialcrawl.dev, 인증은 x-api-key 헤더 하나예요. 엔드포인트 전체는 샤오홍슈 플랫폼 페이지에 있어요. 노트(笔记)는 샤오홍슈의 게시물 단위예요.
돌려받은 행 하나가 5크레딧이고 행 수는 limit으로 정해요. 호출별 실제 credits_used는 이래요(韩国护肤 실행).
| 호출 | 엔드포인트 | 이번 조건 | 크레딧 |
|---|---|---|---|
| 노트 검색 | /v1/xiaohongshu/search | limit=3 | 15 |
| 인기 검색어 | /v1/xiaohongshu/trending | limit=10 | 50 |
| 노트 1개 | /v1/xiaohongshu/post | 노트 URL | 5 |
| 댓글 | /v1/xiaohongshu/post/comments | limit=3 | 15 |
| 인플루언서 프로필 | /v1/xiaohongshu/profile | 사용자 id | 5 |
| 인플루언서 노트 | /v1/xiaohongshu/profile/posts | limit=3 | 15 |
| 없는 노트 | /v1/xiaohongshu/post | 존재하지 않는 노트 | 0 (404) |
여섯 호출을 모두 따라 하면 105크레딧이에요. 크레딧 값은 가격 페이지에서 확인하세요.
1단계, 샤오홍슈 검색으로 우리 브랜드 노트 찾기
GET /v1/xiaohongshu/search에 query만 넘기면 돼요. 해시태그 전용 호출은 없으니, 해시태그에 쓰는 단어를 query에 넣으세요.
curl -G "https://www.socialcrawl.dev/v1/xiaohongshu/search" \
--data-urlencode "query=韩国护肤" --data-urlencode "limit=3" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"응답은 구조만 보여 드려요. 노트마다 다른 값은 비웠어요.
{
"success": true,
"platform": "xiaohongshu",
"endpoint": "/v1/xiaohongshu/search",
"data": {
"items": [
{
"post": {
"id": "<note_id>",
"url": "https://www.xiaohongshu.com/explore/<note_id>",
"content": {
"text": "…(잘린 요약)",
"media_urls": null,
"thumbnail_url": "…"
},
"author": { "username": "…", "display_name": "…" },
"engagement": { "views": null, "likes": "<숫자>", "comments": "<숫자>", "shares": 0, "saves": "<숫자>" },
"ext": { "author_id": "<author_id>", "title": "…", "media_type": "image", "text_truncated": true }
},
"computed": { "engagement_rate": null, "language": "zh" }
}
]
},
"credits_used": 15,
"pagination": { "next_cursor": "sc.…", "has_more": true, "page_size": 3 }
}눈여겨볼 곳은 네 군데예요.
- 본문은 잘린 요약이에요.
text_truncated가true이고, 이번 호출에서 요약은 46~57자였어요. - 조회수는 비어 있어요.
views가null이에요.likes,comments,saves는 값이 와요. 참여율(computed.engagement_rate)도null이라 이 세 값으로 직접 계산해요. - 검색 행의 공유 수는 믿지 마세요. 3행 모두
shares가 0이었는데, 첫 행의 노트를post로 부르니 173이 왔어요. 공유 수는 노트 호출에서 읽으세요. - 미디어 필드는 노트 종류마다 달라요. 이미지 노트는
media_urls가null에thumbnail_url만 왔고, 영상 노트 둘은 URL 문자열 하나였어요.
정렬은 sort, 유형은 type으로 정해요. 다음 페이지는 pagination.has_more가 true일 때 pagination.next_cursor를 cursor로 넘겨요. 응답 구조는 통합 스키마라서 틱톡이나 인스타그램용 파서를 그대로 쓸 수 있어요.
2단계, 인기 검색어 보드로 중국 트렌드 읽기
지금 뜨는 주제는 GET /v1/xiaohongshu/trending으로 봐요.
curl "https://www.socialcrawl.dev/v1/xiaohongshu/trending?limit=10" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"항목마다 rank, title, hot_value가 와요. 이날 보드의 위 3개는 이랬어요. 한국어 번역은 저희가 옮긴 것이고 API는 중국어 원문을 줘요.
| rank | title 원문 | 번역 | hot_value |
|---|---|---|---|
| 1 | 用万能旅行拍照姿势美美出片 | 만능 여행 사진 포즈로 예쁘게 찍기 | 9475000 |
| 2 | 耗时三年拍下古诗词里的中国 | 3년에 걸쳐 찍은 옛 시 속 중국 | 9348000 |
| 3 | 我拍到了海鸥雨 | 갈매기 떼가 비처럼 쏟아지는 걸 찍었어요 | 9032000 |
보드는 20개짜리 하나라 페이지가 없어요(data.total이 20). limit을 낮추면 위쪽 N개가 오고, 10개는 50크레딧이었어요. 이날 위 10개는 여행, 사진, 음식, 공예 주제였고 스킨케어는 없었어요. 뷰티 트렌드는 1단계처럼 키워드로 검색해요. hot_value의 단위는 확인하지 못했어요.
3단계, 샤오홍슈 인플루언서 프로필과 노트는 따로 받기
왕홍 마케팅이든 KOC 시딩이든 후보를 고르려면 숫자부터 모아야 해요. 샤오홍슈 인플루언서 정보는 호출 두 개로 나뉘어요. 먼저 프로필이에요. id에는 1단계 행의 post.ext.author_id를 넣어요.
curl "https://www.socialcrawl.dev/v1/xiaohongshu/profile?id=<author_id>" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"5크레딧이고, followers, following, posts_count, likes_count, bio, ext.collects_received(받은 저장 수)가 와요. 이 id는 노트에 붙은 사용자 id라서 샤오홍슈 아이디(小红书号)로는 조회되지 않아요.
이번 프로필은 팔로워 14,034명에 누적 좋아요 48,859였고 computed.engagement_rate는 null이었어요. _warnings에는 누적 좋아요를 팔로워 수로 나눈 값(3.48)이 진짜 참여율이 아니라는 설명이 붙어 있었어요. 참여율은 최근 노트의 반응 수로 직접 계산해요.
노트는 따로 받아요.
curl "https://www.socialcrawl.dev/v1/xiaohongshu/profile/posts?id=<author_id>&limit=3" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"3행에 15크레딧이었어요.
- 고정 노트가 먼저 와요. 이번에는 고정 노트 둘이 앞에 오고 일반 노트가 그다음이었어요.
post.flags.pinned로 구분해요. 요약은 98~100자에서 잘렸어요. - 다음 페이지는 크리에이터마다 달랐어요. 이 크리에이터는
posts_count가 14인데has_more가false였고 커서도 없었어요. 아래 스크립트에서 다른 크리에이터는true에 커서가 왔어요. 이유는 확인하지 못했으니has_more를 보고 판단하세요.
단가나 전환율은 이 호출들에 없어요.
4단계, 체험단 반응은 노트 본문과 댓글로 확인하기
샤오홍슈 체험단 노트가 어떤 반응을 얻었는지는 본문과 댓글에 남아요. 먼저 노트 한 개를 받아요.
curl "https://www.socialcrawl.dev/v1/xiaohongshu/post?url=https://www.xiaohongshu.com/explore/<note_id>" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"5크레딧이고, 1단계 요약과 달라지는 점은 이래요.
- 본문 전체가 오고(이번에는 626자)
text_truncated가false예요. - 이미지 노트의
content.media_urls는 URL 배열이에요(이번에는 10개). 영상 노트는 URL 문자열 하나라서 개수를 세기 전에 타입을 확인해요. shares가 173으로 채워져 와요.post.ext.ip_location은韩国였어요.
이어서 댓글이에요.
curl "https://www.socialcrawl.dev/v1/xiaohongshu/post/comments?url=https://www.xiaohongshu.com/explore/<note_id>&limit=3" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"3행에 15크레딧이에요. 최상위 댓글만 오고(comment.parent_id가 null), 대댓글은 engagement.replies로 개수만 알려 줘요. 작성자의 IP 지역이 comment.ext.ip_location에 성(省) 단위로 붙어요. 이번에는 안후이, 산시, 베이징이었어요. computed.language는 zh이고 번역은 API가 하지 않아요. 반응을 분석하려면 limit과 cursor로 더 받아요.
없는 노트는 이런 404로 오고 0크레딧이에요.
{
"success": false,
"error": {
"type": "RESOURCE_NOT_FOUND",
"message": "The requested resource was not found on the platform.",
"status": 404,
"doc_url": "https://www.socialcrawl.dev/docs/errors#resource-not-found",
"retryable": false
},
"credits_used": 0
}마지막으로, 다섯 호출을 파이썬 스크립트 하나로 묶기
다섯 호출을 이어 붙였어요. 인기 검색어는 10행에 50크레딧이라 뺐어요. pip install requests와 SOCIALCRAWL_API_KEY만 있으면 돼요. 어느 단계가 404나 빈 결과를 돌려주면 그때까지 쓴 크레딧을 찍고 멈춰요.
"""Chain five Xiaohongshu calls: search -> note -> comments -> profile -> creator notes.
Needs: pip install requests, and SOCIALCRAWL_API_KEY in the environment.
Every list row costs 5 credits, so the limits below are the cost dial.
"""
import os
import sys
import requests
BASE = "https://www.socialcrawl.dev/v1/xiaohongshu"
KEYWORD = "防晒" # sunscreen
SEARCH_LIMIT = 3 # 3 rows x 5 = 15 credits
SMALL_LIMIT = 2 # comments and creator notes, 2 rows x 5 = 10 credits each
key = os.environ.get("SOCIALCRAWL_API_KEY")
if not key:
sys.exit("Set SOCIALCRAWL_API_KEY first.")
total = 0
def call(path, **params):
"""GET one endpoint. Returns the JSON body, or None on a 404 (0 credits)."""
global total
r = requests.get(f"{BASE}/{path}", params=params, headers={"x-api-key": key}, timeout=60)
if r.status_code == 404:
body = r.json()
total += body.get("credits_used", 0)
print(f"{path}: 404 not found, credits_used={body.get('credits_used')}")
return None
r.raise_for_status()
body = r.json()
total += body.get("credits_used", 0)
return body
def need(body, step):
"""Stop the chain cleanly if a step came back empty, reporting what the calls so far cost."""
if not body:
sys.exit(f"Stopped at {step}. total credits_used: {total}")
return body
def page_info(body):
p = body.get("pagination", {})
return f"has_more={p.get('has_more')} next_cursor={'yes' if p.get('next_cursor') else 'none'}"
# 1. Search: rows carry a short summary, not the full note.
search = need(call("search", query=KEYWORD, limit=SEARCH_LIMIT), "search")
rows = need(search["data"]["items"], "search (no rows)")
first = rows[0]["post"]
print(f"search: {len(rows)} rows, credits_used={search['credits_used']}, {page_info(search)}")
print(f" first row: id={first['id']} text_chars={len(first['content']['text'])} "
f"text_truncated={first['ext']['text_truncated']} views={first['engagement']['views']}")
# 2. The full note, from the first row's URL.
note = need(call("post", url=first["url"]), "note")
post = note["data"]["post"]
author_id = post["ext"]["author_id"]
media = post["content"]["media_urls"] # a list on image notes, one URL string on video notes
media_count = len(media) if isinstance(media, list) else (1 if media else 0)
print(f"note: credits_used={note['credits_used']} text_chars={len(post['content']['text'])} "
f"text_truncated={post['ext']['text_truncated']} media_type={post['ext']['media_type']} "
f"media_urls={type(media).__name__}({media_count}) "
f"likes={post['engagement']['likes']} shares={post['engagement']['shares']}")
# 3. Top-level comments on that note.
comments = need(call("post/comments", url=first["url"], limit=SMALL_LIMIT), "comments")
print(f"comments: {len(comments['data']['items'])} rows, credits_used={comments['credits_used']}, "
f"{page_info(comments)}")
for row in comments["data"]["items"]:
c = row["comment"]
print(f" likes={c['engagement']['likes']} replies={c['engagement']['replies']} "
f"ip_location={c['ext']['ip_location']}")
# 4. The creator, by the author id carried on the note.
profile = need(call("profile", id=author_id), "profile")
a = profile["data"]["author"]
print(f"profile: credits_used={profile['credits_used']} followers={a['followers']} "
f"posts_count={a['posts_count']} likes_count={a['likes_count']} has_notes_array={'posts' in a}")
# 5. The creator's notes (the profile call does not carry them).
notes = need(call("profile/posts", id=author_id, limit=SMALL_LIMIT), "creator notes")
print(f"creator notes: {len(notes['data']['items'])} rows, credits_used={notes['credits_used']}, "
f"{page_info(notes)}")
for row in notes["data"]["items"]:
n = row["post"]
print(f" {n['published_at'][:10]} pinned={n['flags']['pinned']} likes={n['engagement']['likes']}")
print(f"total credits_used: {total}")검색어를 防晒(선크림)로 바꿔 한 번 돌렸고, 다섯 호출 모두 과금됐어요(검색 15, 노트 5, 댓글 10, 프로필 5, 크리에이터 노트 10, 합계 45크레딧). 출력은 이래요.
search: 3 rows, credits_used=15, has_more=True next_cursor=yes
first row: id=6a5230a30000000021020908 text_chars=60 text_truncated=True views=None
note: credits_used=5 text_chars=500 text_truncated=False media_type=image media_urls=list(7) likes=2383 shares=147
comments: 2 rows, credits_used=10, has_more=True next_cursor=yes
likes=78 replies=19 ip_location=四川
likes=0 replies=2 ip_location=河南
profile: credits_used=5 followers=238 posts_count=28 likes_count=15578 has_notes_array=False
creator notes: 2 rows, credits_used=10, has_more=True next_cursor=yes
2023-09-16 pinned=True likes=9415
2026-09-01 pinned=False likes=10
total credits_used: 45검색 요약은 60자에서 잘렸지만 같은 노트를 post로 부르니 500자 전체가 왔어요. 이미지 노트라 media_urls는 리스트(7개)였어요. 프로필에는 노트 배열이 없고(has_notes_array=False), 크리에이터 노트는 2023년에 올린 고정 노트가 먼저 와요. 이 크리에이터는 posts_count가 28이고 has_more=True인데, 스크립트는 다음 페이지를 따라가지 않아요. 좋아요나 댓글 수는 시간이 지나면 달라서 같은 검색어로 다시 돌려도 결과가 다를 수 있어요.
샤오홍슈 API, 공식으로 받을 수 있는 건 없나요?
샤오홍슈 API는 공식으로도 있어요. 다만 노트나 검색 결과를 읽는 용도는 아니에요. 2026년 10월 2일에 직접 열어 본 범위예요.
- open.xiaohongshu.com은 전자상거래 오픈 플랫폼(电商开放平台)이에요. 입점 셀러와 서드파티 앱(ERP, 송장 출력 도구)용이고, 권한은 상품, 주문, 애프터서비스, 재고, 정산, 물류로 나뉘고 인증은 상점 단위 OAuth2예요.
- 앱을 만들려면 자격 심사를 통과해야 해요. 셀러 자체 개발 앱은 개인이나 자영업자 상점이면 쓸 수 없고, 서비스 마켓 서드파티는 기업 개발자만 가능해요.
- 문서 23개에서 노트, 검색, 인기 검색어, 크리에이터 프로필을 검색했지만 읽는 엔드포인트는 보이지 않았어요.
- 푸궁잉(蒲公英, pgy.xiaohongshu.com)은 로그인해서 쓰는 브랜드와 크리에이터 협업 콘솔이에요. 공개 API는 찾지 못했어요.
로그인 뒤 화면과 메서드별 API 목록은 열어 보지 못했어요. "공개 페이지에서 확인한 범위에서는 없었다"가 정확한 표현이에요.
SocialCrawl은 샤오홍슈의 공식 API가 아니에요. 공개된 노트, 크리에이터, 검색, 인기 검색어를 한 가지 응답 형식으로 돌려줘요. 수집한 데이터를 어디까지 쓸 수 있는지는 이 글에서 답할 수 없어요. 법무 담당자와 먼저 확인하세요. 다른 수집 API와는 수집 API 비교에서 견줘 보세요.
어떤 부분에서 막힐 수 있을까요?
- 본문이 끊기고 공유 수가 0이에요. 검색과 크리에이터 노트 행은 요약이니
post호출에서 읽어요. - 프로필에 노트가 없어요.
profile/posts를 따로 호출해요.
다음 단계, 틱톡이나 더우인 데이터는 따로 모아요
샤오홍슈는 더우인, 틱톡과 계정도 노트도 따로인 별개 네트워크예요. 중국 마케팅 데이터를 넓히려면 플랫폼마다 따로 모아야 해요. 틱톡 데이터는 틱톡 영상 검색 API나 틱톡 크롤링에서 시작하세요. 반복 수집은 SNS 크롤링을 읽어 보세요. 샤오홍슈 마케팅 데이터도 같은 검색어로 매주 모아 두면 변화가 보여요.
자주 묻는 질문
샤오홍슈 계정이나 VPN 없이도 되나요?
네, 돼요. 로그인 없이 API 키 하나로 호출해요. 계정, 쿠키, VPN은 필요 없어요.
샤오홍슈 아이디로 인플루언서를 찾을 수 있나요?
아니요. 프로필 호출과 크리에이터 노트 호출의 id는 노트에 붙은 사용자 id(post.ext.author_id)이고 샤오홍슈 아이디(小红书号)가 아니에요. 샤오홍슈 아이디는 검색, 댓글, 프로필 응답의 author.username에 오지만(노트 호출에서는 null이었어요) 조회 키로는 못 써요.
레드노트와 샤오홍슈는 같은 앱인가요?
같은 서비스예요. 레드노트(RedNote)는 샤오홍슈(小红书)의 영문 이름이에요(Wikipedia).
해시태그로도 검색할 수 있나요?
해시태그 전용 호출은 없어요. 해시태그 단어를 search의 query에 넣어요. 결과가 그 해시태그 노트로만 한정되는지는 확인하지 못했어요.
조회수는 왜 비어 있나요?
이 응답에는 조회수가 오지 않아요. 이번에 받은 모든 행에서 post.engagement.views가 null이었어요. 좋아요, 댓글, 저장은 값이 오니 참여율은 이 세 값으로 계산하세요.
비용은 얼마인가요?
돌려받은 행마다 5크레딧이에요. 호출 여섯 개를 위 limit대로 따라 하면 105크레딧이에요(2026년 10월 2일). 없는 노트는 404에 0크레딧이에요. 크레딧 값은 가격 페이지를 보세요.
함께 읽으면 좋은 글
질문·구매의도까지 잡는 텍스트 감정분석 API
틱톡·인스타그램·유튜브·X 댓글 API가 감성·질문·구매의도·불만 라벨을 같은 요금으로 돌려줘요. 텍스트 감정분석 API를 따로 붙이지 않아도 되는지 한국어 댓글로 직접 확인했어요.
경쟁사 분석, 갈아탄 고객의 글부터 읽어요
경쟁사 분석은 언급량 세기보다 갈아탔다고 직접 쓴 글 읽기로 시작해요. 원문, 이유, 링크가 붙어 오는 쿠팡 와우 해지와 SKT 번호이동 응답을 실제 호출 그대로 보여 드려요.
틱톡 유사 계정 찾기, API 호출 한 번으로 받기
틱톡 유사 계정 찾기는 API 호출 한 번이면 돼요. 시드 계정별로 달라지는 추천 목록을 실제 호출 결과로 보여 드리고, 틱톡 추천이 끊겼을 때의 대체 경로도 정리했어요.
