Broken Link Checker: Bulk URL Status, Redirects & Source Pages avatar

Broken Link Checker: Bulk URL Status, Redirects & Source Pages

Pricing

$0.80 / 1,000 url checkeds

Go to Apify Store
Broken Link Checker: Bulk URL Status, Redirects & Source Pages

Broken Link Checker: Bulk URL Status, Redirects & Source Pages

Find broken links on any site: crawl, URL list or sitemap. Status codes, redirect chains and the page each link is on. $0.80 per 1,000 URLs, failures free.

Pricing

$0.80 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Hill Country Bots

Hill Country Bots

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 hours ago

Last modified

Features

Limited permissions

Share

Find broken links on any website in one run. This broken link checker crawls a site (or takes a pasted URL list or an XML sitemap), checks every unique link once, and tells you the HTTP status code, the full redirect chain, the pages each link was found on, the anchor text, and a plain verdict: broken, redirect, blocked or ok. Internal links, external links and (optionally) images, scripts and stylesheets. Plain HTTP, no browser, respects robots.txt. $0.80 per 1,000 URLs checked. Invalid inputs, dead-domain lookups, timeouts and robots.txt skips are free.

Pick one of three modes:

  • Crawl (default): start at a homepage, follow internal links up to maxPagesToCrawl pages, and check every link found on those pages: internal, external and optionally assets
  • List: check only the URLs you paste (bulk URL status checker, redirect checker)
  • Sitemap: read the site's XML sitemap (robots.txt discovery, sitemap indexes, gzip) and check every URL it lists, so you catch dead pages your sitemap still advertises

For each unique URL you get:

  • statusCode (final) and firstStatusCode (for example 301), redirectCount and the hop-by-hop redirectChain
  • foundOn: the pages that link to it (up to 20) and foundOnCount (all of them), plus anchorText
  • verdict: broken, unreachable, blocked, redirect, ok or skipped, and a simple isBroken true/false
  • a ready-to-send BROKEN_LINKS CSV with one line per broken link and the page it sits on

Who is it for?

  • SEO agencies and web designers: a client-ready list of dead links and the exact page to fix each one on
  • Site owners and content teams: catch 404s, dead outbound links and redirect chains before Google and visitors do
  • Developers and AI agents: stable JSON through the Apify API or MCP, one row per URL, predictable price

Quick start

  1. Paste a homepage (for example https://crawlee.dev). The form is prefilled, so Start works right away.
  2. Choose a mode. For a full site check, keep Crawl and raise maxPagesToCrawl and maxUrlsToCheck.
  3. Click Start. Broken links come first in the dataset. Download JSON, CSV or Excel, or grab the BROKEN_LINKS CSV from the key-value store.

Sample output

From a real run on November 12, 2026, at 7:58 AM CT (America/Chicago): crawl mode on crawlee.dev, 25 pages crawled, 300 URLs checked in 46 seconds. Result: 1 broken external link, 50 redirects, 3 blocked by the target site (Stack Overflow answers bots with 403), 231 ok, 15 skipped because the target's robots.txt disallows bots.

URLVerdictStatusFound onAnchor text
https://jobops.app/broken402https://crawlee.dev/blogJobOps
https://www.crawlee.dev/blog/launching-crawlee-pythonredirect301 → 2001 page
https://sdk.apify.com/docs/guides/getting-startedredirect301 → 302 → 20013 pages
https://stackoverflow.com/questions/tagged/crawleeblocked403https://crawlee.dev/

Example inputs

Crawl a site and check every link (internal and external):

{
"startUrls": ["https://crawlee.dev"],
"mode": "crawl",
"maxPagesToCrawl": 100,
"maxUrlsToCheck": 2000
}

Check a pasted list of URLs (bulk status and redirect check):

{
"startUrls": ["https://example.com/", "http://github.com/apify", "https://httpbin.org/status/404"],
"mode": "list"
}

Check every URL in a sitemap:

{
"startUrls": ["https://www.sitemaps.org/"],
"mode": "sitemap",
"maxUrlsToCheck": 5000
}

Internal links only, broken images too, problems only in the output:

{
"startUrls": ["https://crawlee.dev"],
"checkExternalLinks": false,
"includeAssets": true,
"outputMode": "problemsOnly",
"maxPagesToCrawl": 200
}

Input

FieldTypeDefaultWhat it does
startUrlsarray of strings(required, prefilled)Crawl: start pages. List: URLs to check. Sitemap: websites or sitemap URLs. Private and internal addresses are refused (free).
modecrawl, list, sitemapcrawlHow URLs are found.
maxPagesToCrawlinteger50Internal HTML pages opened to collect links (crawl mode).
maxUrlsToCheckinteger1000Spend cap: unique URLs checked in the run, crawled pages included.
checkExternalLinksbooleantrueCheck links to other sites (HEAD first, never crawled).
includeAssetsbooleanfalseAlso check images, scripts, stylesheets and icons.
outputModeall, problemsOnlyallproblemsOnly stores only non-ok rows (healthy URLs are still checked and charged).
includePatterns / excludePatternsarrays(none)* globs or /regex/ to limit which links are checked or crawled.
respectRobotsTxtbooleantrueDisallowed URLs are not fetched and are reported as skipped (free).
maxConcurrencyinteger 1-3010Requests in flight in total.
maxConcurrencyPerHostinteger 1-52Requests in flight per host, to stay polite to small sites.
requestTimeoutSecsinteger15Seconds before a URL is marked unreachable.

Output example

{
"url": "https://jobops.app/",
"isBroken": true,
"verdict": "broken",
"statusCode": 402,
"firstStatusCode": 402,
"finalUrl": "https://jobops.app/",
"redirectCount": 0,
"redirectChain": [],
"linkType": "external",
"linkTag": "a",
"foundOn": ["https://crawlee.dev/blog"],
"foundOnCount": 1,
"anchorText": "JobOps",
"contentType": "text/html",
"responseTimeMs": 352,
"checkMethod": "GET",
"status": "ok",
"errorCode": "HTTP_402",
"errorMessage": "HTTP 402",
"checkedAt": "2026-11-12T13:59:08.251Z"
}

The key-value store also gets:

  • RUN_SUMMARY: totals (urlsChecked, broken, redirects, blocked, byStatusCode) and topPagesWithBrokenLinks
  • BROKEN_LINKS: CSV with broken_url, verdict, status_code, error_code, found_on, anchor_text, link_type

Verdicts (for AI agents and integrations)

  • broken: 4xx or 5xx (except the "blocked" codes below), a domain that does not resolve, a refused connection, a TLS error or a redirect loop
  • unreachable: timeout or network error. isBroken is true for both broken and unreachable
  • blocked: 401, 403, 429 or 999. The server refused an automated check; open it in a browser to confirm. Not counted as broken
  • redirect: works, but only after one or more redirects (worth updating internal links)
  • ok: answered 2xx directly
  • skipped: robots.txt disallowed, private address or unsafe redirect. Not fetched, free
  • status is ok whenever an HTTP status came back (that is the billable event, even for a 404). status: "error" rows are free.

Use it from the API, MCP or an AI agent

  • Actor ID: hillcountrybots/broken-link-checker
curl -X POST "https://api.apify.com/v2/acts/hillcountrybots~broken-link-checker/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":["https://crawlee.dev"],"maxPagesToCrawl":20,"outputMode":"problemsOnly"}'
  • MCP (Claude, Cursor, ChatGPT and other MCP clients): add https://mcp.apify.com?tools=hillcountrybots/broken-link-checker.

How much does it cost?

$0.80 per 1,000 URLs checked ($0.0008 per url-checked event, one per unique URL that returned an HTTP status). No start fee. Each URL is charged once per run, however many pages link to it. You pay nothing for:

  • invalid or private start URLs
  • dead domains, timeouts and network errors (no HTTP answer)
  • URLs skipped by robots.txt, filters or the cap
  • the run summary and the broken links CSV

Example: a 100-page site with 1,500 unique links costs about $1.20. Cap spend with maxUrlsToCheck or the run's max charge setting.

Limits

  • Plain HTTP only. Links added by JavaScript after page load are not seen, and pages behind a login are never crawled.
  • Some sites (Stack Overflow, LinkedIn, X) block automated checks. Those come back as blocked or skipped, not broken.
  • Crawl mode follows internal links without query strings and skips login, account, cart and admin paths.
  • foundOn lists up to 20 pages per URL; foundOnCount has the full number.

FAQ

Does it check external links? Yes, by default. External URLs are checked with HEAD (GET if HEAD is refused) and never crawled.

Can I check images and scripts? Turn on includeAssets.

Will it hammer my site? No. Two requests per host at a time by default, robots.txt respected, no browser.

Does it collect personal data? No. It records URLs, status codes and link text only.

How do I fix redirects? Use the Redirect chains view, then update the link on each foundOn page to point at finalUrl.

More tools from Hill Country Bots

See everything we make at hillcountrybots.com.

Support

Spotted a false "broken"? Open an issue on the Issues tab with the run ID and the URL. We reply within 2 business days (US Central time). Built and maintained by Hill Country Bots.