Developer tools
DNS Records Lookup — Bulk A/MX/TXT/NS/AAAA Scraper
Bulk DNS record lookup for any list of domains — A, AAAA, MX, TXT, NS, CNAME, SOA, CAA — via Cloudflare and Google DNS-over-HTTPS with automatic resolver fallback. One clean, decoded row per domain.
Free Apify credit covers a first run. No credit card to try.
What this Actor 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.
What we handle for you
- 🌐 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.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
domains | array | yes | Domains to look up. One per line. At least one is required. |
recordTypes | array | no | DNS record types to query for every domain (e.g. A, MX, TXT). Uppercased automatically. |
resolver | string | no | Primary DNS-over-HTTPS resolver. The other resolver is used automatically as a fallback. |
{
"domains": [
"github.com",
"cloudflare.com"
],
"recordTypes": [
"A",
"AAAA",
"MX",
"TXT",
"NS"
],
"resolver": "cloudflare"
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
domainresolver_usedrecordsrecord_types_queriedrecord_types_failedqueried_at
{
"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"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result emitted | $0.0010 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
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?
What happens if a domain doesn't exist?
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?
record_types_failed.Can I query custom record types?
recordTypes; numeric types outside the common set decode as TYPE<n> rather than crashing the row.Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors