
Website Content Crawler
hipersoft/website-content-crawler
Extract clean, readable content from any list of websites: page title, meta description, headings, main body text, word count and link/image counts. Optional same-domain crawl. Bulk-ready. Great for LLM/RAG ingestion, content audits and research.
Total users
20Monthly users
4Total runs
206Per page scraped
$0.0024Last rebuilt
Oct 26, 2026Overview
Turn any list of websites into clean, structured content. For each page the Actor extracts the title, meta description, headings, main body text (boilerplate stripped), word count, language and link/image counts — over plain HTTP, no browser and no login. Optionally crawl internal links to pull a whole section.
Ideal for LLM/RAG ingestion, content audits, competitive research, and building text datasets from many sites at once.

What you get per page
| Field | Notes |
|---|---|
title, description, lang |
Page title, meta/OG description, <html lang>. |
text |
Readable body text with scripts/nav/header/footer stripped; prefers <main>/<article>. |
wordCount |
Word count over the full extracted text. |
headings |
h1/h2 outline (level + text). |
internalLinkCount, externalLinkCount, imageCount |
Structure signals. |
links |
Arrays of internal/external links (toggle off to slim the output). |
canonicalUrl, domain, depth |
Canonical link, host, and crawl depth. |
Input
{
"urls": ["https://apify.com/blog", "example.com"],
"crawl": true,
"maxPagesPerDomain": 20,
"maxDepth": 2
}
- urls — pages/sites to extract, one per line. (Or use startUrls.)
- crawl — follow same-domain links (BFS). Off = just the given URLs.
- maxPagesPerDomain / maxDepth — crawl limits.
- sameDomainOnly — keep the crawl on the start domain (default on).
- includeLinks — include the internal/external link arrays (counts always included).
- textMaxChars — truncate stored body text (word count uses the full text).
- maxConcurrency / maxItems — parallelism and a global page cap.
- proxyConfiguration — optional; enable for reliable access at scale.
Output (one row per page)

{
"input": "https://apify.com/blog",
"url": "https://apify.com/blog",
"domain": "apify.com",
"depth": 0,
"title": "Apify Blog",
"description": "News and tutorials…",
"lang": "en",
"headings": [{ "level": 1, "text": "Apify Blog" }],
"text": "…clean readable content…",
"wordCount": 812,
"internalLinkCount": 47,
"externalLinkCount": 6,
"imageCount": 12,
"error": null
}
Output schema
| Field | Type | Description |
|---|---|---|
input |
string (URL) | The URL you supplied for this page. |
url |
string (URL) | Final URL of the page after any redirects. |
domain |
string | Host domain of the page. |
depth |
integer | Number of link hops from the start URL. |
error |
string | Error message if the page failed, otherwise null. |
title |
string | Page title. |
description |
string | Meta/OG description of the page. |
lang |
string | Page language from <html lang>. |
canonicalUrl |
string | Canonical URL declared by the page. |
headings |
array | h1/h2 outline as level + text objects. |
text |
string | Clean body text with boilerplate stripped. |
wordCount |
integer | Word count over the full extracted text. |
internalLinkCount |
integer | Number of same-domain links on the page. |
externalLinkCount |
integer | Number of external links on the page. |
imageCount |
integer | Number of images on the page. |
links |
object | Arrays of internal and external link URLs. |
FAQ
Do I need an API key or login? No. The Actor works over plain HTTP with no browser and no login — just paste your list of URLs or domains and run.
How many pages can I get per run?
Control it with maxPagesPerDomain, maxDepth and a global maxItems cap. With crawl on, it follows same-domain links breadth-first, so one run can extract from a whole site section or many sites at once.
Is crawling website content legal? The Actor collects only publicly available page content — the same pages any visitor can open. Public data is generally collectible, but you are responsible for respecting each site's terms and applicable law.
Does it collect emails or contact info? No. It extracts page content — title, description, headings, body text, word count and link/image counts — not contact details. For emails, phones and socials, use the Website Contact Scraper.
What's the output format? One structured JSON row per page with clean, boilerplate-stripped text and metadata — ready for LLM/RAG ingestion, content audits or text datasets. Export as JSON, CSV or Excel.
Can I connect this to other apps and services? The Website Content Crawler can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. It works with Make, Zapier, Slack, Airbyte, GitHub, Google Drive and many more, plus the Apify API, JavaScript/Python clients and MCP. Or use webhooks to trigger an action whenever a run finishes.
Pair content extraction with these web-tool companions:
- Website Contact Scraper — extract emails, phones and social profiles from the same sites.
- Google Maps Scraper — get local business listings by keyword and location.
- Google Maps Email Extractor — turn Maps results into contactable leads with emails and socials.
Notes
Every site is hard-capped in time so one slow page can never stall a bulk run. Only publicly available page content is collected; respect each site's terms.
Input
| Field | Type | Description |
|---|---|---|
urlsURLs | array | Websites/pages to extract content from (e.g. "apify.com", "https://example.com/blog"). One per line. |
startUrlsStart URLs (advanced) | array | Alternative to "URLs": a request list of {"url": "..."} objects. |
crawlCrawl internal links | boolean | When on, follow same-domain links from each start URL (breadth-first) up to the page/depth limits below. When off, only the given URLs are fetched (one row each). Default: false |
maxPagesPerDomainMax pages per domain | integer | When crawling, the maximum pages to fetch per start URL. Default: 1 |
maxDepthMax crawl depth | integer | When crawling, how many link-hops deep to go from the start URL. Default: 1 |
sameDomainOnlyStay on the same domain | boolean | Only follow links on the start URL's domain while crawling. Default: true |
includeLinksInclude link lists | boolean | Include the arrays of internal/external links in each record (counts are always included). Default: true |
textMaxCharsMax text characters | integer | Truncate extracted body text to this many characters (word count is computed on the full text). Default: 40000 |
maxConcurrencyConcurrency | integer | How many sites to process in parallel. Default: 10 |
maxItemsMax pages (total) | integer | Cap total pages across all sites (0 = no cap). Default: 0 |
proxyConfigurationProxy configuration | object | Proxy configuration. Leave the default — it is tuned for reliable results. Default: {"useApifyProxy": false} |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~website-content-crawler/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://apify.com"
]
}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/website-content-crawler").call(run_input={
"urls": [
"https://apify.com"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/website-content-crawler').call({
"urls": [
"https://apify.com"
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Page scraped One web page crawled — title, description, headings, readable text, word count and link/image counts | $0.0024 | $0.0012 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
North Data Scraper
Look up European companies on North Data: legal name, former names, register number, address, founding date, LEI, business purpose, managing directors and officers, and recent register publications. Germany, UK, France, Austria and 20+ countries. Bulk lookups.
2,467 runs · 5 users · $0.004 / companySpyFu Domain Scraper
Bulk SEO and PPC reports for any domain from SpyFu: organic keywords, monthly SEO clicks and value, Google Ads budget, paid keywords, top keywords, competitors, top countries and monthly history. Competitor research for agencies. Export CSV/JSON.
185 runs · 7 users · $0.008 / domain reportTrustpilot Reviews Scraper
Scrape Trustpilot reviews and company ratings by company domain or Trustpilot URL: star rating, title, text, reviewer name & country, verification, date, company reply, plus company TrustScore and total reviews.
146 runs · 4 users · $0.0006 / review scrapedACRA Singapore Company Registry Scraper
Search and export Singapore's full ACRA corporate registry: UEN, entity name, status, incorporation date, address, SSIC industry codes, officers, former names and audit firms. Filter by name, status, entity type or industry. Public open data, no setup.
138 runs · 10 users · $0.01 / company scrapedWayback Machine Scraper
List every Internet Archive (Wayback Machine) snapshot of a URL or whole domain: timestamp, snapshot URL, status code, MIME type and content digest. Filter by date, status and dedupe. For SEO, OSINT and historical research. No setup.
135 runs · 15 users · $0.002 / snapshot scrapedClutch.co Agency Scraper
Scrape B2B agency and service-provider profiles from Clutch.co directories: company name, rating, review count, location, min project size, hourly rate, employees, services and profile link. Great for lead generation and competitor research.
129 runs · 3 users · $0.008 / agency scrapedSend the site and the fields. We build it and you get it first.