Reference

API reference

Domain Research API is a real-time domain status API: one authenticated GET per domain returns one status — developed, parked, for sale, available, or unreachable — checked live, never more than 15 minutes old.

Base URL

https://domainresearchapi.com

The API is served on its own hostname. Every path below is relative to it, and all requests are HTTPS.

Authentication

Create a key in your dashboard (pick a plan to get one) and send it as a header:

Authorization: Api-Key <your-key>

Access requires an active plan. Without one, the API returns 402.

Check a domain

GET /v1/domains/check?domain=example.com

Query parameter domain — a root domain (no subdomains, no IP addresses).

Example

curl -H "Authorization: Api-Key YOUR_KEY" \
  "https://domainresearchapi.com/v1/domains/check?domain=example.com"

Response 200

{
  "domain": "example.com",
  "status": "parked",
  "checked_at": "2026-07-16T09:14:22Z"
}

checked_at is when we actually looked (UTC, ISO 8601). Successful (200) responses also include the headers X-Plan and X-Quota-Remaining.

Freshness

Each call checks the domain against the live internet. If the same domain was checked within the last 15 minutes, that result is reused instead of re-run — so a status is never more than 15 minutes old. checked_at tells you exactly which case you got, so your own code can decide whether a verdict is fresh enough for the decision it's about to make. Nothing is ever served from a days-old snapshot.

Statuses

status meaning billed?
developedreal, operating websiteyes
parkedplaceholder / ad pageyes
for_salelisted on the aftermarketyes
availablethe domain does not resolve (NXDOMAIN) — usually unregisteredyes
unreachablethe name resolves, but nothing answers — a non-answer, not a verdictno

On available: this is a live web-presence signal, not registry truth. It means the domain did not resolve at the moment we checked. That is usually because it was never registered — but an expired, redeeming, or suspended domain does not resolve either, and those are still owned. If you need to know whether a domain can actually be registered, ask a registrar or an RDAP lookup — that is the authoritative source, and it is not what this API is.

Errors

Every non-2xx response carries the same shape. Branch on errordetail is human-readable and may change.

{
  "error": "quota_exceeded",
  "detail": "Monthly check quota exhausted. Upgrade your plan to continue.",
  "code": 402
}
code when
400invalid or missing domain. This one is a field-validation body ({"domain": ["…"]}), not the shape above
401missing / invalid / revoked API key
402 no_active_planno subscription on the account — choose a plan
402 subscription_inactivea payment failed — update billing in the portal. Do not start a new checkout; that opens a second subscription and bills you twice
402 quota_exceededmonthly quota spent — upgrade, or wait for the reset on the 1st. There is no automatic overage, so you never get a surprise bill
429 rateper-minute rate limit exceeded — see below
429 too_many_in_flighttoo many checks running at once on your account — lower your concurrency. Not a verdict, not billed; honour Retry-After (~2s)
503 check_timeoutcheck still running — not a verdict. Honour Retry-After (~5s) and retry; not billed
503 no_verdictno verdict available for this domain right now — not a verdict about the domain, and not billed. Nothing is still running, so retry later rather than immediately (Retry-After ~60s)
500unexpected error on our side — not billed. Safe to retry; if it persists it is a bug, not a verdict

Rate limit

60/min per account, and up to 4 checks in flight at once. Exceeding either returns 429 (rate or too_many_in_flight) — back off and retry. The limit is per account, not per key, so extra keys don't raise it. This is separate from your monthly plan quota, which returns 402 once exhausted.

A successful check (200) carries X-Plan and X-Quota-Remaining, so you can track usage without a second call.

Checking a list of domains

There is no batch endpoint — call the same endpoint once per domain. Each request is independent and returns one status.

Size your worker pool to the in-flight cap (4 concurrent) and your request rate to 60/min. A parallel map over a large list with no concurrency limit will hit 429 immediately — which costs you nothing (not a verdict, not billed) but gets you no data either. Honour Retry-After and keep a bounded queue.