Martin Schleiss

@mschleiss

How I ended up looking at 4000+ .xyz domains and found this shocking fact

24 Aug 2018

Recently I launched my new site Remote Hunter. It’s a site for people who want to find remote job openings because they want to work from home, don’t want to commute to work, hate cubicles, have no opportunities around them or want to spend their time more around their loved ones.

You may now think: “Aren’t there already thousands of these job boards out there? What do you think you can bring to the table?”. I am glad you ask, compared to all other sites Remote Hunter doesn’t simply aggregate existing boards but rather helps people with their application by having it reviewed first. They are checked for grammar mistakes and general wording issues.

Well, what does that have to do with .xyz domains? My job board needed a domain. I wanted a name that could be used for marketing purposes in the future while still not being too long. .com domains are notoriously overbooked. Getting a good .io domain is hard nowadays too, except you name your site something like theropoda.io.

Dinosaur

But, who wants their site called like that or even have their branding revolve around that? Actually, it isn’t that bad :D I like to digress, sorry. I wanted a domain that can be used for marketing purposes, the name had something to do with the topic and the name could be easily remembered, which theropoda.io isn’t. Sorry I hope you didn’t buy it yet.

In the future, I would like to do marketing around the phrase job hunting but specifically for remote jobs. Also the people who look for a job can be called job hunters. Hence, I came up with the name Remote Hunter. Funnily though, the .io domains weren’t on sale anymore after I found a name that was still available but the .xyz domains were on sale for $4.99 for the first year. So I chose .xyz rather than .io.

Given that Google’s parent company Alphabet uses abc.xyz to release their earnings, a .xyz domain can’t be that bad. Also it would prove itself as a little SEO example whether I can get a .xyz domain to rank on Google well. You know what’s kinda odd? I don’t visit any .xyz domains on a daily basis nor do I see any .xyz sites linked anywhere. Do you?

Personally I would have preferred hunter.xyz or just remote.xyz. But hunter.xyz is a page with just a footer and remote.xyz can be bought if you place a bid. Given the popularity of remote job boards, I can only wonder for how much that person would agree to settle on a transaction.

After seeing that remote.xyz was for resale and wasn’t monetized actively by a business, I was wondering: How many other sites are there for resale and have no business behind them. It’s a real pity if there are names available that could be used to spin up a company but somebody wants to make a quick buck by flipping a site that normally costs $11.99/year for $2000 or more. Bootstrapping a company from scratch is already hard enough as I experienced with my first site for kanji mnemonics.

First, I tried a few names like elk.xyz, hamster.xyz (999€) or cat.xyz. I also tried edible names like raspberry.xyz, pear.xyz or melon.xyz ($1000). They either have a blank site or are for resale.

That sucks. Because from a branding perspective they would be perfect. You could start a company called Cat SEO where your mascot would be a cute little kitten. Just think about the marketing possibilities if executed well.

Photo by Taylor Grote on Unsplash [Unsplash]

So I wrote a little NodeJS application which allowed me to take a closer look at the state of .xyz domains. I have pasted it below in case you want to run the same experiment with a different top level domain.

import * as request from "request";
import * as fs from "fs";
import { Parser as J2CParser } from "json2csv";
import * as dns from "dns";
import { isNullOrUndefined } from 'util';
import * as parse from "csv-parse";

const indicators = [
["domain", "is for sale"],
["website", "zum verkauf"],
["domains"],
["domain name"],
["buy", "domain"],
["is available", "domain"]
];

const javascript_resale_redirect = [
"pheenix.com",
"uniregistry.com",
"undeveloped.com",
"eftymarket.com",
"isunward.com",
"digitalassets.xyz",
"domaincostclub.com"
];

let resellers = [
"www.pheenix.com",
"uniregistry.com",
"undeveloped.com",
"eftymarket.com",
"isunward.com",
"digitalassets.xyz",
"www.domaincostclub.com"
];

let file = fs.readFileSync("wordlist.csv").toString();

parse(file, { columns: true }, async (err, data) => {

type result_type = {
word: string,
domain: string,
resale: boolean,
reseller: boolean,
redirects_to: string | null,
free: boolean,
premium: boolean,
fetch_error: boolean
};

let csv_counter = 0;

let wait_list = new Array<Promise<result_type>>();
let result = new Array<result_type>();

for (let word of data) {

let domain = word.Word.toLowerCase() + ".xyz";
if (wait_list.length >= 5) {
let r = await Promise.all(wait_list);
result = result.concat(r);
wait_list = new Array();

let parser = new J2CParser();

let csv = parser.parse(result);

fs.writeFileSync(`xyz${csv_counter}.csv`, csv);
csv_counter++;
console.log(csv_counter);
}

let promise = new Promise<result_type>(resolve => {

// Check if a DNS entry exists for the domain

dns.resolve4(domain, async (err, a) => {
let exists = isNullOrUndefined(err);

if (exists) {
request({
url: "http://" + domain,
timeout: 5000,
headers: { 'Accept': '*/*', 'User-Agent': 'request' }
}, (err, response, body) => {

if (!err) {
if (response.request.uri.host == "gen.xyz") {

// Premium domain

resolve({
word: word.Word,
domain: domain,
free: true,
premium: true,
redirects_to: "gen.xyz",
resale: false,
reseller: false,
fetch_error: false
});
return;
} else if (resellers.indexOf(response.request.uri.host) != -1) {

// Domain definitely for resale

resolve({
word: word.Word,
domain: domain,
free: false,
premium: false,
redirects_to: response.request.uri.host,
resale: true,
reseller: true,
fetch_error: false
});
return;
}

let redirects_to = null;

if (response.request.uri.host != domain) {
redirects_to = response.request.uri.host;
console.log(`Redirect: ${domain} => ${response.request.uri.host}`)
}

body = body.toLowerCase();
body = body.replace(/&nbsp;/g, " ");
body = body.replace(/\/n/g, " ");
body = body.replace(/\/r/g, " ");

let for_resale = true;

for (let indicator of indicators) {
for_resale = true;
for (let word of indicator) {
for_resale = body.indexOf(word) != -1 && for_resale;
}

if (for_resale) {
// Domain most likely for sale because of word occurrences

break;
}
}

if (!redirects_to) {

for (let redirect of javascript_resale_redirect) {

if (body.indexOf(redirect) != -1) {
for_resale = true;
redirects_to = redirect;
break;
}
}
}

resolve({
word: word.Word,
domain: domain,
free: false,
premium: false,
redirects_to: redirects_to,
resale: for_resale,
reseller: false,
fetch_error: false
});

} else {

resolve({
word: word.Word,
domain: domain,
free: false,
premium: false,
redirects_to: null,
resale: false,
reseller: false,
fetch_error: true
});
}

});
} else {

// Check if site is free because no DNS entry exists

await new Promise(r => setTimeout(r, 1000));
request("https://www.hover.com/api/lookup?q=" + domain, (err, request, body) => {

if (!err) {

let data = JSON.parse(body);

let free = false;
let premium = false;

if (data.results && data.results.length) {
let entry = data.results[0];

if (entry.domain == domain) {
free = true;
if (entry.is_premium) {
premium = true;
}
}
}

resolve({
word: word.Word,
domain: domain,
free: free,
premium: premium,
redirects_to: null,
resale: false,
reseller: false,
fetch_error: false
});
} else {

resolve({
word: word.Word,
domain: domain,
free: false,
premium: false,
redirects_to: null,
resale: false,
reseller: false,
fetch_error: true
});
}
})
}
});
});

wait_list.push(promise);
}

// Log end result
console.log(result);


});

For the domain names I used a list from wordfrequency.info where they publish different sized lists of words ordered by their frequency in the English language. The 5000 word list is free and I opted to use that one. I took the freedom to remove duplicate words because some can have different roles in a sentence like “a run” vs. “to run”. This reduced the set to 4350 words.

First, the program reads the data from the downloaded CSV file, parses it and iterates over every word in the list. During each iteration the program then checks whether the domain has a public IP attached to itself by looking up its IPv4 addresses. Depending on the result of the query, the program either verifies on hover.com whether domain is still free in case no IPv4 can be found or it queries the website. After the website has been loaded I categorize them as for resale in case the domain is redirected to a known reseller or they contain words like “buy this domain”. I also categorize free domains as premium if they redirect to gen.xyz which is the company who runs the .xyz top level domain.

What I didn’t do is categorize resold domains in case they were/are/continue to be premium domains. It could be that a person who bought dark.xyz couldn’t get the business of the ground and wants his initial investment back in case buying an expired domain regains it’s original premium price. If you want to learn about the horrendous pricing tiers on premium domains on .xyz, you can click here.

.XYZ domain allocation statistic for the 4350 most used English words
  • All: 4350
  • Error loading: 84 (1.9 %)
  • Resale: 1681 (38.6 %)
  • Premium: 396 (9.1 %)
  • Free: 131 (3.0%)
  • Other: 2058 (47.3%)

Looking at the results from my little scraper, a whopping 38% of the 4350 most used words is available for resale. Given the few samples from above where the price is publicly viewable, one can only guess what the average price will look like. My guess would be $500+ at a minimum. Looking through the list sporadically, many.xyz stood out. As of writing this post, the price is set at $15.000.

Below I added the list of domains which are currently for resale and their corresponding reseller. I also added a list of domains which are still free and are not a premium domain. Most of them are adverbs. They aren’t best to use as a business name. My favorites are grandchild.xyz and grandmother.xyz. mm-hmm.xyz also sounds great. Both tables are sorted according to their frequentness in the English language. Thanks for reading and I hope you got something out of it. Maybe a domain, who knows.

List of .xyz domains for resale according to my little study

Please visit https://schleiss.io/looking-at-4000-xyz-domains-with-this-shocking-fact/ for this list because Medium doesn’t support tables.

Free .xyz domains without a premium according to my study

Please visit https://schleiss.io/looking-at-4000-xyz-domains-with-this-shocking-fact/ for this list because Medium doesn’t support tables.

Originally published at schleiss.io on August 24, 2018.

More by Martin Schleiss

Topics of interest

More Related Stories