CBGAccount 开发者文档

博客 API 文档

面向中文开发者的公开与 Token 保护接口说明,用于读取、检查、保存和发布 SEO 友好的 CBGAccount 博客文章。

发布流程

先建草稿,再跑 SEO 检查,最后发布

外部系统应该复用后台编辑器同一套流程:读取分类和标签,保存完整 SEO 字段,运行发布检查,修复阻塞项,再正式发布。

OpenAPI JSONhttps://www.cbgaccount.com/api/v1/blog/openapi.json公开 API Basehttps://www.cbgaccount.com媒体 URL Basehttps://media.cbgaccount.com

鉴权

Token 模型

匿名接口

已发布文章、分类、标签、作者、RSS、sitemap、robots 和 OpenAPI JSON 可以公开读取。

Token 接口

SEO 检查、保存文章、发布、下架、删除和分类标签写入使用 API Token。第三方系统不需要、也不应该登录后台;由 CBGAccount 管理员在后台创建带权限范围的 Token,再交给集成方。

Authorization: Bearer cbg_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X-API-Token: cbg_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

契约基础

响应包装、权限、限流和职责边界

响应包装

JSON API 使用与后台一致的响应包装。code=0000 表示成功,其他 code 都应该按业务错误或校验失败处理。

{
  "code": "0000",
  "message": "success",
  "data": "{ endpoint specific payload }"
}
Token 权限

blog:read 用于读取审计;blog:write 用于 SEO 检查、草稿保存、分类标签、作者和媒体上传;blog:publish 用于发布、下架、删除和状态操作。

Authorization: Bearer <API_TOKEN>
X-API-Token: <API_TOKEN>
限流和调用日志

每个 Token + IP 默认 120 次/分钟。Token 日志会记录所需权限、路径、状态、消息、IP 和耗时。

接口策略拒绝时返回 HTTP 200 + 业务错误码。
公开与后台边界

公开文档说明外部 /api/v1/blog/* 契约;第三方调用只使用 Token 鉴权。Token 创建、轮换、在线调试、Webhook 接收端配置、Search Console 操作和评论审核仍属于后台能力。

在后台创建 Token

进入后台的“博客 API 文档与 Token 管理”。明文 Token 只在创建后显示一次,列表里只保留 maskedToken。外部开发者拿到的是 Token,不是后台账号。

按最小权限分配

只读外部系统给 blog:read;导入草稿给 blog:write;只有可信发布系统才给 blog:publish。

Token 只能服务端保存

不要把写入或发布 Token 放进浏览器 JS、公开页面或公开仓库。建议放在后端密钥管理或环境变量中,并在人员、供应商或系统变更时轮换。

推荐顺序

SEO 友好发布流程

  1. 读取分类标签先调用 GET /categories 和 /tags,让文章进入可抓取的分类页、标签页和内链结构。
  2. 上传媒体封面图、正文图和 OG 图先用 blog:write Token 调 /api/v1/blog/media/upload,保存返回的 CloudFlare-ImgBed HTTPS URL,不要再拼接 API 域名。
  3. 保存草稿调用 POST /posts/save,status=0,并提交标题、摘要、正文 HTML、作者、分类、标签、封面 alt、canonical、robots、OG、FAQ 和要点。
  4. 运行 SEO 检查调用 POST /posts/check,读取 score、canPublish、阻塞项、自动生成的 slug、SEO 标题、描述、摘要和目录。
  5. 修复阻塞项处理缺 H1/H2、正文太薄、slug 重复、摘要弱、图片 alt 缺失、缺少内链或缺少结构化作者等问题。
  6. 正式发布调用 POST /posts/{id}/publish。后端会刷新公开 API、sitemap、RSS、Last-Modified/ETag 和 Webhook 事件。

最佳实践

第三方发布实现清单

调用顺序

  1. 先上传图片用 POST /api/v1/blog/media/upload 上传封面图、正文图和 OG 图,把返回的 CloudFlare-ImgBed HTTPS URL 直接写入 coverImage、ogImage 和正文 img src。
  2. 需要时创建分类、标签、作者用 POST /api/v1/blog/categories/save、/api/v1/blog/tags/save、/api/v1/blog/authors/save 准备 categoryId、tagIds 和 authorId。
  3. 需要资源卡片时先搜索业务资源用 GET /api/v1/blog/resources/categories 和 POST /api/v1/blog/resources/search,插入可抓取的资源卡片 HTML,并同步保存 relatedProductIds。
  4. 保存完整 SEO 草稿用 POST /api/v1/blog/posts/save,status=0,并提交编辑器、SEO、OG、FAQ、内链、媒体和资源相关字段。
  5. 运行发布检查用 POST /api/v1/blog/posts/check,读取 score、canPublish、items、generatedSlug、generatedSeoTitle、generatedSeoDescription、generatedOgTitle 和 toc。
  6. 按检查结果补齐字段补齐 slug、SEO title、description、OG、FAQ、内链、封面 alt、canonical、robots 和业务资源关联。
  7. 阻塞项通过后发布用 POST /api/v1/blog/posts/{id}/publish 正式发布,并刷新公开文章、sitemap、RSS、缓存头和 Webhook。

核心 SEO 与内容字段

第三方 CMS 只要显式保存这些字段,就能发布和后台编辑器一致的完整 SEO 文章。 canonical 留空表示当前文章正式 URL;CloudFlare-ImgBed HTTPS URL 可以直接保存。

language, title, summary, contentHtml, coverImage, coverAlt, categoryId, tagIds, authorId, slug, alternateSlug, seoTitle, seoDescription, canonicalUrl, robots, indexable, ogTitle, ogDescription, ogImage, answerSummary, keyTakeaways, faqBlocks, relatedProductIds, status

接口覆盖

全部公开、Token 与媒体接口

GET

获取已发布文章列表

分页返回公开文章,供博客首页、归档页、内链选择器和外部读取系统使用。

/api/v1/blog/posts
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<PageBlogPostRes>

入参

  • query language: en 或 zh
  • query current 和 size
  • query categoryId、tagId、authorId、keyword

适用场景

  • 渲染博客首页和归档
  • 编辑器搜索内链
  • 把已发布文章同步到外部系统
curl
curl "https://www.cbgaccount.com/api/v1/blog/posts?language=zh&current=1&size=10"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<PageBlogPostRes>"
}
GET

获取文章详情

返回正文 HTML、meta 字段、canonical、robots、Open Graph、作者、标签、目录、相关文章和互动计数。

/api/v1/blog/posts/{slug}
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogPostRes>,旧 slug 命中时返回 301

入参

  • path slug
  • query language: 默认 en,中文传 zh

适用场景

  • SSR 文章页
  • 生成结构化数据
  • 外部镜像保留 canonical
curl
curl "https://www.cbgaccount.com/api/v1/blog/posts/account-infrastructure-growth-workflows-zh?language=zh"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogPostRes>,旧 slug 命中时返回 301"
}
POST

运行发布检查

使用与后台编辑器相同的检查规则,返回 SEO 分、AEO 分、是否可发布、阻塞项、生成建议和目录。

/api/v1/blog/posts/check
鉴权
必须 Bearer Token
权限
blog:write
返回
Result<BlogSeoCheckRes>

入参

  • body BlogSeoCheckReq
  • title、contentHtml、language、categoryId 必填
  • seoTitle、seoDescription、canonicalUrl、authorId、faqBlocks、keyTakeaways 建议填写

适用场景

  • 发布前拦截低质量草稿
  • 给新手显示修复建议
  • 保存前生成 SEO 默认值
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -H "content-type: application/json" -d @draft.json "https://www.cbgaccount.com/api/v1/blog/posts/check"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogSeoCheckRes>"
}
POST

创建或更新文章

保存后台编辑器暴露的全部正文与 SEO 字段。id 为空时创建草稿,id 存在时更新文章。

/api/v1/blog/posts/save
鉴权
必须 Bearer Token
权限
blog:write;status=1 时需要 blog:publish
返回
Result<BlogPostRes>

入参

  • body BlogPostSaveReq(生成 SDK 时可命名为 BlogPostSaveRequest)
  • status: 0 草稿、1 发布、2 下架
  • contentHtml 可包含图片、视频、表格、FAQ、内链和账号资源卡片

适用场景

  • 外部 CMS 创建草稿
  • 自定义编辑器保存完整 SEO 字段
  • 检查通过后直接发布
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -H "content-type: application/json" -d @post-save.json "https://www.cbgaccount.com/api/v1/blog/posts/save"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogPostRes>"
}
POST

发布文章

再次运行 SEO 检查,通过后发布草稿,并刷新公开发现产物和 Webhook。

/api/v1/blog/posts/{id}/publish
鉴权
必须 Bearer Token
权限
blog:publish
返回
Result<BlogPostRes>

入参

  • path id: 文章 ID

适用场景

  • 人工或自动 QA 后的最终发布
  • 触发 sitemap、RSS、Last-Modified、ETag 和 Webhook
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" "https://www.cbgaccount.com/api/v1/blog/posts/1/publish"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogPostRes>"
}
GET

按状态上下架文章

后台式状态操作。正常发布优先使用 publish;此接口更适合下架或迁移后修正状态。

/api/v1/blog/posts/operate
鉴权
必须 Bearer Token
权限
blog:publish
返回
Result<boolean>

入参

  • query id
  • query status: 1 发布,2 下架

适用场景

  • 下架过期内容
  • 迁移后修正文章状态
curl
curl -H "Authorization: Bearer <API_TOKEN>" "https://www.cbgaccount.com/api/v1/blog/posts/operate?id=1&status=2"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<boolean>"
}
GET

删除文章

删除文章并从公开发现中移除。已有 SEO 历史时更建议下架。

/api/v1/blog/posts/delete
鉴权
必须 Bearer Token
权限
blog:publish
返回
Result<boolean>

入参

  • query id

适用场景

  • 移除误发布测试内容
  • 上线前清理失败导入数据
curl
curl -H "Authorization: Bearer <API_TOKEN>" "https://www.cbgaccount.com/api/v1/blog/posts/delete?id=1"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<boolean>"
}
GET

读取互动数据

返回推荐数、已审核评论数和公开评论,不返回邮箱、IP、User-Agent 等审核字段。

/api/v1/blog/posts/{id}/engagement
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogEngagementRes>

入参

  • path id: 文章 ID

适用场景

  • 渲染 Medium 类推荐计数
  • 读取文章评论区
curl
curl "https://www.cbgaccount.com/api/v1/blog/posts/1/engagement"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogEngagementRes>"
}
POST

新增推荐反应

用 clientKey 做轻量幂等,增加 clap 风格推荐。

/api/v1/blog/posts/{id}/reactions
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogEngagementRes>

入参

  • path id
  • body reactionKey、clientKey、count

适用场景

  • 文章推荐按钮
  • 无登录记录读者轻量意图
curl
curl -X POST -H "content-type: application/json" -d '{"reactionKey":"clap","clientKey":"browser-session-1","count":1}' "https://www.cbgaccount.com/api/v1/blog/posts/1/reactions"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogEngagementRes>"
}
POST

提交评论

创建待审核评论。公开响应会隐藏邮箱、IP、User-Agent、垃圾判定原因和内部文章标题。

/api/v1/blog/posts/{id}/comments
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogPublicCommentRes>

入参

  • path id
  • body authorName、authorEmail、content,可选 parentId

适用场景

  • 文章回复表单
  • 带审核的读者讨论
curl
curl -X POST -H "content-type: application/json" -d '{"authorName":"Alex","authorEmail":"[email protected]","content":"这篇很有帮助。"}' "https://www.cbgaccount.com/api/v1/blog/posts/1/comments"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogPublicCommentRes>"
}
GET

获取分类

返回启用的公开分类,用于主栏目、分类页和文章保存前选择 categoryId。

/api/v1/blog/categories
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogCategoryRes[]>

入参

  • 无必填参数

适用场景

  • 构建分类导航
  • 保存文章前选择 categoryId
curl
curl "https://www.cbgaccount.com/api/v1/blog/categories"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogCategoryRes[]>"
}
POST

创建或更新分类

创建或更新带中英文名称和描述的分类。

/api/v1/blog/categories/save
鉴权
必须 Bearer Token
权限
blog:write(媒体上传)
返回
Result<BlogCategoryRes>

入参

  • body id、slug、nameZh、nameEn、descriptionZh、descriptionEn、sort、status

适用场景

  • 批量导入前准备分类
  • 让分类页有清晰可抓取描述
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -H "content-type: application/json" -d '{"nameZh":"增长业务剧本","nameEn":"Growth Playbooks","slug":"growth-playbooks","status":1}' "https://www.cbgaccount.com/api/v1/blog/categories/save"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogCategoryRes>"
}
GET

获取标签

返回启用标签,并支持按语言分组,让主题页和后台筛选保持一致。

/api/v1/blog/tags
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogTagRes[]>

入参

  • query language: en、zh 或 all

适用场景

  • 渲染主题页
  • 保存文章前选择 tagIds
curl
curl "https://www.cbgaccount.com/api/v1/blog/tags?language=zh"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogTagRes[]>"
}
POST

创建或更新标签

创建或更新按语言归组的标签。

/api/v1/blog/tags/save
鉴权
必须 Bearer Token
权限
blog:write
返回
Result<BlogTagRes>

入参

  • body id、slug、language、nameZh、nameEn、status

适用场景

  • 按语言组织主题
  • 增强相关文章和内链匹配
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -H "content-type: application/json" -d '{"language":"all","nameZh":"账号业务运营","nameEn":"Account Operations","slug":"account-operations","status":1}' "https://www.cbgaccount.com/api/v1/blog/tags/save"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogTagRes>"
}
POST

创建或更新作者

创建或更新结构化作者资料,用于作者页、Publication 卡片和 Person JSON-LD。author 文本只能兜底,authorId 的 SEO 输出更完整。

/api/v1/blog/authors/save
鉴权
必须 Bearer Token
权限
blog:write
返回
Result<BlogAuthorRes>

入参

  • body id、slug、language、name、title、bio、avatar、credentials、socialLinks、status、sort

适用场景

  • 保存文章前准备 authorId
  • 让外部导入内容也有一致的作者权威信息
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -H "content-type: application/json" -d '{"language":"zh","slug":"cbgaccount-editorial-team-zh","name":"CBGAccount 编辑部","title":"账号业务运营编辑团队","status":1}' "https://www.cbgaccount.com/api/v1/blog/authors/save"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogAuthorRes>"
}
GET

获取作者列表

返回启用作者资料,用于作者卡片、作者页和 Person JSON-LD。

/api/v1/blog/authors
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogAuthorRes[]>

入参

  • query language: en 或 zh

适用场景

  • 保存文章前选择 authorId
  • 渲染公开作者目录
curl
curl "https://www.cbgaccount.com/api/v1/blog/authors?language=zh"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogAuthorRes[]>"
}
GET

获取作者资料

公开作者资料,包含简介、资质、头像、社交链接和文章数量。

/api/v1/blog/authors/{slug}
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogAuthorRes>

入参

  • path slug
  • query language: 默认 en,中文传 zh

适用场景

  • SSR 作者页
  • 建立作者权威信号
curl
curl "https://www.cbgaccount.com/api/v1/blog/authors/cbgaccount-editorial-team-zh?language=zh"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogAuthorRes>"
}
GET

获取作者文章

分页返回某个启用作者关联的已发布文章。

/api/v1/blog/authors/{slug}/posts
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<PageBlogPostRes>

入参

  • path slug
  • query language、current、size

适用场景

  • 公开作者归档
  • 编辑团队资料页
curl
curl "https://www.cbgaccount.com/api/v1/blog/authors/cbgaccount-editorial-team-zh/posts?language=zh&current=1&size=10"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<PageBlogPostRes>"
}
GET

读取 Publication 展示设置

返回博客首页、文章页、作者卡片和 publication 卡片使用的公开标识。不会暴露后台 SEO、AI、Search Console 或媒体服务密钥。

/api/v1/blog/publication-settings
鉴权
匿名,可选 Bearer Token 记录审计日志
权限
blog:read 可选
返回
Result<BlogPublicationSettingsRes>

入参

  • 无必填参数

适用场景

  • 渲染 publication logo
  • 让公开品牌展示与后台设置保持一致
curl
curl "https://www.cbgaccount.com/api/v1/blog/publication-settings"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogPublicationSettingsRes>"
}
GET

获取业务资源分类

返回公开账号资源 / 业务资源分类,让外部发布系统能做出和后台编辑器一致的资源选择器。

/api/v1/blog/resources/categories
鉴权
必须 Bearer Token
权限
blog:read
返回
Result<BlogResourceCategoryRes[]>

入参

  • 无必填参数

适用场景

  • 插入资源卡片前筛选业务资源
  • 让正文里的资源卡片链接可抓取
curl
curl -H "Authorization: Bearer <API_TOKEN>" "https://www.cbgaccount.com/api/v1/blog/resources/categories"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<BlogResourceCategoryRes[]>"
}
POST

搜索业务资源

搜索启用中的公开账号资源 / 业务资源。用返回的 id、名称、描述、分类、价格生成可读资源卡片,并把 id 写入 relatedProductIds。商品描述可能包含主站富文本 HTML,选择器摘要应去除标签,插入正文卡片时必须转义文本。商品价格沿用主站存储单位:usdtPrice 展示时要除以 10000。可抓取公开资源链接规则为英文 /en/products/{id}-{slugified nameEn},中文 /cn/products/{id}-{slugified nameZh 或 product}。

/api/v1/blog/resources/search
鉴权
必须 Bearer Token
权限
blog:read
返回
Result<PageBlogResourceRes>

入参

  • body current 和 size
  • body keywords:可选
  • body categoryCode:可选
  • body status:默认 1 启用

适用场景

  • 外部资源卡片选择器
  • 保持 relatedProductIds 与正文 HTML 卡片一致
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -H "content-type: application/json" -d '{"current":1,"size":12,"keywords":"regional account","status":1}' "https://www.cbgaccount.com/api/v1/blog/resources/search"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "Result<PageBlogResourceRes>"
}
POST

上传媒体素材

给外部发布系统上传封面图、正文图、OG 图、作者头像或 Publication 图。CBGAccount 默认使用 CloudFlare-ImgBed,data 就是最终公网 HTTPS URL,不能再额外拼接 API baseUrl。

/api/v1/blog/media/upload
鉴权
必须 Bearer Token
权限
blog:write
返回
Result<string>

入参

  • multipart/form-data file
  • Authorization: Bearer blog:write Token
  • 推荐图片格式:webp、avif、jpg、png

适用场景

  • 生成 coverImage 和 ogImage URL
  • 向 contentHtml 插入 SEO 图片
  • 给 ImageObject 和 Open Graph 使用稳定媒体 URL
curl
curl -X POST -H "Authorization: Bearer <API_TOKEN>" -F "file=@./cover.webp" "https://www.cbgaccount.com/api/v1/blog/media/upload"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "https://media.cbgaccount.com/file/blog-assets/account-infrastructure-growth-workflows-zh.webp"
}
GET

RSS Feed

RSS 2.0 feed,用于订阅工具和阅读器。

/api/v1/blog/rss.xml
鉴权
匿名
权限
-
返回
application/xml

入参

  • query language: 默认 en,中文传 zh

适用场景

  • RSS 订阅
  • 外部阅读器
curl
curl "https://www.cbgaccount.com/api/v1/blog/rss.xml?language=zh"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "application/xml"
}
GET

Sitemap XML

给爬虫和集成系统使用的 sitemap 镜像。主公开地址仍是 /sitemap.xml。

/api/v1/blog/sitemap.xml
鉴权
匿名
权限
-
返回
application/xml

入参

  • 无必填参数

适用场景

  • 爬虫发现页面
  • Search Console 提交 sitemap
curl
curl "https://www.cbgaccount.com/api/v1/blog/sitemap.xml"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "application/xml"
}
GET

Robots.txt

robots 规则镜像。主公开地址仍是 /robots.txt。

/api/v1/blog/robots.txt
鉴权
匿名
权限
-
返回
text/plain

入参

  • 无必填参数

适用场景

  • 爬虫策略检查
  • SEO smoke test
curl
curl "https://www.cbgaccount.com/api/v1/blog/robots.txt"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "text/plain"
}
GET

OpenAPI JSON

机器可读 OpenAPI 3.0 规范,包含 schema、请求体、鉴权 scope 和响应结构。

/api/v1/blog/openapi.json
鉴权
匿名
权限
-
返回
application/json

入参

  • 无必填参数

适用场景

  • 导入 Postman、Apifox 或 Swagger UI
  • 生成 SDK 和契约测试
curl
curl "https://www.cbgaccount.com/api/v1/blog/openapi.json"
响应示例
{
  "code": "0000",
  "message": "success",
  "data": "application/json"
}

文章请求体

发布完整 SEO 文章需要的字段

idnumber

创建新草稿时留空;更新或发布已保存文章时传已有文章 ID。

是否必填
创建时否,更新时是
后台来源
隐藏文章记录
检查逻辑
用于判断创建、更新和发布目标。
languagestring

决定公开路径、语言标签、alternate 链接和本地化渲染。

是否必填
后台来源
基础信息
检查逻辑
必须是 en 或 zh,并与标签、路由、hreflang 和正文语言一致。
titlestring

文章可见标题和主 H1 来源,应使用读者能理解的话,而不是内部活动名。

是否必填
后台来源
基础信息
检查逻辑
检查 H1 一致性、搜索意图清晰度和合理长度。
summarystring

公开摘要和 meta description 的兜底来源,说明文章解决什么问题。

是否必填
后台来源
基础信息
检查逻辑
检查首屏摘要价值和 meta description 兜底质量。
slugstring

文章 URL 英文短名。发布后尽量保持稳定;检查接口可以生成草稿 slug。

是否必填
建议
后台来源
基础信息或自动生成
检查逻辑
检查唯一性、小写可读性和发布后改 URL 的重定向风险。
alternateSlugstring

翻译版本的 slug,用于中英文 alternate 互链。

是否必填
有双语版本时需要
后台来源
语言版本映射
检查逻辑
用于确认 hreflang 能指向另一语言版本。
contentHtmlHTML string

语义化正文。可包含图片、响应式图片、视频、表格、引用、代码、FAQ、内链和账号/资源卡片。

是否必填
后台来源
正文编辑器
检查逻辑
检查 H1/H2、正文厚度、标题跳级、图片 alt、视频、表格、FAQ 和内链。
coverImage / coverAltstring

主视觉 URL 和人话 alt。优先使用 /api/v1/blog/media/upload 返回的 URL;CloudFlare-ImgBed HTTPS URL 可以直接保存。

是否必填
强烈建议
后台来源
媒体模块
检查逻辑
coverAlt 会被检查,因为图片影响可访问性、ImageObject、Open Graph 和列表卡片。
categoryIdnumber

主分类,用于导航、归档分组和相关内容匹配。

是否必填
后台来源
基础信息
检查逻辑
必填,确保每篇文章进入可抓取分类页。
tagIdsnumber[]

主题标签,用于公开主题页、推荐和内链发现。

是否必填
建议
后台来源
基础信息
检查逻辑
检查语言化主题一致性和相关文章匹配。
authorId / authornumber / string

尽量绑定 authorId;author 文本只作为展示兜底。

是否必填
建议
后台来源
作者选择器
检查逻辑
优先使用结构化作者资料,以生成 Person JSON-LD 和作者页。
seoTitle / seoDescriptionstring

搜索结果标题和描述。为空时 /posts/check 会生成草稿,之后应显式保存。

是否必填
建议
后台来源
SEO 设置或自动建议
检查逻辑
检查长度、重复、搜索结果可读性和标题/摘要错位。
canonicalUrlstring

当文章应把权重合并到另一个正式 URL 时使用。

是否必填
可选
后台来源
高级 SEO
检查逻辑
检查 URL 合法性和生产域名不一致风险。留空表示自引用 canonical。
robots / indexablestring / boolean

收录控制。正常发布文章应保持 indexable=true,robots=index,follow。

是否必填
可选
后台来源
高级 SEO
检查逻辑
公开可发布内容如果误设 noindex 或 nofollow 会提示。
ogTitle / ogDescription / ogImagestring

Open Graph 元数据,用于社媒分享和外部预览。

是否必填
建议
后台来源
社媒预览
检查逻辑
检查分享卡片不要回退到弱标题或缺失图片。
answerSummary / keyTakeawaysstring / string[]

短答案和要点,用于文章摘要、结构化内容和读者快速浏览。

是否必填
建议
后台来源
SEO 助手
检查逻辑
检查答案摘要和 AEO 可用性。
faqBlocksArray<{ question, answer }>

FAQ 块会展示在正文中,并在合格时生成 FAQPage JSON-LD。

是否必填
文章回答具体问题时建议
后台来源
FAQ 模块
检查逻辑
问题和答案完整时才输出 FAQ schema。
relatedProductIds逗号分隔字符串

从资源搜索 API 选择真实资源 id 后写入,例如 "12,18"。

是否必填
可选
后台来源
资源/账号选择器
检查逻辑
作为上下文内链检查,不要求每篇文章都有。
reviewedAtdatetime string

专家或编辑最后审核时间。

是否必填
可选
后台来源
发布确认
检查逻辑
用于常青内容的新鲜度和编辑审核信号。
statusnumber

0 草稿,1 发布,2 下架。

是否必填
后台来源
发布状态
检查逻辑
status=1 需要 blog:publish 且通过 SEO 检查。

示例

完整可发布 API 流程

完整保存请求

带 status=0 调用 POST /api/v1/blog/posts/save,创建一个已经包含后台编辑器全部 SEO 字段的草稿。

{
  "language": "zh",
  "title": "账号基础设施如何支持增长团队",
  "summary": "说明团队如何用可运营账号支撑市场启动、区域访问、社媒运营和客服支持流程。",
  "slug": "account-infrastructure-growth-workflows-zh",
  "alternateSlug": "account-infrastructure-growth-workflows",
  "contentHtml": "<h1>账号基础设施如何支持增长团队</h1><p>第一段直接说明业务问题和适用场景。</p><h2>先验证区域访问</h2><p>补充具体流程、证据和站内链接。</p><figure><img src=\"https://media.cbgaccount.com/file/blog-assets/account-infrastructure-growth-workflows-zh.webp\" alt=\"用于市场启动和区域访问的账号基础设施流程图\" width=\"1200\" height=\"675\" /></figure><h2>常见问题</h2>",
  "coverImage": "https://media.cbgaccount.com/file/blog-assets/account-infrastructure-growth-workflows-zh.webp",
  "coverAlt": "用于市场启动和区域访问的账号基础设施流程图",
  "categoryId": 1,
  "tagIds": [
    1,
    2
  ],
  "authorId": 1,
  "seoTitle": "账号基础设施如何支持增长团队 | CBGAccount",
  "seoDescription": "了解账号基础设施如何支持市场启动、区域访问、社媒运营和更稳定的客服支持流程。",
  "canonicalUrl": "",
  "robots": "index,follow",
  "indexable": true,
  "ogTitle": "账号基础设施如何支持增长团队",
  "ogDescription": "给市场、区域、创作者和客服账号工作流使用的实操指南。",
  "ogImage": "https://media.cbgaccount.com/file/blog-assets/account-infrastructure-growth-workflows-zh.webp",
  "answerSummary": "账号基础设施帮助团队在扩张账号业务前先验证访问、归属、支持路径和流程证据。",
  "keyTakeaways": [
    "上线前先梳理归属和恢复路径",
    "让内链和证据在正文中可见",
    "运营规则变化后及时复审高价值文章"
  ],
  "faqBlocks": [
    {
      "question": "团队什么时候应该准备账号基础设施?",
      "answer": "当团队要启动新市场、创作者流程、客服队列或依赖可重复账号访问的业务流程前,就应该先准备。"
    }
  ],
  "relatedProductIds": "12,18",
  "reviewedAt": "2026-05-25 12:00:00",
  "status": 0
}
SEO 检查响应

POST /api/v1/blog/posts/check 不保存数据。用返回建议补全 slug、meta、摘要、OG 和目录后再保存。

{
  "code": "0000",
  "message": "success",
  "data": {
    "score": 92,
    "aeoScore": 88,
    "canPublish": true,
    "scoreSummary": "确认 canonical 和最终图片 alt 后即可发布。",
    "generatedSlug": "account-infrastructure-growth-workflows-zh",
    "generatedSeoTitle": "账号基础设施如何支持增长团队 | CBGAccount",
    "generatedSeoDescription": "了解账号基础设施如何支持市场启动、区域访问、创作者运营和客服流程。",
    "generatedOgTitle": "账号基础设施如何支持增长团队",
    "generatedExcerpt": "给账号业务增长团队使用的实操运营指南。",
    "toc": [
      {
        "id": "先验证区域访问",
        "title": "先验证区域访问",
        "level": 2
      },
      {
        "id": "常见问题",
        "title": "常见问题",
        "level": 2
      }
    ],
    "items": [
      {
        "key": "title-length",
        "passed": true,
        "severity": "info",
        "message": "SEO 标题长度合适。"
      },
      {
        "key": "internal-links",
        "passed": true,
        "severity": "info",
        "message": "正文包含站内链接。"
      }
    ]
  }
}
发布响应

POST /api/v1/blog/posts/{id}/publish 会重新运行 SEO 检查,只有阻塞项通过才会正式发布。

{
  "code": "0000",
  "message": "success",
  "data": {
    "id": 42,
    "slug": "account-infrastructure-growth-workflows-zh",
    "title": "账号基础设施如何支持增长团队",
    "status": 1,
    "publishedAt": "2026-05-25 12:30:00",
    "canonicalUrl": "https://www.cbgaccount.com/zh/blog/account-infrastructure-growth-workflows-zh",
    "robots": "index,follow",
    "seoScore": 92,
    "sitemapUpdated": true,
    "rssUpdated": true,
    "webhookQueued": true
  }
}
错误响应

code 不是 0000 时不要继续发布。把 message 和 failedItems 展示给运营人员,让他们修文章。

{
  "code": "BLOG_SEO_BLOCKED",
  "message": "草稿无法发布,因为存在阻塞级 SEO 检查项。",
  "data": {
    "canPublish": false,
    "failedItems": [
      "missing-cover-alt",
      "thin-content",
      "duplicate-slug"
    ]
  }
}

自动化

Webhook 事件、签名、重试和调试方式

Webhook 事件模型

Webhook 接收端在后台配置。公开文档说明契约,密钥、投递日志和失败重试仍保留在后台登录区。

  • blog.post.published
  • blog.post.unpublished
  • blog.post.deleted
  • blog.*

签名和重试策略

X-CBG-Event: blog.post.published
X-CBG-Signature: t=1710000000,v1=hex(hmac_sha256(secret, t + "." + rawBody))

接收方需要校验时间戳、原始 body 和 HMAC。失败投递按 5、10、15 分钟递增间隔重试,最多 5 次。

POST/api/admin/blog/webhooks/save后台专用配置接口。外部开发者只需要向 CBGAccount 管理员提供接收 URL 和 secret,不需要登录后台。
GET/api/admin/blog/webhooks/events后台专用投递日志,用于查看状态、响应内容、重试次数和失败原因。
导入 OpenAPI

把 /api/v1/blog/openapi.json 导入 Postman、Apifox、Swagger UI 或 SDK 生成器。自动化测试应以 OpenAPI schema 为准。

在线调试位置

公开页不会执行 Token 写入接口。需要在线调试时,登录后台进入“博客 API 文档与 Token 管理”。

真实上线公开地址

站点发布时,需要把 /blog/api 和 /zh/blog/api 暴露在公网,让合作方无需登录后台也能阅读文档。