louislam/uptime-kuma · warning · TranslatableError
domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint
Error message
domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint
What it means
checkSupport calls getRdapServer(publicSuffix), which looks up the root TLD in IANA's https://data.iana.org/rdap/dns.json services list. If no RDAP server is registered for that TLD, it returns null and this TranslatableError is thrown with publicSuffix in meta. Not every ICANN TLD operates an RDAP endpoint, so the domain can be valid yet unsupported for expiry lookups.
Source
Thrown at server/model/domain_expiry.js:236
throw new TranslatableError("domain_expiry_unsupported_missing_target");
}
const tld = parseTld(target);
// It must be checked first, filter out non-ICANN domains.
if (!tld.isIcann) {
throw new TranslatableError("domain_expiry_unsupported_is_icann", {
// If domain is null, use hostname as fallback for better error message.
domain: tld.domain ?? tld.hostname ?? "EMPTY DOMAIN",
publicSuffix: tld.publicSuffix,
});
}
const publicSuffix = tld.publicSuffix;
const rootTld = publicSuffix.split(".").pop();
const rdap = await getRdapServer(publicSuffix);
if (!rdap) {
throw new TranslatableError("domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint", {
publicSuffix,
});
}
return {
domain: tld.domain,
tld: rootTld,
};
}
/**
* @param {string} domainName Domain name
* @returns {Promise<DomainExpiry>} Domain expiry bean
*/
static async findByDomainNameOrCreate(domainName) {
let domain = await DomainExpiry.findByName(domainName);
if (!domain && domainName) {
domain = await DomainExpiry.createByName(domainName);View on GitHub (pinned to 6b5ea01557)
Solutions
- Confirm the TLD really has no RDAP by checking https://data.iana.org/rdap/dns.json directly — if the registry has since added RDAP, force a refresh.
- Force a refresh of the cached RDAP data: clear the relevant Settings entry (the module caches for one week and falls back to offline data) and restart so getRdapDnsData() re-fetches.
- If the TLD genuinely lacks RDAP, domain-expiry tracking is unavailable for that monitor; disable the option.
- Verify outbound HTTPS to data.iana.org works from the Uptime Kuma host (proxy/firewall can block the refresh).
Example fix
// before
const rdap = await getRdapServer(publicSuffix);
if (!rdap) {
throw new TranslatableError("domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint", { publicSuffix });
}
// after — also expose the root TLD for easier user messaging
throw new TranslatableError("domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint", {
publicSuffix,
rootTld: publicSuffix.split(".").pop()
}); Defensive patterns
Strategy: validation
Validate before calling
// Pre-check that an RDAP server exists for the TLD before enabling the feature
const { parse: parseTld } = require("tldts");
async function hasRdap(target) {
const { publicSuffix } = parseTld(target);
// mirror the helper in domain_expiry.js
const data = await (await fetch("https://data.iana.org/rdap/dns.json")).json();
const rootTld = publicSuffix?.split(".").pop();
return (data.services ?? []).some(([tlds]) => tlds.includes(rootTld));
} Try / catch
try {
await DomainExpiry.checkSupport(monitor);
} catch (e) {
if (e.msgi18n && e.message === "domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint") {
// TLD has no RDAP; expiry tracking is unavailable — disable it
}
} Prevention
- Keep the cached IANA RDAP list fresh by ensuring outbound HTTPS to data.iana.org works.
- For air-gapped instances, pre-seed the RDAP data via the settings table.
- Educate operators that some TLDs simply lack RDAP coverage.
When it happens
Trigger: A correctly-registered ICANN domain whose registry does not provide an RDAP server (some ccTLDs, some new gTLDs); the IANA RDAP list is stale or the cached entry in the settings table is empty; transient network failure fetching dns.json left a bad cache.
Common situations: Monitoring domains on smaller ccTLDs without RDAP coverage; air-gapped instances that cannot reach data.iana.org to refresh the list; an instance whose first fetch of dns.json failed and cached an empty services array.
Related errors
- domain_expiry_unsupported_is_icann
- domain_expiry_unsupported_monitor_type
- domain_expiry_unsupported_missing_target
- No Resolver Servers specified. Please specify at least one r
- passwordTooWeak
AI-assisted analysis of louislam/uptime-kuma@6b5ea01557 (2026-08-12).
Data as JSON: /api/errors/755112a4b69b1b46.
Report an issue: GitHub.