Markdown is the lingua franca of developer content. READMEs, documentation, blog posts, changelogs, and technical specs are all written in markdown. AI tools generate markdown by default. And yet, getting markdown from where it is written to where it needs to be read still requires a surprising amount of glue code.
Markdown publishing APIs bridge that gap. They take markdown as input and produce styled, formatted output for specific destinations: HTML for websites, formatted content for Google Docs, Slack-compatible text for team channels, or hosted pages at shareable URLs.
This guide compares every notable markdown publishing API available in 2026, with code examples, pricing, and guidance on choosing the right one for your use case.
Three categories of markdown APIs
Before comparing individual services, it helps to understand the three distinct categories:
Conversion APIs take markdown in and return styled output. They handle the rendering, formatting, and destination-specific optimization. The content goes in, formatted content comes out, and nothing is stored.
Publishing APIs go further: they host the content and serve it at a URL. You get conversion plus storage, versioning, and a shareable link. The content lives on the platform.
Platform APIs let you post markdown to an existing publishing platform (a blog, a documentation site, a social platform). The conversion happens on the platform's side, and the content lives within that platform's ecosystem.
Each category solves a different problem. Conversion APIs fit into existing workflows where you control hosting. Publishing APIs give you the full stack. Platform APIs target specific audiences on established networks.
Markdown publishing API comparison
| API | Category | Pricing | Rate Limit | Key Feature |
|---|---|---|---|---|
| Unmarkdown | Conversion + Publishing | Free 1K/mo, Pro $8/mo (10K/mo) | 10 req/sec free, 30 pro | 8 destinations, 62 templates |
| GitHub Markdown | Conversion | Free | 5,000 req/hr | GitHub-Flavored Markdown |
| ApyHub | Conversion | Free tier, Pro EUR 15/mo | 5 req/day free | JSON-Markdown input |
| Hashnode | Platform | Free, Pro $7/mo | Standard GraphQL limits | Developer blog network |
| Dev.to (Forem) | Platform | Free | Standard throttling | Developer community |
| Medium | Platform | Deprecated | N/A | Do not use |
| ReadMe | Publishing | Free, Startup $99/mo | Platform limits | Interactive API docs |
| Mintlify | Publishing | Free, Pro $300/mo | 250 AI messages/mo (Pro) | AI-native docs with Autopilot |
| GitBook | Publishing | Free, Premium $65/mo | Platform limits | Git sync, versioning |
Deep dive: Unmarkdown API
The Unmarkdown™ API is designed for one specific problem: converting markdown to destination-optimized output. Where other APIs produce generic HTML, Unmarkdown™ produces output tailored for how each destination app handles formatting.
Authentication
Generate an API key at Settings > API in your Unmarkdown™ account. Keys use the um_ prefix.
# All requests use Bearer authentication
curl https://api.unmarkdown.com/v1/convert \
-H "Authorization: Bearer um_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"markdown": "# Hello", "destination": "google-docs"}'
Convert markdown
The conversion endpoint accepts markdown and returns destination-specific output:
curl -X POST https://api.unmarkdown.com/v1/convert \
-H "Authorization: Bearer um_your_key" \
-H "Content-Type: application/json" \
-d '{
"markdown": "# Project Update\n\n## Completed\n- API migration\n- Dashboard redesign\n\n## Next Steps\n| Task | Owner | Due |\n|------|-------|-----|\n| Testing | Sarah | Mar 1 |\n| Deploy | Mike | Mar 5 |",
"destination": "google-docs",
"template_id": "executive",
"theme_mode": "light"
}'
The response includes both HTML and plain text:
{
"html": "<h1 style=\"...\">Project Update</h1>...",
"plain_text": "PROJECT UPDATE\n\nCompleted\n- API migration\n...",
"destination": "google-docs",
"template_id": "executive",
"theme_mode": "light"
}
The 8 supported destinations: google-docs, word, slack, onenote, email, plain-text, generic, html. Each applies different formatting rules. Google Docs output uses heading paragraph styles that populate the document outline. Slack output converts bold from **double** to *single* asterisks and tables to monospace layouts. The differences matter more than most people realize.
Create and publish a document
# Create a document
curl -X POST https://api.unmarkdown.com/v1/documents \
-H "Authorization: Bearer um_your_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Q1 Status Report",
"content": "# Q1 Status Report\n\nOn track for March delivery...",
"template_id": "consulting",
"folder": "Reports"
}'
# Response includes the document ID
# {"id": "abc-123", "title": "Q1 Status Report", ...}
# Publish it
curl -X POST https://api.unmarkdown.com/v1/documents/abc-123/publish \
-H "Authorization: Bearer um_your_key" \
-H "Content-Type: application/json" \
-d '{
"slug": "q1-status",
"description": "Q1 2026 status report for the Meridian project",
"visibility": "link"
}'
# Response includes the published URL
# {"published_url": "https://unmarkdown.com/u/yourname/q1-status", ...}
One-turn create and publish
For convenience, a single endpoint handles both creation and publishing:
curl -X POST https://api.unmarkdown.com/v1/documents/publish \
-H "Authorization: Bearer um_your_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Release Notes v2.1",
"content": "# Release Notes v2.1\n\n## Added\n- Full-text search...",
"template_id": "github",
"slug": "release-v2-1"
}'
Rate limits and quotas
| Free | Pro ($8/mo annual) | |
|---|---|---|
| Rate limit | 10 req/sec | 30 req/sec |
| Monthly calls | 1,000 (hard wall) | 10,000 included |
| Overage | Blocked (403) | $1.00 per 1,000 |
| Documents | 5 max | Unlimited |
| Published pages | 3 max | Unlimited |
Every response includes rate limit headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Calls that count toward your quota: convert, create, update, publish. Calls that do not count: list, get, usage, templates.
The Unmarkdown™ API also supports MCP transport, so Claude, ChatGPT, and other MCP clients can use the same tools without REST calls. For the MCP approach, see How to Use Claude's MCP Tools to Publish Documents.
Deep dive: GitHub Markdown API
GitHub's Markdown API is the simplest option for basic markdown-to-HTML conversion:
curl -X POST https://api.github.com/markdown \
-H "Accept: application/vnd.github+json" \
-d '{
"text": "# Hello\n\nThis is **bold** and a [link](https://example.com)",
"mode": "gfm"
}'
The gfm mode renders GitHub-Flavored Markdown, including tables, task lists, strikethrough, and autolinks. The markdown mode renders plain CommonMark.
Pros: Free, reliable, no API key required for basic usage. Good for rendering README-style content.
Cons: No templates, no destination-specific formatting, no publishing. The output is unstyled HTML. You provide your own CSS. Input is limited to 400KB. Authenticated requests get 5,000/hour; unauthenticated get 60/hour.
Deep dive: platform APIs
Hashnode (GraphQL)
Hashnode lets you publish developer blog posts programmatically via GraphQL:
mutation {
publishPost(input: {
title: "Building MCP Servers in TypeScript"
contentMarkdown: "# Building MCP Servers\n\nMCP is the new standard..."
publicationId: "your-publication-id"
tags: [{ slug: "mcp" }, { slug: "typescript" }]
}) {
post {
url
title
}
}
}
Pricing: Free for individual blogs, Pro at $7/month for custom domains and analytics. The API is included at all tiers.
Best for: Developers who want to publish technical content to an established developer audience. Hashnode has built-in SEO, a reader network, and GitHub-backed markdown rendering.
Dev.to (Forem API v1)
Dev.to's API accepts markdown articles with frontmatter:
curl -X POST https://dev.to/api/articles \
-H "api-key: your_api_key" \
-H "Accept: application/vnd.forem.api-v1+json" \
-H "Content-Type: application/json" \
-d '{
"article": {
"title": "MCP Servers for Content Publishing",
"body_markdown": "# MCP Servers\n\nThe ecosystem has grown...",
"published": true,
"tags": ["mcp", "ai", "publishing"]
}
}'
Pricing: Completely free. Dev.to is a community platform with no paid tiers for publishing.
Best for: Reaching the Dev.to community with developer-focused content. Good distribution but limited formatting control.
Medium API (deprecated)
Medium's API exists on paper but is effectively abandoned. The official documentation says "deprecated, do not use." It supports one-time post creation only (no editing, no retrieving). Do not build on it.
Choosing the right markdown publishing API
"I need to convert markdown for multiple destinations": Unmarkdown™. It is the only API that produces destination-specific output for Google Docs, Word, Slack, OneNote, Email, and plain text from the same markdown input.
"I need basic markdown-to-HTML for my website": GitHub Markdown API. Free, simple, and reliable for rendering GFM content.
"I need to publish to a developer blog": Hashnode or Dev.to APIs. Both accept markdown natively and have built-in audiences.
"I need hosted documentation from markdown": GitBook, Mintlify, or ReadMe. All three handle markdown-to-docs-site conversion with hosting, search, and versioning.
"I need conversion plus publishing plus MCP": Unmarkdown™. It is the only service that combines REST API, MCP server, and multi-destination conversion in a single platform. For a comparison of all markdown publishing tools, see the full roundup.
Building automation workflows
The real power of markdown APIs comes from chaining them into workflows. Here is a GitHub Actions example that converts a README to a Google Docs-friendly format whenever it changes:
name: Publish README Updates
on:
push:
paths: ['README.md']
jobs:
convert:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Convert README for Google Docs
run: |
curl -X POST https://api.unmarkdown.com/v1/convert \
-H "Authorization: Bearer ${{ secrets.UNMARKDOWN_API_KEY }}" \
-H "Content-Type: application/json" \
-d "{\"markdown\": $(cat README.md | jq -Rs .), \"destination\": \"slack\"}" \
> /tmp/slack-output.json
- name: Post to Slack
run: |
PLAIN_TEXT=$(jq -r '.plain_text' /tmp/slack-output.json)
curl -X POST ${{ secrets.SLACK_WEBHOOK_URL }} \
-H "Content-Type: application/json" \
-d "{\"text\": \"README updated:\\n${PLAIN_TEXT}\"}"
This converts the README to Slack format and posts a notification whenever the file changes. The same pattern works for any destination: convert for Email and send via SendGrid, convert for Google Docs and update a shared document, or publish to a web page and share the URL.
Markdown APIs are most powerful when they fit into pipelines you already have. The conversion step should be invisible, a single API call that transforms your content for wherever it needs to go.
