Quick start
https://mdtopdf.tigzig.com/mcphttps://mdtopdf.tigzig.com/v1Documentation
The full reference. Every endpoint, every field, and every enforced limit with the message you get when you cross it. Rendered from the running service, so it is never a copy that can fall behind.
The machine contract for this API. The site-wide directory of every TigZig API is the RFC 9727 catalog at api.tigzig.com/.well-known/api-catalog.
What you can call
2 endpoints. Request bodies, every field and every enforced limit are in the full reference.
| POST | /v1/convert | Upload a Markdown or text file, get the PDF file back |
| POST | /v1/convert/text | Send Markdown as JSON, get the PDF file back (canonical) |
What it is
One engine that turns Markdown into a professionally formatted PDF - the same ReportLab engine that renders reports across TigZig. Two public endpoints, both no-auth:
- POST /v1/convert/text - send Markdown text as JSON, get the PDF back directly. The canonical endpoint (and what the MCP tool wraps).
- POST /v1/convert - upload a
.mdfile (multipart), get the PDF back directly.
Clean document layout: headings, lists, tables, code, blockquotes, horizontal rules. Precise, paginated output - not a quick markdown-to-HTML-to-PDF route. There is also a free web tool if you just want to paste and download.
Errors are a uniform envelope - { error: { code, message, path, example }, help: {...} } - where code is a stable slug (INVALID_JSON_BODY, INVALID_REQUEST_BODY, NOT_FOUND, METHOD_NOT_ALLOWED, RATE_LIMITED), message says what to change, and example is a curl line that works. Malformed JSON is a 400; well-formed JSON that fails the schema is a 422. The request body must be UTF-8.
What renders
Standard Markdown renders as you would expect: headings, bold, italics, inline code, clickable links, bullet and numbered lists with real nesting, task lists as checkboxes, strikethrough, tables of any width (wide ones shrink to fit rather than failing), fenced code blocks, blockquotes and rules. Emoji map to matching symbols rather than blank boxes, and currency and maths symbols (≤ ≥ ≠ √ ∑ ∫ ∂ ∞) render properly.
Page breaks (the one non-standard thing)
Markdown has no page break, so this API adds one. Put any of these on a line by itself and what follows starts on a new page:
:::pagebreak:::
\pagebreak
\newpage
<!-- pagebreak -->
Markers inside fenced code blocks are left alone, so documentation about page breaks does not break its own pages.
Plain text vs Markdown
Upload a .txt to /v1/convert and its single line breaks are kept, so a letter stays laid out. A .md file uses standard Markdown rules, where a single newline is just a space.
What is not supported
None of these fail the conversion - the PDF is still produced, so plan around them rather than expecting an error:
- Images are skipped. Surrounding text is unaffected.
- Greek letters and non-Latin scripts (Devanagari, Arabic, CJK, Cyrillic) come out as empty boxes - the bundled fonts carry no glyphs for them.
- Raw HTML tags are ignored, though the text inside them is kept.
MCP server (for AI agents)
Mount it in an AI agent and let it produce PDFs as a tool call. No auth. One endpoint:
https://mdtopdf.tigzig.com/mcp- Streamable HTTP, the recommended transport (MCP spec 2025-03-26). Tool:convert_markdown_to_pdf.
Add to Claude.ai: Settings -> Connectors -> Add custom connector -> paste the Streamable HTTP URL. Same URL works for Cursor, n8n, any MCP client. The agent writes a report in Markdown, calls the tool, gets back a PDF URL.
Styled reports with charts
The same ReportLab engine also produces richer analytical reports - side-by-side tables, embedded charts, custom styling, saved as a hosted PDF + HTML. That is what powers the TigZig Technical Analysis app.
That report pipeline is not offered as a public endpoint here - it is a backend for our own apps and needs a specific multi-step calling convention. The building blocks it is assembled from (paragraphs, tables, side-by-side frames, image embedding, an allowlist HTML sanitizer) are in the open-source edition at the foot of this page, if you want to build a charted report format of your own.
For a full worked example - compute indicators, render charts, get AI commentary, build a report - see the Technical Analysis repo.
Guides
This page is the reference - what the endpoints are and how to call them. The guides below are the long-form versions, with worked examples and the edges you only meet in real use:
- Demystifying the API errors - what each error actually means and what to do about it, instead of guessing from a status code. Covers every TigZig API, not just this one.
- Your agents and scripts have been talking to me - what real callers actually do, read out of the server logs: the common mistakes, what works, and the patterns worth copying.
Each is a plain page with a Markdown twin, so you can hand a URL straight to an agent. Come back to this page when you want parameter-level detail.
Rate limits
Published so a well-behaved client can plan around them. These are per-IP limits:
- Per IP: 30 requests / minute.
You get a 429 with Retry-After (seconds, the real number rather than a flat guess) and a body naming the budget you crossed.
Avoiding 429s: Rendering is per-document, so there is no batching trick here. You do NOT need to serialise your calls though: concurrent requests from one IP are queued rather than refused, so a burst waits a moment instead of failing. Space out sustained volume and honor Retry-After.
Every successful response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix epoch seconds), read straight from the running limiter, and Retry-After is set on 429. The current numbers are also published as machine-readable JSON at https://mdtopdf.tigzig.com/v1/, derived from live config. Read those at runtime rather than hard-coding the figures above - limits change, and these channels change with them.
Try it
No key, no signup.
curl -X POST "https://mdtopdf.tigzig.com/v1/convert/text" -H 'Content-Type: application/json' -d '{"content":"# Meeting note\n\nAgreed to ship on Friday. **Owner:** Priya.\n","filename":"meeting-note.pdf"}'
curl -X POST "https://mdtopdf.tigzig.com/v1/convert/text" -H 'Content-Type: application/json' -d '{"content":"# Quarterly summary\n\nRevenue held steady while costs fell.\n\n## Highlights\n\n- Costs down 8% quarter on quarter\n- Two new enterprise accounts\n- Churn unchanged at 1.2%\n\n## Numbers\n\n| Metric | Q2 | Q3 |\n|---|---|---|\n| Revenue | 4.10 | 4.15 |\n| Costs | 2.80 | 2.58 |\n\n> Costs fell mainly on the infrastructure move.\n","filename":"quarterly-summary.pdf"}'
Open-source edition
There is an open-source edition of this converter - an earlier release you can run as your own service or borrow components from. Treat it as a reference implementation rather than a mirror of what is running here: the hosted service has moved on since.
github.com/amararun/shared-reportlab-md-to-pdf
Built on FastAPI, ReportLab.