Site Health Audit: SEO, TLS, llms.txt & Broken Links avatar

Site Health Audit: SEO, TLS, llms.txt & Broken Links

Pricing

from $8.00 / 1,000 url auditeds

Go to Apify Store
Site Health Audit: SEO, TLS, llms.txt & Broken Links

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

Luận Phạm Minh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Security

Limited permissions

Share

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

AreaDetails
AvailabilityFinal status, full redirect chain with each hop's status, loop detection, response time
TLS certificateValid or not, the reason if not, expiry date, days left, issuer, protocol
SEO tagsTitle, meta description, canonical, meta robots, hreflang, H1 count, language, viewport
SharingOpen Graph tags
Structured dataJSON-LD types found, and any blocks with invalid JSON
Crawl setuprobots.txt rules, sitemap presence, whether robots.txt blocks all bots
AI readinessllms.txt presence, ignoring sites that answer every path with an HTML page
LinksBroken links on that page, up to your cap, with anchor text
Score0-100 with a grade and a list of reasons, each with its penalty

How to use it

  1. Paste your URLs.
  2. Choose how many links per page to test. Set it to 0 for a much faster run.
  3. 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.

ProblemPoints lost
Unreachable siteScore is 0
HTTP 4xx or 5xx60
Redirect loop30
Invalid TLS certificate25
Not served over HTTPS20
Certificate expires in under 7 days / under 21 days15 / 5
Broken links5 for the first, then 2 more each, up to 15
Missing title10
Noindex10
Slow response (over 3 s / over 1.5 s)8 / 3
Missing meta description6
Several redirect hops5
Missing canonical / invalid JSON-LD4 each
Missing sitemap, H1, viewport or Open Graph3 each
Smaller issues, such as title length, no llms.txt, no lang1 or 2

The score is a checklist of technical hygiene. It is not a prediction of search ranking.

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.

EventPriceWhen
Run started$0.002Once per run, per GB of memory
URL audited$0.008One 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 bodyTruncated is 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.