dot·sweep

What a domain checker says when the registry will not answer

A registry that refuses you and a registry that tells you a name is free look nearly identical. Both answer RDAP with something that is not a record. A checker that reads the second case correctly and the first case the same way will tell you a name is available when somebody already owns it — the only wrong answer here that costs money.

The comparison everybody reaches for first cannot be run

The obvious experiment is to wait until a registry starts rate-limiting, then ask every availability API about the same name and see who gets it wrong. It does not work, and the reason is worth more than the experiment would have been.

A rate limit is applied to a source address, not to a question. Every API reaches a registry from its own infrastructure, so they are never throttled at the same moment. Measured here: this service was being refused by a registry while the same query from a laptop, one second later, answered instantly. Whoever ran that snapshot would have published a ranking of whose address happened to be busy that afternoon, and called it a ranking of whose logic is correct.

So the registry is the part we control

The test points each checker at an endpoint that returns exactly what a refusing registry returns, and records what the checker concludes. Every checker gets the identical response, which is the thing a live comparison can never offer. No registry is queried, none is named, and running it costs the domain name system nothing — which a test built on provoking real rate limits could not say.

Three refusals, and one control. The control matters: a checker that answers "unknown" to everything would pass a test made only of refusals, and would also be useless. It has to still say available when the registry actually says the name is free.

What the registry doesThe common patterndotsweep
Rate-limited (429) available sells a taken name estimated
Registry error (503) available sells a taken name estimated
Connection dropped available sells a taken name estimated
Registry answers: no such domain (404) available available

"The common pattern" is DNS first, then RDAP, treating any RDAP response that is not a record as proof the name is free. It is not a product. It is the shape found in tutorials and in checkers written without a reason to think about refusals, written out here so the failure can be reproduced rather than alleged. Naming products would need each one tested under conditions none of them can be put in at the same time, which is the problem this page opens with.

What the difference is, exactly

One line. The common pattern asks whether the response was a record. dotsweep asks what the registry said first: a 200 is a record, a 404 is a registry stating the name is free, and anything else — a 429, a 503, a dropped connection — is the registry not answering. Only the 404 is allowed to become an available. Everything else can become an estimate at best, and an estimate says so in the response.

That is why the last row matters as much as the first three. Refusing to answer is easy; refusing to answer only when the registry refused is the part that takes a decision table.

An estimate is not a right answer, it is a hedge. Reading estimated in that column as "correct" is the mistake this page could most easily cause. A domain can be registered with no nameservers, so an estimated available is a hint about a name nobody may be able to sell you — it says so in the response, and it is the reason the word is in the field at all.

Run it against your own

Serve 429 from a local endpoint, point your checker at it as a registry, and read what it tells you. If it says the name is available, it will say that about every name in that extension for as long as the registry keeps refusing — and rate limits arrive when you are checking many names at once, which is when you are least able to notice.

node -e 'require("http").createServer((q,r)=>{r.writeHead(429);r.end()}).listen(8099)'

The version of this used here runs in the test suite, under three refusal conditions and the control, and fails the build if dotsweep ever joins the column it is measuring. That is the only way a claim like this stays true: as an assertion that runs, not a paragraph on a page.

Check a name against the registries

curl https://dotsweep.com/check/example.com

No key, no account. The endpoint → · How this compares with other APIs →