Microsoft 365 Tenant Checker
Type any domain. Your browser asks Microsoft’s public sign-in service and public DNS whether a Microsoft 365 tenant exists for it, where it lives, and whether its mail runs on Exchange Online. Nothing you type is sent to us.
What each result means
Tenant ID
The permanent identifier of the organization’s Microsoft Entra ID directory. If none is found, the domain is not verified in any Microsoft 365 or Azure tenant.
Region and cloud
Where the tenant’s directory data lives and whether it is in Microsoft’s commercial cloud or a US government cloud (GCC, GCC High, DoD).
Mail on Exchange Online
Read from the domain’s MX record. Mail routed to mail.protection.outlook.com lands in Exchange Online. Anything else means a third-party filter, Google Workspace or an on-premises server sits in front.
Domain verification record
An MS=ms… TXT record shows someone verified this domain in a Microsoft tenant at some point. It can stay behind after a migration.
window.C2N = (function () { function esc(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } function fire(el) { el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); } function enhance(form) { [].forEach.call(form.querySelectorAll('select[data-seg]'), function (sel) { var seg = document.createElement('div'); seg.className = 'c2n-seg'; seg.setAttribute('role', 'radiogroup'); seg.style.gridTemplateColumns = 'repeat(' + Math.min(sel.options.length, +sel.dataset.seg || sel.options.length) + ',1fr)'; [].forEach.call(sel.options, function (o) { var b = document.createElement('button'); b.type = 'button'; b.textContent = o.textContent; b.dataset.v = o.value; b.setAttribute('role', 'radio'); b.addEventListener('click', function () { sel.value = o.value; sync(form); fire(sel); }); seg.appendChild(b); }); sel.hidden = true; sel.parentNode.insertBefore(seg, sel.nextSibling); }); [].forEach.call(form.querySelectorAll('input[data-range]'), function (num) { var r = num.dataset.range.split(','), rg = document.createElement('input'); rg.type = 'range'; rg.min = r[0]; rg.max = r[1]; rg.step = r[2] || 1; rg.className = 'c2n-range'; rg.setAttribute('aria-label', num.name); rg.addEventListener('input', function (e) { e.stopPropagation(); num.value = rg.value; fire(num); }); num.parentNode.appendChild(rg); }); } function sync(form) { [].forEach.call(form.querySelectorAll('select[data-seg]'), function (sel) { [].forEach.call(sel.nextSibling.children, function (b) { var on = b.dataset.v === sel.value; b.classList.toggle('on', on); b.setAttribute('aria-checked', on); }); }); [].forEach.call(form.querySelectorAll('input[data-range]'), function (num) { num.parentNode.querySelector('.c2n-range').value = num.value; }); } function render(el, r) { var h = '<div class="c2n-cx-bar"><span>Results · ' + esc(r.title) + (r.unit === undefined ? ' · USD' : r.unit) + '</span><span class="c2n-cx-live">Live</span></div>'; if (r.lead) h += '<p class="c2n-cx-lead">' + r.lead + '</p>'; if (r.kpis) h += '<div class="c2n-cx-kpis">' + r.kpis.map(function (k, i) { return '<div class="c2n-cx-kpi' + (i ? '' : ' on') + '"><small>' + esc(k[0]) + '</small><b>' + k[1] + '</b><span>' + (k[2] || '') + '</span></div>'; }).join('') + '</div>'; if (r.rows) { var cell = function (tag) { return function (c, i) { return '<' + tag + (i ? ' class="n"' : '') + '>' + c + '</' + tag + '>'; }; }; h += '<div class="c2n-cx-scroll"><table class="c2n-cx-table">' + (r.head ? '<tr>' + r.head.map(cell('th')).join('') + '</tr>' : '') + r.rows.map(function (row) { return '<tr>' + row.map(cell('td')).join('') + '</tr>'; }).join('') + (r.total ? '<tr class="t">' + r.total.map(cell('td')).join('') + '</tr>' : '') + '</table></div>'; } h += '<div class="c2n-cx-foot"><p>' + (r.note || '') + '</p>' + (r.cta ? '<a class="c2n-cx-btn" href="' + esc(r.cta[1]) + '">' + esc(r.cta[0]) + '</a>' : '') + '</div>'; el.innerHTML = h; } function money(n, d) { return (n < 0 ? '-$' : '$') + Math.abs(n).toLocaleString('en-US', { minimumFractionDigits: d || 0, maximumFractionDigits: d || 0 }); } function values(form) { var v = {}; [].forEach.call(form.elements, function (el) { if (el.name) v[el.name] = el.type === 'number' ? Math.max(0, +el.value || 0) : el.value; }); return v; } function restore(form) { var q = new URLSearchParams(location.search); [].forEach.call(form.elements, function (el) { if (el.name) { if (q.has(el.name)) el.value = q.get(el.name); } }); } function save(form) { var o = {}; [].forEach.call(form.elements, function (el) { if (el.name) o[el.name] = el.value; }); history.replaceState(null, '', '?' + new URLSearchParams(o)); } function mount(form, calc) { enhance(form); restore(form); var run = function () { sync(form); calc(values(form)); save(form); }; form.addEventListener('input', run); form.addEventListener('submit', function (e) { e.preventDefault(); }); run(); } return { mount: mount, render: render, money: money, esc: esc, sync: sync, enhance: enhance }; })(); (function () { var f = document.getElementById('tc'), out = document.getElementById('tc-out'), esc = C2N.esc; var REGION = { NA: 'North America', EU: 'Europe', AS: 'Asia Pacific', OC: 'Oceania', SA: 'South America', AF: 'Africa', WW: 'Worldwide' }; function show(lead, rows, kpis) { C2N.render(out, { title: 'Tenant check', unit: '', lead: lead, kpis: kpis, head: rows ? ['Check', 'Result'] : null, rows: rows, note: 'Public lookups only: Microsoft sign-in metadata and Google public DNS.', cta: ['Request a tenant scan', '/tools/#tenant-optimizer'] }); } function dns(name, type) { return fetch('https://dns.google/resolve?name=' + encodeURIComponent(name) + '&type=' + type).then(function (r) { return r.json(); }).then(function (j) { return (j.Answer || []).map(function (a) { return a.data; }); }).catch(function () { return null; }); } function check(domain) { show('Checking <strong>' + esc(domain) + '</strong>…'); var oidc = fetch('https://login.microsoftonline.com/' + encodeURIComponent(domain) + '/v2.0/.well-known/openid-configuration').then(function (r) { return r.ok ? r.json() : null; }).catch(function () { return null; }); Promise.all([oidc, dns(domain, 'MX'), dns(domain, 'TXT')]).then(function (res) { var o = res[0], mx = (res[1] || []).filter(function (m) { return m.split(' ').pop() !== '.'; }), txt = res[2] || []; var tid = o ? (o.issuer.match(/[0-9a-f-]{36}/) || [''])[0] : ''; var cloud = !o ? '' : o.cloud_instance_name === 'microsoftonline.us' ? 'US Government (GCC High / DoD)' : o.tenant_region_sub_scope === 'GCC' ? 'US Government (GCC)' : 'Commercial'; var exo = mx.some(function (m) { return /mail\.protection\.outlook\.(com|us)\.?$/i.test(m); }); var verified = txt.some(function (t) { return /MS=ms\d+/.test(t); }); var mail = res[1] === null ? 'DNS lookup failed' : exo ? '<span class="c2n-cx-ok">Exchange Online</span>' : mx.length ? 'Elsewhere first' : 'No MX record'; show(o ? '<strong>' + esc(domain) + '</strong> belongs to a Microsoft 365 tenant' + (exo ? ' and its mail is on Exchange Online.' : ', but its mail is routed elsewhere first.') : 'No Microsoft 365 or Azure tenant has verified <strong>' + esc(domain) + '</strong>.', [['Tenant ID', tid || '—'], ['Region', o ? esc(REGION[o.tenant_region_scope] || o.tenant_region_scope || 'Unknown') : '—'], ['Cloud', cloud || '—'], ['MX', mx.length ? esc(mx.map(function (m) { return m.split(' ').pop().replace(/\.$/, ''); }).join(', ')) : '—'], ['Microsoft verification TXT', verified ? 'Present' : 'Not found']], [['Microsoft 365 tenant', o ? '<span class="c2n-cx-ok">Found</span>' : '<span class="c2n-cx-bad">Not found</span>', o ? cloud : 'domain not verified'], ['Mail', mail, exo ? 'MX points to Microsoft' : '']]); }); history.replaceState(null, '', '?domain=' + encodeURIComponent(domain)); } f.addEventListener('submit', function (e) { e.preventDefault(); var d = f.domain.value.trim().toLowerCase().replace(/^https?:\/\//, '').replace(/^[^@]*@/, '').split('/')[0]; if (!/^[a-z0-9-]+(\.[a-z0-9-]+)+$/.test(d)) { show('Enter a domain like <strong>contoso.com</strong>.'); return; } f.domain.value = d; check(d); }); var d0 = new URLSearchParams(location.search).get('domain'); if (d0) { f.domain.value = d0; f.requestSubmit(); } else show('Enter a domain on the left to see whether it has a Microsoft 365 tenant.'); })();