DNS trace & propagation checker.

The three terminals in one page: a dig +trace from the root servers down to the authoritative answer, the same question put to every authoritative nameserver with its zone serial, and what the public resolvers are caching right now. When one resolver sees the new record and another is clinging to the old one, this shows which, why, and how long until it lets go.

Traced bbc.co.uk. NS from the root in 3 hops JSON · text

Authoritative answer dns0.bbc.co.uk., dns0.bbc.com., dns1.bbc.co.uk., dns1.bbc.com., ddns0.bbc.co.uk., ddns0.bbc.com., ddns1.bbc.co.uk., ddns1.bbc.com. from the servers for bbc.co.uk.
Public resolvers All 4 resolvers agree with the authoritative servers Cloudflare, Google, Quad9, OpenDNS
Authoritative servers 8 in the delegation all answer the same, same serial

Delegation path iterative, from the root hints, no recursion

  1. 0 referral . delegates uk. asked l.root-servers.net. 199.7.83.42 · 190.6ms · NOERROR

    nsa.nic.uk. · nsb.nic.uk. · nsc.nic.uk. · nsd.nic.uk. · dns1.nic.uk. · dns2.nic.uk. · dns3.nic.uk. · dns4.nic.uk.

    16 glue records (addresses the parent hands out for those nameservers)
    nsa.nic.uk.A156.154.100.3
    nsb.nic.uk.A156.154.101.3
    nsc.nic.uk.A156.154.102.3
    nsd.nic.uk.A156.154.103.3
    dns1.nic.uk.A213.248.216.1
    dns2.nic.uk.A103.49.80.1
    dns3.nic.uk.A213.248.220.1
    dns4.nic.uk.A43.230.48.1
    nsa.nic.uk.AAAA2001:502:ad09::3
    nsb.nic.uk.AAAA2001:502:2eda::3
    nsc.nic.uk.AAAA2610:a1:1009::3
    nsd.nic.uk.AAAA2610:a1:1010::3
    dns1.nic.uk.AAAA2a01:618:400::1
    dns2.nic.uk.AAAA2401:fd80:400::1
    dns3.nic.uk.AAAA2a01:618:404::1
    dns4.nic.uk.AAAA2401:fd80:404::1
  2. 1 referral uk. delegates bbc.co.uk. asked nsb.nic.uk. 156.154.101.3 · 11.4ms · NOERROR

    dns1.bbc.co.uk. · ddns0.bbc.com. · dns0.bbc.co.uk. · ddns1.bbc.com. · ddns1.bbc.co.uk. · dns0.bbc.com. · ddns0.bbc.co.uk. · dns1.bbc.com.

    8 glue records (addresses the parent hands out for those nameservers)
    dns0.bbc.co.uk.A198.51.44.9
    dns1.bbc.co.uk.A198.51.45.9
    ddns0.bbc.co.uk.A148.163.199.1
    ddns1.bbc.co.uk.A148.163.199.65
    dns0.bbc.co.uk.AAAA2620:4d:4000:6259:7:9:0:1
    dns1.bbc.co.uk.AAAA2a00:edc0:6259:7:9::2
    ddns0.bbc.co.uk.AAAA2607:f740:e04e::1
    ddns1.bbc.co.uk.AAAA2607:f740:e04e:4::1
  3. 2 answer bbc.co.uk. asked dns0.bbc.co.uk. 198.51.44.9 · 10.6ms · NOERROR aa
    bbc.co.uk.900NSdns0.bbc.co.uk.
    bbc.co.uk.900NSdns0.bbc.com.
    bbc.co.uk.900NSdns1.bbc.co.uk.
    bbc.co.uk.900NSdns1.bbc.com.
    bbc.co.uk.900NSddns0.bbc.co.uk.
    bbc.co.uk.900NSddns0.bbc.com.
    bbc.co.uk.900NSddns1.bbc.co.uk.
    bbc.co.uk.900NSddns1.bbc.com.

Authoritative servers every nameserver for bbc.co.uk., asked directly

StatusServerSerialAnswer
match dns0.bbc.co.uk.198.51.44.9 · 11.9ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match dns1.bbc.co.uk.198.51.45.9 · 9.9ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match ddns0.bbc.co.uk.148.163.199.1 · 10.6ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match ddns1.bbc.com.148.163.199.193 · 10.6ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match dns0.bbc.com.198.51.44.73 · 11.1ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match ddns1.bbc.co.uk.148.163.199.65 · 10.7ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match ddns0.bbc.com.148.163.199.129 · 9.7ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.
match dns1.bbc.com.198.51.45.73 · 12.4ms 2026110500 dns0.bbc.co.uk.
dns0.bbc.com.
dns1.bbc.co.uk.
dns1.bbc.com.
ddns0.bbc.co.uk.
ddns0.bbc.com.
ddns1.bbc.co.uk.
ddns1.bbc.com.

Public resolvers what each one is serving from cache right now

StatusResolverAnswerCache
match Cloudflare1.1.1.1 · 12ms dns0.bbc.co.uk. ttl 802
dns0.bbc.com. ttl 802
dns1.bbc.co.uk. ttl 802
dns1.bbc.com. ttl 802
ddns0.bbc.co.uk. ttl 802
ddns0.bbc.com. ttl 802
ddns1.bbc.co.uk. ttl 802
ddns1.bbc.com. ttl 802
Same answer, cached 1m 38s ago; re-fetches in 13m 22s.
match Google8.8.8.8 · 11.6ms ddns1.bbc.co.uk. ttl 832
dns0.bbc.com. ttl 832
ddns0.bbc.com. ttl 832
dns1.bbc.co.uk. ttl 832
dns0.bbc.co.uk. ttl 832
dns1.bbc.com. ttl 832
ddns1.bbc.com. ttl 832
ddns0.bbc.co.uk. ttl 832
Same answer, cached 1m 8s ago; re-fetches in 13m 52s.
match Quad99.9.9.9 · 11.3ms ddns1.bbc.com. ttl 192
dns1.bbc.co.uk. ttl 192
ddns0.bbc.com. ttl 192
ddns1.bbc.co.uk. ttl 192
ddns0.bbc.co.uk. ttl 192
dns1.bbc.com. ttl 192
dns0.bbc.com. ttl 192
dns0.bbc.co.uk. ttl 192
Same answer, cached 11m 48s ago; re-fetches in 3m 12s.
match OpenDNS208.67.222.222 · 11.1ms dns0.bbc.co.uk. ttl 192
dns0.bbc.com. ttl 192
dns1.bbc.co.uk. ttl 192
dns1.bbc.com. ttl 192
ddns0.bbc.co.uk. ttl 192
ddns0.bbc.com. ttl 192
ddns1.bbc.co.uk. ttl 192
ddns1.bbc.com. ttl 192
Same answer, cached 11m 48s ago; re-fetches in 3m 12s.

Findings

  • pass
    Authoritative answer ddns0.bbc.co.uk., ddns0.bbc.com., ddns1.bbc.co.uk., ddns1.bbc.com., dns0.bbc.co.uk., dns0.bbc.com., dns1.bbc.co.uk., dns1.bbc.com.

    From the servers for bbc.co.uk., TTL 15m 0s. This is what every resolver converges on.

  • pass
    Delegation 8 nameservers

    The parent zone and the zone itself list the same nameservers.

  • pass
    Glue 8 of 8 records match

    Every address the parent hands out for the nameservers matches what the zone itself publishes.

  • pass
    Authoritative servers 8 of 8 answered

    Every nameserver in the delegation responded.

  • pass
    Zone serial 2026110500 on every server

    All nameservers hold the same version of the zone.

  • pass
    Public resolvers 4 of 4 match

    Cloudflare, Google, Quad9 and OpenDNS all return the authoritative answer. If a user still sees something else, their ISP's resolver or their own machine is caching it.

The same walk from your own machine: dig +trace +additional bbc.co.uk NS

About this tool

This server does what a recursive resolver does when its cache is empty, and shows you every step. It asks a root server for the name with recursion switched off, gets a referral to the top-level domain's servers plus their addresses (glue), asks one of those, gets a referral to your zone's servers, and asks one of those for the record. That last answer, with the authoritative flag set, is the truth every resolver in the world eventually converges on. It is exactly what dig +trace +additional prints, laid out so the referral, the glue and the answer are distinguishable without knowing the format.

Then it does two things dig does not. It asks every nameserver in the delegation for the record and for the zone's SOA serial, so a secondary that has not picked up the latest change shows up as a different serial and a different answer. And it asks the four large public resolvers with recursion on, compares what they are serving against the authoritative answer, and turns the TTL each one returns into "cached this long ago, expires in this long". A resolver marked stale is not broken; it is doing what TTLs tell it to. The number next to it is how long you have to wait.

What the trace reports

SectionWhat to look for
Delegation pathOne hop per zone: root, TLD, your zone (and any zone in between). Each shows which server answered, how fast, the NS set it referred you to and the glue it handed out. The final hop carries the authoritative answer, or the SOA that accompanies a negative one.
Authoritative serversEach nameserver in the delegation asked directly, with its SOA serial and its answer. They should be identical. A lower serial on one server is a secondary that has not transferred the zone; an answer without the authoritative flag is a lame server.
Public resolversCloudflare, Google, Quad9 and OpenDNS with recursion on. Match means the same answer as the authoritative servers; the cache column says how long ago it was fetched and when it will be refreshed. Stale means the previous answer is still being served, and for how much longer.
FindingsDelegation (parent NS set versus the zone's own), glue (parent's addresses versus the zone's records), servers answering, serials in agreement, lame delegation, resolver consistency.

Check DNS propagation

"Propagation" is cache expiry. When you change a record, nothing is pushed anywhere; every resolver that had the old value keeps serving it until the TTL it cached runs out, then asks again. So the question "has it propagated" has a precise answer: which resolvers still hold the old value, and how many seconds are left on each. That is the Public resolvers table. A resolver showing the new value with the full TTL has refreshed. One showing the old value with 4,000 seconds left will keep doing so for a bit over an hour, and there is nothing to be done about it from your side, which is why you lower the TTL a day before a change rather than after. The longer explanation is how long DNS propagation takes.

Two things this catches that a single-resolver lookup does not. First, a change that has propagated to resolvers but not to all of your own nameservers: the authoritative table shows one server on the old serial, and any resolver that happens to ask that one will get the old answer again after it refreshes. Second, a negative cache: a name you looked up before creating it is remembered as not existing for the SOA's negative TTL, and the resolver will say so until that runs out.

Stale glue and delegation mismatches

When your nameservers are inside the zone they serve (ns1.example.com serving example.com), a resolver cannot look up their addresses without already knowing them. The parent zone breaks the loop by handing out their addresses alongside the referral: glue. Glue is set at the registrar as "host records" or "child nameservers", and it is the thing people forget when they move a nameserver. The zone says ns1 is at the new address; the parent still says the old one. Resolvers that trust the parent's glue reach a dead server or, worse, whoever has that address now. The Glue finding compares every address the parent hands out with what the zone itself publishes, and names the one that moved.

The Delegation finding compares the NS set at the parent (what the registrar published) with the NS set in the zone (what your DNS provider serves). They should be identical. When they differ, resolvers are free to use either, which produces the maddening pattern where a name works from one network and not another. The usual cause is a nameserver change made in one place and not the other.

The dig incantations this replaces

CommandWhat it shows
dig +trace +additional example.com AThe delegation path from the root, with glue. What the Delegation path section shows.
dig @ns1.example.com example.com SOA +norecurseThe zone serial on one authoritative server. Run once per nameserver and compare: the Authoritative servers table.
dig @1.1.1.1 example.com A, then @8.8.8.8, @9.9.9.9What each public resolver is caching, with remaining TTL. The Public resolvers table.
dig +norecurse @a.gtld-servers.net example.com NSThe delegation and glue as the parent sees it. Compare with dig @ns1.example.com example.com NS for the child's view: the Delegation and Glue findings.
dig example.com NS +nssearchSOA serial from every nameserver in one go. Rarely remembered, and it uses the system resolver to find them.

Common problems this finds

Examples

From the command line

curl "kirkdiamond.com/tools/dns-trace?name=example.com&type=MX" prints the trace in dig's layout followed by the server and resolver tables; add &format=json for the structured version. Queries go straight to the root servers, the delegated nameservers and the four public resolvers, with recursion off for the walk and on for the resolvers. Nothing about the query is stored.

Every parameter, the JSON field names, rate limits and ready-made CI checks are in the API and curl reference.