Lemon8 公开数据 API | SandBase
用一个 REST API 读取 Lemon8 公开的搜索、帖子、用户和话题。无需 Lemon8 登录、无需 SDK——一个 SandBase 密钥,为 Agent 工作流而生。

Lemon8 是字节跳动的生活方式内容 App——美妆、美食、旅行和健康帖子让它在其欧美和东南亚市场成为消费者研究、达人发现和内容趋势的有力信号。可要用程序去拿这些数据,通常意味着逆向 App、周旋于 token,而且 App 一变你就得重写一遍采集器。
SandBase 的 Lemon8 公开数据 API 免去了这些前置成本。它通过普通的 REST 端点读取 Lemon8 公开的搜索结果、帖子、用户和话题——只用一个 SandBase API 密钥,不需要登录 Lemon8、也不需要 SDK。端点 API 参考是每个参数和响应信封的权威来源;下面的业务载荷字段名来自我实际跑的一次搜索调用(测试于 2026-09-27,UTC),仅作为一次观测到的结构展示——请以真实响应为准核对,因为负载会随时间变化。
这不是 Lemon8 官方开放平台。 当你需要经过授权的会员操作,或需要有正式授权协议的数据时,请走 Lemon8 官方渠道。当你的工作流需要用于研究和监测的公开、只读数据时,用 SandBase。想上手?获取 SandBase API 密钥,然后浏览 Lemon8 端点。
先说结论
- 一套 API 即可读取 Lemon8 公开的搜索、帖子、用户、话题和发现流。
- 本文的 Model API 端点用
POST /v1/api/lemon8/<path>调用——只传该端点的参数,无 SDK,一个SANDBASE_API_KEY。- 端点以自然标识为入口:搜索用
query,用户用user_id,帖子用item_id,话题用forum_id。- 只返回公开、只读数据。你这边无需发帖、无需平台登录、不涉及私有数据;用 SandBase API 密钥鉴权即可。
你需要哪种 Lemon8 API?
| 你的需求 | 选择 | 原因 |
|---|---|---|
| 发帖、以会员身份操作,或使用账号授权数据 | Lemon8 官方渠道 | 会员和账号级操作应通过 Lemon8 直接进行。 |
| 读取公开的搜索、帖子、用户或话题 | SandBase Lemon8 公开数据 API | 普通 REST、一个 SandBase 密钥、结构化 JSON,面向只读工作流。 |
| 私有或仅账号可见的数据 | 两种公开方案都不适用 | 这类数据不在本篇公开数据指南范围内。 |
Lemon8 API 能取到什么
目录建立在一个 app 面上。按用途分组:
- 搜索与发现 — 关键词搜索和一个发现流。
- 帖子 — 按
item_id读帖子详情,以及从分享文本解析出 item id 的解析器。 - 用户 — 公开用户资料、帖子列表和粉丝/关注列表,以及从分享文本解析出 user id 的解析器。
- 话题 — 话题(forum)信息及其帖子列表。
动手前请以每个端点的线上 API 参考为准核对参数;可用性因端点而异。
SandBase 上的 Lemon8 API 页面——带标签的概览和端点列表,每个端点都标了路径。
Lemon8 提供什么,SandBase 补什么
公开数据来自 Lemon8。SandBase 并不拥有或运营 Lemon8,它为符合条件的公开数据工作流提供一层统一的 API。每个能力都成为一个稳定端点,鉴权收敛为单个密钥,响应回来是可预测的 JSON——于是 Agent 可以沿着”搜关键词 → 打开帖子 → 读作者”这一条约定链式调用,而不用维护采集器。
快速上手:第一次调用
SandBase 暴露不止一个 API 面。目录里可能显示 /apis/v1/... 下的 GET 路径;本文使用每个端点 API 参考上标注的带厂商前缀的 Model API 路径。不要擅自改动 HTTP 方法或 URL——以你所选端点的参考为准。
按关键词搜索公开帖子:
import os
import requests
resp = requests.post(
"https://api.sandbase.ai/v1/api/lemon8/app/search",
headers={
"Authorization": f"Bearer {os.environ['SANDBASE_API_KEY']}",
"Content-Type": "application/json",
},
json={"query": "skincare"},
)
resp.raise_for_status()
body = resp.json()
if body.get("status") != "completed":
error = body.get("error", {})
raise RuntimeError(error.get("message", "Lemon8 请求未完成"))
# 参考保证的是信封;搜索负载是一个块列表,每个块带一个上游 code
# 和一个 data 对象——防御式读取,并以真实响应核对确切路径。
blocks = body["outputs"][0]["data"]
for block in blocks if isinstance(blocks, list) else []:
data = block.get("data", {})
if block.get("code") == 0 and data.get("items"):
print(len(data["items"]), "条,has_more:", data.get("has_more"))
break
curl -X POST https://api.sandbase.ai/v1/api/lemon8/app/search \
-H "Authorization: Bearer $SANDBASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "skincare"}'
响应使用一致的信封:一个 id、一个 status、model 名称,以及——在 completed 运行上——一个 outputs 数组,其唯一元素在 data 下承载数据。failed 或 timeout 的运行则带 error 而没有 outputs,所以读取 outputs[0].data 前先根据 status 分支判断。对于搜索,那个负载是一个块列表;code == 0 的块带一个 data 对象,含 items、has_more、search_id 和游标字段。下面是我那次搜索调用的一段裁剪后的真实响应(测试于 2026-09-27,UTC)——数值会随时间变化,所以请把字段名当作观测到的,并对照真实响应核对:
{
"id": "3eb2ad8b-0737-441e-8b6c-eda7c60860c2",
"status": "completed",
"model": "lemon8/app/search",
"outputs": [
{
"data": [
{
"code": 0,
"data": {
"items": [ { "content": "…", "comment_count": 0, "author": {} } ],
"has_more": true,
"search_id": "…"
}
}
]
}
]
}
响应结构因端点而异——请检查一次真实响应,并逐端点确定精确的字段路径。
端点 API 参考是每个参数名和响应路径的事实来源。
能力地图
| 能力簇 | 代表端点 | 典型用途 |
|---|---|---|
| 搜索 | lemon8/app/search | 关键词内容发现 |
| 发现 | lemon8/app/discover-tab | 浏览发现流 |
| 帖子详情 | lemon8/app/post-detail | 按 item_id 读帖子 |
| 用户 | lemon8/app/user-profile | 按 user_id 的公开用户信号 |
| 话题 | lemon8/app/topic-info | 按 forum_id 读话题 |
分页方式因端点而异——搜索返回一个 has_more 标记,带 max_cursor/min_cursor 和一个 search_id;下一次请求把游标传回去。请查阅每个端点的结构。
Lemon8 端点列表的一角,在 app 面上。
在 Agent 工作流中链式调用
因为每个端点共享同一套鉴权和同一个响应信封,Agent 可以从一个关键词一路走到一个作者,而不用为每个面单独写特例。一个常见的消费者研究模式是这样:
- 搜关键词。 用一个
query调用lemon8/app/search拿到匹配帖子,在has_more为真时用返回的游标翻页。 - 打开帖子。 用从搜索里浮现出的
item_id调用lemon8/app/post-detail拿完整帖子。 - 读作者。 用一个
user_id调用lemon8/app/user-profile,再调lemon8/app/user-post-list拿他们的帖子。
每一步都返回相同的 { id, status, model, outputs } 结构,所以你的 Agent 只需按 status 分支一次,并在每一步复用同一段读 JSON 的代码。
常见用例
Lemon8 搜索 API 做内容发现
用一个 query 运行 lemon8/app/search 梳理某话题周边的帖子,再在 has_more 为真时用游标翻页。输入:一个 query。输出:匹配帖子加分页字段。端点:search。
Lemon8 用户 API 做创作者研究
用 user_id 调用 lemon8/app/user-profile 读取公开用户,再调 lemon8/app/user-post-list 拿他们的帖子。输入:一个 user_id。输出:用户记录和帖子列表。端点:user-profile、user-post-list。
Lemon8 话题 API 做垂类研究
用 forum_id 调用 lemon8/app/topic-info 读取话题,再调 lemon8/app/topic-post-list 拿它的帖子。输入:一个 forum_id。输出:话题信息和帖子。端点:topic-info、topic-post-list。
为什么放在 API 层来做
你当然可以用无头浏览器指向 Lemon8、解析 App 的负载,但这条路很脆:App 会变,token 会轮换,你维护的是采集器而不是在做产品。通过一层统一 API 来读,意味着你的代码依赖的是有名字的 JSON 字段和单个响应信封,而不是某个 App 内部实现。鉴权是一个密钥,而且因为每个端点都返回相同的 { id, status, model, outputs } 结构,重试、日志和错误处理都可以收进一个你写一次、处处复用的辅助函数里。
正是这种一致性让工作流对 Agent 而言可组合。把一个 query 换成另一个、把一个 user_id 换成下一个,代码路径完全一样。再加第四个读取——比如某个话题的帖子列表——它也照样接在同一个辅助函数后面。实际的收益是:你的时间花在”数据对你的研究意味着什么”上,而不是花在维持一个采集器去追一个移动靶。当你需要的不止是单次读取时,在线上列表里查到合适的端点,并在接入前确认它的参数。
局限与边界
- 仅公开、只读数据。 不发帖、不关注、不涉及私有或仅账号可见的数据。
- 速率与量级。 把响应当作尽力而为的读取;作为客户端侧的韧性措施,遇到 HTTP 429 等瞬时错误时按退避策略重试。
- 参数与结构随上游面而定。 搜索用
query;标识各异(user_id、item_id、forum_id);搜索返回一个块列表、每块带上游code;分页用游标加has_more。先看一次真实响应、读一遍结构。 - 以线上参考核对端点。 可用性和字段可能变化;在依赖某个具体端点前先确认。
- 这不是 Lemon8 官方合作。 SandBase 提供对公开数据的统一访问;请就你的使用场景遵守 Lemon8 条款和适用规则。
常见问题
我需要 Lemon8 开发者应用或登录吗?
不需要。你用自己的 SANDBASE_API_KEY 向 SandBase 鉴权。这些读取端点不需要你这边有 Lemon8 账号或 OAuth。
什么标识一条帖子、一个用户或一个话题?
搜索用 query;item_id 标识一条帖子,user_id 标识一个用户,forum_id 标识一个话题。还有把分享文本转成 item_id 或 user_id 的解析器。
为什么搜索负载是一个块列表?
Lemon8 的搜索返回一个块列表,每块带一个上游 code 和一个 data 对象;code == 0 的块带 items。防御式读取,并以真实响应核对路径。
我能读私有或仅账号可见的数据吗? 不能。这套 API 只返回公开数据。私有和账号授权内容不在范围内。
从一次搜索开始
创建一个 SandBase API 密钥,用一个 query 调用 search,在扩展到帖子、用户或话题之前先检查返回的结构。准备好后: