.stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-bottom: 16px; } .stat-card { background: var(--bg3); border: 1px solid var(--border); border-radius: 10px; padding: 14px 16px; } .stat-card.ok { background: rgba(63,185,80,0.08); border-color: rgba(63,185,80,0.2); } .stat-card.warn { background: rgba(234,179,8,0.08); border-color: rgba(234,179,8,0.2); } .stat-card.fail { background: rgba(248,81,73,0.08); border-color: rgba(248,81,73,0.25); } .stat-label { font-size: 11px; font-weight: 700; color: var(--muted); text-transform: uppercase; letter-spacing: 0.4px; margin-bottom: 4px; } .stat-value { font-size: 24px; font-weight: 800; color: var(--text); letter-spacing: -0.5px; } .link-table td { font-size: 13px; } .link-table td.url-cell { font-family: 'SF Mono', Menlo, Consolas, monospace; font-size: 12px; word-break: break-all; max-width: 420px; } .link-table td.url-cell .anchor { display: block; font-family: inherit; font-size: 12.5px; color: var(--muted); margin-top: 2px; } .link-table td.status-cell { font-weight: 800; font-family: 'SF Mono', Menlo, Consolas, monospace; text-align: center; } .link-table td.time-cell { color: var(--muted); font-variant-numeric: tabular-nums; text-align: right; } .code-2 { color: var(--green); } .code-3 { color: var(--blue); } .code-4, .code-5, .code-0 { color: var(--red); } .filter-bar { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; } .filter-chip { padding: 5px 12px; border-radius: 999px; font-size: 12px; font-weight: 700; cursor: pointer; border: 1px solid var(--border); background: var(--bg2); color: var(--muted); transition: all 0.15s; } .filter-chip:hover { border-color: var(--purple); color: var(--purple); } .filter-chip.on { background: var(--text); color: #fff; border-color: var(--text); } .options-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 10px; } @media (max-width: 680px) { .options-grid { grid-template-columns: 1fr; } .stat-grid { grid-template-columns: 1fr 1fr; } .link-table td.url-cell { max-width: 200px; } } /* Little toggle */ .switch { position: relative; display: inline-block; width: 38px; height: 22px; vertical-align: middle; margin-right: 8px; } .switch input { opacity: 0; width: 0; height: 0; } .switch .slider { position: absolute; cursor: pointer; inset: 0; background: #d4dae4; border-radius: 999px; transition: 0.2s; } .switch .slider::before { position: absolute; content: ""; height: 16px; width: 16px; left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: 0.2s; } .switch input:checked + .slider { background: linear-gradient(135deg, var(--purple), var(--blue)); } .switch input:checked + .slider::before { transform: translateX(16px); } .switch-label { font-size: 13px; color: var(--text); vertical-align: middle; } Skip to content
RankCause

Broken Link Checker

Paste a page URL. We extract every <a href> on the page, fire concurrent HEAD requests against all of them, and show you exactly which links are dead — with status codes, anchor text, and response time.


Scan a page
We stop after 100 links on a page so the scan stays fast. HTTPS-only. Max concurrency 15.
How this scan differs from basic tools
• Real HTTP codes, not regex guessing. We send concurrent HEAD requests — falling back to GET on 405/501 — against every link. Status 200/301/404/500 comes straight from the origin server.
• Anchor text + link context. Every broken link includes the actual anchor text your visitors clicked, so you can find-and-replace it in your CMS instantly.
• Skips tracking noise. mailto:, tel:, javascript:, fragments, and internal-network URLs are filtered out automatically.
• Sub-6-second scans. A 100-link page typically returns in 3–5 s thanks to parallel fetches.
These tools are free and need no account. They check one page at a time. RankCause itself does the thing they can’t: it watches your pages over time and tests whether a change you made actually moved a ranking.
Start free All free tools