DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper avatar

DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper

Pricing

Pay per event

Go to Apify Store
DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper

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

DevilScrapes

Maintained by Community

Actor 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 / 503 before 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 TXT records in bulk to check email-authentication posture across a portfolio.
  • Migration verification — confirm A/AAAA/NS records 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

  1. Click Try for free at the top of the page.
  2. Paste one or more domains into the domains field — one per line.
  3. Optionally adjust recordTypes (defaults to A, AAAA, MX, TXT, NS) and pick a resolver preference.
  4. Click Start. Rows stream into the dataset as each domain resolves.
  5. 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

FieldTypeRequiredDefaultNotes
domainsarrayyes["github.com", "cloudflare.com"]Domains to look up. One per line.
recordTypesarrayno["A", "AAAA", "MX", "TXT", "NS"]DNS record types to query for every domain. Uppercased automatically.
resolverstringno"cloudflare"Primary resolver — cloudflare or google. The other is used as an automatic fallback.
proxyConfigurationobjectno{"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:

EventPriceWhen
Actor start$0.20Once per run
Result$0.001Once 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.