DEVELOPER API · V1

Documentação da API PaddleOCR — análise para Markdown e JSON

Carregue um documento, consulte a tarefa e descarregue Markdown, JSON e imagens num ZIP. Inclui autenticação, endpoints e limites. O acesso API requer associação Pro.

Primeiros passos

Visão geral

Crie uma tarefa por arquivo ou URL, pesquise seu status e baixe o ZIP. As solicitações são assíncronas. Pro Mensal e Pro Anual suportam API; Grátis não.

API URL base
>
https://YOUR_API_HOST/api/open/v1

Substitua YOUR_API_HOST pelo seu domínio API. Todos os caminhos abaixo usam este URL base. Os exemplos usam IDs de espaço reservado e URLs assinados.

Autenticação

Envie Authorization: Bearer seguido pela sua chave Pro API em cada solicitação API. Obtenha ou redefina a chave usando o botão de chave API. As chaves diferenciam maiúsculas de minúsculas: sk- plus 24 letras e dígitos aleatórios. Os JWTs de login do usuário não autenticam esses endpoints.

CampoTipoObrigatórioDescrição
AuthorizationstringSimBearer seguido pela tecla Pro API; necessário em cada endpoint.
Cabeçalhos de solicitação
>
Authorization: Bearer sk-YOUR_API_KEY

Mantenha a chave no seu servidor. Não o exponha em frontend público code, repositórios ou solicitações de download. Os downloads usam seu próprio URL assinado. A redefinição da chave invalida imediatamente a chave antiga; O acesso API também requer uma assinatura Pro ativa.

Início rápido

Substitua o host API, defina MINERU_API_KEY e forneça paper.pdf. Esses exemplos são carregados uma vez, pesquisados ​​a cada 3 segundos por até 30 minutos e, em seguida, transmitidos ZIP para o disco. O tempo limite de sondagem é um limite do cliente e não cancela a tarefa do servidor. Use o ID da tarefa para continuar consultando. Python precisa do pacote requests; Node.js precisa da versão 20+; cURL usa Bash e 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)

Pontos de extremidade API

Criar uma tarefa

POST/api/open/v1/tasks

Um terminal: POST /api/open/v1/tasks. Escolha um método de entrada: carregue um arquivo usando multipart/form-data ou envie source_url usando JSON. Ambos retornam data.task_id para o mesmo fluxo de consulta de tarefa. Cada envio aceito cria uma nova tarefa.

O modo químico aceita apenas PDF e imagens. force_ocr e extra_formats não estão disponíveis.

Opção 1: carregar um arquivo

Carregue exatamente um arquivo diretamente no servidor API. Deixe seu cliente HTTP definir o limite multipart; não defina Content-Type manualmente. Envie apenas arquivo e opcional force_ocr e extra_formats. O servidor verifica os bytes e unidades recebidos antes de armazenar e enfileirar. Nenhuma solicitação separada de conclusão de upload é necessária.

Parâmetros corporais · multipart/form-data
CampoTipoObrigatórioDescrição
filebinarySimUm arquivo; o nome do arquivo deve incluir uma extensão compatível.
parse_typestring (0 | 1)Não0: documentos gerais (padrão); 1: estruturas químicas.Padrão: 0
force_ocrstring (true | false)Nãotrue / false; Somente para PDF. Ativado: ignorar a camada de texto e usar OCR. Desativado: detecção automática. Outros formatos não são afetados.Padrão: false
extra_formatsstring (JSON)NãoSequência de matriz codificada em JSON, e.g. ["docx","html"]. Valores: html, docx, latex.Padrão: []
Exemplo de solicitação · 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"]'
Campos de resposta · 200 OK

HTTP 200 significa que a tarefa foi criada. code é 0, msg é ok e os dados contêm apenas task_id. Consulte a tarefa para obter status e results.

CampoTipoDescrição
codeinteger0 na criação bem-sucedida da tarefa.
data.task_idstring (UUID)A tarefa UUID retornou como data.task_id quando criada.
msgstringok na criação bem-sucedida da tarefa.
Exemplo de resposta
>
{
  "code": 0,
  "data": {
    "task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
  },
  "msg": "ok"
}

Opção 2: enviar um URL

Envie JSON em vez de multipart. source_url deve ser um documento HTTP/HTTPS público, imagem ou URL HTML. A fonte deve expor um Content-Length positivo e um formato suportado de cabeçalhos ou nome de arquivo; metadados ausentes, conflitantes ou alterados falham na tarefa. Endereços privados, URLs contendo credenciais, respostas compactadas ou em pedaços são rejeitados. No máximo redirecionamentos 5. A criação retorna queued; falhas de busca aparecem posteriormente em task.error.

Parâmetros corporais · application/json
CampoTipoObrigatórioDescrição
source_urlstringSimURL de origem HTTP/HTTPS público, sujeito a metadados e validação de tamanho.
parse_typeinteger (0 | 1)Não0: documentos gerais (padrão); 1: estruturas químicas.Padrão: 0
force_ocrbooleanNãotrue / false; Somente para PDF. Ativado: ignorar a camada de texto e usar OCR. Desativado: detecção automática. Outros formatos não são afetados.Padrão: false
extra_formatsstring[]NãoMatriz de html, docx e/or latex, não uma string JSON. Markdown e JSON já estão incluídos.Padrão: []
Exemplo de solicitação · 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"]}'
Campos de resposta · 200 OK

HTTP 200 significa que a tarefa foi criada. code é 0, msg é ok e os dados contêm apenas task_id. Consulte a tarefa para obter status e results.

CampoTipoDescrição
codeinteger0 na criação bem-sucedida da tarefa.
data.task_idstring (UUID)A tarefa UUID retornou como data.task_id quando criada.
msgstringok na criação bem-sucedida da tarefa.
Exemplo de resposta
>
{
  "code": 0,
  "data": {
    "task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
  },
  "msg": "ok"
}
Tarefa química · 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'

Listar tarefas

GET/api/open/v1/tasks

Lista suas tarefas da web e API juntas, as mais recentes primeiro. Os itens contêm apenas task_id, status, credits, created_at e nome de arquivo, tamanho, mime_type e source_type. Consulte detalhes de metadados de arquivo, motivo da falha, expiração e URLs de resultado. page_size aceita 1–100; valores inválidos padrão para 20. página abaixo 1 padrão para 1.

Parâmetros de consulta

CampoTipoObrigatórioDescrição
pageintegerNãoNúmero de página baseado em 1; inválido ou abaixo de 1 usa 1.Padrão: 1
page_sizeintegerNãoItens por página, 1–100; valores inválidos usam 20.Padrão: 20
searchstringNãoFiltre por nome de arquivo em todas as suas tarefas (até 255 caracteres).
statusstringNãoFiltro status opcional: queued, running, completed, failed ou expired. Separe vários status com vírgulas.
Exemplo de solicitação · cURL
>
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks?page=1&page_size=20" \
  -H "Authorization: Bearer $API_KEY"

Campos de resposta · 200 OK

CampoTipoDescrição
data.itemsTaskSummary[]Resumos de tarefas contendo apenas campos na tabela TaskSummary.
data.has_morebooleanSe outra página está disponível.
data.pageintegerNúmero de página baseado em 1; inválido ou abaixo de 1 usa 1.
data.page_sizeintegerItens por página, 1–100; valores inválidos usam 20.
Exemplo de resposta
>
{
  "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

CampoTipoDescrição
task_idstring (UUID)A tarefa UUID retornou como data.task_id quando criada.
parse_typeinteger (0 | 1)0: documentos gerais (padrão); 1: estruturas químicas.
statusstringEstado geral da tarefa; consulte Estados da tarefa.
creditsintegerContagem faturável: PDF páginas, PPT slides ou Excel planilhas; Word, HTML e imagens contam como 1. É 0 até que a inspeção do arquivo URL termine.
created_atstring (RFC3339)Hora de criação do registro em RFC3339.
file.namestringNome do arquivo de entrada armazenado; As tarefas de URL podem mostrar inicialmente o host de origem.
file.sizeinteger (int64)Bytes armazenados reais; 0 antes do download do URL.
file.mime_typestringTipo MIME armazenado; pode estar vazio durante a busca.
file.source_typestringupload ou url.

Obter tarefa results

GET/api/open/v1/tasks/{id}

Leia data.task.status. results é sempre um dicionário: vazio para queued, running, failed ou expired e contém URLs de documentos quando completed. O URL ZIP é results.full_zip_url. Tarefas com falha retornam HTTP 200 com code task_failed e o motivo em msg; expired results use code result_expired.

Parâmetros de caminho

CampoTipoObrigatórioDescrição
idstring (UUID)SimA tarefa UUID retornou como data.task_id quando criada.
Exemplo de solicitação · cURL
>
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $API_KEY"

Campos de resposta · 200 OK

CampoTipoDescrição
data.taskTaskObjeto Task, sempre retornado na pesquisa de detalhes bem-sucedida.
data.fileFileObjeto Arquivo de Entrada; Os metadados de URL podem ainda não estar prontos.
data.resultsobjectUm dicionário de URLs de arquivos e imagens. Tarefas inacabadas, failed ou expired retornam um dicionário vazio.
Processando resposta · 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": {}
  }
}
Exemplo de resposta · 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"
    }
  }
}
Falha na resposta da tarefa · 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": {}
  }
}
Tarefa química · concluída
>
{
  "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

CampoTipoDescrição
task_idstring (UUID)A tarefa UUID retornou como data.task_id quando criada.
parse_typeinteger (0 | 1)0: documentos gerais (padrão); 1: estruturas químicas.
statusstringEstado geral da tarefa; consulte Estados da tarefa.
creditsintegerContagem faturável: PDF páginas, PPT slides ou Excel planilhas; Word, HTML e imagens contam como 1. É 0 até que a inspeção do arquivo URL termine.
force_ocrbooleantrue / false; Somente para PDF. Ativado: ignorar a camada de texto e usar OCR. Desativado: detecção automática. Outros formatos não são afetados.
expires_atstring | null (RFC3339)Prazo de retenção da tarefa; pode ser null antes que os resultados/failure sejam registrados.
errorstringProcessando error ou mensagem de recuperação; vazio quando nenhum.
created_atstring (RFC3339)Hora de criação do registro em RFC3339.

File

CampoTipoDescrição
namestringNome do arquivo de entrada armazenado; As tarefas de URL podem mostrar inicialmente o host de origem.
sizeinteger (int64)Bytes armazenados reais; 0 antes do download do URL.
mime_typestringTipo MIME armazenado; pode estar vazio durante a busca.
suffixstringExtensão em minúsculas sem ponto; pode estar vazio durante a busca.
source_typestringupload ou url.
source_urlstringURL de origem enviada pelo usuário; vazio para arquivos carregados.

results

CampoTipoDescrição
original_urlstringURL do arquivo original assinado.
json_urlstringURL do JSON químico; retornada apenas para parse_type=1.
markdown_urlstringURL markdown.md nativo assinado para leitura prévia.
middle_json_urlstringURL middle_json.json assinado com páginas, estrutura de bloco e caixas delimitadoras normalizadas.
structured_json_urlstringURL structured_content.json assinado; omitido se o recurso estiver ausente.
imagesRecord<string, string>Mapa de caminhos relativos nativos para URLs de imagens assinadas; objeto vazio quando não há imagens.
full_zip_urlstringresults.full_zip_url é o URL API ZIP final assinado, retornado somente quando completed e retido.

Notas de referência

Formatos e limites

Limites Pro: 200 MiB por documento, 50 MiB por imagem e 500 unidades faturáveis. API e a web compartilham 5 diariamente mais 1,000 unidades mensais, usando primeiro as unidades diárias. O uso é reservado após a validação e cobrado quando o resultado da análise base é salvo. Falha de análise confirmada ou rescisão libera reservas. A falha na publicação/export não reembolsa a análise bem-sucedida; failed ou a execução expirada libera automaticamente as reservas não cobradas. As exportações não voltam a cobrar.

FormatoExtensões de nome de arquivoUnidades faturáveis
PDF.pdfPáginas PDF físicas
Word.doc, .docx1 unidade por arquivo
PowerPoint.ppt, .pptxNúmero de slides
Excel.xls, .xlsxNúmero de planilhas
Imagens.png, .jpg, .jpeg, .webp, .gif, .bmp, .tif, .tiff1 unidade por arquivo
HTML.html, .htm1 unidade por arquivo

O formato de upload é determinado pela extensão do nome do arquivo, sem distinção entre maiúsculas e minúsculas. PDF, PowerPoint e Excel devem ter metadados de página/unit legíveis. MIME não é usado para validar conteúdos carregados. Arquivos vazios, extensões não suportadas, PDFs criptografados ou ilegíveis e entradas acima do limite são rejeitados. A análise HTML é estática e não executa JavaScript. 1 MiB = 1,048,576 bytes.

Estados da tarefa

Continue pesquisando queued ou running. Baixe em completed; leia error e pare em failed. expired significa que a retenção terminou. status descreve toda a tarefa; As tarefas API são concluídas somente quando a ZIP final estiver pronta.

task.statusDescrição
queuedAceito; aguardando processamento ou busca de entrada de URL.
runningProcessamento, incluindo análise, salvamento de embalagens results e API.
completedO resultado final está pronto para consulta e download.
failedProcessando failed; leia error. Não crie automaticamente uma tarefa de substituição.
expiredO prazo de retenção do resultado em expires_at expirou; sem URLs de download.

ZIP results e downloads

O API produz um ZIP final. Markdown, Médio JSON, estruturado JSON e imagens salvas são incluídos por padrão. extra_formats suporta apenas html, docx e latex; os arquivos solicitados são adicionados ao mesmo ZIP. Não crie um trabalho de exportação da Web separado para uma tarefa API. Sem extras significa que results.full_zip_url aponta para base.zip; extras significam que aponta para o arquivo exports/a ZIP.

Tarefas químicas retornam results.original_url e results.json_url, sem ZIP ou exportações adicionais.

O resultado químico é um array JSON com todos os campos nativos do MolParser por molécula. Sem moléculas, retorna [].

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)

Os resultados são mantidos por 7 dias. results.full_zip_url é assinado por no máximo 15 minutos e nunca além da retenção. Baixe com um GET simples, sem Authorization. Se a assinatura expirar enquanto ainda estiver retida, consulte os detalhes novamente para obter um novo URL. Os links de imagens de visualização duram no máximo 2 horas; outros links de arquivos duram no máximo 15 minutos.

Os documentos ZIP mantêm referências de imagens relativas nativas e incluem imagens salvas, portanto, essas referências não dependem de assinaturas CDN. Extraia todo o arquivo e mantenha sua estrutura de pastas. Imagens remotas referenciadas pela entrada HTML não são arquivadas automaticamente e ainda podem apontar para o site de origem.

Erros e recuperação

code 0 indica sucesso. Um code diferente de zero identifica a categoria do erro; msg explica o motivo. Consultas de tarefas com falha ou expiradas retornam HTTP 200 com task_failed ou result_expired e um objeto results vazio.

HTTP 402
>
{
  "code": "quota_exceeded",
  "data": null,
  "msg": "not enough available pages/units"
}
HTTPcodeDescrição
200task_failedA análise falhou. Consulte msg para saber o motivo.
200result_expiredOs resultados expiraram.
400invalid_requestParâmetros ou arquivo inválidos. Consulte msg para saber o motivo.
400too_many_pagesO documento excede o limite de páginas ou unidades faturáveis.
401unauthorizedA autenticação da API falhou.
402quota_exceededCota disponível insuficiente.
403user_disabledA conta está desativada.
403pro_requiredÉ necessária uma assinatura Pro ativa.
404not_foundTarefa não encontrada ou acesso negado.
413file_too_largeO arquivo excede o limite de tamanho do seu plano.
500internal_errorO processamento do servidor falhou. Consulte msg para saber o motivo.