Bulk Domain WHOIS & DNS Lookup: Age, Expiry, MX, SPF, DMARC avatar

Bulk Domain WHOIS & DNS Lookup: Age, Expiry, MX, SPF, DMARC

Pricing

from $2.00 / 1,000 domain checkeds

Go to Apify Store
Bulk Domain WHOIS & DNS Lookup: Age, Expiry, MX, SPF, DMARC

Bulk Domain WHOIS & DNS Lookup: Age, Expiry, MX, SPF, DMARC

Bulk-check domains via official RDAP plus live DNS: registered/available, registrar, created/expiry dates, age, nameservers, MX/TXT, email provider (Google/Microsoft/Proofpoint), SPF and DMARC.

Pricing

from $2.00 / 1,000 domain checkeds

Rating

0.0

(0)

Developer

Halos AI

Halos AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Check hundreds of domains at once: registered or available, registrar, creation and expiry date, domain age, status, nameservers, plus live DNS (A/AAAA/MX/NS/TXT), email provider detection, SPF and DMARC checks, and DNS host detection.

  • ✅ Official sources. Registration data comes from the RDAP servers of each TLD's registry (the ICANN-mandated successor to WHOIS, discovered through the IANA bootstrap). DNS uses DNS-over-HTTPS (Cloudflare, with Google fallback).
  • ⚡ Fast. 100 domains in about 33 seconds at 512 MB (measured), with per-registry rate limiting built in.
  • 💵 Fair billing. You pay only for domains that were checked successfully. Invalid inputs and registry lookup errors are still returned (with an error message and billable: false) but aren't charged.
  • 🔐 Privacy-first. It never outputs personal registrant names, emails, phones or street addresses. Registrant organization and country are added only when the registrar publishes them (followRegistrarRdap).
  • 🧹 Accepts messy input: URLs, www. hosts, uppercase, IDNs. Everything is normalized and deduplicated.

Use cases

  • Lead qualification and enrichment: domain age, email provider (Google Workspace, Microsoft 365, Proofpoint…), DNS host (Cloudflare, AWS, Vercel…)
  • Email deliverability audits: SPF present, DMARC policy (none, quarantine, reject)
  • Portfolio and brand monitoring: expiry dates, daysUntilExpiry, registrar lock statuses
  • Name hunting: registered: false plus likelyAvailable for quick availability screens

How to use it

  1. Click Try for free and paste your domains or URLs, one per line (or send a list through the API).
  2. Keep Registration data (RDAP) and DNS records on for the full picture.
  3. Click Start and export from the Output tab as CSV, Excel or JSON.

Lead enrichment recipe

Run your prospect list's website domains and use three columns: emailProvider (Google Workspace vs. Microsoft 365 vs. Proofpoint tells you the company's stack and size), ageYears (new vs. established business) and dmarcPolicy (none means a deliverability or security pitch opportunity).

Input example

{
"domains": ["stripe.com", "https://www.shopify.com/pricing", "example.org"],
"includeRdap": true,
"includeDns": true,
"followRegistrarRdap": false,
"dnsRecordTypes": ["A", "AAAA", "MX", "NS", "TXT"]
}

Output example (one item)

{
"domain": "stripe.com",
"tld": "com",
"rdapSupported": true,
"dns": {
"A": [
"198.137.150.161",
"198.202.176.161"
],
"AAAA": [],
"MX": [
"10 aspmx.l.google.com",
"20 alt1.aspmx.l.google.com",
"20 alt2.aspmx.l.google.com",
"30 aspmx2.googlemail.com",
"30 aspmx3.googlemail.com"
],
"NS": [
"ns-1087.awsdns-07.org",
"ns-1882.awsdns-43.co.uk",
"ns-423.awsdns-52.com",
"ns-705.awsdns-24.net"
],
"TXT": [
"00D50000000JV6w=1TBTQ0000000CIv;00DDn000000HWol=1TBVY00000002Hx;00D4x000003vxGL=1TBPQ00000008Tp;00Dfn00000BUlWD=1TBan0000000LPR",
"MS=ms80697640",
"VISA=38A3D7A1AA5D71E43525144DD886F6B8"
]
},
"hasMx": true,
"emailProvider": "Google Workspace",
"dnsHost": "AWS Route 53",
"hasSpf": true,
"spf": "v=spf1 ip4:198.2.180.60/32 ip4:13.111.2.227/32 include:spf1.stripe.com include:greenhouse-outbound-mail.stripe.com include:_spf.qualtrics.com ~all",
"hasDmarc": true,
"dmarc": "v=DMARC1; p=reject; pct=100; fo=1; rua=mailto:dmarc-reports@stripe.com; ruf=mailto:dmarc-forensics@stripe.com;",
"dmarcPolicy": "reject",
"resolves": true,
"registered": true,
"createdAt": "1995-09-12T04:00:00+00:00",
"expiresAt": "2027-09-11T04:00:00+00:00",
"updatedAt": "2025-10-01T01:39:51+00:00",
"ageDays": 11359,
"ageYears": 31.1,
"daysUntilExpiry": 327,
"statuses": [
"client delete prohibited",
"client transfer prohibited",
"client update prohibited",
"server delete prohibited",
"server transfer prohibited",
"server update prohibited"
],
"nameservers": [
"ns-1087.awsdns-07.org",
"ns-1882.awsdns-43.co.uk",
"ns-423.awsdns-52.com",
"ns-705.awsdns-24.net"
],
"dnssec": false,
"registrar": "SafeNames Ltd.",
"registrarIanaId": "447",
"registrarAbuseEmail": "abuse@safenames.net",
"checkedAt": "2026-10-18T13:06:42.996312+00:00",
"billable": true
}

Invalid inputs and lookup failures come back like this and are not charged:

{ "domain": "not a domain!!", "error": "invalid domain", "billable": false }

How much does it cost?

$2.00 per 1,000 domains successfully checked, plus a $0.005 start fee per run. Platform compute is included. Rows with billable: false (invalid input or lookup error) are free.

Worked example: enriching a 5,000-domain prospect list costs 5,000 × $0.002 + $0.005 = $10.005. A weekly expiry check of a 200-domain portfolio costs $0.405 per run, about $1.75/month.

Scheduled monitoring

  1. Save your domain list as a Task.
  2. In Schedules, run it weekly (or daily for drop-catching).
  3. Add an Integration (Email, Slack, Google Sheets or webhook) and filter on daysUntilExpiry < 30, registered: false or a changed dmarcPolicy.

Use it via API

curl -X POST "https://api.apify.com/v2/acts/halos_ai_main~domain-whois-rdap-dns-lookup/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains":["stripe.com","shopify.com","example.org"]}'
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("halos_ai_main/domain-whois-rdap-dns-lookup").call(
run_input={"domains": ["stripe.com", "shopify.com", "example.org"]}
)
for d in client.dataset(run["defaultDatasetId"]).iterate_items():
print(d["domain"], d.get("registrar"), d.get("ageYears"), d.get("emailProvider"), d.get("dmarcPolicy"))

Notes and limitations

  • A few ccTLDs (for example .de, .io, .so) don't offer RDAP. For those, rdapSupported: false and you still get the full DNS data.
  • likelyAvailable is a screen, not a guarantee. Premium, reserved or blocked names can show as unregistered. Confirm at a registrar before you buy.
  • Registries rate-limit RDAP. The Actor throttles per registry and retries with backoff. Very large batches run slower by design.
  • Acceptable use: don't use this Actor for spam or for any purpose prohibited by the registries' RDAP/WHOIS terms of use.

FAQ

Is this the same as WHOIS? RDAP is the ICANN-mandated, structured successor to WHOIS, served by the same registries, so the data is the same with cleaner formats. Am I charged for typos or failed lookups? No. Those rows come back with billable: false and an error message. Something broke or a field is missing? Open an issue on the Actor's Issues tab. We monitor runs daily.