DNS Propagation Checker Template
- Next.js
- TypeScript
Check a DNS record against public resolvers around the world and see where a change has landed.
A Next.js app that checks DNS propagation. Enter a domain and pick A, AAAA, CNAME, MX, NS or TXT, and see what ten public resolvers such as Google, Cloudflare and Quad9 return, side by side, with a score for how many agree. Use it after moving a site or changing mail records, or lift the route into your own status checks.

What it does
- Ten resolvers at once
- Asks public resolvers in the US, Europe and worldwide, including Google, Cloudflare, Quad9 and OpenDNS.
- Agreement score
- A ring shows the share of resolvers returning the most common answer, so you can tell at a glance if a change is everywhere.
- Colour-matched answers
- Resolvers that return the same records share a colour, which makes stragglers and geo-routed answers easy to spot.
- Six record types
- Switch between A, AAAA, CNAME, MX, NS and TXT with one tap; the route rejects bad domains before spending credits.
- Keeps your key private
- The browser only talks to your own API route, which holds the key, caches for 2 minutes and rate-limits visitors.
How it works
The route: validate the domain and record type, answer from the cache, then call DNS Propagation.
export async function GET(request: Request) {
const params = new URL(request.url).searchParams;
const domain = str(params.get('domain'), 253)
.toLowerCase()
.replace(/^https?:\/\//, '')
.replace(/\/.*$/, '');
const type = str(params.get('type'), 5).toUpperCase() || 'A';
if (!domain) return fail('Enter a domain, like example.com');
if (!DOMAIN.test(domain)) return fail('That doesn’t look like a domain name');
if (!TYPES.includes(type)) return fail(`Record type must be one of ${TYPES.join(', ')}`);
const key = `dns:${type}:${domain}`;
const hit = fromCache(key, TTL_MS);
if (hit) return Response.json(hit);
const blocked = guard(request);
if (blocked) return blocked;
return respond(async () => {
const data = await callApi('dnspropagation', { query: { domain, type } });
toCache(key, data);
return data;
});
}Deploy it
- Get a free API key
The free plan includes 200 credits a month, no card needed. Create your key.
- Deploy it
Click Deploy to Vercel. Vercel copies the repo to your GitHub account and asks for
APIVERVE_API_KEY: paste your key there. - Open your app
Vercel builds it and gives you a live URL, usually in about a minute. Every push to the repo redeploys it.
Try the DNS Propagation Checker API — the call this template makes
No key required to try it. Get a key to use it in your app.
{
"status": "ok",
"error": null,
"data": {
"domain": "google.com",
"recordType": "A",
"propagationComplete": false,
"serversChecked": 10,
"serversResponded": 10,
"uniqueResponses": 35,
"results": [
{
"server": "Google",
"location": "United States",
"ip": "8.8.8.8",
"success": true,
"records": [
"192.179.16.100",
"192.179.16.101",
"192.179.16.102",
"192.179.16.113",
"192.179.16.138",
"192.179.16.139"
],
"error": null,
"responseTime": 6
},
{
"server": "Cloudflare",
"location": "Global",
"ip": "1.1.1.1",
"success": true,
"records": [
"142.250.177.238"
],
"error": null,
"responseTime": 38
},
{
"server": "OpenDNS",
"location": "United States",
"ip": "208.67.222.222",
"success": true,
"records": [
"173.194.193.100",
"173.194.193.101",
"173.194.193.102",
"173.194.193.113",
"173.194.193.138",
"173.194.193.139"
],
"error": null,
"responseTime": 24
},
{
"server": "Quad9",
"location": "Global",
"ip": "9.9.9.9",
"success": true,
"records": [
"142.250.125.100",
"142.250.125.101",
"142.250.125.102",
"142.250.125.113",
"142.250.125.138",
"142.250.125.139"
],
"error": null,
"responseTime": 13
},
{
"server": "Control D",
"location": "Global",
"ip": "76.76.2.0",
"success": true,
"records": [
"74.125.202.100",
"74.125.202.101",
"74.125.202.102",
"74.125.202.113",
"74.125.202.138",
"74.125.202.139"
],
"error": null,
"responseTime": 15
},
{
"server": "Level3",
"location": "United States",
"ip": "4.2.2.1",
"success": true,
"records": [
"142.251.186.100",
"142.251.186.101",
"142.251.186.102",
"142.251.186.113",
"142.251.186.138",
"142.251.186.139"
],
"error": null,
"responseTime": 22
},
{
"server": "Verisign",
"location": "United States",
"ip": "64.6.64.6",
"success": true,
"records": [
"142.251.211.14"
],
"error": null,
"responseTime": 24
},
{
"server": "DNS4EU",
"location": "Europe",
"ip": "86.54.11.100",
"success": true,
"records": [
"142.251.34.238"
],
"error": null,
"responseTime": 116
},
{
"server": "Yandex",
"location": "Russia",
"ip": "77.88.8.8",
"success": true,
"records": [
"142.251.38.110"
],
"error": null,
"responseTime": 149
},
{
"server": "Hurricane Electric",
"location": "United States",
"ip": "74.82.42.42",
"success": true,
"records": [
"142.251.214.206"
],
"error": null,
"responseTime": 18
}
]
}
}