Backend jobs
Status: launch candidate. Use account API keys for upload, polling, downloads, and job lookup after production activation.
Copy API callsDeveloper docs
Use one account API key across API, CLI, and MCP.
Status: launch candidate. Use account API keys for upload, polling, downloads, and job lookup after production activation.
Copy API callsProduct API. Run remote conversion from shell scripts with the same account quota and billing as API calls.
View commandsAccount-metered tools. Let agents convert, inspect usage, and open billing through the same API key.
Configure MCPChoose the right integration
Use API for server uploadsBest for SaaS products, backend jobs, and user-facing upload flows that need billing and API keys.
Use CLI for scripted uploadsBest for shell jobs that can read local files but should still use account quota and billing.
Use MCP for agent tool callsBest when an AI host should call conversion, job status, usage, and billing actions directly.
Quickstart
Copy-ready sequence
Keep production keys in server or agent secrets. Never place API keys in browser code.
export PDF2MD_API_KEY="$(op read 'op://PDF2MD/prod/api-key')"
curl -X POST https://markovo.net/v1/convert \
-H "Authorization: Bearer ${PDF2MD_API_KEY}" \
-F "file=@paper.pdf" \
-F "file=@appendix.pdf" \
-F "mode=fast" \
-F "max_credits=30"
Developer Setup
The account app shows the same snippets after sign-in. Replace placeholders with your API key and keep secrets in backend or agent environments.
export PDF2MD_BASE_URL="https://markovo.net"
export PDF2MD_API_KEY="$(op read 'op://PDF2MD/prod/api-key')"
python -m pip install -e ".[api,ocr,cloudflare]"
pdf2md doctor --json
pdf2md convert paper.pdf --out runs/paper --mode fast
pdf2md usage
{
"mcpServers": {
"pdf2md": {
"command": "pdf2md-mcp",
"env": {
"PDF2MD_BASE_URL": "https://markovo.net",
"PDF2MD_API_KEY": "${PDF2MD_API_KEY}"
}
}
}
}
Open Developer Setup
API quickstart
Use multipart upload for one or more source PDFs, then poll each returned job until it succeeds. Put API keys in backend environments, not browser code.
curl -X POST https://markovo.net/v1/convert \
-H "Authorization: Bearer mk_live_..." \
-F "file=@paper.pdf" \
-F "file=@appendix.pdf" \
-F "mode=fast" \
-F "max_credits=30"
The response includes jobs[]. For backwards compatibility, job_id points to the first queued job.
curl https://markovo.net/v1/jobs/{job_id} \
-H "Authorization: Bearer ${PDF2MD_API_KEY}"
curl -L "https://markovo.net/v1/jobs/{job_id}/download?format=md" \
-H "Authorization: Bearer ${PDF2MD_API_KEY}" \
-o output.md
Authentication
Create a key inside the account app after signing in. Plaintext is shown once.
Authorization: Bearer mk_live_...markovo:convertconversion.credits balance.GET /v1/account/auth/providers reports enabled OAuth providers and email-code signup state.OAuth setup
Markovo keeps auth same-origin through /api/auth/*. Configure providers with the product gateway callback, not the account service URL.
Google redirect URIhttps://markovo.net/api/auth/callback/google
GitHub callback URLhttps://markovo.net/api/auth/callback/github
Trusted originBETTER_AUTH_TRUSTED_ORIGINS=https://markovo.net
Provider discoveryGET /v1/account/auth/providers should list Google and GitHub before buttons are enabled.
Keep the existing workers.dev callback only for the seven-day rollback window. The production Google and GitHub apps must both be verified against the exact Markovo callbacks above.
CLI
Product API client. The CLI uploads through PDF2MD_BASE_URL with PDF2MD_API_KEY, then polls and downloads the result bundle.
python -m pip install -e ".[api,ocr,cloudflare]"
export PDF2MD_BASE_URL="https://markovo.net"
export PDF2MD_API_KEY="mk_live_..."
pdf2md convert paper.pdf --out runs/paper --mode fast
pdf2md usage
pdf2md billing
Internal workers and local development can still use pdf2md local-convert; customer docs should use pdf2md convert.
MCP
The MCP server exposes remote conversion, job status, usage, billing, and local diagnostics over stdio. Use pdf2md-mcp with account API key env.
python -m pip install -e ".[api,ocr,cloudflare]"
export PDF2MD_BASE_URL="https://markovo.net"
export PDF2MD_API_KEY="mk_live_..."
pdf2md-mcp
# or: pdf2md mcp
{
"mcpServers": {
"pdf2md": {
"command": "pdf2md-mcp",
"env": {
"PDF2MD_BASE_URL": "https://markovo.net",
"PDF2MD_API_KEY": "${PDF2MD_API_KEY}"
}
}
}
}
Production domain
markovo.net to Markovo Edge and redirect www.markovo.net permanently to the root domain.Availability
BrowserThe launch UI and edge routes are ready; production domain activation remains pending.
AccountGoogle, GitHub, and email flows are implemented; real production callback and delivery smoke remains pending.
API keysPro keys unlock account usage, billing, and job lookup.
CLIpdf2md convert, account, usage, and billing use account API keys.
MCPpdf2md-mcp exposes remote conversion, job status, usage, billing, and diagnostics.
Email codesSignup, verification, and reset use Alibaba Cloud DirectMail over TLS from the verified support@markovo.net sender.
Integration readiness
API: verified locallyTests cover estimates, Credit ceilings, ownership, queue messages, downloads, and aggregate analytics.
Usage: verified by worker testsAuthenticated worker reserves and settles page usage around conversion, then releases reservations after failure.
CLI: account-metered clientRemote client tests cover upload, polling, download, usage, billing, and quota errors.
MCP: account-metered toolsstdio tools expose remote conversion, job lookup, usage, billing, and structured quota errors.
Production release smoke: pendingReal domain, login, Container, download, quota, and Checkout verification starts only after approved deployment.
Limits
conversion.credits, roll over at most one month, and cap the balance at twice the monthly grant.