Website Health Report: SSL, Headers, DNS avatar

Website Health Report: SSL, Headers, DNS

Pricing

from $3.00 / 1,000 domain reports

Go to Apify Store
Website Health Report: SSL, Headers, DNS

Website Health Report: SSL, Headers, DNS

One row per domain with an A-F grade: SSL certificate expiry and trust, TLS version, HTTP-to-HTTPS redirect, six security headers, and DNS records (IPv6, SPF, DMARC, CAA), each with a plain-English detail. At most a few requests per domain. Unresolvable domains are free.

Pricing

from $3.00 / 1,000 domain reports

Rating

0.0

(0)

Developer

kelp forest

kelp forest

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

Give it a list of domains. You get one graded row per domain with the checks agencies and IT teams run every month: certificate expiry and trust, HTTP→HTTPS redirect, security headers and email/DNS hygiene.

Use cases

  • Monthly health reports for agency client portfolios.
  • Catch SSL certificates before they expire.
  • Track security-header and email-auth (SPF/DMARC) gaps across many domains.
  • Due diligence on a list of vendor domains.

What it checks

GroupChecksResult levels
TLS certificatedays to expiry (warn < 30 days, fail if expired), trusted chain + host-name match, protocol (TLS 1.2/1.3)pass / warn / fail
HTTPSHTTPS answers; HTTP redirects to HTTPS (301/308 = pass, 302/307 = warn, none = fail)pass / warn / fail
Security headersStrict-Transport-Security (max-age ≥ 180 days), Content-Security-Policy, X-Content-Type-Options, clickjacking protection (X-Frame-Options or CSP frame-ancestors), Referrer-Policy, Permissions-Policypass / warn / fail / info
DNSA/AAAA, IPv6, SPF (one record, no +all), DMARC policy, CAApass / warn / fail / info

Each row has grade (A–F), scorePct, passed/warnings/failed, failedChecks, warningChecks, the full checks list with a plain-English detail, the certificate summary (issuer, expiry, SANs) and the raw security headers. info results (optional items such as CAA) never lower the grade.

Pricing (pay per event)

EventPrice
domain (one domain with a report)US$0.003

Free: domains that do not resolve, private/reserved addresses, and sites that answer neither HTTPS nor HTTP get an error row and no charge.

Each run also has Apify's run-start charge of US$0.00005 per GB of run memory (US$0.00005 at the default 512 MB), charged when the run starts, even if every domain gets an error row.

How to use

  1. Open the actor in Apify Console and fill in the input form (or paste the JSON example below into the JSON editor).
  2. Optional: set a maximum charge for the run under the run options to cap what a run can cost.
  3. Click Start. Results appear in the Output tab as they are produced; export them as JSON, CSV, Excel or HTML.

You can also start runs from the Apify API or CLI, run the actor on a schedule (for example weekly), and send results to other apps with Apify integrations and webhooks.

Input example

{"domains": ["example.com", "example.org"], "checkDns": true}

Output example (local fixture run with a self-signed certificate; trimmed to the summary and the failed or warning checks)

{"domain": "https://127.0.0.1:8443",
"status": "ok",
"grade": "F",
"gradeCappedBy": ["https_response", "tls_trust"],
"scorePct": 50,
"passed": 2,
"warnings": 1,
"failed": 2,
"failedChecks": ["tls_trust", "https_response"],
"warningChecks": ["https_redirect"],
"certificate": {"subjectCN": "localhost", "issuerO": "Kelp Test CA", "daysToExpiry": 199, "protocol": "TLSv1.3", "trusted": false},
"checks": [{"check": "tls_trust", "result": "fail", "detail": "certificate not trusted for this host: self-signed certificate"}, {"check": "https_response", "result": "fail", "detail": "HTTPS request failed: ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1029)"}, {"check": "https_redirect", "result": "warn", "detail": "plain HTTP not reachable (ConnectError: All connection attempts failed); nothing to redirect"}]}

Light touch

Per domain: two TLS handshakes on port 443 (one reads the certificate, one verifies trust and the host name), one GET of https://domain/ and one GET of http://domain/, each following at most 8 redirects (every hop is checked before it is requested), plus DNS lookups. Usually that is 4 connections, at most 20 if both URLs redirect 8 times. All requests use an identified user agent (KelpForestLabs-HealthCheck/1.0 ...). No crawling, no port scanning, no vulnerability probing.

How the grade works

Every graded check counts the same: pass = 1, warn = 0.5, fail = 0; info results (optional items such as CAA, IPv6 or Permissions-Policy when absent) are not counted. scorePct is the average and sets the grade: A ≥ 90, B ≥ 80, C ≥ 65, D ≥ 50, otherwise F. A failed critical check caps the grade at F whatever the average: an expired or untrusted certificate, a failed TLS handshake, or no HTTPS response, because visitors see a browser error. gradeCappedBy names the check(s), and failedChecks always lists every failure.

Examples, computed with the actor's own scoring code:

SituationGraded checksscorePctGrade
everything passes, IPv6 and CAA present16 pass100A
no CSP and no Permissions-Policy (otherwise good)12 pass, 1 warn96A
no HTTP→HTTPS redirect, only HSTS set, no DMARC7 pass, 4 warn, 2 fail69C
expired certificate, otherwise good13 pass, 1 fail93F (gradeCappedBy: ["tls_expiry"])

FAQ

Is this a security scan? No. It reads public TLS, DNS and header information only. A good grade does not mean a site is secure.

Which name should I enter? Use the bare domain (example.com) so SPF and DMARC are looked up on the right name.

What does an unreachable domain cost? Nothing. Domains that do not resolve, private addresses and sites answering neither HTTPS nor HTTP are free error rows.

How is the grade calculated? Every graded check counts the same: pass = 1, warn = 0.5, fail = 0, info is not counted. scorePct is the average; A >= 90, B >= 80, C >= 65, D >= 50, otherwise F. A failed critical check (an expired or untrusted certificate, a failed TLS handshake, or no HTTPS response) caps the grade at F whatever the average, and gradeCappedBy names it. failedChecks always lists every failure.

Limits: what this actor does not do

  • It is not a penetration test or a compliance certificate; a good grade does not mean a site is secure.
  • It checks only the home page response for headers.
  • SPF/DMARC/MX are looked up for the name you give: use the bare domain (example.com), not www.example.com.
  • A port in the input (https://example.com:8443) is used for the TLS and HTTPS checks; the HTTP-to-HTTPS redirect check always uses http:// on port 80.
  • The TLS probe and each HTTP request must finish within 30 seconds, so one slow server cannot hold up the list.

Changelog

  • 1.0 (October 2026): first public version.