{"openapi":"3.0.0","paths":{"/v1/text/checks":{"post":{"description":"提交一段文案做合规检测，**立即返回 id**，检测在后台异步进行。\n拿到 id 后轮询 `GET /v1/text/checks/{id}`，直到 `status` 变成 `completed` 或 `failed`（通常 3–15 秒）。\n\n支持三条产品线：`creator`（短视频）、`duanju`（短剧）、`touliu`（投放），由 `productVertical` 指定。\n提交即扣积分；入队失败会自动全额退回。","operationId":"create","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTextCheckDto"}}}},"responses":{"201":{"description":"已受理，返回检测 id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponseDto"}}}},"402":{"description":"积分不足，响应体带 requiredCredits / currentBalance"},"403":{"description":"该产品线未开通（短剧/投放试用次数已用尽）"}},"security":[{"ApiKey":[]}],"summary":"提交文案检测","tags":["文案检测"]},"get":{"description":"按创建时间倒序分页返回，仅含概览字段。","operationId":"list","parameters":[{"name":"page","required":false,"in":"query","description":"页码，从 1 开始。","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"每页条数，上限 50。","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"productVertical","required":false,"in":"query","description":"按产品线过滤。不传 = 全部。","schema":{"enum":["creator","duanju","touliu"],"type":"string"}},{"name":"platform","required":false,"in":"query","description":"按平台过滤。","schema":{"enum":["douyin","kuaishou","xiaohongshu","shipinhao","bilibili","hongguo"],"type":"string"}},{"name":"keyword","required":false,"in":"query","description":"按文案内容关键词搜索。","schema":{"maxLength":100,"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"分页结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextCheckListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"文案检测历史","tags":["文案检测"]}},"/v1/text/checks/{id}":{"get":{"description":"`status` 为 `processing` 时表示还在检测中，稍后重试；`completed` 时 `risks` 才是最终结果。\n\n风险分两层，**互不混淆**：\n- `risks` — 合规风险。`tier=STRICT`（必须修改）会计入 `riskLevel`；`tier=SOFT`（影响推流）能发但会降曝光。\n- `customRisks` — 你自己配的违禁词命中，**不计入** `riskLevel`，配了替换词会给 `replacement`。","operationId":"getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"检测详情","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextCheckResponseDto"}}}},"404":{"description":"记录不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"取文案检测结果","tags":["文案检测"]},"delete":{"description":"软删除，不可恢复。","operationId":"remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"已删除","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"删除文案检测记录","tags":["文案检测"]}},"/v1/text/checks/{id}/fix":{"post":{"description":"对已完成的检测触发 AI 改写，**立即返回**，修复在后台进行。\n轮询 `GET /v1/text/checks/{id}`，修复结果出现在 `fixes` 数组里（按 version 递增）。\n\n两种策略：`rewrite` 整篇重写（默认），`precise` 逐条精准替换（改动最小）。\n会额外扣除修复积分。","operationId":"fix","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTextFixDto"}}}},"responses":{"201":{"description":"已受理，修复在后台进行","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextFixAcceptedDto"}}}},"400":{"description":"该记录无需修复（无风险项）或尚未检测完成"},"402":{"description":"积分不足"}},"security":[{"ApiKey":[]}],"summary":"触发 AI 修复","tags":["文案检测"]}},"/v1/video/checks":{"post":{"description":"提交一个公网可访问的视频地址做合规检测，**立即返回 id**，检测在后台异步进行。\n轮询 `GET /v1/video/checks/{id}`，直到 `status` 变成 `completed` 或 `failed`。\n视频检测耗时约为**视频时长的一半**（最少 30 秒），建议每 5–10 秒轮询一次。\n\n检测覆盖三个维度：画面（`frames`）、音频（`audios`）、口播文案（`transcriptRisks`，ASR 转写后走与文案检测同一套引擎）。\n\n**计费**：按视频时长 1 积分/秒，提交即扣。三条产品线均支持。\n`videoSize` 提交时即校验是否与真实文件相符；`videoDuration` 在检测完成后按引擎实际抽帧位置对账，\n申报明显偏短会自动补扣差额 —— 请如实申报。","operationId":"create","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoCheckDto"}}}},"responses":{"201":{"description":"已受理，返回检测 id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponseDto"}}}},"402":{"description":"积分不足"},"403":{"description":"该产品线未开通"}},"security":[{"ApiKey":[]}],"summary":"提交视频检测（标准模式）","tags":["视频检测"]},"get":{"description":"按创建时间倒序分页返回，仅含概览字段。","operationId":"list","parameters":[{"name":"page","required":false,"in":"query","description":"页码，从 1 开始。","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"每页条数，上限 50。","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"productVertical","required":false,"in":"query","description":"按产品线过滤。不传 = 全部。","schema":{"enum":["creator","duanju","touliu"],"type":"string"}},{"name":"status","required":false,"in":"query","description":"按状态过滤。","schema":{"enum":["processing","completed","failed"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"分页结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCheckListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"视频检测历史","tags":["视频检测"]}},"/v1/video/checks/{id}":{"get":{"description":"每次调用会顺带向检测引擎推进一次轮询，所以**直接轮询这个接口即可**，不需要额外的状态接口。\n\n`status=completed` 后各字段含义：\n- `frames` — 画面命中，带秒级时间点与截图地址\n- `audios` — 音频命中，带起止秒\n- `transcript` — 口播全文转写（`status` 可能晚于视频审核完成）\n- `transcriptRisks` — 口播话术违规，与画面/音频同等计入结论\n- `customTranscriptRisks` — 自定义词库在口播里的命中，不计入 `riskLevel`","operationId":"getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"检测详情","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCheckResponseDto"}}}},"404":{"description":"记录不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"取视频检测结果","tags":["视频检测"]},"delete":{"description":"软删除，并异步清理已上传的视频文件。","operationId":"remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"已删除","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"删除视频检测记录","tags":["视频检测"]}},"/v1/video/checks/{id}/report/latest":{"get":{"description":"返回该检测最近一份**已完成**的报告；从没生成过则 `data` 为 `null`（不是 404）。\n生成中途断开连接后用它取回结果 —— 报告在服务端会继续写完。","operationId":"latestReport","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"最近一份已完成的报告；从没生成过时 `data` 为 `null`。","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCheckReportDto"}}}},"404":{"description":"检测记录不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"取最近一份检测报告","tags":["视频检测"]}},"/v1/video/checks/{id}/report":{"get":{"description":"基于已完成的检测结果，用大模型撰写一份可交付的合规报告：按档位逐条列风险\n（含时间点与画面 / 语音原文），并给出可直接替换的合规改写示例。\n\n**这是 SSE 端点**，`Content-Type: text/event-stream`，事件按以下顺序到达：\n- `report_start` — `{ reportId }`，已受理开始生成\n- `report_chunk` — `{ chunk }`，正文增量，按到达顺序拼接\n- `report_done` — `{ reportId, content }`，完整正文（以此为准，不要用拼接结果做落库）\n- `complete` — `{ durationMs }`，流结束标记，收到它之后不会再有事件\n- `error` — `{ message }`，生成期出错，积分已退回；此时不会有 `report_done` / `complete`\n\n未知事件请忽略而不是报错 —— 后续版本可能新增事件类型。\n\n校验与扣费都发生在响应头之前，所以 400 / 402 / 404 是普通 HTTP 错误而非 SSE 事件。\n**客户端断开后服务端会继续把报告写完**，回来用 `GET {id}/report/latest` 取。\n\n**计费**：固定 10 积分/份（以 pricing 配置为准），生成失败自动退回。","operationId":"generateReport","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"SSE 事件流","content":{"text/event-stream":{"schema":{"type":"string"},"example":"event: report_start\ndata: {\"reportId\":\"cm5rpt7x0001abcd\"}\n\nevent: report_chunk\ndata: {\"chunk\":\"【检测结论】本次检测共发现\"}\n\nevent: report_done\ndata: {\"reportId\":\"cm5rpt7x0001abcd\",\"content\":\"【检测结论】…\"}\n\nevent: complete\ndata: {\"durationMs\":41230}\n\n"}}},"400":{"description":"检测未完成，或已有报告正在生成"},"402":{"description":"积分不足"},"404":{"description":"检测记录不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"生成检测报告（SSE 流式）","tags":["视频检测"]}},"/v1/image/checks":{"post":{"description":"提交一个公网可访问的图片地址做合规检测。\n\n图片检测是**同步完成**的：这个接口返回时结果已经就绪，响应体就是完整的检测结果，\n不需要再轮询。（保留 `GET /v1/image/checks/{id}` 供事后回查。）\n\n**务必检查 `status`**：正常是 `completed`；检测引擎异常时会是 `failed`（此时积分已自动退回，\n`labels` 为空），这种情况仍然返回 201 而不是 5xx —— 记录本身创建成功了。\n\n**仅支持 `creator` 与 `touliu` 两条产品线**，短剧（duanju）没有图片检测。\n**计费**：2 积分/张。","operationId":"create","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateImageCheckDto"}}}},"responses":{"201":{"description":"检测完成，直接返回完整结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageCheckResponseDto"}}}},"400":{"description":"参数不合法，或传了 productVertical=duanju（短剧无图片检测）"},"402":{"description":"积分不足"}},"security":[{"ApiKey":[]}],"summary":"提交图片检测","tags":["图片检测"]},"get":{"description":"按创建时间倒序分页返回，仅含概览字段。","operationId":"list","parameters":[{"name":"page","required":false,"in":"query","description":"页码，从 1 开始。","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"每页条数，上限 50。","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"productVertical","required":false,"in":"query","description":"按产品线过滤。不传 = 全部。","schema":{"enum":["creator","duanju","touliu"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"分页结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageCheckListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"图片检测历史","tags":["图片检测"]}},"/v1/image/checks/{id}":{"get":{"description":"回查已提交的图片检测。`labels` 逐条带 `tier`：STRICT=必须修改，SOFT=影响推流。","operationId":"getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"检测详情","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageCheckResponseDto"}}}},"404":{"description":"记录不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"取图片检测结果","tags":["图片检测"]},"delete":{"description":"软删除，并异步清理已上传的图片文件。","operationId":"remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"已删除","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"删除图片检测记录","tags":["图片检测"]}},"/v1/custom-rules":{"get":{"description":"返回当前租户配置的所有词，按创建时间倒序。词库规模不大，不分页。","operationId":"list","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"规则列表","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"列出全部自定义违禁词","tags":["自定义违禁词"]},"post":{"operationId":"create","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1CreateCustomRuleDto"}}}},"responses":{"201":{"description":"创建成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleResponseDto"}}}},"400":{"description":"该词已存在，或已达套餐词库上限"},"403":{"description":"自定义违禁词是付费功能，当前订阅不可用"}},"security":[{"ApiKey":[]}],"summary":"新增一条自定义违禁词","tags":["自定义违禁词"]}},"/v1/custom-rules/quota":{"get":{"description":"返回已用条数与套餐上限。批量导入前建议先查一次，避免超额部分被拒。","operationId":"quota","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"配额信息","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleQuotaDto"}}}}},"security":[{"ApiKey":[]}],"summary":"查词库配额","tags":["自定义违禁词"]}},"/v1/custom-rules/settings":{"get":{"description":"关闭时所有自定义词都不参与检测（数据保留）。","operationId":"getSettings","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"开关状态","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleSettingsDto"}}}}},"security":[{"ApiKey":[]}],"summary":"查总开关状态","tags":["自定义违禁词"]},"patch":{"description":"一键停用/启用全部自定义词。与每条规则自身的 `enabled` 正交：总开关关掉时，逐条的 enabled 不生效。","operationId":"setSettings","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ToggleSettingsDto"}}}},"responses":{"200":{"description":"更新后的开关状态","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleSettingsDto"}}}}},"security":[{"ApiKey":[]}],"summary":"切换总开关","tags":["自定义违禁词"]}},"/v1/custom-rules/bulk-import":{"post":{"description":"单次最多 2000 条。**幂等友好**：批内重复与库中已存在的词会被跳过而不是报错，\n响应里分别给出 `imported` / `skippedDuplicate` / `rejectedQuota` 三个计数。\n超出套餐配额的部分会被拒收（`rejectedQuota`），已接受的部分照常写入。","operationId":"bulkImport","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BulkImportDto"}}}},"responses":{"201":{"description":"导入结果统计","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleImportResultDto"}}}}},"security":[{"ApiKey":[]}],"summary":"批量导入违禁词","tags":["自定义违禁词"]}},"/v1/custom-rules/{id}":{"patch":{"description":"只更新传了的字段。**规则库（library）创建后不可改** —— 要换库请删除后重建。","operationId":"update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdateCustomRuleDto"}}}},"responses":{"200":{"description":"更新后的规则","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomRuleResponseDto"}}}},"404":{"description":"规则不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"修改自定义违禁词","tags":["自定义违禁词"]},"delete":{"description":"物理删除，不可恢复。","operationId":"remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"已删除","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedResponseDto"}}}},"404":{"description":"规则不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"删除自定义违禁词","tags":["自定义违禁词"]}},"/v1/batches":{"post":{"description":"一次提交多条文案 + 多张图片 + 多个视频，统一跑检测并聚合结论。\n文案 ≤10 条、图片 ≤20 张、视频 ≤10 个，且总项数有上限。\n\n**立即返回 id**，各子项在后台并行检测。轮询 `GET /v1/batches/{id}` 看进度：\n`progress.done / progress.total` 是完成度，全部完成后 `result` 给出整包结论（PASS / REJECT）。\n每个子项都带 `checkId`，可以拿去调对应的单项检测接口取完整明细。\n\n**计费**：按各子项单价分别计费（文案按条、图片按张、视频按秒）。余额不足会在提交时整单拒绝，不会留半成品。","operationId":"create","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBatchDto"}}}},"responses":{"201":{"description":"已受理，返回素材包 id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponseDto"}}}},"400":{"description":"素材包为空，或超出单次项数上限"},"402":{"description":"积分不足以覆盖整包成本"},"403":{"description":"素材包批量是企业版专属能力"}},"security":[{"ApiKey":[]}],"summary":"提交素材包批量检测","tags":["素材包批量检测"]},"get":{"description":"按创建时间倒序分页返回，含各包的进度与结论。","operationId":"list","parameters":[{"name":"page","required":false,"in":"query","description":"页码，从 1 开始。","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"每页条数，上限 50。","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"productVertical","required":false,"in":"query","description":"按产品线过滤。不传 = 全部。","schema":{"enum":["creator","duanju","touliu"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"分页结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"素材包列表","tags":["素材包批量检测"]}},"/v1/batches/{id}":{"get":{"description":"每次调用会顺带推进一次子项状态刷新，直接轮询这个接口即可。`items[].checkId` 可用于取单项完整明细。","operationId":"getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"素材包详情","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponseDto"}}}},"404":{"description":"素材包不存在或不属于当前租户"}},"security":[{"ApiKey":[]}],"summary":"取素材包进度与结果","tags":["素材包批量检测"]},"delete":{"description":"软删除素材包及其全部子项检测记录，并异步清理已上传的图片/视频文件。","operationId":"remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"已删除","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"删除素材包","tags":["素材包批量检测"]}},"/v1/account":{"get":{"description":"返回积分余额、订阅方案和本月各类检测的调用次数。\n\n接入前建议先调一次确认额度 —— 否则只能靠 402 撞墙才知道余额不够。\n`credits.total` 是可用总额（订阅赠送 + 活动赠送 + 加油包），\n`credits.expiringSoon` 是 7 天内即将过期的部分。","operationId":"getAccount","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"账户信息","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"查账户余额与用量","tags":["账户"]}},"/v1/uploads/policy":{"post":{"description":"**只有在你没有公网可访问的素材存储时才需要这个接口。**\n如果素材已经在你自己的 OSS / COS / CDN 上，直接把 URL 填进检测接口即可，跳过这一步。\n\n返回一份阿里云 OSS POST Policy 直传凭证，用标准表单直传：\n\n```bash\ncurl -X POST \"$host\" \\\n  -F \"key=$dir<你的文件名>\" \\\n  -F \"policy=$policy\" \\\n  -F \"OSSAccessKeyId=$accessKeyId\" \\\n  -F \"signature=$signature\" \\\n  -F \"file=@./demo.mp4\"\n```\n\n上传成功后，素材地址为 `{cdnHost}/{key}`，把它填进检测接口的 `videoUrl` / `imageUrl`。\n**凭证 5 分钟过期**，且只允许写入你租户专属的目录前缀。","operationId":"createPolicy","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadPolicyDto"}}}},"responses":{"201":{"description":"直传凭证","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPolicyResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"获取素材直传凭证","tags":["素材上传"]}},"/v1/qualifications/notice":{"post":{"description":"按「产品线 / 平台 / 声明行业 / 文案」派生要展示给用户的准入资质提醒，**同步返回**。\n\n两类命中，可信度不同：\n- **声明行业**（`industry`）命中 —— 高可信，直接返回；`matchedBy=vertical`\n- **文案关键词**（`text`）命中 —— 会再过一次语义确认剔除误报（如「无需问诊」不算医疗）；`matchedBy=keyword`\n\n典型接法：提交检测的**同时**并行调用本接口（派生只依赖你传的这几个字段，不依赖检测结果），\n检测结果就绪时提醒已经拿到手，用户侧看不到二次等待。\n\n**不扣积分、不影响检测结论。** 无命中时 `hits` 为空数组，此时不要渲染任何提醒。","operationId":"notice","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1QualificationNoticeDto"}}}},"responses":{"201":{"description":"派生结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationNoticeResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"取准入资质提醒","tags":["准入资质提醒"]}},"/v1/qualifications/dismissals":{"get":{"description":"返回当前隔离域收起过的 `dismissKey` 列表。notice 返回的 `dismissed` 已经叠加过这份状态，通常不必单独调。","operationId":"listDismissals","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"dismissKey 列表","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationDismissalsResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"已收起的提醒","tags":["准入资质提醒"]},"post":{"description":"记下「这条资质我已具备，不用再提示」。幂等，重复调用不报错。\n\n只对 `dismissable=true` 的条目有意义 —— `prohibited`（禁止准入）没有资质路径，收起也不会生效。","operationId":"dismiss","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1QualificationDismissDto"}}}},"responses":{"201":{"description":"已收起","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationDismissResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"收起提醒（我已具备）","tags":["准入资质提醒"]},"delete":{"description":"撤销一次「我已具备」，之后这条提醒会重新出现。","operationId":"undismiss","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"你自己系统里的终端租户号。带上它，该租户的自定义违禁词与检测历史会被隔离在独立的域中；积分与订阅仍算在 API Key 所属账户头上。首次出现自动创建，取值限 1–64 位的字母、数字、_ . : -。","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"已取消收起","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationDismissResponseDto"}}}},"400":{"description":"缺少 key 参数"}},"security":[{"ApiKey":[]}],"summary":"取消收起","tags":["准入资质提醒"]}}},"info":{"title":"ByeRisk 开放 API","description":"ByeRisk 内容合规检测 API —— 把**短视频 / 短剧 / 投放**三条产品线的文案、视频、图片合规检测能力，\n以及自定义违禁词库、视频检测报告、准入资质提醒，开放给你的系统和 AI agent 调用。\n与网页版共用同一套检测引擎和积分账户。\n\n## 快速开始\n\n1. 在 [控制台 → 开放 API](https://www.byerisk.com/open-api) 创建一把 Key（形如 `brsk_live_…`，**只显示一次**）\n2. 每个请求带上 `Authorization: Bearer brsk_live_…`\n3. 提交检测拿到 `id`，轮询结果直到 `status` 变成 `completed`\n\n```bash\n# 1) 提交文案检测\ncurl -X POST https://www.byerisk.com/api/v1/text/checks \\\n  -H \"Authorization: Bearer $BYERISK_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"text\": \"这款面膜是全网最好的，七天美白见效，无效退款！\",\n    \"platform\": \"douyin\",\n    \"industryVertical\": \"beauty\"\n  }'\n# → { \"success\": true, \"data\": { \"id\": \"cm5abc…\", \"status\": \"processing\" } }\n\n# 2) 轮询结果\ncurl https://www.byerisk.com/api/v1/text/checks/cm5abc… \\\n  -H \"Authorization: Bearer $BYERISK_API_KEY\"\n```\n\n## 响应格式\n\n所有接口统一包封：成功 `{ \"success\": true, \"data\": … }`，失败 `{ \"success\": false, \"error\": \"…\" }`。\n下文各接口列出的 schema 指的是 `data` 的内容。\n\n## 如果你自己也是多租户系统\n\n如果你是把 ByeRisk 转卖 / 集成给你自己的多个客户用，加一个 `X-End-Tenant` 头，\n把你系统里的租户号带上，我们会为它单独开一个隔离域：\n\n```bash\ncurl -X POST https://www.byerisk.com/api/v1/text/checks \\\n  -H \"Authorization: Bearer $BYERISK_API_KEY\" \\\n  -H \"X-End-Tenant: tenant-4271\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"text\": \"…\" }'\n```\n\n- **隔离的是数据**：自定义违禁词库、词库总开关、检测历史、素材上传目录，各租户各一份，互不可见。\n  A 租户配的词不会命中 B 租户的检测。\n- **不隔离的是账户**：积分、订阅档位都算在你（Key 所属账户）头上，你不需要给每个终端租户充值。\n- 第一次出现的租户号会自动建好，**不需要预先注册**。取值限 1–64 位的字母、数字、`_`、`.`、`:`、`-`。\n- **请传稳定的租户标识**，不要传每次请求都变的值（如请求 id）—— 那会瞬间耗尽单把 Key 的隔离域上限（5 万个）。\n- 不传这个头 = 全部数据都在你自己这一个域里，行为与不使用该能力时完全一致。\n\n限流仍然按 **API Key** 计（不按终端租户），需要更高并发就多签几把 Key。\n`GET /v1/account` 返回的余额与订阅是你账户的，用量则是当前 `X-End-Tenant` 这个域的。\n\n## 三条产品线\n\n用 `productVertical` 参数切换，决定命中哪套规则集与自定义词库：\n\n| 值 | 场景 | 文案 | 视频 | 图片 |\n|---|---|---|---|---|\n| `creator` | 短视频创作（默认） | ✅ | ✅ | ✅ |\n| `duanju` | 短剧 | ✅ | ✅ | ❌ 无此能力 |\n| `touliu` | 投放素材 | ✅ | ✅ | ✅ |\n\n## 风险结论与分档\n\n每次检测有一个顶层结论 `riskLevel`，三个取值：\n\n- **`PASS`** —— 通过，没有需要处理的风险\n- **`REVIEW`** —— 建议修改，有影响推流的项\n- **`REJECT`** —— 必须修改，有硬性违规项\n\n每条风险再带一个 `tier`，只有两档，语义固定：\n\n- **`STRICT`（必须修改）** —— 违反法规或平台硬性规则，不改会被处罚或封禁\n- **`SOFT`（影响推流）** —— 能发布，但会被推荐系统降权，建议修改。投放场景下称「跑量风险」\n\n自定义违禁词的命中**单独放在 `customRisks` 里**，不计入 `riskLevel` —— 它是你自己的偏好，\n不是合规判定。配了替换词的会带 `replacement`，可直接做精确替换。\n\n## 异步与轮询\n\n文案、视频、素材包检测都是**异步**的：提交返回 `id`，轮询 `GET` 取结果。\n图片检测是同步的，提交时直接返回完整结果。\n\n轮询建议间隔：文案 2 秒、视频 5–10 秒。视频检测耗时约为视频时长的一半（最少 30 秒）。\nGET 接口本身会顺带推进检测状态，所以不需要额外的状态查询接口。\n\n## 视频检测报告（SSE）\n\n检测完成后，可以在检测结果之上再生成一份**可交付的合规报告**：按档位逐条列风险\n（含时间点、画面 / 语音原文），并给出可直接替换的合规改写示例。适合直接转给客户或内容团队。\n\n```\nGET /v1/video/checks/{id}/report          生成报告（SSE 流式，每次调用都会重新生成并扣费）\nGET /v1/video/checks/{id}/report/latest   取最近一份已完成的报告（普通 JSON）\n```\n\n生成端点是整套 API 里**唯一的流式接口**，`Content-Type: text/event-stream`，事件按序到达：\n\n| 事件 | 数据 | 含义 |\n|---|---|---|\n| `report_start` | `{ reportId }` | 已受理，开始生成 |\n| `report_chunk` | `{ chunk }` | 正文增量，按到达顺序拼接 |\n| `report_done` | `{ reportId, content }` | 完整正文，**落库以它为准**，别用拼接结果 |\n| `complete` | `{ durationMs }` | 流结束，之后不会再有事件 |\n| `error` | `{ message }` | 生成期出错，积分已退回（此时没有 `report_done` / `complete`） |\n\n未知事件请忽略而不是报错 —— 后续版本可能新增事件类型。\n\n几个接入要点：\n\n- **错误不走 SSE。** 校验与扣费都在响应头之前完成，所以 `400`（检测未完成 / 已有报告在生成中）、\n  `402`（积分不足）、`404` 都是普通 HTTP 错误，按状态码分支处理即可，不用去流里找。\n- **断开不中止生成。** 客户端断连后服务端会把报告写完，回来用 `/report/latest` 取。\n  长时间任务不必守着连接，也不要因为超时重试而重复扣费。\n- **`/report/latest` 从没生成过时返回 `data: null`**（不是 404）。检测记录本身不存在或不属于你，\n  才是 `404`。\n- 生成端点走**提交类**限流（60 次/分钟），与提交检测共用同一档计数。\n\n## 准入资质提醒\n\n`POST /v1/qualifications/notice` 回答的是「做这个行业的内容，平台和法规要求什么资质」——\n**不是检测能力**：不扣积分、不改变任何检测结论，无命中时返回空数组。\n典型接法是提交检测的同时并行调它（派生只依赖你传的参数，不依赖检测结果），\n检测结果就绪时提醒已经拿到手。\n\n⚠️ **它的 `industry` 与检测接口的 `industryVertical` 是两个不同的参数，取值不通用。**\n这是最容易踩的一个坑：直接把检测用的值传过来，医美、药品、法律、招商这些最需要提醒的行业永远不会命中。\n\n- `industryVertical`（检测接口）—— 规则桶，7 个值：\n  `general` / `beauty` / `ecommerce` / `finance` / `health` / `food` / `slimming`\n- `industry`（本接口）—— 更细的行业声明，能命中规则的有 13 个值：\n  `beauty` / `finance` / `health` / `medical-beauty`（医美） / `drug-health`（药品·保健食品） /\n  `legal` / `franchise`（招商加盟） / `occult`（玄学命理） / `education` / `recruit` /\n  `realestate` / `auto` / `alcohol`。另收 `general` / `other`（通用，不出提醒）与\n  `ecommerce` / `slimming`（合法但暂无资质规则）。**传枚举之外的值返回 400**，不会静默无命中。\n\n建议在你自己的系统里持有**细行业**这一个值，调检测时按下表折算成规则桶，调本接口时传原值：\n\n| 你持有的 `industry` | 调检测时传的 `industryVertical` |\n|---|---|\n| `medical-beauty` / `health` | `health` |\n| `drug-health` | `food`；**投放（`touliu`）用 `health`** |\n| `beauty` / `finance` / `ecommerce` / `slimming` | 同名 |\n| `general` / `other` / `legal` / `franchise` / `occult` / `education` / `recruit` / `realestate` / `auto` / `alcohol` | `general` |\n\n（唯一按产品线分叉的是 `drug-health`：投放侧的药品·保健食品走医疗广告那套规则，创作侧走保健食品那套。）\n\n另有 `text` 参数（可选）：用文案关键词补齐没有行业选项的长尾，命中会再过一次语义确认剔除误报。\n视频 / 图片没有文案，只传 `industry` 即可。\n\n「我已具备」的收起状态按 `X-End-Tenant` 的隔离域存 —— 资质属于经营主体，同一租户收起一次即对全员生效。\n\n## 计费\n\n与网页版共用同一个租户积分池，价格一致：\n\n| 动作 | 消耗 |\n|---|---|\n| 文案检测 | 按套餐单价，每次 |\n| AI 修复 | 按套餐单价，每次 |\n| 视频检测（标准模式） | 1 积分 / 秒 |\n| 图片检测 | 2 积分 / 张 |\n| 视频检测报告 | 10 积分 / 份 |\n| 自定义违禁词管理 | 免费 |\n| 准入资质提醒 | 免费 |\n\n余额不足返回 `402`，响应体带 `requiredCredits` 与 `currentBalance`。\n接入前可以先调 `GET /v1/account` 查余额。\n\n**关于视频的申报参数**：`videoSize` 在提交时即校验是否与真实文件相符，不符直接拒绝；\n`videoDuration` 在检测完成后按引擎实际抽帧的时间点对账，申报明显短于实际时长的会自动补扣差额。\n如实申报即可，正常的几秒误差不会触发补扣。\n\n## 限流\n\n按 API Key 计算，**每档独立计数**：提交类（POST 检测 / 批量）60 次/分钟，查询类（GET）600 次/分钟，\n配置类（自定义违禁词管理、准入资质提醒）120 次/分钟。资质提醒走配置类，与检测各算各的，\n不会挤占你的检测额度。超限返回 `429` 并带 `Retry-After` 头，每个响应都有 `X-RateLimit-Remaining`。\n\n## 错误码\n\n| 码 | 含义 |\n|---|---|\n| 400 | 参数不合法，或该产品线不支持此能力（如短剧传图片） |\n| 401 | API Key 无效、已吊销或已过期 |\n| 402 | 积分不足 |\n| 403 | 该产品线未开通，或功能需要更高订阅档 |\n| 404 | 记录不存在或不属于你的账户 |\n| 429 | 触发限流 |\n| 500 | 服务端错误，可重试 |","version":"1.0.0","contact":{}},"tags":[],"servers":[{"url":"https://www.byerisk.com/api","description":"生产环境"}],"components":{"securitySchemes":{"ApiKey":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"在控制台创建的 API Key，形如 brsk_live_…"}},"schemas":{"CreateTextCheckDto":{"type":"object","properties":{"text":{"type":"string","description":"待检测文案。10–5000 字。","example":"这款面膜是全网最好的，七天美白见效，无效退款！","minLength":10,"maxLength":5000},"platform":{"type":"string","description":"发布平台。决定命中哪套平台规则。短剧场景通常用 hongguo（红果）。","enum":["douyin","kuaishou","xiaohongshu","shipinhao","bilibili","hongguo"],"example":"douyin"},"industryVertical":{"type":"string","description":"行业垂类。与产品线正交，决定行业专项规则（如医美、金融、保健食品）。","enum":["general","beauty","ecommerce","finance","health","food","slimming"],"example":"beauty"},"productVertical":{"type":"string","description":"产品线：creator=短视频创作合规（默认）、duanju=短剧、touliu=投放素材。决定命中哪套规则集与自定义词库。","enum":["creator","duanju","touliu"],"default":"creator"},"sceneMode":{"type":"string","description":"内容场景：content=纯内容创作（默认）、ad=广告投放。声明 ad 后，场景类提示（kind=scene-hint）不再计为违规。","enum":["content","ad"],"default":"content"},"autoFix":{"type":"boolean","description":"是否在检测完成后自动触发 AI 修复。开启会**额外扣除修复积分**；结果在 fixes 数组里返回。","default":false}},"required":["text","platform","industryVertical"]},"AcceptedResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"本次检测的 id，用于轮询结果。","example":"cms8xhc5x0006sp59vrks7zkf"},"object":{"type":"string","description":"对象类型。","example":"text_check"},"status":{"type":"string","description":"当前状态。刚提交时为 processing。","example":"processing"}},"required":["id","object","status"]},"TextCheckListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。"},"object":{"type":"string","description":"对象类型。","example":"text_check"},"status":{"type":"string","description":"检测状态。","example":"completed"},"platform":{"type":"string","description":"发布平台。","example":"douyin"},"industryVertical":{"type":"string","description":"行业垂类。","nullable":true},"preview":{"type":"string","description":"原文预览（上游已截断至 100 字）。"},"riskLevel":{"type":"string","description":"顶层结论。","enum":["PASS","REVIEW","REJECT"],"nullable":true},"riskCount":{"type":"number","description":"原始风险条数（未按可见档位过滤）。","example":7},"fixStatus":{"type":"string","description":"修复任务状态。","nullable":true},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true}},"required":["id","object","status","platform","preview","riskCount"]},"TextCheckListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型，恒为 list。","example":"list"},"page":{"type":"number","description":"当前页码。","example":1},"pageSize":{"type":"number","description":"每页条数。","example":20},"total":{"type":"number","description":"符合条件的总条数。","example":514},"hasMore":{"type":"boolean","description":"是否还有下一页。","example":true},"data":{"description":"本页数据。","type":"array","items":{"$ref":"#/components/schemas/TextCheckListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"SummaryDto":{"type":"object","properties":{"strict":{"type":"number","description":"必须修改（STRICT）的风险条数。","example":3},"soft":{"type":"number","description":"影响推流（SOFT）的风险条数。","example":1},"custom":{"type":"number","description":"自定义词库命中条数。不计入 riskLevel。","example":0},"semantic":{"type":"number","description":"语义风险复核标签数（定位不到具体位置的整体提示）。","example":2}},"required":["strict","soft"]},"TextRiskDto":{"type":"object","properties":{"id":{"type":"string","description":"风险条目 id。","example":"cms8xhlfa0000sp3ore4cx6oo","nullable":true},"tier":{"type":"string","description":"STRICT=必须修改（违法或违反平台硬性规则）；SOFT=影响推流（能发但会降权）。","enum":["STRICT","SOFT"],"example":"STRICT"},"tierLabel":{"type":"string","description":"tier 的中文标签。投放场景下 SOFT 显示为「跑量风险」。","example":"必须修改"},"tierReason":{"type":"string","description":"判定为该档位的依据。内部调试用的兜底原因不会出现在这里。","example":"《广告法》第9条｜广告法:夸大性广告","nullable":true},"kind":{"type":"string","description":"violation=法规级违规；scene-hint=场景限制（提交时声明 sceneMode=ad 后不再计为违规）。","enum":["violation","scene-hint"],"example":"violation"},"matchedText":{"type":"string","description":"命中的原文片段。","example":"最好的"},"startIndex":{"type":"number","description":"命中片段在原文中的起始下标（含）。","example":7,"nullable":true},"endIndex":{"type":"number","description":"命中片段在原文中的结束下标（不含）。","example":10,"nullable":true},"category":{"type":"string","description":"风险类别。","example":"prohibited","nullable":true},"severity":{"type":"string","description":"严重度。","enum":["high","medium","low"],"nullable":true},"suggestion":{"type":"string","description":"修改建议。","example":"绝对化/违规广告用语，违反《广告法》第9条，请删除或替换为非绝对化表述","nullable":true},"legalRef":{"type":"string","description":"法条依据。规则命中的项通常有值，模型判定的项可能为空。","example":"《广告法》第9条","nullable":true},"source":{"type":"string","description":"rule=确定性规则命中；model=模型语义判定。","enum":["rule","model"],"example":"rule"}},"required":["tier","tierLabel","kind","matchedText","source"]},"CustomRiskDto":{"type":"object","properties":{"matchedText":{"type":"string","description":"命中的原文片段。","example":"竞品品牌名"},"startIndex":{"type":"number","description":"起始下标（含）。","example":5,"nullable":true},"endIndex":{"type":"number","description":"结束下标（不含）。","example":10,"nullable":true},"replacement":{"type":"string","description":"你为这个词配置的替换词。有值时可直接做精确替换；为空表示仅提醒。","example":"友商","nullable":true},"note":{"type":"string","description":"你给这条规则写的备注。","example":"竞品名，不得提及","nullable":true}},"required":["matchedText"]},"TextFixDto":{"type":"object","properties":{"version":{"type":"number","description":"修复版本号，从 1 递增。","example":1},"strategy":{"type":"string","description":"rewrite=整篇重写；precise=逐条精准替换。","enum":["rewrite","precise"],"example":"rewrite"},"fixedText":{"type":"string","description":"修复后的文案。","example":"这款面膜质地清爽，日常保湿体验舒适。"},"riskCount":{"type":"number","description":"修复后复检剩余的风险条数。","example":0},"accepted":{"type":"boolean","description":"是否已被采纳。","example":false},"createdAt":{"type":"string","description":"生成时间（ISO 8601）。","nullable":true}},"required":["version","strategy","fixedText","riskCount","accepted"]},"TextCheckResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。","example":"cms8xhc5x0006sp59vrks7zkf"},"object":{"type":"string","description":"对象类型。","example":"text_check"},"status":{"type":"string","description":"检测状态。completed 之后 risks 才是最终结果。","enum":["processing","completed","failed","cancelled"],"example":"completed"},"productVertical":{"type":"string","description":"产品线。","enum":["creator","duanju","touliu"],"example":"creator"},"platform":{"type":"string","description":"发布平台。","example":"douyin"},"industryVertical":{"type":"string","description":"行业垂类。","example":"beauty","nullable":true},"sceneMode":{"type":"string","description":"内容场景。","enum":["content","ad"],"example":"content"},"text":{"type":"string","description":"送检的原文。","example":"这款面膜是全网最好的，七天美白见效！"},"riskLevel":{"type":"string","description":"顶层结论：PASS 通过 / REVIEW 建议修改 / REJECT 必须修改。自定义词命中不影响它。","enum":["PASS","REVIEW","REJECT"],"example":"REJECT","nullable":true},"summary":{"description":"各档位计数。","allOf":[{"$ref":"#/components/schemas/SummaryDto"}]},"risks":{"description":"合规风险明细。","type":"array","items":{"$ref":"#/components/schemas/TextRiskDto"}},"customRisks":{"description":"自定义词库命中，与合规风险物理分开，不计入 riskLevel。","type":"array","items":{"$ref":"#/components/schemas/CustomRiskDto"}},"semanticLabels":{"description":"语义风险复核标签：模型判定有风险但定位不到具体片段的整体提示。","example":["夸大性广告","特殊化妆品广告"],"type":"array","items":{"type":"string"}},"autoFix":{"type":"boolean","description":"提交时是否要求自动修复。","example":false},"fixStatus":{"type":"string","description":"修复任务状态。processing=修复进行中，null=无进行中的修复。","example":null,"nullable":true},"fixes":{"description":"AI 修复结果，按版本递增。未触发修复时为空数组。","type":"array","items":{"$ref":"#/components/schemas/TextFixDto"}},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true},"updatedAt":{"type":"string","description":"最后更新时间（ISO 8601）。","nullable":true}},"required":["id","object","status","productVertical","platform","sceneMode","text","summary","risks","customRisks","semanticLabels","autoFix","fixes"]},"CreateTextFixDto":{"type":"object","properties":{"strategy":{"type":"string","description":"修复策略：rewrite=整篇重写（默认，读起来更自然）、precise=逐条精准替换（改动最小，保留原文结构）。","enum":["rewrite","precise"],"default":"rewrite"},"mode":{"type":"string","description":"改写语气：content=内容创作（默认）、ad=广告投放（更克制，规避广告法风险）。","enum":["content","ad"],"default":"content"}}},"TextFixAcceptedDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。"},"object":{"type":"string","description":"对象类型。","example":"text_check"},"fixStatus":{"type":"string","description":"修复任务状态。","example":"processing"}},"required":["id","object","fixStatus"]},"DeletedResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"被删除记录的 id。"},"object":{"type":"string","description":"对象类型。","example":"text_check"},"deleted":{"type":"boolean","description":"恒为 true。","example":true}},"required":["id","object","deleted"]},"CreateVideoCheckDto":{"type":"object","properties":{"videoUrl":{"type":"string","description":"视频地址。必须是**公网可访问**的直链（http/https）。没有公网存储的话，先调 POST /v1/uploads/policy 拿直传凭证。","example":"https://your-cdn.com/videos/demo.mp4"},"videoTitle":{"type":"string","description":"视频标题，用于在检测历史里识别。","example":"618 主推款口播 A"},"videoDuration":{"type":"number","description":"视频时长（秒）。**计费依据**：标准模式按 1 积分/秒。\n\n必须与实际时长一致：检测完成后会用引擎实际抽帧的时间点做对账，\n申报明显短于实际时长的，差额部分会在检测完成时自动补扣。","example":45,"minimum":1},"videoSize":{"type":"number","description":"视频大小（MB），上限 1024（1GB）。提交时会校验该值与实际文件是否相符，不符则拒绝。","example":12.3,"minimum":0.01,"maximum":1024},"videoWidth":{"type":"number","description":"视频宽度（像素）。"},"videoHeight":{"type":"number","description":"视频高度（像素）。"},"productVertical":{"type":"string","description":"产品线。短剧默认平台为 hongguo（红果）。","enum":["creator","duanju","touliu"],"default":"creator"},"platform":{"type":"string","description":"发布平台。主要作用于**口播 ASR 文案**的规则集范围（画面/语音审核与平台无关）。不传则按产品线取默认值。","enum":["douyin","kuaishou","xiaohongshu","shipinhao","bilibili","hongguo"]},"frameTypes":{"type":"array","description":"画面检测维度。不传 = 全部开启。","default":["OCR","BEHAVIOR","AD","POLITICS","VIOLENCE","PORN","LOGO","PERSON"],"items":{"type":"string","enum":["OCR","BEHAVIOR","AD","POLITICS","VIOLENCE","PORN","LOGO","PERSON"]}},"audioTypes":{"type":"array","description":"音频检测维度。不传 = 全部开启。","default":["POLITICAL","PORN","AD","MOAN","ABUSE"],"items":{"type":"string","enum":["POLITICAL","PORN","AD","MOAN","ABUSE"]}},"textCheckId":{"type":"string","description":"关联的过审文案检测 id（来自 POST /v1/text/checks）。带上后会做**口播漂移检测** —— 比对实际口播与过审脚本的偏离片段。","example":"cm5abc123xyz"}},"required":["videoUrl","videoTitle","videoDuration","videoSize"]},"VideoMetaDto":{"type":"object","properties":{"url":{"type":"string","description":"视频地址。","example":"https://your-cdn.com/ep01.mp4"},"title":{"type":"string","description":"视频标题。","example":"短剧第 1 集"},"durationSeconds":{"type":"number","description":"时长（秒）。","example":180,"nullable":true},"sizeMb":{"type":"number","description":"大小（MB）。","example":45.2,"nullable":true},"width":{"type":"number","description":"宽度（像素）。","nullable":true},"height":{"type":"number","description":"高度（像素）。","nullable":true},"purged":{"type":"boolean","description":"超过保留期的视频文件已被清理，此时 url 不再可播放。","example":false}},"required":["url","title","purged"]},"VideoCheckListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。"},"object":{"type":"string","description":"对象类型。","example":"video_check"},"status":{"type":"string","description":"检测状态。"},"productVertical":{"type":"string","description":"产品线。"},"platform":{"type":"string","description":"发布平台。","nullable":true},"video":{"description":"视频元信息（列表版不含 purged）。","allOf":[{"$ref":"#/components/schemas/VideoMetaDto"}]},"riskLevel":{"type":"string","description":"顶层结论。","nullable":true},"labels":{"description":"顶层风险标签。","example":["广告","OCR文字"],"type":"array","items":{"type":"string"}},"transcriptStatus":{"type":"string","description":"口播转写状态。","nullable":true},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true}},"required":["id","object","status","productVertical","video","labels"]},"VideoCheckListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型，恒为 list。","example":"list"},"page":{"type":"number","description":"当前页码。","example":1},"pageSize":{"type":"number","description":"每页条数。","example":20},"total":{"type":"number","description":"符合条件的总条数。","example":514},"hasMore":{"type":"boolean","description":"是否还有下一页。","example":true},"data":{"description":"本页数据。","type":"array","items":{"$ref":"#/components/schemas/VideoCheckListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"VideoFrameDto":{"type":"object","properties":{"timeSeconds":{"type":"number","description":"命中画面在视频中的时间点（秒）。","example":12},"tier":{"type":"string","description":"风险档位。","enum":["STRICT","SOFT"],"example":"STRICT"},"tierLabel":{"type":"string","description":"tier 的中文标签。","example":"必须修改"},"tierReason":{"type":"string","description":"判定依据。","nullable":true},"description":{"type":"string","description":"风险描述。","example":"含医疗功效宣称"},"imageUrl":{"type":"string","description":"该帧的截图地址。","nullable":true},"ocrText":{"type":"string","description":"该帧画面中识别出的文字（OCR）。","nullable":true}},"required":["timeSeconds","tier","tierLabel","description"]},"VideoAudioDto":{"type":"object","properties":{"startSeconds":{"type":"number","description":"命中音频片段起始秒。","example":8},"endSeconds":{"type":"number","description":"命中音频片段结束秒。","example":11},"tier":{"type":"string","description":"风险档位。","enum":["STRICT","SOFT"]},"tierLabel":{"type":"string","description":"tier 的中文标签。"},"tierReason":{"type":"string","description":"判定依据。","nullable":true},"description":{"type":"string","description":"风险描述。"},"text":{"type":"string","description":"该片段的语音文字。","nullable":true}},"required":["startSeconds","endSeconds","tier","tierLabel","description"]},"VideoTranscriptDto":{"type":"object","properties":{"status":{"type":"string","description":"口播转写状态。null=未启用，empty=无音轨或静音。","enum":["processing","completed","failed","empty"],"nullable":true},"text":{"type":"string","description":"口播全文转写结果。","nullable":true}}},"VideoTranscriptRiskDto":{"type":"object","properties":{"tier":{"type":"string","description":"风险档位。","enum":["STRICT","SOFT"]},"tierLabel":{"type":"string","description":"tier 的中文标签。"},"tierReason":{"type":"string","description":"判定依据。","nullable":true},"matchedText":{"type":"string","description":"命中的口播原文片段。","example":"全网最低价"},"startSeconds":{"type":"number","description":"命中所在句的起始秒，可用于跳转播放。","example":8},"endSeconds":{"type":"number","description":"命中所在句的结束秒。","example":11},"sentence":{"type":"string","description":"命中所在的完整句子，给上下文。","nullable":true},"category":{"type":"string","description":"风险类别。","nullable":true},"severity":{"type":"string","description":"严重度。","nullable":true},"suggestion":{"type":"string","description":"修改建议。","nullable":true},"replacement":{"type":"string","description":"合规替代说法。为空表示只能删除。","nullable":true},"legalRef":{"type":"string","description":"法条依据。","nullable":true},"source":{"type":"string","description":"rule=规则命中；model=模型判定。","enum":["rule","model"]},"origin":{"type":"string","description":"命中归属。'drift' 表示该命中落在偏离过审脚本的即兴片段里；null 为口播全文命中。","example":null,"nullable":true}},"required":["tier","tierLabel","matchedText","startSeconds","endSeconds","source"]},"VideoCustomTranscriptRiskDto":{"type":"object","properties":{"matchedText":{"type":"string","description":"命中的口播片段。"},"startSeconds":{"type":"number","description":"起始秒。"},"endSeconds":{"type":"number","description":"结束秒。"},"sentence":{"type":"string","description":"命中所在句。","nullable":true},"replacement":{"type":"string","description":"你配置的替换词。","nullable":true},"note":{"type":"string","description":"你写的备注。","nullable":true}},"required":["matchedText","startSeconds","endSeconds"]},"VideoCheckResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。"},"object":{"type":"string","description":"对象类型。","example":"video_check"},"status":{"type":"string","description":"检测状态。processing 时请继续轮询本接口。","enum":["processing","completed","failed"],"example":"processing"},"productVertical":{"type":"string","description":"产品线。","enum":["creator","duanju","touliu"]},"platform":{"type":"string","description":"发布平台。","nullable":true},"video":{"description":"视频元信息。","allOf":[{"$ref":"#/components/schemas/VideoMetaDto"}]},"riskLevel":{"type":"string","description":"顶层结论。","enum":["PASS","REVIEW","REJECT"],"nullable":true},"summary":{"description":"各档位计数。","allOf":[{"$ref":"#/components/schemas/SummaryDto"}]},"frames":{"description":"画面风险明细。","type":"array","items":{"$ref":"#/components/schemas/VideoFrameDto"}},"audios":{"description":"音频风险明细。","type":"array","items":{"$ref":"#/components/schemas/VideoAudioDto"}},"transcript":{"description":"口播转写。可能晚于视频审核完成。","allOf":[{"$ref":"#/components/schemas/VideoTranscriptDto"}]},"transcriptRisks":{"description":"口播话术风险，与画面/音频同等计入顶层结论。","type":"array","items":{"$ref":"#/components/schemas/VideoTranscriptRiskDto"}},"customTranscriptRisks":{"description":"自定义词库在口播里的命中，不计入 riskLevel。","type":"array","items":{"$ref":"#/components/schemas/VideoCustomTranscriptRiskDto"}},"linkedTextCheckId":{"type":"string","description":"提交时关联的过审文案检测 id。","nullable":true},"driftStatus":{"type":"string","description":"口播漂移检测状态（关联了文案检测才有）。","enum":["pending","processing","completed","failed","skipped"],"nullable":true},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true},"updatedAt":{"type":"string","description":"最后更新时间（ISO 8601）。","nullable":true}},"required":["id","object","status","productVertical","video","summary","frames","audios","transcript","transcriptRisks","customTranscriptRisks"]},"VideoCheckReportDto":{"type":"object","properties":{"id":{"type":"string","description":"报告 id。","example":"cm5rpt7x0001abcd"},"object":{"type":"string","description":"对象类型，恒为 video_check_report。","example":"video_check_report"},"videoCheckId":{"type":"string","description":"所属视频检测的 id。","example":"cm5abc7x0001abcd"},"content":{"type":"string","description":"报告正文（纯文本，用【】分节）。","nullable":true,"example":"【检测结论】本次检测共发现 3 项必须修改、1 项影响推流的风险……"},"creditCost":{"type":"number","description":"本份报告消耗的积分。","example":10},"createdAt":{"type":"string","description":"生成时间（ISO 8601）。","nullable":true}},"required":["id","object","videoCheckId","creditCost"]},"CreateImageCheckDto":{"type":"object","properties":{"imageUrl":{"type":"string","description":"图片地址。必须是**公网可访问**的直链。没有公网存储的话，先调 POST /v1/uploads/policy。","example":"https://your-cdn.com/images/banner.jpg"},"imageTitle":{"type":"string","description":"图片标题，用于在检测历史里识别。","example":"618 主图 v2"},"imageSize":{"type":"number","description":"图片大小（字节），上限 10MB。","example":204800,"minimum":1},"imageWidth":{"type":"number","description":"图片宽度（像素）。"},"imageHeight":{"type":"number","description":"图片高度（像素）。"},"productVertical":{"type":"string","description":"产品线。**图片检测仅支持 creator 与 touliu**，短剧（duanju）无图片检测。","enum":["creator","touliu"],"default":"creator"},"detectTypes":{"type":"array","description":"检测维度。不传 = 全部开启。","default":["AD","OCR","POLITICS","VIOLENCE","PORN","LOGO"],"items":{"type":"string","enum":["AD","OCR","POLITICS","VIOLENCE","PORN","LOGO"]}}},"required":["imageUrl","imageTitle","imageSize"]},"ImageMetaDto":{"type":"object","properties":{"url":{"type":"string","description":"图片地址。","example":"https://your-cdn.com/banner.jpg"},"title":{"type":"string","description":"图片标题。","example":"618 主图 v2"},"sizeBytes":{"type":"number","description":"大小（字节）。","example":204800,"nullable":true},"width":{"type":"number","description":"宽度（像素）。","nullable":true},"height":{"type":"number","description":"高度（像素）。","nullable":true}},"required":["url","title"]},"ImageLabelDto":{"type":"object","properties":{"tier":{"type":"string","description":"风险档位。","enum":["STRICT","SOFT"],"example":"STRICT"},"tierLabel":{"type":"string","description":"tier 的中文标签。","example":"必须修改"},"tierReason":{"type":"string","description":"判定依据。","nullable":true},"description":{"type":"string","description":"风险描述。","example":"含医疗功效宣称"}},"required":["tier","tierLabel","description"]},"ImageCheckResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。"},"object":{"type":"string","description":"对象类型。","example":"image_check"},"status":{"type":"string","description":"检测状态。图片检测是同步的，提交返回时已是终态：`completed` 检测成功，`failed` 检测引擎异常（积分已自动退回）。","enum":["completed","failed"],"example":"completed"},"productVertical":{"type":"string","description":"产品线。图片检测仅支持 creator / touliu。","enum":["creator","touliu"]},"image":{"description":"图片元信息。","allOf":[{"$ref":"#/components/schemas/ImageMetaDto"}]},"riskLevel":{"type":"string","description":"顶层结论。","enum":["PASS","REVIEW","REJECT"],"example":"REJECT","nullable":true},"summary":{"description":"各档位计数。","allOf":[{"$ref":"#/components/schemas/SummaryDto"}]},"labels":{"description":"风险标签明细。","type":"array","items":{"$ref":"#/components/schemas/ImageLabelDto"}},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true},"updatedAt":{"type":"string","description":"最后更新时间（ISO 8601）。","nullable":true}},"required":["id","object","status","productVertical","image","summary","labels"]},"ImageMetaBriefDto":{"type":"object","properties":{"url":{"type":"string","description":"图片地址。","example":"https://your-cdn.com/banner.jpg"},"title":{"type":"string","description":"图片标题。","example":"618 主图 v2"},"sizeBytes":{"type":"number","description":"大小（字节）。","example":204800,"nullable":true}},"required":["url","title"]},"ImageCheckListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"检测 id。"},"object":{"type":"string","description":"对象类型。","example":"image_check"},"status":{"type":"string","description":"检测状态。"},"image":{"description":"图片元信息（列表版不含宽高）。","allOf":[{"$ref":"#/components/schemas/ImageMetaBriefDto"}]},"riskLevel":{"type":"string","description":"顶层结论。","nullable":true},"labels":{"description":"风险标签（纯文字）。","type":"array","items":{"type":"string"}},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true}},"required":["id","object","status","image","labels"]},"ImageCheckListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型，恒为 list。","example":"list"},"page":{"type":"number","description":"当前页码。","example":1},"pageSize":{"type":"number","description":"每页条数。","example":20},"total":{"type":"number","description":"符合条件的总条数。","example":514},"hasMore":{"type":"boolean","description":"是否还有下一页。","example":true},"data":{"description":"本页数据。","type":"array","items":{"$ref":"#/components/schemas/ImageCheckListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"CustomRuleResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"规则 id。"},"object":{"type":"string","description":"对象类型。","example":"custom_rule"},"keyword":{"type":"string","description":"检测词。","example":"竞品品牌名"},"matchType":{"type":"string","description":"keyword=子串匹配；phrase=词边界匹配。","enum":["keyword","phrase"],"example":"keyword"},"replacement":{"type":"string","description":"替换词。为空表示仅提醒。","example":"友商","nullable":true},"note":{"type":"string","description":"备注。","nullable":true},"enabled":{"type":"boolean","description":"是否启用。","example":true},"library":{"type":"string","description":"所属规则库。general 库对所有产品线生效。","enum":["general","creator","duanju","touliu"],"example":"general"},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true},"updatedAt":{"type":"string","description":"最后修改时间（ISO 8601）。","nullable":true}},"required":["id","object","keyword","matchType","enabled","library"]},"CustomRuleListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型，恒为 list。","example":"list"},"data":{"description":"全部规则（词库规模不大，不分页）。","type":"array","items":{"$ref":"#/components/schemas/CustomRuleResponseDto"}},"total":{"type":"number","description":"规则总数。","example":2}},"required":["object","data","total"]},"CustomRuleQuotaDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型。","example":"custom_rule_quota"},"used":{"type":"number","description":"已用条数。","example":12},"limit":{"type":"number","description":"当前套餐的词库上限。免费版为 0。","example":500},"isPaid":{"type":"boolean","description":"当前是否为付费订阅。","example":true}},"required":["object","used","limit","isPaid"]},"CustomRuleSettingsDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型。","example":"custom_rule_settings"},"enabled":{"type":"boolean","description":"租户级总开关。关闭时所有自定义词都不参与检测（数据保留）。","example":true}},"required":["object","enabled"]},"V1ToggleSettingsDto":{"type":"object","properties":{"enabled":{"type":"boolean","description":"租户级总开关。关闭后所有自定义词都不参与检测（数据保留），与每条规则的 enabled 正交。"}},"required":["enabled"]},"V1BulkImportItemDto":{"type":"object","properties":{"keyword":{"type":"string","description":"要检测的词。","maxLength":100},"replacement":{"type":"string","description":"替换词。","maxLength":100},"note":{"type":"string","description":"备注。","maxLength":200}},"required":["keyword"]},"V1BulkImportDto":{"type":"object","properties":{"library":{"type":"string","description":"规则库，决定这条词在哪些检测里生效：\n- `general` — 通用库（默认），短视频/短剧/投放**全部**检测都查\n- `creator` — 仅短视频检测命中\n- `duanju` — 仅短剧检测命中\n- `touliu` — 仅投放检测命中","enum":["general","creator","duanju","touliu"],"default":"general"},"items":{"description":"要导入的词条，单次上限 2000 条。批内重复、库里已存在的会被自动跳过（在响应里分别计数），不会报错。","type":"array","items":{"$ref":"#/components/schemas/V1BulkImportItemDto"}}},"required":["items"]},"CustomRuleImportResultDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型。","example":"custom_rule_import_result"},"total":{"type":"number","description":"本次提交的词条总数。","example":100},"imported":{"type":"number","description":"实际写入的条数。","example":95},"skippedDuplicate":{"type":"number","description":"因批内重复或库中已存在而跳过的条数。","example":3},"rejectedQuota":{"type":"number","description":"因超出套餐配额而被拒收的条数。","example":2}},"required":["object","total","imported","skippedDuplicate","rejectedQuota"]},"V1CreateCustomRuleDto":{"type":"object","properties":{"keyword":{"type":"string","description":"要检测的词。","example":"竞品品牌名","maxLength":100},"matchType":{"type":"string","description":"匹配方式：keyword=子串匹配（默认，任何位置出现都算）、phrase=词边界匹配（避免误伤更长的词）。","enum":["keyword","phrase"],"default":"keyword"},"replacement":{"type":"string","description":"替换词。配了之后命中项会带 `replacement`，可用于一键精确替换；留空则仅提醒。","example":"友商","maxLength":100},"note":{"type":"string","description":"备注，仅自己可见。","example":"竞品名，不得提及","maxLength":200},"library":{"type":"string","description":"规则库，决定这条词在哪些检测里生效：\n- `general` — 通用库（默认），短视频/短剧/投放**全部**检测都查\n- `creator` — 仅短视频检测命中\n- `duanju` — 仅短剧检测命中\n- `touliu` — 仅投放检测命中","enum":["general","creator","duanju","touliu"],"default":"general"},"enabled":{"type":"boolean","description":"是否启用。停用后保留数据但不参与检测。","default":true}},"required":["keyword"]},"V1UpdateCustomRuleDto":{"type":"object","properties":{"keyword":{"type":"string","description":"要检测的词。","maxLength":100},"replacement":{"type":"string","description":"替换词。传 null 清空。","maxLength":100},"note":{"type":"string","description":"备注。传 null 清空。","maxLength":200},"enabled":{"type":"boolean","description":"是否启用。"}}},"BatchImageItemDto":{"type":"object","properties":{"url":{"type":"string","description":"公网可访问的图片地址。"},"name":{"type":"string","description":"图片名称，用于在结果里对应。"},"size":{"type":"number","description":"图片大小（字节）。","minimum":1},"width":{"type":"number","description":"宽度（像素）。"},"height":{"type":"number","description":"高度（像素）。"}},"required":["url","name","size"]},"BatchVideoItemDto":{"type":"object","properties":{"url":{"type":"string","description":"公网可访问的视频地址。"},"name":{"type":"string","description":"视频名称，用于在结果里对应。"},"size":{"type":"number","description":"视频大小（MB）。提交时会校验是否与实际文件相符。","minimum":0.01},"duration":{"type":"number","description":"视频时长（秒）。**计费依据**，检测完成后会与实际时长对账，申报偏短会补扣差额。","minimum":1},"width":{"type":"number","description":"宽度（像素）。"},"height":{"type":"number","description":"高度（像素）。"}},"required":["url","name","size","duration"]},"CreateBatchDto":{"type":"object","properties":{"name":{"type":"string","description":"素材包名称。","example":"618 大促投放素材包","maxLength":60},"productVertical":{"type":"string","description":"产品线。素材包最常用于投放（touliu）。","enum":["creator","duanju","touliu"]},"platform":{"type":"string","description":"发布平台。","enum":["douyin","kuaishou","xiaohongshu","shipinhao","bilibili","hongguo"]},"industryVertical":{"type":"string","description":"行业垂类。","enum":["general","beauty","ecommerce","finance","health","food","slimming"]},"texts":{"description":"待检测文案，最多 10 条，每条 10–5000 字。","type":"array","items":{"type":"string"}},"images":{"description":"待检测图片，最多 20 张。","type":"array","items":{"$ref":"#/components/schemas/BatchImageItemDto"}},"videos":{"description":"待检测视频，最多 10 个。","type":"array","items":{"$ref":"#/components/schemas/BatchVideoItemDto"}}},"required":["name","productVertical","platform","industryVertical"]},"BatchCountsDto":{"type":"object","properties":{"text":{"type":"number","description":"文案子项数。"},"image":{"type":"number","description":"图片子项数。"},"video":{"type":"number","description":"视频子项数。"}},"required":["text","image","video"]},"BatchProgressDto":{"type":"object","properties":{"total":{"type":"number","description":"子项总数。","example":12},"done":{"type":"number","description":"已完成的子项数。","example":9},"percent":{"type":"number","description":"完成百分比（0–100）。","example":75}},"required":["total","done","percent"]},"BatchListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"素材包 id。"},"object":{"type":"string","description":"对象类型。","example":"batch"},"name":{"type":"string","description":"素材包名称。"},"status":{"type":"string","description":"整包状态。"},"counts":{"description":"各类型子项数量。","allOf":[{"$ref":"#/components/schemas/BatchCountsDto"}]},"progress":{"description":"进度。","allOf":[{"$ref":"#/components/schemas/BatchProgressDto"}]},"result":{"type":"string","description":"整包结论。","nullable":true},"summary":{"description":"整包各档位计数。","allOf":[{"$ref":"#/components/schemas/SummaryDto"}]},"finishedAt":{"type":"string","description":"完成时间（ISO 8601）。","nullable":true},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true}},"required":["id","object","name","status","counts","progress","summary"]},"BatchListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型，恒为 list。","example":"list"},"page":{"type":"number","description":"当前页码。","example":1},"pageSize":{"type":"number","description":"每页条数。","example":20},"total":{"type":"number","description":"符合条件的总条数。","example":514},"hasMore":{"type":"boolean","description":"是否还有下一页。","example":true},"data":{"description":"本页数据。","type":"array","items":{"$ref":"#/components/schemas/BatchListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"BatchItemImageDto":{"type":"object","properties":{"url":{"type":"string","description":"图片地址。","nullable":true},"title":{"type":"string","description":"图片名称。","nullable":true}}},"BatchItemVideoDto":{"type":"object","properties":{"url":{"type":"string","description":"视频地址。","nullable":true},"title":{"type":"string","description":"视频名称。","nullable":true},"durationSeconds":{"type":"number","description":"视频时长（秒）。","example":45}},"required":["durationSeconds"]},"BatchItemDto":{"type":"object","properties":{"kind":{"type":"string","description":"子项类型。","enum":["text","image","video"],"example":"text"},"index":{"type":"number","description":"子项在提交时的顺序下标。","example":0},"checkId":{"type":"string","description":"子项对应的单项检测 id。拿它去 /v1/{text,image,video}/checks/{id} 可取完整明细。","example":"cms8xhc5x0006sp59vrks7zkf"},"status":{"type":"string","description":"子项状态。","enum":["processing","completed","failed"]},"riskLevel":{"type":"string","description":"子项结论。","enum":["PASS","REVIEW","REJECT"],"nullable":true},"summary":{"description":"子项各档位计数。","allOf":[{"$ref":"#/components/schemas/SummaryDto"}]},"preview":{"type":"string","description":"预览：文案截断内容 / 图片或视频地址。","nullable":true},"text":{"type":"string","description":"仅 kind=text：完整文案。","nullable":true},"riskCount":{"type":"number","description":"仅 kind=text：原始风险条数。"},"image":{"description":"仅 kind=image。","allOf":[{"$ref":"#/components/schemas/BatchItemImageDto"}]},"video":{"description":"仅 kind=video。","allOf":[{"$ref":"#/components/schemas/BatchItemVideoDto"}]},"labels":{"description":"仅 kind=image / video：风险标签。","type":"array","items":{"type":"string"}}},"required":["kind","index","checkId","status","summary"]},"BatchResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"素材包 id。"},"object":{"type":"string","description":"对象类型。","example":"batch"},"name":{"type":"string","description":"素材包名称。","example":"618 大促投放素材包"},"status":{"type":"string","description":"整包状态。","enum":["pending","processing","completed","failed"],"example":"processing"},"productVertical":{"type":"string","description":"产品线。"},"platform":{"type":"string","description":"发布平台。"},"industryVertical":{"type":"string","description":"行业垂类。"},"progress":{"description":"进度。","allOf":[{"$ref":"#/components/schemas/BatchProgressDto"}]},"result":{"type":"string","description":"整包结论。全部子项完成后才有值，进行中为 null。","enum":["PASS","REJECT"],"nullable":true},"summary":{"description":"整包各档位计数。","allOf":[{"$ref":"#/components/schemas/SummaryDto"}]},"items":{"description":"子项明细。","type":"array","items":{"$ref":"#/components/schemas/BatchItemDto"}},"finishedAt":{"type":"string","description":"完成时间（ISO 8601）。","nullable":true},"createdAt":{"type":"string","description":"创建时间（ISO 8601）。","nullable":true}},"required":["id","object","name","status","productVertical","platform","industryVertical","progress","summary","items"]},"AccountExpiringSoonDto":{"type":"object","properties":{"amount":{"type":"number","description":"即将过期的积分数量。","example":500},"expiresAt":{"type":"string","description":"最近的过期时间（ISO 8601）。","nullable":true}},"required":["amount"]},"AccountCreditsDto":{"type":"object","properties":{"total":{"type":"number","description":"可用积分总额。","example":14238},"subscription":{"type":"number","description":"订阅赠送部分。","example":10000},"activity":{"type":"number","description":"活动赠送部分。","example":238},"booster":{"type":"number","description":"加油包部分。","example":4000},"expiringSoon":{"description":"7 天内即将过期的积分。没有则为 null。","nullable":true,"allOf":[{"$ref":"#/components/schemas/AccountExpiringSoonDto"}]}},"required":["total","subscription","activity","booster"]},"AccountSubscriptionDto":{"type":"object","properties":{"plan":{"type":"string","description":"订阅方案。free 表示免费版或订阅已过期。","example":"pro"},"isPaid":{"type":"boolean","description":"是否为有效付费订阅。","example":true}},"required":["plan","isPaid"]},"AccountUsageDto":{"type":"object","properties":{"since":{"type":"string","description":"统计起点（本自然月 1 日零点，ISO 8601）。","nullable":true},"textChecks":{"type":"number","description":"本月文案检测次数。","example":128},"videoChecks":{"type":"number","description":"本月视频检测次数。","example":34},"imageChecks":{"type":"number","description":"本月图片检测次数。","example":56},"batches":{"type":"number","description":"本月素材包次数。","example":4}},"required":["textChecks","videoChecks","imageChecks","batches"]},"AccountResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型。","example":"account"},"credits":{"description":"积分余额构成。","allOf":[{"$ref":"#/components/schemas/AccountCreditsDto"}]},"subscription":{"description":"订阅信息。","allOf":[{"$ref":"#/components/schemas/AccountSubscriptionDto"}]},"usageThisMonth":{"description":"本月用量。含网页、小程序、开放 API 所有入口 —— 它们共用同一个额度池。","allOf":[{"$ref":"#/components/schemas/AccountUsageDto"}]}},"required":["object","credits","subscription","usageThisMonth"]},"CreateUploadPolicyDto":{"type":"object","properties":{"filename":{"type":"string","description":"要上传的文件名（含扩展名）。","example":"demo.mp4"},"kind":{"type":"string","description":"素材类型，决定大小上限：video 上限 1GB，image 上限 10MB。","enum":["video","image"]}},"required":["filename","kind"]},"UploadPolicyResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"对象类型。","example":"upload_policy"},"kind":{"type":"string","description":"素材类型。","enum":["video","image"]},"host":{"type":"string","description":"OSS 直传地址，表单 POST 到这里。","example":"https://your-bucket.oss-cn-hangzhou.aliyuncs.com"},"cdnHost":{"type":"string","description":"上传完成后的访问域名。素材地址 = {cdnHost}/{key}。","example":"https://oss.example.com"},"dir":{"type":"string","description":"允许写入的目录前缀。表单里的 key 必须以它开头，否则 OSS 拒收。","example":"byerisk-oss/your-tenant-id/"},"policy":{"type":"string","description":"base64 编码的 policy，作为表单字段 policy 提交。"},"accessKeyId":{"type":"string","description":"作为表单字段 OSSAccessKeyId 提交。"},"signature":{"type":"string","description":"作为表单字段 signature 提交。"},"maxSizeBytes":{"type":"number","description":"大小上限（字节）。视频 1GB，图片 10MB。","example":1073741824},"expiresAt":{"type":"string","description":"凭证过期时间（ISO 8601），签发后 5 分钟。"}},"required":["object","kind","host","cdnHost","dir","policy","accessKeyId","signature","maxSizeBytes","expiresAt"]},"V1QualificationNoticeDto":{"type":"object","properties":{"productVertical":{"type":"string","description":"产品线。决定哪些规则参与匹配（如短剧备案只对 `duanju` 触发）。","enum":["creator","duanju","touliu"],"example":"creator"},"platform":{"type":"string","description":"发布平台，如 `douyin`。部分规则只在特定平台生效；不传则不按平台过滤。","example":"douyin"},"industry":{"type":"string","description":"用户**声明**的内容行业。这是高可信信号：命中即直接返回，不过语义确认。\n\n⚠️ **与检测接口的 `industryVertical` 不是同一套取值，不要直接复用。**\n后者是 7 个规则桶（`general`/`beauty`/`ecommerce`/`finance`/`health`/`food`/`slimming`），\n本字段是更细的行业声明；把检测用的值传进来，医美 / 药品 / 法律 / 招商这些行业永远不会命中。\n\n能命中规则的取值：`beauty`、`finance`、`health`、`medical-beauty`（医美）、\n`drug-health`（药品·保健食品）、`legal`、`franchise`（招商加盟）、`occult`（玄学命理）、\n`education`、`recruit`、`realestate`、`auto`、`alcohol`。\n`general` / `other`（通用）与 `ecommerce` / `slimming` 是合法值但不出提醒。\n折算成 `industryVertical` 的对照表见文档首页「准入资质提醒」。\n\n传枚举之外的值会返回 `400` —— 宁可当场报错，也不要静默返回空数组让你读成「这个行业没有资质要求」。","enum":["general","other","beauty","ecommerce","finance","health","slimming","medical-beauty","drug-health","legal","franchise","occult","education","recruit","realestate","auto","alcohol"],"example":"medical-beauty"},"text":{"type":"string","description":"文案原文，仅用于关键词扫描，覆盖没有行业选项的长尾（法律 / 招商 / 禁入品等）。\n关键词命中会再经一次语义确认剔除误报（如「无需问诊」不算医疗），确认服务不可用时该命中会被丢弃而不是保留。\n视频 / 图片检测没有文案，留空即可，此时只按 `industry` 派生。","maxLength":20000}},"required":["productVertical"]},"QualificationCredentialDto":{"type":"object","properties":{"name":{"type":"string","description":"证照 / 认证的精确名称。","example":"医疗机构执业许可证"},"who":{"type":"string","description":"责任主体：机构 / 个人 / 企业。省略表示不限。","example":"机构"},"note":{"type":"string","description":"补充说明。","example":"需在有效期内且经营范围含医疗美容"}},"required":["name"]},"QualificationHitDto":{"type":"object","properties":{"id":{"type":"string","description":"规则 id，稳定不复用。","example":"q-medical-beauty"},"industryLabel":{"type":"string","description":"行业 / 类目名称，直接展示给用户。","example":"医美（医疗美容）"},"mechanism":{"type":"string","description":"准入机制，决定文案与展示分类：\n- `qualification` — 需主体资质\n- `report-white` — 需类目报白（带货类目准入）\n- `filing` — 需备案号（短剧）\n- `prohibited` — 禁止准入，**无资质路径**，不可收起","enum":["qualification","report-white","filing","prohibited"],"example":"qualification"},"severity":{"type":"string","description":"视觉强度，仅控展示，不参与判定。","enum":["high","normal"],"example":"high"},"requiredCredentials":{"description":"需要具备的证照清单。","type":"array","items":{"$ref":"#/components/schemas/QualificationCredentialDto"}},"userHint":{"type":"string","description":"给用户看的一句话说明。","example":"医疗美容内容需机构具备《医疗机构执业许可证》…"},"sourceNote":{"type":"string","description":"规则依据出处。","example":"《互联网广告管理办法》第八条"},"effectiveFrom":{"type":"string","description":"规则生效日期。","example":"2023-05-01"},"dismissKey":{"type":"string","description":"去重 / 收起键，格式 `mechanism:industryLabel`。传给 dismissals 接口用它。","example":"qualification:医美（医疗美容）"},"dismissable":{"type":"boolean","description":"是否允许「我已具备，不再提示」。`prohibited` 恒为 false。","example":true},"dismissed":{"type":"boolean","description":"当前隔离域是否已收起过这一条。`dismissable=false` 时恒为 false。","example":false},"matchedBy":{"type":"string","description":"命中来源，决定前端怎么向用户解释这条提醒：\n- `vertical` — 按你传的 `industry` 命中（依据所选行业）\n- `productVertical` — 按产品线命中（如短剧备案）\n- `keyword` — 按 `text` 内容命中，已经过语义确认","enum":["vertical","productVertical","keyword"],"example":"vertical"}},"required":["id","industryLabel","mechanism","severity","requiredCredentials","userHint","dismissKey","dismissable","dismissed","matchedBy"]},"QualificationNoticeResponseDto":{"type":"object","properties":{"hits":{"description":"命中的提醒，按「禁入 > 备案 > 报白 > 资质」排序。无命中时为空数组。","type":"array","items":{"$ref":"#/components/schemas/QualificationHitDto"}}},"required":["hits"]},"QualificationDismissalsResponseDto":{"type":"object","properties":{"keys":{"description":"当前隔离域已收起的 dismissKey 列表。","example":["qualification:医美（医疗美容）"],"type":"array","items":{"type":"string"}}},"required":["keys"]},"V1QualificationDismissDto":{"type":"object","properties":{"dismissKey":{"type":"string","description":"要收起的提醒的 `dismissKey`，取自 notice 返回的对应条目。","example":"qualification:医美（医疗美容）","maxLength":200}},"required":["dismissKey"]},"QualificationDismissResponseDto":{"type":"object","properties":{"ok":{"type":"boolean","description":"操作是否生效。","example":true}},"required":["ok"]}}}}