- pulls every registrar as Name + IANA ID (robust to things like
Sav.com, LLC - 1 - 3909by taking the last number), - grabs the Country/Territory list too,
- de-dupes,
- and downloads three CSVs: all registrars, Gname-only, and countries.
// Paste into DevTools (F12) on the ICANN page, press Enter
(() => {
const getText = el => (el.textContent || '').trim();
const spans = [...document.querySelectorAll('label.search-drop-down__item span')];
const texts = spans.map(getText).filter(Boolean);
// Separate registrars (end with " - digits") from countries (no trailing digits)
const registrarRows = [];
const countryRows = [];
for (const t of texts) {
const m = t.match(/^(.*)\s-\s(\d+)$/); // capture final " - ####"
if (m) {
const name = m[1].trim();
const iana = m[2].trim();
registrarRows.push({ name, iana, raw: t });
} else if (!/^(Select|Search)$/i.test(t)) {
countryRows.push({ country: t });
}
}
// De-dupe registrars by (name|iana); countries by name
const dedupe = (rows, keyFn) => {
const seen = new Set();
return rows.filter(r => {
const k = keyFn(r);
if (seen.has(k)) return false;
seen.add(k);
return true;
});
};
const registrars = dedupe(registrarRows, r => `${r.name}|${r.iana}`);
const countries = dedupe(countryRows, r => r.country.toLowerCase());
// Subset: Gname*
const gname = registrars.filter(r => /^gname\b/i.test(r.name));
// CSV helpers
const toCSV = (rows, headers) => {
const esc = v => `"${String(v ?? '').replace(/"/g, '""')}"`;
const head = headers.map(h => esc(h.label)).join(',');
const body = rows.map(r => headers.map(h => esc(r[h.key])).join(',')).join('\n');
return head + '\n' + body;
};
const dl = (filename, text, type = 'text/csv') => {
const blob = new Blob([text], { type });
const a = Object.assign(document.createElement('a'), {
href: URL.createObjectURL(blob),
download: filename
});
document.body.appendChild(a);
a.click();
a.remove();
};
// Build and download CSVs
const regHeaders = [
{ key: 'name', label: 'Registrar' },
{ key: 'iana', label: 'IANA' },
{ key: 'raw', label: 'Original Label' } // keeps lines like "Sav.com, LLC - 1 - 3909"
];
dl('icann-registrars.csv', toCSV(registrars, regHeaders));
dl('icann-registrars-gname.csv', toCSV(gname, regHeaders));
const countryHeaders = [{ key: 'country', label: 'Country/Territory' }];
dl('icann-countries.csv', toCSV(countries, countryHeaders));
console.log(`Registrars: ${registrars.length} (Gname: ${gname.length})`);
console.log(`Countries: ${countries.length}`);
})();
Want me to tweak it to also split out other families (e.g., Sav.com shards, SNAPNAMES ##, LLC, etc.) or output JSON instead of CSV?
Key terms in plain language
Open a term for a concise explanation of language used on this page.
Broadband
A general term for always-on, high-speed Internet access. Broadband can be delivered over fiber, cable, DSL, fixed wireless, cellular, or satellite networks.
Cloud Computing
Computing resources—such as applications, servers, storage, or databases—delivered from remote infrastructure and scaled as requirements change.
Cybersecurity
The practices and controls used to protect identities, devices, networks, applications, and data from unauthorized access, disruption, or manipulation.
Identity and Access Management (IAM)
The systems and policies that determine who a user is, what resources they may access, and how that access is authenticated and reviewed.
API
An application programming interface is a defined way for software systems to exchange data or request functions from one another.
Artificial Intelligence (AI)
Software designed to perform tasks involving prediction, classification, generation, reasoning, or decision support. Business use still requires clear data, governance, security, and human accountability.