AI Web Crawler avatar

AI Web Crawler

Pricing

from $2.00 / 1,000 page crawleds

Go to Apify Store
AI Web Crawler

AI Web Crawler

Web crawler for LLMs and RAG: extract clean, chunked content from any website — title, headings, main content, links, tables and JSON-LD. Outputs token-estimated chunks ready for AI pipelines.

Pricing

from $2.00 / 1,000 page crawleds

Rating

0.0

(0)

Developer

Oaida Adrian

Oaida Adrian

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

9 days ago

Last modified

Share

AI Web Content Crawler — LLM-Ready Text from Any Website

Crawl a website and get back clean, boilerplate-free content already chunked for LLMs — token-estimated segments, heading structure, tables, links, and JSON-LD — one dataset item per page. No API keys, no browser fleet, no post-processing script.

Perfect for:

  • 🤖 RAG pipelines — feed contentChunks (~2,000-char segments with token estimates) straight into your embedder
  • 📚 Knowledge-base ingestion — docs sites, blogs, wikis → vector store, without writing a scraper
  • 🧠 LLM fine-tuning / evaluation corpora — clean mainContent with nav/footer/script noise removed
  • 🕸️ Site mapping — internal/external link graphs and heading outlines per page
  • 🔎 SEO & metadata audits — OpenGraph, Twitter Card, canonical URL, language, JSON-LD

How it works

Give it one or more start URLs. The crawler fetches each page, strips boilerplate (navigation, footers, scripts, ads), extracts the main content, and follows same-site links up to maxPages. Every page becomes one dataset item — ready to consume, no HTML parsing on your side.

The content pipeline is opinionated for LLM consumption:

  1. Boilerplate removal — nav, header, footer, aside, script, style and form elements are dropped.
  2. Main-content selection — the <main> or <article> element is preferred, falling back to <body>.
  3. Structure preservation — headings and tables are extracted separately so hierarchy isn't lost.
  4. ChunkingmainContent is split on paragraph boundaries at roughly 2,000 characters, each chunk carrying an estimated token count (~4 chars/token heuristic).

Input

{
"startUrls": [{ "url": "https://docs.example.com" }],
"maxPages": 25
}
FieldTypeDefaultDescription
startUrlsarrayrequiredPages/sites to crawl
maxPagesinteger5Max pages per start URL (1 = just that page, up to 100)

Output

One item per crawled page:

{
"url": "https://docs.example.com/getting-started",
"metadata": {
"title": "Getting Started — Example Docs",
"description": "Install and configure Example in five minutes.",
"canonicalUrl": "https://docs.example.com/getting-started",
"language": "en",
"ogTitle": "Getting Started",
"ogType": "article"
},
"mainContent": "Getting started with Example. Install the CLI ...",
"contentChunks": [
{ "id": "9f8e2c11ab04d7e3", "text": "Getting started with Example...", "estimatedTokens": 486 }
],
"estimatedTokens": 1874,
"headings": [
{ "level": 1, "text": "Getting Started" },
{ "level": 2, "text": "Installation" }
],
"tables": [],
"internalLinks": ["https://docs.example.com/configuration"],
"externalLinks": ["https://github.com/example/cli"],
"jsonld": [{ "@type": "TechArticle", "headline": "Getting Started" }]
}

contentChunks are split on paragraph boundaries at roughly 2,000 characters with a per-chunk token estimate — sized for embedding models, so most users index them with zero further processing.

Real example — index a docs site into a vector store

Input:

{
"startUrls": [{ "url": "https://docs.example.com" }],
"maxPages": 50
}

Crawl the docs root, follow same-site links to capture up to 50 pages, and every page comes back as a dataset item with mainContent plus pre-split contentChunks. Pipe the chunks into an embedder (OpenAI, Cohere, local sentence-transformers…) and you have a searchable knowledge base — no scraper code, no HTML cleanup.

At $0.002/page, a 50-page docs site costs about $0.10 in event fees — a full 500-page site costs about $1.

Use it from the API

curl -s "https://api.apify.com/v2/acts/darknezz~ai-web-crawler/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"startUrls": [{"url": "https://docs.example.com"}], "maxPages": 10}'

Also available through the Apify SDK (Python/JS), scheduled tasks for recurring re-indexing, Zapier/Make, and MCP-enabled AI agents.

# Python SDK — crawl + dump chunks straight to your pipeline
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
result = client.actor("darknezz~ai-web-crawler").call(
run_input={"startUrls": [{"url": "https://docs.example.com"}], "maxPages": 10})
items = client.dataset(result["defaultDatasetId"]).list_items().items
for page in items:
for chunk in page["contentChunks"]:
embed(chunk["text"]) # your embedding function

Pricing

Pay per event: $0.002 per page crawled, plus Apify's standard compute. Crawling a 500-page docs site costs about $1 in event fees — no subscription.

FAQ

Does it render JavaScript? No — it fetches server-rendered HTML, which keeps it fast and cheap. Docs sites, blogs, wikis, news, and marketing sites work great; pure client-side SPAs may return thin content.

How does it decide what's "main content"? Nav, header, footer, aside, script, style, and form elements are stripped, then the <main> or <article> element is preferred (falling back to <body>) and its paragraphs, list items, quotes, and code blocks are collected. Headings and tables are extracted separately so structure isn't lost.

Can I crawl just one page? Yes — set maxPages to 1.

Does it stay on the site? Yes — only same-host links are followed. External links are still reported in externalLinks for graph building.

What are token estimates based on? A ~4 characters/token heuristic — close enough for chunk budgeting with OpenAI/Anthropic-class tokenizers.

Why are chunks ~2,000 characters? That size fits comfortably inside most embedding model context windows (and even 8k-token contexts) with room for the query and system prompt, so each chunk can be embedded and retrieved directly.

Is it suitable for scheduled re-indexing? Yes — point a Schedule at it and diff on url + estimatedTokens to detect content changes over time.

Limits & reliability

  • Up to 100 pages per start URL per run
  • Same-host crawl boundary prevents runaway link traversal
  • Boilerplate removal is deterministic (tag-based), not ML — consistent, fast, cheap
  • Retries on transient network errors with backoff; failed pages are logged, not fatal