Broken Link Checker: Find 404s & Dead Links on Any Website
Pricing
from $0.30 / 1,000 link checkeds
Broken Link Checker: Find 404s & Dead Links on Any Website
Broken link checker and dead link finder: crawls a website, checks every internal and external link, and lists 404s, server errors, dead domains and redirects with the pages that link to them. Follows robots.txt. No browser, no proxy. $0.30 per 1,000 links.
Pricing
from $0.30 / 1,000 link checkeds
Rating
0.0
(0)
Developer
Brasspage
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Broken Link Checker: Find 404s & Dead Links on Any Website
Give it a website. The Actor crawls the site's own pages, checks every link on them, internal and external, and lists the broken ones with the pages that link to them.
- Finds every kind of dead link: 404 and 410 pages, 5xx server errors, domains that no longer exist, timeouts and refused connections.
- Shows where to fix it: up to 5 pages that link to each broken URL, plus the link text.
- Separates real breaks from bot walls: 401, 403, 429 and LinkedIn's 999 are marked
blocked, notbroken, so you do not chase pages that only refuse robots. - Redirects too: turn off Only output broken and blocked links to get every link with its final URL and redirect count.
$0.30 per 1,000 links checked. No browser, no proxy, no API key. External links get one GET that reads only the status and headers, so no page body is downloaded. The Apify free plan gets up to 2,000 links per run.
How to use
- Open the Actor in the Apify Console and go to the Input tab.
- Type a website, like
https://crawlee.dev, into Websites. One per line, up to 20. - Click Start.
- When the run ends, open the Output tab. Download the broken links as CSV, Excel or JSON, or read them through the API.
The prefilled input crawls 5 pages of crawlee.dev and checks the first 100 links, in about a minute. Raise Max pages to crawl per site and clear Max links to check for a full site.
What can you do with it?
- SEO clean-up: broken internal links waste crawl budget and leak link equity. Fix them from the
foundOnlist. - Site migrations and redesigns: run it after a launch to catch old paths that now return 404.
- Monitor a site: schedule a weekly run and get only the new breaks (pair it with the dedup Actor below).
- Agencies and freelancers: check a client's site before a pitch or a handover.
- AI agents: call the Actor as a tool (Apify API or Apify MCP server) to audit a site's links.
Input example
{"startUrls": ["https://crawlee.dev"],"maxPagesPerSite": 200,"checkExternalLinks": true,"onlyBroken": true,"excludeUrlsContaining": ["/tags/", "?replytocom="],"maxLinks": 5000}
Output example
One row per broken or blocked link:
{"url": "https://example.com/old-pricing","result": "broken","status": 404,"error": null,"finalUrl": "https://example.com/old-pricing","redirects": 0,"internal": true,"foundOn": ["https://example.com/", "https://example.com/blog/launch"],"linkText": "See pricing","startUrl": "https://example.com/"}
result is one of broken, blocked, redirected, ok or skipped (a link to a private or local network address, never opened). error holds the network error for dead domains and timeouts, like ENOTFOUND or TIMEOUT. The OUTPUT record holds a summary: pages crawled, links checked, broken, blocked and redirected counts, and notes for each site.
Input fields
| Field | What it does |
|---|---|
startUrls | Websites to check. Each is crawled from this URL, on its own host only (www is the same host). |
maxPagesPerSite | Pages opened and read for links (default 100, up to 5,000). Every link on them is checked. |
checkExternalLinks | Check links to other sites, once each (default on). Other sites are never crawled. |
onlyBroken | Output only broken and blocked links (default on). Off: every checked link. |
excludeUrlsContaining | Do not crawl or check URLs that contain one of these texts. Plain text, not a regex. |
maxLinks | Stop after this many links in total. Crawled pages count as links. |
Pricing
Pay per result: $0.30 per 1,000 links checked, plus a tiny start fee ($0.00005). Each unique URL is checked and charged once per run, even when many pages link to it. A link skipped by robots.txt or by your filters is free. The run stops at your maximum total charge, so a big site never costs more than you set.
The prefilled input checks at most 100 links (crawled pages count), so a one-click run costs about $0.03, plus the start fee.
Polite and safe
- One request at a time per host, at most one a second, and slower if robots.txt asks for a
Crawl-delay(up to 30 seconds; a site asking for more is skipped). A site with 500 internal links takes about 8 minutes. - Follows robots.txt
Disallowrules on the site it crawls. - Only the start site is crawled. A link to another site gets one request, like a person clicking it.
- Private and local network addresses (including cloud metadata addresses) are never opened, on any redirect hop.
- Pages are capped at 5 MB, and the checker runs no page scripts.
FAQ
Why is a link blocked and not broken? A 401, 403, 429 or LinkedIn's 999 answer usually means the site refuses robots, not that the page is gone. Open those links in a browser to be sure.
Am I charged twice when many pages link to the same URL? No. Each unique URL is checked and charged once per run, and foundOn lists up to 5 pages that link to it.
Does it crawl other sites or subdomains? No. It crawls only the start URL's host (www counts as the same host). Links to other sites and subdomains get one request each.
How many links can I check on the Apify free plan? Up to 2,000 links per run. A paid Apify plan has no such cap.
Limits
- Up to 20 websites per run, and up to 5,000 pages crawled per site.
- Up to 2,000 links are read from one page, and up to 5 linking pages are kept per URL.
- Each request times out after 20 seconds and follows up to 5 redirects.
- It reads
<a href>links in the HTML. Links built by JavaScript after the page loads are not seen, and neither are image, script or CSS URLs. - Some sites answer bots with 403 or 429 even when the page works in a browser. Those show as
blocked; open them by hand to be sure. - Subdomains (like
blog.example.comfromexample.com) are checked as links, not crawled. Add them as their own start URL to crawl them.
Related Actors
- Sitemap Extractor: get every URL a site lists in its sitemaps.
- Bulk Lighthouse & PageSpeed Audit: audit the pages you crawled for Core Web Vitals.
- Remove Duplicates & Merge Datasets: with "only new items", get just the breaks found since the last run.
Issues and support
Found a bug or need a feature? Open an issue in this Actor's Issues tab. We check it every day and reply there.