Aan de slag
Overzicht
Maak één taak per bestand of URL, poll de status ervan en download vervolgens de ZIP. Verzoeken zijn asynchroon. Pro Monthly en Pro Annual ondersteunen de API; Gratis niet.
https://YOUR_API_HOST/api/open/v1Vervang YOUR_API_HOST door uw API domein. Alle onderstaande paden gebruiken deze basis-URL. In de voorbeelden worden tijdelijke ID's en ondertekende URL's gebruikt.
Authenticatie
Verzend Authorization: Bearer gevolgd door uw Pro API-sleutel bij elk API-verzoek. Haal de sleutel op of reset deze met de sleutelknop API. Sleutels zijn hoofdlettergevoelig: sk- plus 24 willekeurige letters en cijfers. JWT's voor gebruikersaanmelding verifiëren deze eindpunten niet.
| Veld | Typ | Vereist | Beschrijving |
|---|---|---|---|
Authorization | string | Ja | Bearer gevolgd door de Pro API-toets; vereist op elk eindpunt. |
Authorization: Bearer sk-YOUR_API_KEYBewaar de sleutel op uw server. Stel het niet bloot in openbare frontend code, repository's of downloadverzoeken. Downloads gebruiken hun eigen ondertekende URL. Door het resetten van de sleutel wordt de oude sleutel onmiddellijk ongeldig; Voor API toegang is ook een actief Pro-lidmaatschap vereist.
Snelle start
Vervang de API host, stel MINERU_API_KEY in en geef paper.pdf op. Deze voorbeelden worden één keer geüpload, elke 3 seconden gepolst gedurende maximaal 30 minuten, en streamen vervolgens de ZIP naar schijf. De polling-time-out is een clientlimiet en annuleert de servertaak niet. Gebruik de taak-ID om door te gaan met het opvragen. Python vereist het pakket requests; Node.js heeft versie 20+ nodig; cURL gebruikt Bash en 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 eindpunten
Maak een taak aan
/api/open/v1/tasksEén eindpunt: POST /api/open/v1/tasks. Kies één invoermethode: upload een bestand met multipart/form-data, of verzend source_url met JSON. Beide retourneren data.task_id voor dezelfde taakquerystroom. Elke geaccepteerde inzending creëert een nieuwe taak.
De chemische modus accepteert alleen PDF’s en afbeeldingen. force_ocr en extra_formats zijn niet beschikbaar.
Optie 1: upload een bestand
Upload precies één bestand rechtstreeks naar de API-server. Laat uw HTTP-client de meerdelige grens instellen; stel Content-Type niet handmatig in. Alleen bestand verzenden en optioneel force_ocr en extra_formats. De server controleert de ontvangen bytes en eenheden voordat deze worden opgeslagen en in de wachtrij worden geplaatst. Er is geen afzonderlijk upload-voltooiingsverzoek nodig.
Lichaamsparameters · multipart/form-data
| Veld | Typ | Vereist | Beschrijving |
|---|---|---|---|
file | binary | Ja | Eén bestand; bestandsnaam moet een ondersteunde extensie bevatten. |
parse_type | string (0 | 1) | Nee | 0: algemene documenten (standaard); 1: chemische structuren.Standaard: 0 |
force_ocr | string (true | false) | Nee | true / false; Alleen voor PDF. Aan: negeer de bestaande tekstlaag en gebruik
OCR. Uit: automatisch detecteren. Andere formaten blijven ongewijzigd.Standaard: false |
extra_formats | string (JSON) | Nee | JSON-gecodeerde arrayreeks, e.g. ["docx", "html"]. Waarden:
html, docx, latex.Standaard: [] |
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"]'Antwoordvelden · 200 OK
HTTP 200 betekent dat de taak is gemaakt. code is 0, msg is ok en de gegevens bevatten alleen task_id. Voer een query uit op de taak om de status en results op te halen.
| Veld | Typ | Beschrijving |
|---|---|---|
code | integer | 0 bij succesvolle taakcreatie. |
data.task_id | string (UUID) | Taak UUID retourneert als data.task_id wanneer deze wordt gemaakt. |
msg | string | ok bij succesvolle taakcreatie. |
{
"code": 0,
"data": {
"task_id": "a90e6ab6-44f3-4554-b459-b62fe4c6b436"
},
"msg": "ok"
}
Optie 2: geef een URL op
Verzend JSON in plaats van multipart. source_url moet een openbaar HTTP/HTTPS document, afbeelding of HTML URL zijn. De bron moet een positieve Content-Length en een ondersteund formaat uit headers of bestandsnaam weergeven; ontbrekende, conflicterende of gewijzigde metagegevens slagen er niet in. Privéadressen, URL's met inloggegevens en gecomprimeerde of opgedeelde antwoorden worden afgewezen. Maximaal 5 omleidingen. Creatie retourneert queued; ophaalfouten verschijnen later in task.error.
Lichaamsparameters · application/json
| Veld | Typ | Vereist | Beschrijving |
|---|---|---|---|
source_url | string | Ja | Openbare HTTP/HTTPS bron-URL, onderhevig aan validatie van metagegevens en grootte. |
parse_type | integer (0 | 1) | Nee | 0: algemene documenten (standaard); 1: chemische structuren.Standaard: 0 |
force_ocr | boolean | Nee | true / false; Alleen voor PDF. Aan: negeer de bestaande tekstlaag en gebruik
OCR. Uit: automatisch detecteren. Andere formaten blijven ongewijzigd.Standaard: false |
extra_formats | string[] | Nee | Array van html, docx en/or latex, geen JSON-reeks. Markdown en JSON zijn al
inbegrepen.Standaard: [] |
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"]}'Antwoordvelden · 200 OK
HTTP 200 betekent dat de taak is gemaakt. code is 0, msg is ok en de gegevens bevatten alleen task_id. Voer een query uit op de taak om de status en results op te halen.
| Veld | Typ | Beschrijving |
|---|---|---|
code | integer | 0 bij succesvolle taakcreatie. |
data.task_id | string (UUID) | Taak UUID retourneert als data.task_id wanneer deze wordt gemaakt. |
msg | string | ok bij succesvolle taakcreatie. |
{
"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'
Lijst met taken
/api/open/v1/tasksGeeft uw web- en API-taken samen weer, de nieuwste eerst. Items bevatten alleen task_id, status, credits, created_at en bestandsnaam, grootte, mime_type en source_type. Querydetails voor bestandsmetadata, foutreden, vervaldatum en resultaat-URL's. page_size accepteert 1–100; ongeldige waarden zijn standaard 20. pagina hieronder 1 standaard 1.
Queryparameters
| Veld | Typ | Vereist | Beschrijving |
|---|---|---|---|
page | integer | Nee | 1-gebaseerd paginanummer; ongeldig of lager dan 1 gebruikt 1.Standaard: 1 |
page_size | integer | Nee | Artikelen per pagina, 1–100; ongeldige waarden gebruiken 20.Standaard: 20 |
search | string | Nee | Filter op bestandsnaam voor al uw taken (tot 255 tekens). |
status | string | Nee | Optioneel status-filter: queued, running, completed, failed of expired. Scheid meerdere statussen met komma's. |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks?page=1&page_size=20" \
-H "Authorization: Bearer $API_KEY"Antwoordvelden · 200 OK
| Veld | Typ | Beschrijving |
|---|---|---|
data.items | TaskSummary[] | Taaksamenvattingen die alleen velden in de tabel TaskSummary bevatten. |
data.has_more | boolean | Of er nog een pagina beschikbaar is. |
data.page | integer | 1-gebaseerd paginanummer; ongeldig of lager dan 1 gebruikt 1. |
data.page_size | integer | Artikelen per pagina, 1–100; ongeldige waarden gebruiken 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
| Veld | Typ | Beschrijving |
|---|---|---|
task_id | string (UUID) | Taak UUID retourneert als data.task_id wanneer deze wordt gemaakt. |
parse_type | integer (0 | 1) | 0: algemene documenten (standaard); 1: chemische structuren. |
status | string | Algemene taakstatus; zie Taakstatussen. |
credits | integer | Factureerbaar aantal: PDF pagina's, PPT dia's of Excel werkbladen; Word, HTML en afbeeldingen tellen als 1. Het duurt 0 totdat de inspectie van het URL-bestand is voltooid. |
created_at | string (RFC3339) | Aanmaaktijd van record in RFC3339. |
file.name | string | Naam van opgeslagen invoerbestand; URL-taken kunnen in eerste instantie de bronhost tonen. |
file.size | integer (int64) | Werkelijk opgeslagen bytes; 0 vóór het downloaden van de URL. |
file.mime_type | string | Opgeslagen MIME type; kan leeg zijn tijdens het ophalen. |
file.source_type | string | upload of url. |
Taak results ophalen
/api/open/v1/tasks/{id}Lees data.task.status. results is altijd een woordenboek: leeg voor queued, running, failed of expired, en bevat document-URL's als completed. De ZIP-URL is results.full_zip_url. Mislukte taken retourneren HTTP 200 met code task_failed en de reden in msg; expired results gebruik code result_expired.
Padparameters
| Veld | Typ | Vereist | Beschrijving |
|---|---|---|---|
id | string (UUID) | Ja | Taak UUID retourneert als data.task_id wanneer deze wordt gemaakt. |
curl --fail-with-body "https://YOUR_API_HOST/api/open/v1/tasks/$TASK_ID" \
-H "Authorization: Bearer $API_KEY"Antwoordvelden · 200 OK
| Veld | Typ | Beschrijving |
|---|---|---|
data.task | Task | Taakobject, wordt altijd geretourneerd bij het succesvol opzoeken van details. |
data.file | File | Invoerbestandsobject; URL-metagegevens zijn mogelijk nog niet gereed. |
data.results | object | Een woordenboek met bestands- en afbeeldings-URL's. Onvoltooide, failed of expired taken retourneren een leeg woordenboek. |
{
"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
| Veld | Typ | Beschrijving |
|---|---|---|
task_id | string (UUID) | Taak UUID retourneert als data.task_id wanneer deze wordt gemaakt. |
parse_type | integer (0 | 1) | 0: algemene documenten (standaard); 1: chemische structuren. |
status | string | Algemene taakstatus; zie Taakstatussen. |
credits | integer | Factureerbaar aantal: PDF pagina's, PPT dia's of Excel werkbladen; Word, HTML en afbeeldingen tellen als 1. Het duurt 0 totdat de inspectie van het URL-bestand is voltooid. |
force_ocr | boolean | true / false; Alleen voor PDF. Aan: negeer de bestaande tekstlaag en gebruik OCR. Uit: automatisch detecteren. Andere formaten blijven ongewijzigd. |
expires_at | string | null (RFC3339) | Deadline voor het bewaren van taken; kan null zijn voordat de resultaten/failure worden geregistreerd. |
error | string | Verwerken van error of herstelbericht; leeg als er geen is. |
created_at | string (RFC3339) | Aanmaaktijd van record in RFC3339. |
File
| Veld | Typ | Beschrijving |
|---|---|---|
name | string | Naam van opgeslagen invoerbestand; URL-taken kunnen in eerste instantie de bronhost tonen. |
size | integer (int64) | Werkelijk opgeslagen bytes; 0 vóór het downloaden van de URL. |
mime_type | string | Opgeslagen MIME type; kan leeg zijn tijdens het ophalen. |
suffix | string | Kleine letterextensie zonder punt; kan leeg zijn tijdens het ophalen. |
source_type | string | upload of url. |
source_url | string | Door gebruiker ingediende bron-URL; leeg voor geüploade bestanden. |
results
| Veld | Typ | Beschrijving |
|---|---|---|
original_url | string | Ondertekende originele bestands-URL. |
json_url | string | Download-URL voor chemische JSON; alleen bij parse_type=1. |
markdown_url | string | Ondertekende native markdown.md URL voor voorbeeldlezen. |
middle_json_url | string | Ondertekende middle_json.json URL met pagina's, blokstructuur en genormaliseerde selectiekaders. |
structured_json_url | string | Ondertekende structured_content.json URL; weggelaten als de bron afwezig is. |
images | Record<string, string> | Kaart met native relatieve paden naar ondertekende afbeeldings-URL's; leeg object als er geen afbeeldingen zijn. |
full_zip_url | string | results.full_zip_url is de ondertekende uiteindelijke API ZIP URL, die alleen wordt geretourneerd als completed en behouden blijft. |
Referentienotities
Formaten en limieten
Pro-limieten: 200 MiB per document, 50 MiB per afbeelding en 500 factureerbare eenheden. API en webshare 5 dagelijks plus 1,000 maandelijkse eenheden, waarbij eerst de dagelijkse eenheden worden gebruikt. Het gebruik wordt gereserveerd na validatie en in rekening gebracht wanneer het basisparseresultaat wordt opgeslagen. Bij een bevestigde parseerfout of beëindiging worden reserveringen vrijgegeven. Een publicatie/export-fout geeft geen restitutie voor succesvol paren; Bij failed of een time-outuitvoering worden niet-gefactureerde reserveringen automatisch vrijgegeven. Bij export worden geen kosten in rekening gebracht.
| Formaat | Bestandsnaamextensies | Factureerbare eenheden |
|---|---|---|
.pdf | Fysieke PDF pagina's | |
| Word | .doc, .docx | 1 eenheid per bestand |
| PowerPoint | .ppt, .pptx | Aantal dia's |
| Excel | .xls, .xlsx | Aantal werkbladen |
| Afbeeldingen | .png, .jpg, .jpeg, .webp, .gif, .bmp, .tif, .tiff | 1 eenheid per bestand |
| HTML | .html, .htm | 1 eenheid per bestand |
Het uploadformaat wordt bepaald door de bestandsnaamextensie, hoofdletterongevoelig. PDF, PowerPoint en Excel moeten leesbare pagina/unit-metagegevens hebben. MIME wordt niet gebruikt om geüploade inhoud te valideren. Lege bestanden, niet-ondersteunde extensies, gecodeerde of onleesbare PDF's en invoerlimieten worden afgewezen. HTML parseren is statisch en er wordt geen JavaScript uitgevoerd. 1 MiB = 1,048,576 bytes.
Taakstatussen
Blijf pollen queued of running. Downloaden op completed; lees error en stop bij failed. expired betekent dat de bewaring is beëindigd. status beschrijft de hele taak; API taken zijn pas voltooid als de laatste ZIP klaar is.
| task.status | Beschrijving |
|---|---|
queued | Geaccepteerd; in afwachting van verwerking of ophalen van URL-invoer. |
running | Verwerking, inclusief parseren, opslaan van results en API verpakkingen. |
completed | Het eindresultaat is klaar om op te vragen en te downloaden. |
failed | Verwerken failed; lees error. Maak niet automatisch een vervangende taak aan. |
expired | De deadline voor het bewaren van resultaten in expires_at is verstreken; geen download-URL's. |
ZIP results en downloads
De API produceert één laatste ZIP. Markdown, Midden JSON, gestructureerde JSON en opgeslagen afbeeldingen zijn standaard inbegrepen. extra_formats ondersteunt alleen html, docx en latex; de gevraagde bestanden worden toegevoegd aan diezelfde ZIP. Maak geen afzonderlijke webexporttaak voor een API-taak. Geen extra's betekent dat results.full_zip_url verwijst naar base.zip; extra's betekenen dat het verwijst naar het exports/a ZIP bestand.
Chemische taken leveren results.original_url en results.json_url, zonder ZIP of andere exportformaten.
Chemische resultaten zijn een JSON-array met alle oorspronkelijke MolParser-velden per molecuul. Zonder moleculen wordt [] geretourneerd.
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)Resultaten worden 7 dagen bewaard. results.full_zip_url wordt voor maximaal 15 minuten ondertekend en nooit langer bewaard. Download met een gewone GET, zonder Authorization. Als de handtekening verloopt terwijl deze nog steeds behouden is, vraagt u de details opnieuw op voor een nieuwe URL. Links naar voorbeeldafbeeldingen duren maximaal 2 uur; andere bestandslinks duren maximaal 15 minuten.
ZIP documenten behouden de oorspronkelijke relatieve afbeeldingsreferenties en bevatten opgeslagen afbeeldingen, zodat deze referenties niet afhankelijk zijn van CDN handtekeningen. Pak het hele archief uit en behoud de mappenstructuur. Afbeeldingen op afstand waarnaar wordt verwezen door HTML-invoer, worden niet automatisch gearchiveerd en verwijzen mogelijk nog steeds naar de bronwebsite.
Fouten en herstel
code 0 betekent succes. Een andere code geeft de foutcategorie aan; msg geeft de reden. Opvragen van mislukte of verlopen taken retourneert HTTP 200 met task_failed of result_expired en een leeg results-object.
{
"code": "quota_exceeded",
"data": null,
"msg": "not enough available pages/units"
}| HTTP | code | Beschrijving |
|---|---|---|
| 200 | task_failed | Analyse mislukt. Bekijk msg voor de reden. |
| 200 | result_expired | De resultaten zijn verlopen. |
| 400 | invalid_request | Ongeldige parameters of bestand. Bekijk msg voor de reden. |
| 400 | too_many_pages | Het document overschrijdt de limiet voor pagina’s of factureerbare eenheden. |
| 401 | unauthorized | API-authenticatie mislukt. |
| 402 | quota_exceeded | Onvoldoende beschikbaar quotum. |
| 403 | user_disabled | Het account is uitgeschakeld. |
| 403 | pro_required | Een actief Pro-abonnement is vereist. |
| 404 | not_found | Taak niet gevonden of toegang geweigerd. |
| 413 | file_too_large | Het bestand overschrijdt de groottelimiet van uw abonnement. |
| 500 | internal_error | Serververwerking mislukt. Bekijk msg voor de reden. |