查询任务
POST https://maxaeo.cn/geoapi/geodata/developer/task/get按 task_id 读取任务的最新状态;任务成功后,响应里包含完整结果。不消耗点数。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
task_id |
string | 是 | 提交任务或任务列表返回的任务 ID,最长 64 个字符 |
能查询哪些任务:同一用户在个人账户下提交的所有任务,不论用的是哪个 API Key,还是在控制台在线调试提交的。提交它的 Key 被停用或删除后,可以用其他有效 Key 查询。
curl -X POST "https://maxaeo.cn/geoapi/geodata/developer/task/get" \ -H "Authorization: Bearer $MAXAEO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"task_id": "task_3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9d1e23"}'import osimport time
import requests
URL = "https://maxaeo.cn/geoapi/geodata/developer/task/get"HEADERS = {"Authorization": f"Bearer {os.environ['MAXAEO_API_KEY']}"}
def wait_task(task_id, interval=15): while True: data = requests.post(URL, headers=HEADERS, json={"task_id": task_id}, timeout=30).json() if data["ret"] != 1: raise RuntimeError(f"ret={data['ret']}: {data['msg']}") task = data["data"]["ent"] if task["status"] in ("succeeded", "failed", "canceled"): return task time.sleep(interval)
task = wait_task("task_3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9d1e23")print(task["status"], task["answer"][:200])const TASK_GET_URL = "https://maxaeo.cn/geoapi/geodata/developer/task/get";const headers = { Authorization: `Bearer ${process.env.MAXAEO_API_KEY}`, "Content-Type": "application/json",};
async function waitTask(taskId, intervalMs = 15_000) { for (;;) { const resp = await fetch(TASK_GET_URL, { method: "POST", headers, body: JSON.stringify({ task_id: taskId }) }); const data = await resp.json(); if (data.ret !== 1) throw new Error(`ret=${data.ret}: ${data.msg}`); const task = data.data.ent; if (["succeeded", "failed", "canceled"].includes(task.status)) return task; await new Promise((resolve) => setTimeout(resolve, intervalMs)); }}
const task = await waitTask("task_3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9d1e23");console.log(task.status, task.answer.slice(0, 200));data.ent 是任务对象。按 status 读取:
- 未结束(
queued/dispatching/pending/running):结果字段为空,credits为预占点数,继续轮询。 succeeded:answer是回答正文,raw_result是结构化结果(引用来源、执行过程、卡片等),credits为扣除的点数。failed/canceled:原因在error_code与error_message,credits为0。
成功任务的响应示例(answer、result_json 等长文本已截断):
{ "ret": 1, "data": { "ent": { "thinking": false, "task_id": "task_3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9d1e23", "platform": "doubao", "query": "适合程序员的机械键盘推荐", "status": "succeeded", "answer": "给程序员选机械键盘,可以重点看手感、配列和长时间打字的舒适度……", "result_json": "{\"taskId\":\"task_3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9d1e23\",\"platform\":\"doubao\",…}", "share_link": "https://www.doubao.com/thread/…", "error_code": "", "error_message": "", "started_at": 1793018431, "finished_at": 1793018497, "created_at": 1793018425, "updated_at": 1793018503, "monitor_date": "2026-10-26", "priority": 2, "country": "", "credits": 3, "raw_result": { "taskId": "task_3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9d1e23", "platform": "doubao", "monitorDate": "2026-10-26", "query": "适合程序员的机械键盘推荐", "success": true, "rawContent": "给程序员选机械键盘,可以重点看手感、配列和长时间打字的舒适度……", "references": [ { "rank": 1, "title": "2026 年机械键盘选购指南", "url": "https://www.example.com/keyboard-guide", "snippet": "从轴体、配列到键帽材质,一文讲清机械键盘怎么选……", "source": "示例科技", "domain": "www.example.com", "cited": true }, { "rank": 2, "title": "程序员常用键盘配列对比", "url": "https://blog.example.org/layouts", "domain": "blog.example.org", "cited": false } ], "shareLink": "https://www.doubao.com/thread/…", "elapsedMs": "48213", "completedAt": "2026-10-26T12:41:37.512Z", "priority": 2, "agentSteps": [ { "type": "search", "queries": ["程序员 机械键盘 推荐 2026"] } ], "conversationId": "…", "messageId": "…" } } }}平台执行失败的任务示例:
{ "ret": 1, "data": { "ent": { "thinking": false, "task_id": "task_9b2e4f60-1c3d-4e8a-b7f5-2d6c8a0e4b19", "platform": "deepseek", "query": "跑步新手应该怎么选第一双跑鞋?", "status": "failed", "answer": "", "result_json": "{\"taskId\":\"task_9b2e4f60-1c3d-4e8a-b7f5-2d6c8a0e4b19\",\"error\":\"{\\\"zh\\\":\\\"平台抓取失败,本次不扣费,请稍后重试或更换平台\\\",\\\"en\\\":\\\"The platform crawl failed. No credits were charged. Please try again later or choose another platform.\\\"}\",…}", "share_link": "", "error_code": "crawl_failed", "error_message": "{\"zh\":\"平台抓取失败,本次不扣费,请稍后重试或更换平台\",\"en\":\"The platform crawl failed. No credits were charged. Please try again later or choose another platform.\"}", "started_at": 0, "finished_at": 1793007356, "created_at": 1793006882, "updated_at": 1793007363, "monitor_date": "2026-10-26", "priority": 2, "country": "", "credits": 0, "raw_result": { "taskId": "task_9b2e4f60-1c3d-4e8a-b7f5-2d6c8a0e4b19", "platform": "deepseek", "monitorDate": "2026-10-26", "query": "跑步新手应该怎么选第一双跑鞋?", "error": "{\"zh\":\"平台抓取失败,本次不扣费,请稍后重试或更换平台\",\"en\":\"The platform crawl failed. No credits were charged. Please try again later or choose another platform.\"}", "elapsedMs": "2", "completedAt": "2026-10-26T09:35:56.853Z", "priority": 2 } } }}error_message 和 raw_result.error 是 {"zh","en"} JSON 字符串,解析后按语言展示;程序判断请用 error_code,不要按文案。
外层的 thinking 是提交时请求的思考模式。上面两个任务都没有开启思考,所以 raw_result 里没有 thinking;请求开启且实际生效时,raw_result 里会有 "thinking": true,见思考模式。
注意 started_at 可能为 0:如果任务直接拿到最终结果、没有观察到执行中的状态,就不会记录开始时间。计算耗时请用 finished_at - created_at(含排队)或 raw_result.elapsedMs(仅执行)。
- 每 15 秒左右查询一次即可,查得更勤通常拿到的是同一个状态。见任务生命周期。
- 任务没有服务端截止时间,排队可能较久;超过你自己的业务超时后可以先放下,之后再用
task_id取结果。 - 判断是否结束只看
status,不要因为error_code非空就停止轮询。
ret |
原因 |
|---|---|
1001 |
task_id 为空或超过 64 个字符,或请求体含未定义的字段 |
1030 |
API Key 无效 |
1031 |
任务不存在,或不属于当前用户 |
1003 |
账户权限异常(少见),请联系我们 |
-1 |
服务暂时不可用,可以直接重试 |
