Domain Availability Research at Scale: Building a Franchise Validation Pipeline for "Queen Of" Port Cities
Overview
Ticket t-f860fe03 required determining how many port cities worldwide have available queenof[city].com domains for a franchise concept where local tour operators would operate branded boat services. This task involved:
- Assembling a curated list of ~130 beautiful port cities
- Checking domain availability at scale without rate-limiting
- Authoritatively determining registration status via registry queries
- Recording results for business decision-making
The challenge: naive whois queries hit Verisign throttling within ~50 requests, returning "unknown" status for domains that might be available. The solution required switching to RDAP (Registrar Data Access Protocol)—Verisign's HTTP/JSON endpoint—which is authoritative, rate-resistant, and returns clean 404/200 responses.
Architecture and Implementation
File Structure
Created a modular checking system under /Users/cb/icloud-jada-ops/ticket-runner/:
check_queenof_domains.py— Primary domain checker using RDAP queriescheck_queenof_dream.py— Dream destination city variantcheck_queenof_us.py— US cities variantmaster_check.py— Orchestrates all three checksprobe_taken.py— Deep inspection of taken domains (whois, hosting probe, SSL inspection)
Output reports written as markdown:
QUEEN-OF-FRANCHISE-DOMAINS-2026-06-04.md— International port cities (~130 domains)QUEEN-OF-DREAM-DESTINATIONS-2026-06-04.md— Curated dream locationsQUEEN-OF-US-CITIES-2026-06-04.md— US port citiesQUEEN-OF-TAKEN-DOMAINS-2026-06-04.md— Detailed analysis of registered domains
RDAP-Based Availability Checking
The initial whois approach failed because Verisign's whois server implements IP-based rate limiting. After ~50 sequential queries from a single IP, responses degrade to "unknown" status, making it impossible to distinguish between "not yet queried by this IP" and "actually unregistered."
RDAP (RFC 7480/7481) solved this by:
- Using HTTP instead of raw socket queries, allowing more granular rate-limit headers
- Returning deterministic JSON responses: HTTP 404 = domain available, HTTP 200 = domain registered
- Being the official registry data access protocol (less throttled than legacy whois)
Example query pattern:
curl -s "https://rdap.verisign.com/com/v1/domain/queenofsandiego.com" | jq .status
# Returns: ["active"] → domain IS registered
# Returns: 404 → domain IS available
The Python wrapper in check_queenof_domains.py:
- Iterates through city list
- Constructs
queenof{city}.comdomain names - Fires RDAP queries (with backoff for rate limits)
- Logs status: AVAILABLE, TAKEN, ERROR
- Compiles markdown report with statistics
Validation Domain (Control Test)
To verify the checker was working correctly, we used queenofsandiego.com as a known-taken control. The domain is legitimately registered and points to infrastructure. Initial whois queries reported "unknown" due to rate limiting, but RDAP correctly returned HTTP 200 with active registration status, confirming the approach.
Deep Inspection of Taken Domains
After determining which domains were registered, probe_taken.py performed follow-up analysis:
- Whois records: Registrar, registration date, nameserver details
- DNS resolution: Nameserver queries to determine if domain points to live hosting
- HTTP probing: Attempting to resolve and connect to the domain's IP to identify what's hosted (live website, parked page, S3 bucket error, etc.)
- SSL certificate inspection: Fetching cert details to understand hosting provider and date of last update
This yielded actionable intelligence: which taken domains were truly active businesses vs. speculative registrations or abandoned domains.
Results and Reporting
Across three city lists:
- International franchise domains (~130): X available, Y taken
- Dream destinations (~50 curated): X available, Y taken
- US port cities (~30): X available, Y taken
Each report included:
- Summary statistics
- Complete list of available domains (immediately actionable for registration)
- Complete list of taken domains with registrar and probe results
- Timestamp and methodology notes
Key Technical Decisions
Why RDAP Over Whois
whois is the legacy standard for domain queries, but it's vulnerable to rate limiting at the transport layer. Verisign's whois server throttles by IP, not by auth token or account. RDAP, by contrast, is the modern registry access protocol and is explicitly designed for programmatic, at-scale queries. Using RDAP meant we could reliably check 130+ domains without hitting unknown responses.
Modular Checker Design
Rather than one monolithic script, we created separate checkers for:
- Franchise domains (international port cities)
- Dream destinations (curated travel locations)
- US cities (domestic focus)
This allows different city lists to be maintained independently and re-run on different schedules. The master_check.py orchestrator runs all three and combines results for the ticket reporter.
Separation of Availability Check and Deep Probe
check_queenof_domains.py answers: "Is this domain registered?" probe_taken.py answers: "What's actually hosting on this domain?" Keeping these separate makes the pipeline faster (probing is I/O-heavy and optional) and clearer (each script has one responsibility).
Integration with Ticket System
Results were formatted as markdown reports and stored alongside ticket metadata, allowing the ticket system to reference them for business decisions. The clean AVAILABLE/TAKEN/ERROR categorization makes it trivial to extract actionable domain lists (domains ready to register, domains already claimed by competitors).
What's Next
- Domain registration pipeline: Auto