把内容 Agent 接进你的系统
妙音是中国内容 Agent 基础设施:一组 REST 接口 + 一个托管 MCP Server。查询你的选题、稿件与效果数据,提交内容需求指令,或一次调用把内容生成/适配并发布到多个国内渠道。 数据严格按账号隔离,写操作计费规则全部公开。
机器可读入口:openapi.json(OpenAPI 3.1 规范)· llms.txt(给 LLM 看的能力索引)
快速开始
生成 API Key
登录控制台 → 左下角账户菜单 →「OpenAPI」→「开通并生成 API Key」。完整 Key 只显示这一次,请立即复制保存;丢失可在同一页面重置(旧 Key 立即失效)。发布接口要求账号处于可用状态(试用期内或认证未过期),否则返回 403。
发起第一次发布
一次调用完成「生成/适配 → 审核质检 → 多渠道入队」。最简形式:只给一个主题,由平台 AI 生成并发布:
curl -X POST https://sarasvati.cn/api/v1/publish \
-H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"brandId":3,"channels":["zhihu","toutiao"],"generate":true,"topic":"智慧公路的三个常见误区"}'已有成稿就传 title + content 走自带内容模式,详见下方 POST /publish。每日前 20 个渠道发布免费。顺手验证 Key:GET /api/v1/me 返回账号概要与余额即接入成功。
轮询发布状态
用返回的 manuscriptId 查各平台进度,publishStatus 变为 published 且回采到 publishedUrl 即发布完成:
curl -H "Authorization: Bearer svt_你的Key" \
https://sarasvati.cn/api/v1/manuscripts/128AI Agent 接入
妙音的接口为 AI Agent 设计:首选托管 MCP Server(tools 化接入,无需手写 HTTP,见下一节);REST 侧一份 openapi.json 就是完整的机器可读契约,llms.txt 是给 LLM 的能力索引。REST 接法:
Claude Code / Cursor / Codex
让 Agent 先读规范再动手——直接把下面这句丢给它:
读取 https://sarasvati.cn/openapi.json 了解妙音 OpenAPI,
然后用我的 API Key(Authorization: Bearer svt_xxx)
调用接口完成:<你的任务>Agent 会自行理解端点、参数与响应结构。写操作(提交指令)创建后为「待确认」,你在控制台确认后才计费执行。
扣子(Coze)
扣子支持基于第三方 API 创建插件:插件市场 → 创建插件 → 基于已有服务创建 → 填入 Base URL https://sarasvati.cn/api/v1 与 openapi.json 地址,鉴权方式选 Authorization Header(Bearer),把你的 Key 配进插件。之后在任何扣子 Bot / 工作流里直接引用。
n8n / 自托管工作流
用 HTTP Request 节点:Method 选 GET/POST,URL 填对应端点,Header 加 Authorization: Bearer svt_xxx。配合 Schedule Trigger 可做每日数据看板、热点触发提需求等自动化。
脚本 / 自建系统
任意语言直接调 REST:curl -H "Authorization: Bearer svt_xxx" https://sarasvati.cn/api/v1/me。Python / Node 可用 requests / fetch,分页遍历用 page + limit(单页最大 100)。
托管 MCP Server(推荐)
妙音托管了一个 MCP(Model Context Protocol)Server:第三方 AI Agent 以 tools 方式直接调用平台能力,无需手写 HTTP。 Endpoint:https://sarasvati.cn/mcp(POST,Streamable HTTP,无会话状态),认证与 OpenAPI 同一个 Key:Authorization: Bearer svt_xxx。 该 MCP Server 已上架魔搭 ModelScope、扣子(Coze)、百度千帆的 MCP 市场——在对应平台搜索「妙音」即可一键安装;手动配置方式如下。
Claude Code
一行命令挂进去(把 svt_xxx 换成你的 Key):
claude mcp add --transport http sarasvati \
https://sarasvati.cn/mcp \
-H "Authorization: Bearer svt_xxx"Cursor
在 ~/.cursor/mcp.json(或项目内 .cursor/mcp.json)加一段:
{
"mcpServers": {
"sarasvati": {
"url": "https://sarasvati.cn/mcp",
"headers": {
"Authorization": "Bearer svt_xxx"
}
}
}
}扣子(Coze)
扣子支持接入 MCP 服务:创建自定义插件时选择 MCP 方式,填入地址 https://sarasvati.cn/mcp,鉴权 Header 配 Authorization: Bearer svt_xxx,之后在任何扣子 Bot / 工作流里直接引用工具。
工具清单(13 个)
只读工具(9):数据范围与 OpenAPI 一致,严格按 Key 所属账号隔离。
| 字段 | 类型 | 说明 |
|---|---|---|
get_account | — | 账号概要:名称、认证档、认证到期、单元余额、账号状态 |
list_brands | — | 品牌列表:id、name、enabled、行业/调性等摘要 |
list_topics | status? brandId? page? limit? | 选题清单(可按状态/品牌筛选、分页) |
get_topic | id | 选题详情(依据、评分、来源、产出稿件 ID) |
list_manuscripts | status? brandId? page? limit? | 稿件列表(含各渠道发布状态) |
get_manuscript | id | 稿件详情(含各渠道完整正文) |
list_channels | — | 渠道账号列表(平台、账号名、启用状态、最近错误;不含任何凭证) |
get_publish_status | manuscriptId? | 发布队列状态(不传稿件 ID 返回最近 20 条任务) |
get_metrics | days? brandId? page? limit? | 效果回流:查看/点赞/回复/分享(多次回采记录即增长曲线) |
写工具(4):
| 字段 | 类型 | 说明 |
|---|---|---|
submit_directive | rawText brandId? | 提交内容需求指令:创建为「待确认」,控制台确认前不扣费不执行(试用账号也可用) |
submit_task_pack | rawText brandId? platforms? | 端到端任务包:提交需求并返回完整工作流地图(提需求→确认→生产→手机审批→发布→回采),适合 Agent 一键跑闭环 |
preview_publish | manuscriptId platforms[] | 发布预检:逐平台校验可发性,全部通过签发 30 分钟有效的 confirmCode |
confirm_publish | manuscriptId confirmCode | 确认发布:凭 confirmCode 把稿件入队发布(真正生效的一步) |
端到端任务模板(submit_task_pack 示例)
对竞品「通用连接器」的差异:我们给的是完整内容 Agent 任务模板,而不是一个孤立的 publish 接口。 下面这段是 Claude / Cursor 里对挂好 MCP 的助手说的话,一条指令即可拿到整个闭环地图:
调用 sarasvati 的 submit_task_pack:
rawText = "给「妙音」品牌每周产出 1 篇面向中小企业主的内容 Agent 科普图文"
然后按返回的 workflow 逐步推进:
1. 我去控制台确认需求后,妙音 Agent 自动选题/生产/质检;
2. 提醒我手机审批;
3. 我通过后,对妙音频道和我的官网跑 preview_publish → confirm_publish;
4. 调 get_metrics 留下基线数据。单元消耗只在内容生成/改写环节发生(按渠道计费的规则见上方「通用约定」);确认需求前不扣费不执行,全过程可追溯。
发布两步规则与风控
- 先预览再确认:发布必须
preview_publish→confirm_publish两步走;confirmCode 绑定账号、稿件与平台清单,30 分钟有效,过期需重新预览。 - 仅限 API 直发渠道:公众号(wechat)、妙音频道(sarasvati)、我的官网(official_site)。小红书/知乎/头条等为模拟发布通道(cookie 托管),有风控风险,请登录控制台人工审批发布。
- 认证档门槛:confirm_publish 要求账号已认证(基础版及以上且在有效期内);试用账号可用全部只读工具与 submit_directive。
- 每日限额:同一账号 confirm_publish 每天最多成功 10 次。
- 不产生额外扣费:发布本身不扣单元,扣费只发生在内容生成/改写/配图环节。
- 与 REST 的分工:MCP 两步确认、每日限 10 次、仅限 3 个 API 直发渠道,适合 AI Agent 人机协作;系统间自动化建议直接用 POST /api/v1/publish——一次调用、按渠道计费(每日 20 次免费)、限流 30 次/分钟。
- 错误处理:业务错误通过工具结果的
isError: true返回中文说明;响应头x-units-remaining随时回传当前单元余额。
5 分钟跑通全链路(复制粘贴即可)
这几个数字都来自本页文档,可逐一验证:13 个 MCP 工具 · 一次 submit_directive 让妙音 Agent 后台完成选题/生产/质检 · 两步 preview_publish → confirm_publish 完成发布与多渠道适配 ·get_metrics 回采查看/点赞/回复/分享。把下面这段话原样发给挂好 MCP 的 Claude / Cursor,就能跑完「提需求 → 生产 → 发布 → 看数据」闭环:
1. 调用 sarasvati 的 get_account 确认接入成功,并告诉我单元余额和认证档。
2. 调用 list_brands 列出我的品牌,选第一个启用的品牌。
3. 提交一条内容需求指令(submit_directive):
「结合我品牌的行业与调性,写一篇面向客户的科普图文,突出我们的专业能力」
4. 提示我:指令已进入控制台待确认,确认后妙音 Agent 会自动完成
选题 → AI 生产 → 质检 → 生成多渠道适配稿件。
5. 稿件生成后:调用 list_manuscripts 找到最新稿件,跑 preview_publish
预检 API 直发渠道,把预检结果和各平台适配情况汇报给我,等我确认。
6. 我确认后调用 confirm_publish 完成发布,再调 get_metrics 留下本次基线数据。以上每一步都是真实的工具调用,没有任何演示模拟。第 4 步的生产由妙音 Agent 在平台内完成(约几分钟),你会在控制台和手机上收到审批提醒——人只拍板,Agent 干活。
通用约定
Base URL 与认证
| 字段 | 类型 | 说明 |
|---|---|---|
Base URL | — | https://sarasvati.cn/api/v1 |
认证方式 | 请求头 | Authorization: Bearer svt_xxx(Key 为 svt_ + 48 位十六进制) |
请求编码 | — | POST body 为 JSON(Content-Type: application/json) |
数据范围 | — | 严格按 Key 所属账号(租户)隔离,跨账号数据一律 404 |
响应格式
成功统一返回 { "ok": true, "data": … };列表接口额外带分页字段;失败统一返回 { "ok": false, "error": "错误说明" } 并配对应 HTTP 状态码。
| 字段 | 类型 | 说明 |
|---|---|---|
ok | boolean | 请求是否成功 |
data | array | object | 业务数据(列表接口为数组) |
page / limit | number | 列表接口:当前页码 / 每页条数 |
total | number | 列表接口:符合条件的总条数 |
hasNext | boolean | 列表接口:是否还有下一页 |
error | string | 失败时的中文错误说明 |
分页
列表接口统一支持 page(从 1 开始)与 limit(默认 20,最大 100)两个 query 参数。
错误码
| 字段 | 类型 | 说明 |
|---|---|---|
400 | 参数错误 | 请求参数不合法,error 里有具体说明(如 rawText 长度不符、brandId 不属于当前账号、渠道不合法) |
401 | 未认证 | API Key 缺失、格式不对、已吊销,或账号已停用 |
402 | 单元不足 | 发布计费时余额不足,响应带 rechargeUrl 引导充值(控制台「计费」页) |
403 | 账号不可用 | 试用期已结束且未完成认证/续费,响应带 upgradeUrl 引导处理 |
404 | 不存在 | 资源不存在,或不属于当前账号(出于隔离考虑不区分这两种情况) |
429 | 请求过于频繁 | 触发限流(发布接口同一 Key 30 次/分钟),error 里给出需等待的秒数 |
POST/api/v1/publish
发布即服务:一次调用完成「内容生成/平台适配 → 审核质检 → 多渠道入队发布」,支持图文(article,默认)与视频(video)两种内容形态。每日前 20 个渠道发布免费(图视共享额度),超出按图文 0.5 / 视频 1.5 单元/渠道计费(详见计费与额度)。支持 Idempotency-Key 幂等重试。
内容形态与模式
| 字段 | 类型 | 说明 |
|---|---|---|
图文 · 自带内容 | title + content(+ images?) | 已有成稿直接发:正文保持原文核心内容不变,仅按各平台格式与风格做适配 |
图文 · 代为生成 | generate: true + topic(+ requirement?) | 只给一个主题,由平台 AI 生产全文并发布 |
视频 · 自带内容 | contentType: "video" + videoUrl + title(+ content?) | 已有成片(mp4 直链)直接发:content 作为视频简介/文案,按各视频平台简介格式适配;可发好看视频、AcFun 等纯视频渠道 |
视频 · 代为生成 | contentType: "video" + generate: true + topic | 走图文成片管线(分镜脚本 → 配音合成):接口立即返回 manuscriptId,合成完成后自动发布,用 GET /manuscripts/{id} 轮询 video.status 与各渠道进度;合成失败发布费自动全额退还 |
请求体(JSON)
| 参数 | 位置/类型 | 必填 | 说明 |
|---|---|---|---|
brandId | body · number | 是 | 品牌 ID;必须属于当前账号且品牌启用中 |
channels | body · string[] | 是 | 渠道 key 数组,1–20 个(自动去重);按内容形态收口:video 可发视频渠道(含纯视频渠道),不合法的渠道会在 400 里逐个报出并附当前可用清单 |
contentType | body · string | 否 | article(图文,默认)/ video(视频) |
videoUrl | body · string | 视频·自带内容必填 | 成片 URL(http/https,mp4,≤200MB);与 generate 互斥 |
title | body · string | 自带内容必填 | 稿件标题,≤200 字;generate 模式可省略(由 AI 拟定) |
content | body · string | 图文自带内容必填 | Markdown 正文,≤50000 字;视频模式下选填,作为视频简介/文案 |
images | body · string[] | 否 | 配图 URL 数组(http/https),≤9 张;仅图文模式 |
generate | body · boolean | 代为生成必填 | 传 true 进入代为生成模式 |
topic | body · string | 代为生成必填 | 主题/素材描述,≤2000 字 |
requirement | body · string | 否 | 附加要求,≤1000 字(调性、字数、必须提到的点等) |
Idempotency-Key | header · string | 否 | 幂等键(≤128 字符):同一账号同一 Key 重试不会重复产稿/扣费/入队,直接返回首次的响应(带 idempotentReplay: true);处理中重复提交返回 409 |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
manuscriptId | number | 生成的稿件 ID,用它调 GET /manuscripts/{id} 跟踪进度 |
taskIds | number[] | 本次创建的发布任务 ID 列表 |
perPlatform | object | 逐渠道结果:成功 { taskId, status: "queued" };失败 { status: "failed", error } |
chargedUnits | number | 本次实扣单元(失败渠道的费用已自动退还) |
freeQuotaUsed | number | 本次用掉的免费渠道发布数 |
freeQuotaRemaining | number | 今日剩余免费额度 |
unitsRemaining | number | 当前单元余额 |
status | string | queued(已入队)/ pending_review(内容安全防线降级,转人工审批,本次不计费) |
note | string | 视频·代为生成时返回:提示合成为异步,轮询 GET /manuscripts/{id} 跟踪 |
idempotentReplay | boolean | 仅幂等重放时出现:true = 本次是 Idempotency-Key 命中返回的首次响应副本,未重复执行 |
示例 · 自带内容
curl -X POST https://sarasvati.cn/api/v1/publish \
-H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"brandId":3,"channels":["zhihu","toutiao","wechat"],"title":"智慧公路的三个常见误区","content":"## 误区一……","images":["https://example.com/cover.png"]}'示例 · 代为生成
curl -X POST https://sarasvati.cn/api/v1/publish \
-H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"brandId":3,"channels":["zhihu","toutiao"],"generate":true,"topic":"智慧公路的三个常见误区","requirement":"1500 字左右,举 2 个真实项目例子"}'示例 · 视频(自带成片 / 代为生成)
# 自带成片:发好看视频 + AcFun + 抖音
curl -X POST https://sarasvati.cn/api/v1/publish \
-H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"brandId":3,"channels":["haokan","acfun","douyin"],"contentType":"video","videoUrl":"https://example.com/intro.mp4","title":"3 分钟看懂智慧公路","content":"视频简介/文案(选填)"}'
# 代为生成:AI 出分镜脚本并合成(异步,立即返回 manuscriptId)
curl -X POST https://sarasvati.cn/api/v1/publish \
-H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"brandId":3,"channels":["douyin","bilibili"],"contentType":"video","generate":true,"topic":"智慧公路的三个常见误区"}'示例 · 幂等重试
curl -X POST https://sarasvati.cn/api/v1/publish \
-H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-20261017-001" \
-d '{"brandId":3,"channels":["zhihu","toutiao"],"generate":true,"topic":"智慧公路的三个常见误区"}'
# 超时/断网后用同一 Key 原样重发:命中返回首次响应(带 idempotentReplay: true),不重复扣费{
"ok": true,
"data": {
"manuscriptId": 128,
"taskIds": [901, 902],
"perPlatform": {
"zhihu": { "taskId": 901, "status": "queued" },
"toutiao": { "taskId": 902, "status": "queued" }
},
"chargedUnits": 0,
"freeQuotaUsed": 2,
"freeQuotaRemaining": 18,
"unitsRemaining": 2000,
"status": "queued"
}
}GET/api/v1/me
验证 Key 并返回账号概要:名称、认证档位、到期时间、单元余额与各项单元单价。
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
tenantId | number | 账号(租户)ID |
name | string | 账号名称 |
plan | string | 认证档位:trial(试用)/ standard(基础版)/ pro(专业版)/ premium(高级版) |
certifiedUntil | string | null | 认证到期时间(ISO 8601) |
balanceUnits | number | 当前单元余额 |
status | string | 账号状态(active 为正常) |
unitCosts | object | 单元单价参考:rewritePerArticle(改写/篇)、imagePerPiece(配图/张)、eoReport(EO 报告/份) |
示例
curl -H "Authorization: Bearer svt_你的Key" \
https://sarasvati.cn/api/v1/meGET/api/v1/topics
选题清单:Agent 根据你的信源与品牌综合研判后产出的选题,按创建时间倒序。
请求参数
| 参数 | 位置/类型 | 必填 | 说明 |
|---|---|---|---|
status | query · string | 否 | 按状态筛选:proposed(待审批)/ approved(已通过)/ auto_approved(自动通过)/ rejected(已拒绝)/ producing(生产中)/ produced(已产出)/ expired(已过期);不传返回全部 |
brandId | query · number | 否 | 按品牌筛选(品牌 ID 见控制台「品牌管理」) |
page | query · number | 否 | 页码,从 1 开始,默认 1 |
limit | query · number | 否 | 每页条数,默认 20,最大 100 |
响应字段(data 数组项)
| 字段 | 类型 | 说明 |
|---|---|---|
id | number | 选题 ID |
title | string | 选题标题 |
status | string | 选题状态(枚举同上) |
score | number | 选题评分(Agent 综合热点度与品牌匹配度给出) |
source | string | 选题来源(信源 / 数据分析建议等) |
brand | object | null | 所属品牌:{ id, name } |
manuscriptId | number | null | 该选题产出的稿件 ID(未产出为 null) |
createdAt / updatedAt | string | 创建 / 更新时间(ISO 8601) |
示例
curl -H "Authorization: Bearer svt_你的Key" \
"https://sarasvati.cn/api/v1/topics?status=proposed&limit=10"{
"ok": true,
"data": [
{
"id": 128,
"title": "国庆假期高速出行预测与避堵指南",
"status": "proposed",
"score": 86,
"source": "tavily-hot",
"brand": { "id": 3, "name": "路信通" },
"manuscriptId": null,
"createdAt": "2026-09-25T09:12:00.000Z",
"updatedAt": "2026-09-25T09:12:00.000Z"
}
],
"page": 1, "limit": 10, "total": 1, "hasNext": false
}GET/api/v1/manuscripts
稿件列表:一篇稿件含多个平台适配版本,每个版本的发布状态、作品链接、失败原因都独立返回。
请求参数
| 参数 | 位置/类型 | 必填 | 说明 |
|---|---|---|---|
status | query · string | 否 | 按稿件状态筛选:draft(草稿)/ pending_review(待审批)/ approved(已通过)/ rejected(已拒绝)/ cancelled(已取消)/ published(已发布)/ failed(发布失败);不传返回全部 |
brandId | query · number | 否 | 按品牌筛选 |
page | query · number | 否 | 页码,默认 1 |
limit | query · number | 否 | 每页条数,默认 20,最大 100 |
响应字段(data 数组项)
| 字段 | 类型 | 说明 |
|---|---|---|
id | number | 稿件 ID |
title | string | 稿件标题 |
status | string | 稿件状态(枚举同上) |
contentType | string | article(图文)/ video(视频) |
brand | object | null | 所属品牌:{ id, name } |
video | object | 视频稿件才有:{ status, durationSec } |
platforms | array | 各平台版本(见下表) |
publishedCount | number | 已成功发布的平台数 |
createdAt / updatedAt | string | 创建 / 更新时间 |
platforms 数组项
| 字段 | 类型 | 说明 |
|---|---|---|
platform | string | 平台标识(如 zhihu / mp / toutiao / xiaohongshu …) |
title | string | 该平台版本的标题(各平台自动改写) |
publishStatus | string | draft(未发布)/ queued(已入队)/ publishing(发布中)/ published(已发布)/ drafted(已入平台草稿箱,需人工点发布)/ failed(失败)/ skipped(跳过) |
publishedUrl | string | null | 作品链接(已发布且成功回采到链接时) |
publishedAt | string | null | 发布时间 |
lastError | string | null | 最近一次发布失败原因 |
示例
curl -H "Authorization: Bearer svt_你的Key" \
"https://sarasvati.cn/api/v1/manuscripts?status=published&limit=5"GET/api/v1/manuscripts/{id}
稿件详情:字段与列表一致,额外返回摘要与各平台版本的完整正文。稿件不存在或不属于当前账号时返回 404。
额外返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
summary | string | 稿件摘要 |
platforms[].content | string | 该平台版本的完整正文 |
platforms[].summary | string | 该平台版本的摘要 |
示例
curl -H "Authorization: Bearer svt_你的Key" \
https://sarasvati.cn/api/v1/manuscripts/57GET/api/v1/effects
效果回采数据:已发布作品的查看、点赞、回复、分享。同一作品会被定期多次回采,每次回采一条记录——按时间排起来就是增长曲线。
请求参数
| 参数 | 位置/类型 | 必填 | 说明 |
|---|---|---|---|
days | query · number | 否 | 回采时间范围(最近 N 天),默认 7,最大 90 |
brandId | query · number | 否 | 按品牌筛选 |
page | query · number | 否 | 页码,默认 1 |
limit | query · number | 否 | 每页条数,默认 20,最大 100 |
响应字段(data 数组项)
| 字段 | 类型 | 说明 |
|---|---|---|
manuscriptId / manuscriptTitle | number / string | 对应稿件的 ID 与标题 |
brand | object | null | 所属品牌:{ id, name } |
platform | string | 平台标识 |
publishedUrl | string | null | 作品链接 |
views / likes / comments / shares | number | 本次回采的查看 / 点赞 / 回复 / 分享数 |
fetchedAt | string | 本次回采时间(ISO 8601) |
error | string | null | 本次回采失败原因(成功为 null) |
示例
curl -H "Authorization: Bearer svt_你的Key" \
"https://sarasvati.cn/api/v1/effects?days=30&limit=50"{
"ok": true,
"data": [
{
"manuscriptId": 57,
"manuscriptTitle": "智慧公路的三个误区",
"brand": { "id": 3, "name": "路信通" },
"platform": "zhihu",
"publishedUrl": "https://zhuanlan.zhihu.com/p/…",
"views": 1286, "likes": 45, "comments": 7, "shares": 3,
"fetchedAt": "2026-09-26T02:00:00.000Z",
"error": null
}
],
"page": 1, "limit": 50, "total": 1, "hasNext": false, "days": 30
}POST/api/v1/directives
提交内容需求指令。指令创建为「待确认」状态——本接口不扣单元,你在控制台「指令」页确认后,才按与手动创建完全相同的流程解析、计费、执行。
请求体(JSON)
| 参数 | 位置/类型 | 必填 | 说明 |
|---|---|---|---|
rawText | body · string | 是 | 10–500 字的大白话需求,如「每天给路信通产出 1 篇智慧公路主题的图文,发知乎和头条」 |
brandId | body · number | 否 | 指定品牌;必须属于当前账号且未暂停 |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
directiveId | number | 指令 ID |
status | string | 固定为 pending_confirm(待确认) |
confirmUrl | string | 控制台指令页地址,登录后确认即开始执行 |
示例
curl -X POST -H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"rawText":"本周给路信通出 3 篇行业热点图文,发知乎和公众号","brandId":3}' \
https://sarasvati.cn/api/v1/directives{
"ok": true,
"data": {
"directiveId": 42,
"status": "pending_confirm",
"confirmUrl": "https://sarasvati.cn/console/directives"
}
}rawText 需为 10-500 字的大白话需求、brandId 不属于当前账号、该品牌已暂停,请先在控制台恢复。POST/api/v1/leads
线索推入:已有自己的表单/CRM(金数据、问卷星、麦客、自有官网表单 webhook)时,把线索直接推进妙音线索库——与官网嵌入表单同口径校验、24h 去重、实时通知,控制台「销售线索」页统一跟进。不扣单元。
请求体(JSON)
| 参数 | 位置/类型 | 必填 | 说明 |
|---|---|---|---|
name | body · string | 是 | 称呼,最长 60 字 |
contact | body · string | 是 | 联系方式:手机号 / 邮箱 / 微信号 / 座机(格式白名单校验,脏数据 400) |
email | body · string | 否 | 邮箱(填了就必须合法,独立落库便于导出触达) |
note | body · string | 否 | 需求描述,最长 500 字 |
brandId | body · number | 否 | 归属品牌,必须属于当前账号 |
utmCampaign | body · string | 否 | 归因标记(如来源活动/内容标识) |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
duplicate | boolean | true = 24 小时内已存在同联系方式线索,未重复创建(不重复通知) |
message | string | 结果说明 |
示例
curl -X POST -H "Authorization: Bearer svt_你的Key" \
-H "Content-Type: application/json" \
-d '{"name":"王先生","contact":"13800138000","note":"想了解飞轮套餐","brandId":3}' \
https://sarasvati.cn/api/v1/leads{
"ok": true,
"data": { "duplicate": false },
"message": "线索已录入,控制台「销售线索」页可跟进"
}Webhook 回调
不想轮询?在控制台「OpenAPI」页的「Webhook 回调」卡片里配置你自己的接收地址(可配多个,各自勾选订阅事件), 事件发生时妙音会主动 POST 推送到你的服务。每个端点创建时生成独立的签名 Secret(只完整显示一次,请立即保存)。 回调地址仅支持 http/https 公网地址(内网地址会被拒绝)。
事件清单
| 字段 | 类型 | 说明 |
|---|---|---|
manuscript.pending_review | 稿件待审批 | 产稿完成进入审批队列(含发布 API 防线降级转人工审批)。data:{ manuscriptId, title, brandName?, versionsCount?, status } |
manuscript.published | 渠道发布成功 | 某渠道版本发布成功回写时触发(每渠道各一条)。data:{ manuscriptId, title, platform, publishedUrl, externalId?, publishedAt } |
manuscript.failed | 渠道发布失败 | 某渠道发布失败终态(自动重试耗尽后)触发。data:{ manuscriptId, title, platform, error, attempts? } |
投递格式
POST JSON 到你的回调地址;id 每条投递唯一,你的服务可据此去重(重试会复用同一 id 对应的新报文,同一事件以 data 内容为准)。
| 字段 | 类型 | 说明 |
|---|---|---|
X-Sarasvati-Event | 请求头 | 事件名(如 manuscript.published) |
X-Sarasvati-Signature | 请求头 | 签名:sha256= + HMAC-SHA256(secret, 原始请求体) 的 hex |
id | body · string | 投递唯一 ID(evt_ 前缀) |
event | body · string | 事件名(同 X-Sarasvati-Event) |
createdAt | body · string | 事件发生时间(ISO 8601) |
data | body · object | 事件数据(字段见上方事件清单) |
POST /webhooks/sarasvati HTTP/1.1
Content-Type: application/json
X-Sarasvati-Event: manuscript.published
X-Sarasvati-Signature: sha256=9f86d08…
{
"id": "evt_3f9a1c…",
"event": "manuscript.published",
"createdAt": "2026-10-17T08:00:00.000Z",
"data": {
"manuscriptId": 128,
"title": "智慧公路的三个常见误区",
"platform": "zhihu",
"publishedUrl": "https://zhuanlan.zhihu.com/p/…",
"publishedAt": "2026-10-17T08:00:00.000Z"
}
}验签示例(Node.js)
import crypto from 'node:crypto'
function verifySarasvatiWebhook(secret, rawBody, signature) {
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody, 'utf8').digest('hex')
const a = Buffer.from(expected), b = Buffer.from(String(signature || ''))
return a.length === b.length && crypto.timingSafeEqual(a, b)
}
// 在你的 HTTP 服务里(注意用原始请求体字符串,不要重新序列化 JSON):
// const ok = verifySarasvatiWebhook(SECRET, rawBody, req.headers['x-sarasvati-signature'])
// if (!ok) return res.status(401).end()重试策略与约定
- 成功判定:你的服务返回 2xx 即视为送达;其他状态码、连接失败、超时(10 秒)都会进入重试。
- 重试:失败后自动重试 3 次,间隔 1 分钟 / 5 分钟 / 15 分钟(指数退避);仍失败则标记终态,不再投递。
- 超时:单次投递 10 秒超时——你的接收端应尽快返回 2xx,耗时处理请异步化。
- 投递日志:控制台「OpenAPI」页可查看每个端点最近投递的成功率与最近 20 条投递记录(状态 / 次数 / 错误原因)。
计费与额度
发布 API 的计费规则很简单:每日免费额度先用,超出按渠道计费,失败全退。
| 字段 | 类型 | 说明 |
|---|---|---|
每日免费额度 | 20 个渠道发布 / 天 | 每账号每日前 20 个「渠道发布」免费(1 篇发 N 个渠道 = N 个渠道发布,图文/视频共享额度),次日零点重置 |
超出后单价 | 图文 0.5 / 视频 1.5 单元 / 渠道 | 按 contentType 区分;视频·代为生成的合成费由合成环节另行扣减(失败全额退还) |
余额不足 | 402 | 响应带 rechargeUrl;充值在控制台「计费」页,阶梯价见定价页 |
调用限流 | 30 次 / 分钟 / Key | 超出返回 429,error 里给出需等待的秒数 |
幂等重试 | Idempotency-Key | 请求头传幂等键(≤128 字符):同一 Key 重试返回首次响应,不重复产稿/扣费;处理中重复提交返回 409 |
渠道范围 | 国内渠道 | 图文与视频渠道均已开放(video 可发好看视频/AcFun 等纯视频渠道);海外渠道择期开放 |
失败退款 | 自动 | 只对成功入队的渠道计费;审核未通过、防线降级转人工、入队失败、视频合成失败——相关费用与免费额度自动全额退回 |
单元充值阶梯与消耗单价全表见 定价页;每笔扣费/退费在控制台「计费」页逐条可查。
chargedUnits 只含发布费(超出免费额度的部分)。「代为生成」模式的内容生产费(改写、配图等)由内容管线按与控制台相同的标准另行扣减,单价可用 GET /api/v1/me 的 unitCosts 字段查询;内容未通过审核时生产费与发布费都全额退还。典型场景
数据看板(BI 汇总)
定时任务每天拉 /effects?days=1,把各平台阅读、点赞、回复写进你自己的数据库或 BI,做多品牌横向对比。同一作品的多次回采记录可直接画增长曲线。
稿件归档(内容资产库)
稿件发布后,用 /manuscripts 筛 status=published 增量拉取,再按 ID 调详情接口取各平台完整正文,归档进你的 CMS 或知识库。
外部触发(事件驱动内容)
你的监控系统发现行业热点 → 自动 POST /directives 提交需求 → 运营在控制台一键确认 → Agent 开始生产 → 审批短信直达手机。机器发现机会,人只做决策。
一键分发(自有内容中台)
你的 CMS 审核通过的稿件,自动 POST /api/v1/publish 走自带内容模式分发到国内渠道——每日前 20 个渠道发布免费;perPlatform 逐渠道返回入队结果,失败渠道自动退费。
安全与配额
- Key 只存哈希:服务端只保存 Key 的 SHA-256,完整 Key 无法被找回——生成时务必立即保存,丢失请重置。
- 数据隔离:每个 Key 只能访问所属账号的数据;跨账号资源一律返回 404,不暴露存在性。
- 停用即失效:账号停用(如到期未续费)后 Key 同步失效,恢复后无需重新生成。
- 吊销与重置:怀疑泄露时在控制台「OpenAPI」页点「吊销」立即失效;「重置」生成新 Key 同时作废旧 Key。
- 写操作保护:提交指令创建后为「待确认」,控制台确认前不扣费不执行;发布接口只对成功入队的渠道计费,失败自动退还,杜绝程序异常刷量。
- 频率限制:发布接口同一 Key 30 次/分钟(超出 429);查询类接口建议轮询不低于 1 分钟一次,列表单页最大 100 条,请用分页遍历。
常见问题
API Key 在哪里生成和管理?
控制台左下角账户菜单 →「OpenAPI」页(计费中心下面):生成 / 重置 / 吊销 Key,看今日 API 发布用量与免费额度。完整 Key 只在生成时显示一次,请立即保存;丢失只能重置,旧 Key 即刻失效。
调接口返回 401「API Key 无效或账号已停用」怎么办?
按顺序排查:① 请求头格式是否为 Authorization: Bearer svt_xxx(注意 Bearer 后有空格);② Key 是否被重置或吊销过——控制台「OpenAPI」页只能看到 Key 前缀,对不上就是旧 Key;③ 账号是否到期停用(先用同一账号登录控制台确认能正常使用)。都排除后仍 401,提工单我们查。
brandId 在哪里查?
控制台「品牌管理」里每个品牌的 ID;也可以调 /topics 或 /manuscripts,返回里的 brand.id 就是。注意 brandId 必须属于你自己的账号,且品牌处于启用状态。
为什么 /effects 里同一篇作品有很多条记录?
这是设计如此:作品发布后会被定期多次回采,每次回采生成一条记录(带 fetchedAt 时间戳)。要最新数据就按 fetchedAt 取每个作品的最后一条;要增长曲线就把同一作品(manuscriptId + platform)的记录按时间排列。
稿件显示「已发布」但没有 publishedUrl?
两类情况:① 作品进了平台草稿箱(publishStatus=drafted,如公众号、搜狐号),需要你或我们在平台后台点最终发布,作品链接产生后才会回采到;② 链接回采有延迟,一般发布后 24–48 小时内补齐。超过 48 小时仍没有,提工单。
POST /directives 提交后什么都没发生?
这是正常的保护设计:API 提交的指令是「待确认」状态,不扣单元、不执行。登录控制台「指令」页确认后才会解析、计费并进入生产流水线——防止程序异常把你的单元刷光。
调用发布 API(POST /api/v1/publish)需要什么条件?
三个条件:① 控制台「OpenAPI」页生成 API Key(左下角账户菜单进入);② 账号处于可用状态(试用期内或认证未过期),否则返回 403 并附 upgradeUrl;③ 目标渠道已在控制台「渠道」页接入,未接入的渠道会在 400 里逐个报出。返回的 manuscriptId 可配合 GET /manuscripts/{id} 轮询发布进度。
发布 API 怎么计费?免费额度是多少?
每账号每日前 20 个「渠道发布」免费(1 篇发 N 个渠道 = N 个渠道发布,图文/视频共享额度),次日零点重置;超出部分图文 0.5 单元/渠道、视频 1.5 单元/渠道。只对成功入队的渠道计费:审核未通过、入队失败、视频合成失败的相关费用与免费额度自动全额退回。余额不足返回 402 并附 rechargeUrl。
发布 API 支持哪些渠道?
国内图文与视频渠道均已开放:图文渠道发知乎/公众号/头条等;contentType=video 可发抖音/B站/快手等双形态渠道与好看视频/AcFun 等纯视频渠道。海外渠道暂不开放——请求里带了不合法渠道会在 400 错误中逐个报出并附当前可用清单。
API 发布的内容安全怎么保证?
所有内容(包括自带原文)都走与控制台完全相同的审核 + AI 质检管线。若审核/质检防线未完整执行,稿件不会自动发布,而是转人工审批(响应 status=pending_review),本次不产生任何发布费用。
MCP 发布和 REST 发布 API 有什么区别?
同一套 Key、同一个发布队列,两种接法:MCP 走 preview_publish → confirm_publish 两步确认,仅限公众号/妙音频道/官网三个 API 直发渠道,需已认证账号(基础版及以上且在有效期内),每日限 10 次、发布本身不扣费,适合 AI Agent 人机协作;REST 的 POST /api/v1/publish 一次调用完成生成/适配与多渠道入队,限流 30 次/分钟、按渠道计费(每日 20 次免费),适合系统间自动化。
发布完成后能主动推送到我的系统吗?
可以,用 Webhook:在控制台「OpenAPI」页配置回调地址,稿件待审批(manuscript.pending_review)、发布成功(published)、发布失败(failed)三类事件会主动 POST 推送,请求带 HMAC-SHA256 签名可验真伪;推送失败按 1/5/15 分钟退避自动重试,不用自己轮询接口。
有调用频率限制吗?
查询类接口目前没有硬性限流,但请遵守常规节奏:轮询不低于 1 分钟一次,列表单页最大 100 条用分页遍历。发布接口 POST /api/v1/publish 有硬性限流:同一 Key 30 次/分钟,超出返回 429 并提示需等待的秒数。后续用量配额调整会提前公告,不会突然限制。
开发者支持
接入中遇到任何问题,有三条通道——优先提工单,响应最快:
svt_ 后前 6 位)、返回的错误内容、发生时间。路线图
- 视频发布失败渠道一键重发;数字人口播成片
- 细粒度 Key 权限:只读 / 读写分离,多 Key 管理
有接口需求?在控制台「工单」里提,被采纳有单元奖励。
现在就把 Agent 接进你的系统
生成 Key 只要 10 秒,第一条 curl 只要 1 分钟。