GET/api/v2/dns/propagation

DNS propagation API

Ask 33 public resolvers around the world for a record at once and see whether they agree.

GEThttps://dnsrobot.netBase URL/api/v2Version/dns/propagationEndpoint?name=&type=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "name": "cloudflare.com",
    "type": "A"
  },
  "verdict": "propagated",
  "consensus": {
    "values": [
      "104.16.132.229",
      "104.16.133.229"
    ],
    "resolvers": 32
  },
  "summary": {
    "resolvers": 33,
    "agree": 32,
    "differ": 0,
    "noRecord": 0,
    "noAnswer": 1
  },
  "minTtl": 11,
  "medianMs": 818,
  "groups": [
    {
      "values": [
        "104.16.132.229",
        "104.16.133.229"
      ],
      "resolvers": [
        "google",
        "cloudflare",
        "opendns",
        "he",
        "cira",
        "uninet",
        "claro",
        "namecheap",
        "ionos",
        "ovh",
        "odido",
        "telekom",
        "swisscom",
        "quad9",
        "priority",
        "ultradns",
        "adguard",
        "teknet",
        "safedns",
        "yandex",
        "mobily",
        "lt",
        "cmpak",
        "bharat",
        "exabytes",
        "microsoft",
        "idnic",
        "114dns",
        "lguplus",
        "hinet",
        "iij",
        "telstra"
      ]
    }
  ],
  "resolvers": [
    {
      "id": "google",
      "name": "Google",
      "ip": "8.8.8.8",
      "transport": "tcp",
      "city": "Mountain View",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 53
    },
    {
      "id": "cloudflare",
      "name": "Cloudflare",
      "ip": "1.1.1.1",
      "transport": "doh",
      "city": "San Francisco",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 203
        },
        {
          "value": "104.16.133.229",
          "ttl": 203
        }
      ],
      "cnames": [],
      "tookMs": 2
    },
    {
      "id": "opendns",
      "name": "OpenDNS",
      "ip": "208.67.222.222",
      "transport": "tcp",
      "city": "Berkeley",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 53
        },
        {
          "value": "104.16.132.229",
          "ttl": 53
        }
      ],
      "cnames": [],
      "tookMs": 51
    },
    {
      "id": "he",
      "name": "Hurricane Electric",
      "ip": "209.51.161.14",
      "transport": "tcp",
      "city": "New York",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 180
        },
        {
          "value": "104.16.133.229",
          "ttl": 180
        }
      ],
      "cnames": [],
      "tookMs": 469
    },
    {
      "id": "cira",
      "name": "CIRA Canadian Shield",
      "ip": "149.112.121.10",
      "transport": "tcp",
      "city": "Ottawa",
      "country": "Canada",
      "countryCode": "CA",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 48
        },
        {
          "value": "104.16.133.229",
          "ttl": 48
        }
      ],
      "cnames": [],
      "tookMs": 530
    },
    {
      "id": "uninet",
      "name": "Uninet",
      "ip": "148.235.82.66",
      "transport": "tcp",
      "city": "Mexico City",
      "country": "Mexico",
      "countryCode": "MX",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 790
    },
    {
      "id": "claro",
      "name": "Claro",
      "ip": "200.248.178.54",
      "transport": "tcp",
      "city": "Santa Cruz do Sul",
      "country": "Brazil",
      "countryCode": "BR",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 255
        },
        {
          "value": "104.16.133.229",
          "ttl": 255
        }
      ],
      "cnames": [],
      "tookMs": 706
    },
    {
      "id": "namecheap",
      "name": "Namecheap",
      "ip": "198.54.117.10",
      "transport": "tcp",
      "city": "Dublin",
      "country": "Ireland",
      "countryCode": "IE",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 164
        },
        {
          "value": "104.16.132.229",
          "ttl": 164
        }
      ],
      "cnames": [],
      "tookMs": 733
    },
    {
      "id": "ionos",
      "name": "IONOS",
      "ip": "109.228.4.246",
      "transport": "tcp",
      "city": "London",
      "country": "United Kingdom",
      "countryCode": "GB",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 300
        },
        {
          "value": "104.16.132.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 570
    },
    {
      "id": "ovh",
      "name": "OVH",
      "ip": "91.121.62.94",
      "transport": "tcp",
      "city": "Roubaix",
      "country": "France",
      "countryCode": "FR",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 618
    },
    {
      "id": "odido",
      "name": "Odido",
      "ip": "87.213.100.113",
      "transport": "tcp",
      "city": "Amsterdam",
      "country": "Netherlands",
      "countryCode": "NL",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 11
        },
        {
          "value": "104.16.133.229",
          "ttl": 11
        }
      ],
      "cnames": [],
      "tookMs": 657
    },
    {
      "id": "telekom",
      "name": "Telekom Deutschland",
      "ip": "195.243.214.4",
      "transport": "tcp",
      "city": "Oberhausen",
      "country": "Germany",
      "countryCode": "DE",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 300
        },
        {
          "value": "104.16.132.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 666
    },
    {
      "id": "swisscom",
      "name": "Swisscom",
      "ip": "195.186.1.111",
      "transport": "tcp",
      "city": "Zurich",
      "country": "Switzerland",
      "countryCode": "CH",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 296
        },
        {
          "value": "104.16.132.229",
          "ttl": 296
        }
      ],
      "cnames": [],
      "tookMs": 696
    },
    {
      "id": "quad9",
      "name": "Quad9",
      "ip": "9.9.9.9",
      "transport": "tcp",
      "city": "Zurich",
      "country": "Switzerland",
      "countryCode": "CH",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 300
        },
        {
          "value": "104.16.132.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 845
    },
    {
      "id": "priority",
      "name": "Priority Telecom",
      "ip": "212.230.255.1",
      "transport": "tcp",
      "city": "Madrid",
      "country": "Spain",
      "countryCode": "ES",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 215
        },
        {
          "value": "104.16.133.229",
          "ttl": 215
        }
      ],
      "cnames": [],
      "tookMs": 692
    },
    {
      "id": "ultradns",
      "name": "UltraDNS",
      "ip": "156.154.70.1",
      "transport": "tcp",
      "city": "Rome",
      "country": "Italy",
      "countryCode": "IT",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 180
        },
        {
          "value": "104.16.133.229",
          "ttl": 180
        }
      ],
      "cnames": [],
      "tookMs": 529
    },
    {
      "id": "adguard",
      "name": "AdGuard",
      "ip": "94.140.14.14",
      "transport": "tcp",
      "city": "Limassol",
      "country": "Cyprus",
      "countryCode": "CY",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 300
        },
        {
          "value": "104.16.132.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 1051
    },
    {
      "id": "teknet",
      "name": "Teknet",
      "ip": "31.7.37.37",
      "transport": "tcp",
      "city": "Antalya",
      "country": "Türkiye",
      "countryCode": "TR",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 169
        },
        {
          "value": "104.16.132.229",
          "ttl": 169
        }
      ],
      "cnames": [],
      "tookMs": 878
    },
    {
      "id": "safedns",
      "name": "SafeDNS",
      "ip": "195.46.39.39",
      "transport": "tcp",
      "city": "Moscow",
      "country": "Russia",
      "countryCode": "RU",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 124
        },
        {
          "value": "104.16.133.229",
          "ttl": 124
        }
      ],
      "cnames": [],
      "tookMs": 620
    },
    {
      "id": "yandex",
      "name": "Yandex",
      "ip": "77.88.8.8",
      "transport": "tcp",
      "city": "Moscow",
      "country": "Russia",
      "countryCode": "RU",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 236
        },
        {
          "value": "104.16.132.229",
          "ttl": 236
        }
      ],
      "cnames": [],
      "tookMs": 995
    },
    {
      "id": "mobily",
      "name": "Mobily",
      "ip": "85.194.70.174",
      "transport": "tcp",
      "city": "Riyadh",
      "country": "Saudi Arabia",
      "countryCode": "SA",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 50
        },
        {
          "value": "104.16.133.229",
          "ttl": 50
        }
      ],
      "cnames": [],
      "tookMs": 867
    },
    {
      "id": "lt",
      "name": "Liquid Telecom",
      "ip": "5.11.11.5",
      "transport": "tcp",
      "city": "Cape Town",
      "country": "South Africa",
      "countryCode": "ZA",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 972
    },
    {
      "id": "cmpak",
      "name": "CMPak",
      "ip": "209.150.154.1",
      "transport": "tcp",
      "city": "Karachi",
      "country": "Pakistan",
      "countryCode": "PK",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 29
        },
        {
          "value": "104.16.132.229",
          "ttl": 29
        }
      ],
      "cnames": [],
      "tookMs": 1323
    },
    {
      "id": "bharat",
      "name": "Bharat Public DNS",
      "ip": "1.10.10.10",
      "transport": "tcp",
      "city": "New Delhi",
      "country": "India",
      "countryCode": "IN",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 77
        },
        {
          "value": "104.16.133.229",
          "ttl": 77
        }
      ],
      "cnames": [],
      "tookMs": 818
    },
    {
      "id": "pldt",
      "name": "PLDT",
      "ip": "121.58.203.4",
      "transport": "tcp",
      "city": "Manila",
      "country": "Philippines",
      "countryCode": "PH",
      "state": "no_answer",
      "status": "timeout",
      "rcode": null,
      "records": [],
      "cnames": [],
      "tookMs": 1500
    },
    {
      "id": "exabytes",
      "name": "Exabytes",
      "ip": "117.53.152.76",
      "transport": "tcp",
      "city": "Kuala Lumpur",
      "country": "Malaysia",
      "countryCode": "MY",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 890
    },
    {
      "id": "microsoft",
      "name": "Microsoft",
      "ip": "13.76.130.172",
      "transport": "tcp",
      "city": "Singapore",
      "country": "Singapore",
      "countryCode": "SG",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 300
        },
        {
          "value": "104.16.132.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 875
    },
    {
      "id": "idnic",
      "name": "IDNIC",
      "ip": "203.119.13.77",
      "transport": "tcp",
      "city": "Jakarta",
      "country": "Indonesia",
      "countryCode": "ID",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 171
        },
        {
          "value": "104.16.133.229",
          "ttl": 171
        }
      ],
      "cnames": [],
      "tookMs": 907
    },
    {
      "id": "114dns",
      "name": "114DNS",
      "ip": "114.114.115.115",
      "transport": "tcp",
      "city": "Xinfeng",
      "country": "China",
      "countryCode": "CN",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 43
        },
        {
          "value": "104.16.132.229",
          "ttl": 43
        }
      ],
      "cnames": [],
      "tookMs": 1269
    },
    {
      "id": "lguplus",
      "name": "LG Uplus",
      "ip": "164.124.101.2",
      "transport": "tcp",
      "city": "Seoul",
      "country": "South Korea",
      "countryCode": "KR",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 233
        },
        {
          "value": "104.16.133.229",
          "ttl": 233
        }
      ],
      "cnames": [],
      "tookMs": 1389
    },
    {
      "id": "hinet",
      "name": "HiNet",
      "ip": "168.95.1.1",
      "transport": "tcp",
      "city": "Taipei",
      "country": "Taiwan",
      "countryCode": "TW",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 227
        },
        {
          "value": "104.16.133.229",
          "ttl": 227
        }
      ],
      "cnames": [],
      "tookMs": 1056
    },
    {
      "id": "iij",
      "name": "IIJ",
      "ip": "public.dns.iij.jp",
      "transport": "doh",
      "city": "Tokyo",
      "country": "Japan",
      "countryCode": "JP",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 295
        },
        {
          "value": "104.16.132.229",
          "ttl": 295
        }
      ],
      "cnames": [],
      "tookMs": 1607
    },
    {
      "id": "telstra",
      "name": "Telstra",
      "ip": "139.130.4.4",
      "transport": "tcp",
      "city": "Sydney",
      "country": "Australia",
      "countryCode": "AU",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 1355
    }
  ],
  "tookMs": 1607
}

How it works

Asks every resolver of the propagation checker in parallel (Google, Cloudflare, Quad9, OpenDNS and ISPs' resolvers on every continent) and returns each one's answer, its TTL left and its time, then groups identical answers.

The largest group is the consensus; resolvers outside it differ, which is what a change in flight looks like (propagating). With three or more groups and no majority, the name is answered per region (a CDN or geo-DNS, as github.com is): the verdict is regional and every answer counts as agreeing. NXDOMAIN, NODATA and SERVFAIL are no_record; a resolver that didn't answer in 4 seconds is no_answer, never a different answer.

Each resolver's TTL is the time left in its cache: when every copy runs out, the old answer is gone everywhere. Records are compared as sets, so order doesn't matter.

Query parameters

  • namestringrequired
    A domain or host name (URLs work too), or an IP address with type=PTR.
  • typestringoptionaldefault A
    The record type. Default A.

    one of A, AAAA, CNAME, MX, NS, PTR, SRV, SOA, TXT, CAA, DS, DNSKEY

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 asked, lower case, IDNs as Punycode (an IP address as its arpa name).
    • typestringalways
      The record type asked.

      one of "A", "AAAA", "CNAME", "MX", "NS", "PTR", "SRV", "SOA", "TXT", "CAA", "DS", "DNSKEY"

  • verdictstringalways
    propagated (every answer agrees), propagating (a majority, and some resolvers differ), regional (3+ different answers with no majority: answered per region), nxdomain (most say the name doesn't exist), no_record (resolvers answered without records) or no_answer (none answered).

    one of "propagated", "propagating", "regional", "nxdomain", "no_record", "no_answer"

  • consensusobject or nullalways
    The answer most resolvers gave; null when there is none or the verdict is regional.
    • valuesarray of stringsalways
      Its records' values, sorted.
    • resolversintegeralways
      How many resolvers gave it.
  • summaryobjectalways
    The resolvers counted by state.
    Show 5 fields
    • resolversintegeralways
      Resolvers asked.
    • agreeintegeralways
      Answers that match the consensus (with regional: every resolver that answered with records).
    • differintegeralways
      Answers with records that differ from the consensus.
    • noRecordintegeralways
      Resolvers that answered without records (NXDOMAIN, NODATA, SERVFAIL, REFUSED).
    • noAnswerintegeralways
      Resolvers that didn't answer in time or couldn't be reached.
  • minTtlinteger or nullalways
    The lowest TTL left among the answers, in seconds: the soonest a cached copy is fetched again.
  • medianMsinteger or nullalways
    The median answer time, in milliseconds.
  • groupsarray of objectsalways
    Identical answers grouped, largest first.
    • valuesarray of stringsalways
      Its records' values, sorted.
    • resolversarray of stringsalways
      The ids of the resolvers that gave it.
  • resolversarray of objectsalways
    Every resolver, in the checker's order (by region).
    Show 13 fields
    • idstringalways
      The resolver's id, e.g. google.
    • namestringalways
      Its operator's name.
    • ipstringalways
      Its IPv4 address, or the DoH host of a DoH-only service.
    • transportstringalways
      tcp or doh.

      one of "tcp", "doh"

    • citystringalways
      The city it is placed in (anycast resolvers answer from the site nearest our server).
    • countrystringalways
      The country's name.
    • countryCodestringalways
      ISO 3166-1 alpha-2.
    • statestringalways
      Its answer against the consensus.

      one of "agrees", "differs", "no_record", "no_answer"

    • statusstringalways
      What it said: ok, nodata, nxdomain, error (another response code, see rcode) or timeout.

      one of "ok", "nodata", "nxdomain", "error", "timeout"

    • rcodestring or nullalways
      The response code; null when it didn't answer.
    • recordsarray of objectsalways
      Its records.
      Show 2 fields
      • valuestringalways
        The value in presentation format.
      • ttlintegeralways
        The TTL left in its cache, in seconds.
    • cnamesarray of stringsalways
      The CNAME targets it followed to get there, in order.
    • tookMsintegeralways
      How long that answer took, in milliseconds.

Errors

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/dns/propagation?name=cloudflare.com"
const params = new URLSearchParams({ name: "cloudflare.com" });
const res = await fetch(`https://dnsrobot.net/api/v2/dns/propagation?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.consensus);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/dns/propagation",
    params={"name": "cloudflare.com"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["consensus"])
package main

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

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

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

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/dns/propagation?name=cloudflare.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("consensus"));

cloudflare.com's A records everywhere

GET /api/v2/dns/propagation?name=cloudflare.com
200 OKRecorded 2026-10-25
{
  "query": {
    "name": "cloudflare.com",
    "type": "A"
  },
  "verdict": "propagated",
  "consensus": {
    "values": [
      "104.16.132.229",
      "104.16.133.229"
    ],
    "resolvers": 32
  },
  "summary": {
    "resolvers": 33,
    "agree": 32,
    "differ": 0,
    "noRecord": 0,
    "noAnswer": 1
  },
  "minTtl": 11,
  "medianMs": 818,
  "groups": [
    {
      "values": [
        "104.16.132.229",
        "104.16.133.229"
      ],
      "resolvers": [
        "google",
        "cloudflare",
        "opendns",
        // … 29 more items
      ]
    }
  ],
  "resolvers": [
    {
      "id": "google",
      "name": "Google",
      "ip": "8.8.8.8",
      "transport": "tcp",
      "city": "Mountain View",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 300
        },
        {
          "value": "104.16.133.229",
          "ttl": 300
        }
      ],
      "cnames": [],
      "tookMs": 53
    },
    {
      "id": "cloudflare",
      "name": "Cloudflare",
      "ip": "1.1.1.1",
      "transport": "doh",
      "city": "San Francisco",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.132.229",
          "ttl": 203
        },
        {
          "value": "104.16.133.229",
          "ttl": 203
        }
      ],
      "cnames": [],
      "tookMs": 2
    },
    {
      "id": "opendns",
      "name": "OpenDNS",
      "ip": "208.67.222.222",
      "transport": "tcp",
      "city": "Berkeley",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "104.16.133.229",
          "ttl": 53
        },
        {
          "value": "104.16.132.229",
          "ttl": 53
        }
      ],
      "cnames": [],
      "tookMs": 51
    },
    // … 30 more items
  ],
  "tookMs": 1607
}

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

github.com, answered per region

GET /api/v2/dns/propagation?name=github.com
200 OKRecorded 2026-10-25
{
  "query": {
    "name": "github.com",
    "type": "A"
  },
  "verdict": "regional",
  "consensus": null,
  "summary": {
    "resolvers": 33,
    "agree": 32,
    "differ": 0,
    "noRecord": 0,
    "noAnswer": 1
  },
  "minTtl": 2,
  "medianMs": 758,
  "groups": [
    {
      "values": [
        "20.207.73.82"
      ],
      "resolvers": [
        "cloudflare",
        "quad9",
        "adguard",
        // … 3 more items
      ]
    },
    {
      "values": [
        "140.82.121.4"
      ],
      "resolvers": [
        "odido",
        "telekom",
        "teknet",
        // … 2 more items
      ]
    },
    {
      "values": [
        "140.82.114.3"
      ],
      "resolvers": [
        "google",
        "cira",
        "uninet",
        // … 1 more item
      ]
    },
    // … 13 more items
  ],
  "resolvers": [
    {
      "id": "google",
      "name": "Google",
      "ip": "8.8.8.8",
      "transport": "tcp",
      "city": "Mountain View",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "140.82.114.3",
          "ttl": 60
        }
      ],
      "cnames": [],
      "tookMs": 61
    },
    {
      "id": "cloudflare",
      "name": "Cloudflare",
      "ip": "1.1.1.1",
      "transport": "doh",
      "city": "San Francisco",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "20.207.73.82",
          "ttl": 42
        }
      ],
      "cnames": [],
      "tookMs": 2
    },
    {
      "id": "opendns",
      "name": "OpenDNS",
      "ip": "208.67.222.222",
      "transport": "tcp",
      "city": "Berkeley",
      "country": "United States",
      "countryCode": "US",
      "state": "agrees",
      "status": "ok",
      "rcode": "NOERROR",
      "records": [
        {
          "value": "140.82.113.4",
          "ttl": 60
        }
      ],
      "cnames": [],
      "tookMs": 115
    },
    // … 30 more items
  ],
  "tookMs": 1863
}

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