REST API
Bearer APIキーを使うHTTPSエンドポイントです。安定したDTO、予測可能なエラー、冪等な作成を提供します。
処理フローを見る用途に合う連携方法を選べます。どちらも同じ変換エンジンを呼び出し、同じスロット、上限、保存期間に従います。
APIとMCPはBearer APIキーを使います。Chrome拡張機能の端末署名経路とは別です。キー発行には無料Googleアカウントが必要です。
Authorization: Bearer p2m_… スコープ。各APIキーにはjobs:create、jobs:read、jobs:download、jobs:deleteと、任意のsettings:read / settings:writeがあります。必要最小限のキーを発行してください。jobs:create jobs:read jobs:download jobs:delete settings:read settings:write
REST APIまたは同等のホスト型MCPツールで同じ処理を実行します。status=readyになる前に結果が得られたと判断しないでください。REST API ホスト型MCP status=ready
PDFのURLまたはファイルをPOSTします。ジョブIDとスロットが返ります。Idempotency-Keyは任意で利用できます。Idempotency-Key
readyまたはerrorになるまで状態を確認します。有料プランでは署名付きWebhookを使えます。ready error
readyになったら結果を取得します。長い文書が一部だけ返ったかはtruncatedとpagesで確認できます。truncated pages
完了後はスロットを解放します。queuedまたはprocessingのジョブ削除は破壊的操作なので利用者に確認してください。
# 1. create a job from a PDF URL
curl -X POST https://pdf2md.dev/api/v2/jobs \
-H "Authorization: Bearer p2m_…" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/report.pdf"}'
# → { "job_id": "job_9f3c…", "status": "queued" }
# 2. poll status
curl https://pdf2md.dev/api/v2/jobs/job_9f3c… \
-H "Authorization: Bearer p2m_…"
# → { "status": "ready", "pages": 24, "truncated": false }
# 3. fetch the Markdown
curl https://pdf2md.dev/api/v2/jobs/job_9f3c…/download \
-H "Authorization: Bearer p2m_…"
# 4. free the slot
curl -X DELETE https://pdf2md.dev/api/v2/jobs/job_9f3c… \
-H "Authorization: Bearer p2m_…"
エラー。レスポンス形式とHTTPコードは安定しています。400、401、404、409 / slots_full、413、429を返します。完全なスキーマはOpenAPI仕様にあります。400 401 404 409 slots_full 413 429 OpenAPI仕様
作成はJSONのurlまたはmultipartのfileを受け取り、file_name、external_id、tags、callback_url / callback_secretも指定できます。一括作成は全件成功または全件失敗です。url file file_name external_id tags callback_url callback_secret
アカウントと使用量。GET /api/v2/me、/api/v2/limits、/api/v2/usageでプラン、上限、使用量を確認し、キーとWebhookを管理できます。GET /api/v2/me /api/v2/limits /api/v2/usage /api/v2/api-keys /api/v2/webhooks
どの言語からも同じ4回の呼び出しを使います。ここではrequestsを使います。エラー処理を含む詳細はPythonチュートリアルを参照してください。requests Pythonチュートリアル
# pip install requests
import time, requests
API = "https://pdf2md.dev/api/v2"
H = {"Authorization": "Bearer p2m_…"}
# 1. create a job from a PDF URL (or post a file with files={"file": ...})
job = requests.post(f"{API}/jobs", headers=H,
json={"url": "https://example.com/report.pdf"}).json()
jid = job["job_id"]
# 2. poll until ready (or register a webhook instead)
while True:
j = requests.get(f"{API}/jobs/{jid}", headers=H).json()
if j["status"] in ("ready", "error"):
break
time.sleep(3)
# 3. download the Markdown
md = requests.get(f"{API}/jobs/{jid}/download", headers=H).text
print(md)
# multipart upload of a local PDF
curl -X POST https://pdf2md.dev/api/v2/jobs \
-H "Authorization: Bearer p2m_…" \
-F "[email protected]" \
-F "file_name=document.pdf"
// create from URL, poll, download
const API = "https://pdf2md.dev/api/v2";
const H = { Authorization: "Bearer p2m_…" };
let job = await (await fetch(`${API}/jobs`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json" },
body: JSON.stringify({ url: "https://example.com/report.pdf" })
})).json();
while (job.status === "queued" || job.status === "processing") {
await new Promise(s => setTimeout(s, 2000));
job = await (await fetch(`${API}/jobs/${job.job_id}`, { headers: H })).json();
}
if (job.status === "ready") {
const md = await (await fetch(`${API}/jobs/${job.job_id}/download`, { headers: H })).text();
console.log(md);
}
Webhook署名検証はWebhook節、MCPクライアント設定はMCP節にあります。完全なスキーマはOpenAPIです。Webhook MCP OpenAPI
対応エージェントを管理済みMCPエンドポイントへ接続します。同じREST APIの薄いラッパーなので、同じスロット、上限、保存期間が適用されます。
APIキーをBearer tokenとして使うStreamable HTTP上のJSON-RPC 2.0です。ローカルサーバーは不要です。initialize、tools/list、tools/call、pingを利用できます。initialize tools/list tools/call ping
同じ処理フローと上限を7つのツールとして公開します。各ツールはキースコープを守り、tools/callはslot_usageとtierを返します。tools/call slot_usage tier
出力利用前にreadyを待ち、queued/processingの削除前に確認し、truncatedと429 Retry-Afterを処理します。ツール名にはpdf_to_markdown_が付きます。ready truncated 429 Retry-After pdf_to_markdown_
// MCP client config (hosted, no local process)
{
"mcpServers": {
"pdf2md": {
"url": "https://pdf2md.dev/api/v2/mcp",
"headers": {
"Authorization": "Bearer p2m_…"
}
}
}
}
開発者向け完全版OpenAPIと、AIクライアントやChatGPT Custom GPT Actions向けの安全な最小構成仕様を公開しています。
create、status、fetchだけを含む最小Action仕様です。URLを取り込み、APIキーを認証として設定するとGPTがPDFを変換できます。
簡易仕様はAIクライアント向けの利便性のためのもので、セキュリティ境界ではありません。認証、スコープ、上限は完全版APIと同じです。
有料プランではスロット、ファイルサイズ、処理時間枠、保存期間、レート上限が増え、Webhookと一括作成も利用できます。プランを比較 →
有料プランでは署名付きWebhookを登録するか、ジョブごとのcallback_urlを渡せます。job.ready、job.error、job.truncated、job.deletedをPOSTで通知します。文書本文は含みません。callback_url job.ready job.error job.truncated job.deleted
SSRF対策済みのHTTPS URLと任意のeventsフィルターをPOSTします。署名シークレットwhsec_…は1回だけ返ります。単一ジョブではcallback_url + callback_secretも使えます。events whsec_… 1回のみ callback_url callback_secret
X-P2M-Event、X-P2M-Timestamp、X-P2M-Delivery、X-P2M-Signatureヘッダー付きのJSONをPOSTします。X-P2M-Event X-P2M-Timestamp X-P2M-Delivery X-P2M-Signature
署名を再計算し、2xxで応答して冪等に処理します。配信はバックオフ付きで再試行される場合があります。その後Markdownを取得します。2xx
# delivery → your endpoint
X-P2M-Event: job.ready
X-P2M-Timestamp: 1718900000
X-P2M-Signature: sha256=9a8b7c…
{
"event": "job.ready",
"job": {
"job_id": "job_9f3c…",
"status": "ready",
"pages": 24, "truncated": false,
"download_url": "/api/v2/jobs/job_9f3c…/download"
}
}
# verify (Python): signature = sha256= + hex(HMAC(secret, "ts.rawbody"))
import hmac, hashlib
def verify(secret, ts, raw_body, sig):
expected = "sha256=" + hmac.new(
secret.encode(), f"{ts}.".encode() + raw_body,
hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, sig)
以下のルールをエージェントのsystem promptへ追加すると、ツールを正しく操作し、結果を捏造しないようにできます。
status=readyになる前に結果を要約しないでください。queuedまたはprocessingの間は状態確認を続けるかWebhookを待ちます。status=ready queued processing
queuedまたはprocessingのジョブ削除は破壊的です。未完了ジョブでpdf_to_markdown_delete_jobを呼ぶ前に利用者へ確認します。queued processing pdf_to_markdown_delete_job
truncated=trueなら、処理時間枠までの部分結果であることを伝え、上位プランまたはファイル分割を提案します。truncated=true
429ではRetry-After秒待ってから再試行します。キューへ過剰なリクエストを送らないでください。429 Retry-After
不要になった完了ジョブを削除し、スロット不足を防ぎます。
文章からエンドポイントを推測せず、/llms.txtとOpenAPI仕様から開始します。/llms.txt
ソースコードを読まずに連携できるように、概要ファイル、詳細コンテキスト、OpenAPI仕様を公開しています。