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.
curl -X POST https://domainagelookup.com/api/lookup \
-H "Authorization: Bearer dal_your_api_key" \
-H "Content-Type: application/json" \
-d '{"domain":"example.com"}'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"]}'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()Check one domain. Set refresh: true to bypass the normal cached-result path. Session, API key, and anonymous requests share lookup credit checks.
Check multiple domains. Accepted responses can contain per-domain errors; only non-error results consume credits.
Return usage for an authenticated profile. Anonymous lookup identities cannot use this endpoint.
Return plan limits, billing period, and billing status for an authenticated profile.
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.
{
"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" }
}{
"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"]
}{
"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" }
}