Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
openapi: 3.2.0
info:
title: Domain Sentinel Lookup API
description: Domain availability and registration data. One endpoint, usable anonymously (rate limited) or with an API key. Calls made with a key count towards a monthly quota set by the plan (500 on Free, 10000 on Pro, reset on the 1st, UTC).
version: 1.1.0
servers:
- url: https://api.domain-sentinel.com
tags:
- name: Lookup
paths:
/v1/lookup/{domain}:
get:
summary: Look up a domain
description: 'Returns availability and registration data for a domain. Sources: RDAP when the TLD has a registered server, WHOIS port 43 for curated registries, DNS delegation check otherwise. Anonymous callers are limited to 5 requests/minute and 50/day per IP.'
security:
- {}
- bearerAuth: []
parameters:
- name: domain
in: path
required: true
schema:
type: string
example: example.com
description: Full domain name to check
responses:
'200':
description: Lookup result
headers:
X-Quota-Limit:
description: 'With an API key: calls allowed this calendar month by the plan of the key owner'
schema:
type: integer
example: 10000
X-Quota-Remaining:
description: 'With an API key: calls left this month after this one'
schema:
type: integer
example: 9999
content:
application/json:
schema:
$ref: '#/components/schemas/DomainLookup'
'400':
description: Malformed domain
'401':
description: API key provided but invalid or revoked
'402':
description: Monthly quota of the plan reached (calls with an API key). Not billed; the quota resets on the 1st of the month, UTC.
content:
application/json:
schema:
$ref: '#/components/schemas/PlanLimit'
'429':
description: Rate limit exceeded (anonymous access)
'502':
description: Upstream registry unreachable
'503':
description: 'Registry busy and nothing known about this domain yet: { code: "REGISTRY_BUSY", retryAt } says when to try again'
tags:
- Lookup
operationId: getV1LookupByDomain
x-operation-id-source: derived
components:
schemas:
DomainLookup:
type: object
required:
- domain
- available
- entities
- nameservers
- statuses
- events
properties:
id:
type: string
format: uuid
domain:
type: string
example: example.com
available:
type:
- boolean
- 'null'
description: true = free, false = registered, null = unknown (see maybeAvailable)
checkMethod:
type: string
enum:
- rdap
- whois43
- dns
description: Data source used for this answer
maybeAvailable:
type: boolean
description: 'Present and true when the DNS check found no delegation: the domain may be free but no registry source could confirm it'
ldhName:
type:
- string
- 'null'
unicodeName:
type:
- string
- 'null'
handle:
type:
- string
- 'null'
rdapServer:
type:
- string
- 'null'
secureDNS:
type:
- boolean
- 'null'
delegationSigned:
type:
- boolean
- 'null'
lookedUpAt:
type: string
format: date-time
registryBusy:
type: object
description: 'Present when the registry was busy (at its rate limit or refusing for a while): the answer is the last known one, from lookedUpAt, and the registry can be asked again after retryAt. Not billed.'
properties:
retryAt:
type: string
format: date-time
entities:
type: array
items:
$ref: '#/components/schemas/Entity'
nameservers:
type: array
items:
$ref: '#/components/schemas/Nameserver'
statuses:
type: array
items:
type: string
events:
type: array
items:
$ref: '#/components/schemas/Event'
PlanLimit:
type: object
required:
- statusCode
- code
- limit
- message
properties:
statusCode:
type: integer
example: 402
code:
type: string
enum:
- PLAN_LIMIT
description: 'Stable code: the plan does not allow this call'
limit:
type: string
example: apiQuota
description: Which limit of the plan was reached
plan:
type: string
enum:
- FREE
- PRO
max:
type:
- integer
- 'null'
example: 500
current:
type: integer
example: 500
description: Calls already made this month
message:
type: string
Event:
type: object
properties:
eventAction:
type: string
example: expiration
eventDate:
type:
- string
- 'null'
format: date-time
Nameserver:
type: object
properties:
ldhName:
type: string
ipv4:
type: array
items:
type: string
ipv6:
type: array
items:
type: string
Entity:
type: object
properties:
role:
type: string
example: registrar
handle:
type:
- string
- 'null'
name:
type:
- string
- 'null'
organization:
type:
- string
- 'null'
ianaId:
type:
- string
- 'null'
abuseEmail:
type:
- string
- 'null'
abusePhone:
type:
- string
- 'null'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: API key created in the dashboard (ds_live_...)