I Was Going to Shut Down My Free Markdown to PDF Service. Then Callers Turned Up in Edge Functions and Workers, So I Upgraded It
Published: November 5, 2026
I have a free Markdown to PDF service, and I was thinking of shutting it down. With AI agents, it is just easier to use that to convert, set up an HTML tool or even your own microservice. I thought nobody used it.
Then my logs started to show a rise over the past few weeks.
It is still small and about half of it comes from the web tool, and the rest from scripts and a small proportion from agents via MCP. It makes sense once you see where some of those scripts were running - on edge functions and workers ... which have tight size and time limits, plus setting up a conversion service there might be a bit tricky. Calling a URL is simpler.
So I ended up upgrading it.
Polish, Czech, Turkish, Romanian, Hungarian and Vietnamese letters now come out properly
Pasted HTML no longer fills the page with style code
Flag emoji come out as country codes
The request limit per address is higher
The tool and the API already support page breaks, tables of any width, nested lists, code blocks, clickable links, A4 or US Letter, and common emoji as symbols.
API Docs
Web tool
A few quick details
From your edge function or a script, send one POST with a content field to the convert endpoint and the PDF comes back in the response. The docs have a working curl.
A page break is :::pagebreak::: on a line by itself, and everything after it starts on a new page. Add page_size=letter for US Letter, otherwise pages are A4.
A .txt upload keeps single line breaks, so a letter stays laid out. A .md file follows standard Markdown rules, where one newline counts as a space. If your lines are joining up, that is the reason.
The GET form puts the whole document in the web address, so it holds roughly 10,000 characters of prose, or 7,000 of tables. Use POST for anything longer. In a GET, write a literal plus sign as %2B, because a bare + becomes a space.
The PDF has one fixed style. If you paste a styled web page, you get its text in that style, with no colours or layout from the page.
One address can send 60 requests a minute. Each response has X-RateLimit headers showing what is left.
Working on something similar? How I work covers the rates, the availability and what I take on.