Net::Whois - The parser checks domain data via RDAP and WHOIS
Parser overview

Domain data is collected via RDAP (HTTP, JSON) or WHOIS (port 43) — depending on the domain zone. For each TLD, RDAP and WHOIS servers are predefined in the parser; if RDAP is available for a zone, the request is performed through it first, and if it fails — via WHOIS.
The A-Parser functionality allows you to save parsing settings for future use (presets), set parsing schedules, and much more. You can use automatic query multiplication, substitution of subqueries from files, brute-forcing of alphanumeric combinations, and lists to obtain the maximum possible number of results.
Saving results is possible in any format and structure you need, thanks to the built-in powerful Template Toolkit template engine, which allows you to apply additional logic to the results and output data in various formats, including JSON, SQL, and CSV.
Parser use cases
🔗 Selecting arbitrary data
Net::Whois selecting arbitrary data
🔗 Domain parameters
Getting parameters by domains
🔗 Domain expiration notification
Getting notifications in Telegram about domain registration expiration
🔗 Collecting e-mail address database
The preset allows collecting domain e-mail addresses via the Whois service.
Collected data
- Whether the domain is registered or not
- Domain registration expiration date
- When the domain was registered
- Last record update date
- RDAP server URL — upon a successful RDAP request
- WHOIS server used — upon a WHOIS request; often empty for RDAP
- List of domain name servers
- Domain registrar
- Current domain status
- Domain release date
- Raw response — WHOIS text or RDAP JSON
Capabilities
- Automatic selection of RDAP or WHOIS based on the domain zone (RDAP priority)
- Support for internationalized domain names (IDN, e.g., яндекс.рф)
Use cases
- Collecting available domains or those that will soon expire
- Collecting a list of NS servers
- Obtaining domain statuses
Queries
You should specify the domain of the target site as queries, for example:
a-parser.com
yandex.ru
google.com
vk.com
facebook.com
Result output options
A-Parser supports flexible result formatting thanks to the built-in Template Toolkit template engine, which allows it to output results in any form, as well as in structured formats such as CSV or JSON
Default output
Result format:
$query - registered: $registered, expire: $expire_date, creation: $creation_date
The result displays the domain, whether it is registered, the expiration date, and the domain registration date:
facebook.com - registered: 1, expire: 30.03.2028, creation: 29.03.1997
a-parser.com - registered: 1, expire: 25.02.2022, creation: 25.02.2012
vk.com - registered: 1, expire: 23.06.2021, creation: 24.06.1997
yandex.ru - registered: 1, expire: 01.10.2021, creation: 23.09.1997
google.com - registered: 1, expire: 14.09.2028, creation: 15.09.1997
Outputting NS list
Result format:
$ns.format('$server\n')
Result example:
demi.ns.cloudflare.com
vern.ns.cloudflare.com
Outputting domain dates to CSV
Result format:
[% tools.CSVline(query, registered, expire_date, creation_date, updated_date, free_date, whoisserver, rdapserver, registrar) %]
Result example (.com domain, response via RDAP — whoisserver is empty, rdapserver is populated):
a-parser.com,1,25.02.2027,25.02.2012,10.02.2026,none,,https://rdap.verisign.com/com/v1/domain/a-parser.com,"Squarespace Domains II LLC"
Outputting NS list to a CSV table
Result format:
[% FOREACH ns;
tools.CSVline(query, server);
END %]
Result example:
a-parser.com,demi.ns.cloudflare.com
a-parser.com,vern.ns.cloudflare.com
Dumping results to JSON
General output format:
[% IF notFirst;
",\n";
ELSE;
notFirst = 1;
END;
obj = {};
obj.query = query;
obj.registered = p1.registered;
obj.expire_date = p1.expire_date;
obj.creation_date = p1.creation_date;
obj.updated_date = p1.updated_date;
obj.free_date = p1.free_date;
obj.whoisserver = p1.whoisserver;
obj.rdapserver = p1.rdapserver;
obj.registrar = p1.registrar;
obj.domains = [];
FOREACH item IN p1.ns;
obj.domains.push({
server = item.server
});
END;
obj.json %]
Initial text:
[
Final text:
]
Result example (RDAP):
[{
"registered": 1,
"rdapserver":"https://rdap.verisign.com/com/v1/domain/a-parser.com",
"query":"a-parser.com",
"free_date":"none",
"domains":[
{
"server":"demi.ns.cloudflare.com"
},
{
"server":"vern.ns.cloudflare.com"
}
],
"registrar":"Squarespace Domains II LLC",
"expire_date":"25.02.2027",
"creation_date":"25.02.2012",
"whoisserver":"",
"updated_date":"10.02.2026"
}]
To make the "Initial text" and "End text" options available in the Task Editor, you need to activate "More options".
Results processing
A-Parser allows processing results directly during parsing; in this section, we have provided the most popular cases for the Net::Whois parser
Obtaining the domain registrar
When responding via WHOIS, the $p1.data field contains text; with RDAP, it contains JSON. To get the registrar in both cases, add two Results Builders.
Add a Results Builder and select the source from the drop-down list: $p1.data. Select type: RegEx Match. In the Regex field, enter: Registrar:\s*(.+) and save to the variable registrarwhois.
Add a Results Builder again and select the source from the drop-down list: $p1.data. Select type: RegEx Match. In the Regex field, enter: "entities"[\s\S]+?"vcardArray"[\s\S]+?"fn"[\s\S]+?"text"[\s\S]+?"([^"]+?)" and save to the variable registrarrdap.
Add to the Result format: [% IF registrarrdap == 'none' %]$query - $registrarwhois[% ELSE %]$query - $registrarrdap[% END %] — if RDAP did not find the name (registrarrdap equals none), the value from WHOIS is output, otherwise from RDAP.
Download example
How to import an example into A-Parser
eJyVVNtO20AQ/RVrFEQoJioPfbGEqkATiSpNKAH1wU6lVTxJt6x3ze46EEX5987Y
jh1TpKpP9lzPmdvuYIPWSaMhugzBC/fk7iw69A6ieAd5+Q8RWFxL562wEEIurKMg
cohhij6Kfvwy0pEhxZUolIdwB36bI4UZym5limSUKckrYzPhKWnpBhuhCnaLT4Lb
cdBg2FTkwdVVcKqNxtPgZNF7LtBug4ug1/i8MCbFjSbz0fsenIUdpl/InmjYLxYh
VNBuXPIg5F5+OaiLbIxzscEHw2ylwlY9JmkqMubbS4VHtg6qgvpnA//KGUSaSk/d
FKpC4Ca1qI9aPnO9K6EchsCUJbqxNRnl9FhmKOs40IuhqgsoR1EGf69imhyOuI4F
MUnfWqRHK7yxs5wJkX4HRg+VmuAGleuQ2F4XUqU00uGKgm7rwPddZn/l2Df1HUPR
4F8scWiylNL17FsblZqJWTd2JTPpSeFuTKGp9o8hPCHmh57B1FB3MmOxQakDa3Ba
2xw1L1k7smHeqjpVdMZypNyBM4VdEl5M+DRlwa2vl5k2C1/L5PyN4P6waVGSuA/9
wfnZwfhQBZDoDU+xu7Ww2If/BZQAak97hS6BmLCSZL44/5zAZilsOrRWbLv6le7K
vFpdTT/+mQD9nSXwT858R0SZ6C2NXsn1rL7pQxML/UDPxkzfmCxXyBPXhVK0sA7v
28sZunpBWWhn9zb4poQgHs1bQnSMcl/nFbfcSmL3iTlntGPHqHXKpVDq8X5ybOFA
500+0yNr3yx2eTIgLqpHbbCkW2wvs6TKRS7p3teGDpEk7kT9BDZP5Y7W+be7q7Qc
Vur2fwBx19yZ
Possible settings
| Parameter | Default value | Description |
|---|---|---|
| Recursive query | ☐ | Allows obtaining an extended version of WHOIS |
| WHOIS server | Allows you to specify your own WHOIS server | |
| RDAP server | Allows you to specify your own RDAP server | |
| Checking by DNS | ☑ | Allows checking if a domain is registered based on the existence of an IP for the domain |
| Checking domains by DNS record | ☑ | IP check: if it finds status ALLOCATED, it defines the domain as registered; if the option is disabled, no IP check occurs at all |
| Force DNS check for not found domains | ☑ | Forced check if the domain was determined as not registered |