Начало работы
Обзор
Создайте одну задачу для каждого файла или 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, за которым следует клавиша Pro API; требуется на каждой конечной точке. |
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 и /or 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. |
Получить задание results
/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 ежедневных единиц плюс 1,000 ежемесячных единиц, используя сначала дневные единицы. Использование резервируется после проверки и взимается при сохранении результата базового анализа. Подтвержденный сбой синтаксического анализа или его завершение освобождают резервирования. Ошибка публикации/export не возвращает деньги за успешный синтаксический анализ; failed или выполнение по истечении времени ожидания автоматически освобождает неоплаченные резервирования. Экспорт снова не взимается.
| Формат | Расширения имен файлов | Оплачиваемые единицы |
|---|---|---|
.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 | Обработка, включая синтаксический анализ, сохранение упаковки results и API. |
completed | Окончательный результат готов к запросу и загрузке. |
failed | Обработка failed; прочитайте error. Не создавайте автоматически задачу замены. |
expired | Срок хранения результатов в expires_at истек; нет URL-адресов загрузки. |
ZIP results и загрузки
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. |