Skip to content
Inspect My DNS

How the score is calculated

A domain starts at 100. Every finding that is a real fault subtracts points; nothing else changes the number. There is no ceiling, no banding and no rounding to a grade — two domains with different findings essentially never land on the same score by coincidence.

The formula

score = max(0, 100 − Σ weight(check) × (1 − credit(check.severity)))

Each check that grades a real fault (kind: "defect") has a weight — how many points it costs on a full fail. A warn on the same check costs half that; a pass costs nothing. A lame delegation and a missing DMARC record are not the same finding, so they do not cost the same — the table below is every weight, in one place, exactly as the code reads it.

The exemption belongs to a finding, not to a check. A result graded kind: "hardening" — see "defect or hardening" on the full catalogue — never costs anything and can only be pass, info, unknown or not_applicable: no DNSSEC, no CAA and no security.txt are each exactly that — absent, not broken. The same check can still grade defect when the feature is deployed but broken, and that does cost points: a DNSSEC chain with a DS record and no DNSKEY, or a security.txt published with no Contact field, are findings about something that exists and is wrong, not about something missing.

info, unknown and not_applicable also cost nothing — see severity on the full catalogue for what each of those means. unknown in particular is our own gap, most often a blocked outbound port on the machine running the scan, and marking a domain down for it would be a false accusation about somebody else’s infrastructure.

A worked example

A domain with one failing check and one warning, and nothing else wrong:

ns.open-recursion fails    → −16 points (full weight)
mailauth.spf-all warns     → −4 points  (half of 8)
everything else passes     → −0 points

score = 100 − 16 − 4 = 80

Fix the warning without touching the failure and the score moves to 84. Fix both and it is 100. Nothing about either change depends on what else is passing, and adding a third problem always costs more, never less.

Every weight

Points deducted on a full fail. A check that can grade a real fault and has no row here would fall back to 8 rather than deduct nothing, so a newly added check is never accidentally free — a dedicated test refuses to let that fallback cover for a check nobody has actually reviewed and weighted on purpose. 5 checks are intentionally absent below — each of those can only grade pass, info, unknown or not_applicable, so a weight for it would be dead code.

CheckCategoryWeight
Nameservers respond over UDP
ns.udp
Nameservers20
Domain registration expiry
registration.expiry
Registration20
Registry status
registration.status
Registration20
Domain registration
registration.exists
Registration20
Domain is delegated
delegation.exists
Delegation20
HTTPS certificate
web.https
Web & TLS18
Blacklist status
reputation.summary
Reputation18
Nameservers are not open resolvers
ns.open-recursion
Nameservers16
Zone transfers are not open to the world
ns.zone-transfer
Nameservers16
Parent returns a referral
delegation.parent-refers
Delegation14
Registry and zone agree on the nameservers
delegation.ns-match
Delegation14
Glue records
delegation.glue
Delegation14
Nameservers agree on the SOA serial
ns.serial-agreement
Nameservers14
Every nameserver is authoritative
ns.authoritative
Nameservers14
Apex address records
web.apex-address
Web & TLS14
Nameservers agree on the NS set
ns.set-agreement
Nameservers12
DNSSEC
delegation.dnssec
Delegation12
Nameservers are independent of each other
ns.diversity
Nameservers12
MX hosts resolve to public addresses
mail.mx-resolves
Mail delivery12
DMARC record
mailauth.dmarc-present
Mail authentication12
SPF record
mailauth.spf-present
Mail authentication12
SMTP connectivity
smtp.connect
Mail delivery12
Nameserver hostnames are valid
ns.hostnames
Nameservers10
MX targets are hostnames with address records
mail.mx-targets
Mail delivery10
At least two nameservers
ns.count
Nameservers10
MX records
mail.mx-present
Mail delivery10
STARTTLS offered
smtp.starttls
Mail delivery10
Apex is not a CNAME
web.apex-cname
Web & TLS10
SOA record
soa.present
SOA10
Registry servers
delegation.registry-responded
Delegation8
Nameservers respond over TCP
ns.tcp
Nameservers8
Reverse DNS for mail servers
mail.mx-ptr
Mail delivery8
SPF ends with an all-mechanism
mailauth.spf-all
Mail authentication8
SPF stays within the 10-lookup limit
mailauth.spf-lookups
Mail authentication8
DKIM selectors
mailauth.dkim-probe
Mail authentication8
MTA-STS policy file
mailauth.mta-sts-policy
Mail authentication8
Mail server TLS certificate
smtp.tls-certificate
Mail delivery8
Transfer lock
registration.transfer-lock
Registration8
Wildcard records
web.wildcard
Web & TLS8
MTA-STS
mailauth.mta-sts
Mail authentication6
SOA timers are sensible
soa.timers
SOA6
security.txt
web.security-txt
Web & TLS5
SPF avoids the `ptr` mechanism
mailauth.spf-ptr
Mail authentication4
Primary nameserver is listed
soa.mname-listed
SOA4
Contact address is well-formed
soa.rname-valid
SOA4
Serial number format
soa.serial-format
SOA4
www hostname
web.www
Web & TLS4
SMTP capabilities
smtp.capabilities
Mail delivery4
MX records are distinct
mail.mx-duplicates
Mail delivery4

When there is no score at all

A domain that was never meaningfully present in DNS gets no score — not a low one. A low score is still a real measurement; a domain with nothing behind it has nothing to measure, and 0 would read as a graded result rather than an absent one. The report shows No score and names the reason:

not_delegated
The registry has no delegation for this name — never registered, expired and deleted, or registered with no nameservers set.
registry_unreachable
No server for the registry could be found or answered, so nothing below that point could be compared against it either.
no_nameservers_responded
Every nameserver the registry lists failed to answer — over UDP and over TCP.

This is different from a domain that resolves fine but has no registration record on file, or carries a registry hold or pending-deletion status — those score 0 outright, because the domain really was measured and really is unreachable above the DNS layer.

Looking for what a specific check does, rather than how it is weighted? The full catalogue lists every one, with the reasoning behind it.