Sitemap Extractor — Get All Website URLs from sitemap.xml avatar

Sitemap Extractor — Get All Website URLs from sitemap.xml

Pricing

from $0.25 / 1,000 url extracteds

Go to Apify Store
Sitemap Extractor — Get All Website URLs from sitemap.xml

Sitemap Extractor — Get All Website URLs from sitemap.xml

Sitemap extractor & sitemap.xml parser: get all URLs of any website. Auto-finds sitemaps via robots.txt, follows nested indexes and .gz, returns lastmod, images, hreflang, news/video data, optional status check. CSV/JSON/Excel or API. $0.50 per 1,000 URLs.

Pricing

from $0.25 / 1,000 url extracteds

Rating

0.0

(0)

Developer

Plumbline Data

Plumbline Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Sitemap URL Extractor & sitemap.xml parser — get every URL of a website

What does Sitemap URL Extractor do?

Sitemap URL Extractor gives you every URL a website publishes in its sitemaps — as a clean table you can download as CSV, Excel or JSON, or pull via API. Enter a homepage like https://example.com and the Actor finds the sitemaps for you: it reads robots.txt, checks the usual locations (/sitemap.xml, /sitemap_index.xml, /wp-sitemap.xml, .gz files…), follows nested sitemap indexes, and returns one row per page with lastmod, changefreq, priority, images, hreflang alternates, Google News and video data.

It's built to just work on messy real-world sitemaps: gzip, plain-text sitemaps, RSS/Atom feeds, broken XML, sitemaps that return an HTML 404 page, rate-limited servers. When something goes wrong you get a clear error row that you are never charged for.

Try it: paste a website into Websites or sitemap URLs and click Start.

Why use this sitemap scraper?

  • 🔎 Auto-discovery — robots.txt Sitemap: lines + common paths; no need to know where the sitemap lives
  • 🪆 Nested sitemap indexes — Shopify, WordPress/Yoast, Next.js, news sites with hundreds of child sitemaps
  • 🗜️ Every format — XML, .xml.gz, sitemap.txt, RSS 2.0 and Atom feeds
  • 🖼️ Extensions — image URLs, hreflang language alternates, Google News title/date, video metadata
  • 🎯 Filters — include/exclude regex, only URLs modified since a date, max URLs per site, path scoping (https://example.com/blog/ → only /blog/ URLs)
  • ✅ Optional status check — HTTP status code, redirects and final URL for each page (robots.txt-aware)
  • 💸 Error rows are free — "no sitemap found", 404s and blocked sitemaps are reported but not charged
  • 🤝 Polite by default — identifies itself, respects robots.txt for probes and checks, slows down automatically on 429/503

Who uses it?

  • SEO specialists — audit indexable pages, find orphaned or redirected URLs, compare sitemaps before/after a migration
  • AI / RAG builders — get a complete URL list to feed into a crawler or Website Content Crawler instead of crawling blind
  • Competitive intelligence — monitor competitors' new product, blog or landing pages daily with Only URLs modified since
  • E-commerce teams — list every product URL of a Shopify/WooCommerce store, with product images
  • Content teams — export a full content inventory with last-modified dates

How to extract all URLs from a website's sitemap

  1. Open the Actor and add one or more websites (or direct sitemap URLs) to Websites or sitemap URLs.
  2. Optional: add Include only URLs matching, e.g. /blog/, or set Only URLs modified since.
  3. Optional: turn on Check HTTP status of each URL for an SEO health check.
  4. Click Start and download your data as CSV, JSON, Excel, or connect it via API, Make, Zapier or Google Sheets.
  5. Schedule it (daily/weekly) in Apify to monitor new pages automatically.

Input example

{
"startUrls": [
{ "url": "https://www.allbirds.com" },
{ "url": "https://wordpress.org/news/" },
{ "url": "https://docs.apify.com/sitemap.xml" }
],
"includeUrlPatterns": ["/products/"],
"lastmodFrom": "2026-09-01",
"maxUrlsPerSite": 0,
"checkStatus": false
}

Output example

{
"url": "https://www.allbirds.com/products/mens-wool-runners",
"site": "https://www.allbirds.com",
"domain": "www.allbirds.com",
"lastmod": "2026-10-06T09:52:08-07:00",
"changefreq": "daily",
"priority": null,
"sourceSitemap": "https://www.allbirds.com/sitemap_products_1.xml?from=1878193471557&to=7369944137808",
"sitemapType": "urlset",
"foundVia": "sitemap-index",
"sitemapDepth": 1,
"images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/Allbirds_WL_RN_SF_PDP_Natural_Grey_LAT.png?v=1751143404"],
"imageCount": 1,
"alternates": [],
"videos": [],
"news": null
}

With status check on, each row also gets statusCode, redirected, finalUrl and robotsAllowed. A per-site summary (sitemaps found/failed, URL count) is saved to the key-value store as SUMMARY.

Error rows look like this (not charged):

{ "site": "https://www.python.org", "isError": true, "error": "NO_SITEMAP_FOUND",
"errorMessage": "No sitemap found in robots.txt or common locations. Try passing the sitemap URL directly." }

How much does it cost to extract sitemap URLs?

This Actor uses pay per result: you pay $0.50 per 1,000 URLs extracted (plus a tiny Apify start fee of $0.00005 per run). Error rows are free. Examples:

JobURLsCost
Small business site300~$0.15
Shopify store (products, collections, blog)2,500~$1.25
News site, last 30 days only (lastmodFrom)5,000~$2.50
Large site, full inventory100,000~$50

Apify's free plan includes monthly credits, so you can try it at no cost. Set Maximum cost per run in the run options and the Actor stops cleanly when it's reached.

Tips

  • Big sites: use Include only URLs matching or Only URLs modified since to get just what you need (and pay less).
  • Sub-sections: enter https://example.com/blog/ to get only blog URLs.
  • Monitoring: schedule a daily run with Only URLs modified since set to yesterday's date via the API, or compare datasets between runs.
  • Feeding a crawler: use the dataset as start URLs for Website Content Crawler or your own scraper.

Use it via API (Python, JavaScript, Make, Zapier, n8n)

Run the Actor and get results in one HTTP call (replace YOUR_TOKEN with your Apify API token):

curl -X POST "https://api.apify.com/v2/acts/plumbline-data~sitemap-url-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://docs.apify.com"}],"maxUrlsPerSite":1000}'

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("plumbline-data/sitemap-url-extractor").call(run_input={"startUrls":[{"url":"https://docs.apify.com"}],"maxUrlsPerSite":1000})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

You can also schedule it (e.g. daily at 7 am) in Apify Console and send results to Google Sheets, Slack, a webhook or your database with built-in integrations.

FAQ

Sitemaps are files website owners publish specifically so that crawlers can discover their pages. This Actor only reads those files (and, if you enable it, sends lightweight HEAD requests to check status codes). It honours robots.txt for probes and status checks and identifies itself with a clear User-Agent. Always make sure your downstream use of the URLs complies with the target site's terms.

The Actor says NO_SITEMAP_FOUND — what now?

Some sites have no sitemap, or keep it at an unusual path. If you know the URL, paste it directly (e.g. https://example.com/sitemaps/main.xml). You are not charged for error rows.

Why did I get HTTP_403 for a sitemap?

Some sites block automated access to their sitemaps. We don't disguise the Actor as a browser to get around blocks — you'll see a free error row instead.

Does it crawl the pages themselves?

No — it reads sitemaps only, which is why it's fast and cheap. Turn on status check for a HEAD request per URL. For page content, chain it with a content crawler.

Can I use it via API, Python or Make/Zapier?

Yes. Every Apify Actor has a REST API, Python/JS clients, webhooks and integrations with Make, Zapier, n8n, Google Sheets, Airbyte and more.

Other Actors by Plumbline Data

Found a sitemap that doesn't parse? Open an issue on the Actor's Issues tab — we aim to fix parser edge cases quickly.