How to find all pages on a website, including hidden and logged-in pages
Updated · 9 min read
To find all pages on a website, check its sitemap first (/sitemap.xml, or the Sitemap: line in /robots.txt), then run a Google search for site:example.com, then crawl the site with a tool such as Screaming Frog or wget --spider. None of these finds pages that are only linked behind a login or only reachable through the app's own UI. For your own logged-in app, you crawl it in your browser session instead. This guide covers each method, what it misses, and how to tell when you have the full list.
Steps
- 1
Open the sitemap
Go to
https://example.com/sitemap.xml. If that 404s, openhttps://example.com/robots.txtand look for aSitemap:line with the real address. A sitemap index lists more sitemaps, so open each one. - 2
Search Google with site:
Search for
site:example.comto see pages Google has indexed. Add a path, such assite:example.com/blog, to narrow it down. The list is a sample, so treat it as a lower bound. - 3
Check Search Console if it's your site
In Google Search Console, open Indexing, then Pages. The Page indexing report shows indexed and not-indexed URLs with the reason for each, and it can be exported.
- 4
Crawl the site
Run a crawler that follows every link from the home page. Screaming Frog's free version crawls up to 500 URLs. On the command line,
wget --spider --recursivedoes the same job for plain HTML sites. - 5
Look up old URLs in the Wayback Machine
Query the Internet Archive's CDX API with
url=example.com/*to list every URL it has captured, including pages that no longer have links pointing to them. - 6
Crawl your own app while logged in
For pages behind a login, crawl from a browser tab where you are already signed in. Netraptor's Crawl this site does this in your own tab and records the API calls each page makes.
How to find all pages on a website: the short list
No single source has every page. Each method below sees a different slice of the site, so you combine them and remove duplicates.
- Sitemap: the pages the site owner wants search engines to find. Fast and complete for content sites, often missing for apps.
- Google
site:search: pages Google has indexed. A sample, never the full count. - Search Console: the exact indexed and not-indexed list. Only for sites you own or have been added to.
- Crawler: every page reachable by following links. Misses pages nothing links to and links that only exist in JavaScript.
- Wayback Machine: URLs the Internet Archive has seen over the years, including deleted ones.
- Logged-in browser crawl: pages and API calls that only exist after you sign in. Only for your own or authorised apps.
This guide is for site owners, developers, SEO and QA teams mapping sites they run or are allowed to test. The same methods work on public sites you don't own, but stick to what's public and respect robots.txt.
Check the sitemap.xml and robots.txt
Most CMSs and site builders publish a sitemap automatically. Try /sitemap.xml first, then /sitemap_index.xml. If neither loads, open /robots.txt. The Sitemap: line there gives the real address, and a site can list several.
A sitemap file holds up to 50,000 URLs and 50 MB uncompressed, according to the sitemaps.org protocol. Bigger sites split their URLs into many files and publish a sitemap index, a <sitemapindex> file whose <loc> entries point at the other sitemaps. Open each child sitemap to get the page URLs.
To pull the URLs out of a sitemap on the command line:
curl -s https://example.com/sitemap.xml \
| grep -oE '<loc>[^<]+' \
| sed 's/<loc>//' > urls.txtA sitemap shows what the owner chose to list. Draft pages, account pages and old pages that were never removed from the server are usually missing, and stale sitemaps can list pages that now 404.
Find all pages on a website with a Google site: search
Type site:example.com into Google to see pages it has indexed for that domain. Add a path to focus on one section, such as site:example.com/docs, or combine it with a word that appears on the pages you want.
It's quick and works on any site, but the count is not the real number of pages. Google's own site: operator documentation says it "doesn't necessarily return all the URLs that are indexed" under the prefix you searched. Pages blocked from indexing, behind a login, or too new to be crawled won't show up at all.
Use the Search Console Page indexing report for your own site
If you own the site, Google Search Console gives a far better list than site:. Open Indexing, then Pages. The Page indexing report charts indexed and not-indexed pages and lists why each group of URLs isn't indexed, such as Not found (404), Excluded by noindex tag, or Crawled - currently not indexed.
Click a reason to see example URLs, then use Export. The example lists are capped at 1,000 rows each, so very large sites still need a crawl or the sitemap to fill the gaps. The not-indexed groups are often where forgotten pages turn up.
How to crawl all pages of a website
A crawler starts at one URL, collects every link on the page, visits each one and repeats until it runs out of new links. The result is every page reachable from the start page, which is usually close to the real site for content sites.
Screaming Frog SEO Spider is the common desktop choice. The free version crawls up to 500 URLs per crawl, and a paid licence removes the limit. Enter the home page, start the crawl and filter the Internal tab to HTML to get the page list, then export it.
For a free command-line crawl, wget can spider a site without saving the pages:
wget --spider --recursive --level=inf --no-verbose \
--output-file=crawl.log https://example.com/
grep -oE 'https?://[^ ]+' crawl.log | sort -u > urls.txtwget follows robots.txt rules when it crawls recursively, and it does not run JavaScript. Both crawlers find links in the HTML the server sends. If the site builds its menus in JavaScript, see how to crawl a JavaScript website.
Find old URLs of a website with the Wayback Machine
The Internet Archive has been capturing pages for decades, and its CDX server API lists every URL it captured for a domain. Ending the URL with /* asks for a prefix match, fl=original returns only the URLs, and collapse=urlkey drops repeat captures of the same URL:
https://web.archive.org/cdx/search/cdx?url=example.com/*&fl=original&collapse=urlkey&filter=statuscode:200This is the best way to find all URLs of a website that existed at some point, such as old campaign pages or a blog section that was removed from the menu. Expect a lot of noise from query strings and assets. Check which URLs still load before you treat them as live pages.
How to find hidden pages on a website
A "hidden" page is usually an orphan page: it exists on the server, but no menu, link or sitemap points to it. Crawlers can't find it because there is no link to follow. What you can do depends on whether the site is yours.
- On your own site, compare lists. URLs in your CMS, your server access logs or your analytics that never show up in a crawl are orphan pages.
- On any site, the Wayback Machine and
site:search often reveal pages that were linked once and later unlinked. robots.txtsometimes names paths the owner asked search engines to skip. That tells you the path exists, but it is not an invitation to open it.
Guessing URLs with a wordlist (directory brute forcing) sends thousands of requests for paths that may not exist. Do it only on your own site or a target you are authorised to test, such as a scoped security engagement. On someone else's site it can break their terms and trip their security monitoring.
Why crawlers miss pages on single-page apps and logged-in apps
Two kinds of sites defeat every method above.
Single-page apps (React, Vue, Angular and similar) often define their routes in JavaScript. A link crawler that reads the server's HTML sees an empty shell with one <div> and a script tag. Routes reached through buttons with click handlers, rather than real <a href> links, never appear as links at all. Sitemaps for these apps tend to cover only the marketing pages.
Logged-in apps hide most of their pages behind a session. A crawler without your cookies gets redirected to the login page on every URL. You can sometimes paste a session cookie into a crawler, but sessions expire, and you still don't see which API calls each screen makes.
If you just need the links on one rendered page, open the Console in Chrome DevTools on that page and run this. It reads the live DOM, so links your app drew with JavaScript are included:
[...new Set([...document.querySelectorAll('a[href]')].map(a => a.href))].join('\n')Chrome may ask you to type allow pasting first. Here is why. For the full scraping side of logged-in sites, see how to scrape a website behind a login.
Crawl your own logged-in app in your browser with Netraptor
Netraptor is a Chrome extension for developers that records the API calls a web app makes. Its crawler runs in your own tab, so it uses the login you already have, and it records what each page calls while it visits. It's built for apps you build, test or are authorised to test.
- Start it from the toolbar popup with Crawl this site, or from the Crawl tab in the Netraptor DevTools panel. The first time, Netraptor asks for access to that site.
- It reads the
<a href>links on the start page after the page has rendered, so links your single-page app drew with JavaScript count. It keeps links on the same origin and drops#fragments, tracking parameters such asutm_andgclid, and file downloads like PDFs and images. - It skips links that look destructive: anything with logout, sign-out, delete, remove, destroy, cancel, unsubscribe or deactivate in the path or query.
- It loads each link in your tab, waits (500 to 10,000 ms per page, set in the Crawl tab) and records the calls. A badge in the page shows progress, and you can stop and resume.
- Form filling is off by default. Turn it on for a domain and confirm, and it submits forms with test data. It never submits forms with password, card or one-time-code fields, or forms that look like checkout or a delete action.
The Crawl tab lists every page it visited with its state (Done or Error), the number of API calls and the number of forms. Click a page to see its requests. The API Map then groups the calls from all pages into endpoints such as /orders/{id}, which you can export to Postman, HAR or curl. More on that in how to find the API endpoints of a web app.
Know the limits. The crawler visits the links found on the page you start from and doesn't follow links from those pages in turn, so start from a section index or pick Under a path prefix to cover one area. Routes that only exist as #/hash URLs or click handlers aren't followed. The Free plan crawls 25 pages per run and tells you how many links it found. Pro ($29.99 one-time) crawls up to 1000 pages per run.
If your coding agent needs the result, here is how to give it the recorded API calls.
Frequently asked questions
- How do I find all pages on a website online?
- Open
example.com/sitemap.xmlin your browser, then search Google forsite:example.com. For a fuller list, run a crawler such as Screaming Frog, which is free up to 500 URLs. Combine the lists and remove duplicates. - How do I find hidden pages on a website?
- Hidden pages are usually orphan pages with no links pointing to them. On your own site, compare your CMS or server logs against a crawl. On any site, the Wayback Machine and
site:search can show pages that used to be linked. Only guess URLs on sites you own or are authorised to test. - How do I find all URLs of a website without a sitemap?
- Crawl it from the home page with Screaming Frog or
wget --spider --recursive, then add the URLs from asite:search and the Wayback Machine CDX API. If it's your site, export the Page indexing report from Google Search Console. - Why doesn't site: show all pages of a website?
- Google says the
site:operator doesn't necessarily return every indexed URL. It also can't show pages Google hasn't indexed, such as new pages, noindex pages and pages behind a login. Use Search Console for an exact list of your own site. - How do I find all pages of a website that needs a login?
- Crawl it from a browser where you're already signed in, so every request carries your session. Netraptor does this in your own Chrome tab and records the API calls each page makes. Do this only on apps you own or are authorised to test.
- Why does my crawler miss pages on a React or single-page app?
- Many single-page apps build their links in JavaScript, and some routes are reached through buttons instead of links. A crawler that reads the server's HTML never sees them. Use a crawler that renders the page, or read links from the live DOM.