一、精准解析 API(需 Token,适合正式场景)
适用场景
文件较大(≤ 200MB,≤ 200 页)
需要高精度解析
支持批量上传(单次 ≤ 50 个)
核心接口
| 步骤 | 接口 | 说明 |
|---|---|---|
| 1 | POST /api/v4/file-urls/batch | 申请上传链接 |
| 2 | PUT <file_url> | 上传文件到 OSS |
| 3 | 系统自动提交解析任务 | 无需手动提交 |
| 4 | GET /api/v4/extract-results/batch/{batch_id} | 查询结果 |
流程
Python 示例
import requests token = "API管理页面自定创建的token" url = "https://mineru.net/api/v4/file-urls/batch" header = { "Content-Type": "application/json", "Authorization": f"Bearer {token}" } data = { "files": [ {"name": "demo.pdf", "data_id": "abcd"} ], "model_version": "vlm" } file_path = ["demo.pdf"] try: # 第一步:申请上传链接 response = requests.post(url, headers=header, json=data) if response.status_code == 200: result = response.json() if result["code"] == 0: batch_id = result["data"]["batch_id"] urls = result["data"]["file_urls"] print(f"batch_id: {batch_id}") # 第二步:上传文件 for i in range(len(urls)): with open(file_path[i], 'rb') as f: res_upload = requests.put(urls[i], data=f) if res_upload.status_code == 200: print(f"{urls[i]} 上传成功") else: print(f"{urls[i]} 上传失败") else: print(f"申请上传链接失败: {result['msg']}") else: print(f"请求失败: {response.status_code}") except Exception as err: print(err)| 注意点 | 说明 |
|---|---|
| 上传链接有效期 | 24 小时,需在有效期内完成上传 |
| 上传时请求头 | 无须设置Content-Type |
| 自动提交 | 文件上传完成后,系统自动扫描并提交解析任务 |
| 单次申请上限 | 不超过 50 个文件 |
| Token 格式 | Bearer+ 空格 + Token |
查询结果
batch_id = "上一步返回的 batch_id" url = f"https://mineru.net/api/v4/extract-results/batch/{batch_id}" header = { "Content-Type": "application/json", "Authorization": f"Bearer {token}" } res = requests.get(url, headers=header) print(res.json())结果状态:
| state | 说明 |
|---|---|
waiting-file | 等待文件上传 |
pending | 排队中 |
running | 正在解析 |
done | 完成,返回full_zip_url |
failed | 失败,返回err_msg |
二、Agent 轻量解析 API(免 Token,适合 Agent 场景)
适用场景
文件较小(≤ 10MB,≤ 20 页)
快速解析,无需高精度
无需登录,IP 限频
仅输出 Markdown
核心接口
| 步骤 | 接口 | 说明 |
|---|---|---|
| 1 | POST /api/v1/agent/parse/file | 获取签名上传 URL |
| 2 | PUT <file_url> | 上传文件到 OSS |
| 3 | GET /api/v1/agent/parse/{task_id} | 查询结果 |
流程
Python 示例
import requests import time BASE_URL = "https://mineru.net/api/v1/agent" def parse_by_file(file_path, language="ch", page_range=None, enable_table=True, is_ocr=False, enable_formula=True): """通过文件上传提交文档解析任务并等待结果。""" file_name = file_path.split("/")[-1].split("\\")[-1] # 1. 获取签名上传 URL data = { "file_name": file_name, "language": language, "enable_table": enable_table, "is_ocr": is_ocr, "enable_formula": enable_formula } if page_range: data["page_range"] = page_range resp = requests.post(f"{BASE_URL}/parse/file", json=data) result = resp.json() if result["code"] != 0: print(f"获取上传链接失败: {result['msg']}") return None task_id = result["data"]["task_id"] file_url = result["data"]["file_url"] print(f"任务已创建, task_id: {task_id}") # 2. PUT 上传文件到 OSS with open(file_path, "rb") as f: put_resp = requests.put(file_url, data=f) if put_resp.status_code not in (200, 201): print(f"文件上传失败, HTTP {put_resp.status_code}") return None print("文件上传成功,等待解析...") # 3. 轮询等待结果 return poll_result(task_id) def poll_result(task_id, timeout=300, interval=3): """轮询查询解析结果。""" state_labels = { "pending": "排队中", "running": "解析中", "waiting-file": "等待文件上传", } start = time.time() while time.time() - start < timeout: resp = requests.get(f"{BASE_URL}/parse/{task_id}") result = resp.json() state = result["data"]["state"] elapsed = int(time.time() - start) if state == "done": markdown_url = result["data"]["markdown_url"] print(f"[{elapsed}s] 解析完成, Markdown 链接: {markdown_url}") md_resp = requests.get(markdown_url) return md_resp.text if state == "failed": print(f"[{elapsed}s] 解析失败: {result['data'].get('err_msg')}") return None print(f"[{elapsed}s] {state_labels.get(state, state)}...") time.sleep(interval) print(f"轮询超时,请手动查询 task_id: {task_id}") return None # 使用 content = parse_by_file("./document.pdf")| 注意点 | 说明 |
|---|---|
| 无需 Token | 通过 IP 限频防滥用 |
| 不支持批量 | 每次请求只能上传一个文件 |
| 文件限制 | ≤ 10MB,≤ 20 页 |
| 支持格式 | PDF、图片、Docx、PPTx、Xlsx |
| 输出格式 | 仅 Markdown(CDN 链接) |
| IP 限频 | 超限返回 HTTP 429 |
常见错误码
| 错误码 | 说明 | 解决建议 |
|---|---|---|
A0202 | Token 错误 | 检查 Token 和Bearer前缀 |
A0211 | Token 过期 | 更换新 Token |
-60005 | 文件大小超限 | 最大 200MB |
-60006 | 文件页数超限 | 拆分文件后重试 |
-30001 | 轻量接口文件超限 | 用精准 API 或拆分 |
-30003 | 轻量接口页数超限 | 用精准 API 或指定page_range |