Analyze your site's information architecture by examining URL patterns. This tool automatically detects page types, maps URL clusters, analyzes depth levels, and identifies structural patterns. Get actionable insights into your site's taxonomy and organization.
📊
Pro Tip:
For best results, use a complete sitemap or URL export. The more URLs you provide, the more accurate the pattern detection.
1
Input URLs
Paste a list of URLs (one per line) or load from an XML sitemap.
or load from sitemap
⚡
CORS Proxy:Click here
to enable sitemap loading from external sites.
2
Analysis Results
0
Total URLs
0
Domains
0
Avg Depth
0
Max Depth
0
Clusters
0
Page Types
Page Type Distribution
Depth Distribution
Top Clusters by URL Count
Domain Distribution
URLs grouped by their first path segment. Click to expand.
URLs automatically categorized by detected page type patterns.
URL
Type
Depth
Cluster
Analysis of URL path depths across your site structure.
URLs by Depth Level
Visual hierarchy of your site structure. Click folders to expand/collapse.
Potential information architecture issues detected in your URL structure.
URL
Domain
Type
Cluster
Depth
Export Options
How to Use the URL Structure Analyzer
Get insights into your site's information architecture with these steps:
Input Your URLs:
Paste a list of URLs directly (one per line) from a crawl export, Google Search Console, or any other source.
Alternatively, enter a sitemap URL and click "Load from Sitemap" to automatically extract URLs.
For external sitemaps, enable the CORS proxy first by clicking the link provided.
Review the Analysis:
Overview: See charts showing page type distribution, depth levels, and top clusters.
Clusters: URLs grouped by their first path segment (e.g., /blog/, /products/).
Page Types: Automatic detection of blogs, products, categories, and more.
Depth Analysis: Understand how deep your URL structure goes.
Hierarchy Tree: Visual tree view of your site structure.
Issues: Potential IA problems like excessive depth or orphan structures.
Export Your Data:
Download as CSV for spreadsheet analysis with all detected attributes.
Export JSON for programmatic use or further processing.
Generate a summary report for stakeholder presentations.
No hierarchical structure detected.';document.querySelectorAll('.tree-item').forEach(item=>{item.addEventListener('click',function(){const path=this.dataset.path;const childNode=document.querySelector(`.tree-node[data-parent="${path}"]`);const toggle=this.querySelector('.tree-toggle');if(childNode){const isVisible=childNode.style.display!=='none';childNode.style.display=isVisible?'none':'block';toggle.textContent=isVisible?'▶':'▼'}})})}
function renderIssues(){if(analysisData.issues.length===0){document.getElementById('issuesList').innerHTML=`
✅
No Major Issues Detected
Your URL structure appears to be well-organized.
`;return}
const icons={error:'🔴',warning:'🟡',info:'🔵'};const html=analysisData.issues.map(issue=>`
${icons[issue.type]}
${issue.title}
${issue.description}
`).join('');document.getElementById('issuesList').innerHTML=html}
function renderAllUrlsTable(){applyAllFilters()}
function applyAllFilters(){const typeFilter=document.getElementById('allTypeFilter').value;const clusterFilter=document.getElementById('allClusterFilter').value;const depthFilter=document.getElementById('allDepthFilter').value;const search=document.getElementById('allSearch').value.toLowerCase();filteredUrls=analysisData.urls.filter(u=>{if(typeFilter!=='all'&&u.pageType!==typeFilter)return!1;if(clusterFilter!=='all'&&u.cluster!==clusterFilter)return!1;if(depthFilter!=='all'&&u.depth!==parseInt(depthFilter))return!1;if(search&&!u.original.toLowerCase().includes(search))return!1;return!0});currentPage=1;renderTablePage()}
function renderTablePage(){const start=(currentPage-1)*pageSize;const end=start+pageSize;const pageUrls=filteredUrls.slice(start,end);const badgeClasses={'Blog/Article':'badge-blog','Product':'badge-product','Category':'badge-category','Tag':'badge-tag','Media':'badge-media','Other':'badge-other'};const html=pageUrls.map(u=>`
No URLs match filters';const totalPages=Math.ceil(filteredUrls.length/pageSize);let paginationHtml=`Showing ${start + 1}-${Math.min(end, filteredUrls.length)} of ${filteredUrls.length} `;if(totalPages>1){paginationHtml+=`