Page loaded
开发者文档/内容审核 API

把页面质量审核接入你的工作流

Convertos 内容审核 API 接收纯文本、HTML 或公开 URL,异步运行 page-quality-review 的完整审核流程,并返回可编程处理的评分、门禁、证据和 findings。

认证

Bearer API Key

输入

Text · HTML · URL

交付

202 + 状态查询

文档目录

Overview

先了解这套 API 做什么

这是一套面向外部开发者的异步完整页面质量审核接口。text、html 和公开 URL 都执行同一套 page-quality-review.full.v1 规则;公开 URL 还会补充桌面端、移动端、浏览器交互和可见加载证据。服务不会登录目标页面,也不会转发你的 Cookie 或登录态。

选择来源

按 sourceType 明确告诉 API 你提交的是 text、html 还是 url。

异步处理

创建任务后立即返回 202 和 job ID,不阻塞你的请求。

读取结果

轮询状态接口,完成后读取 verdict、score、dimensions 和 findings。

认证

文档公开可见;只有创建和管理 API Key 的控制台需要登录。登录后在个人中心创建 Key,Secret 只会显示一次。

不要把 API Key 放进浏览器端代码、Git 仓库或日志。服务端调用时使用 Authorization: Bearer。
curl https://convertos.ai/api/v1/reviews/page-quality/REVIEW_ID \
  -H "Authorization: Bearer cvt_live_YOUR_KEY"

去个人中心创建或管理 API Key →

三步发出第一个请求

  1. 01

    登录并创建一个 API Key。

  2. 02

    提交 text、html 或公开 url,所有请求统一执行完整审核。

  3. 03

    保存 job ID,轮询 statusUrl 直到 completed 或 failed。

curl -X POST https://convertos.ai/api/v1/reviews/page-quality \
  -H "Authorization: Bearer cvt_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: review-001" \
  -d '{
    "sourceType": "url",
    "url": "https://example.com/article",
    "language": "en",
    "mode": "standard",
    "pageType": "blog_article",
    "targetJob": "Answer the searcher’s question and give them a next action."
  }'
{
  "ok": true,
  "job": {
    "id": "8c1b...",
    "status": "queued",
    "creditCost": 20,
    "statusUrl": "/api/v1/reviews/page-quality/8c1b..."
  }
}

创建审核任务

POST/api/v1/reviews/page-quality

提交成功返回 202。任务会进入队列,积分在任务被接受时扣除;如果队列或审核失败,会自动退回本次积分。

FieldType说明
sourceTypetext | html | url必填。决定 API 从哪个字段读取来源。
contentstringtext 或 html 必填;最大 2 MiB。
urlstringurl 必填;必须是公开的绝对 http(s) URL。
languageen | zh可选,默认 en。
modestandard可选但只有 standard 被支持;省略时也会执行完整审核。quick 已移除,传入 quick 会返回 INVALID_MODE。
pageType / targetJobstring建议填写,用于 contracts、搜索意图、商业角色和发布门槛判断。
competitiveBaselineobject可选。提供竞品难度、优势和证据;不提供时会使用 Unknown/Medium 的暂估门槛并降低 confidence。

请求头 Idempotency-Key 可选但推荐使用:网络重试时复用同一个 Key,不会重复创建任务或重复扣费。

输入类型与分析边界

类型积分传什么会检查什么
text4纯文本内容AI 判断内容意图、准确性、证据、原创性、行动价值和 E-E-A-T;规则只负责输入和安全底线。
html10HTML 源码AI 审核页面内容和 E-E-A-T;同时检查 title、description、H1、canonical、链接、图片 alt、Schema 等技术事实。
url20公开网页 URLAI 审核实际页面内容、事实、证据和 E-E-A-T,并补桌面/移动渲染、布局、性能、链接和控制台证据。

会检查

内容意图、标题结构、SEO 元数据(HTML)、证据与信任信号、内部泄漏信号,以及基于同一证据的 AI 分析。

边界

不会访问登录态内容;text 和 html 没有可渲染 URL,因此布局和浏览器证据标记为不适用;没有提供竞品证据时不会虚构竞品结论。

批量审核

POST/api/v1/reviews/page-quality/batch

batch 需要提交 3 到 5 个相关页面。每个页面都执行同一套完整审核,再执行跨页面结构相似度检查。批量结果可能因为页面重复而 Fail,即使单页分数都不错。

curl -X POST https://convertos.ai/api/v1/reviews/page-quality/batch \
  -H "Authorization: Bearer cvt_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: batch-001" \
  -d '{
    "mode": "batch",
    "language": "en",
    "pages": [
      {"label":"Page A","sourceType":"url","url":"https://example.com/a","mode":"standard","pageType":"programmatic"},
      {"label":"Page B","sourceType":"url","url":"https://example.com/b","mode":"standard","pageType":"programmatic"},
      {"label":"Page C","sourceType":"url","url":"https://example.com/c","mode":"standard","pageType":"programmatic"}
    ]
  }'

查询审核状态

GET/api/v1/reviews/page-quality/:id

使用创建任务返回的 job.id 或 statusUrl 查询。只有创建该任务的同一个 API Key 能读取它。

Status含义客户端动作
queued已接受,等待执行。按退避策略继续轮询。
running正在执行静态审核和 AI 分析。继续轮询。
completed结果已写入 result。读取并保存结果。
failed任务失败,带 error.code 和 message。记录错误;本次任务积分会退回。
curl https://convertos.ai/api/v1/reviews/page-quality/REVIEW_ID \
  -H "Authorization: Bearer cvt_live_YOUR_KEY"

审核结果

completed 任务的 result 对象包含 preflight、contracts、competitiveBaseline、七个维度、gates、caps、threshold、evidence、findings 和 aiAnalysis。固定规则负责技术事实和安全底线;AI 根据实际页面内容判断意图、准确性、证据、原创性和 E-E-A-T,并参与最终 verdict。

{
  "version": "page-quality-review.v1",
  "reviewProtocol": "page-quality-review.full.v1",
  "verdict": "iterate",
  "score": 74,
  "confidence": "medium",
  "mode": "standard",
  "sourceType": "html",
  "summary": "...",
  "gates": [{"name":"rendered_experience","outcome":"pass","reason":"..."}],
  "caps": {"applied": [], "finalScoreCap": null},
  "threshold": {"scoreRequired": 85, "minCoreDimension": 75, "coreDimensionsMeetMinimum": true},
  "aiAnalysis": {
    "provider": "agentsflare",
    "scope": "content_quality",
    "status": "completed",
    "verdict": "iterate",
    "score": 78,
    "summary": "...",
    "findings": [{
      "code": "AI_CONTENT_NEXT_STEP",
      "message": "The opening explains the topic but does not make the next action explicit.",
      "recommendation": "Add one concrete next step after the opening answer.",
      "evidence": "The opening section states the topic but contains no action instruction."
    }],
    "eeat": {
      "experience": {"score": 72, "status": "partial", "note": "Some practical examples are present, but first-hand experience is not established.", "evidence": "The page gives examples but does not identify a first-hand source."},
      "expertise": {"score": 80, "status": "partial", "note": "The topic is explained with relevant detail.", "evidence": "The page explains the criteria and tradeoffs."},
      "authoritativeness": {"score": 65, "status": "not_evidenced", "note": "No accountable authority is supplied.", "evidence": "No author organization or external citation is visible."},
      "trustworthiness": {"score": 74, "status": "partial", "note": "Claims are mostly bounded but proof is limited.", "evidence": "The page contains claims without nearby attributable sources."}
    }
  },
  "dimensions": {
    "contentIntent": { "score": 82, "status": "inspected", "notes": [] },
    "seoIndexability": { "score": 68, "status": "inspected", "notes": [] },
    "geoExtractability": { "score": 76, "status": "inspected", "notes": [] }
  },
  "metrics": {
    "wordCount": 820,
    "headingCount": 9,
    "h1Count": 1,
    "hasTitle": true,
    "hasDescription": true
  },
  "findings": [
    {
      "severity": "warning",
      "code": "IMAGE_ALT",
      "message": "...",
      "recommendation": "..."
    }
  ]
}

每条 finding 都有 severity、code、message 和 recommendation,适合直接映射到你自己的 issue、工单或发布门禁。

积分与计费

按输入类型计费,不按结果长度计费;所有输入都执行完整审核。任务被 API 接受时扣除;队列不可用或审核失败时自动退回。

输入每次消耗适合场景
text4 credits完整审核纯文本内容。
html10 credits完整审核 HTML 源码和内容。
url20 credits抓取并完整审核一个公开页面。
batch5 + pages基础 5 积分,加上每个页面的完整审核费用。

限制与并发

这些限制用于保护共享队列和积分账户。页面和接口都应该明确处理 429、402、413 等状态。

项目当前值说明
每个账户的激活 Key20个人中心可创建、禁用和删除。
每个 Key 的执行并发2超过后应在客户端排队;这是服务端实际同时执行的上限。
每个 Key 每分钟接受量60重复幂等请求不会重复创建任务。
文本/HTML 内容大小2 MiB按 UTF-8 字节数计算。
URL 长度2048 chars只接受公开 http(s),不接受内嵌账号密码。

部署提示:完整 URL 审核需要生产环境配置 PAGE_REVIEW_BROWSER_WS_URL 或 BROWSERLESS_URL。未配置远程浏览器时不会伪造渲染结果,也不会返回 500;结果会明确标记浏览器证据未完成并保持 iterate。

错误与重试

错误统一返回 JSON:ok=false、error.code、error.message,部分错误还会带 details。只有网络超时或 5xx 适合自动重试;参数错误和认证错误不要盲目重试。

CodeHTTP处理建议
INVALID_API_KEY401检查 Bearer Key 是否正确、激活且未泄露。
INVALID_MODE400只支持完整 standard 审核;省略 mode 也会执行完整审核。
INVALID_SOURCE_TYPE400只允许 text、html、url。
CONTENT_REQUIRED / URL_REQUIRED400按 sourceType 补齐 content 或 url。
INVALID_URL / INPUT_TOO_LARGE400 / 413修正绝对 URL 或缩小内容。
INSUFFICIENT_CREDITS402购买或补充积分后再提交。
RATE_LIMITED429等待当前窗口结束,并降低发送速率。
IDEMPOTENCY_CONFLICT409同一个幂等 Key 不要用于不同请求。
DATABASE_UNAVAILABLE / QUEUE_UNAVAILABLE503等待 retryAfterSeconds 后退避重试;本次不会扣积分。
REVIEW_FAILED500使用退避策略重试查询;已接受但失败的任务会退回积分。
{
  "ok": false,
  "error": {
    "code": "RATE_LIMITED",
    "message": "This API key has reached 60 accepted reviews per minute.",
    "details": { "retryAfterSeconds": 60 }
  }
}

准备好接入了吗?

先阅读接口和限制,再登录个人中心创建 Key。公开文档不需要登录,Key 管理才需要。

创建 API Key →