Broken Link Checker: Bulk URL Status, Redirects & Source Pages
Pricing
$0.80 / 1,000 url checkeds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 hours ago
Last modified
Categories
Features
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.
What does this broken link checker do?
Pick one of three modes:
- Crawl (default): start at a homepage, follow internal links up to
maxPagesToCrawlpages, 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) andfirstStatusCode(for example 301),redirectCountand the hop-by-hopredirectChainfoundOn: the pages that link to it (up to 20) andfoundOnCount(all of them), plusanchorTextverdict:broken,unreachable,blocked,redirect,okorskipped, and a simpleisBrokentrue/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
- Paste a homepage (for example
https://crawlee.dev). The form is prefilled, so Start works right away. - Choose a mode. For a full site check, keep Crawl and raise
maxPagesToCrawlandmaxUrlsToCheck. - Click Start. Broken links come first in the dataset. Download JSON, CSV or Excel, or grab the
BROKEN_LINKSCSV 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.
| URL | Verdict | Status | Found on | Anchor text |
|---|---|---|---|---|
| https://jobops.app/ | broken | 402 | https://crawlee.dev/blog | JobOps |
| https://www.crawlee.dev/blog/launching-crawlee-python | redirect | 301 → 200 | 1 page | |
| https://sdk.apify.com/docs/guides/getting-started | redirect | 301 → 302 → 200 | 13 pages | |
| https://stackoverflow.com/questions/tagged/crawlee | blocked | 403 | https://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
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array of strings | (required, prefilled) | Crawl: start pages. List: URLs to check. Sitemap: websites or sitemap URLs. Private and internal addresses are refused (free). |
mode | crawl, list, sitemap | crawl | How URLs are found. |
maxPagesToCrawl | integer | 50 | Internal HTML pages opened to collect links (crawl mode). |
maxUrlsToCheck | integer | 1000 | Spend cap: unique URLs checked in the run, crawled pages included. |
checkExternalLinks | boolean | true | Check links to other sites (HEAD first, never crawled). |
includeAssets | boolean | false | Also check images, scripts, stylesheets and icons. |
outputMode | all, problemsOnly | all | problemsOnly stores only non-ok rows (healthy URLs are still checked and charged). |
includePatterns / excludePatterns | arrays | (none) | * globs or /regex/ to limit which links are checked or crawled. |
respectRobotsTxt | boolean | true | Disallowed URLs are not fetched and are reported as skipped (free). |
maxConcurrency | integer 1-30 | 10 | Requests in flight in total. |
maxConcurrencyPerHost | integer 1-5 | 2 | Requests in flight per host, to stay polite to small sites. |
requestTimeoutSecs | integer | 15 | Seconds 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) andtopPagesWithBrokenLinksBROKEN_LINKS: CSV withbroken_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 loopunreachable: timeout or network error.isBrokenis true for bothbrokenandunreachableblocked: 401, 403, 429 or 999. The server refused an automated check; open it in a browser to confirm. Not counted as brokenredirect: works, but only after one or more redirects (worth updating internal links)ok: answered 2xx directlyskipped: robots.txt disallowed, private address or unsafe redirect. Not fetched, freestatusisokwhenever 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
blockedorskipped, not broken. - Crawl mode follows internal links without query strings and skips login, account, cart and admin paths.
foundOnlists up to 20 pages per URL;foundOnCounthas 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.
- SEO Audit Tool: 0-100 SEO score per page, top 5 fixes and a client-ready HTML report. $2 per 1,000 pages, failures free.
- Sitemap URL Extractor: every URL from a site's XML sitemaps. $0.50 per 1,000 URLs.
- Bulk PageSpeed Insights Test: Lighthouse scores and Core Web Vitals for many URLs. $3 per 1,000 audits, failures free.
- Tech Stack Detector: CMS, analytics, CDN and frameworks for many sites. $0.50 per 1,000 sites.
- Bulk Domain Availability Checker: available or taken, from official registry RDAP. $1 per 1,000 domains.
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.