openapi: 3.0.3 info: title: 'dtcpack Developer API' description: 'GEO 数据服务 API,覆盖身份认证、监测项目、任务结果与财务数据。' version: 1.0.0 servers: - url: 'https://www.idtcpack.com' tags: - name: 'V2 1. 认证管理' description: '' - name: 'V2 2. 客户与项目' description: '' - name: 'V2 3. 项目与平台监测任务' description: '' - name: 'V2 4. 平台任务的每日执行与结果' description: '' - name: 'V2 5. 单个 Prompt 执行数据' description: '' - name: 'V2 6. 兼容接口(旧字段)' description: '' - name: 'V2 7. 财务管理' description: '' components: securitySchemes: default: type: http scheme: bearer description: '在个人中心 → API Keys 创建密钥,或通过登录接口获取 access_token。在请求头中添加 Authorization: Bearer {YOUR_API_KEY}。新 API Key 加密保存,可在本人 AI Prompt 弹窗中选择并自动填入;管理列表仅显示脱敏值。历史仅保存哈希的 Key 需手动粘贴。删除后立即失效。' security: - default: [] paths: /api/v2/auth/login: post: summary: 'API 登录获取 Token' operationId: aPIToken description: "用户通过邮箱和密码登录,获取 API 访问令牌\n也可在个人中心 → API Keys 创建多个访问密钥,使用相同的 Bearer 认证。\n当前令牌不会自动过期;登录令牌可通过登出接口撤销,个人中心创建的 API Key 可在管理页删除。" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 登录成功 data: token: 1|abc123def456... token_type: Bearer user: id: 1 name: 张三 email: user@example.com properties: success: type: boolean example: true message: type: string example: 登录成功 data: type: object properties: token: type: string example: 1|abc123def456... token_type: type: string example: Bearer user: type: object properties: id: type: integer example: 1 name: type: string example: 张三 email: type: string example: user@example.com 401: description: '' content: application/json: schema: type: object example: success: false message: 邮箱或密码错误 properties: success: type: boolean example: false message: type: string example: 邮箱或密码错误 tags: - 'V2 1. 认证管理' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 用户邮箱. example: user@example.com password: type: string description: 用户密码. example: password123 required: - email - password security: [] /api/v2/auth/user: get: summary: 获取当前用户信息 operationId: '' description: 获取当前认证用户的详细信息 parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true data: id: 1 name: 张三 email: user@example.com uuid: abc123-def456 last_login_time: '2024-01-15 10:30:00' amount: 1000.0 block_reason: null created_at: '2024-01-01 00:00:00' properties: success: type: boolean example: true data: type: object properties: id: type: integer example: 1 name: type: string example: 张三 email: type: string example: user@example.com uuid: type: string example: abc123-def456 last_login_time: type: string example: '2024-01-15 10:30:00' amount: type: number example: 1000.0 block_reason: type: string example: null nullable: true created_at: type: string example: '2024-01-01 00:00:00' tags: - 'V2 1. 认证管理' /api/v2/auth/logout: post: summary: 'API 登出' operationId: aPI description: '撤销当前使用的 API 访问令牌' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 登出成功 properties: success: type: boolean example: true message: type: string example: 登出成功 tags: - 'V2 1. 认证管理' /api/v2/geo/customer/projects: get: summary: 获取客户下的项目列表 operationId: '' description: "customer_id 是 Partner URL 的客户 ID;project_id 是 number_id 对应的项目 ID。\n接下来用 project_id 调用 /geo/project/tasks,取得各平台监测 task_id。" parameters: - in: query name: customer_id description: '客户 ID,取 /partner/{customer_id}/...,不是登录用户 ID.' example: 2004 required: true schema: type: integer description: '客户 ID,取 /partner/{customer_id}/...,不是登录用户 ID.' example: 2004 - in: query name: page description: '页码,从 1 开始.' example: 1 required: false schema: type: integer description: '页码,从 1 开始.' example: 1 - in: query name: per_page description: '每页项目数,1–100,默认 20.' example: 20 required: false schema: type: integer description: '每页项目数,1–100,默认 20.' example: 20 - in: query name: status description: 项目状态,-3=全部(默认),-2=欠费暂停,-1=暂停,0=待执行,1=进行中,2=完成. example: -3 required: false schema: type: integer description: 项目状态,-3=全部(默认),-2=欠费暂停,-1=暂停,0=待执行,1=进行中,2=完成. example: -3 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: current_page: 1 data: - customer_id: 2004 project_id: 1789951899 project_name: 示例品牌 brand_cate_desc: 运动鞋 brand_desc_list: 示例品牌 status: 1 status_name: 进行中 created_at: '2026-09-21 10:00:00' task_count: 2 prompts: - 推荐运动鞋 total: 1 per_page: 20 last_page: 1 properties: success: type: boolean example: true data: type: object properties: current_page: type: integer example: 1 data: type: array example: - customer_id: 2004 project_id: 1789951899 project_name: 示例品牌 brand_cate_desc: 运动鞋 brand_desc_list: 示例品牌 status: 1 status_name: 进行中 created_at: '2026-09-21 10:00:00' task_count: 2 prompts: - 推荐运动鞋 items: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 project_name: type: string example: 示例品牌 brand_cate_desc: type: string example: 运动鞋 brand_desc_list: type: string example: 示例品牌 status: type: integer example: 1 status_name: type: string example: 进行中 created_at: type: string example: '2026-09-21 10:00:00' task_count: type: integer example: 2 prompts: type: array example: - 推荐运动鞋 items: type: string total: type: integer example: 1 per_page: type: integer example: 20 last_page: type: integer example: 1 tags: - 'V2 2. 客户与项目' /api/v2/geo/project/tasks: get: summary: 获取项目下的全部平台监测任务 operationId: '' description: "一个项目有多个平台任务。task_id 是监测平台任务 ID,不是 Prompt 执行 ID。\n建议同时携带 customer_id,限定客户上下文。data 是完整数组,不分页。" parameters: - in: query name: project_id description: '项目 ID,取客户项目列表的 project_id(网页 number_id).' example: 1789951899 required: true schema: type: integer description: '项目 ID,取客户项目列表的 project_id(网页 number_id).' example: 1789951899 - in: query name: customer_id description: '可选客户 ID,用于限定该客户下的项目.' example: 2004 required: false schema: type: integer description: '可选客户 ID,用于限定该客户下的项目.' example: 2004 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - customer_id: 2004 project_id: 1789951899 task_id: 8494 task_name: 示例品牌 model_key: deepseek model_name: DeepSeek engine: deepseek status: 1 status_name: 进行中 properties: success: type: boolean example: true data: type: array example: - customer_id: 2004 project_id: 1789951899 task_id: 8494 task_name: 示例品牌 model_key: deepseek model_name: DeepSeek engine: deepseek status: 1 status_name: 进行中 items: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 task_name: type: string example: 示例品牌 model_key: type: string example: deepseek model_name: type: string example: DeepSeek engine: type: string example: deepseek status: type: integer example: 1 status_name: type: string example: 进行中 404: description: '' content: application/json: schema: type: object example: message: 项目不存在或无权限访问 properties: message: type: string example: 项目不存在或无权限访问 tags: - 'V2 3. 项目与平台监测任务' /api/v2/geo/task/info: get: summary: 获取一个平台监测任务的详情 operationId: '' description: '返回平台任务配置及其 customer_id、project_id 和 task_id。' parameters: - in: query name: task_id description: '平台监测任务 ID,取 /geo/project/tasks 的 task_id.' example: 8494 required: true schema: type: integer description: '平台监测任务 ID,取 /geo/project/tasks 的 task_id.' example: 8494 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: customer_id: 2004 project_id: 1789951899 task_id: 8494 task_name: 示例品牌 model_key: deepseek model_name: DeepSeek engine: deepseek status: 1 status_name: 进行中 properties: success: type: boolean example: true data: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 task_name: type: string example: 示例品牌 model_key: type: string example: deepseek model_name: type: string example: DeepSeek engine: type: string example: deepseek status: type: integer example: 1 status_name: type: string example: 进行中 tags: - 'V2 3. 项目与平台监测任务' /api/v2/geo/task/prompts: get: summary: '获取平台任务某一天的全部 Prompt 执行列表' operationId: Prompt description: "data 是完整数组,不分页。同一问题的多次执行保留不同 prompt_task_id。\n用返回的 prompt_task_id 调用 /geo/prompt/result 或 /geo/prompt/searches。" parameters: - in: query name: task_id description: '平台监测任务 ID,不是 Prompt 执行 ID.' example: 8494 required: true schema: type: integer description: '平台监测任务 ID,不是 Prompt 执行 ID.' example: 8494 - in: query name: date description: '单日日期 YYYY-MM-DD,默认昨天(Asia/Shanghai);区间需逐日请求.' example: '2026-10-13' required: false schema: type: string description: '单日日期 YYYY-MM-DD,默认昨天(Asia/Shanghai);区间需逐日请求.' example: '2026-10-13' responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 prompt_name: 推荐运动鞋 date_time: '2026-10-13' hours: 8 status: 2 model: deepseek engine: deepseek brand_exposure: 示例品牌 screenshot_url: 'https://example.com/screenshot.png' properties: success: type: boolean example: true data: type: array example: - customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 prompt_name: 推荐运动鞋 date_time: '2026-10-13' hours: 8 status: 2 model: deepseek engine: deepseek brand_exposure: 示例品牌 screenshot_url: 'https://example.com/screenshot.png' items: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 prompt_task_id: type: integer example: 1001 prompt_name: type: string example: 推荐运动鞋 date_time: type: string example: '2026-10-13' hours: type: integer example: 8 status: type: integer example: 2 model: type: string example: deepseek engine: type: string example: deepseek brand_exposure: type: string example: 示例品牌 screenshot_url: type: string example: 'https://example.com/screenshot.png' tags: - 'V2 4. 平台任务的每日执行与结果' /api/v2/geo/task/results: get: summary: '获取平台任务某一天的全部 Prompt 结果与排名' operationId: Prompt description: "可直接按平台 task_id + date 获取结果,无需逐条调用单 Prompt 接口。\n每条包含 prompt_task_id。data.data 为结果数组,读取全部分页才是完整日数据。\n尚无回答的执行也会返回:result_status=missing、answer/think=null;排名仍按真实数据返回。" parameters: - in: query name: task_id description: '平台监测任务 ID.' example: 8494 required: true schema: type: integer description: '平台监测任务 ID.' example: 8494 - in: query name: date description: '单日日期 YYYY-MM-DD,默认昨天(Asia/Shanghai);区间需逐日请求.' example: '2026-10-13' required: false schema: type: string description: '单日日期 YYYY-MM-DD,默认昨天(Asia/Shanghai);区间需逐日请求.' example: '2026-10-13' - in: query name: page description: '页码,从 1 开始.' example: 1 required: false schema: type: integer description: '页码,从 1 开始.' example: 1 - in: query name: per_page description: '每页执行记录数,1–100,默认 20.' example: 100 required: false schema: type: integer description: '每页执行记录数,1–100,默认 20.' example: 100 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: current_page: 1 data: - customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 prompt_name: 推荐运动鞋 date_time: '2026-10-13' hours: 8 status: 2 model: deepseek engine: deepseek brand_exposure: 示例品牌 screenshot_url: null result_status: available answer: 推荐示例品牌 think: 分析思路 rank_exposure: 示例品牌 rank_exposure_number: '1' rank_details: - brand: 示例品牌 brand_short: 示例 position: 1 visibility: 80 score: 90 total: 1 per_page: 100 last_page: 1 properties: success: type: boolean example: true data: type: object properties: current_page: type: integer example: 1 data: type: array example: - customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 prompt_name: 推荐运动鞋 date_time: '2026-10-13' hours: 8 status: 2 model: deepseek engine: deepseek brand_exposure: 示例品牌 screenshot_url: null result_status: available answer: 推荐示例品牌 think: 分析思路 rank_exposure: 示例品牌 rank_exposure_number: '1' rank_details: - brand: 示例品牌 brand_short: 示例 position: 1 visibility: 80 score: 90 items: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 prompt_task_id: type: integer example: 1001 prompt_name: type: string example: 推荐运动鞋 date_time: type: string example: '2026-10-13' hours: type: integer example: 8 status: type: integer example: 2 model: type: string example: deepseek engine: type: string example: deepseek brand_exposure: type: string example: 示例品牌 screenshot_url: type: string example: null nullable: true result_status: type: string example: available answer: type: string example: 推荐示例品牌 think: type: string example: 分析思路 rank_exposure: type: string example: 示例品牌 rank_exposure_number: type: string example: '1' rank_details: type: array example: - brand: 示例品牌 brand_short: 示例 position: 1 visibility: 80 score: 90 items: type: object properties: brand: type: string example: 示例品牌 brand_short: type: string example: 示例 position: type: integer example: 1 visibility: type: integer example: 80 score: type: integer example: 90 total: type: integer example: 1 per_page: type: integer example: 100 last_page: type: integer example: 1 tags: - 'V2 4. 平台任务的每日执行与结果' /api/v2/geo/prompt/detail: get: summary: '获取单个 Prompt 执行的基础信息' operationId: Prompt description: 'prompt_task_id 是某天、某平台、某次问题执行的 ID,不是问题文本的固定配置 ID。' parameters: - in: query name: prompt_task_id description: 'Prompt 执行 ID,取 /geo/task/prompts 或 /geo/task/results 的 prompt_task_id.' example: 1001 required: true schema: type: integer description: 'Prompt 执行 ID,取 /geo/task/prompts 或 /geo/task/results 的 prompt_task_id.' example: 1001 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 prompt_name: 推荐运动鞋 date_time: '2026-10-13' hours: 8 status: 2 model: deepseek engine: deepseek brand_exposure: 示例品牌 screenshot_url: null properties: success: type: boolean example: true data: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 prompt_task_id: type: integer example: 1001 prompt_name: type: string example: 推荐运动鞋 date_time: type: string example: '2026-10-13' hours: type: integer example: 8 status: type: integer example: 2 model: type: string example: deepseek engine: type: string example: deepseek brand_exposure: type: string example: 示例品牌 screenshot_url: type: string example: null nullable: true tags: - 'V2 5. 单个 Prompt 执行数据' /api/v2/geo/prompt/result: get: summary: '获取单个 Prompt 执行的回答与排名' operationId: Prompt description: "answer/think 是该执行最新保存的回答版本;rank_details 为品牌与排名的真实对应关系。\n无回答时仍返回执行记录,result_status=missing,不能将空排名当作第 0 名。" parameters: - in: query name: prompt_task_id description: 'Prompt 执行 ID,不是平台 task_id.' example: 1001 required: true schema: type: integer description: 'Prompt 执行 ID,不是平台 task_id.' example: 1001 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 prompt_name: 推荐运动鞋 date_time: '2026-10-13' result_status: available answer: 推荐示例品牌 think: 分析思路 rank_exposure: 示例品牌 rank_exposure_number: '1' rank_details: - brand: 示例品牌 brand_short: 示例 position: 1 visibility: 80 score: 90 properties: success: type: boolean example: true data: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 prompt_task_id: type: integer example: 1001 prompt_name: type: string example: 推荐运动鞋 date_time: type: string example: '2026-10-13' result_status: type: string example: available answer: type: string example: 推荐示例品牌 think: type: string example: 分析思路 rank_exposure: type: string example: 示例品牌 rank_exposure_number: type: string example: '1' rank_details: type: array example: - brand: 示例品牌 brand_short: 示例 position: 1 visibility: 80 score: 90 items: type: object properties: brand: type: string example: 示例品牌 brand_short: type: string example: 示例 position: type: integer example: 1 visibility: type: integer example: 80 score: type: integer example: 90 tags: - 'V2 5. 单个 Prompt 执行数据' /api/v2/geo/prompt/searches: get: summary: '获取单个 Prompt 执行的全部信源(分页)' operationId: Prompt description: "data.data 为信源数组,分页字段是 data.current_page/last_page/total/per_page。\n读取所有页;信源存在或有 cite_index 不代表回答正文实际采纳该信源。" parameters: - in: query name: prompt_task_id description: 'Prompt 执行 ID.' example: 1001 required: true schema: type: integer description: 'Prompt 执行 ID.' example: 1001 - in: query name: page description: '页码,从 1 开始.' example: 1 required: false schema: type: integer description: '页码,从 1 开始.' example: 1 - in: query name: per_page description: '每页信源数,1–1000,默认 100.' example: 1000 required: false schema: type: integer description: '每页信源数,1–1000,默认 100.' example: 1000 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: current_page: 1 data: - customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 source_id: 5001 url: 'https://example.com/source' title: 示例信源 domain: example.com cite_index: '1' snippet: 摘要 upstream_task_id: opaque-ai-id total: 1 per_page: 1000 last_page: 1 properties: success: type: boolean example: true data: type: object properties: current_page: type: integer example: 1 data: type: array example: - customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 source_id: 5001 url: 'https://example.com/source' title: 示例信源 domain: example.com cite_index: '1' snippet: 摘要 upstream_task_id: opaque-ai-id items: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 prompt_task_id: type: integer example: 1001 source_id: type: integer example: 5001 url: type: string example: 'https://example.com/source' title: type: string example: 示例信源 domain: type: string example: example.com cite_index: type: string example: '1' snippet: type: string example: 摘要 upstream_task_id: type: string example: opaque-ai-id total: type: integer example: 1 per_page: type: integer example: 1000 last_page: type: integer example: 1 tags: - 'V2 5. 单个 Prompt 执行数据' /api/v2/geo/prompt/screenshot: get: summary: '获取单个 Prompt 执行的截图' operationId: Prompt description: '' parameters: - in: query name: prompt_task_id description: 'Prompt 执行 ID.' example: 1001 required: true schema: type: integer description: 'Prompt 执行 ID.' example: 1001 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: customer_id: 2004 project_id: 1789951899 task_id: 8494 prompt_task_id: 1001 screenshot_status: 2 screenshot_url: 'https://example.com/screenshot.png' properties: success: type: boolean example: true data: type: object properties: customer_id: type: integer example: 2004 project_id: type: integer example: 1789951899 task_id: type: integer example: 8494 prompt_task_id: type: integer example: 1001 screenshot_status: type: integer example: 2 screenshot_url: type: string example: 'https://example.com/screenshot.png' tags: - 'V2 5. 单个 Prompt 执行数据' /api/v2/geo/project/create: post: summary: '创建 GEO 项目' operationId: GEO description: "创建一个新的GEO品牌监测项目,支持多个AI平台同时监测\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 项目创建成功 data: number_id: 1702888800 project_ids: - 123 - 124 - 125 properties: success: type: boolean example: true message: type: string example: 项目创建成功 data: type: object properties: number_id: type: integer example: 1702888800 project_ids: type: array example: - 123 - 124 - 125 items: type: integer 400: description: '' content: application/json: schema: type: object example: success: false message: 项目名称不能为空 properties: success: type: boolean example: false message: type: string example: 项目名称不能为空 tags: - 'V2 6. 兼容接口(旧字段)' requestBody: required: true content: application/json: schema: type: object properties: brand: type: string description: 项目名称/品牌名称. example: 耐克 brand_desc: type: string description: 品牌列表,使用逗号分隔. example: '"耐克,阿迪达斯,彪马"' diy_prompt: type: string description: 自定义监测Prompt,使用逗号分隔. example: '"推荐运动鞋品牌,哪个运动品牌好"' ai_platform: type: string description: '选择的AI监测平台,使用逗号分隔. 可用平台: deepseek, yuanbao, yuanbao_auto, kimi_back, wenxiaoyan, nami, doubao, baidu, baidu_without_search, baidu_default, ai_douyin , qwen.' example: '"deepseek,doubao,yuanbao"' week_restart: type: integer description: 监测频次:0=每天,1=每周,2=本次,3=重查. example: 0 only_rank: type: integer description: 仅排名监测:0=否,1=是. example: 0 rank_match: type: integer description: 排名精确匹配:0=否,1=是. example: 0 required: - brand - brand_desc - diy_prompt - ai_platform /api/v2/geo/project/edit: post: summary: '编辑 GEO 项目' operationId: GEO description: "更新现有GEO监测项目的配置信息,包括品牌列表、prompt、监测类型等\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 项目更新成功 properties: success: type: boolean example: true message: type: string example: 项目更新成功 400: description: '' content: application/json: schema: type: object example: success: false message: 请至少选择一个监测平台 properties: success: type: boolean example: false message: type: string example: 请至少选择一个监测平台 tags: - 'V2 6. 兼容接口(旧字段)' requestBody: required: true content: application/json: schema: type: object properties: number_id: type: integer description: 项目批次ID. example: 1702888800 brand_desc: type: string description: 品牌列表,使用逗号分隔. example: '"耐克,阿迪达斯,彪马"' diy_prompt: type: string description: 自定义监测Prompt,使用逗号分隔. example: '"推荐运动鞋品牌,哪个运动品牌好"' ai_platform: type: string description: 选择的AI监测平台,使用逗号分隔. example: '"deepseek,doubao,yuanbao"' week_restart: type: integer description: 监测频次:0=每天,1=每周,2=本次,3=重查. example: 0 only_rank: type: integer description: 仅排名监测:0=否,1=是. example: 0 rank_match: type: integer description: 排名精确匹配:0=否,1=是. example: 0 required: - number_id - brand_desc - diy_prompt - ai_platform /api/v2/geo/project/list: get: summary: 获取我的项目列表 operationId: '' description: "获取当前用户的所有GEO监测项目,一个项目会包含多个监测平台的数据\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: page description: 页码. example: 1 required: false schema: type: integer description: 页码. example: 1 - in: query name: per_page description: 每页数量. example: 20 required: false schema: type: integer description: 每页数量. example: 20 - in: query name: my_project_id description: '客户 ID(Partner URL 中 /partner/ 后的 ID),仅返回该客户下当前用户有权读取的监测任务.' example: 2039 required: false schema: type: integer description: '客户 ID(Partner URL 中 /partner/ 后的 ID),仅返回该客户下当前用户有权读取的监测任务.' example: 2039 - in: query name: status description: 项目状态筛选:-3=全部,-2=欠费暂停,-1=暂停,0=待执行,1=进行中,2=已完成. example: 1 required: false schema: type: integer description: 项目状态筛选:-3=全部,-2=欠费暂停,-1=暂停,0=待执行,1=进行中,2=已完成. example: 1 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: current_page: 1 data: - number_id: 1702888800 brand_name: 耐克 brand_cate_desc: 耐克 brand_desc_list: "耐克\n阿迪达斯" status: 1 status_name: 进行中 created_at: '2024-01-01 12:00:00' projects: - project_id: 123 model_key: chatgpt model_name: ChatGPT prompts: - 推荐运动鞋品牌 - 哪个运动品牌好 total: 100 per_page: 20 last_page: 5 properties: success: type: boolean example: true data: type: object properties: current_page: type: integer example: 1 data: type: array example: - number_id: 1702888800 brand_name: 耐克 brand_cate_desc: 耐克 brand_desc_list: "耐克\n阿迪达斯" status: 1 status_name: 进行中 created_at: '2024-01-01 12:00:00' projects: - project_id: 123 model_key: chatgpt model_name: ChatGPT prompts: - 推荐运动鞋品牌 - 哪个运动品牌好 items: type: object properties: number_id: type: integer example: 1702888800 brand_name: type: string example: 耐克 brand_cate_desc: type: string example: 耐克 brand_desc_list: type: string example: "耐克\n阿迪达斯" status: type: integer example: 1 status_name: type: string example: 进行中 created_at: type: string example: '2024-01-01 12:00:00' projects: type: array example: - project_id: 123 model_key: chatgpt model_name: ChatGPT items: type: object properties: project_id: type: integer example: 123 model_key: type: string example: chatgpt model_name: type: string example: ChatGPT prompts: type: array example: - 推荐运动鞋品牌 - 哪个运动品牌好 items: type: string total: type: integer example: 100 per_page: type: integer example: 20 last_page: type: integer example: 5 tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/geo/project/detail: get: summary: 获取单个项目详情 operationId: '' description: "根据number_id获取项目的详细信息,包括所有平台、prompts等\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: number_id description: 项目批次ID. example: 1702888800 required: true schema: type: integer description: 项目批次ID. example: 1702888800 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: number_id: 1702888800 brand_name: 耐克 brand_cate_desc: 耐克 brand_desc_list: "耐克\n阿迪达斯" status: 1 status_name: 进行中 week_restart: 0 only_rank: 0 rank_match: 1 created_at: '2024-01-01 12:00:00' projects: - project_id: 123 model_key: deepseek model_name: DeepSeek prompts: - 推荐运动鞋品牌 - 哪个运动品牌好 brand_urls: - 'https://www.nike.com' emails: - user@example.com properties: success: type: boolean example: true data: type: object properties: number_id: type: integer example: 1702888800 brand_name: type: string example: 耐克 brand_cate_desc: type: string example: 耐克 brand_desc_list: type: string example: "耐克\n阿迪达斯" status: type: integer example: 1 status_name: type: string example: 进行中 week_restart: type: integer example: 0 only_rank: type: integer example: 0 rank_match: type: integer example: 1 created_at: type: string example: '2024-01-01 12:00:00' projects: type: array example: - project_id: 123 model_key: deepseek model_name: DeepSeek items: type: object properties: project_id: type: integer example: 123 model_key: type: string example: deepseek model_name: type: string example: DeepSeek prompts: type: array example: - 推荐运动鞋品牌 - 哪个运动品牌好 items: type: string brand_urls: type: array example: - 'https://www.nike.com' items: type: string emails: type: array example: - user@example.com items: type: string 404: description: '' content: application/json: schema: type: object example: success: false message: 项目不存在 properties: success: type: boolean example: false message: type: string example: 项目不存在 tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/geo/task/list: get: summary: 获取项目下某一天的所有任务 operationId: '' description: "根据项目ID和日期获取所有的监测任务列表\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: project_id description: '平台项目ID,取项目列表 data.data[].projects[].project_id.' example: 123 required: true schema: type: integer description: '平台项目ID,取项目列表 data.data[].projects[].project_id.' example: 123 - in: query name: date description: 日期,格式:Y-m-d,默认为今天. example: '2026-10-14' required: false schema: type: string description: 日期,格式:Y-m-d,默认为今天. example: '2026-10-14' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - project_id: 123 task_id: 1001 prompt_name: 推荐运动鞋品牌 status: 2 model: chatgpt sceenshot_result: 'https://example.com/screenshot.png' date_time: '2026-10-14' brand_exposure: '耐克,阿迪达斯' properties: success: type: boolean example: true data: type: array example: - project_id: 123 task_id: 1001 prompt_name: 推荐运动鞋品牌 status: 2 model: chatgpt sceenshot_result: 'https://example.com/screenshot.png' date_time: '2026-10-14' brand_exposure: '耐克,阿迪达斯' items: type: object properties: project_id: type: integer example: 123 task_id: type: integer example: 1001 prompt_name: type: string example: 推荐运动鞋品牌 status: type: integer example: 2 model: type: string example: chatgpt sceenshot_result: type: string example: 'https://example.com/screenshot.png' date_time: type: string example: '2026-10-14' brand_exposure: type: string example: '耐克,阿迪达斯' tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/geo/task/detail: get: summary: 获取任务基础信息 operationId: '' description: "使用每日任务列表返回的 task_id 获取问题、平台、执行状态和日期。\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: task_id description: '每日任务ID(任务列表中的 task_id).' example: 1001 required: true schema: type: integer description: '每日任务ID(任务列表中的 task_id).' example: 1001 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: project_id: 123 task_id: 1001 prompt_name: 推荐运动鞋品牌 status: 2 model: deepseek engine: deepseek date_time: '2026-10-14' brand_exposure: 耐克 sceenshot_result: null created_at: '2026-10-14 08:00:00' updated_at: '2026-10-14 08:05:00' properties: success: type: boolean example: true data: type: object properties: project_id: type: integer example: 123 task_id: type: integer example: 1001 prompt_name: type: string example: 推荐运动鞋品牌 status: type: integer example: 2 model: type: string example: deepseek engine: type: string example: deepseek date_time: type: string example: '2026-10-14' brand_exposure: type: string example: 耐克 sceenshot_result: type: string example: null nullable: true created_at: type: string example: '2026-10-14 08:00:00' updated_at: type: string example: '2026-10-14 08:05:00' 404: description: '' content: application/json: schema: type: object example: success: false message: 任务不存在或者无权限访问 properties: success: type: boolean example: false message: type: string example: 任务不存在或者无权限访问 tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/geo/task/result: get: summary: 获取任务的问答结果、思考过程和排名 operationId: '' description: "根据send_task的ID获取AI的回答内容和思考过程\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: task_id description: 任务ID(send_task的ID). example: 1001 required: true schema: type: integer description: 任务ID(send_task的ID). example: 1001 - in: query name: with_products description: '是否附带该任务命中的商品数据;1 开启,默认 0 关闭。开启后返回体的 data 中会新增 products 字段(无商品数据时为空数组[])。仅豆包 App / 千问 App 系列模型有商品数据,其它模型统一返回 []。' example: 1 required: false schema: type: integer description: '是否附带该任务命中的商品数据;1 开启,默认 0 关闭。开启后返回体的 data 中会新增 products 字段(无商品数据时为空数组[])。仅豆包 App / 千问 App 系列模型有商品数据,其它模型统一返回 []。' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: project_id: 123 task_id: 1001 answer: '根据市场调研和用户反馈,推荐以下运动鞋品牌:1. 耐克...' think: 分析思路:首先考虑品牌知名度... brand_exposure: '耐克,阿迪达斯,彪马' model: chatgpt engine: chatgpt_api prompt_name: 推荐运动鞋品牌 date_time: '2026-10-13' rank_exposure: 耐克 rank_exposure_number: '1' rank_details: - brand: 耐克 brand_short: 耐克 position: 1 visibility: 1 score: 100 products: [] properties: success: type: boolean example: true data: type: object properties: project_id: type: integer example: 123 task_id: type: integer example: 1001 answer: type: string example: '根据市场调研和用户反馈,推荐以下运动鞋品牌:1. 耐克...' think: type: string example: 分析思路:首先考虑品牌知名度... brand_exposure: type: string example: '耐克,阿迪达斯,彪马' model: type: string example: chatgpt engine: type: string example: chatgpt_api prompt_name: type: string example: 推荐运动鞋品牌 date_time: type: string example: '2026-10-13' rank_exposure: type: string example: 耐克 rank_exposure_number: type: string example: '1' rank_details: type: array example: - brand: 耐克 brand_short: 耐克 position: 1 visibility: 1 score: 100 items: type: object properties: brand: type: string example: 耐克 brand_short: type: string example: 耐克 position: type: integer example: 1 visibility: type: integer example: 1 score: type: integer example: 100 products: type: array example: [] 404: description: '' content: application/json: schema: type: object example: success: false message: 未找到结果 properties: success: type: boolean example: false message: type: string example: 未找到结果 tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/geo/task/screenshot: get: summary: 获取任务的截图结果 operationId: '' description: "根据send_task的ID获取截图URL\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: task_id description: 任务ID(send_task的ID). example: 1001 required: true schema: type: integer description: 任务ID(send_task的ID). example: 1001 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: task_id: 1001 sc_status: 2 sceenshot_result: 'https://example.com/screenshots/abc123.png' properties: success: type: boolean example: true data: type: object properties: task_id: type: integer example: 1001 sc_status: type: integer example: 2 sceenshot_result: type: string example: 'https://example.com/screenshots/abc123.png' 404: description: '' content: application/json: schema: type: object example: success: false message: 任务不存在 properties: success: type: boolean example: false message: type: string example: 任务不存在 tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/geo/task/searches: get: summary: 获取任务的信息源列表 operationId: '' description: "根据send_task的ID获取AI搜索的信息源列表\n\n兼容旧接口:my_project_id 是客户 ID,number_id 是项目 ID;旧 project_id 是平台监测任务 ID,旧 task_id 是 Prompt 执行 ID。\n新接入请使用客户 / 项目 / 平台 / Prompt 分组的层级接口;本接口保持旧字段及原有行为。" parameters: - in: query name: task_id description: 任务ID(send_task的ID). example: 1001 required: true schema: type: integer description: 任务ID(send_task的ID). example: 1001 - in: query name: limit description: '返回数量限制,默认 10,范围 1–1000.' example: 10 required: false schema: type: integer description: '返回数量限制,默认 10,范围 1–1000.' example: 10 nullable: true - in: query name: page description: '可选页码,从1开始。传入后返回 pagination(current_page、last_page、per_page、total),data 仍为信源数组.' example: 1 required: false schema: type: integer description: '可选页码,从1开始。传入后返回 pagination(current_page、last_page、per_page、total),data 仍为信源数组.' example: 1 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - id: 2001 task_ai_id: abc123 task_prompt_id: 1001 url: 'https://www.nike.com/article/best-shoes' title: 2024年最佳运动鞋推荐 site_name: Nike官网 site_icon: 'https://www.nike.com/favicon.ico' cite_index: '1' published_at: '2024-01-10' snippet: 耐克推出的最新运动鞋系列... domain: nike.com properties: success: type: boolean example: true data: type: array example: - id: 2001 task_ai_id: abc123 task_prompt_id: 1001 url: 'https://www.nike.com/article/best-shoes' title: 2024年最佳运动鞋推荐 site_name: Nike官网 site_icon: 'https://www.nike.com/favicon.ico' cite_index: '1' published_at: '2024-01-10' snippet: 耐克推出的最新运动鞋系列... domain: nike.com items: type: object properties: id: type: integer example: 2001 task_ai_id: type: string example: abc123 task_prompt_id: type: integer example: 1001 url: type: string example: 'https://www.nike.com/article/best-shoes' title: type: string example: 2024年最佳运动鞋推荐 site_name: type: string example: Nike官网 site_icon: type: string example: 'https://www.nike.com/favicon.ico' cite_index: type: string example: '1' published_at: type: string example: '2024-01-10' snippet: type: string example: 耐克推出的最新运动鞋系列... domain: type: string example: nike.com tags: - 'V2 6. 兼容接口(旧字段)' /api/v2/finance/balance: get: summary: 获取当前用户余额 operationId: '' description: 获取当前认证用户的账户余额信息 parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true data: amount: 1000.0 user_id: 1 user_name: 张三 properties: success: type: boolean example: true data: type: object properties: amount: type: number example: 1000.0 user_id: type: integer example: 1 user_name: type: string example: 张三 tags: - 'V2 7. 财务管理' /api/v2/finance/deduction/details: get: summary: 获取扣费详情 operationId: '' description: "按旧扣费关联 ID 和时间范围查询当前用户的扣费记录。\n本接口保留旧字段:project_id 实际表示关联的 Prompt 执行 ID(新 GEO prompt_task_id),不是网页 number_id 对应的项目 ID。" parameters: - in: query name: project_id description: '兼容旧字段:扣费关联的 Prompt 执行 ID(可选),不是新 GEO project_id.' example: 1001 required: false schema: type: integer description: '兼容旧字段:扣费关联的 Prompt 执行 ID(可选),不是新 GEO project_id.' example: 1001 - in: query name: start_date description: 开始日期(可选)格式:Y-m-d. example: '2024-01-01' required: false schema: type: string description: 开始日期(可选)格式:Y-m-d. example: '2024-01-01' - in: query name: end_date description: 结束日期(可选)格式:Y-m-d. example: '2024-01-31' required: false schema: type: string description: 结束日期(可选)格式:Y-m-d. example: '2024-01-31' - in: query name: page description: 页码. example: 1 required: false schema: type: integer description: 页码. example: 1 - in: query name: per_page description: 每页数量. example: 20 required: false schema: type: integer description: 每页数量. example: 20 responses: 200: description: '' content: application/json: schema: type: object example: success: true data: current_page: 1 data: - id: 1 user_id: 1 project_id: 123 diff_amount: -10.0 before_amount: 1010.0 after_amount: 1000.0 remark: 项目监测扣费 created_at: '2024-01-15 10:30:00' total: 100 per_page: 20 last_page: 5 properties: success: type: boolean example: true data: type: object properties: current_page: type: integer example: 1 data: type: array example: - id: 1 user_id: 1 project_id: 123 diff_amount: -10 before_amount: 1010 after_amount: 1000 remark: 项目监测扣费 created_at: '2024-01-15 10:30:00' items: type: object properties: id: type: integer example: 1 user_id: type: integer example: 1 project_id: type: integer example: 123 diff_amount: type: number example: -10.0 before_amount: type: number example: 1010.0 after_amount: type: number example: 1000.0 remark: type: string example: 项目监测扣费 created_at: type: string example: '2024-01-15 10:30:00' total: type: integer example: 100 per_page: type: integer example: 20 last_page: type: integer example: 5 tags: - 'V2 7. 财务管理'