What it is
The SOA (Start of Authority) record sits at the top of every DNS zone and describes the zone itself: which server is the primary, who runs it, a version number, and timers that secondary servers and resolvers use. Every zone has exactly one, at its apex. It's defined in RFC 1035, and RFC 2308 redefined its last field as the negative-caching TTL.
example.com. 3600 IN SOA ns1.example.com. hostmaster.example.com. (
2026100501 ; serial
7200 ; refresh
3600 ; retry
1209600 ; expire
3600 ) ; minimum (negative-caching TTL)
The fields
| Field | Meaning |
|---|---|
| MNAME | The primary name server for the zone (ns1.example.com.) |
| RNAME | The admin mailbox, with the first . standing for @: hostmaster.example.com. is hostmaster@example.com |
| Serial | Zone version. Secondaries transfer the zone only when it increases. YYYYMMDDnn is the usual convention |
| Refresh | Seconds between a secondary's checks of the primary's serial |
| Retry | Seconds to wait before retrying after a failed refresh |
| Expire | Seconds after which a secondary that can't reach the primary stops answering for the zone |
| Minimum | Since RFC 2308: how long resolvers cache "this name doesn't exist" (NXDOMAIN) and "no record of this type" answers |
The negative-caching TTL is actually the lower of the SOA record's own TTL and the minimum field. RFC 1912 suggests roughly 1-3 hours for refresh, a smaller retry, and 2-4 weeks for expire. With NOTIFY (RFC 1996), which every modern server sends, refresh is only a fallback: secondaries hear about changes within seconds.
Common setups
Managed DNS providers write the SOA for you. Cloudflare, Route 53, Google Cloud DNS and most registrar DNS show it read-only or let you edit only a few timers; Route 53's default negative-caching value is 86400 seconds (a day), Cloudflare's is 1800. The serial on these services is often a timestamp or a counter they manage. You only maintain the SOA by hand when you run your own BIND, Knot, NSD or PowerDNS servers.
How to check it
Our DNS Lookup can't query SOA records, so use dig:
dig example.com SOA +short
dig example.com SOA +multiline
dig @ns2.example.com example.com SOA +short
Compare the serial from each of the domain's name servers (see dig example.com NS +short): a secondary showing an older serial hasn't picked up the latest change. On Windows: nslookup -type=SOA example.com. Asking for a name that doesn't exist also returns the SOA in the authority section, which is how resolvers learn the negative TTL.
Common mistakes
- Editing a self-hosted zone without raising the serial, so secondaries keep serving the old data.
- Setting the serial to a lower number (for example switching from a date to a counter): secondaries ignore it until it wraps or the zone is retransferred.
- An RNAME with a real
@or an unescaped dot in the local part. - A very high minimum: a record queried before you created it keeps answering "doesn't exist" for that long. See DNS propagation.
Related record types
- NS record: the servers that hold the zone the SOA describes.
- DNS TTL: positive caching, the counterpart of the minimum field.
- CAA record: another apex record our lookup can't query.
- DNS propagation: why changes and new names take time to appear.