GET/api/v2/ns
NS lookup API
A domain's nameservers from the registry and from the zone, each one asked directly: lame, glue, serials, DNSSEC.
- 20 calls a minute per IP
- Same engine as the NS Lookup tool
{
"query": {
"domain": "github.com"
},
"zone": "github.com",
"apex": null,
"verdict": "ok",
"delegation": {
"parentZone": "com",
"registry": true,
"server": "c.gtld-servers.net",
"ip": "192.26.92.30",
"nameservers": [
"ns-520.awsdns-01.net",
"ns-421.awsdns-52.com",
"ns-1707.awsdns-21.co.uk",
"ns-1283.awsdns-32.org",
"dns1.p08.nsone.net",
"dns2.p08.nsone.net",
"dns3.p08.nsone.net",
"dns4.p08.nsone.net"
],
"ttl": 172800,
"glue": [
{
"host": "ns-421.awsdns-52.com",
"addresses": [
"205.251.193.165",
"2600:9000:5301:a500::1"
]
}
],
"ds": [],
"dsTtl": null,
"partial": false,
"tookMs": 134
},
"zoneNameservers": {
"nameservers": [
"ns-520.awsdns-01.net",
"ns-421.awsdns-52.com",
"ns-1707.awsdns-21.co.uk",
"ns-1283.awsdns-32.org",
"dns1.p08.nsone.net",
"dns2.p08.nsone.net",
"dns3.p08.nsone.net",
"dns4.p08.nsone.net"
],
"ttls": [
900,
3600
],
"viaCloudflare": false,
"otherSets": []
},
"nameservers": [
{
"host": "ns-520.awsdns-01.net",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"205.251.194.8"
],
"ipv6": [
"2600:9000:5302:800::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 37,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5302:800::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5302::/48",
"country": "US"
}
},
{
"ip": "205.251.194.8",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 37,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "f44751081fb84bdcbc85d81b117971ff -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.194.0/24",
"country": "US"
}
}
]
},
{
"host": "ns-421.awsdns-52.com",
"inRegistry": true,
"inZone": true,
"glueRelation": "sibling",
"glue": [
"205.251.193.165",
"2600:9000:5301:a500::1"
],
"staleGlue": [],
"ipv4": [
"205.251.193.165"
],
"ipv6": [
"2600:9000:5301:a500::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 25,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5301:a500::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5301::/48",
"country": "US"
}
},
{
"ip": "205.251.193.165",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 25,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "34c8e66292a5d8d420d9005aceb47197 -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.193.0/24",
"country": "US"
}
}
]
},
{
"host": "ns-1707.awsdns-21.co.uk",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"205.251.198.171"
],
"ipv6": [
"2600:9000:5306:ab00::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 22,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5306:ab00::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5306::/48",
"country": "US"
}
},
{
"ip": "205.251.198.171",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 22,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "2ebd1945da57ee2ecad0238275f9e8c1 -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.192.0/18",
"country": "US"
}
}
]
},
{
"host": "ns-1283.awsdns-32.org",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"205.251.197.3"
],
"ipv6": [
"2600:9000:5305:300::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 41,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5305:300::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5305::/48",
"country": "US"
}
},
{
"ip": "205.251.197.3",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 41,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "fd8c45285dda4b706153bf6653144345 -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.192.0/18",
"country": "US"
}
}
]
},
{
"host": "dns1.p08.nsone.net",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"198.51.44.8"
],
"ipv6": [
"2620:4d:4000:6259:7:8:0:1"
],
"cname": null,
"provider": {
"id": "ns1-connect",
"name": "NS1"
},
"status": "authoritative",
"lame": false,
"tookMs": 39,
"serial": 1656468023,
"nsTtl": 3600,
"differentNsSet": false,
"addresses": [
{
"ip": "2620:4d:4000:6259:7:8:0:1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "2620:4d:4000::/48",
"country": "US"
}
},
{
"ip": "198.51.44.8",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 39,
"retried": false,
"serial": 1656468023,
"edns": true,
"nsid": "ns1dns-bom04-3da15be1-87e3-439a-9232-e1e533ec72fc-5344-0",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "198.51.44.0/24",
"country": "US"
}
}
]
},
{
"host": "dns2.p08.nsone.net",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"198.51.45.8"
],
"ipv6": [
"2a00:edc0:6259:7:8::2"
],
"cname": null,
"provider": {
"id": "ns1-connect",
"name": "NS1"
},
"status": "authoritative",
"lame": false,
"tookMs": 296,
"serial": 1656468023,
"nsTtl": 3600,
"differentNsSet": false,
"addresses": [
{
"ip": "2a00:edc0:6259:7:8::2",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "2a00:edc0:6259::/48",
"country": "DE"
}
},
{
"ip": "198.51.45.8",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 296,
"retried": false,
"serial": 1656468023,
"edns": true,
"nsid": "ns1dns-lhr04-f79bae0e-1089-407a-a4c7-c9e3f42803e1-5347-0",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "198.51.45.0/24",
"country": "US"
}
}
]
},
{
"host": "dns3.p08.nsone.net",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"198.51.44.72"
],
"ipv6": [
"2620:4d:4000:6259:7:8:0:3"
],
"cname": null,
"provider": {
"id": "ns1-connect",
"name": "NS1"
},
"status": "authoritative",
"lame": false,
"tookMs": 41,
"serial": 1656468023,
"nsTtl": 3600,
"differentNsSet": false,
"addresses": [
{
"ip": "2620:4d:4000:6259:7:8:0:3",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "2620:4d:4000::/48",
"country": "US"
}
},
{
"ip": "198.51.44.72",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 41,
"retried": false,
"serial": 1656468023,
"edns": true,
"nsid": "ns1dns-bom04-b57d2d73-dd00-4fb2-8520-709fc8b12c7b-5326-0",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "198.51.44.0/24",
"country": "US"
}
}
]
},
{
"host": "dns4.p08.nsone.net",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"198.51.45.72"
],
"ipv6": [
"2a00:edc0:6259:7:8::4"
],
"cname": null,
"provider": {
"id": "ns1-connect",
"name": "NS1"
},
"status": "authoritative",
"lame": false,
"tookMs": 310,
"serial": 1656468023,
"nsTtl": 3600,
"differentNsSet": false,
"addresses": [
{
"ip": "2a00:edc0:6259:7:8::4",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "2a00:edc0:6259::/48",
"country": "DE"
}
},
{
"ip": "198.51.45.72",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 310,
"retried": false,
"serial": 1656468023,
"edns": true,
"nsid": "ns1dns-lhr04-4222cdf5-2f67-4f7f-a79b-29c7d9ff3b6c-5325-0",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 62597,
"name": "Nsone",
"prefix": "198.51.45.0/24",
"country": "US"
}
}
]
}
],
"soa": {
"mname": "ns-1707.awsdns-21.co.uk",
"rname": "awsdns-hostmaster.amazon.com",
"serial": 1,
"refresh": 7200,
"retry": 900,
"expire": 1209600,
"minimum": 86400
},
"dnsProviders": [
{
"id": "amazon-route-53",
"name": "Amazon Route 53",
"nameservers": 4,
"own": false
},
{
"id": "ns1-connect",
"name": "NS1",
"nameservers": 4,
"own": false
}
],
"networks": [
{
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.194.0/24",
"country": "US",
"nameservers": 4
},
{
"asn": 62597,
"name": "Nsone",
"prefix": "198.51.44.0/24",
"country": "US",
"nameservers": 4
}
],
"dnssec": {
"state": "unsigned",
"ds": [],
"keys": [],
"validated": false
},
"copies": [
{
"source": "google",
"status": "ok",
"nameservers": [
"dns4.p08.nsone.net",
"dns1.p08.nsone.net",
"ns-1707.awsdns-21.co.uk",
"ns-1283.awsdns-32.org",
"ns-520.awsdns-01.net",
"dns3.p08.nsone.net",
"ns-421.awsdns-52.com",
"dns2.p08.nsone.net"
],
"ttl": 1058,
"tookMs": 34
},
{
"source": "cloudflare",
"status": "ok",
"nameservers": [
"dns1.p08.nsone.net",
"dns2.p08.nsone.net",
"dns3.p08.nsone.net",
"dns4.p08.nsone.net",
"ns-1283.awsdns-32.org",
"ns-1707.awsdns-21.co.uk",
"ns-421.awsdns-52.com",
"ns-520.awsdns-01.net"
],
"ttl": 900,
"tookMs": 2
}
],
"registration": {
"registrar": "MarkMonitor Inc.",
"ianaId": "292",
"url": "http://www.markmonitor.com",
"statuses": [
"clientDeleteProhibited",
"clientTransferProhibited",
"clientUpdateProhibited"
],
"source": "rdap"
},
"issues": [
{
"severity": "info",
"code": "soa_serial_per_provider",
"message": "2 providers keep their own SOA serials (1, 1656468023): normal for a zone kept at two providers; compare the records, not the serials."
},
{
"severity": "info",
"code": "dnssec_unsigned",
"message": "The zone isn't signed with DNSSEC."
}
],
"tookMs": 2111
}How it works
Walks down from a root server to the registry and reads the delegation (the NS set, its TTL, the glue and the DS), then asks every listed nameserver's IPv4 addresses directly over TCP for the zone's SOA and NS with recursion off: whether it answers with authority, its serial, its time, whether it offers recursion or zone transfers to anyone, and whether it speaks EDNS. Google's and Cloudflare's cached copies and the registrar (RDAP, else WHOIS) come beside it.
Every reading the NS Lookup page makes that isn't fine comes back in issues: a lame delegation (no listed server serves the zone), lame servers, registry and zone listing different servers, missing or stale glue, one nameserver or one network, differing serials, an NS name that is an alias, open recursion, open zone transfers, missing EDNS, and a DS that matches no key.
Honest about what a server can't test: servers on Cloudflare's network are read through 1.1.1.1 (our servers can't connect to them), IPv6-only ones aren't tested, and a server silent over TCP while Google or Cloudflare still resolves the zone is nameserver_no_tcp, never lame. A subdomain is answered with the zone that holds it (apex says so).
Answers kept: Kept for the shortest NS TTL seen, 30 seconds to 5 minutes (30 seconds when a part failed), shared with the NS Lookup page. A kept answer carries an `Age` header.
Query parameters
domainstringrequiredA domain (a URL or an e-mail address works too; IDNs in Unicode are sent as Punycode).
Response fields
200 with this JSON object, plus tookMs, and incomplete with warnings when a source failed. Fields marked optional appear only when they apply.
queryobjectalwaysWhat was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).domainstringalwaysThe name looked up, lower case, IDNs as Punycode.
zonestring or nullalwaysThe zone the lookup is about (the name itself, or the zone that holds it); null when the registry couldn't be reached.apexobject or nullalwaysWhen the name isn't a zone of its own: what it is.namestringalwaysThe name looked up.kindstringalwaysinside_zone(a name insidezone),alias(a CNAME, not followed) ormissing(doesn't exist inzone).one of
"inside_zone","alias","missing"aliasTargetstring or nullalwaysThe alias's target, foralias.
verdictstringalwaysok,lame(no listed server serves the zone),partly_lame,dnssec_broken,no_tcp,mismatch(registry and zone differ),glue,one_network,issues(other warnings, seeissues),partly_checked,not_delegated,no_answer(the registry didn't answer),silent(no server answered us, and no resolver copy to compare) orunknown.one of
"ok","lame","partly_lame","dnssec_broken","no_tcp","mismatch","glue","one_network","issues","partly_checked","not_delegated","no_answer","silent","unknown"delegationobject or nullalwaysThe registry's (or parent zone's) referral, asked again with recursion off.Show 11 fields
parentZonestringalwaysThe zone that delegates it:com, or a parent zone for a delegated subdomain.registrybooleanalwaysThe parent is a registry (a TLD or a public suffix).serverstringalwaysThe parent's server asked.ipstring or nullalwaysIts address.nameserversarray of stringsalwaysThe NS set the registry hands out.ttlinteger or nullalwaysThe NS TTL at the cut, in seconds; null when the referral couldn't be asked again.gluearray of objectsalwaysGlue addresses the registry hands out.Show 2 fields
hoststringalwaysThe nameserver.addressesarray of stringsalwaysIts glue A and AAAA addresses.
dsarray of objectsalwaysDS records at the parent.Show 4 fields
keyTagintegeralwaysThe key tag of the DNSKEY it points at.algorithmintegeralwaysThe DNSSEC algorithm number (13 = ECDSA P-256).digestTypeintegeralwaysThe digest type (2 = SHA-256).digeststringalwaysThe digest, hexadecimal, upper case.
dsTtlinteger or nullalwaysThe DS TTL, in seconds.partialbooleanalwaysThe referral couldn't be asked again: names and IPv4 glue from the walk only.tookMsinteger or nullalwaysHow long that answer took, in milliseconds; null when it wasn't timed.
zoneNameserversobject or nullalwaysThe zone's own NS set, as most servers answered it with authority.Show 4 fields
nameserversarray of stringsalwaysThe NS set.ttlsarray of integersalwaysThe distinct NS TTLs the servers hand out, in seconds.viaCloudflarebooleanalwaysRead through 1.1.1.1 (every server is on Cloudflare's network).otherSetsarray of arraysalwaysOther NS sets some servers answered with (an old copy of the zone at a previous host).
nameserversarray of objectsalwaysEvery nameserver, the registry's in its order, then those only the zone lists.Show 17 fields
hoststringalwaysIts host name.inRegistrybooleanalwaysListed at the registry.inZonebooleanalwaysListed in the zone's own NS records.glueRelationstringalwaysWhere its name sits (RFC 9471):in_domain(inside the zone: glue required),sibling(under the parent: glue optional) orunrelated.one of
"in_domain","sibling","unrelated"gluearray of stringsalwaysGlue the registry hands out for it.staleGluearray of stringsalwaysGlue addresses that aren't among its own A/AAAA answers.ipv4array of stringsalwaysIts A records.ipv6array of stringsalwaysIts AAAA records.cnamestring or nullalwaysIts name is an alias (CNAME) for this name: not allowed for an NS (RFC 2181 §10.3).providerobject or nullalwaysThe DNS host its name belongs to, from documented NS patterns; null when unknown.Show 2 fields
idstringalwaysA stable id, e.g.amazon-route-53.namestringalwaysThe host's name.
statusstringalwaysIts answer over all its addresses:authoritative(answered the zone's SOA with authority),not_authoritative,refused,servfail,notauth,error_code(another code),timeout(after one retry),error,via_cloudflare(on Cloudflare's network: read through 1.1.1.1),ipv6_not_tested,private_address,no_address,unresolved(its name didn't resolve and there is no glue) orskipped(the lookup's deadline came first).one of
"authoritative","not_authoritative","refused","servfail","notauth","error_code","timeout","error","via_cloudflare","ipv6_not_tested","private_address","no_address","unresolved","skipped"lamebooleanalwaysIt doesn't serve the zone: a lame answer, or silence that Google and Cloudflare confirm with SERVFAIL.tookMsinteger or nullalwaysIts fastest authoritative answer, TCP setup included, in milliseconds.serialinteger or nullalwaysThe zone's SOA serial it serves.nsTtlinteger or nullalwaysThe NS TTL it hands out, in seconds.differentNsSetbooleanalwaysIt answers with a different NS set from the zone's.addressesarray of objectsalwaysEach address asked (IPv6 ones listed, not tested).Show 12 fields
ipstringalwaysThe address.statusstringalwaysIts answer:authoritative(answered the zone's SOA with authority),not_authoritative,refused,servfail,notauth,error_code(another code),timeout(after one retry),error,via_cloudflare(on Cloudflare's network: read through 1.1.1.1),ipv6_not_tested,private_address,no_address,unresolved(its name didn't resolve and there is no glue) orskipped(the lookup's deadline came first).one of
"authoritative","not_authoritative","refused","servfail","notauth","error_code","timeout","error","via_cloudflare","ipv6_not_tested","private_address","no_address","unresolved","skipped"rcodestring or nullalwaysThe response code it sent.tookMsinteger or nullalwaysHow long that answer took, in milliseconds; null when it wasn't timed.retriedbooleanalwaysThe first try got no answer; the second did or didn't.serialinteger or nullalwaysThe SOA serial.ednsboolean or nullalwaysIt answered with an EDNS OPT record.nsidstring or nullalwaysIts NSID (RFC 5001), when it sent one.recursionstring or nullalwaysopen(it resolves names for anyone),closedorunknown.one of
"open","closed","unknown",nullzoneTransferstring or nullalwaysAXFR for anyone:allowed,refusedorunknown.one of
"allowed","refused","unknown",nullspecialBlockstring or nullalwaysFor a private or special address: the IANA block it is in.networkobject or nullalwaysThe network behind the address (Team Cymru); null when unknown.Show 4 fields
asnintegeralwaysThe AS number that announces the address.namestringalwaysThe network's name, cleaned ("Google", "Amazon.com").prefixstringalwaysThe announced prefix the address is in, e.g.8.8.8.0/24.countrystringalwaysThe network's registration country (ISO 3166-1 alpha-2), as Team Cymru has it.
soaobject or nullalwaysThe zone's SOA, from the first server that answered with authority.Show 7 fields
mnamestring or nullalwaysThe primary (MNAME).rnamestring or nullalwaysThe contact mailbox (RNAME).serialintegeralwaysThe serial.refreshinteger or nullalwaysRefresh, in seconds.retryinteger or nullalwaysRetry, in seconds.expireinteger or nullalwaysExpire, in seconds.minimuminteger or nullalwaysThe negative-caching TTL, in seconds.
dnsProvidersarray of objectsalwaysThe DNS hosts behind the listed servers.Show 4 fields
idstringalwaysA stable id,own:<zone>for the zone's own servers,domain:<domain>for an unknown one.namestringalwaysIts name.nameserversintegeralwaysHow many listed servers it runs.ownbooleanalwaysThe zone runs its own servers.
networksarray of objectsalwaysThe networks behind the servers' IPv4 addresses, most servers first.Show 5 fields
asnintegeralwaysThe AS number that announces the address.namestringalwaysThe network's name, cleaned ("Google", "Amazon.com").prefixstringalwaysThe announced prefix the address is in, e.g.8.8.8.0/24.countrystringalwaysThe network's registration country (ISO 3166-1 alpha-2), as Team Cymru has it.nameserversintegeralwaysHow many listed servers it carries.
dnssecobjectalwaysDNSSEC at the cut.Show 4 fields
statestringalwayssigned(a DS matches a zone key),broken(no key matches, or signatures don't validate),keys_without_ds,unsignedorunknown.one of
"signed","broken","keys_without_ds","unsigned","unknown"dsarray of objectsalwaysThe DS records at the parent.Show 4 fields
keyTagintegeralwaysThe key tag of the DNSKEY it points at.algorithmintegeralwaysThe DNSSEC algorithm number (13 = ECDSA P-256).digestTypeintegeralwaysThe digest type (2 = SHA-256).digeststringalwaysThe digest, hexadecimal, upper case.
keysarray of objectsalwaysThe zone's DNSKEYs.Show 4 fields
keyTagintegeralwaysIts key tag.flagsintegeralways257 = KSK, 256 = ZSK.algorithmintegeralwaysThe algorithm number.kskbooleanalwaysA key-signing key.
validatedboolean or nullalwaysGoogle validated the zone's SOA (the AD flag).
copiesarray of objectsalwaysGoogle's and Cloudflare's cached copies of the NS set (their TTLs are the time left).Show 5 fields
sourcestringalwaysgoogleorcloudflare.one of
"google","cloudflare"statusstringalwaysThe answer:ok(records came back),nodata(the name exists without them),nxdomain(no such name),servfail,refused,timeout,errororunreadable(an answer our decoder refuses).one of
"ok","nodata","nxdomain","servfail","refused","timeout","error","unreadable"nameserversarray of stringsalwaysThe NS set.ttlinteger or nullalwaysThe TTL left, in seconds.tookMsintegeralwaysHow long that answer took, in milliseconds.
registrationobject or nullalwaysThe registration (RDAP, else WHOIS); null when it couldn't be read.Show 5 fields
registrarstring or nullalwaysThe registrar's name.ianaIdstring or nullalwaysThe registrar's IANA id.urlstring or nullalwaysThe registrar's website.statusesarray of stringsalwaysThe registration's status codes (EPP).sourcestring or nullalwaysWhere it was read:rdaporwhois.one of
"rdap","whois",null
issuesarray of objectsalwaysProblems found in the target's configuration, worst first. Empty when there are none.severitystringalwayserrorbreaks something,warningrisks it,infois worth knowing.one of
"error","warning","info"codestringalwaysStable machine-readable code.messagestringalwaysThe problem and what to do about it, in plain English.
Errors
429rate_limitedAlso when the domain was looked up 30 times in the last minute by all callers together (a lookup that isn't kept asks its nameservers directly).
Plus the errors every endpoint can return: 400 for a missing or unreadable parameter, 429 past the limit, 503 when every source failed.
Code samples
curl "https://dnsrobot.net/api/v2/ns?domain=github.com"const params = new URLSearchParams({ domain: "github.com" });
const res = await fetch(`https://dnsrobot.net/api/v2/ns?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.nameservers);import requests
r = requests.get(
"https://dnsrobot.net/api/v2/ns",
params={"domain": "github.com"},
timeout=30,
)
data = r.json()
if not r.ok:
raise RuntimeError(data["error"]["message"])
print(data["nameservers"])package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
)
func main() {
q := url.Values{"domain": {"github.com"}}
res, err := http.Get("https://dnsrobot.net/api/v2/ns?" + q.Encode())
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode != http.StatusOK {
panic(data["error"])
}
fmt.Println(data["nameservers"])
}<?php
$query = http_build_query(["domain" => "github.com"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/ns?" . $query, false, $context), true);
if (isset($data["error"])) {
throw new RuntimeException($data["error"]["message"]);
}
print_r($data["nameservers"]);require "net/http"
require "json"
uri = URI("https://dnsrobot.net/api/v2/ns")
uri.query = URI.encode_www_form(domain: "github.com")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["nameservers"]// Cargo.toml: reqwest = { version = "0.13", features = ["blocking", "json"] }, serde_json = "1"
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::get("https://dnsrobot.net/api/v2/ns?domain=github.com")?;
let ok = res.status().is_success();
let data: serde_json::Value = res.json()?;
if !ok {
return Err(data["error"]["message"].to_string().into());
}
println!("{}", data["nameservers"]);
Ok(())
}using System.Text.Json;
using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/ns?domain=github.com");
var data = JsonDocument.Parse(await res.Content.ReadAsStringAsync()).RootElement;
if (!res.IsSuccessStatusCode)
throw new Exception(data.GetProperty("error").GetProperty("message").GetString());
Console.WriteLine(data.GetProperty("nameservers"));github.com: Route 53 and NS1
GET /api/v2/ns?domain=github.com{
"query": {
"domain": "github.com"
},
"zone": "github.com",
"apex": null,
"verdict": "ok",
"delegation": {
"parentZone": "com",
"registry": true,
"server": "c.gtld-servers.net",
"ip": "192.26.92.30",
"nameservers": [
"ns-520.awsdns-01.net",
"ns-421.awsdns-52.com",
"ns-1707.awsdns-21.co.uk",
// … 5 more items
],
"ttl": 172800,
"glue": [
{
"host": "ns-421.awsdns-52.com",
"addresses": [
"205.251.193.165",
"2600:9000:5301:a500::1"
]
}
],
"ds": [],
"dsTtl": null,
"partial": false,
"tookMs": 134
},
"zoneNameservers": {
"nameservers": [
"ns-520.awsdns-01.net",
"ns-421.awsdns-52.com",
"ns-1707.awsdns-21.co.uk",
// … 5 more items
],
"ttls": [
900,
3600
],
"viaCloudflare": false,
"otherSets": []
},
"nameservers": [
{
"host": "ns-520.awsdns-01.net",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"205.251.194.8"
],
"ipv6": [
"2600:9000:5302:800::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 37,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5302:800::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5302::/48",
"country": "US"
}
},
{
"ip": "205.251.194.8",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 37,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "f44751081fb84bdcbc85d81b117971ff -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.194.0/24",
"country": "US"
}
}
]
},
{
"host": "ns-421.awsdns-52.com",
"inRegistry": true,
"inZone": true,
"glueRelation": "sibling",
"glue": [
"205.251.193.165",
"2600:9000:5301:a500::1"
],
"staleGlue": [],
"ipv4": [
"205.251.193.165"
],
"ipv6": [
"2600:9000:5301:a500::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 25,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5301:a500::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5301::/48",
"country": "US"
}
},
{
"ip": "205.251.193.165",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 25,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "34c8e66292a5d8d420d9005aceb47197 -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.193.0/24",
"country": "US"
}
}
]
},
{
"host": "ns-1707.awsdns-21.co.uk",
"inRegistry": true,
"inZone": true,
"glueRelation": "unrelated",
"glue": [],
"staleGlue": [],
"ipv4": [
"205.251.198.171"
],
"ipv6": [
"2600:9000:5306:ab00::1"
],
"cname": null,
"provider": {
"id": "amazon-route-53",
"name": "Amazon Route 53"
},
"status": "authoritative",
"lame": false,
"tookMs": 22,
"serial": 1,
"nsTtl": 900,
"differentNsSet": false,
"addresses": [
{
"ip": "2600:9000:5306:ab00::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "2600:9000:5306::/48",
"country": "US"
}
},
{
"ip": "205.251.198.171",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 22,
"retried": false,
"serial": 1,
"edns": true,
"nsid": "2ebd1945da57ee2ecad0238275f9e8c1 -",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.192.0/18",
"country": "US"
}
}
]
},
// … 5 more items
],
"soa": {
"mname": "ns-1707.awsdns-21.co.uk",
"rname": "awsdns-hostmaster.amazon.com",
"serial": 1,
"refresh": 7200,
"retry": 900,
"expire": 1209600,
"minimum": 86400
},
"dnsProviders": [
{
"id": "amazon-route-53",
"name": "Amazon Route 53",
"nameservers": 4,
"own": false
},
{
"id": "ns1-connect",
"name": "NS1",
"nameservers": 4,
"own": false
}
],
"networks": [
{
"asn": 16509,
"name": "Amazon.com",
"prefix": "205.251.194.0/24",
"country": "US",
"nameservers": 4
},
{
"asn": 62597,
"name": "Nsone",
"prefix": "198.51.44.0/24",
"country": "US",
"nameservers": 4
}
],
"dnssec": {
"state": "unsigned",
"ds": [],
"keys": [],
"validated": false
},
"copies": [
{
"source": "google",
"status": "ok",
"nameservers": [
"dns4.p08.nsone.net",
"dns1.p08.nsone.net",
"ns-1707.awsdns-21.co.uk",
// … 5 more items
],
"ttl": 1058,
"tookMs": 34
},
{
"source": "cloudflare",
"status": "ok",
"nameservers": [
"dns1.p08.nsone.net",
"dns2.p08.nsone.net",
"dns3.p08.nsone.net",
// … 5 more items
],
"ttl": 900,
"tookMs": 2
}
],
"registration": {
"registrar": "MarkMonitor Inc.",
"ianaId": "292",
"url": "http://www.markmonitor.com",
"statuses": [
"clientDeleteProhibited",
"clientTransferProhibited",
"clientUpdateProhibited"
],
"source": "rdap"
},
"issues": [
{
"severity": "info",
"code": "soa_serial_per_provider",
"message": "2 providers keep their own SOA serials (1, 1656468023): normal for a zone kept at two providers;…"
},
{
"severity": "info",
"code": "dnssec_unsigned",
"message": "The zone isn't signed with DNSSEC."
}
],
"tookMs": 2111
}Shortened for the page: long lists show their first items.
wikipedia.org
GET /api/v2/ns?domain=wikipedia.org{
"query": {
"domain": "wikipedia.org"
},
"zone": "wikipedia.org",
"apex": null,
"verdict": "one_network",
"delegation": {
"parentZone": "org",
"registry": true,
"server": "b0.org.afilias-nst.org",
"ip": "199.19.54.1",
"nameservers": [
"ns1.wikimedia.org",
"ns2.wikimedia.org",
"ns0.wikimedia.org"
],
"ttl": 3600,
"glue": [
{
"host": "ns0.wikimedia.org",
"addresses": [
"208.80.154.238",
"2620:0:861:53::1"
]
},
{
"host": "ns1.wikimedia.org",
"addresses": [
"208.80.153.231",
"2620:0:860:53::1"
]
},
{
"host": "ns2.wikimedia.org",
"addresses": [
"198.35.27.27",
"2a02:ec80:53::1"
]
}
],
"ds": [],
"dsTtl": null,
"partial": false,
"tookMs": 50
},
"zoneNameservers": {
"nameservers": [
"ns1.wikimedia.org",
"ns2.wikimedia.org",
"ns0.wikimedia.org"
],
"ttls": [
172800
],
"viaCloudflare": false,
"otherSets": []
},
"nameservers": [
{
"host": "ns1.wikimedia.org",
"inRegistry": true,
"inZone": true,
"glueRelation": "sibling",
"glue": [
"208.80.153.231",
"2620:0:860:53::1"
],
"staleGlue": [],
"ipv4": [
"208.80.153.231"
],
"ipv6": [
"2620:0:860:53::1"
],
"cname": null,
"provider": null,
"status": "authoritative",
"lame": false,
"tookMs": 512,
"serial": 2026060420,
"nsTtl": 172800,
"differentNsSet": false,
"addresses": [
{
"ip": "2620:0:860:53::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "2620:0:860::/48",
"country": "US"
}
},
{
"ip": "208.80.153.231",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 512,
"retried": false,
"serial": 2026060420,
"edns": true,
"nsid": "dns2005-auth",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "208.80.152.0/23",
"country": "US"
}
}
]
},
{
"host": "ns2.wikimedia.org",
"inRegistry": true,
"inZone": true,
"glueRelation": "sibling",
"glue": [
"198.35.27.27",
"2a02:ec80:53::1"
],
"staleGlue": [],
"ipv4": [
"198.35.27.27"
],
"ipv6": [
"2a02:ec80:53::1"
],
"cname": null,
"provider": null,
"status": "authoritative",
"lame": false,
"tookMs": 302,
"serial": 2026060420,
"nsTtl": 172800,
"differentNsSet": false,
"addresses": [
{
"ip": "2a02:ec80:53::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "2a02:ec80:53::/48",
"country": "US"
}
},
{
"ip": "198.35.27.27",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 302,
"retried": false,
"serial": 2026060420,
"edns": true,
"nsid": "dns3003-auth",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "198.35.27.0/24",
"country": "US"
}
}
]
},
{
"host": "ns0.wikimedia.org",
"inRegistry": true,
"inZone": true,
"glueRelation": "sibling",
"glue": [
"208.80.154.238",
"2620:0:861:53::1"
],
"staleGlue": [],
"ipv4": [
"208.80.154.238"
],
"ipv6": [
"2620:0:861:53::1"
],
"cname": null,
"provider": null,
"status": "authoritative",
"lame": false,
"tookMs": 430,
"serial": 2026060420,
"nsTtl": 172800,
"differentNsSet": false,
"addresses": [
{
"ip": "2620:0:861:53::1",
"status": "ipv6_not_tested",
"rcode": null,
"tookMs": null,
"retried": false,
"serial": null,
"edns": null,
"nsid": null,
"recursion": null,
"zoneTransfer": null,
"specialBlock": null,
"network": {
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "2620:0:861::/48",
"country": "US"
}
},
{
"ip": "208.80.154.238",
"status": "authoritative",
"rcode": "NOERROR",
"tookMs": 430,
"retried": false,
"serial": 2026060420,
"edns": true,
"nsid": "dns1005-auth",
"recursion": "closed",
"zoneTransfer": "refused",
"specialBlock": null,
"network": {
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "208.80.154.0/23",
"country": "US"
}
}
]
}
],
"soa": {
"mname": "ns0.wikimedia.org",
"rname": "hostmaster.wikimedia.org",
"serial": 2026060420,
"refresh": 43200,
"retry": 7200,
"expire": 1209600,
"minimum": 3600
},
"dnsProviders": [
{
"id": "domain:wikimedia.org",
"name": "wikimedia.org",
"nameservers": 3,
"own": false
}
],
"networks": [
{
"asn": 14907,
"name": "Wikimedia Foundation",
"prefix": "208.80.152.0/23",
"country": "US",
"nameservers": 3
}
],
"dnssec": {
"state": "unsigned",
"ds": [],
"keys": [],
"validated": false
},
"copies": [
{
"source": "google",
"status": "ok",
"nameservers": [
"ns2.wikimedia.org",
"ns0.wikimedia.org",
"ns1.wikimedia.org"
],
"ttl": 21210,
"tookMs": 46
},
{
"source": "cloudflare",
"status": "ok",
"nameservers": [
"ns0.wikimedia.org",
"ns1.wikimedia.org",
"ns2.wikimedia.org"
],
"ttl": 172800,
"tookMs": 141
}
],
"registration": {
"registrar": "MarkMonitor Inc.",
"ianaId": "292",
"url": "https://www.markmonitor.com/about-us/",
"statuses": [
"clientDeleteProhibited",
"clientTransferProhibited",
"clientUpdateProhibited"
],
"source": "rdap"
},
"issues": [
{
"severity": "warning",
"code": "single_network",
"message": "Every nameserver answers from AS14907 (Wikimedia Foundation): one routing problem there reaches …"
},
{
"severity": "info",
"code": "dnssec_unsigned",
"message": "The zone isn't signed with DNSSEC."
}
],
"tookMs": 2572
}Shortened for the page: long lists show their first items.