Начало работы
Обзор
Создайте одну задачу для каждого файла или URL-адреса, опросите его status, затем загрузите ZIP. Запросы асинхронны. Pro Monthly и Pro Annual поддерживают API; Бесплатно нет.
https://YOUR_API_HOST/api/open/v1Замените YOUR_API_HOST на свой домен API. Все пути ниже используют этот базовый URL. В примерах используются идентификаторы заполнителей и подписанные URL-адреса.
Аутентификация
Отправляйте Authorization: Bearer, а затем ключ Pro API при каждом запросе API. Получите или сбросьте ключ с помощью кнопки ключа API. Ключи чувствительны к регистру: sk- плюс 24 случайных букв и цифр. JWT входа пользователя не аутентифицируют эти конечные точки.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
Authorization | string | Да | Bearer, затем ключ API Pro; обязателен для каждого эндпоинта. |
Authorization: Bearer sk-YOUR_API_KEYХраните ключ на своем сервере. Не размещайте его в общедоступном интерфейсе code, репозиториях или запросах на загрузку. Загрузки используют собственный подписанный URL-адрес. Сброс ключа немедленно делает старый ключ недействительным; Для доступа к API также требуется активное членство Pro.
Быстрый старт
Замените хост API, установите MINERU_API_KEY и укажите paper.pdf. Эти примеры загружаются один раз, опрашиваются каждые 3 секунд в течение 30 минут, а затем передаются ZIP на диск. Тайм-аут опроса является ограничением клиента и не отменяет задачу сервера. Используйте идентификатор задачи, чтобы продолжить запрос. Для Python нужен пакет requests; Node.js нужна версия 20+; cURL использует Bash и jq.
# pip install requests
import os
import time
import requests
API = "https://YOUR_API_HOST/api/open/v1"
headers = {"Authorization": "Bearer " + os.environ["MINERU_API_KEY"]}
with open("paper.pdf", "rb") as source:
response = requests.post(API + "/tasks", headers=headers, files={"file": ("paper.pdf", source, "application/pdf")},
data={"force_ocr": "true", "extra_formats": '["docx","html"]'}, timeout=120)
response.raise_for_status()
body = response.json()
if body["code"] != 0:
raise RuntimeError(body["code"] + ": " + body["msg"])
task_id = body["data"]["task_id"]
deadline = time.monotonic() + 1800
while time.monotonic() < deadline:
response = requests.get(API + "/tasks/" + task_id, headers=headers, timeout=30)
response.raise_for_status()
body = response.json()
if body["code"] != 0:
raise RuntimeError(body["code"] + ": " + body["msg"])
data = body["data"]
task = data["task"]
if task["status"] == "completed":
url = data["results"].get("full_zip_url")
if not url:
raise RuntimeError("ZIP unavailable; check expires_at")
# Download separately: do not send the API key to the download host.
with requests.get(url, stream=True, timeout=120) as download:
download.raise_for_status()
with open("result.zip", "wb") as output:
for chunk in download.iter_content(1024 * 1024):
output.write(chunk)
print("Saved result.zip")
break
if task["status"] in {"failed", "expired"}:
raise RuntimeError(task["status"] + ": " + task["error"])
time.sleep(3)
else:
raise TimeoutError("Polling timed out; task ID: " + task_id)API конечные точки
Создать задачу
/api/open/v1/tasksОдна конечная точка: POST /api/open/v1/tasks. Выберите один метод ввода: загрузите файл с помощью multipart/form-data или отправьте source_url с помощью JSON. Оба возвращают data.task_id для одного и того же потока запроса задачи. Каждая принятая отправка создает новую задачу.
Химический режим принимает только PDF и изображения. force_ocr и extra_formats недоступны.
Опция 1: загрузить файл.
Загрузите ровно один файл непосредственно на сервер API. Позвольте вашему клиенту HTTP установить границу составных частей; не устанавливайте вручную Content-Type. Отправлять только файл и необязательно force_ocr и extra_formats. Сервер проверяет полученные байты и единицы перед сохранением и постановкой в очередь. Никакого отдельного запроса на завершение загрузки не требуется.
Параметры тела · multipart/form-data
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
file | binary | Да | Один файл; имя файла должно включать поддерживаемое расширение. |
parse_type | string (0 | 1) | Нет | 0: обычные документы (по умолчанию); 1: химические структуры.По умолчанию: 0 |
force_ocr | string (true | false) | Нет | true / false; Только для PDF. Включено: игнорировать текстовый слой и использовать OCR. Выключено: определять автоматически. Другие форматы не затрагиваются.По умолчанию: false |
extra_formats | string (JSON) | Нет | Строка массива в кодировке JSON, e.g. ["docx","html"]. Значения: html, docx, latex.По умолчанию: [] |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks" \
-H "Authorization: Bearer $API_KEY" \
-F '[email protected]' \
-F 'force_ocr=true' \
-F 'extra_formats=["docx","html"]'Поля ответа · 200 OK
HTTP 200 означает, что задача создана. code — это 0,, msg — это ok, а данные содержат только task_id. Запросите задачу, чтобы получить ее status и results.
| Поле | Тип | Описание |
|---|---|---|
code | integer | 0 при успешном создании задачи. |
data.task_id | string (UUID) | Задача UUID при создании возвращается как data.task_id. |
msg | string | ok при успешном создании задачи. |
{
"code": 0,
"data": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
},
"msg": "ok"
}Опция 2: отправить URL-адрес.
Отправьте JSON вместо multipart. source_url должен быть общедоступным документом HTTP/HTTPS, изображением или URL-адресом HTML. Источник должен предоставлять положительный Content-Length и поддерживаемый формат из заголовков или имени файла; отсутствующие, конфликтующие или измененные метаданные не позволяют выполнить задачу. Частные адреса, URL-адреса, содержащие учетные данные, сжатые или фрагментированные ответы отклоняются. Максимум 5 перенаправлений. Создание возвращает queued; ошибки выборки появляются позже в task.error.
Параметры тела · application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
source_url | string | Да | Публичный URL-адрес источника HTTP/HTTPS, подлежит метаданным и проверке размера. |
parse_type | integer (0 | 1) | Нет | 0: обычные документы (по умолчанию); 1: химические структуры.По умолчанию: 0 |
force_ocr | boolean | Нет | true / false; Только для PDF. Включено: игнорировать текстовый слой и использовать OCR. Выключено: определять автоматически. Другие форматы не затрагиваются.По умолчанию: false |
extra_formats | string[] | Нет | Массив из html, docx и/или latex, а не строка JSON. Markdown и JSON уже включены.По умолчанию: [] |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks" \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
--data '{"source_url":"https://example.com/paper.pdf","force_ocr":true,"extra_formats":["docx","html"]}'Поля ответа · 200 OK
HTTP 200 означает, что задача создана. code — это 0,, msg — это ok, а данные содержат только task_id. Запросите задачу, чтобы получить ее status и results.
| Поле | Тип | Описание |
|---|---|---|
code | integer | 0 при успешном создании задачи. |
data.task_id | string (UUID) | Задача UUID при создании возвращается как data.task_id. |
msg | string | ok при успешном создании задачи. |
{
"code": 0,
"data": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
},
"msg": "ok"
}curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks" \
-H "Authorization: Bearer $API_KEY" \
-F '[email protected]' \
-F 'parse_type=1'Список задач
/api/open/v1/tasksПеречисляет ваши веб-задачи и API вместе, сначала самые новые. Элементы содержат только task_id, status, credits, created_at, а также имя файла, его размер, mime_type и source_type. Подробности запроса для метаданных файла, причины сбоя, срока действия и URL-адресов результатов. page_size принимает 1–100; недопустимые значения по умолчанию — 20., страница ниже 1 — по умолчанию 1.
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
page | integer | Нет | Номер страницы на основе 1; недействительно или ниже 1, используется 1.По умолчанию: 1 |
page_size | integer | Нет | Элементов на странице, 1–100; недопустимые значения используют 20.По умолчанию: 20 |
search | string | Нет | Фильтрация по имени файла для всех ваших задач (до 255 символов). |
status | string | Нет | Дополнительный фильтр status: queued, running, completed, failed или expired. Разделяйте несколько статусов запятыми. |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks?page=1&page_size=20" \
-H "Authorization: Bearer $API_KEY"Поля ответа · 200 OK
| Поле | Тип | Описание |
|---|---|---|
data.items | TaskSummary[] | Сводки задач, содержащие только поля таблицы TaskSummary. |
data.has_more | boolean | Доступна ли другая страница. |
data.page | integer | Номер страницы на основе 1; недействительно или ниже 1, используется 1. |
data.page_size | integer | Элементов на странице, 1–100; недопустимые значения используют 20. |
{
"code": 0,
"msg": "ok",
"data": {
"items": [
{
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436",
"parse_type": 0,
"status": "completed",
"credits": 2,
"created_at": "2026-10-12T07:04:05Z",
"file": {
"name": "paper.pdf",
"size": 12345,
"mime_type": "application/pdf",
"source_type": "upload"
}
}
],
"has_more": false,
"page": 1,
"page_size": 20
}
}TaskSummary
| Поле | Тип | Описание |
|---|---|---|
task_id | string (UUID) | Задача UUID при создании возвращается как data.task_id. |
parse_type | integer (0 | 1) | 0: обычные документы (по умолчанию); 1: химические структуры. |
status | string | Общее состояние задачи; см. состояния задач. |
credits | integer | Оплачиваемое количество: PDF страниц, PPT слайдов или Excel рабочих листов; Word, HTML и изображения считаются 1.. До завершения проверки файла URL-адреса это 0. |
created_at | string (RFC3339) | Время создания записи в RFC3339. |
file.name | string | Имя сохраненного входного файла; Задачи URL-адресов могут изначально показывать исходный хост. |
file.size | integer (int64) | Фактические сохраненные байты; 0 перед загрузкой URL. |
file.mime_type | string | Сохраненный тип MIME; может быть пустым во время получения. |
file.source_type | string | upload или url. |
Получить результаты задачи
/api/open/v1/tasks/{id}Прочитайте data.task.status. results всегда является словарем: пустым для queued, running, failed или expired и содержит URL-адреса документов, если completed. URL-адрес ZIP — results.full_zip_url. Невыполненные задачи возвращают HTTP 200 с code task_failed и причиной в msg; expired results используйте code result_expired.
Параметры пути
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id | string (UUID) | Да | Задача UUID при создании возвращается как data.task_id. |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks/$TASK_ID" \
-H "Authorization: Bearer $API_KEY"Поля ответа · 200 OK
| Поле | Тип | Описание |
|---|---|---|
data.task | Task | Объект задачи, всегда возвращается при успешном подробном поиске. |
data.file | File | Объект «Входной файл»; Метаданные URL-адреса могут быть еще не готовы. |
data.results | object | Словарь URL-адресов файлов и изображений. Незавершенные задачи failed или expired возвращают пустой словарь. |
{
"code": 0,
"msg": "ok",
"data": {
"task": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436",
"parse_type": 0,
"status": "running",
"credits": 2,
"force_ocr": true,
"expires_at": "2026-10-19T07:04:05Z",
"error": "",
"created_at": "2026-10-12T07:04:05Z"
},
"file": {
"name": "paper.pdf",
"size": 12345,
"mime_type": "application/pdf",
"suffix": "pdf",
"source_type": "upload",
"source_url": ""
},
"results": {}
}
}{
"code": 0,
"msg": "ok",
"data": {
"task": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436",
"parse_type": 0,
"status": "completed",
"credits": 2,
"force_ocr": true,
"expires_at": "2026-10-19T07:04:05Z",
"error": "",
"created_at": "2026-10-12T07:04:05Z"
},
"file": {
"name": "paper.pdf",
"size": 12345,
"mime_type": "application/pdf",
"suffix": "pdf",
"source_type": "upload",
"source_url": ""
},
"results": {
"original_url": "https://downloads.example.com/uploads/4001a517-cd93-47a6-a56a-e53d2a0828df/aa0e6ab6-44f3-4554-b459-b62fe4c6b437.pdf?token=SIGNED_TOKEN",
"markdown_url": "https://downloads.example.com/results/a90e6ab6-44f3-4554-b459-b62fe4c6b436/preview/markdown.md?token=SIGNED_TOKEN",
"middle_json_url": "https://downloads.example.com/results/a90e6ab6-44f3-4554-b459-b62fe4c6b436/preview/middle_json.json?token=SIGNED_TOKEN",
"structured_json_url": "https://downloads.example.com/results/a90e6ab6-44f3-4554-b459-b62fe4c6b436/preview/structured_content.json?token=SIGNED_TOKEN",
"images": {
"images/001.jpg": "https://downloads.example.com/results/a90e6ab6-44f3-4554-b459-b62fe4c6b436/preview/images/001.jpg?token=SIGNED_TOKEN"
},
"full_zip_url": "https://downloads.example.com/results/a90e6ab6-44f3-4554-b459-b62fe4c6b436/exports/6b0e6ab6-44f3-4554-b459-b62fe4c6b439.zip?token=SIGNED_TOKEN"
}
}
}{
"code": "task_failed",
"msg": "MinerU job ended: failed",
"data": {
"task": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436",
"parse_type": 0,
"status": "failed",
"credits": 2,
"force_ocr": true,
"expires_at": "2026-10-19T07:04:05Z",
"error": "MinerU job ended: failed",
"created_at": "2026-10-12T07:04:05Z"
},
"file": {
"name": "paper.pdf",
"size": 12345,
"mime_type": "application/pdf",
"suffix": "pdf",
"source_type": "upload",
"source_url": ""
},
"results": {}
}
}{
"code": 0,
"msg": "ok",
"data": {
"task": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436",
"parse_type": 1,
"status": "completed",
"credits": 2,
"force_ocr": false,
"expires_at": "2026-10-19T07:04:05Z",
"error": "",
"created_at": "2026-10-12T07:04:05Z"
},
"file": {
"name": "paper.pdf",
"size": 12345,
"mime_type": "application/pdf",
"suffix": "pdf",
"source_type": "upload",
"source_url": ""
},
"results": {
"original_url": "https://downloads.example.com/uploads/4001a517-cd93-47a6-a56a-e53d2a0828df/aa0e6ab6-44f3-4554-b459-b62fe4c6b437.pdf?token=SIGNED_TOKEN",
"json_url": "https://downloads.example.com/results/a90e6ab6-44f3-4554-b459-b62fe4c6b436/molecular_structures.json?token=SIGNED_TOKEN"
}
}
}Task
| Поле | Тип | Описание |
|---|---|---|
task_id | string (UUID) | Задача UUID при создании возвращается как data.task_id. |
parse_type | integer (0 | 1) | 0: обычные документы (по умолчанию); 1: химические структуры. |
status | string | Общее состояние задачи; см. состояния задач. |
credits | integer | Оплачиваемое количество: PDF страниц, PPT слайдов или Excel рабочих листов; Word, HTML и изображения считаются 1.. До завершения проверки файла URL-адреса это 0. |
force_ocr | boolean | true / false; Только для PDF. Включено: игнорировать текстовый слой и использовать OCR. Выключено: определять автоматически. Другие форматы не затрагиваются. |
expires_at | string | null (RFC3339) | Срок хранения задачи; может быть null до записи результатов /failure. |
error | string | Обработка error или сообщения восстановления; пусто, когда его нет. |
created_at | string (RFC3339) | Время создания записи в RFC3339. |
File
| Поле | Тип | Описание |
|---|---|---|
name | string | Имя сохраненного входного файла; Задачи URL-адресов могут изначально показывать исходный хост. |
size | integer (int64) | Фактические сохраненные байты; 0 перед загрузкой URL. |
mime_type | string | Сохраненный тип MIME; может быть пустым во время получения. |
suffix | string | Расширение строчной буквы без точки; может быть пустым во время получения. |
source_type | string | upload или url. |
source_url | string | URL-адрес источника, предоставленный пользователем; пусто для загруженных файлов. |
results
| Поле | Тип | Описание |
|---|---|---|
original_url | string | URL-адрес подписанного исходного файла. |
json_url | string | URL химического JSON; возвращается только при parse_type=1. |
markdown_url | string | Подписанный собственный URL-адрес markdown.md для предварительного чтения. |
middle_json_url | string | Подписанный URL-адрес middle_json.json со страницами, структурой блоков и нормализованными ограничивающими рамками. |
structured_json_url | string | Подписанный URL-адрес structured_content.json; опускается, если ресурс отсутствует. |
images | Record<string, string> | Карта собственных относительных путей к URL-адресам подписанных изображений; пустой объект, когда нет изображений. |
full_zip_url | string | results.full_zip_url — это подписанный конечный URL-адрес API ZIP, который возвращается только при completed и сохраняется. |
Справочные примечания
Форматы и ограничения
Ограничения Pro: 200 MiB на документ, 50 MiB на изображение и 500 расчётных единиц. API и сайт используют общий лимит: 5 единиц в день и 1000 в месяц; сначала расходуются дневные единицы. Квота резервируется после проверки и списывается после сохранения базового результата разбора. Подтверждённый сбой или остановка разбора освобождает резерв. Ошибка публикации или экспорта не возвращает квоту за успешный разбор. При сбое выполнения или превышении времени ожидания ещё не списанный резерв освобождается автоматически. Экспорт не расходует квоту повторно.
| Формат | Расширения имен файлов | Оплачиваемые единицы |
|---|---|---|
.pdf | Физические PDF страниц | |
| Word | .doc, .docx | 1 единиц на файл |
| PowerPoint | .ppt, .pptx | Количество слайдов |
| Excel | .xls, .xlsx | Количество рабочих листов |
| Изображения | .png, .jpg, .jpeg, .webp, .gif, .bmp, .tif, .tiff | 1 единиц на файл |
| HTML | .html, .htm | 1 единиц на файл |
Формат загрузки определяется расширением имени файла без учета регистра. PDF, PowerPoint и Excel должны иметь читаемые метаданные страницы /unit. MIME не используется для проверки загруженного содержимого. Пустые файлы, неподдерживаемые расширения, зашифрованные или нечитаемые PDF-файлы, а также входные данные, превышающие лимит, отклоняются. Анализ HTML является статическим и не запускает JavaScript. 1 MiB = 1,048,576 байт.
Состояния задач
Продолжайте опрос queued или running. Скачать на completed; прочитайте error и остановитесь на failed. expired означает, что хранение закончилось. status описывает всю задачу; Задачи API завершаются только тогда, когда готов последний ZIP.
| task.status | Описание |
|---|---|
queued | Принято; ожидает обработки или получения ввода URL-адреса. |
running | Обработка, включая разбор, сохранение результатов и создание ZIP-архива API. |
completed | Окончательный результат готов к запросу и загрузке. |
failed | Обработка завершилась ошибкой. Прочитайте поле error. Не создавайте автоматически новую задачу. |
expired | Срок хранения результатов в expires_at истек; нет URL-адресов загрузки. |
Результаты в ZIP и скачивание
API производит один последний ZIP. Markdown, средний JSON, структурированный JSON и сохраненные изображения включены по умолчанию. extra_formats поддерживает только html, docx и latex; запрошенные файлы добавляются в тот самый ZIP. Не создавайте отдельное задание веб-экспорта для задачи API. Отсутствие дополнений означает, что results.full_zip_url указывает на base.zip; дополнительные означают, что он указывает на файл Exports/a ZIP.
Химические задачи возвращают results.original_url и results.json_url, без ZIP и других форматов экспорта.
Результат — массив JSON со всеми исходными полями MolParser для каждой молекулы. Если молекул нет, возвращается [].
source, input_index, page_index, bbox, confidence, raw_caption, caption, smi, esmi, cxsmiles, markush, sru, groupsresult.zip
├── markdown.md
├── middle_json.json
├── structured_content.json
├── images/
│ └── …
├── model_output.json (optional)
├── result.html (extra_formats: html)
├── result.docx (extra_formats: docx)
└── result.tex (extra_formats: latex)Результаты хранятся 7 дней. results.full_zip_url подписывается максимум на 15 минут и никогда не превышает срока хранения. Загрузите с помощью простого GET, без Authorization. Если срок действия подписи истекает, но она все еще сохраняется, запросите сведения еще раз для нового URL-адреса. Ссылки на изображения для предварительного просмотра действуют не более 2 часов; другие ссылки на файлы длятся не более 15 минут.
Документы ZIP сохраняют собственные относительные ссылки на изображения и включают сохраненные изображения, поэтому эти ссылки не зависят от подписей CDN. Извлеките весь архив и сохраните его структуру папок. Удаленные изображения, на которые ссылается ввод HTML, не архивируются автоматически и могут по-прежнему указывать на исходный веб-сайт.
Ошибки и восстановление
code 0 означает успех. Другой code обозначает категорию ошибки, а msg содержит причину. Запросы неудачных задач или задач с истёкшим сроком хранения возвращают HTTP 200 с task_failed или result_expired и пустым объектом results.
{
"code": "quota_exceeded",
"data": null,
"msg": "not enough available pages/units"
}| HTTP | code | Описание |
|---|---|---|
| 200 | task_failed | Ошибка разбора. Причина указана в msg. |
| 200 | result_expired | Срок хранения результатов истёк. |
| 400 | invalid_request | Недопустимые параметры или файл. Причина указана в msg. |
| 400 | too_many_pages | Документ превышает лимит страниц или оплачиваемых единиц. |
| 401 | unauthorized | Ошибка аутентификации API. |
| 402 | quota_exceeded | Недостаточно доступной квоты. |
| 403 | user_disabled | Учётная запись отключена. |
| 403 | pro_required | Требуется действующая подписка Pro. |
| 404 | not_found | Задача не найдена или доступ запрещён. |
| 413 | file_too_large | Файл превышает лимит размера вашего тарифа. |
| 500 | internal_error | Ошибка обработки на сервере. Причина указана в msg. |