DNS Lookup – Bulk DNS Records, MX, SPF, DMARC & Reverse DNS avatar

DNS Lookup – Bulk DNS Records, MX, SPF, DMARC & Reverse DNS

Pricing

from $1.00 / 1,000 domain checkeds

Go to Apify Store
DNS Lookup – Bulk DNS Records, MX, SPF, DMARC & Reverse DNS

DNS Lookup – Bulk DNS Records, MX, SPF, DMARC & Reverse DNS

Bulk DNS lookup for thousands of domains: A, AAAA, MX, NS, TXT, CNAME, SOA, CAA, SPF checker with 10-lookup limit, DMARC, DKIM, MTA-STS, BIMI, reverse DNS, email-auth grade A–F, propagation check on 8 public resolvers, change monitoring with webhook. $1 per 1,000 domains.

Pricing

from $1.00 / 1,000 domain checkeds

Rating

0.0

(0)

Developer

Cemal Atakli

Cemal Atakli

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

16

Monthly active users

11 days ago

Last modified

Share

Bulk DNS lookup for thousands of domains in one run. Paste a list of domains, URLs or email addresses and get one clean row per domain with A, AAAA, MX, NS, TXT, CNAME, SOA and CAA records. Each row also includes a full SPF checker (mechanisms, includes, recursive DNS-lookup count with the 10-lookup limit warning), DMARC policy and rua, DKIM selector discovery, MTA-STS, TLS-RPT and BIMI, the detected email provider, an email-authentication grade A–F with a plain-English issue list, optional reverse DNS (PTR), a DNS propagation check across 8 public resolvers, and a monitor mode that reports only the domains whose DNS changed (with an optional webhook / Slack alert).

No API key and no proxies. You choose the resolver: Cloudflare 1.1.1.1, Google 8.8.8.8, Quad9, the system resolver or your own DNS server. $1 per 1,000 domains, everything included.

What does DNS Lookup do?

FeatureDetails
DNS recordsA, AAAA, MX, NS, TXT, CNAME, SOA, CAA by default. SRV, DS, DNSKEY, HTTPS, SVCB, NAPTR, TLSA and PTR are optional. TTL for every record type.
MX lookupMail servers sorted by priority, plus the detected provider: Google Workspace, Microsoft 365, Zoho, Proofpoint, Mimecast, Null MX and about 40 more.
SPF checkerParsed mechanisms (ip4, ip6, a, mx, include, exists, ptr), the all policy, redirect, a recursive DNS-lookup count (RFC 7208 limit of 10), void lookups, broken includes, multiple-record and +all warnings
DMARC checkerPolicy p, subdomain policy sp, pct, rua/ruf report addresses, adkim/aspf alignment, fo, and fallback to the organizational domain for subdomains
DKIMProbes about 29 common selectors (google, selector1/2, k1–k3, s1/s2, default, mandrill, amazonses…) plus your own selectors. Returns the key type, approximate key size and whether the key is revoked.
MTA-STS / TLS-RPT / BIMIPresence, record, policy id, report address, BIMI logo and VMC URLs
Reverse DNSPTR records of up to 5 IPv4 addresses per domain
Email auth gradeemailAuthGrade (A–F), emailAuthScore (0–100) and a short emailAuthIssues list per domain, computed from the SPF, DMARC, DKIM, MTA-STS and TLS-RPT data above. No extra queries, no extra cost.
Run reportA run-level summary in the key-value store: REPORT (JSON) and REPORT.html (tables: grades, top issues, email providers, lowest-scoring domains). Free.
Propagation modeThe selected record types from 8 public resolvers (Cloudflare, Google, Quad9, OpenDNS, AdGuard, UltraDNS Public, DNS.SB, DNS4EU), with per-resolver answers, a consistent flag and a mismatch list. Same price per domain.
IssuesReady-made flags such as spf_too_many_lookups, missing_dmarc, dmarc_policy_none, dkim_not_found_common_selectors, no_mx, no_caa, nxdomain
Monitor modeCompares each domain with the previous run and outputs only new or changed domains, with added/removed values. Optional webhookUrl (works with Slack/Discord incoming webhooks) is called when changes are found.
Input cleanupURLs become host names, emails become domains, IDNs become punycode. Duplicates are removed, and invalid lines are reported for free.

Use cases

  • Email deliverability audits: check SPF, DMARC and DKIM for every client or sending domain before a campaign, sort by emailAuthGrade, and hand the client the REPORT.html summary.
  • Lead enrichment: find which leads use Google Workspace or Microsoft 365, or sit behind a Proofpoint or Mimecast gateway.
  • DNS change monitoring: schedule a daily run with Monitor mode and get alerts when MX, NS, A or TXT records change. This catches domain hijacks, migrations and expired zones.
  • Security and compliance: find domains without DMARC enforcement, SPF records over the 10-lookup limit, missing CAA, or dangling CNAMEs.
  • Domain portfolio and migration checks: verify that thousands of domains point to the right IPs and name servers after a move.
  • DNS propagation check: after a migration or an MX/TXT change, use Propagation mode to see whether 8 public resolvers already return the new records.
  • Resolver comparison: run the same list against 1.1.1.1, 8.8.8.8 or your internal DNS server.

Input example

{
"domains": ["apify.com", "https://www.github.com/apify", "jane@gmail.com"],
"recordTypes": ["A", "AAAA", "MX", "NS", "TXT", "CNAME", "SOA", "CAA"],
"resolver": "cloudflare",
"emailSecurity": true,
"checkDkim": true,
"reverseDns": false,
"onlyChanges": false
}

You can also paste a long list or a whole CSV into Bulk list, or give a file URL (TXT or CSV, for example a published Google Sheet).

Output example

One row per domain. The flat columns work well in Excel or Google Sheets, and full details are in nested objects. Example (shortened):

{
"input": "apify.com",
"domain": "apify.com",
"rootDomain": "apify.com",
"status": "OK",
"ipv4": "3.160.57.105, 3.160.57.31, 3.160.57.35, 3.160.57.84",
"mxHosts": "1 aspmx.l.google.com, 5 alt1.aspmx.l.google.com, ...",
"nameservers": "ns-1225.awsdns-25.org, ns-1928.awsdns-49.co.uk, ...",
"emailProvider": "Google Workspace",
"spf": "-all (fail)",
"spfLookups": 10,
"dmarcPolicy": "reject",
"dmarcRua": "mailto:dmarc-reports@apify.com",
"dkimSelectors": "google",
"mtaSts": true,
"bimi": true,
"issues": [],
"emailAuthGrade": "A",
"emailAuthScore": 100,
"emailAuthIssues": [],
"records": { "A": ["3.160.57.105", "..."], "MX": [{ "priority": 1, "host": "aspmx.l.google.com" }], "SOA": [{ "primaryNs": "ns-839.awsdns-40.net", "serial": 1 }], "CAA": [{ "flags": 0, "tag": "issue", "value": "letsencrypt.org" }] },
"ttls": { "A": 60, "MX": 86400, "NS": 172800 },
"emailSecurity": {
"spf": { "record": "v=spf1 a mx include:_spf.google.com include:mailgun.org ... -all", "dnsLookupCount": 10, "lookupLimitExceeded": false, "includes": ["_spf.google.com", "mailgun.org"], "warnings": [] },
"dmarc": { "policy": "reject", "subdomainPolicy": "reject", "pct": 100, "rua": ["mailto:dmarc-reports@apify.com"] },
"dkim": [{ "selector": "google", "keyType": "rsa", "keyBits": 2048, "revoked": false }],
"mtaSts": { "found": true, "id": "29919a352ef9476a" },
"bimi": { "found": true, "logoUrl": "https://apify.com/ext/apify-bimi-logo.svg" }
},
"resolver": "cloudflare",
"checkedAt": "2026-10-12T13:57:56Z"
}

Status values: OK (records found), NO_RECORDS (the name exists but has none of the selected types), NXDOMAIN (the domain does not exist), TIMEOUT / SERVFAIL (the lookup failed; not charged), INVALID_INPUT (not charged).

Email authentication grade (A–F)

Every domain with email security enabled gets emailAuthGrade, emailAuthScore and emailAuthIssues. The score starts at 100 and loses points per finding:

FindingPoints
No DMARC record−35
No SPF record−30
DMARC p= missing/invalid−30
SPF +all−25
DMARC p=none, multiple SPF/DMARC records, SPF over 10 lookups−20 each
SPF ?all−15
No DKIM key under the common selectors, weak (<1024-bit) DKIM key, broken SPF include, SPF without all−10 each
DMARC pct<100, no rua, sp=none, unknown SPF terms, >2 void lookups−5 each
No MTA-STS / 1024-bit DKIM / SPF ptr / no TLS-RPT−3 / −3 / −3 / −2

Grades: A ≥ 90, B ≥ 80, C ≥ 65, D ≥ 50, F < 50. A domain with neither SPF nor DMARC is always F. For domains without MX (or with a Null MX), DKIM, MTA-STS and TLS-RPT are not counted, because only spoofing protection (SPF + DMARC) applies. Web-only subdomains without MX get no grade (null). The grade is a quick triage score from public DNS, not a guarantee of inbox placement: DNS cannot show DKIM keys under custom selectors, sending reputation or content.

After each run, the key-value store holds REPORT (JSON) and REPORT.html: counts per grade, the most common issues, email providers and the lowest-scoring domains. Both are linked on the run's Output tab.

Propagation mode

Set Mode to Propagation check. Each domain is queried for the selected record types on 8 public resolvers:

idResolverIP
cloudflareCloudflare1.1.1.1
googleGoogle Public DNS8.8.8.8
quad9Quad99.9.9.9
opendnsCisco OpenDNS208.67.222.222
adguardAdGuard DNS (non-filtering)94.140.14.140
dns4euDNS4EU (unfiltered)86.54.11.100
ultradnsUltraDNS Public64.6.64.6
dnssbDNS.SB185.222.222.222

Each row has consistent, consistentExceptAddresses, inconsistentTypes, mismatches ({type, resolver, answer, majority}), respondedResolvers / failedResolvers, and propagation with every resolver's answer per record type. The flat columns (ipv4, mxHosts, nameservers…) show the majority answer. The SOA serial is compared, because it is the usual sign that a zone change has not reached a resolver yet. A resolver that times out is listed in failedResolvers and is not counted as a mismatch.

Note: sites behind a CDN, geo-DNS or round-robin DNS (GitHub, AWS CloudFront…) often return different A/AAAA answers per resolver even when nothing is wrong. Use consistentExceptAddresses to check only NS, MX, TXT, SOA, CNAME and CAA. Quad9 blocks known-malicious domains, so for those it returns no answer while the others do. All resolvers are queried from the Actor's data-center location, so this shows resolver caches, not answers from different countries. The price is the same as a normal lookup: one domain-checked event per domain.

Monitor mode and webhook

In monitor mode, each row also has changeType (new / changed), previousCheckedAt and changes, for example: [{"field": "MX", "added": ["0 github-com.mail.protection.outlook.com"], "removed": ["10 old-mx.example.net"]}]

If you set Webhook URL, the Actor POSTs one JSON message at the end of a monitor run that found changed domains (new domains alone do not trigger it):

{
"text": "DNS changes detected on 2 domain(s) (of 3 checked):\n- github.com: MX\n- python.org: dmarc",
"event": "dns_changes_detected",
"runId": "...", "datasetId": "...", "datasetUrl": "https://api.apify.com/v2/datasets/.../items?format=json",
"domainsChecked": 3, "changedCount": 2, "newCount": 0, "unchangedCount": 1,
"changes": [{ "domain": "github.com", "changes": [{ "field": "MX", "added": ["..."], "removed": ["..."] }] }]
}

The text field means a Slack or Discord incoming-webhook URL works without extra setup. The webhook is best effort: it is tried twice, and a failure is only logged, so it never fails the run.

Pricing

Pay per event: $0.001 per domain checked ($1 per 1,000 domains) plus $0.00005 per run. Email security, DKIM, reverse DNS, the A–F grade, the run report, propagation mode, monitoring and the webhook are included. Failed lookups (timeouts, resolver errors), invalid inputs and duplicates are free. An NXDOMAIN answer is a real result, so it is charged. Set Maximum cost per run and the Actor stops cleanly when it is reached.

Actor (Apify Store, Oct 2026)Price per domain
This Actor$0.001, no per-run fee
santamaria-automations/domain-whois-dns$0.003 + $0.001 per run
automation-lab/domain-availability-checker$0.0012–0.0023 + $0.035 per run
ryanclinton/dns-record-lookup$0.003
logiover/bulk-dns-records-lookup$0.0035–0.005
Email-security auditors (SPF/DMARC/DKIM)$0.003–0.01

Speed: about 1,000 domains in 1.5–2 minutes with the default settings (measured: 1,000 hosts, 37,000 DNS queries, 78 s).

FAQ

Which resolver should I use? Cloudflare 1.1.1.1 (the default) is fast and unfiltered. Use Google 8.8.8.8 or Quad9 to compare. Use Custom to query a specific server, such as your corporate DNS or a domain's authoritative name server.

Why does an SPF record with only 4 includes show 12 lookups? The 10-lookup limit counts nested includes too. The Actor follows every include: and redirect= recursively, the same way a receiving mail server does. Over 10 lookups gives an SPF permerror, and mail can fail authentication.

Why "DKIM not found" when the domain signs its mail? DNS has no way to list DKIM keys. The Actor checks about 29 common selectors. If your provider uses a custom selector, add it in Extra DKIM selectors.

How does monitor mode work? Turn on Monitor mode and schedule the Actor (for example, daily). The state is saved in a named key-value store in your account (dns-lookup-monitor by default). The first run outputs every domain as new. Later runs output only changed domains. TTLs and the SOA serial are ignored. For CDN sites whose IPs rotate, add A and AAAA to Ignore these record types. Unchanged domains are still looked up and charged. For watch lists over 50,000 domains, use 1 GB of memory.

Do I get rows for subdomains like www.example.com? Yes. The Actor queries exactly what you entered by default. Set What to look up to Root domain to turn every URL into its registrable domain. DMARC on a subdomain falls back to the parent domain's record, as receivers do.

What does the email auth grade not cover? It only uses public DNS. It cannot see DKIM keys under custom selectors (add them in Extra DKIM selectors), IP or domain reputation, blocklists, or whether mail is actually signed and aligned. For a deeper SPF/DKIM/DMARC deliverability audit, see the Related section below.

Is this legal? Yes. DNS records are public by design, and the Actor only sends standard DNS queries.

Use with AI agents / Apify MCP

AI agents (Claude, ChatGPT, Cursor and others) can call this Actor through the Apify MCP server. Add bulk-dns-lookup as a tool and ask, for example: "Check SPF, DMARC and MX for these 200 client domains and list the ones without DMARC enforcement." The flat fields (spf, spfLookups, dmarcPolicy, emailProvider, issues) are easy for an LLM to read. You can also call it through the Apify API, or from Make, Zapier or n8n with the Apify integration.