Skip to content

Prices

The price column is the average first-year registration price for the TLD, in USD, from the bundled pricing.json — 881 TLDs, from $3.76 to $7138.99. The file lists one entry per registrar per TLD, so where several registrars quote a price the column is the mean of them:

{
  "com": [
    { "register": "101domain.com", "prices": { "regular": 14.99, "renew": 19.99, "transfer": 13.99 } },
    { "register": "namecheap.com", "prices": { "regular": 14.98, "renew": 18.48, "transfer": 14.98 } },
    { "register": "porkbun.com",   "prices": { "regular": 11.08, "renew": 11.08, "transfer": 11.08 } }
  ]
}

register names the registrar that published the quote, which is also what --where reads to say who actually sells a TLD — so keep it accurate if you edit the file.

Multi-label suffixes are looked up longest-first, as for WHOIS servers, so .co.uk gets its own price rather than .uk’s. A TLD none of them price shows -, which is still most of the root: ds knows of far more TLDs than anyone publishes a retail price for.

Treat these as list prices, not quotes. They are a snapshot of published registrar pricing: regular is the first year, which is routinely a fraction of what the name then costs to keep — .site is a couple of dollars to register and forty-odd to renew — so read it next to renew rather than as a yearly cost. ICANN fees, taxes, premium names and time-limited promotions all move the real number again, and a registry may not sell the TLD to you at all (see Where to register). --json carries the renewal price, the currency and how many registrars went into the mean:

"price": { "register": 13.68, "renew": 16.52, "currency": "USD", "registrars": 3 }

Prices you have actually been quoted beat a bundled snapshot — see Your own prices for how to supply them.

Where the prices come from

pricing.json is harvested from registrars, not registries. Registries sell wholesale to accredited registrars under contract and, outside the ICANN gTLD agreements whose fees are per-registry PDFs rather than a feed, they publish no retail price at all — there is no price a registry charges you. So the table is the mean over the registrars that will actually sell you the name:

Source TLDs How
101domain 754 one page per TLD, enumerated from their sitemap
Porkbun 634 public JSON pricing endpoint, no key
Namecheap 569 earlier manual snapshot; their list page and API are both closed to scripts
get.bd 12 the .bd family, at BTCL’s own list prices; the only source that prices it

Coupon codes and banner promotions are not scraped — only standing shelf prices.

Three of those four sources quote USD and are taken as they come. get.bd quotes Bangladeshi taka, and is converted, because the alternative was that ds priced .bd off a single foreign reseller at eight times the registry’s own list price and priced .com.bd — the zone a Bangladeshi actually registers — not at all.

The conversion is not silent. A converted offer keeps what the source published beside the USD figure, so a derived number is always tellable from a quoted one:

{
  "com.bd": [
    {
      "register": "get.bd",
      "prices": { "regular": 6.57, "renew": 15.03 },
      "quoted": { "currency": "BDT", "regular": 805, "renew": 1840,
                  "rate": 122.453121, "as_of": "2026-08-25",
                  "source": "https://get.bd/pricing.php" }
    }
  ]
}

The rate is fetched per run from a named source and the harvest fails rather than fall back to a stale constant, but a converted price still drifts between harvests in a way a USD one does not — quoted.as_of is what says how far.

scripts/harvest-prices.mjs rebuilds the file, and documents each source and its limits at the top:

node scripts/harvest-prices.mjs --dry-run          # fetch and report, write nothing
node scripts/harvest-prices.mjs --sources porkbun  # one source (a single request)
node scripts/harvest-prices.mjs                    # all of them; the crawl takes ~20 min

These pages are generated from the docs in the repo, so they never drift from what ships with the binary.