URL to Markdown Converter
Pricing
$2.00 / 1,000 converted pages
URL to Markdown Converter
Turn public web pages into clean Markdown with title, links, and heading sections. You pay only for pages that convert.
Pricing
$2.00 / 1,000 converted pages
Rating
0.0
(0)
Developer
Comrade Coding
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Give it a list of public web pages. For each page you get back the text as clean Markdown, plus the title, description, and language. If you want them, you also get a list of every link on the page and the page split into sections by heading.
It is meant for feeding pages to a language model, building a search index, archiving docs, or pasting a page into a notes app without the menus and cookie banners.
What it does to each page
- Checks the site's
robots.txt. If the page is disallowed, it is skipped. - Downloads the page (HTML or plain text, up to 5 MB, 30 second timeout).
- Removes scripts, styles, and embedded frames. With Strip navigation and page chrome on, it also removes nav bars, headers, footers, sidebars, forms, buttons, cookie banners, "skip to content" links, and heading permalink markers.
- With Extract main content on, it keeps only the article body, using the same kind of readability algorithm browsers use for reader mode. If a page has no clear main body (a home page, a short landing page), it falls back to the whole page and says so in the
extractionfield. - Converts the result to Markdown: headings, lists, bold and italic, code blocks, block quotes, and tables. Relative links and image URLs are made absolute.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array | required, no default | Pages to convert. Plain strings or { "url": "..." } objects. Duplicates are dropped. |
maxItems | integer | 100 | Stop after this many converted pages. Caps what a run costs you. |
useReadability | boolean | true | Keep only the main content of each page. |
stripBoilerplate | boolean | true | Remove navigation, headers, footers, sidebars, and banners. |
imageMode | string | markdown | markdown keeps . alt-text writes [Image: alt text] and drops the URL. none removes images. |
includeLinks | boolean | false | Add a links array of { text, url }, one per unique http(s) link in the converted content. |
includeSections | boolean | false | Add a sections array of { level, heading, text }, split at each Markdown heading. Text before the first heading has level 0. |
Example input:
{"startUrls": [{ "url": "https://example.com/" },{ "url": "https://en.wikipedia.org/wiki/Markdown" }],"maxItems": 10,"imageMode": "alt-text","includeLinks": true,"includeSections": true}
Output
One dataset item per converted page. This is a real result from a test run:
{"source_url": "https://example.com/","final_url": "https://example.com/","fetched_at": "2026-10-28T05:59:51.090Z","status_code": 200,"title": "Example Domain","description": null,"language": "en","extraction": "full-page","word_count": 25,"markdown": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.","links": [],"sections": [{"level": 0,"heading": "","text": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes."}]}
Fields:
source_url: the URL you gave.final_url: where the page ended up after redirects.fetched_at: ISO 8601 time of the fetch.status_code: HTTP status of the final response.title,description,language: from the page's title, meta description, andlangattribute.nullwhen missing.extraction:readability(main content found),full-page(whole page converted), orplain-text(the URL served plain text or Markdown, returned as is).word_count: rough word count of the Markdown.markdown: the converted page.links: only whenincludeLinksis on.sections: only whenincludeSectionsis on.
Pages that fail are not added to the dataset, so you do not pay for them. They are listed in the FAILED_URLS record in the run's key-value store, each with a reason such as Disallowed by robots.txt, HTTP 404, or Unsupported content type: application/pdf.
Limits
- Public pages only. It does not log in, send cookies, or fill forms.
- It does not run JavaScript. Pages that build their content in the browser (some single-page apps) come back mostly empty. Check
word_count. - HTML and plain text only. PDFs, images, and other files are skipped.
- Pages over 5 MB or slower than 30 seconds are skipped.
- It does not follow links or crawl a site. You list the pages you want.
- Pages are fetched one at a time with a 300 to 800 ms pause between requests to the same site, so large lists take a while. Expect about one page per second when all URLs are on one site.
- If a site's
robots.txtcannot be reached (server error or timeout), that site's pages are skipped rather than guessed at. - Main content extraction is a heuristic. On unusual layouts it can keep a sidebar or drop a short intro. Turn it off to get the whole page with only the chrome removed.
Pricing
Pay per result: you are charged for each page that ends up in the dataset. Skipped and failed pages are free. Set maxItems to cap the cost of a run.
This actor is not affiliated with any of the sites used in the examples.
Use it from an AI agent
Add this actor as a tool through Apify's MCP server: https://mcp.apify.com?tools=comradecoding/url-to-markdown. The agent gets one JSON row per page with url, title, description, language, markdown and word_count.
Integrations
Anything that can call the Apify API can run this actor: the Apify API and client libraries, and Apify's integrations for Make, n8n, Zapier and LangChain. Results come back as a dataset you can download as JSON, CSV or Excel.
What it costs
| Run size | Cost |
|---|---|
| 100 pages | about $0.20 |
| 1,000 pages | about $2 |
| 10,000 pages | about $20 |
Platform usage is included in the price.
FAQ
Does it work on sites that need JavaScript?
No. It reads the HTML the server sends. Pages built in the browser can come back mostly empty, so check word_count.
Can it crawl a whole site?
No, you list the pages. To get every page of a site, run Sitemap URL Extractor first and pass its URLs in.
Am I charged for pages that fail?
No. Failed and skipped pages never reach the dataset, so they are not charged. They are listed with a reason in FAILED_URLS.
How fast is it?
About one page per second on a single site, because of the polite delay between requests.