Reddit 公开数据 API:社区、帖子、用户与搜索 | SandBase
用一个 REST API 读取 Reddit 公开的社区、帖子、评论、用户资料和搜索。无需 Reddit OAuth 应用,无需 PRAW,一把 SandBase key,为 agent 而建。

Reddit 是互联网上最丰富的公开讨论数据集之一——上百万个社区、层层嵌套的评论,还有直接对应到情感分析、社区调研和趋势发现的 karma 信号。但想用程序拿到这些数据,通常得先注册一个 Reddit OAuth 应用、学 PRAW、处理 token 刷新和每个应用的速率限制,才能读到第一条帖子。
SandBase 的 Reddit 公开数据 API 把这套搭建成本收敛成一个 REST 约定。它通过普通端点读取公开的社区、帖子、评论、用户资料和搜索结果——一把 SandBase API key、同步返回 JSON,不用 Reddit OAuth 应用,也不用客户端库。下面的示例用的是 subreddit-info 端点请求 r/programming;请把其中的字段名和数值当作示例结构,以一份真实响应为准核对具体 schema。
这不是 Reddit 官方的 Data API。 如果你需要已认证的成员操作、发帖、版务管理,或一份授权的高量级数据协议,请用 Reddit 官方 API;当你的流程需要的是公开、只读的社区数据(调研、监测或补全)时,用 SandBase。想直接试?领取 SandBase API key,再浏览 Reddit 端点。
先说结论
- 一个 API 读取 Reddit 公开的社区、帖子、评论、用户资料和搜索。
- 本文的 Model API 端点用
POST /v1/api/reddit/<path>调用——只传该端点的参数,不用客户端库,一把SANDBASE_API_KEY。- 端点以自然标识为入参(
subreddit_name、username、post_id),或用搜索关键词keyword(query)。- 它只返回公开、只读数据。不能发帖、不能投票、没有 Reddit OAuth 应用、也没有版务操作;鉴权用 SandBase API key。
你到底需要哪个 Reddit API?
| 你的需求 | 选择 | 原因 |
|---|---|---|
| 发帖、投票、管理版务,或以已认证成员身份操作 | Reddit 官方 API | 带 OAuth 权限的成员和版务操作。 |
| 读取公开的社区、帖子、评论、用户或搜索 | SandBase Reddit 公开数据 API | 普通 REST、一把 SandBase key、面向只读流程的结构化 JSON。 |
| 授权的批量数据或商业数据协议 | Reddit 的数据授权 | 大规模商业访问由 Reddit 直接处理。 |
从 Reddit API 能拿到什么
整个目录建立在一个 app 面上,提供单资源读取和信息流。按用途归类:
- 社区 —— 社区信息(订阅数、描述、类型)和社区信息流。
- 帖子 —— 帖子详情、批量帖子查询,以及带层级的帖子评论。
- 评论 —— 评论回复和单帖评论树。
- 用户 —— 公开用户资料、他们的帖子、评论、奖杯和活跃社区。
- 搜索与发现 —— 动态搜索、输入联想、热门搜索,以及话题/新闻信息流。
并非列出的每一项能力都已开放直接调用——我测试时有几个信息流端点返回了上游错误——所以动手前请以每个端点的在线 API 参考为准。
SandBase 上的 Reddit API 页面——带标签的概览,加上端点列表,每个端点标有路径。
Reddit 提供的 vs. SandBase 补上的
公开数据来自 Reddit。SandBase 并不拥有或运营 Reddit,它只是为符合条件的公开数据流程提供一个统一的 API 层。每一项能力变成一个稳定端点,鉴权收敛成一把 key,响应都是可预期的 JSON——于是 agent 可以沿着同一套约定串起”查一个社区 → 读它的热门帖 → 拉某个帖子的评论”,而不用再纠缠 OAuth 权限和客户端库。
快速上手:第一次调用
SandBase 有不止一个 API 面。目录里可能会展示 /apis/v1/... 下的 GET 路径;本文用的是每个端点 API 参考里带厂商前缀的 Model API 路径。不要替换 HTTP 方法或 URL——按你所选端点的参考文档来。
按名称读取一个公开社区:
import os
import requests
resp = requests.post(
"https://api.sandbase.ai/v1/api/reddit/app/subreddit-info",
headers={
"Authorization": f"Bearer {os.environ['SANDBASE_API_KEY']}",
"Content-Type": "application/json",
},
json={"subreddit_name": "programming"},
)
resp.raise_for_status()
body = resp.json()
if body.get("status") != "completed":
error = body.get("error", {})
raise RuntimeError(error.get("message", "Reddit request did not complete"))
# 下面的字段名是示例结构,不是保证的 schema——
# 用防御式 .get() 访问,并以一份真实响应为准核对真实路径。
info = body["outputs"][0]["data"].get("subredditInfoByName", {})
print(info.get("name"), info.get("subscribersCount"), info.get("type"))
curl -X POST https://api.sandbase.ai/v1/api/reddit/app/subreddit-info \
-H "Authorization: Bearer $SANDBASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"subreddit_name": "programming"}'
数据端点跑在 sync 模式下,所以返回的 JSON 就是结果,不用轮询。每个响应都用同一个信封:一个 id、一个 status(成功时为 completed)、model 名称,以及一个 outputs 数组,其中唯一一项在 data 下携带载荷。下面是一个社区读取的示例响应结构——端点参考只保证信封,所以请把其中的字段名和数值当作示例结构、而非保证的 schema,并以一份真实响应为准核对具体字段(载荷会变化,数值也会随时间变):
{
"id": "72ec0904-e8a3-433d-b776-9f8bf7f8217c",
"status": "completed",
"model": "reddit/app/subreddit-info",
"outputs": [
{
"data": {
"subredditInfoByName": {
"name": "programming",
"title": "programming",
"id": "t5_2fwo",
"type": "PUBLIC",
"subscribersCount": 6922588,
"publicDescriptionText": "Computer Programming"
}
}
}
]
}
failed 或 timeout 的请求会带上 error 而没有 outputs,所以读 outputs[0].data 之前先判 status。不同端点的响应结构不一样——先看一份真实响应,再按端点逐一对准字段路径。注意 Reddit 的响应经常把载荷嵌在一个命名键下(这里是 subredditInfoByName)。
端点的 API 参考是每个参数名和响应路径的权威来源。
能力地图
| 能力簇 | 代表端点 | 典型用途 |
|---|---|---|
| 社区信息 | reddit/app/subreddit-info | 按名称查社区规模和元数据 |
| 用户资料 | reddit/app/user-profile | 公开用户 karma 和账号信号 |
| 帖子详情 | reddit/app/post-details | 按 id 读取单条帖子 |
| 帖子评论 | reddit/app/post-comments | 评论树与情感分析 |
| 搜索 | reddit/app/dynamic-search | 话题与关键词发现 |
分页方式因端点而异——很多 app 端点用 after 游标指向下一页。在 post-comments 上,after 是下一页游标,sort_type 是一个独立的可选排序控制(不属于分页)。具体看每个端点的 schema。
user-profile 的 API 参考——路由、username 参数和响应 schema。
在 agent 工作流里串联调用
因为每个端点共用同一套鉴权和同一个响应信封,agent 可以从一个社区走到一个帖子,而不用为每个页面单独写特例。一个常见的社区调研模式是这样:
- 解析社区。 用社区名调
reddit/app/subreddit-info,读出subscribersCount、type、id——社区基线。 - 读取帖子。 用
post_id调reddit/app/post-details,再调reddit/app/post-comments拉评论树,用after游标翻页。 - 补全作者。 用
username调reddit/app/user-profile,附上 karma 和账号上下文。
每一步都返回同样的 { id, status, model, outputs } 结构,所以你的 agent 只需判一次 status,读 JSON 的那段代码在每一步都能复用。
常见用例
用 Reddit 社区 API 做社区规模评估
用 reddit/app/subreddit-info 解析一个社区,读 subscribersCount、type、publicDescriptionText,给社区做规模评估和分类。输入:社区名。输出:结构化的社区记录。端点:subreddit-info。
用 Reddit 用户 API 做作者调研
用 reddit/app/user-profile 读取公开用户,拿到 karma 明细和账号标记。输入:用户名。输出:结构化的用户记录。端点:user-profile。
用 Reddit 搜索 API 做话题发现
用 reddit/app/dynamic-search 加一个 query——它是搜索关键词,不是资源标识符——围绕某话题挖出相关帖子和社区,再翻页。输入:搜索关键词。输出:匹配的帖子和社区。端点:dynamic-search。完整工作流看如何监测一个 Reddit 社区。
边界与限制
- 只读、公开数据。 不能发帖、投票、管理版务,也不能做需成员授权的操作。
- 速率与量级。 把响应当作尽力而为的读取;遇到 HTTP 429 用退避重试。
- 参数与结构随上游而定。 载荷经常嵌在一个命名键下(比如
subredditInfoByName、redditorInfoByName)。先看真实响应、读 schema。 - 并非所有列出的端点都已可调用。 测试时有几个信息流端点返回了上游错误;在依赖某个具体端点之前,先对照在线 API 参考确认。
- 这不是 Reddit 官方合作。 SandBase 只是提供对公开数据的统一访问;请遵守 Reddit 的条款以及你使用场景下适用的规则,包括任何商用限制。
常见问题
我需要 Reddit 开发者应用或 OAuth 吗?
不需要。你用 SANDBASE_API_KEY 向 SandBase 鉴权。这些读取端点不需要你注册 Reddit 应用、管理 OAuth token 或安装 PRAW。
用什么来标识社区、用户或帖子?
用自然标识:subreddit_name、username 和 post_id。搜索用 query。
分页怎么做?
多数 app 端点用响应里返回的 after 游标翻下一页。在 post-comments 上,after 是下一页游标,sort_type 是一个独立的可选排序控制(不负责分页)。具体看每个端点的 schema。
能读私密社区或仅成员可见的数据吗? 不能。这个 API 只返回公开数据。私密社区、私信和需成员授权的数据都不在范围内。
从一个社区请求开始
创建一把 SandBase API key,用 subreddit-info 请求一个公开社区,先看清返回的 schema,再扩展到帖子、评论、用户或搜索。准备好之后: