{"id":1221,"date":"2026-10-02T14:05:17","date_gmt":"2026-10-02T13:05:17","guid":{"rendered":"https:\/\/inventoexpert.com\/?p=1221"},"modified":"2026-10-02T19:08:52","modified_gmt":"2026-10-02T18:08:52","slug":"dns-propagation-checker","status":"publish","type":"post","link":"https:\/\/inventoexpert.com\/index.php\/2026\/10\/02\/dns-propagation-checker\/","title":{"rendered":"DNS Propagation Checker"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"1221\" class=\"elementor elementor-1221\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-436dfe0f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"436dfe0f\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5df1ecee\" data-id=\"5df1ecee\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-56f5c4eb elementor-widget elementor-widget-text-editor\" data-id=\"56f5c4eb\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<!-- Load Tailwind CSS -->\n<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n\n<style>\n        \/* Custom styles for typography and animations *\/<br \/>\n        @import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@300;400;500;600;700&display=swap');<br \/>\n        body {<br \/>\n            font-family: 'Inter', sans-serif;<br \/>\n            background-color: #f8fafc;<br \/>\n            color: #0f172a;<br \/>\n        }<br \/>\n        .spinner {<br \/>\n            border: 3px solid rgba(255, 255, 255, 0.3);<br \/>\n            border-radius: 50%;<br \/>\n            border-top: 3px solid #ffffff;<br \/>\n            width: 20px;<br \/>\n            height: 20px;<br \/>\n            animation: spin 1s linear infinite;<br \/>\n        }<br \/>\n        @keyframes spin {<br \/>\n            0% { transform: rotate(0deg); }<br \/>\n            100% { transform: rotate(360deg); }<br \/>\n        }<br \/>\n        .fade-in {<br \/>\n            animation: fadeIn 0.4s ease-in-out forwards;<br \/>\n        }<br \/>\n        @keyframes fadeIn {<br \/>\n            from { opacity: 0; transform: translateY(10px); }<br \/>\n            to { opacity: 1; transform: translateY(0); }<br \/>\n        }<br \/>\n    <\/style>\n\n&nbsp;\n\n&nbsp;\n\n<!-- Header Section -->\n\n<header class=\"bg-gradient-to-r from-blue-900 to-indigo-800 p-8 text-center sm:text-left text-white\">\n<div class=\"flex flex-col sm:flex-row justify-between items-center gap-4\">\n<div>\n<h1 class=\"text-3xl font-bold tracking-tight\">DNS Propagation Checker<\/h1>\n<p class=\"mt-2 text-blue-200 text-sm md:text-base\">Verify DNS records instantly across global DoH servers.<\/p>\n\n<\/div>\n<div class=\"hidden sm:block\"><span class=\"bg-blue-950\/50 border border-blue-400\/30 px-4 py-2 rounded-full text-xs font-semibold tracking-wider uppercase\">\nBuilt by Invento Experts\n<\/span><\/div>\n<\/div>\n<\/header><!-- Control Panel (Input Form) -->\n\n<section class=\"p-6 md:p-8 bg-slate-50 border-b border-slate-200\"><form id=\"dnsForm\" class=\"flex flex-col md:flex-row gap-4\">\n<div class=\"flex-grow\"><label class=\"block text-sm font-medium text-slate-700 mb-1\" for=\"domainInput\">Domain Name<\/label>\n<input id=\"domainInput\" class=\"w-full px-4 py-3 rounded-lg border border-slate-300 focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 outline-none transition-all shadow-sm\" required=\"\" type=\"text\" placeholder=\"e.g., example.com\" \/><\/div>\n<div class=\"w-full md:w-48\"><label class=\"block text-sm font-medium text-slate-700 mb-1\" for=\"typeSelect\">Record Type<\/label>\n<select id=\"typeSelect\" class=\"w-full px-4 py-3 rounded-lg border border-slate-300 focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 outline-none transition-all shadow-sm bg-white cursor-pointer\">\n<option selected=\"selected\" value=\"A\">A (IPv4)<\/option>\n<option value=\"AAAA\">AAAA (IPv6)<\/option>\n<option value=\"CNAME\">CNAME<\/option>\n<option value=\"MX\">MX<\/option>\n<option value=\"TXT\">TXT<\/option>\n<option value=\"NS\">NS<\/option>\n<\/select><\/div>\n<div class=\"flex items-end\"><button class=\"w-full md:w-auto px-8 py-3 bg-indigo-600 hover:bg-indigo-700 text-white font-semibold rounded-lg shadow-md transition-colors flex items-center justify-center gap-2 h-[50px]\" type=\"submit\"><\/button><button class=\"w-full md:w-auto px-8 py-3 bg-indigo-600 hover:bg-indigo-700 text-white font-semibold rounded-lg shadow-md transition-colors flex items-center justify-center gap-2 h-[50px]\" type=\"submit\">\n<span id=\"btnText\">Check DNS<\/span><\/button>\n<div id=\"loadingSpinner\" class=\"spinner hidden\"><\/div>\n&nbsp;\n\n<\/div>\n<\/form>\n<div id=\"errorMessage\" class=\"text-red-500 text-sm mt-3 hidden font-medium\"><\/div>\n<\/section><!-- Results Area -->\n\n<section id=\"resultsSection\" class=\"p-6 md:p-8 hidden bg-white\">\n<div class=\"flex justify-between items-center mb-6 border-b border-slate-100 pb-4\">\n<h2 class=\"text-xl font-semibold text-slate-800\">Global Resolution Results<\/h2>\n&nbsp;\n\n<\/div>\n<!-- Propagation Mismatch Warning -->\n<div id=\"mismatchWarning\" class=\"hidden mb-6 bg-amber-50 border-l-4 border-amber-500 p-4 rounded-r-md\">\n<div class=\"flex\">\n<div class=\"flex-shrink-0\"><\/div>\n<div class=\"ml-3\">\n<p class=\"text-sm text-amber-700 font-medium\">Propagation in progress<\/p>\n<p class=\"text-xs text-amber-600 mt-1\">Global servers are reporting different results. This usually means DNS changes are still propagating worldwide.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<!-- Grid for Provider Cards (Using 2 columns since we only have Google & Cloudflare) -->\n<div id=\"resultsGrid\" class=\"grid grid-cols-1 md:grid-cols-2 gap-6\"><!-- Provider cards injected via JS --><\/div>\n<\/section><!-- B2B Hook for Invento Experts -->\n\n<section class=\"bg-indigo-50 border-t border-indigo-100 p-6 md:p-8 text-center sm:text-left flex flex-col sm:flex-row items-center justify-between gap-6\">\n<div><\/div>\n&nbsp;\n\n<\/section><!-- SEO Content Section -->\n\n<article class=\"max-w-4xl mx-auto mt-12 mb-20 px-4 text-slate-600\">\n<h2 class=\"text-2xl font-bold text-slate-800 mb-4\">What is DNS Propagation?<\/h2>\n<p class=\"mb-4 leading-relaxed\">When you update your domain&#8217;s nameservers or modify DNS records (like pointing your website to a new hosting provider), the changes do not take effect instantly across the entire internet. The process of updating these records across global caching servers is known as <strong>DNS Propagation<\/strong>.<\/p>\n\n<h3 class=\"text-xl font-bold text-slate-800 mb-3 mt-8\">Why does it take so long?<\/h3>\n<p class=\"mb-4 leading-relaxed\">Internet Service Providers (ISPs) and global nodes cache DNS records locally to speed up web browsing. They only check for updates after the record&#8217;s Time to Live (TTL) expires. Standard propagation can take anywhere from a few minutes up to <strong>48 hours<\/strong> to complete globally.<\/p>\n<p class=\"leading-relaxed\">Use this free checking tool provided by <strong>Invento Experts<\/strong> to query direct, authoritative DNS-over-HTTPS (DoH) endpoints from major tech providers to see exactly what records the world is seeing in real-time.<\/p>\n\n<\/article><script>\n        document.addEventListener('DOMContentLoaded', () => {\n            \n            \/\/ Core UI Elements\n            const form = document.getElementById('dnsForm');\n            const domainInput = document.getElementById('domainInput');\n            const typeSelect = document.getElementById('typeSelect');\n            const submitBtn = document.getElementById('submitBtn');\n            const btnText = document.getElementById('btnText');\n            const loadingSpinner = document.getElementById('loadingSpinner');\n            const errorMessage = document.getElementById('errorMessage');\n            \n            const resultsSection = document.getElementById('resultsSection');\n            const domainDisplay = document.getElementById('domainDisplay');\n            const resultsGrid = document.getElementById('resultsGrid');\n            const mismatchWarning = document.getElementById('mismatchWarning');\n\n            \/\/ Strictly using APIs that support JSON formats and permissive CORS policies\n            const providers = [\n                {\n                    id: 'google',\n                    name: 'Google Public DNS',\n                    color: 'text-blue-600',\n                    bg: 'bg-blue-50',\n                    icon: '<svg class=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12.24 10.285V14.4h6.806c-.275 1.765-2.056 5.174-6.806 5.174-4.095 0-7.439-3.389-7.439-7.574s3.345-7.574 7.439-7.574c2.33 0 3.891.989 4.785 1.849l3.254-3.138C18.189 1.186 15.479 0 12.24 0c-6.635 0-12 5.365-12 12s5.365 12 12 12c6.926 0 11.52-4.869 11.52-11.726 0-.788-.085-1.39-.189-1.989H12.24z\"\/><\/svg>',\n                    getUrl: (domain, type) => `https:\/\/dns.google\/resolve?name=${domain}&type=${type}`\n                },\n                {\n                    id: 'cloudflare',\n                    name: 'Cloudflare',\n                    color: 'text-orange-500',\n                    bg: 'bg-orange-50',\n                    icon: '<svg class=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M16.92 10.02c-.52-3.15-3.23-5.52-6.57-5.52-2.73 0-5.06 1.63-6.13 3.98-2.6.22-4.66 2.38-4.66 5.02 0 2.76 2.24 5 5 5h12.5c2.48 0 4.5-2.02 4.5-4.5 0-2.31-1.74-4.22-3.98-4.48z\"\/><\/svg>',\n                    getUrl: (domain, type) => `https:\/\/cloudflare-dns.com\/dns-query?name=${domain}&type=${type}`\n                }\n            ];\n\n            const validateDomain = (domain) => {\n                \/\/ Ensure the string looks like a domain name\n                const regex = \/^(?!:\\\/\\\/)(?=.{1,255}$)((.{1,63}\\.){1,127}(?![0-9]*$)[a-z0-9-]+\\.?)$\/i;\n                return regex.test(domain);\n            };\n\n            const sanitizeHTML = (str) => {\n                const temp = document.createElement('div');\n                temp.textContent = str;\n                return temp.innerHTML;\n            };\n\n            const toggleLoadingState = (isLoading) => {\n                if (isLoading) {\n                    submitBtn.disabled = true;\n                    submitBtn.classList.add('opacity-80', 'cursor-not-allowed');\n                    btnText.classList.add('hidden');\n                    loadingSpinner.classList.remove('hidden');\n                    errorMessage.classList.add('hidden');\n                } else {\n                    submitBtn.disabled = false;\n                    submitBtn.classList.remove('opacity-80', 'cursor-not-allowed');\n                    btnText.classList.remove('hidden');\n                    loadingSpinner.classList.add('hidden');\n                }\n            };\n\n            const executeDNSCheck = async (domain, type) => {\n                toggleLoadingState(true);\n                resultsSection.classList.add('hidden');\n                resultsGrid.innerHTML = '';\n                mismatchWarning.classList.add('hidden');\n                \n                domainDisplay.textContent = `${type} records for ${domain}`;\n\n                \/\/ Setup AbortController for reliability (timeout if endpoint hangs)\n                const controller = new AbortController();\n                const timeoutId = setTimeout(() => controller.abort(), 6000); \/\/ 6 seconds timeout\n\n                try {\n                    \/\/ Fetch from both providers in parallel\n                    const fetchPromises = providers.map(async (provider) => {\n                        const url = provider.getUrl(domain, type);\n                        try {\n                            const response = await fetch(url, {\n                                method: 'GET',\n                                headers: { \n                                    \/\/ Strictly required for Cloudflare to return JSON instead of binary\n                                    'Accept': 'application\/dns-json' \n                                },\n                                signal: controller.signal\n                            });\n\n                            if (!response.ok) throw new Error(`HTTP error ${response.status}`);\n                            \n                            const data = await response.json();\n                            return { provider, status: 'success', data };\n                        } catch (error) {\n                            return { \n                                provider, \n                                status: 'error', \n                                error: error.message === 'The user aborted a request.' ? 'Request Timed Out' : error.message \n                            };\n                        }\n                    });\n\n                    const results = await Promise.all(fetchPromises);\n                    clearTimeout(timeoutId);\n                    \n                    renderResultCards(results);\n\n                } catch (error) {\n                    errorMessage.textContent = \"A network error occurred. Please try again.\";\n                    errorMessage.classList.remove('hidden');\n                } finally {\n                    toggleLoadingState(false);\n                }\n            };\n\n            const renderResultCards = (results) => {\n                const validAnswers = new Set();\n                let successfulQueries = 0;\n\n                results.forEach((result, index) => {\n                    const card = document.createElement('div');\n                    card.className = `p-5 border rounded-xl shadow-sm bg-white fade-in`;\n                    card.style.animationDelay = `${index * 0.15}s`;\n\n                    let contentHtml = '';\n                    let parsedData = [];\n\n                    if (result.status === 'success') {\n                        \/\/ Status 0 is NOERROR in DNS protocol. Status 3 is NXDOMAIN (Not found).\n                        if (result.data.Status === 0 && result.data.Answer && result.data.Answer.length > 0) {\n                            \n                            \/\/ Map out the data answers and sanitize to prevent XSS\n                            parsedData = result.data.Answer.map(ans => ans.data);\n                            \n                            \/\/ Sort so that order doesn't trigger a false mismatch warning\n                            const joinedData = parsedData.slice().sort().join(', ');\n                            validAnswers.add(joinedData);\n                            successfulQueries++;\n                            \n                            contentHtml = `\n                                <\/p>\n<div class=\"mt-4 space-y-2 font-mono text-sm\"><p>\n                                    ${parsedData.map(d => `<\/p>\n<div class=\"p-2 bg-slate-50 border border-slate-100 rounded text-slate-700 break-all\">${sanitizeHTML(d)}<\/div>\n<p>`).join('')}\n                                <\/div>\n<p>\n                            `;\n                        } else {\n                            successfulQueries++; \/\/ It was a valid response, just empty\n                            const msg = result.data.Status === 3 ? \"Domain not found (NXDOMAIN)\" : \"No records found for this type.\";\n                            validAnswers.add(\"NONE\");\n                            contentHtml = `\n                                <\/p>\n<div class=\"mt-4 p-3 bg-slate-50 rounded text-slate-500 text-sm font-medium italic\">\n                                    ${msg}\n                                <\/div>\n<p>\n                            `;\n                        }\n                    } else {\n                        contentHtml = `\n                            <\/p>\n<div class=\"mt-4 p-3 bg-red-50 border border-red-100 rounded text-red-600 text-sm font-medium flex items-start gap-2\">\n                                <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"><\/path><\/svg>\n                                <span>Failed: ${sanitizeHTML(result.error)}<\/span>\n                            <\/div>\n<p>\n                        `;\n                    }\n\n                    \/\/ Build Provider Header Structure\n                    card.innerHTML = `\n                        <\/p>\n<div class=\"flex items-center gap-3 border-b border-slate-100 pb-3\"><p>\n                            <\/p>\n<div class=\"p-2 ${result.provider.bg} ${result.provider.color} rounded-lg\">\n                                ${result.provider.icon}\n                            <\/div>\n<p>\n                            <\/p>\n<h3 class=\"font-bold text-slate-800\">${result.provider.name}<\/h3>\n<p>\n                        <\/div>\n<p>\n                        ${contentHtml}\n                    `;\n                    \n                    resultsGrid.appendChild(card);\n                });\n\n                \/\/ Detect Propagation Mismatch (If providers return different data)\n                if (successfulQueries >= 2 && validAnswers.size > 1) {\n                    mismatchWarning.classList.remove('hidden');\n                }\n\n                resultsSection.classList.remove('hidden');\n            };\n\n            \/\/ Event Listeners\n            form.addEventListener('submit', (e) => {\n                e.preventDefault();\n                \n                let domain = domainInput.value.trim().toLowerCase();\n                const type = typeSelect.value;\n                \n                \/\/ Strip protocols and paths if user pastes a full URL (http:\/\/, https:\/\/)\n                domain = domain.replace(\/^https?:\\\/\\\/\/, '').replace(\/\\\/.*$\/, '');\n                \n                if (!validateDomain(domain)) {\n                    errorMessage.textContent = \"Please enter a valid domain name (e.g., inventoexperts.com)\";\n                    errorMessage.classList.remove('hidden');\n                    return;\n                }\n\n                \/\/ Update input box to show the sanitized version\n                domainInput.value = domain;\n                \n                \/\/ Trigger the API check\n                executeDNSCheck(domain, type);\n            });\n        });\n    <\/script>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>&nbsp; &nbsp; DNS Propagation Checker Verify DNS records instantly across global DoH servers. Built by Invento Experts Domain Name Record [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1221","post","type-post","status-publish","format-standard","hentry","category-blog"],"spectra_blocks_featured_image_url":null,"spectra_blocks_author_info":{"display_name":"inventoexpert.com","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/1f0ccf69af13b384d8c38617b8f74b67f32e48bcf9a8865eee4b92d81286e28f?s=96&d=mm&r=g","author_link":"https:\/\/inventoexpert.com\/author\/inventoexpert-com\/","description":""},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"inventoexpert.com","author_link":"https:\/\/inventoexpert.com\/author\/inventoexpert-com\/"},"uagb_comment_info":0,"uagb_excerpt":"&nbsp; &nbsp; DNS Propagation Checker Verify DNS records instantly across global DoH servers. Built by Invento Experts Domain Name Record [&hellip;]","_links":{"self":[{"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/posts\/1221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/comments?post=1221"}],"version-history":[{"count":10,"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/posts\/1221\/revisions"}],"predecessor-version":[{"id":1262,"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/posts\/1221\/revisions\/1262"}],"wp:attachment":[{"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/media?parent=1221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/categories?post=1221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inventoexpert.com\/index.php\/wp-json\/wp\/v2\/tags?post=1221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}