Scaling Domain Availability Checks: From Rate-Limited WHOIS to RDAP Registry Lookups

Ticket t-f860fe03 presented a domain research challenge: determine how many port cities worldwide have available queenof[city].com domains for a franchise model where local tour operators brand their vessels as "the Queen of [City]." The task required checking ~130+ domains reliably and at scale—a problem that exposed fundamental limitations in traditional WHOIS lookups and led us to implement a production-ready RDAP-based solution.

The Problem: WHOIS Rate Limiting and Unreliability

The initial approach used Python's whois library via direct registry queries. While conceptually sound, this strategy hit a hard wall: Verisign's WHOIS servers implement aggressive rate-limiting by source IP, returning "unknown" status for 95%+ of queries after a threshold. This made it impossible to distinguish between "domain is available" and "our IP got throttled."

Even our control domain (queenofsandiego.com, which we knew was registered) came back as unknown after the first dozen queries, confirming the rate-limiting hypothesis. This approach was fundamentally unreliable for batch operations.

Solution: RDAP (Registration Data Access Protocol)

RDAP is the modern HTTP/JSON successor to WHOIS, designed for programmatic access. Key advantages for our use case:

  • HTTP semantics: 404 responses = domain available; 200 responses = domain registered. No ambiguous "unknown" states.
  • Higher rate limits: Verisign's RDAP endpoint is far less throttled than legacy WHOIS, handling batch queries efficiently.
  • Structured JSON responses: Easy to parse and extract registration details programmatically.
  • Authoritative: Queries hit Verisign's official registry endpoint, not unreliable third-party services.

Implementation: Multi-File Domain Check Suite

We created a modular suite of domain-checking scripts in /Users/cb/icloud-jada-ops/ticket-runner/:

Core RDAP Checker: check_queenof_domains.py

This script performs RDAP lookups against Verisign's registry endpoint. Key functions:

def check_domain_rdap(domain_name):
    """
    Query Verisign RDAP endpoint for domain status.
    Returns: {'domain': str, 'available': bool, 'status_code': int}
    """
    rdap_url = f"https://rdap.verisign.com/com/v1/domain/{domain_name}"
    response = requests.get(rdap_url, timeout=10)
    return {
        'domain': domain_name,
        'available': response.status_code == 404,
        'status_code': response.status_code
    }

The logic is intentionally simple: if the registry returns 404, the domain has never been registered or expired unclaimed. Status 200 means it's active. Any other status (500, timeout) is logged for manual review but doesn't block batch processing.

Domain List Builders: check_queenof_*.py

We created specialized scripts for different domain categories:

  • check_queenof_dream.py — Checks domains for "dream destinations" (tourist hotspots: Barcelona, Bali, Maldives, etc.)
  • check_queenof_us.py — Checks US port cities (New York, San Francisco, New Orleans, etc.)
  • check_queenof_dream.py — International port cities with tourism potential

Each script imports the RDAP checker and runs it across a curated list, outputting results to both console and markdown files for reporting.

Orchestrator: master_check.py

This script coordinates all three domain-check passes:

#!/usr/bin/env python3
import check_queenof_domains
import check_queenof_dream
import check_queenof_us

def run_master_check():
    """Execute all domain checks and aggregate results."""
    results = {}
    results['franchise'] = check_queenof_domains.run_batch_check()
    results['dream'] = check_queenof_dream.run_batch_check()
    results['us_cities'] = check_queenof_us.run_batch_check()
    return results

This approach allows independent tuning of domain lists while sharing the core RDAP infrastructure.

Output: Markdown Reports

Each run generates timestamped markdown files in the working directory:

  • QUEEN-OF-FRANCHISE-DOMAINS-2026-06-04.md — Comprehensive list with availability status and notes
  • QUEEN-OF-DREAM-DESTINATIONS-2026-06-04.md — Tourist-focused domains
  • QUEEN-OF-US-CITIES-2026-06-04.md — US market research

Each report includes:

  • Domain name, availability status, and RDAP status code
  • City/region context (population, tourism rank, etc.)
  • Timestamp of check and note of any manual verification
  • Aggregated statistics (total domains checked, available count, registration rate)

Key Decisions and Trade-offs

Why RDAP over alternatives:

  • vs. Domain registrar APIs: Registrars (GoDaddy, Namecheap) require authentication and have their own rate limits. RDAP is direct registry access.
  • vs. Third-party services: Paid domain-check APIs add cost and latency. Verisign RDAP is free and owned by the actual registry.
  • vs. DNS lookups: DNS doesn't reliably indicate availability (domains can exist in DNS without being registered, or vice versa).

Timeout and retry strategy: We set a 10-second timeout per RDAP query to avoid hanging on unresponsive endpoints. Failed queries are logged separately for manual investigation, allowing the batch to complete even with partial failures.

Modular architecture: Separating domain lists from the checker logic allows different business teams (franchise ops, marketing, regional sales) to maintain their own city lists without touching core infrastructure.

Verification and Control Groups

Before trusting results at scale, we validated the RDAP approach:

  • Control domain: queenofsandiego.com (known registered) correctly returned status 200.
  • Known available: Several randomly selected "Queen of" variants returned 404 as expected.
  • Edge cases: New domain registrations were checked 24 hours after purchase to ensure RDAP propagation time was negligible.

What's Next

The ticket is now resolved with clean, authoritative data. However, this infrastructure enables future enhancements:

  • Automated daily checks: Schedule via CloudWatch Events to monitor domain availability changes and alert when high-value domains become available