Broken Link Checker: Find 404s & Dead Links on Any Website
Pricing
from $1.70 / 1,000 page crawleds
Broken Link Checker: Find 404s & Dead Links on Any Website
Crawl a website and find every broken link: 404 and 410 pages, dead external links, domains that no longer resolve, timeouts and broken images, each with the page it appears on and its anchor text. Pay per page crawled; link rows are free.
Pricing
from $1.70 / 1,000 page crawleds
Rating
0.0
(0)
Developer
Larkmoor Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Broken Link Checker: Find 404s, Dead Links & Broken Images on Any Website
Point it at a website and it crawls the site, collects every link on every page and checks each one, then gives you a clean list of what is broken: 404 and 410 pages, dead external links, domains that no longer resolve, timeouts, SSL errors, redirect loops and broken images. Every broken link comes with the page it appears on and its anchor text, so you know exactly what to fix and where.
No browser, no login and no setup: it reads the site's public HTML, respects robots.txt and checks each unique URL only once, however many pages link to it. You pay $2 per 1,000 pages crawled. Link rows and link checks are free.
Why check for broken links?
- SEO: broken internal links waste crawl budget and leak link equity; broken outbound links make a page look abandoned.
- User experience: a visitor who hits a 404 from your own menu or blog post is likely to leave.
- Content maintenance: blogs and resource pages rot. Partners rebrand, tools shut down, docs move. A monthly scheduled run catches it.
- Agencies: a link audit is a quick, concrete win to show a new client, with the exact page and anchor text for each fix.
- Migrations: after moving to a new CMS or URL structure, find every internal link that still points to the old paths.
What it checks
- Internal links: every
<a href>that points to the same site. These pages are also crawled (up to your page and depth limits). - External links: links to other websites (on by default, switch off with
checkExternalLinks). - Images: every
<img src>(on by default). - Scripts and stylesheets: optional (
checkScriptsAndCss).
Each URL is requested with HEAD first and with GET when the server answers HEAD with an error (many servers do), following redirects.
Results you get
One row per problem link (or per link checked, if you turn onlyBroken off):
| Field | Meaning |
|---|---|
result | broken, unverified (the server refused automated checks: open it by hand), redirect (optional) or ok |
url | the link that was checked |
status, reason | HTTP status and a plain reason: HTTP 404, domain does not resolve (DNS), timeout after 15s, SSL certificate error, redirect loop |
linkType | internal or external, and link, image, script or stylesheet |
foundOn, anchorText | the first page that links to it and the clickable text (or the image's alt text) |
foundOnCount, allSources | how many crawled pages link to it, and up to 20 of those pages with their anchor text |
redirectsTo | the final URL when the link redirects |
site | the start URL the link belongs to |
Plus one summary row per site (result: "summary") with pages crawled, unique links, links checked, broken and unverified counts, and whether a limit was reached. The "Per-site summary" view shows these rows on their own.
Input
{"startUrls": ["https://www.example.com"],"maxPagesPerSite": 200,"checkExternalLinks": true,"checkImages": true,"onlyBroken": true}
Other options: maxDepth (clicks from the start page), maxLinksPerSite, includeUnverified, reportRedirects, crawlUrlsWithQuery (follow filter and sort URLs, off by default), respectRobotsTxt, timeoutSecs, concurrency and delaySecs to be gentle with small servers.
Example output
A real run on basecamp.com (20 pages):
{"site": "https://basecamp.com/","url": "https://www.apideck.com/connectors/basecamp","result": "broken","status": 404,"reason": "HTTP 404","linkType": "external link","redirectsTo": "https://www.apideck.com/integrations/basecamp","foundOn": "https://basecamp.com/integrations","anchorText": "Apideck Apideck helps developers build native integrations faster through one API.","nofollow": false,"foundOnCount": 1,"allSources": [{"page": "https://basecamp.com/integrations","anchorText": "Apideck Apideck helps developers build native integrations faster through one API."}]}
{"site": "https://basecamp.com/","result": "summary","pagesCrawled": 20,"linksChecked": 462,"linksFound": 462,"broken": 2,"unverified": 7,"seconds": 14.2,"linkLimitReached": false,"pageLimitReached": true}
How much does it cost?
You pay $0.002 per page crawled ($2 per 1,000 pages) plus a one-time $0.001 actor start. Checking the links is included: a page with 150 links costs the same as a page with 5. Higher Apify plans get automatic volume discounts (up to 15% off). Runs need only 256 MB of memory.
- A 50-page small-business site: about $0.10.
- A 500-page blog, checked every month: about $1 per run.
- An agency checking 20 client sites of 300 pages each: about $12.
Set "Max total charge" on the run, or lower maxPagesPerSite, to cap the cost. When your limit is reached, the crawl stops and the links already found are still checked and reported.
FAQ
Why are some links "unverified" instead of broken? Sites like LinkedIn, and many sites behind bot protection, answer automated requests with 401, 402, 403, 429 or 999 even when the page works in a browser. Calling those "broken" would be wrong, so they are listed separately. Turn includeUnverified off to hide them.
Does it run JavaScript? No. It reads the HTML the server sends, which is where links live on almost every site. Links that only appear after JavaScript runs (some single-page apps) are not seen.
Can I check sites I don't own? Yes, at a polite pace. The actor respects robots.txt by default, sends a clear user agent and checks each URL only once. Use delaySecs and a lower concurrency for small servers.
Will it crawl forever on a big site? No. maxPagesPerSite, maxDepth and maxLinksPerSite cap every run, and filter URLs with ?query parameters are not crawled unless you ask.
How do I get alerts? Schedule a weekly or monthly run and connect a webhook, Slack, email or Google Sheets integration. With onlyBroken on, an empty dataset means everything works.
Integrations
Export as CSV, Excel or JSON, call it from the Apify API, schedule it, or connect it to Make, Zapier, n8n, Google Sheets, Slack or a webhook.
Changelog
- 0.1 (Nov 2026): first release: same-site crawl with depth and page limits, internal and external links, images, scripts and CSS, HEAD-then-GET checks, DNS / timeout / SSL / redirect-loop reasons, unverified class for bot-protected sites, per-site summary, pay per page.