Broken Link Checker - Crawl a Website for 404s & Dead Links avatar

Broken Link Checker - Crawl a Website for 404s & Dead Links

Pricing

from $0.40 / 1,000 url checkeds

Go to Apify Store
Broken Link Checker - Crawl a Website for 404s & Dead Links

Broken Link Checker - Crawl a Website for 404s & Dead Links

Find every broken link of a website: 404s, 5xx, dead domains and timeouts, internal and external, with the page to fix. Bot protections are not reported as broken. $0.50 per 1,000 URLs.

Pricing

from $0.40 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Emmanuel Vingadassalon

Emmanuel Vingadassalon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Give it a website, get every broken link on it. The Actor crawls the pages of the site, collects all the links (internal and external) and checks each one: 404s, 410s, 5xx errors, dead domains and timeouts, with the page where the link was found and how many pages link to it.

  • Whole-site crawl. Breadth first from your start page, same host only. Internal links beyond your page limit are still checked.
  • Internal and external links. Links to other websites are checked (not crawled). Turn this off to check internal links only.
  • Clear results. Each URL is ok, broken (404, 410, 5xx, unknown domain, refused connection), blocked (401, 402, 403, 406, 429, 999: usually bot protection, the link may work in a browser) or timeout.
  • Where to fix it. foundOn is the first page that links to the URL, foundOnCount the number of crawled pages that link to it.
  • Polite. Respects robots.txt and its Crawl-delay, at most 2 requests per second per website, no proxy needed. A website that starts blocking the crawler (10 bot-protection answers in a row) is left alone: one free not checked row tells how many of its URLs were not requested.
  • Cheap and capped. $0.50 per 1,000 URLs checked, and a hard limit of URLs per website so a big site never costs more than you decided.

What can I use it for?

  • SEO maintenance: broken links waste crawl budget and hurt user experience. Find them before Google does.
  • Website migrations and redesigns: crawl the new site and catch every link that still points to an old URL.
  • Agency audits: run it on your clients' sites every month (with an Apify schedule) and send them the list of pages to fix.
  • Documentation and blogs: old articles link to pages that disappeared. Find them in one run.

Input

{
"startUrls": ["https://www.iana.org"],
"maxPages": 100,
"maxLinksPerSite": 2000,
"checkExternalLinks": true,
"onlyProblems": false
}
FieldMeaning
startUrlsHome page (or any start page) of each website
maxPagesPages read to find links, per website (default 100)
maxLinksPerSiteHard limit of billed URLs per website: crawled pages + links checked (default 2,000)
checkExternalLinksAlso check links to other websites (default true)
onlyProblemsSave only broken, blocked and timeout rows. Every URL checked is still billed

Output

One row per URL. Examples from a real run on iana.org:

A broken internal link (found on 5 pages, first on /domains):

{
"url": "https://www.iana.org/domains/idn-tables/db",
"result": "broken",
"broken": true,
"status": 404,
"internal": true,
"crawled": false,
"foundOn": "https://www.iana.org/domains",
"foundOnCount": 5,
"finalUrl": "https://www.iana.org/domains/idn-tables/db",
"redirected": false,
"responseTimeMs": 2010,
"contentType": "text/html; charset=utf-8",
"server": "cloudflare",
"error": null,
"checkedAt": "2026-10-14T17:52:26.096Z"
}

A crawled page that works:

{
"url": "https://www.iana.org/about",
"result": "ok",
"broken": false,
"status": 200,
"internal": true,
"crawled": true,
"foundOn": "https://www.iana.org/",
"foundOnCount": 1,
"finalUrl": "https://www.iana.org/about",
"redirected": false,
"responseTimeMs": 250,
"error": null,
"checkedAt": "2026-10-14T17:52:19.826Z"
}

On that run (20 pages, 2,000 URLs): 1,996 ok, 1 broken, 1 blocked (403 from a bot protection) and 2 timeout.

FieldMeaning
resultok, broken, blocked, timeout, or not checked (disallowed by robots.txt, private address, website blocking the crawler: not billed)
brokentrue only when result is broken
crawledtrue for pages the Actor read to find links
internalSame host as the start page (after its redirects, e.g. to www.)
foundOn / foundOnCountFirst page linking to the URL / number of crawled pages linking to it

To get only the broken links, filter the dataset on broken = true, or turn on onlyProblems.

Each run also saves, for free, a SUMMARY (counts per result and the broken links that most pages link to) and an HTML REPORT ready to send to a client: open them from the run's Output tab.

Pricing

$0.0005 per URL checked ($0.50 per 1,000 URLs) plus Apify's small run-start fee. A crawled page counts as one URL, a checked link as one URL. Dead hosts and timeouts are real answers and count as checked. Invalid URLs, private addresses and links disallowed by robots.txt are free. Lower prices on higher Apify plans.

Good to know

  • Speed: about 2 URLs per second per website (politeness limit), external links are checked in parallel. 1,000 internal URLs take about 8 to 9 minutes.
  • JavaScript sites: links are read from the HTML returned by the server. Links added later by JavaScript (some single-page apps) are not seen.
  • Files (PDF, images, archives) are checked with a light request, never downloaded.
  • blocked is not broken: LinkedIn, Instagram, news sites and many shops answer 999, 403, 402, 406 or 429 to robots. These links usually work in a browser.

Use it from AI agents (MCP)

Add broken-link-crawler to the Apify MCP server in your MCP client (Claude, Cursor, VS Code...).

Integrations

Apify API, schedules, webhooks, Make, Zapier, n8n. Export as JSON, CSV, Excel or HTML.

Same developer, same pay-per-result pricing, outputs that chain together:

FAQ

I already have the list of URLs. Use Bulk URL Status Checker: it checks a list without crawling. For the URLs of a sitemap, use Sitemap URL Extractor.

Need the on-page SEO too? Use SEO Audit.

Something wrong or missing? Open an issue on the Issues tab.