Domain Expiry Watch — Early Signal Before a Domain Drops
A shortlist to watch, not a list you can buy.
Leaving the zone happens roughly 35 days before a domain is actually released, which makes it an early warning rather than a buying list. More than half the domains that leave never drop at all — they come back — so what this Actor sells is the zone exit event with an age attached, and `minDaysAbsent` is the control that turns a noisy early signal into a useful one.
oswaldocarabano/zone-exit-watch
{
"tld": ["bank"],
"minDaysAbsent": 30,
"days": 60,
"maxResults": 100
}- Version
- v0.1.11
- Memory
- 4096 MB
- Browser
- none
- Proxy
- None — the zone data is held, not fetched
Short answer
The Domain Expiry Watch Actor reports domains that disappeared from the registries' zone files, with how many days each has been absent, across 1,075 gTLDs. Leaving the zone happens roughly 35 days before a domain is actually released, so the output is an early watchlist rather than a list of domains anyone can buy today — and more than half the domains that leave the zone never drop, because a late renewal, a nameserver misconfiguration or a resolved registrar suspension brings them back. The `minDaysAbsent` filter is what makes the signal usable: 0 is the earliest and noisiest, 7 clears most transient problems, and 30 leaves domains genuinely heading for release. Pricing is $0.002 per zone exit, and no WHOIS or RDAP query is made to resolve the ambiguity.
Key points
- Leaving the zone happens roughly 35 days before a domain is actually released, which is what makes a zone exit an early warning rather than a purchase opportunity.
- More than half the domains that leave the zone never drop: a late renewal, a nameserver misconfiguration or a resolved registrar suspension brings them back.
- Calling the output an expired domains list would have sold better and would have been wrong on most of its rows, which is why the Actor is named for the event it observes.
- The `minDaysAbsent` filter is the control that turns the signal into something usable: 0 includes domains that left today, 7 clears most transient problems, and 30 leaves domains genuinely heading for release.
- The zone event itself is 100% reliable — the domain was in yesterday's snapshot and is not in today's — and what is uncertain is only what it means.
- A domain already parked for sale before it left the zone is a much firmer drop candidate than one that was in active use, which is why `parked_for_sale` is carried on every row.
What it does
Leaving the zone happens roughly 35 days before a domain is actually released, which makes it an early warning rather than a buying list. More than half the domains that leave never drop at all — they come back — so what this Actor sells is the zone exit event with an age attached, and `minDaysAbsent` is the control that turns a noisy early signal into a useful one.
{
"domain": "oldproject.shop",
"tld": "shop",
"exited_on": "2026-08-14",
"days_absent": 34,
"last_nameservers": ["ns1.afternic.com", "ns2.afternic.com"],
"dns_provider": "Afternic",
"parked_for_sale": true
}Why this one
Not called "expired domains", on purpose
The search term is expired domains and the honest product is not that. More than half the rows in such a list would be domains that come back, so the name would be selling a list where most entries are wrong. Naming it for the zone exit costs search volume and keeps every row true.
A filter instead of a hidden cleanup
The ambiguity in a zone exit could have been smoothed over by only publishing rows past some internal threshold. Exposing `minDaysAbsent` instead puts the trade-off in the operator's hands, with the four useful settings and what each one costs in false alarms written down next to it.
35 days of lead time, and what it is for
A zone exit is not a drop, it is the gap before one. That gap is the product: it is enough time to prepare a backorder, to warn a client whose domain is about to lapse, or to notice that an asset in a portfolio stopped being delegated. A list of already-dropped domains is available everywhere and is worth less because everyone has it at the same moment.
The lookup it refuses to make
Querying WHOIS or RDAP would resolve whether an exit is heading for release. It is also prohibited at scale by the agreement that provides the zone data, so it is not done — and the refusal is published rather than the gap being quietly left for the reader to notice.
Use cases
- Watch a portfolio for a domain that stopped being delegated, before the client notices the site is down.
- Build a drop watchlist in a niche TLD with 30 days of absence as the threshold.
- Catch a lapsing domain belonging to a partner or supplier, as a supply-chain signal.
- Track how many domains matching a keyword are leaving the zone over a 90-day window.
- Find parked domains leaving the zone, which are the firmest drop candidates in the feed.
Input
Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.
| Field | Default | What it does |
|---|---|---|
containsstring[] | [] | Keyword filterOnly return exits whose name contains one of these words. Either this or a TLD filter is required. |
tldstring[] | [] | TLD filterRestrict to these TLDs, without the dot. A niche TLD is where a whole-TLD watch stays readable by a person. |
minDaysAbsentinteger | 1 | Minimum days absentpersonal dataOnly show domains missing from the zone for at least this many days. 0 is the earliest and noisiest signal, 7 clears most transient problems, and 30 leaves domains genuinely heading for release. |
daysinteger | 7 | Days to look backHow many daily snapshots to search. Required and capped at 90 — there is no 'since forever', by design. |
maxResultsinteger | 100 | Max resultspersonal dataHard cap on rows returned, kept low on purpose so a first run cannot burn a free credit. The service never returns more than 50,000 rows in one run. |
Output and fill rates
A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.
| Field | Filled | Meaning |
|---|---|---|
domainstring | 100% | The domain that left the zone in the window searched. |
tldstring | 100% | The top-level domain, one of the 1,075 covered gTLDs. |
exited_onstring | 100% | The date of the first snapshot where the domain was missing, which is the certain part of the row. |
days_absentinteger | 100% | How many days the domain has been missing since, and the field `minDaysAbsent` filters on. |
last_nameserversstring[] | 100% | Where the domain delegated before it left, which is often the only clue to what happened. |
dns_providerstring | 69.1% | Who ran its DNS, inferred from those last nameservers. A hosting fact rather than a technology one. |
parked_for_saleboolean | 100% | True when the domain was already sitting on a parking or sale service before it left. A parked domain leaving the zone is a much firmer drop candidate than one in active use. |
Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.
Datasets
Different record types go to different datasets, so the main table never carries columns that are blank on most rows.
defaultOne row per domain that left the zone in the window, with how long it has been absent and where it delegated before.billed
Pricing
Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.
| Event | Price | Notes |
|---|---|---|
actor-startActor start | $0.00001 | Effectively free. A run that finds nothing costs you nothing, and on a watched portfolio finding nothing is the good outcome. |
zone-exitZone exit | $0.002 | One domain that disappeared from the zone, with how many days it has been absent and where it delegated before. An early signal roughly 35 days before a domain is released — not a domain you can buy today. |
Measurements
Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.
Zone coverage
255,631,856 domains across 1,075 gTLDs
Counted from the zone files themselves rather than quoted from a registry summary, and refreshed daily.
Lead time before release
roughly 35 days
The interval between a domain leaving the zone and being released, which is what makes the output a watchlist rather than a buying list.
Exits that never drop
more than half
Late renewals, nameserver misconfigurations and resolved registrar suspensions all look identical to a release from outside the zone. It is the reason the Actor is not called 'expired domains'.
Zone event reliability
100%
The domain was present in one daily snapshot and absent from the next. That comparison carries no interpretation; everything uncertain lives in what it means.
`parked_for_sale` rate
2.0% of domains
Measured across the whole zone by matching nameservers against known parking and domain-sale services. On an exit row it separates the firm drop candidates from the accidents.
What it will not do
Stated plainly so you can judge fit before spending anything.
- A zone exit is not a drop: more than half the domains that leave the zone come back, and a low `minDaysAbsent` makes that share higher.
- Roughly 35 days of lead time means the output is a watchlist, not a list of domains available to register today.
- No WHOIS or RDAP query is made to resolve whether an exit will become a release, because it is prohibited at scale by the agreement behind the data.
- One snapshot a day, so an exit today appears in tomorrow's run at the earliest.
- Either a keyword filter or a TLD filter is required, and the look-back window is capped at 90 days.
- Country-code TLDs are not covered, so no `.io`, `.ai` or `.co` domain ever appears.
- The service never returns more than 50,000 rows in one run.
Privacy
- Zone files contain delegation records, not people: there is no registrant, no email address and no registrar in the source.
- The data is obtained through ICANN's Centralized Zone Data Service under agreement with the Registry Operators, and ICANN does not endorse, sponsor or review this Actor.
- No WHOIS or RDAP query is made at any point, because querying registries at scale is prohibited by the agreement that provides this data.
- Every run is anchored on a keyword or TLD filter the operator supplies, and the window is capped at 90 days.
- Removal requests: privacy@actorstack.dev
See also the data removal process.