๐ŸŒ Website Content Crawler avatar

๐ŸŒ Website Content Crawler

Pricing

from $5.00 / 1,000 row_results

Go to Apify Store
๐ŸŒ Website Content Crawler

๐ŸŒ Website Content Crawler

Crawl any website into clean text, Markdown & rich metadata โ€” AI-ready output for RAG, LLMs & vector databases. Streams to your dataset in real time.

Pricing

from $5.00 / 1,000 row_results

Rating

0.0

(0)

Developer

Data Minds

Data Minds

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

๐ŸŒ Website Content Crawler โ€” Web Scraping & AI Content Extraction Actor

Website Content Crawler is a powerful Apify Actor for website crawling, web scraping, content extraction, and AI data preparation. It crawls any website starting from your seed URLs, follows internal links, extracts clean plain text, Markdown, and rich metadata (title, description, canonical URL, Open Graph, JSON-LD, language, headers), and writes structured page data to an Apify Dataset in real time โ€” perfect for RAG pipelines, LLM knowledge bases, vector database ingestion, semantic search, and SEO content audits.

๐Ÿ’ก Need a custom version, private integration, or a tailored crawler? Email hello.dataminds@gmail.com.

It is a focused alternative to the official apify/website-content-crawler: a tighter feature surface, predictable cost, and AI-first output (text + Markdown + metadata) ready for LangChain, LlamaIndex, OpenAI, Pinecone, Qdrant, and Weaviate pipelines.


๐Ÿ“‘ Table of contents


๐ŸŒ What is Website Content Crawler?

Website Content Crawler is an Apify-hosted web scraping API and website crawler that turns any public website into clean, structured, AI-ready data. Unlike generic HTTP scrapers, this Actor:

  • Crawls an entire site from one or more start URLs, staying on the same registrable domain.
  • Renders JavaScript automatically when a page needs it, so single-page apps still yield real content.
  • Cleans HTML by stripping navigation, footers, scripts, cookie banners, modals, and other noise.
  • Extracts content as readable plain text and optional Markdown for token-efficient LLM ingestion.
  • Captures metadata (title, description, canonical, Open Graph, JSON-LD, headers, language).
  • Saves results as structured rows in an Apify Dataset, exportable to JSON, CSV, Excel, or via the Apify API.

If you need a website-to-dataset pipeline for AI agents, chatbot grounding, GPT knowledge files, RAG retrieval, or content analytics, this is the Actor.


โœจ Main features

  • ๐ŸŒฑ Multi-URL crawl seeds โ€” start from one URL or hundreds; the crawler stays on the same domain by default.
  • ๐ŸŽฏ Glob-based URL filtering โ€” includeUrlGlobs / excludeUrlGlobs for surgical scope (/blog/*, /docs/**, skip /admin/**). Path-only patterns work as written; * stops at /, ** crosses folders.
  • ๐Ÿ—บ๏ธ Discovery sources โ€” seed the queue from sitemap.xml (useSitemaps, follows sitemap indexes) and llms.txt (useLlmsTxt) to reach pages that aren't linked, and honour robots.txt (respectRobotsTxtFile).
  • ๐Ÿ›ก๏ธ Apify Proxy support โ€” datacenter or residential groups, country targeting, or your own proxy URLs, with automatic fallback.
  • ๐Ÿช Initial cookies โ€” initialCookies sent on every request and loaded into the browser for session or light-login access.
  • ๐Ÿ–ฑ๏ธ Rendered-page interaction โ€” maxScrollHeightPixels auto-scroll for lazy/infinite-scroll content, clickElementsCssSelector to expand accordions / "load more", and blockMedia to skip images/fonts/video for faster, cheaper renders.
  • ๐Ÿšซ Ad/tracker blocking โ€” blockAds aborts known ad and tracker domains on rendered pages, on top of blockMedia.
  • ๐Ÿ“ฑ Mobile emulation โ€” mobileView renders with a real mobile device profile (viewport, UA, touch) instead of desktop.
  • ๐Ÿ•ต๏ธ PII redaction (best-effort) โ€” redactPii masks emails, phone numbers, card-like numbers, and SSNs in text/markdown.
  • ๐Ÿ“ Screenshot mode โ€” screenshotFullPage (default on) toggles full-page vs viewport-only screenshots.
  • ๐Ÿ“• PDF text extraction โ€” extractPdfText opens discovered PDF links and extracts real text into text, instead of only listing them as file links.
  • ๐Ÿ“‚ Depth & page limits โ€” maxCrawlDepth, maxCrawlPages, maxResults to keep cost and runtime predictable.
  • โšก Async concurrency โ€” tune maxConcurrency from 1 to 50 parallel requests.
  • ๐Ÿ–ฅ๏ธ Three rendering modes โ€” auto (render only when a page needs it), always, or never for the cheapest possible run.
  • ๐Ÿช„ Smart retry โ€” pages that come back incomplete are automatically retried for a fuller result.
  • ๐Ÿงผ HTML noise removal โ€” strip nav, footer, modals, ads, and cookie banners via CSS selectors before extraction.
  • ๐Ÿ“ Markdown export โ€” token-efficient Markdown alongside plain text, ideal for LLM context windows.
  • ๐Ÿท๏ธ Rich metadata extraction โ€” title, description, canonical URL, Open Graph, Twitter Card, JSON-LD, author, keywords, publish/modified dates, language code.
  • ๐Ÿงฒ Keep-only extraction โ€” keepElementsCssSelector to keep just an article body (article, main) and discard everything else before extraction.
  • ๐Ÿงพ Skipped-URL audit โ€” storeSkippedUrls writes every discovered-but-not-crawled URL (with a reason) to skipped-urls.json.
  • ๐Ÿ“ธ HTML snapshots & full-page screenshots stored in the run's key-value store, surfaced as direct clickable URLs on every row (original HTML, noise-removed HTML, readable HTML, PNG).
  • โฑ๏ธ Politeness controls โ€” rateLimitDelaySecs, retry counts, request timeouts, and dynamic-content waits.
  • ๐ŸŽฏ Wait-for-selector โ€” block extraction until a CSS selector renders (great for React/Vue/Angular SPAs).
  • ๐Ÿ›ก๏ธ Custom HTTP headers โ€” User-Agent, sec-ch-ua, DNT, plus arbitrary cookies and auth headers via JSON.
  • ๐ŸŒ Canonical & fragment handling โ€” dedupe by canonical link or treat #anchors as distinct pages.
  • ๐Ÿ“ฆ Real-time Dataset writes โ€” every page lands in your Dataset the moment it is ready, not at the end of the run.
  • ๐Ÿ”ง Verbose diagnostics โ€” link counts, status codes, content lengths, and snapshot links on every row.

๐Ÿ‘ฅ Who is this Actor for?

This Apify Actor is built for:

  • ๐Ÿค– AI engineers building RAG, retrieval-augmented generation, or LLM grounding pipelines.
  • ๐Ÿง  Data scientists assembling training corpora, fine-tuning datasets, or embedding indexes.
  • ๐Ÿ› ๏ธ Backend developers integrating website-to-database ETL flows or knowledge sync jobs.
  • ๐Ÿ“ˆ SEO professionals auditing titles, meta descriptions, canonical URLs, Open Graph, schema.org markup, and internal linking at scale.
  • ๐Ÿ“š Documentation teams building searchable docs portals or AI-powered help bots.
  • ๐Ÿ›’ Content strategists & competitive analysts monitoring competitor blogs, landing pages, and changelogs.
  • ๐Ÿ”ฌ Researchers collecting public web text data for NLP, classification, or sentiment models.

If you've ever needed to "turn this whole website into a clean JSON file my LLM can read," this Actor is the answer.


๐Ÿค– Built for generative AI, LLMs, and RAG

This Actor is designed from the ground up for AI workflows:

  • RAG pipelines โ€” crawl docs, knowledge bases, FAQs, and blogs into chunkable Markdown.
  • LLM knowledge bases โ€” feed text + metadata into vector stores for grounded chatbot answers.
  • Semantic search engines โ€” index page content with embeddings for relevance-ranked retrieval.
  • Vector database ingestion โ€” drop directly into Pinecone, Qdrant, Weaviate, Chroma, Milvus, or pgvector.
  • Custom GPT knowledge files โ€” export Dataset JSON and upload to ChatGPT custom GPTs, Claude Projects, or Anthropic Files API.
  • AI agent training & grounding โ€” build autonomous agents with up-to-date web context.
  • Content operations โ€” summarization, translation, rewrite-assist, content moderation pipelines.
  • Competitive intelligence โ€” periodic crawls feeding analytics dashboards.

Practical AI use cases

  1. Customer support chatbot grounding โ€” crawl product docs, help center, and FAQ pages; embed text + metadata for retrieval.
  2. Documentation intelligence & semantic search โ€” turn product docs and changelogs into a searchable, embedding-indexed corpus.
  3. SEO and content audit automation โ€” analyze titles, meta descriptions, canonical links, and structured data sitewide.
  4. Custom GPT / Claude Project knowledge files โ€” generate a dataset JSON and upload to your AI assistant of choice.
  5. Internal LLM knowledge base โ€” sync intranet, wiki, or Notion-published content into a private vector store.
  6. Lead enrichment & company intelligence โ€” crawl prospect websites for descriptions, services, and contact pages.
  7. Compliance and content monitoring โ€” track changes to legal pages, terms of service, or pricing pages.

โš™๏ธ What the crawler does

  • Crawls from your seed URLs, follows internal links within domain scope, applies your includeUrlGlobs / excludeUrlGlobs filters, and respects maxCrawlDepth, maxCrawlPages, and maxResults.
  • Handles JavaScript sites according to your renderingMode โ€” auto renders only the pages that need it, always renders everything, never is the fastest and cheapest.
  • Cleans each page with your CSS selectors (nav, footer, cookie banners, modals) before extracting text and Markdown.
  • Writes every row to the Apify Dataset the moment it is ready โ€” url, flat metadata columns, crawl info, metadata, text, markdown, snapshot links, and screenshotUrl. Downstream systems can consume rows while the crawl is still running.
  • Keeps going when a page fails โ€” bad URLs, non-HTML files, blocked pages, and oversized pages are handled per page, never by aborting the run.

๐Ÿงญ Crawling configuration

  • Start URLs are the only required input. Add as many as you like.
  • By default, the crawler stays on the same registrable domain as your seeds โ€” no accidental crawling of facebook.com from your blog's share buttons.
  • includeUrlGlobs โ€” keep only matching paths (e.g., /blog/*, **/blog/**).
  • excludeUrlGlobs โ€” skip paths (e.g., /admin/**, **/login, **/*.pdf).
  • Filters apply to discovered links only โ€” your start URLs are always crawled, so a narrow include pattern can't accidentally produce an empty run.
  • useSitemaps โ€” also seed the queue from robots.txt-advertised sitemaps and /sitemap.xml (following sitemap indexes). Reaches orphan pages that aren't linked from your seeds. Your include/exclude filters still apply.
  • useLlmsTxt โ€” also seed the queue from URLs listed in each start domain's /llms.txt.
  • respectRobotsTxtFile โ€” skip discovered URLs disallowed by the site's robots.txt (your explicit start URLs are always crawled).
  • keepUrlFragments โ€” treat #anchors as distinct URLs (off by default).
  • ignoreCanonicalUrl โ€” disable canonical-based dedup if you want every URL crawled distinctly.
  • maxCrawlDepth โ€” 0 = only seeds; 1 = seeds + their direct links; etc.
  • maxCrawlPages โ€” total unique pages opened (0 = unlimited).
  • maxResults โ€” total successful records saved.

๐Ÿงช Test glob patterns with the DigitalOcean glob tester.


๐Ÿงผ HTML cleaning & content extraction

The Actor produces clean, readable text suitable for AI consumption:

  • keepElementsCssSelector โ€” keep only the elements matching this selector (e.g. article, main) and discard everything else. Applied before the remove list below; empty keeps the whole page.
  • removeElementsCssSelector โ€” comma-separated CSS selectors to strip before extraction (defaults remove nav, footer, scripts, cookie banners, modals, alerts).
  • readableTextCharThreshold โ€” how much text a page must have before it counts as complete.
  • waitForSelector โ€” pause until a key CSS selector appears (perfect for SPAs that mount content lazily).
  • dynamicContentWaitSecs โ€” extra settle time for late-arriving dynamic content.
  • saveMarkdown โ€” include a Markdown version of the page alongside plain text.

The result: token-efficient, noise-free content ready for embedding, indexing, or LLM context.

Rendered-page interaction

These apply only to rendered pages (renderingMode: auto when a page is rendered, or always):

  • maxScrollHeightPixels โ€” auto-scroll down up to this many pixels to trigger lazy-loaded / infinite-scroll content (0 = off).
  • clickElementsCssSelector โ€” best-effort click on matching elements (accordions, "show more", expanders) before extracting; e.g. [aria-expanded="false"].
  • blockMedia โ€” skip downloading images, fonts, and video while rendering for faster, cheaper runs (text and links unaffected).

๐Ÿ“ค Output format (Dataset)

Results land in the default Apify Dataset. You can:

  • Browse rows in the Apify Console with multiple prebuilt views (Quick View, Crawl Details, Metadata, Content, Storage & Debug).
  • Export to JSON, CSV, Excel, XML, HTML, or RSS.
  • Pull data programmatically via the Apify API.
  • Stream into AI, ETL, or analytics pipelines while the run is still active.

Each row includes:

FieldDescription
orderNo1-based order in which the row was saved during the run.
urlThe page's own URL โ€” its canonical URL when one exists (and ignoreCanonicalUrl is off), otherwise the loaded URL.
loadedUrlThe URL actually fetched, after redirects.
referrerUrlThe page that linked to this one (referrerUrl input for start URLs).
depthLink distance from the nearest start URL (0 for seeds).
httpStatusCodeHTTP status of the response.
title, description, canonicalUrl, author, keywords, datePublished, dateModified, languageCodeFlat metadata aliases so Dataset table views and CSV exports work without nesting.
crawlNested loadedUrl, loadedTime, referrerUrl, depth, httpStatusCode.
metadatacanonicalUrl, title, description, author, keywords, datePublished, dateModified, languageCode, openGraph (Open Graph + article + Twitter Card tags), jsonLd, headers.
textClean, readable plain text with paragraph structure preserved.
markdownReal Markdown โ€” headings, links, bold/italic, nested lists, blockquotes, GFM tables, fenced code (when saveMarkdown is on).
htmlCleaned readable HTML inline (when saveHtml is on).
htmlUrlDirect URL to the readable HTML snapshot in the key-value store.
screenshotUrlDirect URL to the full-page PNG (when saveScreenshots is on).
filesNon-HTML links found on the page (PDF, DOCX, XLSX, ZIP, โ€ฆ), or null.
debugPer-row diagnostics โ€” page/file link counts, response content type, snapshot URLs, and content byte lengths.
debugTotalLinks, debugStatusCodeFlat debug aliases for table views.

โ„น๏ธ Rows over Apify's 9 MB item limit are trimmed automatically (html โ†’ markdown โ†’ text) and flagged with debug.truncated: true, so a single huge page never fails the run.

๐Ÿงพ With storeSkippedUrls: true, discovered-but-not-crawled URLs are written to skipped-urls.json in the run's key-value store, each with a reason (off-domain, excluded, not-included, robots-disallow, non-http).


๐Ÿงช Example output (JSON)

Real output from a run against https://docs.apify.com/ (text and Markdown abbreviated):

{
"orderNo": 4,
"url": "https://docs.apify.com/proxy",
"loadedUrl": "https://docs.apify.com/proxy",
"loadedTime": "2026-07-23T14:31:52.015Z",
"referrerUrl": "https://docs.apify.com/academy/scraping-basics-javascript",
"depth": 1,
"httpStatusCode": 200,
"title": "Proxy | Platform | Apify Documentation",
"description": "Learn to anonymously access websites in scraping/automation jobs.",
"canonicalUrl": "https://docs.apify.com/proxy",
"author": null,
"keywords": null,
"datePublished": null,
"dateModified": null,
"languageCode": "en",
"crawl": {
"loadedUrl": "https://docs.apify.com/proxy",
"loadedTime": "2026-07-23T14:31:52.015Z",
"referrerUrl": "https://docs.apify.com/academy/scraping-basics-javascript",
"depth": 1,
"httpStatusCode": 200
},
"metadata": {
"canonicalUrl": "https://docs.apify.com/proxy",
"title": "Proxy | Platform | Apify Documentation",
"description": "Learn to anonymously access websites in scraping/automation jobs.",
"author": null,
"keywords": null,
"datePublished": null,
"dateModified": null,
"languageCode": "en",
"openGraph": [
{ "property": "og:url", "content": "https://docs.apify.com/proxy" },
{ "property": "og:locale", "content": "en" }
],
"jsonLd": null,
"headers": { "content-type": "text/html; charset=utf-8", "โ€ฆ": "โ€ฆ" }
},
"text": "Proxy\n\nApify Proxy lets you rotate IP addresses when scraping to avoid geographic blocking. โ€ฆ",
"markdown": "# Proxy\n\n[Apify Proxy](https://apify.com/proxy) lets you rotate IP addresses when scraping โ€ฆ",
"htmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_readable.html",
"screenshotUrl": null,
"files": null,
"debug": {
"totalLinks": 59,
"pageLinks": 59,
"fileLinks": 0,
"response": { "statusCode": 200, "contentType": "text/html; charset=utf-8" },
"snapshots": {
"originalHtmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_original.html",
"removedElementsHtmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_removed.html",
"readableTextHtmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_readable.html"
},
"lengths": {
"originalHtml": 75279,
"readableHtml": 43168,
"readableText": 10763,
"markdown": 19203
}
}
}

๐Ÿš€ Quick start

Run in Apify Console

  1. Open the Actor in Apify Console.
  2. Paste one or more start URLs (e.g., https://docs.apify.com/).
  3. (Optional) Set maxResults, maxCrawlDepth, maxCrawlPages, and URL filters.
  4. Click Start and watch rows stream into your Dataset.
  5. Export as JSON / CSV or pull via the Apify API.

Run via API

curl -X POST "https://api.apify.com/v2/acts/<your-actor-id>/runs?token=<APIFY_TOKEN>" -H "Content-Type: application/json" -d '{
"startUrls": ["https://docs.apify.com/"],
"maxResults": 25,
"maxCrawlDepth": 2,
"renderingMode": "auto",
"saveMarkdown": true
}'

Then read the rows from the run's dataset:

$curl "https://api.apify.com/v2/actor-runs/<runId>/dataset/items?format=json&token=<APIFY_TOKEN>"

๐Ÿ› ๏ธ Input parameters reference

ParameterTypeDefaultDescription
startUrlsarrayโ€”Required. Seed URLs. Always crawled โ€” URL filters apply to discovered links only.
referrerUrlstring""Value recorded as referrerUrl on rows produced from the start URLs.
blockAdsboolfalseAbort known ad/tracker domains on rendered pages.
mobileViewboolfalseRender with a mobile device profile (viewport, UA, touch) instead of desktop.
redactPiiboolfalseMask emails, phone numbers, card-like numbers, and SSNs in text/markdown (best-effort).
screenshotFullPagebooltrueFull-page vs viewport-only screenshots.
extractPdfTextboolfalseOpen discovered PDF links and extract real text into text instead of only listing them as files.
proxyConfigurationobject{}Apify Proxy (datacenter/residential/country) or your own proxy URLs.
includeUrlGlobsarray[]Keep only discovered URLs matching these globs (/blog/*, /docs/**).
excludeUrlGlobsarray[]Skip discovered URLs matching these globs (/admin/**, **/*.pdf).
useSitemapsboolfalseSeed the queue from robots.txt-advertised sitemaps and /sitemap.xml (follows sitemap indexes).
useLlmsTxtboolfalseSeed the queue from URLs listed in each start domain's /llms.txt.
respectRobotsTxtFileboolfalseSkip discovered URLs disallowed by robots.txt (seeds always crawled).
keepUrlFragmentsboolfalseTreat #anchors as distinct URLs.
ignoreCanonicalUrlboolfalseUse the loaded URL as url instead of the canonical one.
maxCrawlDepthint2Link-following depth from seeds (0 = seeds only).
maxCrawlPagesint0Hard cap on unique pages opened (0 = unlimited).
maxResultsint10Cap on successful saved rows.
maxConcurrencyint10Parallel page workers (1โ€“50).
rateLimitDelaySecsstring0.1Throttle before each fetch; accepts decimals.
maxRequestRetriesint3Total attempts per URL (backoff; honours Retry-After on 429).
requestTimeoutSecsint60Request / navigation timeout.
dynamicContentWaitSecsint3Real settle time in seconds after a rendered page loads.
waitForSelectorstringโ€”Wait for this CSS selector; a missing selector triggers a more thorough retry.
renderingModeenumautoauto (render only when a page needs it) ยท always ยท never (cheapest).
retryFailedWithRenderingbooltrueGive a failed page one more, more thorough attempt.
blockMediaboolfalseSkip images/fonts/video on rendered pages for faster, cheaper runs.
maxScrollHeightPixelsint0Auto-scroll rendered pages up to N pixels for lazy/infinite-scroll content (0 = off).
clickElementsCssSelectorstringโ€”Best-effort click on matching elements (expanders / "load more") before extracting rendered pages.
ignoreHttpsErrorsboolfalseAccept bad certificates (dev/staging only).
keepElementsCssSelectorstringโ€”Keep only elements matching this selector (e.g. article, main); empty keeps the whole page.
removeElementsCssSelectorstring(sensible default)CSS selectors stripped before extraction.
readableTextCharThresholdint100Below this many characters a page counts as "thin" and is retried.
kvDirstringkvStorage prefix for snapshots & screenshots (empty = skip storage writes).
saveScreenshotsboolfalseFull-page PNG per row. Requires rendering every page.
saveMarkdownbooltrueInclude Markdown in each row.
saveHtmlbooltrueInclude cleaned HTML inline; turn off for much smaller rows.
headerAcceptLanguagestringen-US,en;q=0.9Accept-Language header.
customHttpHeadersobject{}Extra HTTP headers (cookies, auth, lang) โ€” these override everything else.
initialCookiesarray[]Cookies sent on every request and loaded into the browser: [{"name":"...","value":"...","domain":"...","path":"/"}].
debugLogbooltrueDrops the run log to DEBUG level.
storeSkippedUrlsboolfalseWrite discovered-but-not-crawled URLs (with reasons) to skipped-urls.json in the key-value store.

Plus browser-identity headers (headerUserAgent, headerSecChUa, headerSecChUaMobile, headerSecChUaPlatform, headerDnt, headerUpgradeInsecureRequests). The defaults give the best success rate on most sites; set a custom headerUserAgent or headerSecChUa and your values are used verbatim instead.


๐Ÿ”Œ Integrations: LangChain, LlamaIndex, OpenAI, Pinecone

This Actor's Dataset output plugs directly into the modern AI stack:

  • ๐Ÿฆœ LangChain โ€” use ApifyDatasetLoader or load JSON into Document objects with text + metadata.
  • ๐Ÿฆ™ LlamaIndex โ€” feed Markdown rows into MarkdownReader or build a VectorStoreIndex.
  • ๐Ÿง  OpenAI Embeddings & Assistants โ€” chunk text / markdown, embed with text-embedding-3, and upload as OpenAI File for Assistants API or Custom GPT knowledge.
  • ๐Ÿค– Anthropic Claude โ€” upload Dataset JSON to Claude Projects, the Files API, or use as RAG context.
  • ๐Ÿ“ Pinecone, Qdrant, Weaviate, Chroma, Milvus, pgvector โ€” embed and upsert with metadata filters.
  • ๐Ÿ“Š n8n, Make.com, Zapier โ€” wire crawl results into automations and notifications.
  • ๐Ÿ“ฆ Snowflake, BigQuery, PostgreSQL, MongoDB, S3 โ€” load Dataset JSON/CSV into your warehouse or lake.
  • ๐Ÿงฐ Apify API & SDKs โ€” orchestrate runs from your own services in any language.

See Apify Publishing & integration docs for platform-level guidance.


๐Ÿ’ธ Pricing & how to control cost

Billable event

This Actor charges one pay-per-event event:

EventWhen it firesWhat you get
row_resultOnce per page record written to the DatasetA complete page row โ€” text, Markdown, metadata, snapshot links

Pages that fail, are skipped (non-HTML, 404, filtered by globs), or are dropped after the maxResults cap are not charged. If the run hits its charging limit (ACTOR_MAX_TOTAL_CHARGE_USD), the crawl stops cleanly and everything collected so far stays in the Dataset.

โš™๏ธ Publishing note: the row_result event must exist in Apify Console โ†’ your Actor โ†’ Publication โ†’ Monetization with the same name. Until pay-per-event is configured, the Actor still runs and saves data โ€” it just logs Ignored attempt to charge for an event.

Compute cost

Cost on Apify also scales with compute units consumed during a run. The biggest drivers are:

  • ๐Ÿ“„ Number of pages crawled (maxResults, maxCrawlPages).
  • ๐Ÿ–ฅ๏ธ Rendering mode โ€” always is far heavier than auto, and auto is heavier than never.
  • ๐Ÿงฎ Concurrency (maxConcurrency) and timeout settings.
  • ๐ŸŒ Page complexity and network conditions.

To control cost, tune:

  • maxResults โ€” hard cap on saved rows.
  • maxCrawlPages โ€” hard cap on URLs opened.
  • maxCrawlDepth โ€” keep crawls shallow when possible.
  • maxConcurrency โ€” balance speed vs. politeness.
  • renderingMode: "never" โ€” the cheapest possible run.
  • blockMedia: true โ€” skip images/fonts/video on rendered pages to cut render time and bandwidth.
  • blockAds: true โ€” skip known ad/tracker requests on rendered pages.
  • screenshotFullPage: false โ€” capture only the viewport instead of the whole scrolled page.
  • retryFailedWithRendering: false โ€” skip the second attempt on pages that fail once.
  • rateLimitDelaySecs โ€” throttle to avoid being rate-limited (which wastes retries).
  • saveScreenshots โ€” leave off unless you need images; enabling it renders every page.
  • saveHtml: false โ€” drops the inline html field for much smaller (and cheaper to store) rows.

๐Ÿ’ก Tip: start with maxResults: 10 for testing, then scale up once your filters and selectors are dialed in.


โ“ Frequently asked questions (FAQ)

What is the best web scraper for AI and LLM training data?

A web scraper for AI / LLM training data must produce clean text or Markdown, preserve metadata, handle JavaScript-rendered pages, and export to a structured format (JSON, JSONL, Parquet). Website Content Crawler does all four โ€” it strips boilerplate HTML, outputs both plain text and Markdown, captures rich metadata, and writes directly to an Apify Dataset that exports as JSON/CSV.

How do I scrape a website for a RAG pipeline?

  1. Run Website Content Crawler with your docs/help/blog URLs as startUrls.
  2. Set saveMarkdown: true and tune removeElementsCssSelector to strip nav/footer.
  3. Export the Dataset as JSON.
  4. Chunk each markdown field, embed with OpenAI / Cohere / Voyage / local models, and upsert to Pinecone/Qdrant/Weaviate.
  5. At query time, retrieve top-K chunks and pass them as LLM context.

Can this Actor scrape JavaScript-heavy single-page applications (SPAs)?

Yes. renderingMode: "auto" already handles pages that need rendering automatically; set renderingMode: "always" when every page must be rendered. Use waitForSelector for content that mounts after the initial load, and dynamicContentWaitSecs for late-arriving content โ€” it is a genuine wait in seconds.

How do I export the crawl results?

Open the run in Apify Console โ†’ Dataset tab โ†’ Export โ†’ choose JSON, CSV, Excel, XML, HTML, or RSS. You can also pull data programmatically via the Apify Dataset API.

Does this Actor respect robots.txt?

Optionally, yes โ€” set respectRobotsTxtFile: true and discovered URLs disallowed by the site's robots.txt are skipped (your explicit start URLs are always crawled). It is off by default. Either way, you remain responsible for compliance with robots.txt, website terms of service, and applicable laws; you can also add excludeUrlGlobs to skip specific paths.

How do I avoid being rate-limited or blocked?

  • Lower maxConcurrency (start at 2โ€“5).
  • Increase rateLimitDelaySecs (e.g., 1.0).
  • Set realistic headerUserAgent and customHttpHeaders (cookies, language).
  • Enable proxyConfiguration, or set renderingMode: "always" for sites with aggressive bot detection.

Can I crawl multiple websites in one run?

Yes โ€” add multiple URLs to startUrls. By default the crawler stays on each seed's own domain, so you'll get multi-domain coverage.

How is this different from the official apify/website-content-crawler?

This Actor keeps the input surface small and the cost predictable: three rendering modes instead of a matrix of engines, Markdown and metadata by default, screenshots and HTML snapshots as direct links, and one billable event you can reason about. The official Apify Actor has a much larger feature surface. Choose this one when you want simpler input, predictable cost, and AI-first defaults; choose the official one when you need its full enterprise feature set.

What output formats are supported?

JSON, JSONL, CSV, Excel, XML, HTML, RSS โ€” all via standard Apify Dataset exports.

Does it support proxies?

Yes โ€” use the proxyConfiguration input to pick Apify Proxy datacenter or residential groups, a country, or your own proxy URLs. Requests are spread across several proxy sessions automatically. If the chosen proxy is unavailable, the run continues instead of failing.

Can I schedule recurring crawls?

Yes โ€” use Apify Schedules to run this Actor hourly, daily, or weekly, and pipe new rows into your warehouse, vector DB, or notification channel.


๐Ÿ› ๏ธ Troubleshooting

SymptomLikely causeFix
No rows savedBad startUrls, over-restrictive filters, target offlineVerify startUrls, relax includeUrlGlobs / excludeUrlGlobs, check site availability
Crawl too slowRendering every page + high retriesLower maxConcurrency, switch renderingMode to auto or never
Missing content / empty textJS-rendered SPA, content behind selectorSet waitForSelector, increase dynamicContentWaitSecs, set renderingMode: "always"
Boilerplate in outputDefault removeElementsCssSelector doesn't cover site's navAdd site-specific selectors (e.g., .sidebar, .related-posts, .ad-slot)
Duplicate rowsCanonical handling off, fragments treated as distinctEnable canonical (default), set keepUrlFragments: false
Cert errors on stagingSelf-signed / expired certSet ignoreHttpsErrors: true (dev only)
Blocked / 403 / 429Bot detection, rate limitEnable proxyConfiguration (residential helps most), increase rateLimitDelaySecs, lower maxConcurrency, try renderingMode: "always"
No screenshots in outputsaveScreenshots off, kvDir empty, or renderingMode: "never"Set saveScreenshots: true, keep a kvDir prefix, and use auto or always
Only the start URL is crawledincludeUrlGlobs doesn't match any discovered link, or maxCrawlDepth: 0Widen the globs (/section/**) and raise maxCrawlDepth
Rows are huge / slow to exporthtml field includedSet saveHtml: false and use htmlUrl instead

๐Ÿ’ฌ Help, support & custom builds

For custom solutions, private integrations, white-label crawlers, or implementation help:

๐Ÿ“ง hello.dataminds@gmail.com

Useful Apify documentation:


Use this Actor only on pages you are allowed to access. Respect:

  • โœ… robots.txt directives,
  • โœ… website terms of service,
  • โœ… rate limits and politeness norms,
  • โœ… data-protection laws (GDPR, CCPA, etc.) in your jurisdiction,
  • โœ… copyright and licensing of extracted content.

You are responsible for compliant data collection, storage, and use. When in doubt, consult a qualified attorney.


๐Ÿ” SEO keywords targeted

This README is intentionally keyword-rich for discovery on Google Search, Apify Store search, and Bing. Primary and secondary terms covered include:

Primary: website content crawler ยท web scraping ยท website crawler ยท content extraction ยท web scraping API ยท Apify Actor ยท website scraper ยท site crawler

Content & format: Markdown extraction ยท plain text extraction ยท metadata extraction ยท structured data extraction ยท HTML cleaner ยท readable text extractor ยท canonical URL extraction ยท Open Graph scraper ยท JSON-LD extraction ยท schema.org scraper

AI & LLM: RAG pipeline ยท retrieval-augmented generation ยท LLM training data scraper ยท vector database ingestion ยท semantic search crawler ยท embedding pipeline ยท custom GPT knowledge file ยท Claude Projects data ยท LangChain data loader ยท LlamaIndex reader ยท AI agent grounding

Capabilities: headless rendering ยท JavaScript rendering scraper ยท SPA scraper ยท React scraper ยท dynamic content scraper ยท concurrent crawler ยท anti-blocking scraper ยท sitemap crawler ยท llms.txt crawler ยท robots.txt compliant crawler ยท infinite scroll scraper

Use cases: documentation scraper ยท blog crawler ยท SEO content audit ยท competitive intelligence crawler ยท website-to-JSON ยท website-to-database ยท website-to-Markdown ยท knowledge base scraper ยท help center crawler ยท changelog scraper

Integrations: Pinecone ingestion ยท Qdrant ingestion ยท Weaviate ยท Chroma ยท pgvector ยท Snowflake ยท BigQuery ยท n8n ยท Make.com ยท Zapier ยท OpenAI Embeddings ยท Anthropic Files API


Reference patterns for structure and section ordering: