WHOIS Domain Lookup
Pricing
from $2.13 / 1,000 domain lookups
WHOIS Domain Lookup
Get the registrar, creation and expiry dates, domain age, days until expiry, status codes, nameservers, DNSSEC, and the published registrant organization for up to 5,000 domains per run. Registry RDAP first, port 43 WHOIS fallback. No key. Clay ready.
Pricing
from $2.13 / 1,000 domain lookups
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Look up who registered a domain, when, and when it expires. List domains, website URLs, or email addresses, and get one flat row per domain: the registrar, the creation, update, and expiry dates, the domain age and days until expiry, the status codes, the nameservers, DNSSEC, and the registrant organization and country where the registry publishes them. Use it to age a lead list, spot domains close to expiry, find the registrar for a takedown or a purchase, or check whether a domain is registered at all.
The actor asks each registry directly. It reads the registry's public RDAP server, the structured service that replaced WHOIS, from the official IANA list of RDAP servers. Where the IANA list names no RDAP server for a TLD, the actor uses the registry's own RDAP server where one answers (.io, .ac, .co, .us, .ch, and .li, each checked on 2026-10-28), and otherwise the registry's port 43 WHOIS server (such as .de, .eu, .jp, .be, .at, and .dk). No key, no account, and no third party lookup service.
Features
- Registry sources only. RDAP from the IANA bootstrap file for 1,204 top level domains plus 6 registry RDAP servers the file does not list yet, and port 43 WHOIS through the IANA referral for the rest. The row names the source and the server that answered.
- Domain age and days until expiry, computed. Ready to filter on in Clay or a spreadsheet.
- Registrar record filled in. For .com, .net, and other registries that publish only part of the record, the actor also reads the registrar's own RDAP record for the abuse email and any registrant organization or country the registrar publishes.
- Any input shape.
stripe.com,https://blog.stripe.com/x, andjane@stripe.comall look upstripe.com. A domain listed twice is looked up and charged once. - Not registered is an answer. A domain the registry says it does not hold returns
registeredfalse. - You pay for answers only. A row is charged only when the registry returned the dates or said the domain is not registered. A row with no dates published, an error row, and input that is not a domain are free.
- Polite to registries. At most two requests in flight per RDAP server and one query at a time per WHOIS server, with retries on rate limits.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
domains | array | Domains, URLs, or email addresses, 1 to 5,000 per run | |
domain | string | One domain, for a Clay column with one domain per row. Added to domains | |
follow_registrar_rdap | string, true or false | true | Also read the registrar's RDAP record where the registry links one |
include_raw | string, true or false | false | Put the registry's RDAP JSON or WHOIS text in raw_response |
max_charge_usd | string | Stop before a charge that would pass this amount |
Every input accepts a string, which is what Clay sends.
Output
One row per domain. Every row has the same columns.
| Field | Type | Meaning |
|---|---|---|
input | string | The entry as you gave it: a domain, URL, or email address. |
domain | string | The registrable domain looked up, lowercase. Subdomains and www are dropped. Empty when the input is not a domain. |
tld | string | The top level domain. |
registered | boolean | true: the registry holds a record for this domain. false: the registry answered that it is not registered. Empty on an error row. |
registrar_name | string | The registrar of record, as the registry or registrar publishes it. |
registrar_iana_id | string | The registrar's IANA ID, where published (gTLDs and some ccTLDs). |
registrar_url | string | The registrar's website, where published. |
registrar_abuse_email | string | The registrar's abuse contact address, where published. |
created_at | string | Registration date, UTC ISO 8601. |
updated_at | string | Date the registry record last changed, UTC ISO 8601. |
expires_at | string | Expiry date, UTC ISO 8601. |
domain_age_days | integer | Whole days from the creation date to the time of the run. |
days_until_expiry | integer | Whole days from the time of the run to the expiry date. Negative when the expiry date has passed (the domain may be in its grace period). |
status | array | The domain status codes as the registry publishes them, for example client transfer prohibited, redemption period, or pending delete. |
nameservers | array | The delegated nameservers, lowercase. |
dnssec | boolean | true when the delegation is signed, false when it is not, empty when the registry does not say. |
registrant_organization | string | The registrant organization, only when the registry or registrar publishes it. Most gTLD records are redacted for privacy, so this is often empty. |
registrant_country | string | The registrant's two letter country code, only when published. |
source | string | rdap: the registry's RDAP server. whois: the registry's port 43 WHOIS server, used where the registry has no RDAP server or its RDAP server failed. |
source_server | string | The registry server that answered. |
registrar_rdap_status | string | followed: the registrar's own RDAP record was read and filled gaps. not_offered: the registry names no registrar record. unreachable: the registrar record did not answer. off: the option is off. Empty for WHOIS rows. |
raw_response | string | With Include the raw registry answer on: the RDAP JSON or the WHOIS text, up to 50,000 characters. Empty otherwise. |
row_status | string | ok: the registry answered with the dates, or answered that the domain is not registered (charged). partial: the registry answered but publishes no creation or expiry date, as the .de and .eu registries do over WHOIS (free). error: no answer, or the input is not a domain (free). |
error_reason | string | Why a row is partial or error, for example invalid_domain, whois_rate_limited, or input_invalid for input the run could not use. |
billable_events_json | string | What this row was billed as, for example {"domain-lookup":1}. {} means free. |
checked_at | string | When the row was written, UTC. |
Example row:
{"input": "https://www.notion.io/pricing","domain": "notion.io","tld": "io","registered": true,"registrar_name": "Gandi SAS","registrar_iana_id": "81","registrar_url": "https://www.gandi.net","registrar_abuse_email": "abuse@support.gandi.net","created_at": "2012-05-21T04:24:08.000Z","updated_at": "2026-09-10T01:50:39.000Z","expires_at": "2027-05-21T04:24:08.000Z","domain_age_days": 5273,"days_until_expiry": 205,"status": ["clientTransferProhibited"],"nameservers": ["ns-1812.awsdns-34.co.uk","ns-685.awsdns-21.net"],"dnssec": false,"registrant_organization": "SOCIETE EDITRICE DU MONDE","registrant_country": "FR","source": "rdap","source_server": "rdap.verisign.com","registrar_rdap_status": "followed","raw_response": null,"row_status": "ok","error_reason": null,"billable_events_json": "{\"domain-lookup\":1}","checked_at": "2026-10-28T14:00:00.000Z"}
The run also writes a RUN_SUMMARY record to its key-value store with counts per row status and per source, the requests made, and the charges.
Pricing
Pay per event. You pay for domain lookups and the run start.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
domain-lookup, one domain the registry answered for | $0.0025 | $0.002375 | $0.00225 | $0.002125 |
apify-actor-start, once per run (one per GB of memory; the default 128 MB is one) | $0.0006 | $0.0006 | $0.0006 | $0.0006 |
Per 1,000 domain lookups: $2.50 on the free plan, $2.13 on Gold.
Free rows: a domain whose registry publishes no creation or expiry date (partial), an error row, input that is not a domain, and a repeat of a domain in the same run. A run whose input is refused writes one free row and charges only the run start.
Free plan cap: 1.50 USD of evaluation a month, about 600 domain lookups. Any paid Apify plan removes the cap, and it resets on the 1st. The run stops before a charge that passes your maximum charge per run in Apify or your max_charge_usd.
Mamba Labs pays the platform costs of your run. The registries' RDAP and WHOIS services are free and need no key.
Usage examples
Apify Console or API. Paste your domains and start the run. Read the rows with GET https://api.apify.com/v2/datasets/{datasetId}/items.
{"domains": ["stripe.com", "notion.io", "lemonde.fr"]}
Clay. Add an Apify column, pick this actor, and map your domain or website column to domain. Filter on row_status first, then on domain_age_days or days_until_expiry.
MCP. The Mamba Labs MCP server @mambalabsdev/mcp-whois-domain-lookup exposes the tool lookup_domain_whois to Claude and other MCP clients.
Error handling
| Case | What you get |
|---|---|
| No domains, an empty list, a wrong type, or more than 5,000 domains | One free row, row_status error, error_reason starting input_invalid:, and the run ends successfully. Only the run start is charged |
| An entry that is not a domain (an IP address, a bare TLD, text) | A free row, error_reason invalid_domain |
| The registry says the domain is not registered | A charged row, registered false |
| The registry answers but publishes no dates (.de and .eu over WHOIS) | A free row, row_status partial, with the status and nameservers it did publish |
| The RDAP server fails or times out | The actor asks the registry's WHOIS server instead; if that fails too, a free error row names both |
| A WHOIS server drops the connection | One retry 3 seconds later, then a free error row |
| A WHOIS server refuses more queries | A free row, error_reason whois_rate_limited; rerun those domains later |
| The run nears its timeout | It stops starting new domains 90 seconds before the timeout, writes the rest as free not_started rows, and ends successfully |
Limitations
- Most .com, .net, and new gTLD records redact the registrant for privacy, so
registrant_organizationis often empty. The actor never guesses it. - Some registries publish less than others. DENIC (.de) publishes status, nameservers, and the last change date over WHOIS, and EURid (.eu) publishes the registrar and nameservers; neither publishes creation or expiry dates there, so those rows are
partialand free. - Some ccTLD registries publish no WHOIS or RDAP for automated use, or answer only listed addresses (for example .es). Those rows are free errors. A WHOIS server that drops a connection is retried once.
- WHOIS text formats differ by registry. Fields a registry prints in an unusual format can be empty;
include_rawreturns the text so you can read it yourself. - Dates are the registry's own. A domain past its expiry date can still show
registeredtrue during the registry's grace period.
Mamba Labs actor suite
MCP servers for the suite are published under the npm scope @mambalabsdev.
Built by Mamba Labs.