Choosing TLDs
By level
--level filters the --tld list by where the name would actually sit:
| Value | Keeps | Count under --tld all |
|---|---|---|
any (default) |
everything | 1329 |
second |
plain TLDs — apple.com, apple.de |
944 |
third |
multi-label suffixes — apple.co.uk, apple.com.au |
385 |
Handy for --tld all, which otherwise sweeps hundreds of restricted zones
(gov.bd, ernet.in, edu.gt) you cannot register under anyway. A full domain
typed out by hand is always checked as given — --level only filters TLD lists.
By length
--cctld keeps only country-code TLDs — the two-letter ones, which is exactly
what ICANN reserves for ISO 3166-1 country codes:
ds apple --tld all --cctld # 538 (includes co.uk, com.au, ...)
ds apple --tld all --cctld --level second # 173 bare ccTLDs: de, io, jp, ...
--tld-len is the general form, measured on the last label so co.uk counts
as 2:
| Spec | Keeps | Count under --tld all |
|---|---|---|
--tld-len 2 |
two-letter (same as --cctld) |
538 |
--tld-len 3 |
com, net, xyz, … |
157 |
--tld-len -3 |
three characters or fewer | 695 |
--tld-len 4- |
four or more | 634 |
Brand and reserved TLDs
Some TLDs are not on sale to anybody. .aws, .google, .bmw and 364 others
are brand TLDs: the registry operator is the only party that may hold a
name in the zone, so a lookup for mybrand.aws truthfully answers “no such
domain” — which reads as AVAILABLE and is worth nothing. .arpa and the names
the IETF reserves (.test, .example, .invalid, .localhost, .local,
.onion) are closed for the same practical reason.
ds reports those as PRIVATE rather than AVAILABLE, with the reason and
the operator attached:
ds mybrand --tld aws
! mybrand.aws PRIVATE - rdap 312ms .aws is a brand TLD — only AWS Registry LLC registers names there (ICANN Spec 13)
They are left out of --tld all, --tld rdap and --tld popular by
default — 368 of the 1697 TLDs in all, so a sweep is a fifth shorter and
carries no dead ends. The run says so when it happens. A TLD you name yourself
is always checked; the default only prunes the lists ds picks for you.
--private |
Effect |
|---|---|
| (unset) | excluded from all / rdap / popular; a TLD you name is still checked |
exclude |
excluded everywhere, a hand-written --tld list included |
include |
checked, and still reported PRIVATE |
only |
check nothing else — what a sweep is skipping |
ds mybrand --tld all --private include # all 1697, brands marked PRIVATE
ds mybrand --tld all --private only # just the 368 closed ones
The classification is bundled as private-tlds.json and comes from ICANN’s
machine-readable registry-agreement
list. A
registry that runs its TLD purely for itself applies for Specification 13,
the “.brand TLD” exemption from the registrar non-discrimination rules, and
that flag is what ds reads — a dated, first-party, checkable fact rather than
a hand-picked list of famous names. Regenerate it with node scripts/build-private-tlds.mjs.
The converse is deliberately not asserted. A TLD missing from that file is
not thereby claimed to be registrable; ds simply makes no claim and reports
whatever the registry said. So .app and .dev — Google-run, but with no
Specification 13 and sold through ordinary registrars — are ordinary TLDs here,
and every ccTLD is left exactly as it was.
These pages are generated from the docs in the repo, so they never drift from what ships with the binary.