Bulk Domain DNS Lookup - MX, TXT, SPF, DMARC, DNSSEC Check avatar

Bulk Domain DNS Lookup - MX, TXT, SPF, DMARC, DNSSEC Check

Pricing

from $2.60 / 1,000 domain resolveds

Go to Apify Store
Bulk Domain DNS Lookup - MX, TXT, SPF, DMARC, DNSSEC Check

Bulk Domain DNS Lookup - MX, TXT, SPF, DMARC, DNSSEC Check

Resolve full DNS records for up to 1000 domains in one run: A, AAAA, MX, NS, TXT, CNAME, SOA, CAA, SRV - plus SPF, DMARC policy, DNSSEC, CAA, www and the mail/DNS provider of each domain. Pick your resolver (Google/Cloudflare/Quad9). Structured JSON for DevOps, recon and lead enrichment.

Pricing

from $2.60 / 1,000 domain resolveds

Rating

0.0

(0)

Developer

daehwan kim

daehwan kim

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

9 days ago

Last modified

Share

Bulk DNS Lookup — A, AAAA, MX, NS, TXT, CNAME, SOA, CAA

Resolve full DNS records for many domains in a single run. Query all the record types that matter — A, AAAA, MX, NS, TXT, CNAME, SOA, CAA, SRV — choose your recursive resolver, and get clean structured JSON back.

Built for DevOps, SRE, security recon, email-deliverability debugging, and domain monitoring.

Public DNS data only. Read-only queries. No personal data.

Free plan vs paid plan

Free Apify planPaid Apify plan
Domains resolved per runFirst 25Every domain (up to 1,000 per run)
Records and layers per domainFull set: every record type you chose + SPF / DMARC / DNSSEC / providerSame full set
The rest of your listCounted in a final free-plan-preview row with the most the paid run would costResolved

Paid plans also get store discounts: BRONZE -20%, SILVER -35%, GOLD and above -48%. The free-plan limit ends the run as SUCCEEDED with a status message; it is a plan limit, not an error.

Why this Actor

  • All record types in one call — A, AAAA, MX, NS, TXT, CNAME, SOA, CAA, SRV
  • Bulk — up to 1,000 domains per run
  • Choose your resolver — Google (8.8.8.8), Cloudflare (1.1.1.1), Quad9 (9.9.9.9), or system
  • Clean structured output — one row per domain, every record type as its own field
  • Per-type error isolation — one failing type never blocks the rest
  • Pay per result — $0.005 per domain resolved. No subscription.

Input

FieldTypeDescription
domainsarrayUp to 1,000 bare domains (e.g. example.com)
domainstringSingle-domain alternative
recordTypesarrayWhich types to query (default: A, AAAA, MX, NS, TXT, CNAME, SOA, CAA)
resolverstringgoogle / cloudflare / quad9 / system (default google)
timeoutintegerPer-query timeout in seconds (default 8)
{
"domains": ["example.com", "github.com"],
"recordTypes": ["A", "MX", "TXT", "NS"],
"resolver": "google"
}

Output

One dataset row per domain: domain, recordCount, resolver, then A, AAAA, MX, NS, TXT, CNAME, SOA, CAA, SRV arrays, plus errors and scannedAt.

Every query that gets no answer (timeout or resolver error) is retried once (over TCP) before it is reported. A query that still got no answer is listed in unansweredTypes and errors, and the yes/no fields that depend on it (hasMx, hasSpf, hasDmarc, dnssecEnabled, hasCaa, wwwResolves, ipv4Count, ipv6Count) are null — "could not tell", never a false "no".

{
"domain": "github.com",
"recordCount": 12,
"resolver": "google",
"A": ["140.82.112.3"],
"MX": ["1 aspmx.l.google.com."],
"NS": ["dns1.p08.nsone.net.", "..."],
"TXT": ["v=spf1 ..."],
"errors": {},
"scannedAt": "2026-06-03T..."
}

Pricing

EventFREE-tier priceWhen it is charged
domain-resolved$0.005Once per domain with a determinate answer: records found (ok, even if some other record types got no answer — those fields are null), an authoritative "no records" (no_records), or an authoritative "domain does not exist" (nxdomain)
domain-checked$0.002Once per domain whose own nameservers fail for every record type you asked for (broken_delegation: the resolver answered SERVFAIL on both tries) — the delegation is broken, which is the answer. Charged from the date this event appears on the Actor's price list

Not charged: a lookup we could not complete (lookup_failed, e.g. resolver timeouts, or the resolver refusing the connection or never answering — the row is still delivered), and notice rows (free-plan-preview, charge-limit-reached, billing-unavailable, input notices).

If Apify restarts or migrates a run, the domains it already returned are neither returned nor charged again. A row handed over just before the restart but not yet charged is charged once after it. If the Apify charging API fails, the run retries the charge of the row it just returned (up to three times in a row, when the Apify SDK can retry it without charging twice; otherwise not at all) and then stops before the next row (billing-unavailable). If your run's maximum charge is reached, the run stops before the next row and ends SUCCEEDED; every billed row already delivered was paid for.

Use cases

  • Email deliverability debugging — inspect MX, SPF/DKIM/DMARC (TXT), CAA
  • Infrastructure mapping — A/AAAA/NS/CNAME across a domain portfolio
  • Migration & monitoring — snapshot DNS before/after changes
  • Security recon — enumerate mail and name servers for in-scope targets

Disclaimer

For informational purposes only. DNS responses reflect what the chosen resolver returns at query time and may be cached. The operator is not responsible for decisions made from these results.

Leave a review

A short review on the Reviews tab, good or bad, helps other people find this Actor and tells us what to build next. Found a bug or need a feature? Open an issue on the Issues tab and we'll look into it.