DEVELOPER API REFERENCE

MarkifyDoc Entwickler-API-Referenz

RESTful API und ereignisgesteuerte Webhook-Architektur für RAG-Wissensdatenbanken und automatisierte Finanzberichtsanalyse.

文档目录导航

Überblick & Base-URL

MarkifyDoc bietet moderne RESTful APIs, um akademische Arbeiten und Finanzberichte in strukturierte Markdown-Dokumente mit KaTeX-Formeln umzuwandeln.

Base URLhttps://api.markifydoc.com
Datenformatapplication/json
ÜbertragungsprotokollHTTPS (TLS 1.3 zwingend)

Authentifizierung & API-Keys

Alle Anfragen an /api/v1/* erfordern einen gültigen Bearer API-Key im Authorization-Header.

Header-Format
Authorization: Bearer mkd_xxxxxxxxxxxxxxxxxxxxxxxx
Sicherheitshinweis

Ihr API-Key berechtigt zum Verbrauch Ihrer Parsing-Credits. Speichern Sie ihn sicher in Umgebungsvariablen (.env).

Ratenbegrenzung & Prioritäten

Adaptive Ratenbegrenzung und GPU-Warteschlangenprioritäten je nach Konto-Stufe:

StufeLimit (RPM)Max. ParallelitätGPU-Priorität
Kostenlos (Free)10 RPM1 TaskNormale Warteschlange
Pay-As-You-Go60 RPM3 TasksNormale Warteschlange
Pro / API-Tarif300 RPM10+ TasksHohe Priorität (Private GPU)

Standard-Workflow

Für maximale Zuverlässigkeit nutzt MarkifyDoc direkte vorab signierte Uploads und asynchrone GPU-Verarbeitung:

1. Vorab signierte URL anfordern

Rufen Sie /api/v1/upload-url auf, um eine direkte S3/R2-Upload-URL zu erhalten.

2. Direkter Upload

Laden Sie die PDF-Datei per PUT direkt in den Objektspeicher hoch.

3. Parsing starten

Rufen Sie /api/v1/parse auf und übergeben Sie optional eine callback_url.

4. Ergebnisse abrufen oder Webhook empfangen

Fragen Sie den Status ab oder warten Sie auf die automatische Webhook-Benachrichtigung.

API REFERENCE

REST API 核心端点规范

POST/api/v1/upload-url

Sichere temporäre Upload-URL für direkte PDF-Übertragung anfordern (15 Min. gültig).

Body
FeldTypPflichtfeldBeschreibung
filenamestringPflicht
待上传的 PDF 文件全名(例如 nature_paper.pdf,必须以 .pdf 结尾)
file_sizeintegerOptional
文件字节大小,用于阶梯前置容量校验(最大限制 50MB)
获取直传预签名 URL 示例
curl -X POST https://api.markifydoc.com/api/v1/upload-url \
  -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "quantum_physics_paper.pdf",
    "file_size": 3145728
  }'
客户端直接上传源文件(PUT 请求)
PUT 直传文件
# 客户端使用 PUT 方法直接上传原始 PDF 二进制流
curl -X PUT "<upload_url>" \
  -H "Content-Type: application/pdf" \
  --data-binary "@./quantum_physics_paper.pdf"
POST/api/v1/parse

Hochgeladenes PDF zur KI-gestützten Multimodal-Analyse einreihen.

Body
FeldTypPflichtfeldBeschreibung
r2_source_keystringPflicht
第一步获取到的 R2 存储路径(例如 uploads/task_uuid/source.pdf)
original_filenamestringPflicht
文档原始名称
pages_estimatedintegerPflicht
预估解析页数,用于预扣点数校验(1 点/页,多扣失败页自动退还)
默认值: 1
callback_urlstringOptional
解析完毕后的 Webhook 异步回调地址
optionsobjectOptional
解析可选配置:enable_formula (默认 true), enable_table (默认 true)
提交多模态解析任务
curl -X POST https://api.markifydoc.com/api/v1/parse \
  -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "r2_source_key": "uploads/0c1d2e3f-4567/source.pdf",
    "original_filename": "quantum_physics_paper.pdf",
    "pages_estimated": 12,
    "callback_url": "https://api.yourdomain.com/webhook/pdf-parsed",
    "options": {
      "enable_formula": true,
      "enable_table": true
    }
  }'
GET/api/v1/tasks/{task_id}

Status, Seitenzahlen, Fehlermeldungen und Download-URLs für Markdown/ZIP abrufen.

Pfad-Parameter
FeldTypPflichtfeldBeschreibung
task_idstring (UUID)Pflicht
提交任务时系统生成的唯一任务标识
查询单个任务状态与产物
curl -X GET https://api.markifydoc.com/api/v1/tasks/0c1d2e3f-4567 \
  -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx"
GET/api/v1/tasks

Paginierte Liste aller unter Ihrem Konto erstellten Parsing-Tasks abrufen.

Query-Parameter
FeldTypPflichtfeldBeschreibung
pageintegerOptional
页码编号
默认值: 1
page_sizeintegerOptional
每页任务数量(最大 100)
默认值: 20
statusstringOptional
按状态过滤:QUEUED, PROCESSING, SUCCESS, PARTIAL_SUCCESS, FAILED
分页获取历史任务
curl -X GET "https://api.markifydoc.com/api/v1/tasks?page=1&page_size=10&status=SUCCESS" \
  -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx"
POST/api/v1/tasks/{task_id}/retry

Fehlgeschlagene Tasks ohne erneuten Datei-Upload neu einplanen.

Pfad-Parameter
FeldTypPflichtfeldBeschreibung
task_idstring (UUID)Pflicht
需重试的目标任务 ID
重试失败任务
curl -X POST https://api.markifydoc.com/api/v1/tasks/0c1d2e3f-4567/retry \
  -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Webhook-Benachrichtigungen

Mit callback_url erhalten Sie sofort nach Abschluss des Parsings einen HTTP POST Request.

Auslösebedingungen

Wird gesendet, sobald der Status zu SUCCESS, PARTIAL_SUCCESS oder FAILED wechselt.

Webhook HTTP POST JSON Payload
{
  "event": "document.parsed",
  "task_id": "0c1d2e3f-4567",
  "status": "SUCCESS",
  "timestamp": 1788100875,
  "data": {
    "markdown": "https://r2.markifydoc.com/artifacts/0c1d2e3f-4567/output.md?expires=...",
    "zip": "https://r2.markifydoc.com/artifacts/0c1d2e3f-4567/bundle.zip?expires=...",
    "docx": "https://r2.markifydoc.com/artifacts/0c1d2e3f-4567/output.docx?expires=...",
    "latex": "https://r2.markifydoc.com/artifacts/0c1d2e3f-4567/latex_bundle.zip?expires=..."
  }
}

Wiederholungsstrategie

Bei Fehlern wird bis zu 3-mal mit exponentiellem Backoff (5s, 30s, 300s) wiederholt.

RAG-Pipeline Best Practices

MarkifyDoc nahtlos in LangChain oder LlamaIndex für semantisches Chunking und Vektordatenbanken integrieren.

Python 端到端 RAG 批量解析流水线脚本
import os
import time
import requests

MARKIFY_API_KEY = os.getenv("MARKIFY_API_KEY", "mkd_live_xxxxxx")
BASE_URL = "https://api.markifydoc.com/api/v1"
HEADERS = {"Authorization": f"Bearer {MARKIFY_API_KEY}"}

def parse_and_ingest_pdf(file_path: str):
    file_size = os.path.getsize(file_path)
    file_name = os.path.basename(file_path)

    # 1. 申请 S3/R2 直传临时链接
    presign_res = requests.post(
        f"{BASE_URL}/upload-url",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={"filename": file_name, "file_size": file_size}
    ).json()["data"]

    # 2. 客户端直接流式上传
    with open(file_path, "rb") as f:
        requests.put(presign_res["upload_url"], data=f, headers={"Content-Type": "application/pdf"})

    # 3. 提交多模态视觉解析任务
    task_res = requests.post(
        f"{BASE_URL}/parse",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={
            "r2_source_key": presign_res["r2_source_key"],
            "original_filename": file_name,
            "pages_estimated": 10,
        }
    ).json()["data"]
    task_id = task_res["task_id"]

    # 4. 轮询状态(或由 Webhook 异步唤醒)
    while True:
        status_res = requests.get(f"{BASE_URL}/tasks/{task_id}", headers=HEADERS).json()["data"]
        status = status_res["status"]
        if status == "SUCCESS":
            md_url = status_res["download_urls"]["markdown"]
            raw_markdown = requests.get(md_url).text
            print(f"Parsed {len(raw_markdown)} characters of Markdown with KaTeX formulas.")
            return raw_markdown
        elif status == "FAILED":
            raise RuntimeError(f"Parse failed: {status_res.get('failed_pages_detail')}")
        time.sleep(3)

if __name__ == "__main__":
    markdown = parse_and_ingest_pdf("./nature_paper.pdf")
    # 下游直接对接 LangChain / LlamaIndex:
    # chunks = RecursiveCharacterTextSplitter().split_text(markdown)
    # vectorstore.add_texts(chunks)

Fehlercodes & Problembehandlung

Code 0 bedeutet Erfolg. Andere Codes signalisieren Fehlerzustände mit detaillierter Nachricht.

CodeHTTP-StatusBedeutungLösungsempfehlung
0200 OK成功完成请求执行成功,数据已下发
40001400 Bad Request缺少关键入参检查请求体中是否遗漏 r2_source_key 或 filename
40002400 Bad Request文件格式不支持仅支持 PDF 格式文档解析,检查文件扩展名
40003400 Bad Request文件体积超限单文件上限 50MB,超过需先进行切分压缩
40101401 UnauthorizedAPI Key 无效或已停用检查请求头 Authorization: Bearer mkd_... 是否正确或在控制台中被禁用
40301403 Forbidden账户点数余额不足前往工作台充值加油包或订阅 Pro 会员
40304403 Forbidden超出游客解析页数限制注册账号即可立领 50 点完整解析额度
40401404 Not Found任务不存在确认传入的 task_id 是否有效,任务满 24 小时后会被自动物理擦除
42901429 Too Many Requests请求频次超限触发每分钟调用上限 (RPM),按 Retry-After 标头等待后重试
50000500 Internal Error服务端内部异常服务器处理遇到临时问题,若已扣点会自动全额退还