NewString UnraveledResearch powered by data we scrape from the web.Read the latest issue →
← Answers

Best tool to convert websites to Markdown for LLMs

String team · Published November 9, 2026 · Updated November 10, 2026

Choose by where the pages live, not by which library writes the nicest Markdown. If you already hold the documents, use a local converter: MarkItDown and Docling are both MIT licensed, both free, and both run on your own machine. If the pages are public and the site does not fight automated traffic, Jina Reader is the shortest path, because you prepend r.jina.ai to a URL and get Markdown back with no key at 20 requests per minute. If you are building a corpus from sites that block, the converter stops being the question. You need something that returns the page at all, and then converts it. String's /fetch does both in one call with format: markdown.

That last case is where most RAG corpora actually lose sources, and it is worth a number. Across the 1,700 provider and target pairs in the October 30, 2026 run of String's Web Data Frontier Benchmark, 353 of them, 20.8%, returned nothing at all across five attempts. On those pages no converter ever ran, because no HTML came back.

Where do Markdown corpora actually fail?

At the fetch, not the conversion. Pick the tool that returns your pages first, and the one that writes the nicest Markdown second.

In the October 30, 2026 run of the Web Data Frontier Benchmark, seventeen providers each requested 100 bot-protected targets five times. That is 1,700 provider and target pairs. In 353 of them, 20.8%, the provider returned nothing across all five attempts (source: the public run file, October 30, 2026). No HTML came back, so no Markdown could be produced. The converter never ran.

Spread across the field, that gap decides how much of a source list you actually get. Counting only targets where a provider returned content on all five attempts:

Provider Targets returned 5 of 5, out of 100
String 95
Scrape.do 91
Context.dev 91
Firecrawl 80
ScrapingBee 76
Median of the seventeen 61

Figures from the October 30, 2026 run; the per-attempt data is the public run file. The median provider delivered a complete result on 61 of 100 sites. A team that picks a tool on Markdown quality and then loses 39 sources has optimized the wrong step.

What to use, by case

You already have the files. PDFs, Word documents, spreadsheets, and slides never go near a fetch layer. MarkItDown converts Office formats and PDFs to Markdown and is the simpler of the two. Docling does layout-aware document parsing, including table structure, and is described in the Docling Technical Report. Both are free. Neither fetches anything, so neither has an opinion about blocking.

The pages are public and open. Jina Reader converts a URL to Markdown, handles PDFs natively, and captions images through a vision model when you ask it to. Jina's own rate-limit table lists an average latency of 7.9 seconds for the Reader endpoint, and a repeat request for the same URL within five minutes is served from cache. It is free without a key and billed on output tokens with one. Jina states plainly that Reader does not bypass anti-bot systems: "Reader does not actively circumvent or bypass any website defense mechanisms." That is the honest boundary of the free path. Note also that the ReaderLM models are CC-BY-NC 4.0, so commercial production use of the weights needs a license, sold by Elastic since August 10, 2026.

You want to run it yourself. Trafilatura (Apache 2.0) extracts main text and metadata and writes Markdown among other formats. Under most hosted converters sit the same two open pieces: Mozilla Readability for finding the article, and Turndown for HTML to Markdown. Jina exposes Turndown's options directly as X-Md-* headers. Self-hosting gives you full control of the conversion and none of the proxy, retry, and challenge handling.

The sites block you. This is where a fetch API earns its price. Firecrawl returns Markdown, costs 1 credit per page, and by default serves a cached copy up to two days old unless you set maxAge to 0. ZenRows adds response_type=markdown at no extra credit cost. String returns Markdown from /fetch with format: markdown.

What clean Markdown actually means

Three behaviors separate converters, and vendors describe them inconsistently, so check them against your own pages before you commit.

Boilerplate. Navigation, footers, and sidebars burn tokens and confuse retrieval. String's response formats documentation says the default markdownMode: "full" converts the cleaned page in document order, navigation and footers included, while markdownMode: "readable" removes boilerplate and mainContentOnly: true strips page chrome explicitly. ZenRows is worth reading closely here: its Markdown page says the response "converts the full page, including headers, footers, navigation menus, and sidebars," and the FAQ on the same page says ZenRows "strips tags, scripts, and boilerplate during conversion." Those two statements disagree. Test it rather than trusting either line.

Embedded structured data. Many pages carry their real data in JSON-LD rather than in prose. String preserves it as fenced JSON code blocks. If your converter drops it, you lose prices, dates, and ratings that were sitting in the page all along.

Relative links. A Markdown file full of /pricing hrefs is not portable. String rewrites relative URLs against the request origin. Confirm your converter does too, or your citations will not resolve after ingestion.

Firecrawl vs Jina Reader: which gives cleaner Markdown?

On an open page, the two are close, and the cleaner one depends on your settings more than on the tool. On a page that blocks, Firecrawl returns Markdown more often, because Jina Reader does not try to get past anti-bot systems.

Firecrawl Jina Reader
How you call it POST /scrape with formats: ["markdown"] https://r.jina.ai/<url>
Boilerplate control onlyMainContent keeps the main content and drops page chrome (docs) Readability picks the article, and X-Md-* headers pass options to Turndown
Freshness A cached copy up to two days old by default; set maxAge to 0 for a fresh fetch A repeat request within five minutes comes from cache
PDFs and images PDFs parsed in the same call PDFs handled natively; image captions from a vision model on request
Pages that block Tried with proxies; returned 80 of 100 benchmark targets on all five attempts "Reader does not actively circumvent or bypass any website defense mechanisms"
Cost 1 credit per page; Standard is $99 a month billed monthly for 100,000 credits Free without a key at 20 requests a minute; billed on output tokens with one

Three checks settle "cleaner" for your own sources, and each takes minutes:

  1. Count tokens per page. Run 10 of your URLs through both and compare output length on the same page. Navigation and footers are most of the difference.
  2. Look for tables and code. Open the Markdown for a page with a table and a code block, and check both survived as a table and a fenced block, not as flattened text.
  3. Check the date. Compare a price or a date on the live page with the one in each output. A cached copy can be clean and wrong.

If both pass on your open pages, pick on coverage and cost. Jina Reader and Firecrawl's conversion quality have not been measured in a public benchmark, ours included, so no number on this page ranks them on it. For String against Jina Reader on the same questions, see String vs Jina.

What the benchmark does not tell you

The run measures whether a provider returns a page, not how good its Markdown is. There is no public benchmark of conversion quality that we would stand behind, including our own. So read the coverage numbers as a coverage argument only.

Two more limits worth stating. Jina Reader, MarkItDown, Docling, and Trafilatura are not in the run, so they carry no rank here and we do not give them one. And the run's latency score measures fetching, not conversion: String's was the lowest of the seventeen at 4.24 seconds and Firecrawl's was 8.87 seconds, but neither number says how long a converter takes on a page you already hold.

Where String fits, and where it does not

String is a web access API that returns Markdown from the same call that fetches the page, with anti-bot handling in front of it, and blocked requests cost nothing. Full per-target results are on the benchmark page.

On price the honest answer is that it depends on your pages. As of October 2026, Firecrawl's Standard plan is $83 a month billed yearly, or $99 billed monthly, for 100,000 credits, and a scrape costs 1 credit per page (Firecrawl pricing, checked November 2026). As of October 2026, String's Growth plan is $99 a month, all of it usage balance that rolls over, and a standard fetch costs $0.16 per 1,000, so 100,000 plain pages use $16 of it (String pricing, October 2026). Pages that need a real browser and a premium proxy cost $3.25 per 1,000 on Growth as of October 2026, so a list of hard targets costs more. String's argument is the 95 against 80 in the table above, not the invoice. If your source list is soft targets, the cheaper tool is the right tool, and the String and Firecrawl comparison sets out where each one wins.

FAQ

How to convert a webpage to markdown for an LLM context window?

Call a fetch API that returns Markdown directly, or fetch the HTML and run it through Readability plus Turndown yourself. With String it is one request with format: markdown. With Jina Reader it is https://r.jina.ai/<url>. The output goes straight into a context window without further parsing.

What's the best HTML-to-markdown API for LLM pipelines?

For open pages, Jina Reader, because it is free at low volume. For pages behind anti-bot systems, a fetch API with Markdown output: String, Firecrawl, or ZenRows. The choice is set by which of your source URLs return content, not by conversion quality, which is close between all of them.

Which service turns web pages into clean markdown for RAG?

All of String, Firecrawl, ZenRows, and Jina Reader do. The difference that shows up in a RAG corpus is coverage. In the October 30, 2026 benchmark run, 353 of 1,700 provider and target pairs returned nothing at all across five attempts, so about one pairing in five produced no document to embed.

Firecrawl vs Jina Reader: which gives cleaner markdown for an LLM?

On open pages they are close: both can drop navigation and footers, Firecrawl with onlyMainContent and Jina Reader through Readability and its X-Md-* options. Run 10 of your own URLs through both and compare tokens per page and whether tables survive. On sites that block, Firecrawl returns more pages: 80 of 100 benchmark targets on all five attempts in the October 30, 2026 run, while Jina states that Reader does not bypass anti-bot defenses.

How to ingest web pages into a vector database for RAG?

Fetch each URL as Markdown, split on headings, embed the chunks, and store the source URL and the fetch date with every chunk. Markdown helps because its headings give you a chunk boundary that matches the document's own structure. Keep the fetch date, because a page you ingested in March may no longer say what your index thinks it says.

How to collect web data for LLM training or RAG?

Start from a source list rather than a crawl, because a bounded list is auditable and a crawl is not. Fetch each source as Markdown, record the URL, the status, and the date, and re-fetch on a schedule. For a model's training set, our page on Common Crawl alternatives for training data compares a crawl of your own, a fetch API and a managed dataset. Check the legal position of your target list first; our is web scraping legal page covers what the courts have held.

Does String's Web Access API return markdown for LLMs?

Yes. Set format: markdown on /fetch. The default mode is full, which converts the whole cleaned page in document order; set markdownMode: "readable" for a shorter response without boilerplate, or mainContentOnly: true to remove navigation, headers, sidebars, and footers. Both modes preserve headings, lists, links, tables, and code blocks, keep embedded structured data as fenced JSON blocks, and rewrite relative URLs to absolute. The API's own default format is json, so Markdown is a parameter you set, not the out-of-the-box response.

Best open-source web scraping frameworks vs paid scraping APIs?

For Markdown conversion specifically, the open tools are good and free: MarkItDown, Docling, and Trafilatura all convert well, and Readability plus Turndown is what several paid products run underneath. The paid APIs are not selling you a better converter. They are selling proxy rotation, challenge handling, and retries, which is the part that decides whether the converter gets a page. Use the open path for documentation sites, blogs, and public filings. Pay when your source list includes sites that block, or when you do not want to maintain that layer yourself.

Sources

Checked November 9, 2026 unless noted.

Get your API key →Explore the Web Access API