Domain price comparison API
Compare what registrars charge for a domain ending as JSON: first year, renewal and transfer for each registrar, with the cheapest and the renewal traps marked. Free calls also read the renewal traps and the newest price changes.
- Without a key: every registrar's price for an ending (one ending a day outside the endings with a page on the website), the renewal traps the website shows and the newest confirmed price changes.
- With a key: the cheapest registrar for up to 100 endings at once, every renewal trap, the whole price change feed, and every stored price for one name.
- Free calls need no key: 60 calls an hour and 100 a day from one address.
Try it
curl -X GET "https://api.unique.domains/v1/prices/tlds/io"
const response = await fetch("https://api.unique.domains/v1/prices/tlds/io", {
method: "GET",
});
const data = await response.json();
console.log(data);import requests
response = requests.get(
"https://api.unique.domains/v1/prices/tlds/io",
)
print(response.json())req, err := http.NewRequest("GET", "https://api.unique.domains/v1/prices/tlds/io", nil)
if err != nil {
panic(err)
}
res, err := http.DefaultClient.Do(req)$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.unique.domains/v1/prices/tlds/io",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($ch);uri = URI("https://api.unique.domains/v1/prices/tlds/io")
request = Net::HTTP::Get.new(uri)
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }{
"data": [
{
"registrar": "cloudflare",
"name": "Cloudflare",
"homepageUrl": "https://www.cloudflare.com/products/registrar/",
"purchasePrice": 38.5,
"renewalPrice": 38.5,
"transferPrice": 38.5,
"currency": "USD",
"isPromo": false,
"renewalTrap": false,
"cheapest": true,
"cheapestRenewal": true,
"cheapestTransfer": true
}
],
"meta": {
"asOf": "2026-11-05T08:00:00Z",
"cursor": null,
"limit": null
},
"links": {
"self": "https://api.unique.domains/v1/prices/tlds/io",
"next": null,
"register": null,
"product": null,
"dataset": null
}
}Endpoints
/prices/tlds/{tld}Every registrar's list price for one ending, with the cheapest and trap marks.FreeGET/prices/cheapestThe cheapest registrar per ending for up to 100 endings.PaidGET/prices/trapsEndings whose cheapest first year renews at a trap price, alphabetical.FreeGET/prices/changesConfirmed registrar price changes across the nine, newest first.FreeGET/names/{name}/pricesEvery stored registrar quote for one name, and the renewal-trap flag.PaidWays to call it
npm install @uniquedomains/registrar-pricesnpx @uniquedomains/registrar-prices ioDomain price comparison API questions
Contact meIn which order are registrars listed?
The registrarsRegistrarThe company you buy and renew a domain through, such as Namecheap or GoDaddy. It does not own the name, it only registers it for you.Read the definition of our catalog in catalog order, then the others alphabetically. The answer is never sorted by price; a mark shows the cheapest first year.
What is a renewal trap?
An ending whose cheapest first year's renewalRenewalThe yearly fee that keeps a domain yours. You pay it for as long as you hold the name, and on some endings it costs far more than the first year did.Read the definition is at least twice the first year and at least $10 more. GET /prices/traps lists them alphabetically: free calls read the rows the website shows, a key reads them all.
Does it show promotional prices?
Yes. A promotional first year shows as the price, marked as a promotion. The regular price behind it needs a key.