DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper
Pricing
Pay per event
DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper
Bulk DNS record lookup for any list of domains. Resolves A, AAAA, MX, TXT, NS, CNAME, SOA and CAA records via Cloudflare and Google DNS-over-HTTPS, with automatic fallback between resolvers. One clean row per domain, ready for portfolio monitoring or DNS change detection.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
🎯 What this scrapes
Feed this Actor a list of domains and the DNS record types you care about, and it comes back with one dataset row per domain — every requested record type decoded into a readable string (MX, not 15; NOERROR, not 0), grouped together so you get a full DNS snapshot in a single glance.
- Any domain — apex, subdomain, or a mix
- Standard record types:
A,AAAA,MX,TXT,NS,CNAME,SOA,CAA - Two independent DNS-over-HTTPS resolvers (Cloudflare + Google), so a query survives either resolver having a bad day
🔥 Features
- 🌐 Two-resolver fallback — every lookup tries your chosen primary resolver first (Cloudflare or Google) and automatically retries on the other if it errors, times out, or returns something unparsable.
- 🧱 Per-domain and per-type fault isolation — one domain's problem never blocks the rest of the batch, and one record type failing never blows up the whole row.
- 🔁 Retries with backoff on
408 / 429 / 503before falling back to the other resolver. - 🧊 Clean, typed dataset rows — Pydantic-validated, decoded type/status strings, ISO-8601 timestamps.
- 📡 Concurrent per-domain fan-out — every requested record type for a domain is queried in parallel.
- 💰 Pay-Per-Event pricing — you pay only for rows that land. No data, no charge beyond the small actor-start fee.
💡 Use cases
- Domain portfolio monitoring — run daily against a list of domains you manage and catch unexpected DNS changes.
- MX record auditing — verify mail routing configuration across a list of client domains.
- SPF/DKIM/DMARC visibility — pull
TXTrecords in bulk to check email-authentication posture across a portfolio. - Migration verification — confirm
A/AAAA/NSrecords point where you expect after a DNS cutover. - Security research — bulk-resolve a domain list gathered from another source (e.g. a WHOIS or subdomain-enumeration Actor) and get structured DNS data back.
⚙️ How to use it
- Click Try for free at the top of the page.
- Paste one or more domains into the
domainsfield — one per line. - Optionally adjust
recordTypes(defaults toA, AAAA, MX, TXT, NS) and pick aresolverpreference. - Click Start. Rows stream into the dataset as each domain resolves.
- Export from Storage → Dataset as JSON, CSV, or Excel — or call the Apify API directly.
For recurring monitoring, use Apify Schedules (cron syntax) so the dataset refreshes on your preferred cadence.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
domains | array | yes | ["github.com", "cloudflare.com"] | Domains to look up. One per line. |
recordTypes | array | no | ["A", "AAAA", "MX", "TXT", "NS"] | DNS record types to query for every domain. Uppercased automatically. |
resolver | string | no | "cloudflare" | Primary resolver — cloudflare or google. The other is used as an automatic fallback. |
proxyConfiguration | object | no | {"useApifyProxy": false} | Standard Apify Proxy field. Not required for this target's traffic pattern. |
Example input
{"domains": ["github.com","cloudflare.com"],"recordTypes": ["A", "AAAA", "MX", "TXT", "NS"],"resolver": "cloudflare"}
📤 Output
One dataset row per domain, with records grouped by type:
{"domain": "github.com","resolver_used": "cloudflare","records": [{"type": "MX","status": "NOERROR","ttl": 300,"data": "0 github-com.mail.protection.outlook.com"}],"record_types_queried": ["A", "AAAA", "MX", "TXT", "NS"],"record_types_failed": [],"queried_at": "2026-09-05T12:00:00+00:00"}
records— every decoded answer across every queried type for this domain.record_types_failed— types where both resolvers failed for this domain (a clean NXDOMAIN or empty answer is not a failure and doesn't appear here).
💰 Pricing
Pay-Per-Event — you're charged only when the Actor actually does something:
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run |
| Result | $0.001 | Once per domain row written to the dataset ($1.20 / 1,000 results incl. the flat start fee) |
No results, no result charge — only the small warm-up fee applies.
🚧 Limitations
- No zone-transfer (AXFR) and no DNSSEC validation surfacing beyond what the upstream resolver already returns — this is a lookup tool, not a DNS security auditor.
- No WHOIS lookups and no reverse-DNS (PTR) bulk mode in v1.
- Very large domain lists run sequentially domain-by-domain to keep memory bounded and stream rows as they resolve, so total run time scales roughly linearly with domain count.
❓ FAQ
Does this need an API key? No — both upstream resolvers (Cloudflare, Google) are public, keyless DNS-over-HTTPS APIs.
What happens if a domain doesn't exist?
You still get a row. records will be empty for that domain and record_types_failed stays empty too — an NXDOMAIN is a valid answer, not an error.
What happens if a DNS resolver is temporarily down?
We retry with backoff, then fall back to the other resolver automatically. Only if both resolvers fail for a given record type does it show up in record_types_failed.
Can I query custom record types?
Yes — any DNS record type name is accepted in recordTypes; numeric types outside the common set decode as TYPE<n> rather than crashing the row.
🙋 Your feedback
Found a domain or record type this Actor doesn't handle well? Leave a review or open an issue from the Actor's Apify Store page — we read every one and ship fixes fast.