dot·sweep

POST /check — check up to 10 domains at once

No API key, no account, no signup. Responses are JSON, CORS is open, and every endpoint is read-only — nothing here can register, buy or change anything.

Request

curl -X POST https://dotsweep.com/check \
  -H 'Content-Type: application/json' \
  -d '{"domains": ["a.com", "b.io"]}'

Response

Returns {"results": [...]}, where each entry has the shape GET /check/{domain} documents. Order matches the request. At most 10 domains — more returns batch_too_large.

Read confidence before status

certain means a registry answered. Act on it.

estimated means no registry answered and the verdict came from DNS. A domain can be registered with no nameservers, so an estimated "available" is a hint. note says why the answer stayed estimated.

An unreachable or rate-limited registry is never reported as available. That is the whole reason to call this rather than whois: a raw WHOIS reports a throttled registry as free, and a throttled registry is exactly what you get when you check a lot of names at once.

Batching buys throughput, not speed

The rate limit counts requests, not domains, so ten per request buys ten times the throughput: 120 requests a minute is 1,200 domains a minute. Checking 500 names is 50 batch calls, or 500 individually-limited GETs.

It is not faster per domain, and expecting that will mislead you. A Worker holds six simultaneous outgoing connections, so a batch serialises internally. The reason to batch is the rate limit.

Nothing is lost by batching. The same per-domain edge cache is consulted internally, so names already checked by someone else still come back without a registry lookup.

Where the ceiling of 10 comes from

One domain costs two to five subrequests against a platform limit, and every domain in a batch can share an extension, so all ten can land on one registry host. That is also why widening GET concurrency is the wrong lever: it spends the same budget faster for the same work, and a burst is what earns a 429 in the first place.

Errors

{ "error": { "code": "invalid_domain", "message": "...", "hint": "..." } }

Codes: invalid_domain, bad_body, batch_too_large, rate_limited, unknown_endpoint, method_not_allowed, internal_error. The hint says what to do differently. For anything other than rate_limited and internal_error, repeating the same call fails the same way.

Rate limit

120 requests a minute per client, counted as requests rather than domains. Edge cache hits never reach the Worker and are not counted at all.

That rate is the whole quota. There is no daily or monthly ceiling, no credit balance and no trial that expires, so a job that stays under the rate can run as long as it needs to. Said plainly because an unstated limit gets read as a hidden one, and a caller who plans around a monthly cap is planning around nothing.

The other endpoints

The whole reference on one page → · as plain text →