Site Health Audit: SEO, TLS, llms.txt & Broken Links
Pricing
from $8.00 / 1,000 url auditeds
Site Health Audit: SEO, TLS, llms.txt & Broken Links
Audit a list of URLs: status, redirect chain, TLS expiry, SEO tags, hreflang, Open Graph, JSON-LD, robots.txt, sitemap, llms.txt and broken links, with a 0-100 score and clear reasons. No crawl, no browser.
Pricing
from $8.00 / 1,000 url auditeds
Rating
0.0
(0)
Developer
Luận Phạm Minh
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Security
Limited permissionsShare
Site Health Audit: SEO, TLS, llms.txt and Broken Links with a 0-100 Score
Paste a list of URLs. Get a score from 0 to 100 for each, with every lost point explained.
For each URL, this Actor checks the things that silently break: expiring certificates, redirect chains, missing tags, invalid structured data, a blocked robots.txt, dead links. It reports each one in plain English, ready for a client report or an automated alert.
No login, no browser, no proxies. It uses plain HTTP, so it is fast and cheap.
Who it is for
- SEO consultants and agencies who need a quick technical check across many client pages
- Developers and DevOps who want a scheduled check for certificate expiry and broken pages
- Site owners preparing for AI search, who want to see
llms.txt, robots rules and structured data in one place
What it checks on every URL
| Area | Details |
|---|---|
| Availability | Final status, full redirect chain with each hop's status, loop detection, response time |
| TLS certificate | Valid or not, the reason if not, expiry date, days left, issuer, protocol |
| SEO tags | Title, meta description, canonical, meta robots, hreflang, H1 count, language, viewport |
| Sharing | Open Graph tags |
| Structured data | JSON-LD types found, and any blocks with invalid JSON |
| Crawl setup | robots.txt rules, sitemap presence, whether robots.txt blocks all bots |
| AI readiness | llms.txt presence, ignoring sites that answer every path with an HTML page |
| Links | Broken links on that page, up to your cap, with anchor text |
| Score | 0-100 with a grade and a list of reasons, each with its penalty |
How to use it
- Paste your URLs.
- Choose how many links per page to test. Set it to 0 for a much faster run.
- Run it, or put it on a schedule to catch problems such as an expiring certificate early.
{"urls": [{ "url": "https://www.example.com/" }, { "url": "https://www.example.com/pricing" }],"maxLinksPerPage": 50,"maxPages": 100}
Output
One row per URL. Shortened sample from a real run:
{"inputUrl": "https://www.iana.org/","finalUrl": "https://www.iana.org/","finalStatus": 200,"redirectChain": [],"responseTimeMs": 133,"tls": { "checked": true, "valid": true, "protocol": "TLSv1.3", "daysUntilExpiry": 79 },"page": {"title": "Internet Assigned Numbers Authority","metaDescription": null,"canonical": "https://iana.org/","hreflang": [],"openGraph": {},"jsonLd": { "types": [], "blocks": 0, "invalidBlocks": 0 }},"robotsTxt": { "status": 200, "present": true, "sitemaps": [], "blocksAllBots": false },"sitemap": { "present": false },"llmsTxt": { "present": false, "status": 404 },"links": { "found": 23, "checked": 23, "ok": 20, "redirected": 0, "brokenCount": 0, "broken": [], "unverified": [{ "url": "https://www.icann.org/", "anchor": "ICANN", "status": null, "error": "The operation was aborted" }] },"score": 82,"grade": "B","reasons": [{ "check": "meta", "penalty": 6, "severity": "warning", "message": "The meta description is missing." },{ "check": "open-graph", "penalty": 3, "severity": "info", "message": "Open Graph title or image is missing, so shared links look bare." },{ "check": "sitemap", "penalty": 3, "severity": "warning", "message": "No sitemap found in robots.txt or at /sitemap.xml." },{ "check": "canonical", "penalty": 2, "severity": "info", "message": "The canonical points elsewhere: https://iana.org/" },{ "check": "structured-data", "penalty": 2, "severity": "info", "message": "No JSON-LD structured data." },{ "check": "language", "penalty": 1, "severity": "info", "message": "The html element has no lang attribute." },{ "check": "llms", "penalty": 1, "severity": "info", "message": "No llms.txt (an optional file that guides AI tools)." }]}
How the score works
Every page starts at 100 and loses points for specific problems, so you can always see why. Grades: A is 90+, B is 75+, C is 60+, D is 40+, F is below that.
| Problem | Points lost |
|---|---|
| Unreachable site | Score is 0 |
| HTTP 4xx or 5xx | 60 |
| Redirect loop | 30 |
| Invalid TLS certificate | 25 |
| Not served over HTTPS | 20 |
| Certificate expires in under 7 days / under 21 days | 15 / 5 |
| Broken links | 5 for the first, then 2 more each, up to 15 |
| Missing title | 10 |
| Noindex | 10 |
| Slow response (over 3 s / over 1.5 s) | 8 / 3 |
| Missing meta description | 6 |
| Several redirect hops | 5 |
| Missing canonical / invalid JSON-LD | 4 each |
| Missing sitemap, H1, viewport or Open Graph | 3 each |
| Smaller issues, such as title length, no llms.txt, no lang | 1 or 2 |
The score is a checklist of technical hygiene. It is not a prediction of search ranking.
Honest link results
A link counts as broken only on clear evidence: HTTP 404, 410, a 5xx other than 503, a domain that does not exist, or a refused connection. Sites often answer automated checks with 400, 403, 429 or 503 even when the page works for people, so those are listed as unverified and do not cost points. Links whose site's robots.txt disallows us are skipped and counted.
Pricing
Pay per event.
| Event | Price | When |
|---|---|---|
| Run started | $0.002 | Once per run, per GB of memory |
| URL audited | $0.008 | One URL audited and scored, including a dead site, which is a real finding |
Invalid URLs, private addresses and URLs blocked by robots.txt are free.
Examples: 10 URLs cost $0.082. 100 URLs cost $0.80. Link checks are included in the price, up to 500 links per page. Set a maximum cost per run and the Actor stops cleanly at that limit.
Limits
- Only the URLs you supply are audited. Hard cap of 1,000 URLs per run.
- Link checking is one hop deep, in page order, and stops after 120 seconds per page. The output says how many links were left unchecked.
- Response time is one measurement from Apify's servers, so it is a rough signal and can vary between runs. It is not a Core Web Vitals test.
- HTML is read as served. Tags or links added later by JavaScript are not seen.
- Pages over 3 MB are read up to that point, and
bodyTruncatedis set.
What it does not do
- It does not crawl your site or discover pages. If you want that, use a crawler.
- It does not run a browser, so there are no Lighthouse or Core Web Vitals scores.
- It does not report backlinks, keywords, rankings or domain authority.
- It honours robots.txt. If a site disallows this Actor's fetching (
LuanLabSiteHealthAudit), or its robots.txt returns a server error, that URL is reported as not audited and is not charged. To audit such a page, allow this user agent on your own site. - It does not bypass firewalls, bot protection or CAPTCHAs. A page behind one is scored on what it returned.
- It does not collect e-mail addresses or other contact details.
- It refuses private and internal addresses.
Support
Think a score is wrong? Open an issue on the Issues tab with the URL and the reason you disagree.