Bulk Domain DNS Lookup - MX, TXT, SPF, DMARC, DNSSEC Check
Pricing
from $2.60 / 1,000 domain resolveds
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
9 days ago
Last modified
Categories
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 plan | Paid Apify plan | |
|---|---|---|
| Domains resolved per run | First 25 | Every domain (up to 1,000 per run) |
| Records and layers per domain | Full set: every record type you chose + SPF / DMARC / DNSSEC / provider | Same full set |
| The rest of your list | Counted in a final free-plan-preview row with the most the paid run would cost | Resolved |
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
| Field | Type | Description |
|---|---|---|
domains | array | Up to 1,000 bare domains (e.g. example.com) |
domain | string | Single-domain alternative |
recordTypes | array | Which types to query (default: A, AAAA, MX, NS, TXT, CNAME, SOA, CAA) |
resolver | string | google / cloudflare / quad9 / system (default google) |
timeout | integer | Per-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
| Event | FREE-tier price | When it is charged |
|---|---|---|
domain-resolved | $0.005 | Once 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.002 | Once 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.