Website to Markdown & Sitemap Scraper avatar

Website to Markdown & Sitemap Scraper

Pricing

$1.50 / 1,000 pages

Go to Apify Store
Website to Markdown & Sitemap Scraper

Website to Markdown & Sitemap Scraper

Turn websites and XML sitemaps into clean Markdown for AI, RAG and research. Crawl internal links, keep tables and code, export text and optional chunks. Pay only for extracted pages. No API key required.

Pricing

$1.50 / 1,000 pages

Rating

0.0

(0)

Developer

Kusol Sukhakul

Kusol Sukhakul

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Paste a website URL. Get clean Markdown for AI, RAG, search and research.

Extract public website content without writing a crawler. Discover pages from internal links, robots.txt and XML sitemaps, remove common navigation clutter, and export readable Markdown with headings, tables, code blocks and absolute links.

$1.50 per 1,000 successfully extracted pages. No startup fee. Platform usage included. Errors, duplicate final URLs and sitemap discovery do not trigger extraction charges. No LLM API key or separate proxy subscription is required.

Get started

  1. Paste a public HTTPS website, page, or XML sitemap URL.
  2. Set Maximum extracted pages. Start with 5–10 to check the output.
  3. Run the Actor. Open Markdown content in the Dataset or download Combined Markdown from Output.

Example: collect a small documentation section.

{
"startUrls": [{"url": "https://docs.apify.com/actors/development/actor-definition/actor-json"}],
"maxPages": 5,
"includeUrlPrefixes": ["https://docs.apify.com/actors/development/actor-definition/"],
"useSitemaps": true,
"crawlLinks": true,
"includeChunks": true
}

For a whole website, remove includeUrlPrefixes. To fetch only your supplied pages, set useSitemaps: false and maxDepth: 0.

What you get

  • Clean markdown and readable text for each successful page.
  • Page title, meta description, HTML language, headings and content links.
  • Requested URL, final URL, declared canonical URL and collection time.
  • SHA-256 document and content IDs for downstream deduplication.
  • Optional deterministic Markdown chunks for RAG pipelines.
  • A combined Markdown file and a run summary explaining when crawling stopped.

The declared canonical URL is metadata only: the Actor does not trust it as a redirect or use it to discard other pages. Identical content on different URLs remains separate. Redirect aliases resolving to an already delivered URL are skipped within the run.

Example output

Illustrative successful Dataset item (shortened):

{
"status": "SUCCESS",
"url": "https://example.com/docs/start",
"finalUrl": "https://example.com/docs/start",
"title": "Getting started",
"description": "Set up your first project.",
"language": "en",
"markdown": "# Getting started\n\nCreate your first project...",
"text": "Getting started\nCreate your first project...",
"headings": [{"level": 1, "text": "Getting started"}],
"links": ["https://example.com/docs/install"],
"depth": 1,
"discoveredFrom": "link",
"httpStatus": 200
}

Actual results also include documentId, contentHash, characterCount, wordCount, canonicalUrl, scrapedAt, and optional chunks. Word count uses whitespace segmentation; it is not a linguistic word count for Thai, Chinese, or similar languages.

An unavailable page produces an uncharged ERROR row with its URL and reason. Filter status == "SUCCESS" before sending rows to your AI or database.

Pricing and spending limits

Successful pagesExtraction charge
1$0.0015
10$0.015
100$0.15
1,000$1.50

One page-extracted event is charged after a successful result is saved to the Dataset. There is no startup charge, and Apify platform usage is included in this Actor's event price. Use the run's maximum total charge alongside maxPages to control spending. A run stops when the budget cannot cover another page.

Each run is a fresh crawl, so pages successfully extracted again on another run are charged again. Free-plan credits may be used according to Apify's current account rules. Separate downstream tools can have their own costs.

Crawl controls

InputDefaultPurpose
startUrlsRequired1–20 public HTTPS pages, websites or XML sitemap URLs. API also accepts bare domains.
maxPages10Maximum successful pages per run, from 1 to 1,000.
useSitemapstrueRead sitemap declarations and /sitemap.xml, including indexes and gzip.
crawlLinkstrueFollow internal links.
maxDepth3Maximum link depth. Start URLs and sitemap entries start at depth 0.
includeUrlPrefixesEmptyExport only matching full URL prefixes.
excludeUrlPrefixesEmptyExclude matching discovered URLs.
sitemapUrlsEmptyAdditional sitemap URLs on the supplied websites.
contentSelectorAutomaticSelect the article or content container.
removeSelectorsEmptyRemove additional CSS-selected sections.
includeChunksfalseInclude Markdown chunks with deterministic IDs.
chunkSize2,000Maximum characters per chunk, from 500 to 8,000.

Only supplied hostnames and their www aliases are crawled. Other subdomains must be added explicitly. URL prefix matching is literal and case-sensitive; use a trailing slash to target a section. Supplied start pages can be read for discovery even if outside the export prefixes. Navigation links are used for discovery before navigation is removed from the content.

Tracking parameters and fragments are removed from crawl URLs; functional query parameters are retained. HTTP-only pages, authenticated pages, private networks and nonstandard ports are not supported.

Use with n8n, Make or an API

n8n: use the Apify node to run skusol/website-to-markdown-scraper, wait for completion, then retrieve Dataset items. Filter on status and map markdown, url, and title to your next node. You can also use HTTP Request nodes with the official Apify REST API.

Make: connect your Apify account, add Run an Actor, select this Actor and supply the input JSON. Wait for the run to finish, then use Get Dataset Items with its default Dataset ID. A scheduled scenario can refresh your content periodically.

JavaScript using the official apify-client package:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('skusol/website-to-markdown-scraper').call({
startUrls: [{ url: 'https://docs.apify.com/actors/development/actor-definition/actor-json' }],
maxPages: 5,
includeUrlPrefixes: ['https://docs.apify.com/actors/development/actor-definition/'],
includeChunks: true
}, { maxTotalChargeUsd: 0.015 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const pages = items.filter(item => item.status === 'SUCCESS');

For large result sets, paginate Dataset reads. These examples describe integration steps; no n8n or Make scenario, vector database, embeddings or LLM processing is automatically created by the Actor.

Limits and troubleshooting

  • Public HTML, plain text and Markdown only. JavaScript is not rendered. PDFs, Office documents, images, videos, login sessions and anti-bot bypass are outside this version's scope.
  • robots.txt is respected. An unavailable or invalid robots file causes a skip, except HTTP 404/410 which means no robots rules were found.
  • Sitemap discovery is bounded to 20 XML requests, five index levels, 100 queued sitemap files and 10,000 page URLs. A sitemap can be much larger than the selected page limit; completeness is not guaranteed.
  • Limits: 2 MB per page response, 5 MB per sitemap after decompression, 150,000 Markdown characters per page. UTF-8 content is expected.
  • Page attempts are capped at 3 × maxPages + 10. The crawler stops after roughly 14 minutes plus any in-flight request. SUMMARY.stopReason identifies page, budget, attempt or time limits.
  • Combined Markdown is capped at 20 MB. SUMMARY.bundleOmittedPages reports pages omitted from the bundle; their delivered content remains in the Dataset. The bundle is finalized when the run finishes normally; Dataset rows are available progressively.
  • Empty pages, bot challenge pages and selectors matching no content produce explicit errors. If all page extractions fail, the run fails without extraction event charges.
  • Each run starts over; there is no cross-run cache, automatic change comparison or resumable crawl state. For scheduled content changes, see Website Change Monitor & RAG Knowledge Sync.

Use the Actor for content you are permitted to collect. Website content is untrusted data; review it before applying it as instructions in an AI workflow.

Support

Open an issue on this Actor with the run ID, a public example URL, expected output and the relevant error or summary. Do not include passwords, cookies or API tokens.