MarkifyDoc 開発者向けAPI仕様書
標準RESTfulプロトコルとWebhookイベント駆動アーキテクチャを採用し、RAGナレッジベースや金融レポートの自動変換に最適化。
概要と基本仕様
MarkifyDocは学術論文や金融レポートを高速かつ高精度に構造化し、KaTeX数式やMarkdown、抽出画像を出力するREST APIを提供します。
https://api.markifydoc.com認証とAPI Key
/api/v1/* へのリクエストはすべてAuthorizationヘッダーにBearer API Keyを付与する必要があります。
Authorization: Bearer mkd_xxxxxxxxxxxxxxxxxxxxxxxx
API Keyはアカウントの解析クレジットを消費します。環境変数(.env)に安全に保存し、公開リポジトリへコミットしないでください。
レート制限と優先度
プランに応じてレート制限およびGPUキューの優先度が適用されます:
| プラン | 毎分リクエスト数 (RPM) | 最大同時実行数 | GPUキュー優先度 |
|---|---|---|---|
| 無料枠 (Free) | 10 RPM | 1 タスク | Normal キュー |
| 従量課金 (PAYG) | 60 RPM | 3 タスク | Normal キュー |
| Pro / APIプラン | 300 RPM | 10+ タスク | High 最優先キュー |
標準ワークフロー
大容量PDFの安定転送を実現するため、直接アップロードと非同期処理モデルを採用しています:
1. アップロードURL申請
/api/v1/upload-url にファイル情報を送信し、一時S3/R2アップロードURLを取得します。
2. 直接アップロード
クライアントから直接ストレージへPUT送信します。
3. 解析タスク開始
/api/v1/parse を呼び出して解析キューに登録します(callback_url指定可能)。
4. 結果取得またはWebhook受信
状態を取得するか、完了時のWebhook通知を受信します。
REST API 核心端点规范
/api/v1/upload-urlPDF直接アップロード用の一時URL(有効期限15分)を発行します。
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| filename | string | 必須 | 待上传的 PDF 文件全名(例如 nature_paper.pdf,必须以 .pdf 结尾) |
| file_size | integer | 任意 | 文件字节大小,用于阶梯前置容量校验(最大限制 50MB) |
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 方法直接上传原始 PDF 二进制流 curl -X PUT "<upload_url>" \ -H "Content-Type: application/pdf" \ --data-binary "@./quantum_physics_paper.pdf"
/api/v1/parseアップロード完了したPDFをAI視覚解析キューへ投入します。
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| r2_source_key | string | 必須 | 第一步获取到的 R2 存储路径(例如 uploads/task_uuid/source.pdf) |
| original_filename | string | 必須 | 文档原始名称 |
| pages_estimated | integer | 必須 | 预估解析页数,用于预扣点数校验(1 点/页,多扣失败页自动退还) 默认值: 1 |
| callback_url | string | 任意 | 解析完毕后的 Webhook 异步回调地址 |
| options | object | 任意 | 解析可选配置: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
}
}'/api/v1/tasks/{task_id}タスクの進行状況、ページ数、生成物ダウンロードURLを取得します。
パスパラメータ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| task_id | string (UUID) | 必須 | 提交任务时系统生成的唯一任务标识 |
curl -X GET https://api.markifydoc.com/api/v1/tasks/0c1d2e3f-4567 \ -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx"
/api/v1/tasks自身のアカウントが送信したタスク履歴をページネーション付きで取得します。
クエリパラメータ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| page | integer | 任意 | 页码编号 默认值: 1 |
| page_size | integer | 任意 | 每页任务数量(最大 100) 默认值: 20 |
| status | string | 任意 | 按状态过滤: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"
/api/v1/tasks/{task_id}/retryファイルの再送なしに失敗タスクを再スケジュールします。
パスパラメータ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| task_id | string (UUID) | 必須 | 需重试的目标任务 ID |
curl -X POST https://api.markifydoc.com/api/v1/tasks/0c1d2e3f-4567/retry \ -H "Authorization: Bearer mkd_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Webhook 非同期通知
callback_url を設定することで、タスク完了時にHTTP POSTで自動通知を受け取れます。
通知条件
タスクが SUCCESS、PARTIAL_SUCCESS、FAILED に遷移した際に送信されます。
{
"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=..."
}
}高可用性リトライ
受信先が失敗した場合は最大3回(5秒、30秒、300秒間隔)指数バックオフで再試行します。
RAG ナレッジベース連携ガイド
LangChainやLlamaIndexと統合し、論文やレポートを自動でベクトル化・登録するパイプラインを構築できます。
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)エラーコードとトラブルシューティング
0は成功を示し、0以外はエラーの詳細を意味します。
| コード | HTTPステータス | 意味 | 対処法 |
|---|---|---|---|
| 0 | 200 OK | 成功完成 | 请求执行成功,数据已下发 |
| 40001 | 400 Bad Request | 缺少关键入参 | 检查请求体中是否遗漏 r2_source_key 或 filename |
| 40002 | 400 Bad Request | 文件格式不支持 | 仅支持 PDF 格式文档解析,检查文件扩展名 |
| 40003 | 400 Bad Request | 文件体积超限 | 单文件上限 50MB,超过需先进行切分压缩 |
| 40101 | 401 Unauthorized | API Key 无效或已停用 | 检查请求头 Authorization: Bearer mkd_... 是否正确或在控制台中被禁用 |
| 40301 | 403 Forbidden | 账户点数余额不足 | 前往工作台充值加油包或订阅 Pro 会员 |
| 40304 | 403 Forbidden | 超出游客解析页数限制 | 注册账号即可立领 50 点完整解析额度 |
| 40401 | 404 Not Found | 任务不存在 | 确认传入的 task_id 是否有效,任务满 24 小时后会被自动物理擦除 |
| 42901 | 429 Too Many Requests | 请求频次超限 | 触发每分钟调用上限 (RPM),按 Retry-After 标头等待后重试 |
| 50000 | 500 Internal Error | 服务端内部异常 | 服务器处理遇到临时问题,若已扣点会自动全额退还 |