
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Extract every URL from a website's XML sitemaps: finds sitemaps via robots.txt and common paths, follows sitemap indexes, reads .xml.gz, text sitemaps and RSS/Atom feeds. Get lastmod, changefreq, priority, image, video and news data, with URL pattern and date filters. No login needed.
Get every URL a website publishes in its sitemaps, in seconds. Paste a domain and the actor finds the sitemaps through robots.txt and the usual locations, follows sitemap indexes to the end, reads gzip and text sitemaps, and falls back to RSS/Atom feeds when a site has no sitemap. One clean row per URL with lastmod, change frequency, priority and image, video and news data. No login, no browser, and a low price per URL.
Sitemap: lines in robots.txt, tries /sitemap.xml, /sitemap_index.xml, /wp-sitemap.xml, /sitemap.xml.gz, /sitemap.txt and more, and follows nested sitemap indexes.lastmod, changefreq, priority, image sitemap entries, video details (title, duration, thumbnail, player URL), Google News data (publication, title, keywords) and hreflang alternates.lastmod dates, and review hreflang alternates./product/, then pass them to a product scraper.https://crawlee.dev or just example.com), or direct sitemap URLs.| Field | What it does |
|---|---|
startUrls | Domains, page URLs, sitemap files (.xml, .xml.gz, .txt) or RSS/Atom feeds |
maxUrls | Total URL limit (default 1,000; 0 = no limit) |
includePatterns / excludePatterns | Text, * wildcards or /regex/ matched against the URL |
lastmodSince / lastmodUntil | YYYY-MM-DD or relative like 7 days, 3 months |
includeUrlsWithoutLastmod | Keep URLs without a lastmod when a date filter is set |
sameDomainOnly | Drop URLs on other domains |
maxUrlsPerSite | Limit per input site (0 = none) |
discoveryMode | standard (robots.txt first) or thorough (also every common, news, video and image sitemap path) |
rssFallback | Use RSS/Atom feeds when a site has no sitemap (default on) |
checkPageStatus | HEAD request per URL for status code and redirect (default off) |
{
"startUrls": [{ "url": "https://crawlee.dev" }, { "url": "https://www.theguardian.com/sitemaps/news.xml" }],
"maxUrls": 5000,
"excludePatterns": ["/tag/", "*.pdf"],
"lastmodSince": "30 days",
"includeUrlsWithoutLastmod": true
}
| Field | Description |
|---|---|
url | Page URL |
lastmod | Last modified (ISO 8601) |
changefreq, priority | As declared in the sitemap |
type | page, image, video, news or feed-item |
sitemapUrl, sitemapType | The sitemap or feed file it came from (sitemap, sitemap-gz, text, rss, atom) |
discoveredVia | input, robots.txt, common-path, sitemap-index, html-link, rss-feed, feed-guess |
site, inputUrl | Which input the row belongs to |
images, imageCount | Image sitemap entries (url, title, caption) |
videos, videoCount | Video sitemap entries (title, description, thumbnailUrl, contentUrl, playerUrl, durationSeconds, publicationDate, tags) |
news | publicationName, language, publicationDate, title, keywords |
alternates | hreflang alternates |
title | From news/video sitemaps and feeds |
status, redirectUrl, lastmodSource | Only with Check page status |
Example rows (shape from a real run, values shortened):
[
{
"url": "https://crawlee.dev/js/docs/quick-start",
"lastmod": null,
"changefreq": "weekly",
"priority": 0.5,
"type": "page",
"sitemapUrl": "https://crawlee.dev/sitemap.xml",
"sitemapType": "sitemap",
"discoveredVia": "robots.txt",
"site": "crawlee.dev",
"inputUrl": "https://crawlee.dev",
"imageCount": 0,
"videoCount": 0,
"images": [],
"videos": [],
"news": null,
"alternates": [],
"title": null
},
{
"url": "https://news.example.com/2026/oct/14/city-council-approves-new-park",
"lastmod": "2026-10-15T01:46:00Z",
"changefreq": "hourly",
"priority": null,
"type": "news",
"sitemapUrl": "https://news.example.com/sitemaps/news.xml",
"sitemapType": "sitemap",
"discoveredVia": "input",
"site": "news.example.com",
"inputUrl": "https://news.example.com/sitemaps/news.xml",
"imageCount": 1,
"videoCount": 0,
"images": [{ "url": "https://img.example.com/park.jpg" }],
"videos": [],
"news": {
"publicationName": "Example News",
"language": "en",
"publicationDate": "2026-10-15T01:45:54Z",
"title": "City council approves new park",
"keywords": ["Local news", "Parks"]
},
"alternates": [],
"title": "City council approves new park"
}
]
You pay $0.30 per 1,000 unique URLs saved ($0.0003 per URL), plus the small platform usage of the run (compute and datacenter proxy traffic, usually well under a cent for a few thousand URLs). Duplicates, filtered URLs and failed sitemaps are never charged.
Example: extracting 1,000 URLs costs about $0.30 in URL fees plus roughly $0.001 of platform usage. Set a maximum total charge on the run and the actor stops cleanly when it is reached.
Is it legal to extract sitemaps? Sitemaps and robots.txt are public files that websites publish so that crawlers can find their pages. Respect each site's terms and use the URLs responsibly.
Do I need a login or my own proxy? No. The default datacenter proxy works for almost every site. Switch to residential only if a site blocks datacenter IPs.
How many URLs can I get? As many as the sitemaps list. Large sitemaps are streamed, so memory stays flat even for hundreds of thousands of URLs. Use Max URLs or Max URLs per site to cap a run.
Why is lastmod empty? Many sitemaps don't include it. Turn on Check page status to fill it from the page's Last-Modified header where the server sends one.
What if a site has no sitemap? The actor tries all common locations, then the site's RSS/Atom feeds. The status message lists sites where nothing was found.
Can I schedule it or use the API? Yes. Schedule a daily run with "Modified since: 1 day" to collect new pages, and read the results through the API or integrations.
lastmod, changefreq and priority are self-reported by the site and may be missing or inaccurate.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayRequiredWebsites or sitemap URLs
Domains, home pages, sitemap files (.xml, .xml.gz, .txt) or RSS/Atom feeds. For a domain or page URL the actor reads robots.txt and the common sitemap locations and follows sitemap indexes to the end. A direct sitemap URL extracts just that sitemap and its children.
maxUrlsintegerOptionaldefault 1000Max URLs
Stop after saving this many unique URLs in total. 0 = no limit (every URL in every sitemap).
includePatternsarrayOptionalInclude URLs matching
Keep only URLs that match at least one pattern. Plain text matches anywhere in the URL (e.g. /blog/), * and ? are wildcards (e.g. https://*/product/*), and /.../ is a regular expression.
excludePatternsarrayOptionalExclude URLs matching
Drop URLs that match any of these patterns (same syntax as above), e.g. /tag/ or *.pdf.
lastmodSincestringOptionalModified since
Keep only URLs whose sitemap lastmod (or news publication date) is on or after this date. Use YYYY-MM-DD or a relative value such as '7 days' or '3 months'. Whole child sitemaps last changed before this date are skipped, which makes incremental runs fast.
lastmodUntilstringOptionalModified until
Keep only URLs modified on or before this date (YYYY-MM-DD or e.g. '30 days').
includeUrlsWithoutLastmodbooleanOptionaldefault falseKeep URLs without lastmod when a date filter is set
Many sitemaps have no lastmod. By default a date filter drops those URLs; turn this on to keep them.
sameDomainOnlybooleanOptionaldefault falseOnly URLs on the same domain
Drop URLs that point to another domain than the input (subdomains of the same domain are kept).
maxUrlsPerSiteintegerOptionaldefault 0Max URLs per site
Limit for each input site when you extract many sites in one run. 0 = no per-site limit.
discoveryModeenumOptionaldefault "standard"Sitemap discovery
Standard: sitemaps listed in robots.txt, or the common locations (/sitemap.xml, /sitemap_index.xml, /wp-sitemap.xml, ...) when robots.txt lists none. Thorough: always also probes the common locations plus news, video and image sitemap paths.
rssFallbackbooleanOptionaldefault trueFall back to RSS/Atom feeds
When a site has no sitemap, extract URLs from its RSS/Atom feeds (linked from the home page or at /feed, /rss.xml, /atom.xml, ...).
checkPageStatusbooleanOptionaldefault falseCheck page status
Send a HEAD request to every URL and add its HTTP status code, redirect target and Last-Modified header (when the sitemap has no lastmod). Great for SEO audits (find 404s and redirects in your sitemap), but slower than listing URLs only.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for almost every sitemap. Switch to residential only if a site blocks datacenter IPs.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| url | string | Page URL from the sitemap () or feed |
| lastmod | string | null | Last modified (ISO 8601) from the sitemap or feed; from the Last-Modified header when page status checks are on and the sitemap has none |
| changefreq | string | null | Declared change frequency (always, hourly, daily, weekly, monthly, yearly, never) |
| priority | number | null | Declared priority 0.0-1.0 |
| type | string | page, image, video, news or feed-item |
| sitemapUrl | string | null | The sitemap or feed file the URL was found in |
| sitemapType | string | null | sitemap, sitemap-gz, text, rss or atom |
| discoveredVia | string | null | How that sitemap was found: input, robots.txt, common-path, sitemap-index, html-link, rss-feed, feed-guess |
| site | string | null | Host of the input site |
| inputUrl | string | null | The input URL this row came from |
| imageCount | number | null | Number of images attached to the URL in an image sitemap |
| videoCount | number | null | Number of videos attached to the URL in a video sitemap |
| images | array | null | Image sitemap entries: url, title, caption, geoLocation, license |
| videos | array | null | Video sitemap entries: title, description, thumbnailUrl, contentUrl, playerUrl, durationSeconds, publicationDate, tags, ... |
| news | object | null | News sitemap data: publicationName, language, publicationDate, title, keywords |
| alternates | array | null | hreflang alternates: hreflang, url |
| title | string | null | Title from a news/video sitemap or feed item |
| status | number | null | HTTP status of the page (only with Check page status) |
| redirectUrl | string | null | Redirect target for 3xx statuses (only with Check page status) |
| lastmodSource | string | null | sitemap or header (only with Check page status) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| URL | One unique URL saved to the dataset. | $0.0003 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/sitemap-extractor').call({
"startUrls": [
{
"url": "https://crawlee.dev"
}
],
"maxUrls": 1000,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/sitemap-extractorPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/sitemap-extractor"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Finds every sitemap of a site and lists its URLs.
Sitemap URLs filtered by path and last-modified date.
Reads a sitemap file directly.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.