Broken Link Checker: Bulk URL Status, 404 & Redirect Checker avatar

Broken Link Checker: Bulk URL Status, 404 & Redirect Checker

Pricing

from $0.70 / 1,000 url checkeds

Go to Apify Store
Broken Link Checker: Bulk URL Status, 404 & Redirect Checker

Broken Link Checker: Bulk URL Status, 404 & Redirect Checker

Find broken links, 404 errors and redirect chains across a whole website. Check sitemap URLs or URL lists in bulk: HTTP status code, redirect chain, response time and the page each broken link sits on, plus canonical, noindex and soft-404 flags.

Pricing

from $0.70 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Jason

Jason

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Share

Broken Link Checker: Bulk URL Status, 404 & Redirect Checker - sample output

It checks every URL on your website and tells you what's broken, what redirects and what hurts your SEO. Give it page URLs, sitemaps (including sitemap index files and gzipped .xml.gz sitemaps) or just your homepage with crawling turned on, and you get one clean row per URL:

  • HTTP status (200, 301, 404, 500 ...) and a plain-English problem label
  • Full redirect chain: every hop with its status code and Location, plus the final URL and final status
  • Broken links with the page they were found on, the anchor text, and how many pages link to them
  • Response time in milliseconds, content type and size
  • SEO flags on your pages: canonical URL and canonical mismatch, noindex (meta robots and X-Robots-Tag), mixed content (http:// images/scripts on https pages) and soft-404 hints
  • Redirect loops, DNS failures, SSL certificate errors, timeouts are reported, never silently dropped

HTTP only, no browser, so it is fast and cheap: 500 URLs take about 10 seconds.

Why use it?

  • Site migrations: confirm every old URL 301s to the right new page in one hop, and find chains and loops.
  • SEO audits: find 404s, soft 404s, noindex pages that are in your sitemap, and pages whose canonical points elsewhere.
  • Content QA: find dead outbound links in your blog and see exactly which article to fix.
  • Monitoring: schedule a weekly run and get alerted when something breaks.

How much does it cost?

You pay only for URLs actually checked. No platform usage is billed to you.

Apify planPrice per 1,000 URLs checked
Free$0.75
Starter (Bronze)$0.75
Scale (Silver)$0.72
Business (Gold) and up$0.70

Plus $0.00005 per run start. Checking 1,000 URLs costs $0.75. Checking a 10,000-URL sitemap costs $7.50.

Free, never charged: duplicate URLs, input that is not a URL, the sitemap files themselves, sitemaps that fail to load, and URLs found above your Max URLs to check limit or your run's cost cap. The cost cap is respected before checking starts, so you are never charged for more than you allowed.

How to use it

  1. Paste your pages into Start URLs and/or your sitemap into Sitemap URLs.
  2. Leave Check links on pages on to find broken links on those pages. Turn on Crawl internal links to discover more pages from your homepage.
  3. Set Max URLs to check (default 1,000) to control cost.
  4. Click Start and filter the results by isBroken, problem or isRedirect.

Example input

{
"startUrls": ["https://example.com/"],
"sitemapUrls": ["https://example.com/sitemap_index.xml"],
"crawlInternalLinks": true,
"maxCrawlDepth": 2,
"maxPagesToCrawl": 200,
"maxUrls": 5000,
"checkExternalLinks": true
}

Input options

FieldWhat it doesDefault
startUrlsPages to check. Links on them are checked too. URLs that look like sitemaps are read as sitemaps.2 demo URLs
sitemapUrlsXML sitemaps, sitemap indexes (nested), .xml.gz, or plain-text URL listsnone
discoverSitemapsRead robots.txt of each start URL's site for Sitemap: lines (falls back to /sitemap.xml)off
maxUrlsHard cap on URLs checked and charged1,000
checkLinksCheck every link on the start URL pages and crawled pageson
checkExternalLinksAlso check links to other websiteson
crawlInternalLinks / maxCrawlDepth / maxPagesToCrawlDiscover more of your own pages by following internal linksoff / 1 / 100
checkLinksOnSitemapPagesAlso check the links on every sitemap page (multiplies URL count)off
maxConcurrency / maxConcurrencyPerDomainTotal parallel requests / politeness limit per host20 / 4
requestTimeoutSecs, maxRedirects, slowThresholdMsTimeouts, redirect limit, "slow" flag threshold15 s, 10, 3,000 ms
userAgent, proxyConfigurationCustom user agent; optional Apify Proxy for sites that block datacenter IPshonest UA, no proxy

Output

One row per unique URL. Example (a link that redirects twice):

{
"url": "https://crawler-test.com/redirects/redirect_chain_allowed",
"statusCode": 200,
"statusText": "OK",
"finalUrl": "https://crawler-test.com/redirects/redirect_target",
"isOk": true,
"isBroken": false,
"isRedirect": true,
"redirectCount": 2,
"redirectChain": [
{"url": "https://crawler-test.com/redirects/redirect_chain_allowed", "status": 301, "location": "https://crawler-test.com/redirects/redirect_chain_disallowed"},
{"url": "https://crawler-test.com/redirects/redirect_chain_disallowed", "status": 301, "location": "https://crawler-test.com/redirects/redirect_target"}
],
"problem": "redirect_chain",
"problems": ["redirect_chain"],
"responseTimeMs": 62,
"method": "GET",
"urlType": "page",
"source": "startUrl",
"isInternal": true,
"foundOn": null,
"anchorText": null,
"foundOnPages": [],
"timesLinked": 0,
"title": "Redirect Target",
"canonicalUrl": null,
"canonicalMismatch": false,
"noindex": false,
"mixedContentCount": 0,
"softNotFoundHint": null,
"checkedAt": "2026-10-20T17:05:40Z"
}

problem values

ValueMeaningisBroken
ok2xx, no issuesno
redirect / redirect_chain1 hop / 2+ hops before the final pageno
not_found404 or 410yes
client_errorother 4xx (400, 405, ...)yes
server_error5xxyes
blocked401, 403, 429 or 999: the site refused an automated request. Usually fine in a browser; try a proxyno
redirect_loop, too_many_redirects, bad_redirectRedirect problemsyes
dns_error, connection_refused, connection_error, ssl_error, timeoutNo usable responseyes
soft_404_hint200 but the page says "not found", or a deep URL redirects to the homepageno (review)
noindex, canonical_mismatch, mixed_content, slowSEO / performance flagsno

problems lists every flag on the row; problem is the most serious one.

Run summary (OUTPUT record)

Counts per problem, the top broken links (most-linked first, with the pages that link to them), the status of every sitemap file read, skipped input, and how many URLs were left unchecked by your limits.

How it checks

  • Pages (start URLs, sitemap URLs, crawled pages) are fetched with GET so their HTML can be analysed.
  • Links are checked with HEAD first. If the server refuses HEAD or answers with an error, it retries with GET (many servers answer HEAD wrongly), so you don't get false 404s/405s. The method and headFallback fields show what happened.
  • Redirects are followed manually, hop by hop, so the whole chain is recorded and loops are caught.
  • Requests run in parallel, but never more than maxConcurrencyPerDomain at once to one host.
  • robots.txt crawl rules are not applied to checks: this tool is meant for checking your own sites and the links on them.

Limits

  • No JavaScript rendering: links added by JavaScript after page load are not seen. Most sites put their links in the HTML.
  • Some big sites (news, social networks) block datacenter IPs and answer 403. Those rows are labelled blocked, not broken. Turn on the proxy option for them.
  • Soft-404 detection is a hint (wording in the title/heading, or a redirect to the homepage), not a verdict.

Other tools from this developer

FAQ

Does it support sitemap index files and .xml.gz? Yes. Nested indexes are followed, gzipped sitemaps are unpacked, and plain-text URL lists work too. Each sitemap file's status is in the OUTPUT record.

Will it hammer my server? No. The default is at most 4 requests at a time per host (adjustable), with HEAD requests for links.

How do I only get the broken ones? Sort or filter the results table by isBroken or problem, or download only the rows you need in CSV/Excel/JSON. The OUTPUT record also lists the top broken links.

Can I schedule it? Yes, save the input as a task and add a schedule. Compare brokenCount in OUTPUT between runs.