← back to insights
Phase 4 + 3 · Lifecycle & topology
live data

Domains expire, return, and link.

We diff consecutive zone-file snapshots to find domains that expired (left the zone) and were newly registered (entered it). The ones that drop and come back are reused, the classic abuse precursor. Then we follow the link graph one hop to see where collected domains actually point. Two views of the same lifecycle, below.

In plain terms: web domains are registered and abandoned constantly. We take a full census of the generic-TLD namespace (every .com, .xyz, and so on) at two dates six weeks apart and compare them, recording every domain that appeared, vanished, or came back, then we check which of the new ones are dangerous (listed by public threat feeds). The panels below break that down. New to a term? See the glossary.
Delta detection · expired & newly registered
loading delta…
How the delta is computed

Two ICANN CZDS zone-file snapshots, six weeks apart, are differenced per TLD. The newly-registered set then flows into RDAP enrichment, reuse classification, and the blocklist maliciousness check.

1 · Zone pull
CZDS daily, 1,080 gTLDs → zone_file
2 · Two snapshots
Apr-26 baseline vs latest June pull
3 · Set difference
per TLD: OLD vs NEW (expired / newly / retained)
4 · Lifecycle split
expired10.3M
retained251.9M
newly15M
5 · Newly → analysis
RDAP enrich → reuse classify → blocklist maliciousness
The calculation, in detail
Worked example & robustness checks (ablations)
Worked example, a real TLD
.lol

The whole method is one set difference per TLD. Here is the actual .lol calculation from this run, every name compared, no sampling:

OLD (Apr): all .lol names661,421
NEW (Jun): all .lol names992,513
expired = OLD − NEW28,988
e.g. solblue.lol, comcon.lol, sabang777.lol
newly = NEW − OLD360,080
e.g. xivr193z.lol, classrooom.lol, avlpfzf0.lol
retained = OLD ∩ NEW632,433

Every one of .lol's 661,421 April names is checked against all 992,513 June names: the full zone, not a sample. The identical set difference runs over all 1,080 TLDs, from this up to .com's 160M+ names. The newly set is what feeds the maliciousness check.

Why the numbers hold up (ablations)

A set difference is only as honest as its two snapshots. Four controls, each with its measured effect:

  • Complete-pull guard. A TLD is diffed only if its new pull is complete, otherwise a half-pulled zone reads as mass expiry. One incomplete .paris pull showed 21,986 phantom expiries against 473 real ones; the guard removes ~24k false expiries.
  • Apex rows dropped. The registry/zone apex itself is excluded (negligible: 2 + 7 rows).
  • Giant-zone pass. .com (the largest zone, well over 150M names) is run separately so it cannot crash the bulk job.
  • Reuse recovery. A name that drops and returns inside the window hides inside "retained", so churn is a lower bound; RDAP creation dates recover these (15+ so far).

One caveat on wording: "expired" means a name left the DNS zone (delegation withdrawn), which is broader than registry deletion. A domain can leave the zone (nameservers pulled, registrar hold) without being formally deleted. It is the lifecycle signal we can measure uniformly across every gTLD.

Top TLDs by churn
Genuinely re-registered

RDAP creation date after the April baseline (n=15). The 858 "returning" diffs are TLD-coverage-gap artifacts, excluded.

    Namespace dynamics

    Six-week churn as a share of each TLD's own April size (median 14.26%, flood > 28.5%). A flood zone turns over more than its entire prior population in six weeks, while .com sits below the median. Size is not abuse: the cheap zones get pumped.

    .living
    134%
    .surf
    101%
    .garden
    89%
    .best
    36%
    .cam
    36%
    .wiki
    36%
    .bet
    33%
    .win
    27%
    .courses
    26%
    .help
    25%
    .you
    25%
    .digital
    22%
    Link-graph topology

    Where collected pages point, one hop out. Each node is a domain, each edge a link. Most inbound traffic goes to expected social/CDN hubs (dimmed in the list). The signal is in the non-obvious targets and the flagged sources. Click a dot to see what it links to.

    source (collected) link target tracked in our zone
    loading graph…
    How to read this: 🖱️ Click a dot to see what it links to Drag to move dots 🔍 Scroll to zoom 👆 Hover for details
    Selected
    Click any dot in the graph to inspect it here.
    Most-linked domains

    These get the most inbound links. Click one to find it in the graph.

      Methodology & FAQ

      How to read this page

      Glossary plain-language definitions of the terms used on this page
      Zone file
      A registry's master list of every registered domain in a TLD. We pull these daily from ICANN CZDS.
      Zone delta
      The difference between two zone-file snapshots: which domains appeared, vanished, or stayed.
      Newly registered
      A domain present in the recent snapshot but absent from the April baseline.
      Expired
      A domain present in the April baseline but gone now (it dropped out of the zone).
      Reused
      A domain that expired and was then re-registered, often by a new owner, a classic abuse setup.
      Churn
      Total turnover (expired + newly registered). "By volume" is the raw count; "by rate" is that as a share of the TLD's size.
      RDAP
      The modern WHOIS protocol. It gives a domain's registrar, creation date, and registrant.
      Blocklist
      Our aggregate of public threat feeds (PhishTank, URLhaus, abuse.ch, and so on). A domain on it has been reported for phishing or malware.
      Operator cluster
      A group of domains serving byte-identical page content, i.e. one operator running many throwaway sites.
      Hop-1 link graph
      Following one click outward from a collected page to see which domains it links to.
      gTLD vs ccTLD
      Generic TLDs (.com, .xyz) vs country-code TLDs (.de, .uk). We cover gTLDs; CZDS does not distribute ccTLD zones.
      Flagged vs malicious
      "Flagged/surfaced" means our analysis raised it as a candidate; "malicious" means a public feed independently confirmed abuse.
      How are domains surfaced and analyzed?

      The page surfaces and analyzes domains through several independent, data-driven layers:

      1. Delta detection, diffing consecutive zone-file snapshots to find domains that expired and were newly registered.
      2. Maliciousness, checking every newly-registered domain against DomainDefender's own blocklist (the panels above).
      3. Reuse, domains that expired and were genuinely re-registered (RDAP creation date after the April baseline).
      4. Operator clusters, domains serving byte-identical page content (same content hash = one operator running many throwaways).

      The link graph then maps where collected pages point one hop out, and who still links back to the domains we analyze.

      How exactly is the delta computed, and over what time window?

      It is a comparison of two complete zone-file snapshots taken at two points in time: an April-26 baseline (the zone_history set) and the latest June pull (the daily zone_file). For each TLD we take the set difference on the registered domain names:

      • Expired = present in the old snapshot, gone from the new one.
      • Newly registered = present in the new snapshot, absent from the old.
      • Retained = present in both.

      A TLD is only diffed once it has a fresh new pull, so an expiry reflects a real drop from the zone rather than a missing re-pull. The window on this page is roughly six weeks, long enough to capture meaningful registration and drop turnover.

      Subset or all? Do you diff every domain, and every TLD?

      It is all, two ways. There are no subsets anywhere in the delta.

      Within a TLD: every domain, no sampling. A CZDS zone file enumerates every delegated domain in the TLD (any name with nameserver records), and the diff runs over that entire set. Concretely, .lol this run: all 661,421 April names were compared against all 992,513 June names, giving 28,988 expired, 360,080 newly registered, and 632,433 retained. Not a sample, not a top-N.

      Across TLDs: all 1,080, each diffed in full. The identical full set difference runs for every covered TLD, from tiny brand zones up to .com's 160M+ names. We do not sample TLDs and we do not sample within them, so the headline counts (1,080 TLDs, 10.3M expired, 15.0M newly) are 100% of every zone, not an estimate.

      The only place anything is sampled is the separate content-collection stage (a few hundred domains per TLD for screenshots and HTML), which is a different part of the pipeline and never touches the delta counts. One inherent caveat of any zone-based measurement: a domain that is registered but never delegated (no nameserver records) does not appear in the zone file, so it falls outside the diff.

      Which TLDs do you cover, and how many?

      All gTLDs we hold ICANN CZDS access for, about 1,087 zones across four disjoint CZDS credential sets (zero overlap). The daily pull refreshes them and the delta is computed across every gTLD that has a fresh snapshot pair (1,080 in the current run, expanding to the full set as pulls complete).

      Country-code TLDs (.de, .uk, and so on) are out of scope: ICANN CZDS only distributes gTLD zones, not ccTLD zones.

      How often is the delta recomputed?

      Zone files are pulled daily via an automated CZDS job across the four credential sets, so a current snapshot is always on hand. The delta shown here compares the April-26 baseline against the latest snapshot, and can be recomputed against any newer snapshot as the daily pulls accumulate.

      How do you know the delta numbers are right? (robustness / ablations)

      A set difference is only as honest as its two snapshots, so four controls guard the result. Each is an ablation: remove it and the numbers visibly move.

      • Complete-pull guard (largest effect): a TLD is diffed only if its new pull is complete. Without it, a half-pulled zone reads as mass expiry, one incomplete .paris pull alone produced 21,986 phantom expiries against 473 real, so the guard removes roughly 24,000 false expiries and is why net growth is the internally consistent newly − expired, not a contaminated figure.
      • Apex-row exclusion: the registry/zone apex (domain == tld) is never counted as a domain (negligible, 2 + 7 rows, but keeps the semantics clean).
      • Large-zone pass: giant zones like .com are run separately so a single zone cannot exhaust memory in the bulk job.
      • Reuse recovery: a name that drops and re-registers within the window stays in "retained", so reported churn is a lower bound; RDAP creation dates recover those cases.

      One wording caveat: "expired" means a name left the DNS zone (delegation withdrawn), which is broader than registry deletion, a domain can leave the zone without being formally deleted. It is the signal we can measure uniformly across every gTLD.

      Are these domains actually malicious? How do you know?

      To test maliciousness we intersect the newly-registered domains with DomainDefender's own ingested blocklist, which aggregates public threat feeds (PhishTank, OpenPhish, URLhaus, abuse.ch, Phishing.Database, Phishing.Army). A domain is malicious if one of those feeds has reported it for phishing or malware.

      Many newly-registered abuse domains are not on any feed yet, which is exactly the early-warning value of catching them at the zone-delta stage, before the feeds list them. The feeds themselves are maintained and vetted by the security community.

      How is a domain counted as malicious?

      A domain counts as malicious if it appears on DomainDefender's own ingested blocklist. That blocklist aggregates public threat feeds, PhishTank, OpenPhish, URLhaus, abuse.ch (MalwareBazaar / Feodo / SSLBL), Phishing.Database, and Phishing.Army, covering phishing, malware download, scamming, and C&C.

      These signals are not ours. A domain is on the list because one of those feeds observed and reported it serving phishing or malware. We do not label domains ourselves; we intersect the newly-registered set with the feeds.

      Stated plainly, this measures "listed by a public threat feed as malicious," a reputation signal, not an independent forensic analysis of each domain. Freshly-registered abuse is often not on any feed yet, which is why catching it early at the zone-delta stage is the value of this pipeline.

      Do we have registration info for these domains?

      Yes. The creation date, registrar, and registrant come from RDAP enrichment. The "newly registered" flag on this page is from the zone delta, a domain present in the June zone files but absent from our April-26 baseline, which we then join to the actual registration record.

      Why are .com and .xyz at the top if you say they're not abusive?

      The default "By volume" ranking tracks TLD size, .com tops it simply because it's the biggest zone (11.6M churned = only 6.85%, normal turnover). Switch to "By rate" and the big TLDs fall below the 14.3% median; the real per-zone abuse intensity is in cheap flood TLDs. Size ≠ abuse.

      What are "operator clusters"?

      Operator clusters, groups of domains serving byte-identical page content (same content hash). Identical content across many throwaway names is one operator / phishing kit; every domain in a cluster is a lead.

      What's the data source and time window?

      Zone files from ICANN CZDS (1,080 gTLDs in the current run, being extended to the full ~1,087-zone set). The delta compares the 2026-04-26 baseline against the latest June snapshot. Maliciousness comes from DomainDefender's own ingested blocklist; the link graph from our own content crawl.

      What's the difference between "flagged" and "malicious"?

      Surfaced = a domain shows up in one of our analysis layers (newly registered, re-registered, or part of a shared-content operator cluster). It is a candidate, derived cheaply from zone + content data.

      Malicious = the domain appears on DomainDefender's blocklist, meaning a public threat feed reported it for phishing or malware. A domain can be surfaced but not malicious, or malicious but not surfaced by our other layers. We report them separately.

      How accurate / verified is the maliciousness evaluation?

      The match is deterministic: a newly-registered domain either appears on a public threat feed or it does not, so there is no model or score to second-guess. The blocklist is maintained and vetted by the security community (PhishTank, abuse.ch, and so on). The malicious set's TLD distribution (heavy on .top / .click / .cfd / .cyou) matches known abuse patterns.

      What data sources power the maliciousness and link-graph views?

      The maliciousness signal is DomainDefender's own ingested blocklist (PhishTank, OpenPhish, URLhaus, abuse.ch, Phishing.Database, Phishing.Army), refreshed by our own pipeline. The link graph is built from our own content crawl. (An external infrastructure graph was used only for early exploration; the figures on this page are entirely from DomainDefender's own data.)

      How much data does this cover?

      279M zone records across 1,080 gTLDs. The April→June delta found 10,304,777 expired and 14,977,736 newly-registered domains, all checked for maliciousness against our own blocklist; the link graph holds 2,500 forward edges from our own content crawl.

      Why does this matter?

      Domain abuse, phishing, scams, malware delivery, starts at registration. Most malicious domains aren't in any threat feed yet when they're registered; catching them at the zone-delta stage (newly registered + on bad infra + listed by threat intel) is an early-warning signal that leads the feeds. This page is the research surface for that pipeline.

      Pipeline
      loading…