DEVELOPER API · V1

Документация PaddleOCR API — разбор документов в Markdown и JSON

Загрузите документ, отслеживайте задачу и скачайте Markdown, JSON и изображения одним ZIP-архивом. Описаны авторизация, эндпоинты и лимиты. Для доступа к API требуется членство Pro.

Начало работы

Обзор

Создайте одну задачу для каждого файла или URL-адреса, опросите его status, затем загрузите ZIP. Запросы асинхронны. Pro Monthly и Pro Annual поддерживают API; Бесплатно нет.

API базовый URL
>
https://YOUR_API_HOST/api/open/v1

Замените YOUR_API_HOST на свой домен API. Все пути ниже используют этот базовый URL. В примерах используются идентификаторы заполнителей и подписанные URL-адреса.

Аутентификация

Отправляйте Authorization: Bearer, а затем ключ Pro API при каждом запросе API. Получите или сбросьте ключ с помощью кнопки ключа API. Ключи чувствительны к регистру: sk- плюс 24 случайных букв и цифр. JWT входа пользователя не аутентифицируют эти конечные точки.

ПолеТипОбязательноОписание
AuthorizationstringДа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.

Python
>
# 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 конечные точки

Создать задачу

POST/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
ПолеТипОбязательноОписание
filebinaryДаОдин файл; имя файла должно включать поддерживаемое расширение.
parse_typestring (0 | 1)Нет0: обычные документы (по умолчанию); 1: химические структуры.По умолчанию: 0
force_ocrstring (true | false)Нетtrue / false; Только для PDF. Включено: игнорировать текстовый слой и использовать OCR. Выключено: определять автоматически. Другие форматы не затрагиваются.По умолчанию: false
extra_formatsstring (JSON)НетСтрока массива в кодировке JSON, e.g. ["docx","html"]. Значения: html, docx, latex.По умолчанию: []
Пример запроса · cURL
>
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.

ПолеТипОписание
codeinteger0 при успешном создании задачи.
data.task_idstring (UUID)Задача UUID при создании возвращается как data.task_id.
msgstringok при успешном создании задачи.
Пример ответа
>
{
  "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_urlstringДаПубличный URL-адрес источника HTTP/HTTPS, подлежит метаданным и проверке размера.
parse_typeinteger (0 | 1)Нет0: обычные документы (по умолчанию); 1: химические структуры.По умолчанию: 0
force_ocrbooleanНетtrue / false; Только для PDF. Включено: игнорировать текстовый слой и использовать OCR. Выключено: определять автоматически. Другие форматы не затрагиваются.По умолчанию: false
extra_formatsstring[]НетМассив html, docx и /or latex, а не строка JSON. Markdown и JSON уже включены.По умолчанию: []
Пример запроса · cURL
>
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.

ПолеТипОписание
codeinteger0 при успешном создании задачи.
data.task_idstring (UUID)Задача UUID при создании возвращается как data.task_id.
msgstringok при успешном создании задачи.
Пример ответа
>
{
  "code": 0,
  "data": {
    "task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
  },
  "msg": "ok"
}
Химическая задача · cURL
>
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks" \
  -H "Authorization: Bearer $API_KEY" \
  -F '[email protected]' \
  -F 'parse_type=1'

Список задач

GET/api/open/v1/tasks

Перечисляет ваши веб-задачи и API вместе, сначала самые новые. Элементы содержат только task_id, status, credits, created_at, а также имя файла, его размер, mime_type и source_type. Подробности запроса для метаданных файла, причины сбоя, срока действия и URL-адресов результатов. page_size принимает 1–100; недопустимые значения по умолчанию — 20., страница ниже 1 — по умолчанию 1.

Параметры запроса

ПолеТипОбязательноОписание
pageintegerНетНомер страницы на основе 1; недействительно или ниже 1, используется 1.По умолчанию: 1
page_sizeintegerНетЭлементов на странице, 1–100; недопустимые значения используют 20.По умолчанию: 20
searchstringНетФильтрация по имени файла для всех ваших задач (до 255 символов).
statusstringНетДополнительный фильтр status: queued, running, completed, failed или expired. Разделяйте несколько статусов запятыми.
Пример запроса · cURL
>
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.itemsTaskSummary[]Сводки задач, содержащие только поля таблицы TaskSummary.
data.has_morebooleanДоступна ли другая страница.
data.pageintegerНомер страницы на основе 1; недействительно или ниже 1, используется 1.
data.page_sizeintegerЭлементов на странице, 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_idstring (UUID)Задача UUID при создании возвращается как data.task_id.
parse_typeinteger (0 | 1)0: обычные документы (по умолчанию); 1: химические структуры.
statusstringОбщее состояние задачи; см. состояния задач.
creditsintegerОплачиваемое количество: PDF страниц, PPT слайдов или Excel рабочих листов; Word, HTML и изображения считаются 1.. До завершения проверки файла URL-адреса это 0.
created_atstring (RFC3339)Время создания записи в RFC3339.
file.namestringИмя сохраненного входного файла; Задачи URL-адресов могут изначально показывать исходный хост.
file.sizeinteger (int64)Фактические сохраненные байты; 0 перед загрузкой URL.
file.mime_typestringСохраненный тип MIME; может быть пустым во время получения.
file.source_typestringupload или url.

Получить задание results

GET/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.

Параметры пути

ПолеТипОбязательноОписание
idstring (UUID)ДаЗадача UUID при создании возвращается как data.task_id.
Пример запроса · cURL
>
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $API_KEY"

Поля ответа · 200 OK

ПолеТипОписание
data.taskTaskОбъект задачи, всегда возвращается при успешном подробном поиске.
data.fileFileОбъект «Входной файл»; Метаданные URL-адреса могут быть еще не готовы.
data.resultsobjectСловарь URL-адресов файлов и изображений. Незавершенные задачи failed или expired возвращают пустой словарь.
Обработка ответа · running
>
{
  "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": {}
  }
}
Пример ответа · completed
>
{
  "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"
    }
  }
}
Неудачный ответ на задачу · HTTP 200
>
{
  "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_idstring (UUID)Задача UUID при создании возвращается как data.task_id.
parse_typeinteger (0 | 1)0: обычные документы (по умолчанию); 1: химические структуры.
statusstringОбщее состояние задачи; см. состояния задач.
creditsintegerОплачиваемое количество: PDF страниц, PPT слайдов или Excel рабочих листов; Word, HTML и изображения считаются 1.. До завершения проверки файла URL-адреса это 0.
force_ocrbooleantrue / false; Только для PDF. Включено: игнорировать текстовый слой и использовать OCR. Выключено: определять автоматически. Другие форматы не затрагиваются.
expires_atstring | null (RFC3339)Срок хранения задачи; может быть null до записи результатов /failure.
errorstringОбработка error или сообщения восстановления; пусто, когда его нет.
created_atstring (RFC3339)Время создания записи в RFC3339.

File

ПолеТипОписание
namestringИмя сохраненного входного файла; Задачи URL-адресов могут изначально показывать исходный хост.
sizeinteger (int64)Фактические сохраненные байты; 0 перед загрузкой URL.
mime_typestringСохраненный тип MIME; может быть пустым во время получения.
suffixstringРасширение строчной буквы без точки; может быть пустым во время получения.
source_typestringupload или url.
source_urlstringURL-адрес источника, предоставленный пользователем; пусто для загруженных файлов.

results

ПолеТипОписание
original_urlstringURL-адрес подписанного исходного файла.
json_urlstringURL химического JSON; возвращается только при parse_type=1.
markdown_urlstringПодписанный собственный URL-адрес markdown.md для предварительного чтения.
middle_json_urlstringПодписанный URL-адрес middle_json.json со страницами, структурой блоков и нормализованными ограничивающими рамками.
structured_json_urlstringПодписанный URL-адрес structured_content.json; опускается, если ресурс отсутствует.
imagesRecord<string, string>Карта собственных относительных путей к URL-адресам подписанных изображений; пустой объект, когда нет изображений.
full_zip_urlstringresults.full_zip_url — это подписанный конечный URL-адрес API ZIP, который возвращается только при completed и сохраняется.

Справочные примечания

Форматы и ограничения

Ограничения Pro: 200 MiB на документ, 50 MiB на изображение и 500 оплачиваемых единиц. API и веб-сайты совместно используют 5 ежедневных единиц плюс 1,000 ежемесячных единиц, используя сначала дневные единицы. Использование резервируется после проверки и взимается при сохранении результата базового анализа. Подтвержденный сбой синтаксического анализа или его завершение освобождают резервирования. Ошибка публикации/export не возвращает деньги за успешный синтаксический анализ; failed или выполнение по истечении времени ожидания автоматически освобождает неоплаченные резервирования. Экспорт снова не взимается.

ФорматРасширения имен файловОплачиваемые единицы
PDF.pdfФизические PDF страниц
Word.doc, .docx1 единиц на файл
PowerPoint.ppt, .pptxКоличество слайдов
Excel.xls, .xlsxКоличество рабочих листов
Изображения.png, .jpg, .jpeg, .webp, .gif, .bmp, .tif, .tiff1 единиц на файл
HTML.html, .htm1 единиц на файл

Формат загрузки определяется расширением имени файла без учета регистра. 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 для каждой молекулы. Если молекул нет, возвращается [].

molecular_structures.json
>
source, input_index, page_index, bbox, confidence, raw_caption, caption, smi, esmi, cxsmiles, markush, sru, groups
ZIP
>
result.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.

HTTP 402
>
{
  "code": "quota_exceeded",
  "data": null,
  "msg": "not enough available pages/units"
}
HTTPcodeОписание
200task_failedОшибка разбора. Причина указана в msg.
200result_expiredСрок хранения результатов истёк.
400invalid_requestНедопустимые параметры или файл. Причина указана в msg.
400too_many_pagesДокумент превышает лимит страниц или оплачиваемых единиц.
401unauthorizedОшибка аутентификации API.
402quota_exceededНедостаточно доступной квоты.
403user_disabledУчётная запись отключена.
403pro_requiredТребуется действующая подписка Pro.
404not_foundЗадача не найдена или доступ запрещён.
413file_too_largeФайл превышает лимит размера вашего тарифа.
500internal_errorОшибка обработки на сервере. Причина указана в msg.