GET/api/v2/cname

CNAME lookup API

Follow a name's CNAME chain hop by hop to its addresses, with the platform behind it and dangling or looping targets.

GEThttps://dnsrobot.netBase URL/api/v2Version/cnameEndpoint?name=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "name": "www.wikipedia.org"
  },
  "unicode": null,
  "verdict": "alias",
  "cnames": 1,
  "chain": [
    {
      "name": "www.wikipedia.org",
      "zone": "wikipedia.org",
      "status": "cname",
      "cnames": [
        {
          "target": "dyna.wikimedia.org",
          "ttl": 86400
        }
      ],
      "otherTypes": [],
      "ipv4": [],
      "ipv6": [],
      "aTtl": null,
      "aaaaTtl": null,
      "negativeTtl": null,
      "apex": false,
      "answeredBy": "authoritative",
      "server": "ns1.wikimedia.org",
      "ip": "208.80.153.231",
      "authoritative": true,
      "dnsOperators": [
        {
          "id": "domain:wikimedia.org",
          "name": "wikimedia.org"
        }
      ],
      "zoneOnCloudflare": false,
      "platform": null,
      "tookMs": 542
    },
    {
      "name": "dyna.wikimedia.org",
      "zone": "wikimedia.org",
      "status": "address",
      "cnames": [],
      "otherTypes": [],
      "ipv4": [
        "103.102.166.224"
      ],
      "ipv6": [
        "2001:df2:e500:ed1a::1"
      ],
      "aTtl": 180,
      "aaaaTtl": 180,
      "negativeTtl": null,
      "apex": false,
      "answeredBy": "authoritative",
      "server": "ns1.wikimedia.org",
      "ip": "208.80.153.231",
      "authoritative": true,
      "dnsOperators": [
        {
          "id": "domain:wikimedia.org",
          "name": "wikimedia.org"
        }
      ],
      "zoneOnCloudflare": false,
      "platform": null,
      "tookMs": 498
    }
  ],
  "end": {
    "reason": "address",
    "name": "dyna.wikimedia.org",
    "loopsBackTo": null
  },
  "target": {
    "name": "dyna.wikimedia.org",
    "ipv4": [
      "103.102.166.224"
    ],
    "ipv6": [
      "2001:df2:e500:ed1a::1"
    ],
    "network": {
      "asn": 14907,
      "name": "Wikimedia Foundation",
      "prefix": "103.102.166.0/24",
      "country": "US"
    }
  },
  "platform": null,
  "lowestTtl": {
    "ttl": 180,
    "name": "dyna.wikimedia.org",
    "type": "A"
  },
  "dnssec": [
    {
      "name": "www.wikipedia.org",
      "validated": false
    },
    {
      "name": "dyna.wikimedia.org",
      "validated": false
    }
  ],
  "zoneAliases": {
    "zone": "wikipedia.org",
    "mx": [
      {
        "host": "mx-in1001.wikimedia.org",
        "cname": null
      },
      {
        "host": "mx-in2001.wikimedia.org",
        "cname": null
      }
    ],
    "ns": [
      {
        "host": "ns2.wikimedia.org",
        "cname": null
      },
      {
        "host": "ns0.wikimedia.org",
        "cname": null
      },
      {
        "host": "ns1.wikimedia.org",
        "cname": null
      }
    ]
  },
  "copies": [
    {
      "source": "google",
      "status": "ok",
      "chain": [
        {
          "name": "www.wikipedia.org",
          "target": "dyna.wikimedia.org",
          "ttl": 15282
        }
      ],
      "ipv4": [
        "103.102.166.224"
      ],
      "ipv6": [
        "2620:0:861:ed1a::1"
      ],
      "dnssecValidated": false,
      "tookMs": 278
    },
    {
      "source": "cloudflare",
      "status": "ok",
      "chain": [
        {
          "name": "www.wikipedia.org",
          "target": "dyna.wikimedia.org",
          "ttl": 86390
        }
      ],
      "ipv4": [
        "103.102.166.224"
      ],
      "ipv6": [
        "2001:df2:e500:ed1a::1"
      ],
      "dnssecValidated": false,
      "tookMs": 261
    }
  ],
  "issues": [],
  "tookMs": 2290
}

How it works

Follows the chain one name at a time at each zone's own nameservers (recursion off), so every hop shows which zone answered, who runs its DNS, the record's own TTL and whether the server is authoritative; Google's and Cloudflare's cached copies of the whole chain come beside it. The platform behind the target is named from documented CNAME suffixes (CloudFront, Fastly, GitHub Pages, Vercel…).

Findings come back as issues: a dangling target (NXDOMAIN at the end of the chain, a takeover risk), loops, more than 8 aliases in a row (RFC 9460 §10.2), a CNAME at a zone apex or beside other data (RFC 2181 §10.1), MX or NS hosts that are aliases, platforms that answer any name (DNS can't tell a deleted site there), and older targets.

Honest as the CNAME Lookup page: NXDOMAIN at the end of a chain means the target doesn't exist, never the name; a SERVFAIL or a timeout is unresolved, never "doesn't exist"; on Cloudflare's nameservers a proxied or flattened record looks like an A record, so the verdict is hidden (may be proxying), never a claim.

Answers kept: Kept for the chain's lowest TTL, 30 seconds to 5 minutes (30 seconds when a part failed), shared with the CNAME Lookup page. A kept answer carries an `Age` header, and the resolvers' TTLs are counted down.

Query parameters

  • namestringrequired
    A host name, looked up exactly as given (www. stays); a URL or an e-mail address works too, and 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.

  • queryobjectalways
    What was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).
    • namestringalways
      The name looked up, lower case, IDNs as Punycode.
  • unicodestring or nullalways
    The name in Unicode, when it is an IDN.
  • verdictstringalways
    alias (CNAMEs ending at addresses), no_cname (its own addresses), hidden (no CNAME visible, every address Cloudflare's: may be proxied or flattened), dangling (the target doesn't exist), loop, long_chain (more than 8 aliases), dkim_key (a DKIM selector's chain ending at its TXT key), target_no_address, unresolved (couldn't follow past a hop), nxdomain (the name doesn't exist), nodata (exists, no CNAME and no address) or failed.

    one of "alias", "no_cname", "hidden", "dangling", "loop", "long_chain", "dkim_key", "target_no_address", "unresolved", "nxdomain", "nodata", "failed"

  • cnamesintegeralways
    CNAME records followed (each once, also in a loop).
  • chainarray of objectsalways
    Every name of the chain, the one looked up first.
    Show 19 fields
    • namestringalways
      The name asked.
    • zonestring or nullalways
      The zone that answered (its apex).
    • statusstringalways
      What the zone holds there: cname, address, nodata, nxdomain, or a failure (servfail, refused, timeout, error).

      one of "cname", "address", "nodata", "nxdomain", "servfail", "refused", "timeout", "error"

    • cnamesarray of objectsalways
      The CNAME records at the name (more than one is a broken zone).
      Show 2 fields
      • targetstringalways
        The target.
      • ttlintegeralways
        The TTL as the zone serves it, in seconds.
    • otherTypesarray of stringsalways
      Other types the zone answered beside the CNAME (not allowed, RFC 2181 §10.1).
    • ipv4array of stringsalways
      A records, at the chain's end.
    • ipv6array of stringsalways
      AAAA records, at the chain's end.
    • aTtlinteger or nullalways
      The A records' TTL, in seconds.
    • aaaaTtlinteger or nullalways
      The AAAA records' TTL, in seconds.
    • negativeTtlinteger or nullalways
      For NXDOMAIN or NODATA: how long the miss is cached, in seconds.
    • apexbooleanalways
      The name is its zone's apex (a CNAME can't sit there).
    • answeredBystringalways
      Who answered: authoritative (the zone's own nameserver, the fresh truth), google (Google Public DNS's cached copy) or cloudflare (Cloudflare 1.1.1.1's).

      one of "authoritative", "google", "cloudflare"

    • serverstringalways
      The server that answered.
    • ipstring or nullalways
      Its address.
    • authoritativebooleanalways
      The AA flag.
    • dnsOperatorsarray of objectsalways
      Who runs the zone's DNS, from its nameservers' names.
      Show 2 fields
      • idstringalways
        A stable id, e.g. route53, or domain:<domain>.
      • namestringalways
        Its name.
    • zoneOnCloudflarebooleanalways
      The zone is on Cloudflare's nameservers.
    • platformobject or nullalways
      The platform this hop's target belongs to.
      Show 2 fields
      • idstringalways
        A stable id.
      • namestringalways
        Its name.
    • tookMsinteger or nullalways
      How long that answer took, in milliseconds; null when it wasn't timed.
  • endobject or nullalways
    How the chain ended.
    • reasonstringalways
      address, nodata, nxdomain, loop, long (our 16-hop cap), servfail, refused, timeout or error.

      one of "address", "nodata", "nxdomain", "loop", "long", "servfail", "refused", "timeout", "error"

    • namestringalways
      The name it ended at.
    • loopsBackTointeger or nullalways
      For a loop: the index in chain the last target returns to.
  • targetobject or nullalways
    Where the chain lands, when it reaches addresses.
    Show 4 fields
    • namestringalways
      The last name.
    • ipv4array of stringsalways
      Its A records.
    • ipv6array of stringsalways
      Its AAAA records.
    • networkobject or nullalways
      The network behind the address (Team Cymru); null when unknown.
      Show 4 fields
      • asnintegeralways
        The AS number that announces the address.
      • namestringalways
        The network's name, cleaned ("Google", "Amazon.com").
      • prefixstringalways
        The announced prefix the address is in, e.g. 8.8.8.0/24.
      • countrystringalways
        The network's registration country (ISO 3166-1 alpha-2), as Team Cymru has it.
  • platformobject or nullalways
    The platform behind the chain, named from documented CNAME suffixes; null when none matches.
    Show 6 fields
    • idstringalways
      A stable id, e.g. cloudfront, github-pages.
    • namestringalways
      Its name.
    • kindstringalways
      What it is.

      one of "cdn", "hosting", "static", "builder", "shop", "lb", "steering", "storage", "setup", "dkim", "help", "marketing", "verify"

    • suffixstringalways
      The documented suffix that matched (the evidence).
    • legacybooleanalways
      An older target the platform has replaced.
    • documentedbooleanalways
      The suffix is in the platform's documentation.
  • lowestTtlobject or nullalways
    The lowest TTL in the chain as the zones serve it: how often that part is fetched again (not the time an edit takes).
    • ttlintegeralways
      The TTL, in seconds.
    • namestringalways
      Whose record.
    • typestringalways
      Its type.

      one of "CNAME", "A", "AAAA"

  • dnssecarray of objects or nullalways
    Each hop asked on its own with DNSSEC; null when not checked.
    • namestringalways
      The name.
    • validatedboolean or nullalways
      Google validated it (AD); null when no answer.
  • zoneAliasesobject or nullalways
    The name's zone's MX and NS hosts, checked for being aliases (RFC 2181 §10.3).
    • zonestringalways
      The zone.
    • mxarray of objects or nullalways
      Its MX hosts; null when the question failed.
      Show 2 fields
      • hoststringalways
        The host.
      • cnamestring or nullalways
        Its CNAME target, when it is an alias.
    • nsarray of objects or nullalways
      Its NS hosts; null when the question failed.
      Show 2 fields
      • hoststringalways
        The host.
      • cnamestring or nullalways
        Its CNAME target, when it is an alias.
  • copiesarray of objectsalways
    Google's and Cloudflare's cached copies of the whole chain (TTLs are the time left).
    Show 7 fields
    • sourcestringalways
      google or cloudflare.

      one of "google", "cloudflare"

    • statusstringalways
      The answer: ok (records came back), nodata (the name exists without them), nxdomain (no such name), servfail, refused, timeout, error or unreadable (an answer our decoder refuses).

      one of "ok", "nodata", "nxdomain", "servfail", "refused", "timeout", "error", "unreadable"

    • chainarray of objectsalways
      The CNAMEs the answer followed, in order.
      Show 3 fields
      • namestringalways
        The alias.
      • targetstringalways
        The name it points to.
      • ttlintegeralways
        The record's TTL, in seconds.
    • ipv4array of stringsalways
      The addresses it ended at (A).
    • ipv6array of stringsalways
      The addresses it ended at (AAAA).
    • dnssecValidatedbooleanalways
      The resolver validated the whole answer.
    • tookMsintegeralways
      How long that answer took, in milliseconds.
  • issuesarray of objectsalways
    Problems found in the target's configuration, worst first. Empty when there are none.
    • severitystringalways
      error breaks something, warning risks it, info is worth knowing.

      one of "error", "warning", "info"

    • codestringalways
      Stable machine-readable code.
    • messagestringalways
      The problem and what to do about it, in plain English.

Errors

  • 429 rate_limited Also 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/cname?name=www.wikipedia.org"
const params = new URLSearchParams({ name: "www.wikipedia.org" });
const res = await fetch(`https://dnsrobot.net/api/v2/cname?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.chain);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/cname",
    params={"name": "www.wikipedia.org"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["chain"])
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	q := url.Values{"name": {"www.wikipedia.org"}}
	res, err := http.Get("https://dnsrobot.net/api/v2/cname?" + 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["chain"])
}
<?php
$query = http_build_query(["name" => "www.wikipedia.org"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/cname?" . $query, false, $context), true);
if (isset($data["error"])) {
    throw new RuntimeException($data["error"]["message"]);
}
print_r($data["chain"]);
require "net/http"
require "json"

uri = URI("https://dnsrobot.net/api/v2/cname")
uri.query = URI.encode_www_form(name: "www.wikipedia.org")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["chain"]
// 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/cname?name=www.wikipedia.org")?;
    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["chain"]);
    Ok(())
}
using System.Text.Json;

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/cname?name=www.wikipedia.org");
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("chain"));

www.wikipedia.org → dyna.wikimedia.org

GET /api/v2/cname?name=www.wikipedia.org
200 OKRecorded 2026-10-25
{
  "query": {
    "name": "www.wikipedia.org"
  },
  "unicode": null,
  "verdict": "alias",
  "cnames": 1,
  "chain": [
    {
      "name": "www.wikipedia.org",
      "zone": "wikipedia.org",
      "status": "cname",
      "cnames": [
        {
          "target": "dyna.wikimedia.org",
          "ttl": 86400
        }
      ],
      "otherTypes": [],
      "ipv4": [],
      "ipv6": [],
      "aTtl": null,
      "aaaaTtl": null,
      "negativeTtl": null,
      "apex": false,
      "answeredBy": "authoritative",
      "server": "ns1.wikimedia.org",
      "ip": "208.80.153.231",
      "authoritative": true,
      "dnsOperators": [
        {
          "id": "domain:wikimedia.org",
          "name": "wikimedia.org"
        }
      ],
      "zoneOnCloudflare": false,
      "platform": null,
      "tookMs": 542
    },
    {
      "name": "dyna.wikimedia.org",
      "zone": "wikimedia.org",
      "status": "address",
      "cnames": [],
      "otherTypes": [],
      "ipv4": [
        "103.102.166.224"
      ],
      "ipv6": [
        "2001:df2:e500:ed1a::1"
      ],
      "aTtl": 180,
      "aaaaTtl": 180,
      "negativeTtl": null,
      "apex": false,
      "answeredBy": "authoritative",
      "server": "ns1.wikimedia.org",
      "ip": "208.80.153.231",
      "authoritative": true,
      "dnsOperators": [
        {
          "id": "domain:wikimedia.org",
          "name": "wikimedia.org"
        }
      ],
      "zoneOnCloudflare": false,
      "platform": null,
      "tookMs": 498
    }
  ],
  "end": {
    "reason": "address",
    "name": "dyna.wikimedia.org",
    "loopsBackTo": null
  },
  "target": {
    "name": "dyna.wikimedia.org",
    "ipv4": [
      "103.102.166.224"
    ],
    "ipv6": [
      "2001:df2:e500:ed1a::1"
    ],
    "network": {
      "asn": 14907,
      "name": "Wikimedia Foundation",
      "prefix": "103.102.166.0/24",
      "country": "US"
    }
  },
  "platform": null,
  "lowestTtl": {
    "ttl": 180,
    "name": "dyna.wikimedia.org",
    "type": "A"
  },
  "dnssec": [
    {
      "name": "www.wikipedia.org",
      "validated": false
    },
    {
      "name": "dyna.wikimedia.org",
      "validated": false
    }
  ],
  "zoneAliases": {
    "zone": "wikipedia.org",
    "mx": [
      {
        "host": "mx-in1001.wikimedia.org",
        "cname": null
      },
      {
        "host": "mx-in2001.wikimedia.org",
        "cname": null
      }
    ],
    "ns": [
      {
        "host": "ns2.wikimedia.org",
        "cname": null
      },
      {
        "host": "ns0.wikimedia.org",
        "cname": null
      },
      {
        "host": "ns1.wikimedia.org",
        "cname": null
      }
    ]
  },
  "copies": [
    {
      "source": "google",
      "status": "ok",
      "chain": [
        {
          "name": "www.wikipedia.org",
          "target": "dyna.wikimedia.org",
          "ttl": 15282
        }
      ],
      "ipv4": [
        "103.102.166.224"
      ],
      "ipv6": [
        "2620:0:861:ed1a::1"
      ],
      "dnssecValidated": false,
      "tookMs": 278
    },
    {
      "source": "cloudflare",
      "status": "ok",
      "chain": [
        {
          "name": "www.wikipedia.org",
          "target": "dyna.wikimedia.org",
          "ttl": 86390
        }
      ],
      "ipv4": [
        "103.102.166.224"
      ],
      "ipv6": [
        "2001:df2:e500:ed1a::1"
      ],
      "dnssecValidated": false,
      "tookMs": 261
    }
  ],
  "issues": [],
  "tookMs": 2290
}

www.github.com → github.com

GET /api/v2/cname?name=www.github.com
200 OKRecorded 2026-10-25
{
  "query": {
    "name": "www.github.com"
  },
  "unicode": null,
  "verdict": "alias",
  "cnames": 1,
  "chain": [
    {
      "name": "www.github.com",
      "zone": "github.com",
      "status": "cname",
      "cnames": [
        {
          "target": "github.com",
          "ttl": 3600
        }
      ],
      "otherTypes": [],
      "ipv4": [],
      "ipv6": [],
      "aTtl": null,
      "aaaaTtl": null,
      "negativeTtl": null,
      "apex": false,
      "answeredBy": "authoritative",
      "server": "ns-421.awsdns-52.com",
      "ip": "205.251.193.165",
      "authoritative": true,
      "dnsOperators": [
        {
          "id": "route53",
          "name": "Route 53"
        },
        {
          "id": "ns1",
          "name": "NS1"
        }
      ],
      "zoneOnCloudflare": false,
      "platform": null,
      "tookMs": 39
    },
    {
      "name": "github.com",
      "zone": "github.com",
      "status": "address",
      "cnames": [],
      "otherTypes": [],
      "ipv4": [
        "20.207.73.82"
      ],
      "ipv6": [],
      "aTtl": 60,
      "aaaaTtl": null,
      "negativeTtl": null,
      "apex": true,
      "answeredBy": "authoritative",
      "server": "ns-421.awsdns-52.com",
      "ip": "205.251.193.165",
      "authoritative": true,
      "dnsOperators": [
        {
          "id": "route53",
          "name": "Route 53"
        },
        {
          "id": "ns1",
          "name": "NS1"
        }
      ],
      "zoneOnCloudflare": false,
      "platform": null,
      "tookMs": 39
    }
  ],
  "end": {
    "reason": "address",
    "name": "github.com",
    "loopsBackTo": null
  },
  "target": {
    "name": "github.com",
    "ipv4": [
      "20.207.73.82"
    ],
    "ipv6": [],
    "network": {
      "asn": 8075,
      "name": "Microsoft",
      "prefix": "20.192.0.0/10",
      "country": "US"
    }
  },
  "platform": null,
  "lowestTtl": {
    "ttl": 60,
    "name": "github.com",
    "type": "A"
  },
  "dnssec": [
    {
      "name": "www.github.com",
      "validated": false
    },
    {
      "name": "github.com",
      "validated": false
    }
  ],
  "zoneAliases": {
    "zone": "github.com",
    "mx": [
      {
        "host": "github-com.mail.protection.outlook.com",
        "cname": null
      }
    ],
    "ns": [
      {
        "host": "ns-1283.awsdns-32.org",
        "cname": null
      },
      {
        "host": "dns4.p08.nsone.net",
        "cname": null
      },
      {
        "host": "dns2.p08.nsone.net",
        "cname": null
      },
      // … 5 more items
    ]
  },
  "copies": [
    {
      "source": "google",
      "status": "ok",
      "chain": [
        {
          "name": "www.github.com",
          "target": "github.com",
          "ttl": 1312
        }
      ],
      "ipv4": [
        "140.82.113.3"
      ],
      "ipv6": [],
      "dnssecValidated": false,
      "tookMs": 59
    },
    {
      "source": "cloudflare",
      "status": "ok",
      "chain": [
        {
          "name": "www.github.com",
          "target": "github.com",
          "ttl": 3600
        }
      ],
      "ipv4": [
        "20.207.73.82"
      ],
      "ipv6": [],
      "dnssecValidated": false,
      "tookMs": 3
    }
  ],
  "issues": [],
  "tookMs": 416
}

Shortened for the page: long lists show their first items.