开发者 · API / MCP
抖音、小红书链接 → AI 能读的文本
一个 POST 或一个 MCP 工具:逐字稿、画面里的字、每张图的描述和 OCR、要点,可选爆款拆解和翻译。 用的是我们的服务器去读,不需要你的抖音、小红书账号,也不需要 cookie,不会连累你的号。
REST
三步跑通
- 在 https://linkdigest.dev/app/keys 创建 API Key(用邮箱登录即可;中国大陆网络打不开 Google 登录),形如
ld_live_…。 - POST 一条链接——整段分享文案也行,我们会从里面取出链接。
- 视频较长时返回 202 和 jobId,用
?wait=20取结果,最多等 20 秒,没完成就再取一次。
curl -X POST https://linkdigest.dev/api/v1/digest \
-H "Authorization: Bearer ld_live_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://v.douyin.com/xxxx/", "format": "json", "breakdown": true}'
# 202 {"pending":true,"jobId":"abc…"} →
curl "https://linkdigest.dev/api/v1/digest/abc…?wait=20" -H "Authorization: Bearer ld_live_..."Python(requests)
import requests
API = "https://linkdigest.dev/api/v1/digest"
H = {"Authorization": "Bearer ld_live_..."}
link = "https://v.douyin.com/xxxx/" # 抖音 / 小红书分享链接;整段分享文案也行
r = requests.post(API, headers=H, json={"url": link, "format": "json", "breakdown": True})
while r.status_code == 202:
r = requests.get(f"{API}/{r.json()['jobId']}", headers=H, params={"format": "json", "wait": 20})
r.raise_for_status()
d = r.json()
print(d["title"], d["credits"], d["breakdown"]["hook"])Node.js 18+(自带 fetch,存成 digest.mjs 后 node digest.mjs)
const API = "https://linkdigest.dev/api/v1/digest";
const headers = { Authorization: "Bearer ld_live_...", "Content-Type": "application/json" };
const link = "https://v.douyin.com/xxxx/"; // 抖音 / 小红书分享链接;整段分享文案也行
let r = await fetch(API, {
method: "POST",
headers,
body: JSON.stringify({ url: link, format: "json", breakdown: true }),
});
while (r.status === 202) {
const { jobId } = await r.json();
r = await fetch(`${API}/${jobId}?format=json&wait=20`, { headers });
}
if (!r.ok) throw new Error(`${r.status} ${await r.text()}`);
const d = await r.json();
console.log(d.title, d.credits, d.breakdown?.hook);返回字段
| title / author / posted_at / caption | 标题、作者、发布时间、正文 |
| transcript | 逐字稿,[{ t, text }]。有平台字幕用字幕;没有时来自 Qwen3-ASR,按段给,t 是这一段开始的秒数(每段最长约 170 秒)。YouTube 例外:transcript_source 为 gemini_video 时,逐字稿由 Gemini 看视频写出(时间 t 也是它给的),不是平台字幕,也不是 Qwen3-ASR。 |
| transcript_source | 逐字稿从哪来:native_captions(平台字幕)、asr(Qwen3-ASR)、gemini_video(YouTube,Gemini 看视频写的)、none(没有逐字稿,比如图文笔记) |
| on_screen | 视频画面里的字,带大致时间(≈ 关键帧,误差几秒) |
| ocr_text / images[] | 图文笔记每张图的描述和图上文字 |
| image_count / images_read | 帖子共有几张图、取了几张(取了几张就按几张计费)。60 张以内全部取;超过时取前 60 张;带 partial_ok 而积分不够时,取积分够的前几张(第 1 个积分 6 张,之后每个积分再 6 张),这时有 partial(公众号文章不带 partial_ok 也这样)。degraded 里写明没取的。取了不等于读出来了:下载失败或识图失败的图也算在 images_read 里,实际读出来几张看 coverage.images_read。2026-10-05 之前缓存的链接没有这两个字段 |
| key_points | 要点,原文语言 |
| key_point_support | 每条要点背后的一句原话,[{ point_index, kind, t, image_index, quote, verified }]:kind 是出处(transcript 逐字稿、on_screen 画面文字、image 图片、caption 正文、chapter 章节),t 是视频里的秒数,point_index、image_index 从 0 数。引用由引擎逐字核对,对不上的 verified 为 false,照样保留 |
| coverage | 覆盖回执,由代码算出、不由模型写:视频转写了几秒(seconds_transcribed / duration_seconds)、抽帧最大间隔(largest_frame_gap_seconds),图文读了几张(images_read / images_total),not_captured 用一句话写明没读到的,比如「minutes 12:00-43:58 not read (budget)」「3 of 21 images skipped」「comments not read」。2026-10-05 之前缓存的链接没有 coverage 和 key_point_support |
| stats | 点赞、评论、收藏、分享(读取当天的平台数据,as_of 标日期) |
| tags | 话题标签 |
| chapters / chapter_source | 章节,[{ t, title, summary }]:作者标的,或抖音自动生成的(每章带一句摘要),chapter_source 写 author 或 platform;不是我们推断的。只读了一部分时,只给读到的章节 |
| category | 平台自己的分类,从大到小,例如 财经 › 投资理财 › 股票 |
| depth / partial.transcript_credits | 这条视频怎么读的:full(完整读取,密集抽帧)或 transcript(逐字稿优先:完整逐字稿 + 大约每分钟一帧,coverage.not_captured 会写明抽帧稀疏)。完整读取只读到一部分时,partial.transcript_credits 是用逐字稿优先读完整条视频要多少积分;视频也超过逐字稿优先的时长上限时为 null。YouTube 例外:由 Gemini 看完整条视频,总是完整读取,按完整读取计费(每开始的 1 分钟 1 积分),传 depth: "transcript" 也一样。2026-10-05 之前缓存的链接没有 depth,都是完整读取 |
| music | 背景音乐(歌名 — 歌手);作者自己的原声不算,为空 |
| links | 帖子指向的链接,[{ url, found_in, label, kind }]:正文或 YouTube 简介里的网址、公众号文章的「阅读原文」、图片和视频帧里的二维码(只解码这次已经下载的图和帧)、画面文字里写全的网址、章节。只提取,不打开:要读其中某个链接,是另一次读取,另算积分,由你决定。found_in 是出处(caption / description / wechat_read_more / qr_code / on_screen / chapter);kind 是 web(网页)、payment(微信支付、支付宝等收款码)、group_invite(微信群、QQ 群、Telegram 群等)、app_deeplink(打开 App)或 other(名片、公众号)。去重,最多 20 个,coverage.links_found 是总数。2026-10-05 之前缓存的链接没有这个字段 |
| breakdown | 爆款拆解(breakdown=true 时) |
| translation | 译文(translate_to 时),原文保留。逐字稿超过 24,000 字符时只译开头一段,translation.note 和 coverage.not_captured 会写明译到哪里(2026-10-06 起) |
| raw_markdown | 整条内容的 Markdown,含拆解和译文 |
| credits / cached | 本次扣了几个积分;读过的链接 cached=true、0 积分 |
批量:POST /api/v1/digest/batch,一次最多 50 条,可带 breakdown 和签名的 webhook。 状态码:402 = 额度不够(返回体里有不用登录的付款链接 buy_url);422 = 链接读不了(删帖、私密、需要登录)。 完整说明见 英文文档,机器可读的规格在 /openapi.json。
MCP
Claude Code、Cursor、Trae、Cherry Studio、通义灵码
claude mcp add --transport http linkdigest \ https://linkdigest.dev/mcp \ --header "Authorization: Bearer ld_live_..."
所有客户端都一样:地址 https://linkdigest.dev/mcp,传输方式 Streamable HTTP(有的客户端叫「HTTP」或「可流式传输的 HTTP」), 请求头 Authorization: Bearer ld_live_…。只有一个工具 digest_url,参数 url、format、job_id、partial_ok、translate_to、breakdown、depth。长视频第一次调用会返回 job_id, 再调一次、只传 job_id 不传 url 就能取结果。对 agent 说「拆解这条抖音」它会自己带上 breakdown: true。 Dify 有现成插件(插件市场搜 LinkDigest)。
先确认连得上:tools/list 不需要 Key。
curl -s https://linkdigest.dev/mcp -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'各客户端的配置(复制即用,把 ld_live_... 换成你的 Key)
Claude Code — 项目根目录的 .mcp.json(或用上面的 claude mcp add 一行)
{
"mcpServers": {
"linkdigest": {
"type": "http",
"url": "https://linkdigest.dev/mcp",
"headers": { "Authorization": "Bearer ld_live_..." }
}
}
}Cursor — 全局 ~/.cursor/mcp.json,或项目里的 .cursor/mcp.json
{
"mcpServers": {
"linkdigest": {
"url": "https://linkdigest.dev/mcp",
"headers": { "Authorization": "Bearer ld_live_..." }
}
}
}Trae — MCP 设置里手动添加,粘贴 JSON
{
"mcpServers": {
"linkdigest": {
"url": "https://linkdigest.dev/mcp",
"headers": { "Authorization": "Bearer ld_live_..." }
}
}
}Cherry Studio — 【设置】→【MCP】→【MCP 服务器】→【添加】→ 从 JSON 导入;之后在 Agent 的【编辑】→【MCP】里启用
{
"mcpServers": {
"linkdigest": {
"type": "streamableHttp",
"baseUrl": "https://linkdigest.dev/mcp",
"headers": { "Authorization": "Bearer ld_live_..." }
}
}
}通义灵码(Lingma) — 个人设置 → MCP 服务 → 我的服务 →「+」→ 配置文件添加。通义灵码文档只列了 STDIO 和 SSE、没有请求头,所以用 mcp-remote 在本地转一层(需要 Node.js)。手工添加也行:类型 STDIO,命令 npx,参数照下面 args,环境变量 AUTH_HEADER
{
"mcpServers": {
"linkdigest": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://linkdigest.dev/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer ld_live_..." }
}
}
}只支持 SSE 或本地命令(stdio)的客户端:不要把类型选成 SSE 直接填地址——/mcp 只支持 Streamable HTTP。 用 mcp-remote 在本地转一层(需要 Node.js;它默认先走 Streamable HTTP):
npx mcp-remote https://linkdigest.dev/mcp --header "Authorization: Bearer <key>"
写进 JSON 配置时,有的客户端(mcp-remote 的说明里点名了 Cursor、Windows 上的 Claude Desktop)不会转义参数里的空格, 所以上面通义灵码的写法把 Bearer … 放进环境变量 AUTH_HEADER,参数写成 Authorization:${AUTH_HEADER}。
字段从哪来
哪些是原文,哪些是 AI 写的
要引用、入库或给人看之前,先分清楚:左边是从帖子里读出来的(YouTube 有例外,见表格下面),右边是模型基于原文写的分析。
原文:读出来的,不改写
| transcript | 平台字幕,或 Qwen3-ASR 语音识别的结果。YouTube 例外:transcript_source 为 gemini_video 时,逐字稿由 Gemini 看视频写出(时间 t 也是它给的),不是平台字幕,也不是 Qwen3-ASR。 |
| on_screen / ocr_text / images[].ocr | 视觉模型从画面、图片上逐字读出的字。是识别,不是改写;识别错字会原样出现。YouTube 例外:transcript_source 为 gemini_video 时,ocr_text 由 Gemini 看视频写出,没有 on_screen。 |
| stats | 平台在读取当天给出的点赞、评论、收藏、分享、播放,as_of 写着日期;平台没给的是 null。 |
| tags | 帖子自带的话题标签。 |
| chapters / category / music | 平台给的章节、分类和背景音乐。chapter_source 为 platform 的章节和它的摘要是抖音自动生成的,不是我们的模型写的。2026-10-05 之前缓存的链接没有这几个字段。 |
| links | 正文、简介、章节里写着的网址,公众号的阅读原文,二维码里的内容:由代码提取和分类(kind),不打开。found_in 为 on_screen 的网址取自画面文字识别,识别错字会原样出现。 |
| title / author / posted_at / caption | 平台元数据和正文。title、author 只有明显乱码时才会被整理。YouTube 走 gemini_video 时,能读到 YouTube 视频页就取视频页上的;读不到时 title、author 由 Gemini 写出,caption、posted_at 为空。 |
AI 生成:模型写的
| key_points | 模型根据上面的原文写的要点,保持原文语言。 |
| key_point_support | 模型为每条要点给出一句原话和出处;原话由引擎在帖子里逐字查找,找到的 verified 为 true,并由代码写上时间 t 或第几张图 image_index;找不到的 verified 为 false,不删。 |
| images[].description | 模型对每张图画了什么的描述。 |
| breakdown | 爆款拆解。其中 hook.spoken、hook.on_screen、beats[].quote、cover_text、cta 是原文引用,逐字核对过,对不上的会被删掉并写进 missing;engagement 和 tags 直接复制 stats 和 tags,不由模型写。 |
| translation | 机器翻译,放在原文旁边;原文字段一个字不改。 |
YouTube 例外:YouTube 不让我们的服务器地址下载视频,所以 YouTube 链接一般由 Gemini 直接看视频来读,degraded 里会写 read by Gemini watching the video directly。这时 transcript_source 为 gemini_video,逐字稿和画面文字(ocr_text)是 Gemini 写出的,属于模型输出;要逐字引用,以视频本身为准。标题、作者、简介(caption)和发布日期取自 YouTube 视频页;视频页读不到时,标题和作者也由 Gemini 写出。
coverage 两边都不算:它既不是从帖子里读出来的,也不是模型写的,是引擎按这次实际读了什么、用代码算出的回执—— 转写了几秒、抽帧间隔多大、读了几张图、哪些没读到(not_captured)。Markdown 里是「## Coverage」一节。
2026-09-18 我们用同一批中文视频对比过 Whisper large-v3-turbo:它更快更便宜,但中文错得更多(把「900人」听成「酒派人」、「创业」听成「创意」),所以生产环境用 Qwen3-ASR。
爆款拆解 · breakdown
不只是文案,是这条内容怎么做出来的
加 "breakdown": true,在逐字稿、画面文字、图片和数据的基础上多一次分析(+1 积分), 用帖子本身的语言写(或 translate_to 指定的语言)。引用的原话会和原文逐字核对,对不上的会删掉并在 missing 里说明; 点赞、评论、话题标签直接来自平台,不由模型编。
| hook | 开头怎么留人:说的(逐字)、屏幕上的字(逐字)、画面、为什么有效 |
| beats | 结构节拍:每一步的时间(≈)或第几张图、标签(痛点 / 方法 / 结果 / 行动号召…)、摘要、一句原话 |
| title_formula | 标题公式,例如「数字 + 结果 + 人群」 |
| cover_text / cta | 封面文字、行动号召,逐字 |
| audience | 目标人群 |
| template | 可复用模板,4–8 步,用 [产品] [痛点] 这样的占位 |
| remix_ideas | 二创方向 2–3 个 |
| missing | 这次拆解看不到的东西:没有语音、只读了一部分、没有数据… |
扣子 Coze
用 OpenAPI 导入成插件
- 扣子 → 资源库 → 创建插件 → 导入,选择「URL」,填
https://linkdigest.dev/openapi.json。 (规格按 OpenAPI 3.0.3 生成并通过校验;导入时遇到问题,回复任何一封我们的邮件或写信到 support@linkdigest.dev。) - 授权方式选 Service(服务),位置 Header,参数名
Authorization,值Bearer ld_live_…(你自己的 Key)。 - 会出现 4 个工具:
digest_url、get_digest、digest_batch、get_batch。 工作流里先调digest_url(format 用 json);如果返回pending,循环调用get_digest(jobId, wait=20)直到拿到结果(最多循环 10 次)。正文用raw_markdown,拆解用breakdown。
飞书多维表格
一列链接,旁边自动填好
字段捷径已经开发完成:选链接所在的列、要什么(文案 / 图文文字 / 要点 / 爆款拆解)、是否翻译,填入 API Key, 旁边会拆出结果、标题、作者、钩子、结构节拍、可复用模板、点赞、评论、收藏、分享和本次积分等列;额度用完时单元格里直接给付款链接。 上架飞书捷径中心需要飞书审核,完成后这里会给出链接。在那之前,可以用多维表格自动化的「发送 HTTP 请求」调同一个 API(见上面的 REST 例子)。
价格
按工作量计费
注册送 10 积分(一次性,不按月补),不用绑卡。一条图文 1 积分; 视频每开始的 1 分钟 1 积分(一条 1 分钟的视频共 2 积分); 爆款拆解 +1,翻译 +1。任何人读过的链接再读免费;读不出内容不收费。
长视频可以用 depth: "transcript"(逐字稿优先):完整逐字稿 + 大约每分钟一帧(有章节时每章一帧), 每开始的 2 分钟 1 积分;付费账号最长 120 分钟、 免费 60 分钟(完整读取是 30 / 10 分钟)。 一条 45 分钟的讲座 24 积分。YouTube 例外:由 Gemini 看完整条视频,总是完整读取,按完整读取计费(每开始的 1 分钟 1 积分),传 depth: "transcript" 也一样。
加量包 $5 = 250 积分,一次性、永不过期,支持支付宝(按人民币结算 ¥36,每积分 ¥0.144:一条 6 张图以内的图文 ¥0.144, 一条 1 分钟的视频 ¥0.288);或 $9/月 500 积分(银行卡)。
| 平台 / 类型 | 原因 |
|---|---|
| B站(哔哩哔哩) | 对我们服务器的地址直接返回 HTTP 412,请求到不了视频。需要代理,目前没有。 |
| X 长文(Articles) | 只能拿到首图。普通帖子的图片、视频都能读,长文正文读不到。 |
| 代码已接入,但没有端到端验证过,所以不算支持。 |