At a glance
What the Website to Markdown API does
- Start from
- One or more start URLs
- Scope
- Under the start path or the whole site; include and exclude URL globs
- Output
- 13 fields per page; JSON, CSV, Excel, API
- Automate
- Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents
Who it is for
- AI developers loading documentation sites into a vector database for RAG
- Teams building a chatbot or support assistant on their own help center
- Researchers turning blogs and knowledge bases into clean text
- AI agents that need a site's pages as Markdown through MCP
Output
What you get
- url (final, after redirects), title, meta description, language, last_modified (ISO 8601 UTC)
- markdown: the page's main content as Markdown
- headings: [{level, text}] of the main content
- links: absolute URLs linked from the main content
- word_count, crawl_depth, http_status, scraped_at
Example
Input and output
Input
{
"startUrls": [
"https://docs.apify.com/academy"
],
"maxPages": 100,
"scope": "path",
"excludeGlobs": [
"**/changelog/**"
]
}One output record
{
"url": "https://docs.apify.com/academy",
"title": "Apify Academy | Academy | Apify Documentation",
"description": "Learn everything about web scraping and automation with our free courses that will turn you into an expert scraper developer.",
"language": "en",
"last_modified": "2026-11-04T07:17:58Z",
"markdown": "# Apify Academy\n\nLearn everything about web scraping and automation with our free courses that will turn you into an expert scraper developer.\n\n## Beginner…",
"headings": [
{
"level": 1,
"text": "Apify Academy"
},
{
"level": 2,
"text": "Beginner courses"
},
{
"level": 4,
"text": "Web scraping with AI"
},
"… 8 more"
],
"links": [
"https://docs.apify.com/academy/scraping-with-ai",
"https://docs.apify.com/academy/scraping-basics-javascript",
"https://docs.apify.com/academy/scraping-basics-python",
"… 5 more"
],
"word_count": 231,
"crawl_depth": 0,
"http_status": 200,
"source_url": "https://docs.apify.com/academy",
"scraped_at": "2026-11-04T11:25:08Z"
}From a real run of this tool; long text and lists shortened here.
How to use it
Three steps
- Paste one or more start URLs, e.g. https://docs.apify.com/academy, and set Max pages.
- Choose the scope: 'Under the start path' for one docs section, or 'Whole site'. Optionally add include or exclude URL globs such as **/blog/**.
- Click Start, then download JSON, CSV or Excel, or send the pages to your vector database, LangChain, LlamaIndex, Zapier, Make or n8n through the API.
API
Call it from Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("aurelix/website-to-markdown").call(run_input={'startUrls': ['https://docs.apify.com/academy'],
'maxPages': 100,
'scope': 'path',
'excludeGlobs': ['**/changelog/**']})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)pip install apify-client. The same input works from the Apify console, a schedule, Make, n8n, Zapier or an AI agent through the Apify MCP server.
Pricing
Pay per result
| Per 1,000 pages, free plan | $0.65 |
| Per 1,000 pages, paid plans | $0.60 |
| Start fee per run | $0.001 |
Live prices from the Apify Store; no subscription and no platform usage billed on top. See the Store page.
Honest limits
What it does not do
- No JavaScript rendering: client-side-only pages (an empty app shell) are skipped and listed in the log, not converted.
- Only HTML pages are converted; PDFs, images and other files are skipped.
- Scope is one site per start URL: www. and the bare domain count as one site, but other subdomains are not followed.
- At most two new requests per second per site (slower when robots.txt sets a Crawl-delay). Conversion is CPU-bound: about 1,000 pages an hour on large documentation pages at 256 MB, so the default 1-hour run fits roughly 1,000 to 3,000 pages. The run stops itself before its timeout and ends SUCCEEDED with the pages done so far; raise the timeout or memory for bigger crawls.
- HTML pages over 2 MB are skipped with a log line and not charged, to keep memory low.
- Main-content detection is automatic; on unusual layouts a little boilerplate can remain or a side block can be dropped.
- Pages behind a login, paywall or bot challenge are not accessible.
FAQ
Questions buyers ask
Can I convert a website to Markdown without login?
Yes. It never logs in and needs no account on the site, only a free Apify account to run it. It reads the pages a logged-out visitor can see.
Does it work for JavaScript-heavy sites?
No. It uses plain HTTP without a browser, so pages that need JavaScript to show their content are skipped and not charged.
Is there a cheaper alternative to Website Content Crawler for RAG?
For sites that serve their text in HTML, yes. This Actor charges a flat $0.65 per 1,000 pages on the free plan and $0.60 on paid plans at 256 MB, and failed, duplicate and empty pages are not charged. apify/website-content-crawler bills compute units at 8 GB default memory, and apify/rag-web-browser costs $2.28 and $1.90. Both of those render JavaScript; this Actor reads server HTML only, so pick them for JavaScript-only sites.
How do I feed a website into ChatGPT, Claude or an n8n AI agent?
Two ways. For a fixed workflow, add Apify's n8n or Make node, choose **Run Actor**, enter aurelix/website-to-markdown and map the dataset to the next step. For an AI agent (Claude, ChatGPT, Cursor or an n8n AI Agent node), add https://mcp.apify.com/?tools=aurelix/website-to-markdown as an MCP server and ask for pages as Markdown in plain words; setup for each client is in the section above. Runs bill your own Apify account at the same per-result price.
How much does the Website to Markdown API cost?
$0.65 per 1,000 pages ($0.60 on paid Apify plans), billed through your Apify account; you pay only for results. Apify's free plan includes $5 of credit a month, enough for about 7,692 pages.
Does it respect robots.txt?
Always, and it cannot be switched off. Disallowed URLs are never requested, Crawl-delay is honoured, redirects into disallowed paths are not followed, and a site whose robots.txt returns a server error is not crawled. Links on pages marked nofollow are not followed.
What is 'main content'?
The page's <article> or <main> element when it has one, otherwise the largest content block. Navigation, headers, footers, tables of contents, cookie banners, site banners, version switchers, Wikipedia language and category boxes, share buttons, forms, scripts and hidden elements are removed. Prose sidebars and footnotes inside the content are kept; link-list sidebars are dropped.
Does it run JavaScript?
No. It reads the HTML the server sends, which covers documentation sites, blogs, news, knowledge bases and most company sites, including server-rendered React and Next.js. Pages that are an empty JavaScript app shell are detected, listed in the log and not charged. A headless browser would need about 1 GB of memory per run, so it is left out to keep runs cheap.
How do I crawl only part of a site?
Use the start URL's folder (scope 'Under the start path'), or include and exclude globs: '**' matches anything, '*' anything except '/'. Example: include https://example.com/docs/** and exclude **/v1/**.
Are duplicate pages charged?
No. A URL is returned once, and a page whose Markdown is identical to one already returned (e.g. / and /index.html) is skipped for free.
How do I keep the corpus fresh?
Run this Actor once for the full copy, then re-crawl only what changed with our Website Change Tracker on the same start URLs: it returns added, changed and removed pages, so you re-embed only those.
Can I use it from an AI assistant?
Yes. The inputs are described for agents: give 'startUrls' and optionally 'maxPages'. It works through Apify's MCP server and API.
Is this legal?
It reads only public data any logged-out visitor can see: the website you choose (crawl only sites you have the right to crawl). It goes at a polite pace, respects robots.txt, never logs in and never solves CAPTCHAs. It returns each page's main content as Markdown with title, headings and links; the content is returned as the site published it; copyright in it stays with its owner. To have a record removed, open an issue on this Actor's Issues tab; if a site owner formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.
What am I charged when a run converts nothing?
Only the $0.001 start fee. Pages blocked by robots.txt, fetch errors, HTTP errors such as 404, 429 and 500, non-HTML files, duplicates, pages over 2 MB, pages that need JavaScript and pages with no main content are never charged. The run's status message lists how many pages were skipped for each reason.
Does Max pages count skipped pages?
No. Max pages counts only pages converted and charged, so a crawl with many errors or duplicates still returns up to that many pages if the site has them. The highest value is 10,000.
How many pages fit in one run?
About 1,000 to 1,300 large documentation pages an hour at the default 256 MB, because the conversion is CPU-bound. A run with the default 1-hour timeout fits roughly 1,000 to 3,000 pages, depending on page size. The run stops itself before its timeout and ends SUCCEEDED with the pages done so far, so raise the timeout or the memory for bigger crawls.
Does it retry when a site is slow or throttles it?
Yes. HTTP 429 and 5xx responses and connection errors are retried up to 3 times in all, waiting for the site's Retry-After header when it sends one (up to 30 seconds). A page still failing after that is skipped and not charged; a 429 is named as throttled in the status message, so you know to try again later.
Does it use proxies?
No. It fetches pages directly, identifies itself as AurelixBot in the user agent, and sends at most two new requests a second per site with up to 3 in flight. Sites that block bots or show a challenge page will not be converted.
Does it follow links to other subdomains or sites?
No. www. and the bare domain count as one site; other subdomains and other sites are not followed. Add each subdomain as its own start URL if you need it.
What do crawl_depth and http_status mean?
crawl_depth is the number of links followed from a start URL to reach the page (0 for the start URL itself). http_status is the final HTTP status of the page after redirects; it is always 200 on returned rows, because other statuses are skipped.
Does it work in other languages?
Yes. The Markdown keeps the page's own text in any language, and the language field is read from the page's HTML lang attribute (empty when the page does not set one).
How do I export pages to Google Sheets?
Download the run's results as CSV or Excel and open them in Google Sheets, or add Apify's Google Sheets integration to the run or a schedule so every run's results land in a sheet.
Guides
Tutorials using this tool
Related
Related tools
Google Trends by Region
Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
PDF to Markdown OCR & Table Extraction
Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
Google Autocomplete API
Expands seed keywords into hundreds of real Google and YouTube autocomplete phrases, tagged by search intent.
Try the Website to Markdown API
Open it on the Apify Store, paste the example input above and click Start. Results download as CSV, Excel or JSON.