Link Quality Analyzer — Deep link health & quality scoring
Pricing
from $0.02 / actor start
Link Quality Analyzer — Deep link health & quality scoring
Protect your SEO by detecting broken links, redirect chains, and low-quality outbound links. Scans any webpage to analyze every external link — HTTP status, response time, SSL validity, content type. Each link gets a quality score (0-100) with full diagnostics. Batch scan up to 10 pages.
Pricing
from $0.02 / actor start
Rating
0.0
(0)
Developer
Perry AY
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Link Quality Analyzer 🔗
Detect broken links, redirect chains, and low-quality outbound links with automated scoring
Every broken link on your website damages credibility, wastes link equity, and frustrates visitors. Manually checking each outbound link across multiple pages is impractical — especially for content-heavy sites with hundreds of external references. Link Quality Analyzer automates the tedious work of crawling any webpage, extracting every external link, and giving each one a 0–100 quality score based on HTTP status, response time, redirect depth, and SSL certificate validity.
Supports batch scanning up to 10 pages in a single run, deep SSL inspection for HTTPS links, and multiple output formats for easy integration into your SEO toolchain, content management workflow, or monitoring pipeline.
✨ Features
-
Automatic link extraction — Parses every
<a href>tag from a webpage, filters out internal links, anchor-only links, and non-HTTP protocols (mailto, javascript, tel) automatically -
HTTP status validation — Checks each link with full redirect following; detects 4xx client errors, 5xx server errors, and suspicious HTTP response patterns
-
Redirect chain tracing — Records the full redirect path so you can identify unnecessary hops, broken intermediates, or redirect loops that harm user experience and SEO
-
Response timing — Measures load time per link in milliseconds; flags links slower than 2-second and 5-second thresholds for performance review
-
SSL deep check — Premium mode that connects to each HTTPS link's origin server, validates the TLS certificate, extracts subject/issuer/SANs, and deducts score points for certificate issues
-
Quality scoring algorithm — Composite 0–100 score per link: starts at 100 with deductions for broken status codes (−60 to −80), redirects (−5 per hop), slow response (−5 to −30), and SSL problems (−20)
-
Batch mode — Scan up to 10 pages in a single run; each page's links analyzed independently with per-page configuration support
-
Multiple output formats — Choose
jsonfor programmatic use and API integration,csvfor spreadsheet analysis or dashboard import, orplainfor quick visual inspection -
Comprehensive summaries — Every run appends a summary row with total pages scanned, total links found, broken link count, average quality score, and number of SSL deep checks performed
🚀 Quick Start
Single URL — Basic Check
{"url": "https://example.com","mode": "basic"}
Response example (basic — healthy link):
{"source_url": "https://example.com","link_url": "https://partner-site.com/resource","status_code": 200,"quality_score": 100,"redirect_chain": "","load_time_ms": 234.5,"anchor_text": "Learn more about our partner","error": ""}
Response example (basic — broken link):
{"source_url": "https://example.com","link_url": "https://old-partner.com/page","status_code": 404,"quality_score": 30,"redirect_chain": "","load_time_ms": 156.2,"anchor_text": "Old partner reference","error": ""}
Single URL — With SSL Deep Inspection
{"url": "https://example.com","mode": "ssl-deep"}
Response example (ssl-deep mode):
{"source_url": "https://example.com","link_url": "https://secure-partner.com","status_code": 200,"quality_score": 80,"redirect_chain": "http://secure-partner.com → https://secure-partner.com","load_time_ms": 567.1,"anchor_text": "Secure partner portal","ssl_info": {"has_ssl": true,"ssl_valid": true,"subject": {"CN": "secure-partner.com", "O": "Partner Corp"},"issuer": {"CN": "R3", "O": "Let's Encrypt"},"ssl_error": ""},"error": ""}
Batch Mode — Multiple Pages
{"batchMode": true,"batchData": [{ "url": "https://site1.com", "mode": "basic" },{ "url": "https://site2.com", "mode": "ssl-deep" }]}
📋 Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
url | string | "" | The webpage URL to scan for external links. Must start with http:// or https://. |
mode | string | "basic" | Analysis mode: basic (HTTP status + timing) or ssl-deep (adds TLS certificate validation via premium charge event) |
outputFormat | string | "json" | Output format: json for structured results, plain for human-readable text, or csv for spreadsheet import |
batchMode | boolean | false | Enable batch processing for scanning multiple pages in a single run |
batchData | array | [] | Array of per-page input objects, each with its own url and mode. Maximum 10 entries. |
📤 Output Format
Each analyzed link produces one result row:
| Field | Type | Description |
|---|---|---|
source_url | string | The page URL from which the link was extracted |
link_url | string | The full external link URL that was checked |
status_code | integer | HTTP status code returned (e.g., 200, 301, 404, 500). 0 if the link could not be reached. |
quality_score | integer | Composite quality score 0–100 based on status, redirects, timing, and SSL |
redirect_chain | string | Full redirect path joined with arrow symbols (e.g., http:// → https:// → https://final). Empty for direct links. |
load_time_ms | number | Response time in milliseconds, measured from request start to final response |
anchor_text | string | Visible anchor text of the link (first 200 characters). Empty for image-only links. |
ssl_info | object | Present only in ssl-deep mode. Contains has_ssl, ssl_valid, subject, issuer, and ssl_error. |
error | string | Error description if the link could not be reached, timed out, or failed to resolve. Empty on success. |
SSL Info Object (ssl-deep mode only)
| Field | Type | Description |
|---|---|---|
has_ssl | boolean | Whether the server presented a TLS certificate |
ssl_valid | boolean | Whether the certificate passed standard validation |
subject | object | Certificate subject fields (CN, O, C, etc.) |
issuer | object | Certificate issuer fields (CN, O, C, etc.) |
ssl_error | string | Error description if SSL validation failed |
Summary Row
A _summary row is appended at the end with aggregate statistics:
| Field | Type | Description |
|---|---|---|
_summary | boolean | Always true for the summary row |
total_pages_scanned | integer | Number of source pages that were processed |
total_links | integer | Total number of external links found and checked |
broken_links | integer | Number of links with HTTP 4xx/5xx status or connection errors |
average_quality_score | number | Mean quality score across all checked links (0–100) |
ssl_deep_checks_performed | integer | Number of pages analyzed in ssl-deep mode |
mode | string | Analysis mode used for the run |
⚙️ Technical Details
Link Extraction Algorithm
The extraction process works in five steps:
- Page fetch: The source page URL is fetched using async HTTP (httpx) with automatic redirect following and a 15-second timeout. A custom User-Agent header ensures broad compatibility.
- HTML parsing: The response HTML is parsed with BeautifulSoup's HTML parser. Every
<a>tag with anhrefattribute is enumerated. - URL resolution: Relative URLs are resolved to absolute URLs using
urllib.parse.urljoin(base_url, href). - Filtering: The algorithm filters out:
- Same-domain links (the source page's domain is excluded)
- Non-HTTP protocols (
mailto:,javascript:,tel:,ftp:,file:) - Anchor-only links (
#section,#top) - Duplicate URLs (each unique URL is checked once per page)
- Collection: Remaining links are collected with their anchor text (first 200 characters) for subsequent quality checking.
Quality Scoring Algorithm
The 0–100 quality score starts at 100 and applies these deductions:
| Condition | Deduction | Example |
|---|---|---|
| HTTP 200 OK | 0 (perfect) | Link is healthy |
| HTTP 301/302 redirect | −10 | Permanently or temporarily moved |
| HTTP 403 Forbidden | −40 | Access denied |
| HTTP 404 Not Found | −60 | Page removed without redirect |
| HTTP 410 Gone | −50 | Resource intentionally deleted |
| Other 4xx error | −50 | 429 Rate Limited, etc. |
| HTTP 5xx error | −80 | Internal server error, bad gateway |
| Each redirect hop | −5 per hop | Multiple hops waste link equity |
| Response > 1000 ms | −5 | Noticeable delay |
| Response > 2000 ms | −15 | Slow user experience |
| Response > 5000 ms | −30 | Severely degraded |
| SSL certificate error | −20 | TLS validation failed |
| Connection error | −100 (score = 0) | DNS failure, timeout, refused |
The final score is clamped to max(0, min(100, score)).
SSL Deep Check
In ssl-deep mode, each HTTPS link undergoes additional TLS validation:
- The hostname is extracted from the link URL using
urllib.parse - A TLS socket connection is established to port 443 with a 10-second timeout
- The server certificate is retrieved via
getpeercert()and parsed for subject, issuer, and validity - Certificate validity is confirmed through Python's default SSL context verification
- If any SSL error occurs, the link's quality score is reduced by an additional −20 points
Error Handling
- Individual link failures are captured per-result and do not block checking of remaining links
- If the source page itself is unreachable, a single error row is returned for that page
- Batch processing isolates failures per page — one unreachable page does not affect others
- The summary row reports
broken_linkscount for at-a-glance health assessment
Performance Considerations
- Each link is checked sequentially with a 15-second timeout
- An average page with 30–50 external links completes in 30–90 seconds
- SSL deep mode adds approximately 1–2 seconds per HTTPS link due to TLS handshake overhead
- Pages with very large numbers of links (100+) may take several minutes to complete
- Batch mode processes pages sequentially; total time scales linearly with batch size
Interpreting Quality Scores
The quality score is a composite metric designed to give you immediate actionable insight:
| Score Range | Meaning | Recommended Action |
|---|---|---|
| 80–100 | Healthy link | No action needed |
| 50–79 | Minor issues | Review redirects and timing |
| 20–49 | Significant problems | Investigate status codes, SSL, or slow responses |
| 0–19 | Critical | Fix or remove the link immediately |
Scores below 50 generally warrant attention. A single 404 (score 30–40) or SSL error (score 0–20) on an important outbound link can harm user trust and SEO rankings.
Scheduling Regular Audits
For ongoing link health monitoring, schedule the actor to run weekly or monthly via Apify scheduler. Comparing summary statistics across runs helps identify:
- Link rot trends — Is the number of broken links increasing over time?
- Redirect creep — Are more links accumulating redirect hops as sites restructure?
- SSL degradation — Are more HTTPS links failing certificate validation?
🎯 Use Cases
-
SEO audits — Identify and fix broken outbound links before they harm search rankings, degrade user experience, and waste link equity across your entire domain
-
Content quality assurance — Ensure all referenced sources, citations, affiliate links, and partner references remain valid and reachable across your entire content library
-
Site migration validation — Verify that all external links are preserved, correctly redirected, and functional after domain migration, CMS change, or URL structure overhaul
-
Competitor link profiling — Analyze competitor outbound link profiles and redirect patterns to inform your own linking strategy and identify broken opportunities
-
Affiliate link monitoring — Automatically check that all affiliate links return 200 status and lead to the correct destination, preventing revenue loss from broken affiliate paths
-
Documentation maintenance — Keep technical documentation links current by regularly scanning for broken external references in API docs, guides, and tutorials
-
Client reporting — Generate per-page link quality reports (via CSV output) for client-facing SEO audits and content quality reviews
❓ FAQ & Troubleshooting
Q: What counts as an external link?
A: Any <a href> tag pointing to a different domain than the source URL. Same-domain links, anchor-only links (#section), and non-HTTP protocols are excluded.
Q: Why is a link showing status code 0?
A: Status code 0 means the link was completely unreachable — DNS resolution failed, connection was refused, or the request timed out. The error field provides details.
Q: How long does a scan take?
A: Total time depends on the number of links found and their responsiveness. Each link has a 15-second timeout. An average page with 30–50 links typically completes in 30–90 seconds in basic mode.
Q: What is the difference between basic and ssl-deep mode?
A: basic mode checks HTTP status, response time, and redirect chains. ssl-deep mode adds TLS certificate validation (subject, issuer, validity) for every HTTPS link, with an additional −20 point score deduction for SSL errors. SSL deep check is a premium feature.
Q: Can I scan internal/relative links too? A: Currently, the actor focuses on external outbound links. Internal links on the same domain are excluded by design, as they typically require a different crawling strategy.
Q: What happens if the source page itself is unreachable? A: The actor returns a single error row for that page with the failure description and continues processing any remaining pages in the batch. The page's links are not analyzed.
Q: How are redirects counted in the score? A: Each redirect hop costs 5 points from the quality score. A link that goes through 3 redirects (301 → 302 → 200) loses 15 points just from redirects, plus any status code deduction from intermediate responses.
Q: Can I use this for regular monitoring? A: Yes. Schedule the actor via Apify scheduler to run weekly or monthly link quality audits. The consistent scoring algorithm lets you track link health trends over time.
Q: Why are some HTTPS links showing SSL errors?
A: SSL errors can occur if the server uses a self-signed certificate, an expired certificate, a hostname mismatch, or an untrusted CA. The ssl_info.ssl_error field describes the specific issue.
Q: Does the actor follow redirects on the target links?
A: Yes. The HTTP client is configured with follow_redirects=True, so all redirects are followed automatically. The full redirect chain is recorded in the redirect_chain field.
Q: Can I exclude certain domains from the scan? A: Currently, the actor does not support domain exclusion filters. All external links on the page are analyzed. To skip specific domains, you would need to filter results after the run.
Q: How are anchor-less links handled?
A: Links without visible anchor text (e.g., image-only links where the <a> wraps an <img>) return an empty anchor_text field. The link URL is still checked and scored normally.
Q: What HTTP status codes are considered "broken"? A: All 4xx (client errors) and 5xx (server errors) are considered broken. This includes 403 Forbidden, 404 Not Found, 410 Gone, 429 Rate Limited, 500 Internal Server Error, 502 Bad Gateway, and 503 Service Unavailable.
Q: Can the actor handle relative URLs?
A: Yes. Relative URLs are automatically resolved to absolute URLs using urllib.parse.urljoin with the source page URL as the base. Only absolute URLs are checked.
🔗 Related Tools
Check out other developer utilities by perryay:
| Tool | Description |
|---|---|
| JSON Studio | Format, validate, transform, and diff JSON data with 8 operation modes |
| QR Craft | Generate high-quality QR codes in PNG or SVG, batch up to 50 |
| UUID Lab | Generate UUID v4/v7, NanoID, Short ID, and ULID identifiers |
| Domain Intel | WHOIS, DNS, and SSL lookup for domain intelligence |
| Meta Mate | Extract Open Graph, Twitter Cards, and JSON-LD metadata |
| IP Geo | Multi-provider IP geolocation with ISP detection |
| URL Health | Check URL accessibility, redirects, and SSL health |
| PW Forge | Generate secure passwords with entropy calculation |
| TZ Mate | Convert timezones and check DST offsets |
| Regex Lab | Test and debug regular expressions online |
| Brand Monitor Lite | Track brand mentions across multiple URLs |
| Link Quality Analyzer | Detect broken links and audit link quality |
| Mock Data Generator | Generate realistic test data for development |
| HTML to Markdown | Convert web pages or HTML to clean Markdown |
| SSL Cert Inspector | Deep SSL/TLS certificate analysis with scoring |