接口总览
| 能力 | 方法 | 路径 | 调用方 |
|---|---|---|---|
| 同步内容批次 | POST | /content/sync | 插件或客户站点服务端 |
通用请求头
| Header | 必填 | 说明 |
|---|---|---|
Authorization: Bearer <site_token> | 是 | 站点服务端 token |
Content-Type: application/json | 是 | 请求体格式 |
Idempotency-Key | 建议 | 同一页同步重试时保持一致,长度 8-160 |
POST /content/sync
一次最多提交 200 条内容。大站点建议分页同步,每页使用稳定的Idempotency-Key。
Body 参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
items | array | 是 | 内容数组,最多 200 条 |
items[].externalId | string | 是 | 客户站点侧稳定内容 ID |
items[].type | string | 是 | page、post、product、category、tag、custom |
items[].locale | string | 否 | 内容语种,例如 zh-CN、en-US |
items[].path | string | 是 | 站内路径,用于 SEO/GEO overlay 匹配 |
items[].url | string | 否 | 完整访问 URL |
items[].title | string | 是 | 标题 |
items[].excerpt | string | 否 | 摘要 |
items[].content | string | 是 | 可检索正文,建议传清洗后的纯文本或正文 HTML |
items[].status | string | 否 | published、draft、private、archived |
items[].raw | object | 否 | 源站扩展数据,例如分类、标签、更新时间 |
snapshot.complete | boolean | 否 | 本轮全量快照是否完成 |
snapshot.seen | array | 否 | 本轮快照扫描到的内容 ID 列表 |
请求示例
成功响应
响应字段
| 字段 | 说明 |
|---|---|
synced | 新增或更新的内容数量 |
archived | 标记归档的内容数量 |
reconciled.retargeted | 被重新关联的内容数量 |
reconciled.rejectedStale | 被判定为旧数据并拒绝的数量 |
lastSyncedAt | 本次同步完成时间 |
全量快照与增量同步
如果连接器执行全量同步,可以使用snapshot 声明本轮扫描状态:
| 场景 | snapshot.complete | 说明 |
|---|---|---|
| 中间分页 | false | 继续等待后续分页 |
| 最后一页 | true | GrowthOS 可根据 seen 清理缺失的原站内容 |
| 增量同步 | 不传 | 只更新本次提交的内容 |
snapshot.seen 中的条目应包含稳定的 externalId 和可选 locale。不要把手动创建、后台草稿或私密内容作为公开同步内容提交。
常见错误
| HTTP | 错误码 | 说明 | 处理建议 |
|---|---|---|---|
400 | INVALID_REQUEST | 内容为空、超过 200 条或字段缺失 | 修正请求体后重试 |
401 | INVALID_TOKEN | token 无效 | 重新检查站点 token |
402 | INSUFFICIENT_QUOTA | 当前规则启用扣费且余额不足 | 提醒客户补充额度 |
409 | IDEMPOTENCY_CONFLICT | 同一个幂等键被不同请求体复用 | 使用新的幂等键 |
429 | RATE_LIMITED | 请求过快 | 按 Retry-After 退避重试 |
实现要点
- 同一源内容要长期保持同一个
externalId。 path要规范化,避免/a和/a/被当成两条内容。- 大站点必须分页同步,建议每页 50-200 条。
- 内容同步应传公开可检索内容,不要同步后台草稿、私密页面或敏感字段。
- 多语言内容建议每个语种单独一条,使用同一
externalId加不同locale,或使用客户站点自己的多语言 ID。