A sitemap, or a sitemap index
Sitemap index files are followed recursively, including nested ones, so one URL covers a whole site.
siteprobe https://example.com/sitemap.xml
Siteprobe is a command-line tool written in Rust. It reads a sitemap.xml or a plain list of URLs, requests every page concurrently, and reports which ones failed and which ones were slow. Results go to the terminal, or to a CSV, JSON, or HTML file.
brew install bartTC/siteprobe/siteprobe
also pipx install siteprobe · cargo install siteprobe · or run it directly with uvx siteprobe
Fig. 1A run against a real sitemap: 303 URLs, 8 concurrent requests, 2.44 s in total.
A sitemap, a text file, or URLs given on the command line. The format is detected automatically, so any source may be a sitemap, a sitemap index, or a plain list.
Sitemap index files are followed recursively, including nested ones, so one URL covers a whole site.
siteprobe https://example.com/sitemap.xml
One URL per line. Blank lines and # comments are ignored, and anything that is not an http(s) URL is skipped with a warning. Load it from a URL, a local file, or stdin.
siteprobe ./urls.txt
curl -s https://example.com/sitemap.xml | siteprobe -
-u can be repeated, and combined with a source. The URLs are merged and deduplicated.
siteprobe -u https://example.com/ -u https://example.com/pricing
Concurrency and rate limits, authentication, redirects, retries, and a threshold for slow responses. Most of these can also be set in a config file.
The number of requests in flight at once. The default is 4.
A cap for the whole run, written as requests per time span: -l 300/5m for 300 requests per 5 minutes, or -l 100/1h. Units are s, m, and h.
A per-request timeout, 10 seconds by default, and an optional number of retries for network errors and 5xx responses.
Basic authentication, or any custom header such as a bearer token or a session cookie. -H can be repeated.
Redirects are only followed when enabled, up to 10 per URL. Basic auth credentials are not forwarded across a redirect.
A threshold in seconds, such as 3 or 0.05. Responses above it are listed in the report, and the run exits with code 3.
Appends a random timestamp to every URL, so that caches are bypassed and the origin answers each request.
Writes every downloaded document to a directory, for inspection or as a static mirror of the site.
Options can be set in .siteprobe.toml in the current directory, or in a file given with --config. Command-line flags take precedence.
Every run prints statistics to the terminal. A report can also be written to a file, or printed as JSON to stdout.
One row per URL: status code, response time in milliseconds, and response size.
The full report, including the source of the URLs and every per-URL result.
A single self-contained HTML file with a sortable table.
Prints the JSON report to stdout and suppresses all other output, for piping into other tools.
Available from Homebrew, PyPI, and crates.io. Each release also ships prebuilt binaries for macOS, Linux, and Windows.
brew install bartTC/siteprobe/siteprobe
uvx siteprobe https://example.com/sitemap.xml
pipx run siteprobe https://example.com/sitemap.xml
pipx install siteprobe
pip install siteprobe
cargo install siteprobe
Binaries and a shell installer for each release are on GitHub Releases. Building from source requires Rust 1.86 or newer.
git clone https://github.com/bartTC/siteprobe.git
cd siteprobe
cargo build --release