Skip to content
Control Plane Labs

DNS Lookup

Query A, AAAA, CNAME, MX, TXT, NS, SOA, CAA and SRV records over DoH, with TTLs, the DNSSEC AD bit, and SPF, DMARC, MX and CAA read back in plain English.

Privacy: Queries go to /api/dns on this site, which forwards the name and record type to Cloudflare's DNS-over-HTTPS resolver. The edge function sees the domain you typed and your IP address for rate limiting; the resolver sees the domain and the edge function's address, not yours. Nothing is stored beyond an in-memory request counter.

Enter a domain and press Look up. Queries go to a Control Plane Labs edge function, which asks Cloudflare's resolver on your behalf — your address is never sent to the resolver.

Lookups run through /api/dns on this site, rate limited to 30 per hour per address. The endpoint sees the domain you typed and your IP for that limit; it does not store either. The upstream resolver sees only our edge function.

What it does

Type a domain, pick a record type or leave it on “all”, and get back what the resolver holds: the records themselves, their TTLs, and the DNSSEC AD bit. In “all” mode it fans out across A, AAAA, CNAME, MX, TXT, NS, SOA and CAA in parallel, and adds a TXT query for _dmarc.<domain> because the policy record lives on a different name than the one you typed.

Below the table the tool reads four things back in plain English. MX records are sorted by priority and the null MX form from RFC 7505 is called out rather than shown as a broken host. SPF is checked against the ten-lookup ceiling and its all qualifier is translated, so ~all is named as softfail rather than left as syntax. DMARC reports the policy, the subdomain policy, the sampling percentage and whether aggregate reports go anywhere. CAA lists which authorities may issue, distinguishes issuewild, and flags the critical bit.

How it works

The browser has no DNS API, so the query runs server-side at /api/dns. That edge function speaks to Cloudflare’s resolver using the JSON flavour of DNS-over-HTTPS described in RFC 8484. The reason for the hop is privacy rather than capability: calling a public resolver straight from the page would hand a third party the visitor’s IP address alongside every domain typed into the box. Going through the edge means the resolver sees the function, not the visitor.

Two response quirks are normalised before the answer reaches the page. Resolvers return CAA in the unknown-record presentation form from RFC 3597 — a length followed by hex bytes — so the endpoint decodes the flags byte, the tag length, the tag and the value into the 0 issue "letsencrypt.org" shape that dig prints. TXT arrives quoted and, past 255 bytes, split into several quoted strings that are meant to be concatenated; long DKIM keys and SPF records both hit this. The endpoint joins them so what you see is the string the record actually encodes.

A NXDOMAIN or SERVFAIL reply is a successful query with a bad answer, so those come back as 200 with the RCODE named and any SOA record from the authority section shown — that record is what tells you how long the negative answer will be cached.

Reading the AD bit honestly

The AD flag is the most misread field on this page. It means the resolver validated a DNSSEC signature chain from the root to this answer, per RFC 4035, and that the data matches what the zone owner signed. It does not mean the answer is correct, only that it was not tampered with in transit or forged by a cache.

Its absence is much weaker evidence than people assume. Most zones are still unsigned, and for an unsigned zone the resolver has nothing to validate, so no AD bit is the expected and correct outcome. A missing AD bit is only worth investigating when you know the parent zone publishes a DS record for the domain — then it points at a broken chain, usually a key rollover where the DS was never updated, which will make validating resolvers refuse the answer outright rather than fall back.

One caveat on provenance: the bit reflects Cloudflare’s validation, delivered over the TLS channel DoH gives you. That is not the same as validating locally.

When to reach for it

The common case is a change you just made: confirming that a new A record has propagated to a public resolver, or that a CNAME points where the vendor’s setup guide said it should. The TTL column is the part worth reading, since it tells you how long the previous value can still be served to somebody else.

Before a certificate issuance, check CAA. An empty CAA set means any authority may issue; a populated one that omits your ACME provider is the reason issuance fails with an unhelpful error. Before a mail change, check SPF and DMARC together — a p=reject policy with an SPF record that quietly exceeds ten lookups is a deliverability outage waiting for the next include to grow.

Frequently asked questions

Why does this go through a server instead of querying DNS from my browser?+
Browsers cannot send DNS queries — there is no JavaScript API for it. The alternative is calling a public DoH resolver directly from the page, which would hand a third party your IP address alongside every domain you look up. Proxying through /api/dns means the resolver sees the edge function, not you.
The answer differs from what dig tells me.+
You are asking a different resolver. This queries Cloudflare's public resolver, which serves whatever the authoritative nameservers published and whatever is still in its cache. If you just changed a record, Cloudflare may still be holding the old one until its TTL expires. Query the authoritative server directly with dig @ns1.example.com name type to see the change immediately.
What does the AD flag mean?+
AD is the Authenticated Data bit. It is set when the resolver validated the DNSSEC signature chain for the answer, so the response is what the zone owner signed. An absent AD bit usually just means the zone is not signed at all, which is still the common case; it is only alarming for a zone you know publishes DS records.
Why is SRV missing from the 'all' results?+
SRV records do not live on a bare domain. They are published under a _service._proto.example.com name, so querying example.com for SRV correctly returns nothing. Pick SRV explicitly and type the full prefixed name, for example _sip._tcp.example.com.
My SPF record looks fine but the tool warns about lookups.+
SPF permits at most ten DNS-querying mechanisms per evaluation, counted across every include: chain, and exceeding it is a permerror that receivers may treat as a failure. The count shown here only covers the mechanisms in the record itself — it cannot see inside the records your includes pull in, so the real total is at least what is displayed and often higher.

Data from Cloudflare DNS over HTTPS (1.1.1.1).