Broken Link Checker - Site Crawler, 404s & Redirects avatar

Broken Link Checker - Site Crawler, 404s & Redirects

Pricing

from $1.40 / 1,000 page crawleds

Go to Apify Store
Broken Link Checker - Site Crawler, 404s & Redirects

Broken Link Checker - Site Crawler, 404s & Redirects

Crawl a whole website and check every link (and optionally image) on every page: broken 404/5xx, dead domains, timeouts and redirects, with the pages they appear on. Charged per page, not per link: a 200-page site costs about $0.40.

Pricing

from $1.40 / 1,000 page crawleds

Rating

0.0

(0)

Developer

Ashish Agarwal

Ashish Agarwal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Broken Link Checker – Site Crawler, 404s & Redirects

Crawl a whole website and check every link on every page (and, if you like, every image): broken pages (404, 410), dead domains, server errors, timeouts and redirects, each with the pages where it appears and its anchor text. Every site gets a summary you can track over time.

Charged per page crawled, not per link. A page with 120 links costs the same as a page with 5, and a link that appears on every page is checked once. A 200-page site costs about $0.40.

What you get

StatusMeaning
broken404/410 or other client error, or the domain no longer resolves
server-error5xx answer
unreachableTimeout, refused connection or protocol error
blockedThe site blocks automated checks (403/429, LinkedIn's 999) even after a retry as a normal browser. Not counted as broken; open it in a browser to confirm
redirectWorks, but redirects (update the link to the final URL)

Each link item has url, statusCode, error, redirectsTo, external, kind (link or image) and foundOn (up to 10 pages with the anchor text). The site summary has pages crawled, links checked and the count for each status.

How it crawls

  • Starts at your URL and follows internal links up to the click depth and page limit you set; stays on the same host (www. included).
  • Respects robots.txt by default. External links are checked, never crawled.
  • Checks each unique link once, with HEAD and a GET fallback for servers that refuse HEAD, plus one retry as a normal browser when a site looks like a bot wall.
  • Skips mailto:, tel: and javascript: links; doesn't crawl into PDFs, images or other files (it still checks them).

Use cases

  • SEO and site maintenance: fix 404s that waste crawl budget and frustrate visitors; update redirected links.
  • Before and after a migration or redesign: crawl the old and new site and compare.
  • Agencies: run it on every client site monthly and send the summary.
  • Documentation and blogs: catch links to pages and domains that died years ago.

Input example

{
"startUrls": ["https://www.sitemaps.org"],
"maxPagesPerSite": 200,
"checkExternalLinks": true,
"checkImages": false
}

Output example

From a real run on 26 Oct 2026: sitemaps.org's FAQ links to a domain that no longer exists.

{
"type": "link",
"site": "https://www.sitemaps.org",
"url": "http://asg.web.cmu.edu/rfc/rfc3986.php",
"statusCode": null,
"status": "broken",
"error": "domain does not resolve (DNS)",
"external": true,
"kind": "link",
"foundOn": [{"page": "https://www.sitemaps.org/faq.html", "text": "...", "kind": "link"}],
"foundOnCount": 1
}

Site summary from the same run (wordpress.org/news/, first 25 pages): 596 links checked, 1 broken (404), 1 unreachable, 6 blocked by bot walls (Slack, LinkedIn and others; not counted as broken) and 12 redirects.

Pricing

Pay per event: $2 per 1,000 pages crawled (less on higher Apify plans), with all links on those pages checked at no extra cost. Set Max pages per site and a maximum spend per run; the actor stops cleanly at either limit.

Tips

  • Large sites: start with Max pages per site 200–500 to see the pattern, then raise it.
  • Small servers: lower Pages in parallel to 1–2.
  • Sites that block data-centre traffic: turn on Proxy.

FAQ

Why is a link "blocked" and not "broken"? Big sites (LinkedIn, Slack, many shops) refuse automated requests even when the page is fine. The actor retries as a normal browser first; if it is still refused, you see it separately so your broken list stays real.

Does it run JavaScript? No. It reads the HTML your server sends, which is what search engines index first. Links injected only by client-side JavaScript are not seen.

Something wrong? Open an issue on the actor's Issues tab and it will be fixed.