Skip to content
DomainAgeLookup
Developer API

Domain age data your product can trust.

Query single domains, run bulk checks, and show usage-aware upgrade states from the same credit system used by the dashboard and Chrome extension.

Base URL
https://domainagelookup.com/api
Auth
Session, dal_ key, or anonymous lookup
Billing
1 credit / non-error result
Format
JSON over HTTPS
Single lookup
curl -X POST https://domainagelookup.com/api/lookup \
  -H "Authorization: Bearer dal_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"domain":"example.com"}'
Bulk lookup
curl -X POST https://domainagelookup.com/api/bulk-lookup \
  -H "Authorization: Bearer dal_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"domains":["example.com","unavailable.example","example.com"]}'
JavaScript
const response = await fetch("https://domainagelookup.com/api/lookup", {
  method: "POST",
  headers: {
    Authorization: "Bearer dal_your_api_key",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ domain: "example.com", refresh: true }),
})

const result = await response.json()
Endpoint reference
This is the public product API. Internal lookup-service endpoints are not client endpoints.
POST/api/lookup
{ success, data, usage }

Check one domain. Set refresh: true to bypass the normal cached-result path. Session, API key, and anonymous requests share lookup credit checks.

{ domain: string, refresh?: boolean }
POST/api/bulk-lookup
{ success, data, usage, invalid }

Check multiple domains. Accepted responses can contain per-domain errors; only non-error results consume credits.

{ domains: string[] }
GET/api/user/usage
{ success: true, data: UsageSummary }

Return usage for an authenticated profile. Anonymous lookup identities cannot use this endpoint.

Bearer key or session
GET/api/user/plan
{ success: true, data: PlanSummary }

Return plan limits, billing period, and billing status for an authenticated profile.

Bearer key or session
Integration notes
Security, billing, limits, and failure handling.

API keys are shown once, stored hashed, and can be revoked from the dashboard. Never ship a durable key inside frontend or extension code.

Bulk accepts up to 1,000 submitted values, then applies the plan limit after normalization. Malformed or non-string entries reject the request; invalid or duplicate strings are reported in invalid when a valid domain remains.

The invalid list reports at most 50 values. A successful bulk response can still include individual status: "error" results.

Treat status and error.code as machine fields. A top-level success: false response differs from an embedded bulk result error.

Single success response
{
  "success": true,
  "data": {
    "version": "v1",
    "domain": "example.com",
    "status": "registered",
    "dates": {
      "creation": "1995-08-14T04:00:00Z",
      "expiration": "2027-08-13T04:00:00Z",
      "lastUpdate": "2026-06-01T12:00:00Z"
    },
    "age": {
      "years": 30,
      "months": 10,
      "days": 6,
      "human": "30 years, 10 months",
      "totalDays": 11260
    },
    "registrar": { "name": "Example Registrar" },
    "nameservers": ["a.iana-servers.net"],
    "registryStatuses": ["active"]
  },
  "usage": { "used": 12, "limit": 25, "remaining": 13, "period": "day" }
}
Bulk partial response
{
  "success": true,
  "data": [
    { "version": "v1", "domain": "example.com", "status": "registered", "dates": { "creation": "1995-08-14T04:00:00Z", "expiration": null, "lastUpdate": null }, "age": null, "registrar": null, "nameservers": [], "registryStatuses": [] },
    { "version": "v1", "domain": "unavailable.example", "status": "error", "dates": { "creation": null, "expiration": null, "lastUpdate": null }, "age": null, "registrar": null, "nameservers": [], "registryStatuses": [], "error": { "code": "LOOKUP_UNAVAILABLE", "message": "Domain information is temporarily unavailable. Retry the request later." } }
  ],
  "usage": { "used": 13, "limit": 25, "remaining": 12, "period": "day" },
  "invalid": ["example.com"]
}
Limit response
{
  "success": false,
  "error": {
    "code": "LIMIT_REACHED",
    "message": "Lookup credit limit reached. Please upgrade your plan."
  },
  "upgradeUrl": "https://domainagelookup.com/pricing",
  "usage": { "used": 25, "limit": 25, "remaining": 0, "period": "day" }
}
Result fields
status
Stable machine status: registered, available, unknown, or error.
dates / age / registrar
Date values can be null. age and registrar can each be null when unavailable.
error.code / retryAt
Optional per-result fields for failed or retryable lookup results. Handle these separately from a top-level error response.
usage
Credit state after an accepted request is settled. Only non-error lookup results use credits.
Top-level errors
INVALID_DOMAIN
The lookup input is missing, invalid, malformed, or exceeds the supported size.
TOO_MANY_DOMAINS
The bulk request exceeds the 1,000 submitted-domain cap or the authenticated plan limit.
INVALID_API_KEY / UNAUTHORIZED
The supplied key is invalid or revoked, or an authenticated profile is required.
LIMIT_REACHED
The credit period is exhausted. This 429 response includes upgradeUrl and usage.
RATE_LIMITED
Too many lookup requests. This 429 response includes Retry-After: 60.
LOOKUP_UNAVAILABLE
The route could not return a usable lookup result. Retry later.
METHOD_NOT_ALLOWED
The endpoint does not support the requested HTTP method.