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.
https://YOUR_API_HOST/api/open/v1Sostituisci 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.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Authorization | string | Sì | Bearer seguito dal tasto Pro API; richiesto su ogni endpoint. |
Authorization: Bearer sk-YOUR_API_KEYConserva 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.
# 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à
/api/open/v1/tasksUn 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
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
file | binary | Sì | Un file; il nome file deve includere un'estensione supportata. |
parse_type | string (0 | 1) | N | 0: documenti generali (predefinito); 1: strutture chimiche.Predefinito: 0 |
force_ocr | string (true | false) | N | true / false; Solo per PDF. Attivo: ignora il livello di testo e usa OCR.
Disattivo: rilevamento automatico. Gli altri formati restano invariati.Predefinito: false |
extra_formats | string (JSON) | N | Stringa di array con codifica JSON, e.g. ["docx","html"].
Valori: html, docx, latex.Predefinito: [] |
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.
| Campo | Tipo | Descrizione |
|---|---|---|
code | integer | 0 sulla creazione dell'attività riuscita. |
data.task_id | string (UUID) | L'attività UUID è stata restituita come data.task_id al momento della creazione. |
msg | string | ok sulla creazione dell'attività riuscita. |
{
"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
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
source_url | string | Sì | URL di origine pubblico HTTP/HTTPS, soggetto a convalida dei metadati e delle dimensioni. |
parse_type | integer (0 | 1) | N | 0: documenti generali (predefinito); 1: strutture chimiche.Predefinito: 0 |
force_ocr | boolean | N | true / false; Solo per PDF. Attivo: ignora il livello di testo e usa OCR.
Disattivo: rilevamento automatico. Gli altri formati restano invariati.Predefinito: false |
extra_formats | string[] | N | Array di html, docx e/or latex, non una stringa JSON. Markdown e JSON sono già
inclusi.Predefinito: [] |
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.
| Campo | Tipo | Descrizione |
|---|---|---|
code | integer | 0 sulla creazione dell'attività riuscita. |
data.task_id | string (UUID) | L'attività UUID è stata restituita come data.task_id al momento della creazione. |
msg | string | ok sulla creazione dell'attività riuscita. |
{
"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'
Elenca attività
/api/open/v1/tasksElenca 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
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
page | integer | N | Numero di pagina basato su 1; non valido o inferiore a 1 utilizza 1.Predefinito: 1 |
page_size | integer | N | Elementi per pagina, 1–100; i valori non validi utilizzano 20.Predefinito: 20 |
search | string | N | Filtra per nome file in tutte le tue attività (fino a 255 caratteri). |
status | string | N | Filtro status opzionale: queued, running, completed, failed o expired. Separa più stati con virgole. |
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
| Campo | Tipo | Descrizione |
|---|---|---|
data.items | TaskSummary[] | Riepiloghi delle attività contenenti solo campi nella tabella TaskSummary. |
data.has_more | boolean | Se è disponibile un'altra pagina. |
data.page | integer | Numero di pagina basato su 1; non valido o inferiore a 1 utilizza 1. |
data.page_size | integer | Elementi per pagina, 1–100; i valori non validi utilizzano 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
| Campo | Tipo | Descrizione |
|---|---|---|
task_id | string (UUID) | L'attività UUID è stata restituita come data.task_id al momento della creazione. |
parse_type | integer (0 | 1) | 0: documenti generali (predefinito); 1: strutture chimiche. |
status | string | Stato generale dell'attività; vedere Stati delle attività. |
credits | integer | Conteggio 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_at | string (RFC3339) | Registra l'ora di creazione in RFC3339. |
file.name | string | Nome del file di input memorizzato; Le attività URL potrebbero inizialmente mostrare l'host di origine. |
file.size | integer (int64) | Byte effettivamente memorizzati; 0 prima del download dell'URL. |
file.mime_type | string | Tipo MIME memorizzato; potrebbe essere vuoto durante il recupero. |
file.source_type | string | upload o url. |
Ottieni attività results
/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
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
id | string (UUID) | Sì | L'attività UUID è stata restituita come data.task_id al momento della creazione. |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks/$TASK_ID" \
-H "Authorization: Bearer $API_KEY"Campi di risposta · 200 OK
| Campo | Tipo | Descrizione |
|---|---|---|
data.task | Task | Oggetto attività, restituito sempre in caso di ricerca dei dettagli riuscita. |
data.file | File | Oggetto File di input; I metadati dell'URL potrebbero non essere ancora pronti. |
data.results | object | Un dizionario di URL di file e immagini. Le attività non completate, failed o expired restituiscono un dizionario vuoto. |
{
"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
| Campo | Tipo | Descrizione |
|---|---|---|
task_id | string (UUID) | L'attività UUID è stata restituita come data.task_id al momento della creazione. |
parse_type | integer (0 | 1) | 0: documenti generali (predefinito); 1: strutture chimiche. |
status | string | Stato generale dell'attività; vedere Stati delle attività. |
credits | integer | Conteggio 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_ocr | boolean | true / false; Solo per PDF. Attivo: ignora il livello di testo e usa OCR. Disattivo: rilevamento automatico. Gli altri formati restano invariati. |
expires_at | string | null (RFC3339) | Termine ultimo per la conservazione dell'incarico; potrebbe essere null prima che i risultati/failure vengano registrati. |
error | string | Elaborazione error o messaggio di ripristino; vuoto quando nessuno. |
created_at | string (RFC3339) | Registra l'ora di creazione in RFC3339. |
File
| Campo | Tipo | Descrizione |
|---|---|---|
name | string | Nome del file di input memorizzato; Le attività URL potrebbero inizialmente mostrare l'host di origine. |
size | integer (int64) | Byte effettivamente memorizzati; 0 prima del download dell'URL. |
mime_type | string | Tipo MIME memorizzato; potrebbe essere vuoto durante il recupero. |
suffix | string | Estensione minuscola senza punto; potrebbe essere vuoto durante il recupero. |
source_type | string | upload o url. |
source_url | string | URL di origine inviato dall'utente; vuoto per i file caricati. |
results
| Campo | Tipo | Descrizione |
|---|---|---|
original_url | string | URL del file originale firmato. |
json_url | string | URL del JSON chimico; restituito solo per parse_type=1. |
markdown_url | string | URL nativo markdown.md firmato per la lettura in anteprima. |
middle_json_url | string | URL firmato middle_json.json con pagine, struttura a blocchi e riquadri di delimitazione normalizzati. |
structured_json_url | string | URL firmato structured_content.json; omesso se la risorsa è assente. |
images | Record<string, string> | Mappa dei percorsi relativi nativi agli URL di immagini firmate; oggetto vuoto quando non ci sono immagini. |
full_zip_url | string | results.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.
| Formato | Estensioni dei nomi file | Unità fatturabili |
|---|---|---|
.pdf | Pagine fisiche PDF | |
| Word | .doc, .docx | 1 unità per file |
| PowerPoint | .ppt, .pptx | Numero di diapositive |
| Excel | .xls, .xlsx | Numero di fogli di lavoro |
| Immagini | .png, .jpg, .jpeg, .webp, .gif, .bmp, .tif, .tiff | 1 unità per file |
| HTML | .html, .htm | 1 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.status | Descrizione |
|---|---|
queued | Accettato; in attesa di elaborazione o recupero dell'input URL. |
running | Elaborazione, inclusa l'analisi, il salvataggio del packaging results e API. |
completed | Il risultato finale è pronto per essere interrogato e scaricato. |
failed | Elaborazione failed; leggi error. Non creare automaticamente un'attività sostitutiva. |
expired | Il 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 [].
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)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.
{
"code": "quota_exceeded",
"data": null,
"msg": "not enough available pages/units"
}| HTTP | code | Descrizione |
|---|---|---|
| 200 | task_failed | Analisi non riuscita. Consulta msg per il motivo. |
| 200 | result_expired | I risultati sono scaduti. |
| 400 | invalid_request | Parametri o file non validi. Consulta msg per il motivo. |
| 400 | too_many_pages | Il documento supera il limite di pagine o unità fatturabili. |
| 401 | unauthorized | Autenticazione API non riuscita. |
| 402 | quota_exceeded | Quota disponibile insufficiente. |
| 403 | user_disabled | L’account è disabilitato. |
| 403 | pro_required | È richiesto un abbonamento Pro attivo. |
| 404 | not_found | Attività non trovata o accesso negato. |
| 413 | file_too_large | Il file supera il limite di dimensione del tuo piano. |
| 500 | internal_error | Elaborazione del server non riuscita. Consulta msg per il motivo. |