Website to Markdown for RAG: Crawl & Changed Pages icon

AI & documents · Live on Apify

Website to Markdown: Crawl a Site or Docs Section for RAG

Give a website address. You get the text of every page as clean Markdown for AI tools and search.

About $0.19 for 1,000 pages$0.00019 per page + $0.002 per run. Apify bills you, not us.One page in a run of its own: about $0.0022.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

urlhttps://docs.apify.com/academy
markdown# Apify Academy Learn everything about web scraping…
wordCount183

How to use it: 3 steps

  1. Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: https://docs.apify.com/academy in Start URLs. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Turn a website or a docs section into clean Markdown for RAG and LLM pipelines: one Dataset row per page, without menus, footers or cookie banners. Add one start URL and a page limit. The smallest run (20 pages of a docs site) takes a few seconds. On repeat runs, onlyChanged returns only new, changed and removed pages. No login, no browser.

Good for

  • Feed a docs site or help center into a vector database or a RAG chatbot.
  • Refresh that index every day or week and re-embed only the pages that changed.
  • Get LLM-ready Markdown of a blog section, a product guide or an API reference.

Not a good fit

  • JavaScript is not executed. Single-page apps that render content in the browser give empty or short pages, marked status: partial.
  • No login, cookies, CAPTCHA or paywalled pages. PDF, DOCX and images are skipped.
  • Up to 2000 pages per run and up to 50 start URLs. The output is whole pages; the Actor does not split text into chunks or create embeddings.

Who uses it

Chatbot builders

Feed a help center or docs site into your RAG chatbot.

Developer relations teams

Keep an LLM index of your own docs fresh every week.

Technical writers

Get a Markdown copy of a guide or API reference section.

Price

Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.

What you pay forPriceWhen
Start fee$0.002Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more.
Page$0.00019 (from $0.00016 on paid Apify plans)One web page converted to Markdown and saved to the Dataset. Failed, skipped and removed pages are not charged.
Unchanged page$0.00012With onlyChanged, one page that was checked and did not change since the last run. It is not saved to the Dataset.
Extra run time$0.0003One second of run time above the included time (5 seconds per run plus 0.4 seconds per charged page). Charged only for very slow sites or a long robots.txt Crawl-delay.

Examples

  • One page: about $0.0022.
  • 1,000 pages: about $0.19.
  • Every day 100 pages, for 30 days: about $0.63 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 26,000 pages.

Prices checked on 24 October 2026. See the current price on Apify.

Questions

Do I need an account on the website or an API key?

No account on the website you crawl. To start the tool from your own code, you need your Apify API token (Apify Console → Settings → API & Integrations).

Does it follow robots.txt?

Yes. Pages blocked by robots.txt are skipped and not charged.

Does it work on JavaScript apps?

Not well. It does not run JavaScript, so such pages come back short and marked partial.

Does it split text into chunks?

No. You get whole pages. Do the chunking and embeddings in your own pipeline.

How many pages can I crawl?

Up to 2000 pages and 50 start URLs per run.

Why was I charged extra-second?

The site was slow or its robots.txt asks to wait between requests (Crawl-delay). The Actor waits as asked, and that waiting time above the included time is charged. Check RUN_SUMMARY.counts.chargedExtraSeconds. Lower maxPages, set a shorter run timeout or a Maximum cost per run to cap it.

How does "only changed" decide that a page changed?

It compares a hash of the clean Markdown. Changes in menus, ads or whitespace do not count. A page is downloaded each time, but an unchanged page is not saved and costs less. History is kept in your account in the key-value store website-to-markdown-delta.

When do I get removed pages?

When a page from the last delta run now answers HTTP 404 or 410. Pages that the crawl no longer reaches by links are re-checked directly (they count as normal or unchanged pages). Pages that fail with other errors, or are not re-checked because maxPages was reached, stay in the history and are not reported as removed. If no page loads at all in a run (the whole site answers 404), nothing is marked removed. A page that now redirects to another URL is not marked removed either. Up to 1000 removed rows per run.

Is the Markdown complete?

It is the main content of the HTML page. Very large pages are cut (the row gets status: partial and a note). Content that appears only after JavaScript runs is not included.

Details

Step by step on Apify
  1. Open the Input tab.
  2. In Start URLs (startUrls) keep the prefill https://docs.apify.com/academy or add your own page, for example https://docs.example.com/guide.
  3. Keep Max pages (maxPages) at the prefill 20. Keep Crawl scope at the default path.
  4. Click Start.
  5. Open the Output tab, view Markdown, and check the markdown field of the first row.
Use cases
TaskInputYou getKey fieldsNext step
Index a docs site for RAGstartUrls + maxPages (+ useSitemap)Pageurl, title, markdown, wordCountChunk markdown, embed, store with url as source
Keep the index freshsame input + onlyChanged: true on a scheduleChanged pagechangeStatus, url, markdown, contentHashUpsert new/changed, delete removed by url
One section onlystartUrls + includeGlobs / excludeGlobsPageurl, markdownLLM context, knowledge base
Collect page linksincludeLinks: truePageurl, linksSite map, link checks
Tips for better results
  • Start from a section path. The crawler stays inside the path you give.
  • Turn on only changed for repeat runs. Re-embed only pages that changed.
  • Delete removed pages from your index by URL. Removed rows are free.
Limits and good to know
  • Included run time: 5 seconds per run plus 0.4 seconds per charged page. Normal sites stay well inside it (2000 heavy pages took 577 of 805 included seconds), so extra-second is not charged
  • extra-second appears only on very slow sites or when robots.txt sets a long Crawl-delay
  • removed rows are free
  • Failed pages, skipped pages (robots.txt, not HTML, duplicates) are free
  • A run with no pages (for example, robots.txt blocks everything) costs only the run start. Failed runs (site not reachable, invalid input) also pay the run start
  • The Actor stops when it reaches your Maximum cost per run. Rows saved before that stay in the Dataset

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "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",
  "markdown": "# Apify Academy\n\nLearn everything about web scraping and automation with our free courses…",
  "wordCount": 183,
  "contentHash": "f5aa630681e827a9a830955f9baaaf034734f2c4bc0d0610e82a9d76359723ce",
  "changeStatus": "new",
  "previousCrawledAt": null,
  "lastModified": "2026-10-13T19:47:40.000Z",
  "httpStatus": 200,
  "depth": 0,
  "referrerUrl": null,
  "status": "complete",
  "note": null,
  "crawledAt": "2026-10-14T02:35:12.564Z",
  "source": "website"
}

Use it from code

Actor ID: cliqtomedia/website-to-markdown. You need your Apify API token from Apify Console → Settings → API & Integrations.

Python · apify-client
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/website-to-markdown").call(run_input={
    "startUrls": [
        "https://docs.apify.com/academy"
    ],
    "maxPages": 20
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
cURL
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~website-to-markdown/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": ["https://docs.apify.com/academy"], "maxPages": 20}'
LangChain · langchain-apify
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/website-to-markdown")
result = tool.invoke({"run_input": {"startUrls": ["https://docs.apify.com/academy"], "maxPages": 20}})
print(result)

The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.

Data fields (18)
FieldTypeMeaning
urlstringPage URL after redirects, normalized (no #fragment, no tracking parameters). Key for delta.
titlestringPage title.
descriptionstringMeta description.
languagestringLanguage from <html lang>, e.g. en.
markdownstringMain content as Markdown (navigation, headers, footers and cookie banners removed). null for removed pages.
wordCountintegerWords in the Markdown.
contentHashstringSHA-256 of the Markdown with whitespace normalized; equal hash = same content.
changeStatusstringWith onlyChanged: new, changed or removed. Unchanged pages are not saved. null when onlyChanged is off.
previousCrawledAtstringWhen this page was last crawled by a previous delta run.
lastModifiedstringLast-Modified HTTP header or sitemap lastmod, ISO 8601. null when the site does not say.
httpStatusintegerHTTP status of the page.
depthintegerLink depth from the start URL (0 = start URL).
referrerUrlstringPage where the link to this page was found.
linksarrayLinks found on the page (only with includeLinks).
statusstringcomplete, partial (little text; the page probably needs JavaScript, or the Markdown was cut) or removed.
notestringWhy a page is partial or removed.
crawledAtstringWhen the page was fetched, ISO 8601.
sourcestringAlways website.
Input settings (13)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Start URLs requiredstartUrlsarray["https://docs.apify.com/academy"]
Max pagesmaxPagesinteger20
Max link depthmaxDepthinteger5
Crawl scopecrawlScopestring"path"
Use sitemap.xmluseSitemapbooleanfalse
Include URL patternsincludeGlobsarray
Exclude URL patternsexcludeGlobsarray
Only changed pages (delta)onlyChangedbooleanfalse
Delta state namestateKeystring
Extra elements to removeremoveSelectorsstring
Include page linksincludeLinksbooleanfalse
Parallel requestsmaxConcurrencyinteger5
ProxyproxyConfigurationobject{"useApifyProxy": false}

Use cases with this tool

Each guide shows all the steps and the other tools.

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure