DEVELOPER API · V1

Documentazione API PaddleOCR — analisi in Markdown e JSON

Carica un documento, controlla l’attività e scarica Markdown, JSON e immagini in uno ZIP. Include autenticazione, endpoint e limiti. L'accesso API richiede l'abbonamento Pro.

Per iniziare

Panoramica

Crea un'attività per file o URL, esegui il poll su status, quindi scarica ZIP. Le richieste sono asincrone. Pro mensile e Pro annuale supportano API; La libertà no.

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

Sostituisci YOUR_API_HOST con il tuo dominio API. Tutti i percorsi seguenti utilizzano questo URL di base. Negli esempi vengono utilizzati ID segnaposto e URL firmati.

Autenticazione

Invia Authorization: Bearer seguito dalla tua chiave Pro API su ogni richiesta API. Ottieni o reimposta la chiave utilizzando il pulsante della chiave API. I tasti fanno distinzione tra maiuscole e minuscole: sk- più 24 lettere e cifre casuali. I JWT di accesso utente non autenticano questi endpoint.

CampoTipoObbligatorioDescrizione
AuthorizationstringSìBearer seguito dal tasto Pro API; richiesto su ogni endpoint.
Intestazioni della richiesta
>
Authorization: Bearer sk-YOUR_API_KEY

Conserva la chiave sul tuo server. Non esporlo nel frontend pubblico code, nei repository o nelle richieste di download. I download utilizzano il proprio URL firmato. Il ripristino della chiave invalida immediatamente la vecchia chiave; L'accesso API richiede anche un abbonamento Pro attivo.

Avvio rapido

Sostituisci l'host API, imposta MINERU_API_KEY e fornisci paper.pdf. Questi esempi vengono caricati una volta, eseguono il polling ogni 3 secondi per un massimo di 30 minuti, quindi eseguono lo streaming di ZIP su disco. Il timeout del polling è un limite del client e non annulla l'attività del server. Utilizza l'ID attività per continuare a eseguire query. Python richiede il pacchetto requests; Node.js necessita della versione 20+; cURL utilizza 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)

API punti finali

Crea un'attività

POST/api/open/v1/tasks

Un endpoint: POST /api/open/v1/tasks. Scegli un metodo di input: carica un file utilizzando multipart/form-data o invia source_url utilizzando JSON. Entrambi restituiscono data.task_id per lo stesso flusso di query dell'attività. Ogni invio accettato crea una nuova attività.

La modalità chimica accetta solo PDF e immagini. force_ocr ed extra_formats non sono disponibili.

Opzione 1: carica un file

Carica esattamente un file direttamente sul server API. Lascia che il tuo client HTTP imposti il ​​confine multiparte; non impostare manualmente Content-Type. Invia solo file e facoltativo force_ocr ed extra_formats. Il server controlla i byte e le unità ricevuti prima di archiviarli e metterli in coda. Non è necessaria alcuna richiesta separata di completamento del caricamento.

Parametri corporei · multipart/form-data
CampoTipoObbligatorioDescrizione
filebinarySìUn file; il nome file deve includere un'estensione supportata.
parse_typestring (0 | 1)N0: documenti generali (predefinito); 1: strutture chimiche.Predefinito: 0
force_ocrstring (true | false)Ntrue / false; Solo per PDF. Attivo: ignora il livello di testo e usa OCR. Disattivo: rilevamento automatico. Gli altri formati restano invariati.Predefinito: false
extra_formatsstring (JSON)NStringa di array con codifica JSON, e.g. ["docx","html"]. Valori: html, docx, latex.Predefinito: []
Richiedi esempio · 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"]'
Campi di risposta · 200 OK

HTTP 200 significa che l'attività è stata creata. code è 0, msg è ok e i dati contengono solo task_id. Interroga l'attività per ottenere status e results.

CampoTipoDescrizione
codeinteger0 sulla creazione dell'attività riuscita.
data.task_idstring (UUID)L'attività UUID è stata restituita come data.task_id al momento della creazione.
msgstringok sulla creazione dell'attività riuscita.
Esempio di risposta
>
{
  "code": 0,
  "data": {
    "task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
  },
  "msg": "ok"
}

Opzione 2: invia un URL

Invia JSON invece di multipart. source_url deve essere un documento, un'immagine o un URL HTML pubblico HTTP/HTTPS. L'origine deve esporre un Content-Length positivo e un formato supportato dalle intestazioni o dal nome file; I metadati mancanti, in conflitto o modificati non riescono a completare l'attività. Indirizzi privati, URL contenenti credenziali, risposte compresse o in blocchi vengono rifiutati. Al massimo 5 reindirizza. La creazione restituisce queued; gli errori di recupero vengono visualizzati più avanti in task.error.

Parametri corporei · application/json
CampoTipoObbligatorioDescrizione
source_urlstringSìURL di origine pubblico HTTP/HTTPS, soggetto a convalida dei metadati e delle dimensioni.
parse_typeinteger (0 | 1)N0: documenti generali (predefinito); 1: strutture chimiche.Predefinito: 0
force_ocrbooleanNtrue / false; Solo per PDF. Attivo: ignora il livello di testo e usa OCR. Disattivo: rilevamento automatico. Gli altri formati restano invariati.Predefinito: false
extra_formatsstring[]NArray di html, docx e/or latex, non una stringa JSON. Markdown e JSON sono già inclusi.Predefinito: []
Richiedi esempio · 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"]}'
Campi di risposta · 200 OK

HTTP 200 significa che l'attività è stata creata. code è 0, msg è ok e i dati contengono solo task_id. Interroga l'attività per ottenere status e results.

CampoTipoDescrizione
codeinteger0 sulla creazione dell'attività riuscita.
data.task_idstring (UUID)L'attività UUID è stata restituita come data.task_id al momento della creazione.
msgstringok sulla creazione dell'attività riuscita.
Esempio di risposta
>
{
  "code": 0,
  "data": {
    "task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
  },
  "msg": "ok"
}
Attività chimica · 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'

Elenca attività

GET/api/open/v1/tasks

Elenca insieme le tue attività web e API, iniziando dalla più recente. Gli elementi contengono solo task_id, status, credits, created_at e nome file, dimensione, mime_type e source_type. Dettagli della query per metadati del file, motivo dell'errore, scadenza e URL dei risultati. page_size accetta 1–100; valori non validi il valore predefinito è 20. la pagina sotto 1 il valore predefinito è 1.

Parametri di query

CampoTipoObbligatorioDescrizione
pageintegerNNumero di pagina basato su 1; non valido o inferiore a 1 utilizza 1.Predefinito: 1
page_sizeintegerNElementi per pagina, 1–100; i valori non validi utilizzano 20.Predefinito: 20
searchstringNFiltra per nome file in tutte le tue attività (fino a 255 caratteri).
statusstringNFiltro status opzionale: queued, running, completed, failed o expired. Separa più stati con virgole.
Richiedi esempio · cURL
>
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks?page=1&page_size=20" \
  -H "Authorization: Bearer $API_KEY"

Campi di risposta · 200 OK

CampoTipoDescrizione
data.itemsTaskSummary[]Riepiloghi delle attività contenenti solo campi nella tabella TaskSummary.
data.has_morebooleanSe è disponibile un'altra pagina.
data.pageintegerNumero di pagina basato su 1; non valido o inferiore a 1 utilizza 1.
data.page_sizeintegerElementi per pagina, 1–100; i valori non validi utilizzano 20.
Esempio di risposta
>
{
  "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

CampoTipoDescrizione
task_idstring (UUID)L'attività UUID è stata restituita come data.task_id al momento della creazione.
parse_typeinteger (0 | 1)0: documenti generali (predefinito); 1: strutture chimiche.
statusstringStato generale dell'attività; vedere Stati delle attività.
creditsintegerConteggio fatturabile: PDF pagine, PPT diapositive o Excel fogli di lavoro; Word, HTML e le immagini contano come 1. Sono 0 fino al termine dell'ispezione del file URL.
created_atstring (RFC3339)Registra l'ora di creazione in RFC3339.
file.namestringNome del file di input memorizzato; Le attività URL potrebbero inizialmente mostrare l'host di origine.
file.sizeinteger (int64)Byte effettivamente memorizzati; 0 prima del download dell'URL.
file.mime_typestringTipo MIME memorizzato; potrebbe essere vuoto durante il recupero.
file.source_typestringupload o url.

Ottieni attività results

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

Leggi data.task.status. results è sempre un dizionario: vuoto per queued, running, failed o expired e contiene gli URL dei documenti quando completed. L'URL ZIP è results.full_zip_url. Le attività non riuscite restituiscono HTTP 200 con code task_failed e il motivo in msg; expired results usa code result_expired.

Parametri del percorso

CampoTipoObbligatorioDescrizione
idstring (UUID)SìL'attività UUID è stata restituita come data.task_id al momento della creazione.
Richiedi esempio · cURL
>
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $API_KEY"

Campi di risposta · 200 OK

CampoTipoDescrizione
data.taskTaskOggetto attività, restituito sempre in caso di ricerca dei dettagli riuscita.
data.fileFileOggetto File di input; I metadati dell'URL potrebbero non essere ancora pronti.
data.resultsobjectUn dizionario di URL di file e immagini. Le attività non completate, failed o expired restituiscono un dizionario vuoto.
Risposta in elaborazione · 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": {}
  }
}
Esempio di risposta · 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"
    }
  }
}
Risposta all'attività non riuscita · 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": {}
  }
}
Attività chimica · completata
>
{
  "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

CampoTipoDescrizione
task_idstring (UUID)L'attività UUID è stata restituita come data.task_id al momento della creazione.
parse_typeinteger (0 | 1)0: documenti generali (predefinito); 1: strutture chimiche.
statusstringStato generale dell'attività; vedere Stati delle attività.
creditsintegerConteggio fatturabile: PDF pagine, PPT diapositive o Excel fogli di lavoro; Word, HTML e le immagini contano come 1. Sono 0 fino al termine dell'ispezione del file URL.
force_ocrbooleantrue / false; Solo per PDF. Attivo: ignora il livello di testo e usa OCR. Disattivo: rilevamento automatico. Gli altri formati restano invariati.
expires_atstring | null (RFC3339)Termine ultimo per la conservazione dell'incarico; potrebbe essere null prima che i risultati/failure vengano registrati.
errorstringElaborazione error o messaggio di ripristino; vuoto quando nessuno.
created_atstring (RFC3339)Registra l'ora di creazione in RFC3339.

File

CampoTipoDescrizione
namestringNome del file di input memorizzato; Le attività URL potrebbero inizialmente mostrare l'host di origine.
sizeinteger (int64)Byte effettivamente memorizzati; 0 prima del download dell'URL.
mime_typestringTipo MIME memorizzato; potrebbe essere vuoto durante il recupero.
suffixstringEstensione minuscola senza punto; potrebbe essere vuoto durante il recupero.
source_typestringupload o url.
source_urlstringURL di origine inviato dall'utente; vuoto per i file caricati.

results

CampoTipoDescrizione
original_urlstringURL del file originale firmato.
json_urlstringURL del JSON chimico; restituito solo per parse_type=1.
markdown_urlstringURL nativo markdown.md firmato per la lettura in anteprima.
middle_json_urlstringURL firmato middle_json.json con pagine, struttura a blocchi e riquadri di delimitazione normalizzati.
structured_json_urlstringURL firmato structured_content.json; omesso se la risorsa è assente.
imagesRecord<string, string>Mappa dei percorsi relativi nativi agli URL di immagini firmate; oggetto vuoto quando non ci sono immagini.
full_zip_urlstringresults.full_zip_url è l'URL finale API ZIP firmato, restituito solo quando completed e conservato.

Note di riferimento

Formati e limiti

Limiti Pro: 200 MiB per documento, 50 MiB per immagine e 500 unità fatturabili. API e condividi sul web 5 al giorno più 1,000 unità mensili, utilizzando prima le unità giornaliere. L'utilizzo viene riservato dopo la convalida e addebitato quando il risultato dell'analisi di base viene salvato. L'errore di analisi confermato o la terminazione rilasciano prenotazioni. L'errore Publication/export non rimborsa l'analisi riuscita; failed o l'esecuzione scaduta rilascia automaticamente le prenotazioni non addebitate. Le esportazioni non verranno addebitate nuovamente.

FormatoEstensioni dei nomi fileUnità fatturabili
PDF.pdfPagine fisiche PDF
Word.doc, .docx1 unità per file
PowerPoint.ppt, .pptxNumero di diapositive
Excel.xls, .xlsxNumero di fogli di lavoro
Immagini.png, .jpg, .jpeg, .webp, .gif, .bmp, .tif, .tiff1 unità per file
HTML.html, .htm1 unità per file

Il formato di caricamento è determinato dall'estensione del nome file, senza distinzione tra maiuscole e minuscole. PDF, PowerPoint e Excel devono avere metadati della pagina/unit leggibili. MIME non viene utilizzato per convalidare i contenuti caricati. File vuoti, estensioni non supportate, PDF crittografati o illeggibili e input superiori al limite vengono rifiutati. L'analisi HTML è statica e non esegue JavaScript. 1 MiB = 1,048,576 byte.

Stati delle attività

Continua a interrogare queued o running. Scarica su completed; leggi error e fermati su failed. expired significa che la conservazione è terminata. status descrive l'intera attività; Le attività API vengono completate solo quando la ZIP finale è pronta.

task.statusDescrizione
queuedAccettato; in attesa di elaborazione o recupero dell'input URL.
runningElaborazione, inclusa l'analisi, il salvataggio del packaging results e API.
completedIl risultato finale è pronto per essere interrogato e scaricato.
failedElaborazione failed; leggi error. Non creare automaticamente un'attività sostitutiva.
expiredIl termine per la conservazione dei risultati in expires_at è scaduto; nessun URL di download.

ZIP results e download

API produce un ZIP finale. Markdown, Medio JSON, strutturato JSON e le immagini salvate sono incluse per impostazione predefinita. extra_formats supporta solo html, docx e latex; i file richiesti vengono aggiunti allo stesso ZIP. Non creare un processo di esportazione Web separato per un'attività API. Nessun extra significa che results.full_zip_url punta a base.zip; gli extra indicano che punta al file exports/a ZIP.

Le attività chimiche restituiscono results.original_url e results.json_url, senza ZIP né esportazioni aggiuntive.

Il risultato chimico è un array JSON con tutti i campi nativi MolParser per molecola. In assenza di molecole restituisce [].

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)

I risultati vengono conservati per 7 giorni. results.full_zip_url è firmato per un massimo di 15 minuti e mai oltre la conservazione. Scarica con un semplice GET, senza Authorization. Se la firma scade mentre è ancora conservata, richiedere nuovamente i dettagli per un nuovo URL. I collegamenti alle immagini di anteprima durano al massimo 2 ore; altri collegamenti a file durano al massimo 15 minuti.

I documenti ZIP mantengono i riferimenti alle immagini relative native e includono le immagini salvate, quindi tali riferimenti non dipendono dalle firme CDN. Estrai l'intero archivio e mantieni la struttura delle cartelle. Le immagini remote a cui fa riferimento l'input HTML non vengono archiviate automaticamente e potrebbero comunque puntare al sito Web di origine.

Errori e ripristino

code 0 indica successo. Un code diverso da zero identifica la categoria di errore; msg ne spiega il motivo. Le attività non riuscite o scadute restituiscono HTTP 200 con task_failed o result_expired e un oggetto results vuoto.

HTTP 402
>
{
  "code": "quota_exceeded",
  "data": null,
  "msg": "not enough available pages/units"
}
HTTPcodeDescrizione
200task_failedAnalisi non riuscita. Consulta msg per il motivo.
200result_expiredI risultati sono scaduti.
400invalid_requestParametri o file non validi. Consulta msg per il motivo.
400too_many_pagesIl documento supera il limite di pagine o unità fatturabili.
401unauthorizedAutenticazione API non riuscita.
402quota_exceededQuota disponibile insufficiente.
403user_disabledL’account è disabilitato.
403pro_requiredÈ richiesto un abbonamento Pro attivo.
404not_foundAttività non trovata o accesso negato.
413file_too_largeIl file supera il limite di dimensione del tuo piano.
500internal_errorElaborazione del server non riuscita. Consulta msg per il motivo.