Most conversion APIs want a credit card before they return a single heading. This one doesn't: POST your HTML as JSON and get clean Markdown back — no key, no account, nothing to install.
Updated August 2026 · 4 minute read
You already know how to turn HTML into Markdown by hand: paste it into a converter tab, copy the result back. That works once. It does not work when the conversion lives inside a script, a build step, an LLM pipeline or a cron job.
Models read Markdown far better than raw HTML. Strip tags and noise before you send pages into a prompt — fewer tokens, fewer distractions, better answers.
Pull documentation, changelogs or articles from anywhere and land them in your CMS, wiki or static site as clean Markdown files.
One curl from bash, one requests.post() from Python, one fetch() from Node. If it can speak HTTP, it can use it.
| Option | How it works | Catch |
|---|---|---|
| Commercial APIs | Full-featured extraction endpoints | API keys, monthly fees, rate limits on free tiers |
| Self-hosted libraries | turndown, html2text, etc. |
You own the install, edge cases and maintenance |
| Online converters | Paste HTML into a form | Manual only — cannot be called from a script |
| Clean Copy API | Plain REST: POST HTML, get Markdown. No key, no fee | Max 50 KB input; be gentle (≤10 req/s) |
The endpoint is POST /api/clean-copy. Send a JSON object with an html field; get JSON back with a markdown field.
curl -s -X POST https://hermes-passiv.pages.dev/api/clean-copy \
-H 'Content-Type: application/json' \
-d '{"html":"<h1>Hello</h1><p>This is <b>bold</b>.</p>"}'
{"ok":true,"markdown":"# Hello\n\nThis is **bold**.","mode":"markdown","input_chars":44,"output_chars":22}
import requests
r = requests.post(
"https://hermes-passiv.pages.dev/api/clean-copy",
json={"html": open("page.html").read()},
timeout=15,
)
print(r.json()["markdown"])
const res = await fetch("https://hermes-passiv.pages.dev/api/clean-copy", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ html: "<h2>Docs</h2><p><a href='/'>home</a></p>" }),
});
const { markdown } = await res.json();
curl -s -X POST https://hermes-passiv.pages.dev/api/clean-copy \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com/article"}'
The API fetches the page server-side, extracts the main content and returns it as Markdown — handy when you don't have the HTML locally yet.
| Field | Values | What it does |
|---|---|---|
html | string | Raw HTML input (max 50 KB). Required unless you pass url. |
url | string | Fetches the page server-side and converts it. |
mode | markdown | text | Markdown output, or stripped plain text. |
H1–H6 map to the right number of #, so document structure survives.
Links become standard Markdown references with original URLs.
Simple HTML tables become Markdown pipe tables, alignment included.
Scripts, styles, tracking pixels and hidden junk are removed automatically.
Yes — no key, no account, no card. The limits are technical, not commercial: 50 KB of HTML per request and a soft cap of 10 requests per second.
The API answers with an error message telling you so. Split the document and send the parts — headings and links keep working across calls since conversion is stateless.
No. Conversion is stateless: your HTML is processed for the response and not kept.
Same engine ships offline as the Clean Copy CLI, as a browser extension, and as an npm library — see Clean Copy.
Related: HTML to Markdown from the Terminal · HTML to Markdown Converter (online) · URL to Markdown Converter · Try it in the browser
Keeping websites online? DeskUptime is a free desktop uptime & SSL-expiry monitor for macOS, Linux and Windows.