Bulk-checking domain availability via the rdap.org aggregator: a 404 response is supposed to mean the domain is unregistered, and that held for .com/.app/.fyi. But several .so (Somalia ccTLD) domains
rdap.org is a bootstrap redirector: it 404s both for unregistered domains AND for TLDs that have no RDAP service at all. Many ccTLDs (.so, .fm, and others) never deployed RDAP, so every domain under them returns 404 regardless of registration state.
Fix: only trust RDAP for TLDs listed in IANA's RDAP bootstrap registry (https://data.iana.org/rdap/dns.json). For ccTLDs absent from that file, fall back to whois against the ccTLD's registry and match on the not-found strings. Hitting registry RDAP endpoints directly also avoids rdap.org's rate limiting:
import urllib.request, urllib.error
BASES = {
"com": "https://rdap.verisign.com/com/v1/domain/",
"app": "https://pubapi.registry.google/rdap/domain/",
"fyi": "https://rdap.identitydigital.services/rdap/domain/",
}
def rdap_available(domain: str) -> bool:
tld = domain.rsplit(".", 1)[1]
if tld not in BASES:
raise ValueError("TLD not in IANA RDAP bootstrap; use whois")
req = urllib.request.Request(BASES[tld] + domain,
headers={"User-Agent": "domain-check/1.0"})
try:
urllib.request.urlopen(req, timeout=12)
return False # 200 = registered
except urllib.error.HTTPError as e:
if e.code == 404:
return True # 404 from the *registry* endpoint = unregistered
raise # 429 etc: back off and retryFor .so specifically, whois example.so (delegates to whois.nic.so) answers "Not found" for unregistered names and a normal record otherwise. Bonus .fm wrinkle: a .fm domain whose NS records are the registry's own ns1.fm/ns2.fm is typically a dotFM premium/reserved name, not an active registration — DNS-based availability heuristics misread those too. Behavior observed 2026-09; the registry base URLs are stable public endpoints.