Home / Domain availability API
Domain availability API
One POST, one answer. Free, with a key.
Quick start
Create a free account, generate a key at /api-keys, and call it. No card, no approval step, no sales call.
curl -X POST https://dotseeka.com/api/v1/check \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"domains": ["example.com", "exwalk.io"]}'
The response is the whole answer — there is no job to poll and no webhook to receive:
{
"results": [
{"domain": "example.com", "status": "taken", "source": "dotseeka-registry"},
{"domain": "exwalk.io", "status": "available", "source": "dotseeka-registry"}
],
"counts": {"available": 1, "taken": 1, "unknown": 0},
"skipped": [],
"took_ms": 212
}
One domain, one line
curl https://dotseeka.com/api/v1/check/example.com \
-H "Authorization: Bearer ds_live_YOUR_KEY"
Three states, not a boolean
This is the part worth reading before you integrate. Most availability APIs return true or false, which forces them to pick a side when a registry does not answer clearly.
| status | What it means | What your code should do |
|---|---|---|
available | No registry record, and it does not resolve in DNS | Safe to offer it |
taken | A registry record exists, or it resolves | Do not offer it |
unknown | Rate-limited, timed out, or ambiguous | Retry later — never show it as free |
Treat unknown as 'not available' in any flow where being wrong costs money. A false available is the only wrong answer with a price attached.
What each field means
| Field | Meaning |
|---|---|
domain | The name as it was checked, lower-cased |
status | available, taken or unknown — never a boolean |
source | That the answer came from registry data for this request, not from a cached list. Present so you can prove provenance to whoever asks. |
counts | A tally per status, so you do not have to fold over the array |
skipped | Inputs that were not checkable, with the reason — an unparseable name is reported, not dropped |
took_ms | Server-side time for the whole batch |
There is no cached field because nothing is served from a cache. Each call is a fresh lookup, which is why a batch of 50 takes a second or two rather than milliseconds. Availability changes by the minute, and a result from an hour ago is a guess wearing a timestamp.
Limits
| Limit | Value |
|---|---|
| Domains per request | 50 |
| Calls per day | 1,000 |
| Domains per day | 5,000 |
| Keys per account | 5 |
| Price | Free |
Limits are per account, not per IP address, so they follow you across servers. They reset at midnight UTC. If you need more, say so — the ceiling is there to protect the registries we query, not to sell you an upgrade.
Errors
| Code | error | Meaning |
|---|---|---|
| 401 | missing_key | No Authorization header |
| 401 | invalid_key | Key is wrong or revoked |
| 400 | no_valid_domains | Nothing parseable in the array |
| 400 | too_many_domains | More than 50 in one request |
| 429 | daily_limit | Out of calls for today |
| 429 | daily_domain_limit | Out of domains for today |
Checking a key
curl https://dotseeka.com/api/v1/me \
-H "Authorization: Bearer ds_live_YOUR_KEY"
Returns the account and what is left of today's allowance. Useful as a health check in CI.
What it queries
Each name goes to its registry's own RDAP service, found through the IANA bootstrap registry, falling back to port-43 WHOIS when RDAP cannot answer. That covers 1,200+ endings. No reseller inventory and no cached zone file, so there is no snapshot lag between the registry and the answer you get.
Any available verdict is additionally checked against DNS. If the name resolves, it comes back taken — which is what makes ox.ac.uk correct, where a naive RDAP-only check reports it free.
Input it accepts
| You send | It checks |
|---|---|
exwalk | exwalk.com |
exwalk.com | exwalk.com |
https://ox.ac.uk/x | ox.ac.uk |
x@mail.com | mail.com |
Unparseable entries are returned in skipped rather than failing the request, so one bad row in a list does not cost you the other forty-nine.