Broken Link Checker - 404s, Redirects & Slow Pages Site-Wide
Pricing
$0.70 / 1,000 url checkeds
Broken Link Checker - 404s, Redirects & Slow Pages Site-Wide
Check every URL a website publishes in its sitemaps: 404s, 5xx, timeouts, SSL errors, redirect chains and slow pages. No crawling needed, no proxy. Delta mode shows which problems are new since your last run and which got fixed. Pay per URL checked.
Pricing
$0.70 / 1,000 url checkeds
Rating
0.0
(0)
Developer
Luca Pietrini
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Broken Link Checker — find 404s, redirects and slow pages across a whole website
Paste a website and every URL it publishes in its sitemap gets checked: dead pages (404, 410), server errors (5xx), timeouts, expired SSL certificates, redirect chains and slow responses. No crawling, no proxy, no login — the sitemap already tells us what the site claims to publish, so a 10,000-page site is checked in minutes, not hours.
Or paste your own list of URLs (from a CMS export, a spreadsheet, another Actor) and check exactly those.
Three things set it apart from the other link checkers on Apify Store:
- Sitemap-driven, not crawl-driven. Crawlers miss pages that are not linked and waste time on pages that are. The sitemap is the site owner's own inventory; checking it answers the SEO question that matters: does every URL I submit to Google actually work?
- Delta mode. Turn it on and every run tells you which problems are new since your last run, which are persisting, and which got fixed. Schedule it weekly and the dataset is your change log.
- Full redirect chains. Every hop is recorded (
301 → 302 → 200), so migration mistakes and redirect loops are visible, not hidden behind a final 200.
What you get
By default only problems are reported, so the dataset stays small. One row per URL:
{"url": "https://example.com/old-page","status": 404,"category": "client-error","ok": false,"finalUrl": null,"redirects": 0,"redirectChain": [],"responseMs": 212,"contentType": "text/html","method": "HEAD","error": null,"sitemap": "https://example.com/sitemap-pages.xml","lastmod": "2026-08-30","site": "https://example.com","checkedAt": "2026-09-18T12:00:00+00:00","change": "new"}
category | Meaning |
|---|---|
ok | 2xx within the slow threshold, no redirect |
redirect | Reached a 2xx only through one or more redirects (redirectChain lists every hop). Off by default? No — sitemap URLs should answer directly; turn off Treat redirects as problems if you disagree |
slow | 2xx but slower than Slow page threshold (default 3 s) |
client-error | 4xx — the classic broken link (404, 410, 403…) |
server-error | 5xx |
timeout | No response within the timeout |
connection | DNS failure, refused connection, host unreachable |
ssl | Certificate problem (expired, wrong host, untrusted) |
redirect-loop / too-many-redirects | The chain never ends or exceeds Maximum redirect hops |
change | Delta mode only: new, persisting or fixed |
Switch What to report to All URLs to also get the healthy pages with their status and response time — useful for a full site health export.
A run summary — URLs checked, problems by category, status-code histogram, per-site counts, delta totals, timing — is saved as the SUMMARY record of the run's key-value store.
Input
| Option | Default | What it does |
|---|---|---|
| Websites or sitemap URLs | — | A domain (sitemap discovered via robots.txt and common paths) or a sitemap / sitemap index URL. Nested indexes, .xml.gz and text sitemaps are handled. |
| Or: a list of URLs to check | — | Exact URLs, one per line. Can be combined with sites. |
| What to report | problems only | Or all URLs. |
| Maximum URLs to check | 0 (no limit) | Exact cap across all sites. |
| Check only / Skip URLs matching | — | Case-insensitive regular expressions. |
| Delta mode | off | Flag problems as new / persisting, report fixed URLs. Snapshots live in a named key-value store, one per site. |
| Treat redirects as problems | on | See the redirect category above. |
| Slow page threshold (ms) | 3000 | |
| Parallel checks | 20 | Never more than 8 concurrent requests per host, whatever the total. |
| Use GET instead of HEAD | off | Each URL is probed with HEAD and falls back to GET when the server refuses HEAD (403/405/501). Bodies are never downloaded either way. |
How the check works
- Sitemaps are discovered and parsed as a stream: checks start while the sitemap files are still downloading, and memory stays flat on huge sites.
- Each URL gets a HEAD request. Servers that reject HEAD get a streamed GET that is closed as soon as the headers arrive.
- Redirects are followed by hand, one hop at a time, so the chain is recorded exactly.
- Transient failures (timeouts, 429, 5xx) are retried once with back-off before being reported.
- Requests are limited to 8 in flight per host — polite by construction, fast across many hosts.
Delta mode: new, persisting, fixed
The problem URLs of each site are remembered between runs. Next run:
- a problem not seen before →
new - a problem seen last time too →
persisting - a URL that was a problem last time and is healthy now →
fixed(reported even in problems only mode, because that is exactly what you want to know)
A run cut short by Maximum URLs or by your maximum charge does not overwrite the snapshot, so a partial check can never make the next run report hundreds of false fixed URLs.
Pricing
Pay per event: one event per URL checked. Reporting problems only or all URLs costs the same — the work is the same. Set Maximum URLs or a maximum charge on the run to cap the cost on very large sites; the Actor stops cleanly when the budget is reached and keeps everything already found.
Use cases
- SEO hygiene — everything you submit to Google in your sitemap answers 200, directly. Find the 404s and redirect chains that waste crawl budget.
- Site migrations — run before and after; the
fixedandnewflags tell you exactly what the migration broke or repaired. - Weekly monitoring — schedule it and pipe the dataset to Slack, email or a sheet through Apify integrations.
- Link lists — check the thousands of external links in your CMS or knowledge base from an exported list.
- AI agents — deterministic JSON, exact caps, no proxies, no login: safe to call programmatically and pay per event.
Run it from code
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("bruco3/broken-link-checker").call(run_input={"startUrls": [{"url": "https://example.com"}],"deltaMode": True,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["category"], row["status"], row["url"], row.get("change"))
FAQ
Why does it flag redirects? A URL in a sitemap is a promise: "this page lives here". If it answers with a redirect, search engines follow it but count it against you, and the sitemap is stale. Turn Treat redirects as problems off if you only care about hard failures.
Does it download the pages? No. HEAD requests, or GET requests closed after the headers. Bandwidth is negligible and servers barely notice.
HEAD says 404 but the page works in my browser. Some servers answer HEAD incorrectly. Turn on Use GET instead of HEAD and the check uses GET for every URL.
Can it crawl a site without a sitemap? No, by design. That is a different tool with different costs and a different failure mode. Pair this Actor with a crawler if you need link discovery.
Is it legal? It requests only pages the site publishes for the public, identifies itself with a clear User-Agent, never downloads bodies, and never exceeds 8 concurrent requests per host.
Related
- Sitemap URL Extractor — the URL list behind this checker, with added/removed pages between runs.
Feedback
A site this Actor cannot check, or a field you are missing? Open an issue on the Issues tab. If it saved you time, a review helps others find it.
Changelog
- 0.1 — initial release: sitemap-driven and list-driven checks, HEAD with GET fallback, full redirect chains, slow/SSL/timeout detection, delta mode with
new/persisting/fixed, exact caps, pay per URL checked.