GEO 开放接口文档
19 个 AI 平台版本 · 异步采集 · 客户数据隔离 · 结果与采样报告
此页为接口说明;业务服务地址以 OpenAPI 配置及开通信息为准,文档所在域名不是默认 API 服务地址。HTTP 202 表示入队,采集结果需继续查询。
标准接口文件
下载 OpenAPI 3.0.3 JSON(可导入 Apifox / Postman) · 完整对接文档及 Python 示例
HTTPS + UTF-8 JSON,Bearer 密钥认证,版本路径 /api/v1。成功响应保持现有对象或数组结构;错误响应统一为 error、code、requestId。响应头 X-Request-Id 用于排查问题,时间字段使用带时区的 ISO 8601 格式。
| 方法 | 路径 | 说明 | 权限 |
|---|---|---|---|
| GET | /api/v1/platforms | 平台目录 | read |
| GET | /api/v1/usage | 密钥用量 | read |
| GET | /api/v1/screenshots/{assetId} | 查看截图 | read |
| POST | /api/v1/brands | 创建品牌 | provision |
| GET | /api/v1/brands | 品牌列表 | read |
| POST | /api/v1/brands/{brandId}/questions | 添加问题 | provision |
| GET | /api/v1/brands/{brandId}/questions | 问题列表 | read |
| POST | /api/v1/runs | 发起采集 | monitor |
| GET | /api/v1/runs/{runId} | 任务与回答 | read |
| GET | /api/v1/runs/{runId}/report | 采样报告 | read |
| GET | /api/v1/brands/{brandId}/runs | 任务列表 | read |
| GET | /api/v1/brands/{brandId}/overview | 品牌概览 | read |
| GET | /api/v1/brands/{brandId}/sources | 引用来源 | read |
调用与计价
Base URL:部署本系统的域名 + /api/v1。所有业务接口需要服务商密钥。
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
基础费用 0.25 元/次
基础费用按一次采样计,即一个问题 × 一个平台 × 一轮采集。截图加价、接口请求费及客户专属价格按配置另计,实际扣费以 GET /api/v1/usage 返回的有效价格为准;具体价格请联系销售。
一次采样 = 一个问题 × 一个平台 × 一轮采集。费用 = 采样销售价与截图加价之和 + 发起采集接口费。GET /api/v1/usage 返回当前客户的有效销售价格;上游成本不对外展示,不直接用于扣款。
客户初始余额为 0。余额不足返回 402,不创建任务。受理即扣款;失败、取消或截图缺失不自动退款。相同客户下同一采集 Idempotency-Key 同参重试不重复扣款。价格和余额均以整数分保存;历史任务保留成交快照。收费写入接口均要求幂等编号;查询接口默认免费,可由管理员单独定价,按每次成功受理的请求收费。
支持平台
调用 GET /api/v1/platforms 获取相同目录,以及 client、supportedCollectors、upstreamConfigured、pricing。配置状态不代表真实采集成功。
| 平台 | platforms 参数 | 版本 |
|---|---|---|
| DeepSeek | deepseek | 网页版 |
| 豆包 | doubao | 网页版 |
| Kimi | kimi | 网页版 |
| 通义千问 | qwen | 网页版 |
| 元宝 | yuanbao | 网页版 |
| 豆包 | doubao_mobile | 手机版 |
| 元宝 | yuanbao_mobile | 手机版 |
| DeepSeek | deepseek_mobile | 手机版 |
| 百度文心 | baiduai | 网页版 |
| 百度文心 | baidu_mobile | 手机版 |
| 通义千问 | qianwen_mobile | 手机版 |
| 蚂蚁阿福 | antafu | 网页版 |
| 夸克 | quark | 网页版 |
| 微博智搜 | weibo_zhisou | 网页版 |
| 抖音AI | douyinai | 网页版 |
| ChatGPT | chatgpt | 网页版 |
| Google AI | googleai | 网页版 |
| Bing AI | bingai_overviews | 网页版 |
| 小红书点点 | xiaohongshu_mobile | 手机版 |
千问网页版继续使用 qwen,由服务器映射至上游 qianwen。ChatGPT、Google AI、Bing AI、小红书点点已加入目录,实际可用性取决于上游账户;新平台需先配置销售价。平台维护或账户限制可能导致采集失败。
直接提交问题,无需创建品牌
直接调用 POST /api/v1/runs,提供 prompt 和 platform(单平台)或 platforms(多平台)。不需要 brandId、questionIds 或 provision 权限。系统按客户唯一 ID 隔离保存问题及回答,只收取采集与 runs.create 配置费用。原有品牌接口作为可选管理能力保留。
提交异步采集
POST /api/v1/runs
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: partner-order-001
Content-Type: application/json
{
"prompt": "什么是 SaaS agent 平台?",
"platforms": [
"doubao",
"qianwen_mobile"
],
"repeatCount": 1,
"intervalSeconds": 60,
"platformOptions": {
"doubao": {
"screenshot": false
},
"qianwen_mobile": {
"screenshot": true
}
}
}本例包含 2 次采集,实际价格由客户专属价或租户默认价确定。服务商接口统一使用云端采集,无需指定采集通道;通道由系统管理,不继承本地浏览器配置,也不自动降级。
platformOptions 每项仅支持布尔字段 screenshot,默认 false。云端采集统一使用普通联网搜索;未知字段或非布尔值返回 400。platformOptions 只能包含已选择的平台。
repeatCount 为 1–20,intervalSeconds 为 0–3600。同平台重复采样由服务器按间隔调度。单次外部任务最多 20 个采集单元,超出请拆分为多个业务请求。
HTTP 202
{"id":"RUN_ID","brandId":"BRAND_ID","status":"queued","reused":false}202 表示已入队。请保存 RUN_ID。同一客户及 Idempotency-Key 的同参数重试复用原任务;参数改变返回 409。提交幂等标识为 1–80 位字母、数字、下划线、点或连字符。服务器另行生成上游幂等标识防止重复提交。
查询结果与报告
GET /api/v1/runs/RUN_ID GET /api/v1/runs/RUN_ID/report
建议每 5–10 秒查询一次。状态为 queued、running 时继续等待;completed、partial_failed、failed、cancelled 为本地终态。检查 platformRuns 中每一项的状态。
每项包含 platformId、sampleIndex、monitoringOptions、quotedPriceCents。answer 包含 content、citations、responseUrl、brandMentioned、mentionCount;云端结果另含 providerResult.screenshotUrl、references、sentiment、mentionPosition、competitorRankings。未获取的数据为 null 或空列表。
citations 仅统计实际引用来源;references 为上游来源集合。上游响应先保存到服务器数据库,完成的文字结果和图片落盘后再返回。图片独立按租户/服务商 UUID/任务 UUID/采样 UUID 存储,最多保留 90 天,到期立即拒绝访问,并由每分钟定时清理任务删除。截图缺失时 screenshotUrl 为 null;短期签名地址有效期最长一小时,也受密钥开关、有效期、接口开关和余额约束。链接到期请重新查询任务。第三方分享页可能需要登录;引用链接的 availability 表示最近检查状态,不保证第三方永久可用。品牌关键词命中和上游语义分析分别保存,不能混用统计口径。读取本地结果不会隐式触发新采集。
余额与错误
不设每日、每分钟、每小时请求次数上限。每任务最多 20 个采集单元,单任务并发 1,参数长度及单批大小仍受校验。400 参数错误,401 密钥失效,402 余额不足,403 无权限或接口关闭,404 不存在,409 幂等冲突或销售价未配置,500 服务异常。
上游异常通过采集单元 errorCode/errorMessage 返回。202 只表示受理,不代表上游成功。失败或取消不自动退款;需要核销时由管理员记录原因。
客户身份、有效期与统计
客户唯一 customerId 存入数据库并绑定密钥、品牌、幂等记录、余额和流水。密钥轮换时选择同一客户账户,余额和历史记录继续使用;不同客户不得交叉授权品牌。
dailyUsage 仅用于统计,limit 固定为 0,remaining 为 null。旧 dailyRequestLimit 设置不再生效。接口总开关、密钥开关、有效期及权限校验仍生效。
响应头 X-Billing-Charged-Cents 表示本次扣费,X-Balance-Cents 表示扣费后余额;X-Request-Id 用于追踪。已受理任务不因后续改价而重新扣款。
完整对接说明与 Python 示例
版本:v1.3 · 更新日期:2026-10-13
标准接口文件:OpenAPI 3.0.3 JSON,可在 Apifox / Postman 中导入;导入后将服务器地址设为实际 HTTPS 地址加 /api/v1。规范参考:OpenAPI 3.0.3。
1. 接入地址与认证
Base URL:部署本系统的域名 + /api/v1。部署后的公开文档地址为 /api-docs,无需管理账号即可阅读。
所有请求携带:
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
API Key 由管理员在“服务商 API”页面签发,只在创建后显示一次,可以设置有效期并随时撤销。服务商不得使用管理员账号密码,不得将密钥放入浏览器前端、URL、日志或公开仓库。适用于服务商后端调用。
旧 IP 部署若仍使用自签名证书,需要从管理员获取 tls.crt。请通过可信渠道核对证书指纹,并将此证书配置为该服务的信任证书;curl 使用 --cacert tls.crt,Python requests 使用 verify='tls.crt'。不要使用 -k 或 verify=False。正式域名及受信任证书配置完成后可使用系统默认信任链。
验收范围: 本版本包含云端采集适配、19 个平台版本、模拟上游测试及原有业务回归。真实上游账户及平台采集需要部署后验收;202 表示任务成功入队,不代表成功获得 AI 回答。本地浏览器采集仍需服务器登录。
2. 数据与权限
- read:查询授权品牌、问题、任务、来源和报告。
- monitor:为授权品牌发起监控。
- provision:创建自己的品牌及问题。
- 自助接入密钥初始没有内部品牌权限,创建的新品牌自动加入该密钥授权范围。
- 不同密钥创建的数据默认互相不可访问。管理员可额外授权指定品牌。
- 不提供平台登录管理、修改定时计划、修改内部品牌或删除数据的外部接口。
- 密钥轮换时选择已有客户账户(同一 customerId)并勾选其品牌,再撤销旧密钥;这样可共用余额、幂等记录及客户历史。
3. 接口列表
以下路径均相对于 Base URL。
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| GET | /platforms | read | 支持的平台标识与名称 |
| GET | /usage | read | 客户 ID、余额、有效销售价及请求统计 |
| POST | /brands | provision | 创建品牌并自动授权 |
| GET | /brands | read | 仅返回本密钥可访问品牌 |
| POST | /brands/{brandId}/questions | provision | 批量添加问题,同品牌相同文本复用已有记录 |
| GET | /brands/{brandId}/questions | read | 获取问题 ID |
| POST | /runs | monitor | 创建异步监控任务 |
| GET | /runs/{runId} | read | 查询任务状态及回答 |
| GET | /runs/{runId}/report | read | 查询采样报告 JSON |
| GET | /brands/{brandId}/runs?limit=20 | read | 任务列表,limit 最多 100 |
| GET | /brands/{brandId}/overview?days=30 | read | 统计与趋势 |
| GET | /brands/{brandId}/sources?days=30&platformId=deepseek | read | 来源列表 |
4. 完整调用流程
4.1 创建品牌(可选,直接采集无需调用)
POST /api/v1/brands
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{"name":"示例品牌","aliases":["示例品牌简称"]}
成功返回 201,读取响应中的 id 作为 brandId。name 为 1–100 字,aliases 可选,最多 20 个,每个最多 100 字。品牌创建不做名称去重;建议保存 ID,网络结果不明时先查询 /brands,避免重复创建。
4.2 添加问题
POST /api/v1/brands/BRAND_ID/questions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{"texts":["示例品牌怎么样?","示例品牌适合哪些用户?"],"category":"品牌认知"}
响应 201:
{"questions":[{"id":"QUESTION_ID","text":"示例品牌怎么样?"}],"created":1}
响应示例作字段节选,实际返回问题完整属性。每次 1–100 个问题,每题最多 2000 字。
4.3 创建监控
POST /api/v1/runs
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: vendor-order-20261009-001
Content-Type: application/json
{"brandId":"BRAND_ID","questionIds":["QUESTION_ID"],"platforms":["deepseek"],"repeatCount":1,"intervalSeconds":60}
成功返回 202:
{"id":"RUN_ID","brandId":"BRAND_ID","status":"queued","reused":false}
Idempotency-Key 必填,为 1–80 位字母、数字、下划线、点或连字符。同一密钥、相同 Idempotency-Key、相同参数重复请求,返回原任务并标记 reused=true;参数不同返回 409。该键应代表服务商的一次业务请求,重试时保持不变。
接受直接问题 prompt、单平台 platform,或旧 brandId、questionIds 模式;公共参数为 platforms、repeatCount、intervalSeconds、collector、platformOptions。repeatCount 默认 1,范围 1–20;intervalSeconds 默认 60,范围 0–3600。问题必须属于授权品牌且已启用。所有服务商采集固定使用云端采集。无需指定 collector,系统自动选择云端采集通道;不支持指定本地采集通道。不会继承管理端本地浏览器配置,上游未配置或失败时不会降级到本地浏览器。外部任务固定单任务并发 1。不同云端采集任务可并行执行,云端全局最多同时执行 4 个采集单元(运营方可用 GEO_CLOUD_CONCURRENCY 配置 1–16,修改后需重启)。同任务重复采样仍遵守 intervalSeconds;不同客户、不同任务不共享采样间隔。达到并发上限时排队,不改变余额与幂等规则。
4.4 轮询与结果
每隔 5–10 秒查询 GET /runs/RUN_ID。终态包括 completed、partial_failed、failed、cancelled;queued 和 running 表示尚未结束。
platformRuns 数组按平台与采样轮次返回结果。成功记录的 answer 包含 content、brandMentioned、mentionCount、citations 和 responseUrl。采集失败时 answer 可能为空。失败说明不包含服务器路径和内部日志;需要管理员查阅详细原因。
GET /runs/RUN_ID/report 返回 summary、groups 和 samples。summary 包括 planned、valid、mentioned、failed、cancelled、pending、mentionRate、coverageRate、citationRate。没有有效样本时比率可能为 null。
无品牌直接采集(推荐)
无需先调用创建品牌和添加问题接口。只需 monitor 权限和有效余额:
POST /api/v1/runs
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: your-order-unique-id
Content-Type: application/json
{"prompt":"什么是 SaaS agent 平台?","platform":"deepseek"}
也可用 platforms 数组指定多个平台,但不能与 platform 同传。prompt 为 1–2000 字,不能和 brandId/questionIds 同传。系统按客户唯一 ID 保存隔离的采集记录,不收取创建品牌或添加问题接口费;沿用采样、截图及 runs.create 价格。返回任务 id 后调用 GET /runs/{id} 查询。余额不足时任务及自动归档记录全部回滚。同一客户同一 Idempotency-Key 重试不重复扣费。原品牌模式保留兼容。
5. Python 示例
依赖 requests。将 API Key 放入 GEO_API_KEY 环境变量,将 GEO_API_BASE_URL 设为实际服务器地址加 /api/v1;仅旧自签名部署需要通过 GEO_CA_BUNDLE 指定已核验的证书。运行脚本直接提交一个监控任务,无需创建品牌或问题。
import os
import time
import uuid
import requests
base = os.environ["GEO_API_BASE_URL"].rstrip("/")
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {os.environ['GEO_API_KEY']}"})
session.verify = os.environ.get("GEO_CA_BUNDLE") or True
def call(method, path, **kwargs):
response = session.request(method, base + path, timeout=30, **kwargs)
response.raise_for_status()
return response.json()
# 生产环境将 request_id 与业务订单持久化,网络重试时复用。
request_id = "vendor-" + uuid.uuid4().hex
run = call("POST", "/runs", headers={"Idempotency-Key": request_id}, json={
"prompt": "什么是 SaaS agent 平台?",
"platforms": ["deepseek"],
"repeatCount": 1,
"intervalSeconds": 60
})
for _ in range(120):
detail = call("GET", f"/runs/{run['id']}")
if detail["status"] in {"completed", "partial_failed", "failed", "cancelled"}:
print(call("GET", f"/runs/{run['id']}/report"))
break
time.sleep(10)
else:
print("任务仍在运行,请保存任务 ID 稍后查询:", run["id"])
生产调用应单独处理 429 的等待重试和网络超时;不要因一次超时就换用新的 Idempotency-Key。
6. 余额准入与错误
无每日、每分钟、每小时次数限制,也不因排队任务达到 5 个而拒绝新请求。单任务最多 20 个采集单元、并发为 1;批量问题和参数长度校验保留。计次仅用于统计。
| HTTP | 含义 |
|---|---|
| 400 | 参数无效或未配置采集器 |
| 401 | 密钥无效、过期或撤销 |
| 402 | 余额不足,业务写入和扣费整体回滚 |
| 403 | 接口关闭、密钥关闭、未生效或无权限 |
| 404 | 资源不存在或不属于当前租户 |
| 409 | 幂等冲突,或平台销售价尚未配置 |
| 410 | 截图超过保留期限 |
| 500 | 服务异常 |
采集失败原因(2026-10-09)
HTTP 202 仅表示任务已入队。查询任务详情时,应检查每个 platformRuns[] 的 status、errorCode、errorMessage、retryable,不能仅凭 HTTP 200 判断采集成功。
| errorCode | 原因 | 处理方式 |
|---|---|---|
| LOGIN_REQUIRED | 服务器采集浏览器未登录或登录失效 | 管理员在服务器浏览器中登录后,重新提交任务 |
| CAPTCHA_REQUIRED | 平台要求人工验证 | 人工完成验证后再提交,避免立即连续重试 |
| BROWSER_NOT_CONNECTED | OpenCLI 浏览器桥未连接 | 管理员恢复 Bridge 连接后再提交 |
| COLLECTION_TIMEOUT | 平台响应超时 | 可以稍后重试 |
| COLLECTION_FAILED | 其他错误 | 联系管理员查询内部日志 |
没有错误时 errorCode、errorMessage 为 null。retryable: false 表示需要先处理环境问题或查看日志,不应自动重试;它不代表永久禁止重新提交。恢复环境后重跑应使用新的 Idempotency-Key,旧键仍返回原任务。
同一批次中遇到登录、验证码或浏览器未连接时,该平台后续采集单元直接标记失败并沿用原因,其他平台继续。下一批重新检查,不会永久封禁该平台。旧任务只记录了“超时”的,无法事后推断为登录或验证码错误。
采集器会检查已知可见登录弹窗、手机号表单及验证码 iframe;平台页面变化后仍可能需要更新检测规则。检测与明确报错不等于完成了登录或获得有效回答。
7. 平台目录与云端采集(2026-10-12)
以下 19 个版本同时出现在管理界面、GET /platforms 和公开网页文档。目录存在不代表上游实时可用,新平台需先配置销售价。
新增平台:chatgpt(ChatGPT)、googleai(Google AI)、bingai_overviews(Bing AI)、xiaohongshu_mobile(小红书点点移动端)。
| 平台 | platforms 参数 | 版本 |
|---|---|---|
| DeepSeek | deepseek |
网页版 |
| 豆包 | doubao |
网页版 |
| Kimi | kimi |
网页版 |
| 通义千问 | qwen |
网页版 |
| 元宝 | yuanbao |
网页版 |
| 豆包 | doubao_mobile |
手机版 |
| 元宝 | yuanbao_mobile |
手机版 |
| DeepSeek | deepseek_mobile |
手机版 |
| 百度文心 | baiduai |
网页版 |
| 百度文心 | baidu_mobile |
手机版 |
| 通义千问 | qianwen_mobile |
手机版 |
| 蚂蚁阿福 | antafu |
网页版 |
| 夸克 | quark |
网页版 |
| 微博智搜 | weibo_zhisou |
网页版 |
| 抖音AI | douyinai |
网页版 |
兼容性:千问网页版继续使用 qwen,服务器将其映射至上游 qianwen;手机版使用 qianwen_mobile。不要将网页版和手机版合并成一个平台。
GET /platforms 返回每个平台的 id、name、label、client、upstreamId、supportedCollectors、defaultMode、upstreamConfigured、pricing。upstreamConfigured 仅说明服务器已配置凭据,不是账户有效性或实时平台可用性证明。平台维护时以采集单元返回的失败状态为准。
云端提交示例
{
"brandId": "BRAND_ID",
"questionIds": [
"QUESTION_ID"
],
"platforms": [
"doubao",
"qianwen_mobile"
],
"repeatCount": 1,
"intervalSeconds": 60,
"platformOptions": {
"doubao": {
"screenshot": false
},
"qianwen_mobile": {
"screenshot": true
}
}
}
platformOptions 是以已选平台 id 为键的对象,每项仅允许 screenshot 一个布尔字段,默认 false。它只适用于云端采集。非布尔值、未知字段、未选择的平台配置,返回 400。云端采集统一使用普通联网搜索。云端业务模式与本地 headed/headless 浏览器模式是两个概念。定时采集未设置这些选项时使用普通搜索、不截图。
系统每个采集单元生成一个持久化上游幂等标识,重试保持标识及请求快照不变;重复采样分别调度。已保存上游任务编号时,服务重启恢复查询原任务。本版本通过后台轮询同步,不设置或接收上游 Callback。每次网络请求最多重试 3 次,仅网络异常、429 或 5xx 可重试;业务拒绝不盲目重试。单个采集最长等待 30 分钟,响应未确认或超时需要管理员核对原任务后决定下一步,不要直接换新幂等键重复采集。
回答、来源与截图
每个 platformRuns 项新增 collector、monitoringOptions、quotedPriceCents。answer.providerResult 包含 screenshotUrl、references、sentiment、mentionPosition、competitorRankings。未知值使用 null 或空数组。上游扣费金额、任务原始响应和凭据不通过服务商结果返回。
answer.citations 仅取上游 citationList 中实际引用的链接,按 URL 去重;references 是 referenceList 来源集合,不能当作实际引用次数。无法获取精确引用频次时,每个去重链接仅计一次。brandMentioned/mentionCount 仍采用本地关键词匹配,上游情感及位置另存于 providerResult。上游响应先保存到服务器数据库,完成的文字结果和图片落盘后再返回。图片独立按租户/服务商 UUID/任务 UUID/采样 UUID 存储,最多保留 90 天,到期立即拒绝访问,并由每分钟定时清理任务删除。截图缺失时 screenshotUrl 为 null;短期签名地址有效期最长一小时,也受密钥开关、有效期、接口开关和余额约束。链接到期请重新查询任务。第三方分享页可能需要登录;引用链接的 availability 表示最近检查状态,不保证第三方永久可用。
客户销售价与上游成本
对外基础费用为 0.25 元/次(25 分),一次指一个问题 × 一个平台 × 一轮采集。截图加价、接口请求费及客户专属价格按配置另计,实际扣费以 GET /api/v1/usage 返回的有效价格为准;具体价格请联系销售。文档报价更新不自动修改服务端扣费配置。
上游报价仅用于内部成本记录,不能视为客户销售价。服务商专属销售价优先于租户默认销售价。新增平台销售价未设置时拒绝受理。管理员可以修改每个平台的基础销售价和截图加价,以及每个 HTTP 接口的请求费(默认 0 分)。
采集总费 = 各采样基础销售价与所选截图加价之和 + runs.create 请求费。
金额单位为人民币整数分。GET /usage 的 pricing.platforms 与 pricing.operations 为权威价格;旧 webCents/mobileCents 仅兼容旧客户端,不能用于计算订单。
受理即扣款;失败、取消或截图缺失不自动退款。余额不足时不创建任务。事务同时提交任务、价格快照、扣款、流水、幂等记录,避免并发透支和重试重复扣费。相同客户可以跨密钥复用原幂等编号。
其他收费写入接口(创建品牌、添加问题)必须携带 Idempotency-Key;相同客户同接口同键同参重试不再扣费,异参返回 409。免费写入也建议携带此头。收费查询按每次成功受理的请求计费;HEAD 与 GET 使用相同接口价格。截图下载受理后按配置扣费,传输中断不自动退款。
上游异常
UPSTREAM_AUTH_ERROR:上游鉴权失败;UPSTREAM_BALANCE_ERROR:上游余额不足;UPSTREAM_REJECTED:请求被拒绝或平台暂不可用;UPSTREAM_NETWORK_ERROR / UPSTREAM_TIMEOUT:响应未确认或等待超时;UPSTREAM_SAMPLE_FAILED:没有有效回答;UPSTREAM_RESULT_MISMATCH:回答与请求不匹配。以上均不要由服务商自动创建新采集重试,应联系管理员核对。
停止任务时只能请求停止上游未分配的子任务,已运行任务可能继续完成并计费,不能据本地 cancelled 状态推断上游费用为零。
8. 身份与数据库隔离
服务商账户由服务端生成唯一 customerId,绑定到一个 tenantId。认证从密钥记录读取身份,不能通过请求体中的客户 ID 改变扣费对象。品牌通过 api_customer_brands 绑定客户,任务通过品牌归属做权限检查;幂等记录按客户分区,流水按客户与操作编号唯一约束。跨客户品牌授权被拒绝。
轮换密钥需在管理界面选择已有客户。新客户余额默认 0;管理员通过带 operationId 的核销操作充值,重复编号不重复入账。管理员可查看每个客户最近 200 笔流水、请求日志和价格快照。
dailyUsage 继续统计请求数,limit 固定为 0,remaining 为 null;旧每日限额字段被忽略,不返回次数限制响应头。接口开关、密钥状态、有效期和权限校验继续生效。
| 响应头 | 说明 |
|---|---|
| X-Request-Id | 请求追踪编号 |
| X-Billing-Charged-Cents | 本次实际扣费分数,幂等重试为 0 |
| X-Balance-Cents | 本次请求扣费后的余额 |
9. 管理员价格配置
管理端 GET /api/access-keys/prices?customerId=UUID 查看指定客户有效价,省略 customerId 返回默认价和内部成本。PATCH /api/access-keys/prices 支持以下数据:
{"kind":"platform","itemId":"chatgpt","baseCents":100,"screenshotCents":20}
上例仅说明字段,不代表正式销售价。增加 customerId 设置某客户专属价。kind=operation 时 itemId 为 runs.create 等接口标识,baseCents 为每请求费用;kind=cost 时只修改租户的上游成本。客户专属价可使用 reset:true 恢复默认。配置事务持久化,重启后保留,历史成交价不变。
10. 截图接口
GET /screenshots/{assetId} 使用 Bearer 密钥或短期 ticket。图片按租户/客户/任务/采样存储;签名绑定密钥与单张图片,最大有效期 1 小时,图片保留 90 天。不存在返回 404,到期返回 410,无授权返回 403。授权成功后按 screenshots.get 接口销售价计费(默认 0 分)。
管理端余额流水和调用日志新增 platform_ids_json 平台快照(JSON 数组),以客户唯一 ID 和租户关联任务。多平台任务记录全部平台;非平台操作或无法可靠关联的历史记录为 [],界面显示 —。余额流水和调用日志 CSV 均增加 AI 平台列,包含名称及平台 ID。历史回填不修改余额或扣费金额。
余额流水与调用日志新增 question_texts_json(问题文本快照数组),界面及 CSV 的“客户提问”列同步展示。优先保存任务创建时的问题快照,不使用后来编辑的问题文本替换历史内容。重复采样去重,多问题完整保存;无法可靠关联的历史记录显示 —。已鉴权的直接提交若创建失败,也保存请求中的合法长度问题文本;未鉴权请求不保存正文。