DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper
Pricing
from $1.00 / 1,000 result emitteds
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
from $1.00 / 1,000 result emitteds
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 days 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.