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? |
|---|---|---|
| developed | real, operating website | yes |
| parked | placeholder / ad page | yes |
| for_sale | listed on the aftermarket | yes |
| available | the domain does not resolve (NXDOMAIN) — usually unregistered | yes |
| unreachable | the name resolves, but nothing answers — a non-answer, not a verdict | no |
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 error — detail is human-readable and may change.
{
"error": "quota_exceeded",
"detail": "Monthly check quota exhausted. Upgrade your plan to continue.",
"code": 402
}
| code | when |
|---|---|
| 400 | invalid or missing domain. This one is a field-validation body ({"domain": ["…"]}), not the shape above |
| 401 | missing / invalid / revoked API key |
| 402 no_active_plan | no subscription on the account — choose a plan |
| 402 subscription_inactive | a payment failed — update billing in the portal. Do not start a new checkout; that opens a second subscription and bills you twice |
| 402 quota_exceeded | monthly quota spent — upgrade, or wait for the reset on the 1st. There is no automatic overage, so you never get a surprise bill |
| 429 rate | per-minute rate limit exceeded — see below |
| 429 too_many_in_flight | too many checks running at once on your account — lower your concurrency. Not a verdict, not billed; honour Retry-After (~2s) |
| 503 check_timeout | check still running — not a verdict. Honour Retry-After (~5s) and retry; not billed |
| 503 no_verdict | no 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) |
| 500 | unexpected 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.