Bulk Domain Search — Availability Checker for 1,075 TLDs
Screen a shortlist before you look at it by hand.
Built for the moment before you decide: you have 300 name ideas across 12 TLDs and you want the dead ones gone before you look at the rest by hand. The answers are deliberately asymmetric — `taken` is certain because the domain is in the registry's own zone file, while `probably_free` is a screening verdict with a measured error rate rather than a promise.
oswaldocarabano/domain-availability-screen
{
"candidates": [
"myawesomeapp.com",
"myawesomeapp.net",
"myawesomeapp.org",
"myawesomeapp.app",
"myawesomeapp.dev"
],
"maxResults": 100
}- Version
- v0.1.10
- Memory
- 4096 MB
- Browser
- none
- Proxy
- None — the zone data is held, not fetched
Short answer
The Bulk Domain Search Actor screens up to 5,000 candidate domains in one run against the registries' own zone files, covering 1,075 gTLDs and 255,631,856 delegated domains refreshed daily. Each candidate comes back `taken` or `probably_free`, and the two answers are not equally strong: `taken` means the domain is delegated in the registry's zone file and is certain, while `probably_free` means it is absent from the zone, which is usually unregistered but misses about 1.62% of registered `.com` domains — 169,209,254 registered against 166,467,808 in the zone, checked against ICANN's monthly registry reports. Pricing is $0.001 per candidate screened, or $1 per 1,000, against $3 to $20 per 1,000 for WHOIS-based bulk checkers. Country-code TLDs including .io, .ai and .co are not covered, because ICANN's zone file service does not offer them at any price.
Key points
- Screening 5,000 candidate names costs $5.00 here, against roughly $100 for the same work at a WHOIS-based bulk checker's $0.02 per domain, because there is no WHOIS lookup, no proxy and no rate limit behind each row.
- A `taken` verdict is certain: the domain is delegated in the registry's own zone file, which is the registry's record rather than an inference from a lookup.
- A `probably_free` verdict carries a measured error rate of about 1.62% in `.com`, rising to roughly 2.4% in `.net` and 3.1% in `.org`, so it is a screening pass rather than a purchase decision.
- Coverage is 1,075 gTLDs and 255,631,856 delegated domains, but it is not evenly spread: `.com` alone is 166 million of that total and 481 of the TLDs hold fewer than a thousand domains each.
- Country-code TLDs — `.io`, `.ai`, `.co`, `.me`, `.tv`, `.cc` and the rest — are not covered at all, because they are run outside ICANN's contracts and are not available from the zone file service at any price.
- The `parked_for_sale` flag fires on 2.0% of domains and is exact when it does, which makes a taken domain sitting on a sale service one you might still be able to buy.
What it does
Built for the moment before you decide: you have 300 name ideas across 12 TLDs and you want the dead ones gone before you look at the rest by hand. The answers are deliberately asymmetric — `taken` is certain because the domain is in the registry's own zone file, while `probably_free` is a screening verdict with a measured error rate rather than a promise.
{
"candidate": "myawesomeapp.com",
"domain": "myawesomeapp.com",
"tld": "com",
"status": "taken",
"nameservers": ["ns1.dan.com", "ns2.dan.com"],
"dns_provider": "Dan.com",
"parked_for_sale": true
}Why this one
The asymmetry is the product
Two verdicts that are not equally strong, said out loud. `taken` is a fact from the registry's zone file. `probably_free` is an absence, and a domain can be registered and absent — suspended, newly bought, or with no nameservers set. Publishing one word for both would have been easier to sell and would have been a lie on about 1.6% of `.com` rows.
An error rate checked against the registries, not assumed
The 1.62% figure is not an estimate. ICANN's monthly registry reports give 169,209,254 `.com` domains registered against 166,467,808 present in the zone, and the difference is the gap this Actor cannot see. The same check gives roughly 2.4% in `.net` and 3.1% in `.org`, so the verdict is a little weaker outside `.com` than inside it.
Priced like a file lookup, because that is what it is
$0.001 per candidate — $1 per 1,000 — against $0.003 to $0.02 per domain for WHOIS-based bulk checkers in the same Store. The difference is not a discount but a different cost structure: answering from a file already held costs almost nothing, where a WHOIS lookup needs a proxy, a rate limit and a retry path per row.
The comparison it loses, published anyway
There is a flat-rate checker at $0.035 per run with no per-domain charge, and for a single large batch it is cheaper than this Actor. That is in the README rather than left for the reader to discover. What this one offers instead is 1,075 TLDs in one pass, an answer in seconds rather than minutes, and a stated error rate instead of a promise.
No shape that could return a namespace
Every run is anchored on a candidate list you provide, and there is no input that asks for the whole zone. That is a design decision rather than a missing feature: the agreement behind the data forbids handing over a substantial portion of a zone, so the product has no shape that could do it.
Use cases
- Reduce a 300-name naming shortlist to the handful worth checking at a registrar.
- Run a defensive registration check across every TLD a brand might be squatted on before a launch.
- Screen a spreadsheet of generated name candidates in bulk and keep only the ones absent from the zone.
- Check a domain investor watchlist across the gTLD namespace in one pass rather than one lookup at a time.
- Find which taken domains on a wishlist are parked for sale and might still be buyable.
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 |
|---|---|---|
candidatesstring[] | [] | Candidate domainsThe domains to screen, one per line, with the TLD. Up to 5,000 per run. This list is what anchors the run — there is no way to ask for a whole namespace. |
onlyFreeboolean | false | Only show probably-freeHides candidates that are definitely taken and returns only the ones absent from the zone. Rows hidden this way are not charged. |
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 |
|---|---|---|
candidatestring | 100% | The name as it was asked about, after normalisation, so a row always joins back to the input list. |
domainstring | not measured | The domain itself, present when it exists in the zone. |
tldstring | 100% | The top-level domain, one of the 1,075 covered gTLDs. |
statusstring | 100% | `taken` when the domain is delegated in the registry's zone file, `probably_free` when it is absent. The two are not equally strong. |
nameserversstring[] | not measured | Where the domain delegates, on taken rows. |
dns_providerstring | 69.1% | Who runs the DNS, inferred from the nameserver. A hosting fact rather than a technology one. |
parked_for_saleboolean | 100% | True when the nameserver belongs to a parking or domain-sale service. Fires on 2.0% of domains and is exact when it does. |
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 candidate screened, with its verdict and, when taken, its delegation.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. |
domain-screenedDomain screened | $0.001 | One candidate checked against the registries' own zone files and returned with a verdict — $1 per 1,000. Three to twenty times cheaper than WHOIS-based bulk checkers, because there is no WHOIS lookup, no proxy and no rate limit behind each row. |
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.
`probably_free` error rate, .com
1.62%
169,209,254 `.com` domains registered against 166,467,808 present in the zone, checked against ICANN's monthly registry reports rather than assumed.
`probably_free` error rate elsewhere
roughly 2.4% in .net, 3.1% in .org
The same comparison against ICANN's monthly registry reports, which is why the verdict is described as weaker outside `.com`.
Coverage concentration
.com is 166 million of 255 million
Counted per TLD from the zone files. 481 of the 1,075 covered TLDs hold fewer than a thousand domains each.
`dns_provider` fill rate
69.1%
Measured across every domain in the zone. The remaining 30.9% delegate to nameservers that identify no known operator.
`parked_for_sale` rate
2.0% of domains
Measured across the whole zone by matching nameservers against known parking and domain-sale services. Exact when it fires.
Cost against WHOIS-based checkers
$5.00 against about $100 for 5,000 names
$0.001 per candidate here against the $0.02 per domain charged by WHOIS-based bulk checkers in the Apify Store; the cheapest of those is $0.003, which is still three times this.
What it will not do
Stated plainly so you can judge fit before spending anything.
- `probably_free` is a screening verdict, not a purchase decision: about 1.62% of registered `.com` domains are absent from the zone at any time, and roughly 2.4% in `.net` and 3.1% in `.org`.
- Country-code TLDs are not covered — `.io`, `.ai`, `.co`, `.me`, `.tv`, `.cc` and every other ccTLD are run outside ICANN's contracts and are not available at any price.
- A zone file contains no registrant, no email, no registrar, no registration or expiry date and none of the domain's own A, MX or TXT records. No run will ever return them.
- Zone data is refreshed once a day, so a domain delegated this morning may not appear until tomorrow's snapshot.
- Up to 5,000 candidates per run, and the service never returns more than 50,000 rows in one run.
- Coverage is uneven by design of the namespace rather than of the tool: 481 of the 1,075 TLDs hold fewer than a thousand domains each.
- `dns_provider` is filled on 69.1% of rows and identifies who runs the DNS, not what the site is built with.
Privacy
- Zone files contain delegation records, not people: there is no registrant, no email address and no registrar in the source at all.
- 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. Querying registries at scale is prohibited by the agreement that provides this data.
- No run can return a substantial portion of a zone, which is why every run is anchored on a list the operator supplies.
- Removal requests: privacy@actorstack.dev
See also the data removal process.
Frequently asked questions
What does `probably_free` actually mean?
Is `taken` ever wrong?
Can I check .io, .ai or .co domains?
Why is this cheaper than a WHOIS-based bulk checker?
Does it tell me who owns a domain, or when it expires?
How fresh is the data?
Should I buy a domain based on this result?
What does `parked_for_sale` tell me?
Guides for this Actor
- Bulk availability without WHOISScreening a naming shortlist against zone files instead of querying WHOIS per name: what it costs, what the verdicts mean, and where the method stops being enough.
- Probably free, not availableAbsence from a zone file usually means unregistered, and sometimes does not. The gap was measured against ICANN's own monthly registry reports rather than estimated, and it differs by TLD.