{"version":"2026-07-04","name":"Visa Atlas topical authority and internal-link map","description":"Audit-ready hub-and-spoke map for the Visa Atlas SEO/GEO crawl path: topical clusters, canonical hubs, supporting pages, anchor rules, crawl entry points, evidence commands and private-evidence boundaries.","license":"CC BY 4.0","attribution":"Visa Atlas","sourceDatasets":["/api/public/visibility-metrics","/api/public/technical-seo-controls","/api/public/traffic-forecast","/api/public/content-opportunities","/api/public/competitor-query-battlecards","/api/public/battlecard-search-experiments","/api/public/indexable-pages","/api/public/search-index","/api/public/country-comparisons","/api/public/express-entry-categories","/api/public/processing-reliability","/api/public/freshness"],"methodology":{"sourceOfTruth":"Clusters consolidate crawlable hubs, public JSON feeds, rendered audit expectations, competitor battlecards and content opportunity rows. The map documents crawl-path intent, not live ranking performance.","cadence":"Review after adding a strategic report, calculator, generated page class, public dataset, battlecard experiment or source-freshness gate.","versionInputs":{"visibilityMetricsVersion":"2026-07-03","technicalSeoControlsVersion":"2026-07-04","trafficForecastVersion":"2026-07-03","contentOpportunityVersion":"2026-07-03","competitorBattlecardsVersion":"2026-07-05","indexablePageManifestVersion":"2026-07-03","siteSearchIndexVersion":"2026-07-03"},"privateEvidencePolicy":"Raw Search Console exports, analytics, server logs, crawler logs, screenshots, user profiles and experiment rows stay local unless separately reviewed, redacted and aggregated.","caveats":["The map does not guarantee rankings, traffic, AI citations, backlinks or market share.","A linked page is a crawl-path target only when the rendered page, sitemap and indexability controls allow it.","Anchor patterns are implementation guidance; outcome claims still require reviewed GSC, AI citation, referral and authority evidence."]},"summary":{"clusterCount":7,"criticalClusterCount":4,"uniquePageCount":69,"sourceDatasetCount":22,"commandCount":21},"clusters":[{"id":"open-data-ai-retrieval","label":"Open data and AI retrieval authority","priority":"critical","intentCluster":"AI retrievers, journalists, researchers and developers looking for source-backed immigration datasets, citation rules and machine-readable context.","primaryHub":"/data","supportingPages":["/api/public","/api","/ai-agents","/use-our-data","/llms.txt","/llms-full.txt","/mcp","/api/public/visibility-metrics","/api/public/technical-seo-controls"],"sourceDatasets":["/api/public/visibility-metrics","/api/public/technical-seo-controls","/api/public/indexable-pages","/api/public/search-index","/api/public/crawler-access"],"targetQueries":["immigration data API","visa data JSON","source backed immigration datasets","AI immigration citation data"],"internalLinkRules":["Every public dataset card must link to its JSON endpoint, API reference anchor and human page when a human page exists.","Every strategic research report must expose a CiteDataset block with the public JSON endpoint and source datasets.","AI-agent guidance should point retrievers to canonical HTML when methodology matters and JSON when reusable fields matter."],"anchorTextPatterns":["open immigration data","public JSON endpoint","AI agent retrieval contract","cite this dataset"],"crawlEntryPoints":["/data","/api/public","/api/openapi.json","/ai-agents","/llms.txt","/llms-full.txt"],"evidenceCommands":["npm run audit:data-front-door","npm run audit:openapi","npm run audit:mcp","npm run audit:rendered-seo"],"successSignals":["Dataset count in /data, /api/public, DataCatalog JSON-LD and OpenAPI remains aligned.","LLM discovery files list the high-value reports and JSON feeds that ground source-backed answers.","Rendered build exposes Dataset/DataDownload schema for reusable reports."],"failureResponse":["Block a new public feed until it has a catalog record, API reference entry, reuse-guide mention and LLM discovery line.","Do not cite a hidden JSON feed as authority evidence until it is linked from the public data front door."],"relatedBattlecards":["open-data-front-door","source-transparency-open-data"],"relatedForecastCohorts":["data-reference","research-authority"],"privateEvidenceBoundary":"This cluster publishes public contracts and endpoints; private logs, analytics, raw crawler evidence and rejected reuse requests stay local unless reviewed and aggregated."},{"id":"skilled-work-cost-salary","label":"Skilled work cost and salary authority","priority":"critical","intentCluster":"Applicants and employers comparing total migration cost, visa fees, salary floors and settlement cost exposure for sponsored skilled work.","primaryHub":"/calculators/uk-total-migration-cost","supportingPages":["/cost-to-complete","/cost-to-complete/uk-skilled-worker","/fees","/fees/uk/skilled-worker","/salary-thresholds","/salary-thresholds/uk","/calculators/uk-skilled-worker","/visas/uk/skilled-worker"],"sourceDatasets":["/api/public/cost-to-complete","/api/public/fees","/api/public/salary-thresholds","/api/public/calculator-verdict-contexts"],"targetQueries":["UK skilled worker visa total cost","UK skilled worker salary threshold","skilled worker visa fees IHS","UK work visa cost calculator"],"internalLinkRules":["Cost pages must link up to the total migration cost builder and sideways to fee, salary and route pages.","Calculator verdicts must link to the source-backed cost, fee and salary datasets that explain the number shown.","Route pages should use exact descriptive anchors for cost, fee and salary facts rather than generic \"learn more\" anchors."],"anchorTextPatterns":["UK total migration cost calculator","Skilled Worker salary threshold","Skilled Worker fee breakdown","cost-to-complete model"],"crawlEntryPoints":["/calculators","/calculators/uk-total-migration-cost","/api/public/cost-to-complete","/api/public/salary-thresholds","/research/competitor-query-battlecards-2026#uk-skilled-worker-cost-salary"],"evidenceCommands":["npm run audit:calculator-provenance","npm run audit:uk-total-migration-cost","npm run audit:competitor-query-battlecards","npm run audit:rendered-seo"],"successSignals":["The cost calculator, cost detail, fee detail, salary hub and route page all expose source-backed cross-links.","Battlecard target pages and internal-link targets render in the crawlable battlecard report.","Calculator context stays server-rendered with source dates and legal-scope notes."],"failureResponse":["Do not expand paid work cost content if salary, fee or IHS context is missing from the source-backed path.","Patch cross-links before running GSC title or snippet experiments for this query cluster."],"relatedBattlecards":["uk-skilled-worker-cost-salary"],"relatedForecastCohorts":["calculators-tools","core-route-reference","data-reference"],"privateEvidenceBoundary":"The map can publish page and dataset relationships. Query rows, CTR tests and applicant profiles stay local unless converted into reviewed aggregate evidence."},{"id":"canada-express-entry-crs","label":"Canada Express Entry and CRS authority","priority":"critical","intentCluster":"Applicants tracking CRS cutoffs, category-based draws, Express Entry route fit and calculator verdict context.","primaryHub":"/calculators/canada-crs","supportingPages":["/research/canada-express-entry-draw-tracker","/research/canada-express-entry-category-tracker","/visas/canada/express-entry-cec","/visas/canada/express-entry-fsw","/api/public/express-entry-draws","/api/public/express-entry-categories","/api/public/calculator-verdict-contexts"],"sourceDatasets":["/api/public/express-entry-draws","/api/public/express-entry-categories","/api/public/calculator-verdict-contexts","/api/public/answer-capsules"],"targetQueries":["latest Express Entry draw","Express Entry category based draw 2026","Canada CRS calculator","CRS cutoff score latest"],"internalLinkRules":["Draw and category trackers should link back to the CRS calculator when readers need profile interpretation.","The CRS calculator should link to draw history, category status and route pages before presenting any verdict context.","Freshness-sensitive answer blocks must link to the JSON draw feed and category feed."],"anchorTextPatterns":["Canada CRS calculator","latest Express Entry draw","category-based selection tracker","CRS cutoff history"],"crawlEntryPoints":["/calculators/canada-crs","/research/canada-express-entry-draw-tracker","/research/canada-express-entry-category-tracker","/api/public/express-entry-draws","/api/public/express-entry-categories","/research/competitor-query-battlecards-2026#canada-express-entry-freshness"],"evidenceCommands":["npm run fetch:ee-draws","npm run audit:express-entry-categories","npm run audit:calculator-verdict-contexts","npm run audit:rendered-seo"],"successSignals":["Latest draw, category tracker, CRS calculator and route pages are reachable from each other with freshness-sensitive anchors.","Answer capsules and citation packs preserve draw dates and source URLs.","Battlecard experiments can point GSC rows to a stable set of target pages."],"failureResponse":["Pause freshness-sensitive snippet tests if draw or category data is stale.","Prefer updating the draw/category source chain before adding new Canada SEO pages."],"relatedBattlecards":["canada-express-entry-freshness"],"relatedForecastCohorts":["calculators-tools","freshness-policy","research-authority"],"privateEvidenceBoundary":"Public pages expose draw and category facts; private GSC query rows and calculator profile inputs are not published by this map."},{"id":"germany-skilled-migration-recognition","label":"Germany skilled migration and recognition authority","priority":"critical","intentCluster":"Applicants choosing between EU Blue Card, Chancenkarte, skilled-worker and recognition routes while validating degree or vocational evidence.","primaryHub":"/germany-skilled-migration","supportingPages":["/germany-qualification-recognition","/calculators/germany-chancenkarte","/calculators/germany-settlement","/routes/eu-blue-card-vs-chancenkarte-germany","/salary-thresholds/germany","/cost-to-complete/germany-chancenkarte","/cost-to-complete/germany-eu-blue-card","/visas/germany/eu-blue-card","/visas/germany/chancenkarte"],"sourceDatasets":["/api/public/skilled-migration-accessibility","/api/public/salary-thresholds","/api/public/cost-to-complete","/api/public/calculator-verdict-contexts"],"targetQueries":["Germany EU Blue Card vs Chancenkarte","Germany qualification recognition Anabin ZAB","Chancenkarte points calculator","Germany EU Blue Card salary threshold"],"internalLinkRules":["Germany skilled-migration hub must remain the parent link for route, recognition, salary, cost and calculator pages.","Recognition decision-tree pages should link directly to Chancenkarte, EU Blue Card and skilled-worker route pages from each branch outcome.","Salary and cost pages should point back to the recognition decision tree when qualification evidence changes route choice."],"anchorTextPatterns":["Germany skilled-migration hub","qualification recognition decision tree","EU Blue Card vs Chancenkarte","Chancenkarte points calculator"],"crawlEntryPoints":["/germany-skilled-migration","/germany-qualification-recognition","/calculators/germany-chancenkarte","/llms.txt","/research/competitor-query-battlecards-2026#germany-blue-card-salary-recognition"],"evidenceCommands":["npm run audit:germany-recognition-decision-tree","npm run audit:occupation-salary-floor-checker","npm run audit:competitor-query-battlecards","npm run audit:rendered-seo"],"successSignals":["The Germany hub exposes the full route set and links to recognition, calculators and route comparisons.","Recognition and calculator pages expose cross-links to the German visa detail pages they interpret.","The battlecard crawl path includes the report anchor, target pages and rendered SEO audit."],"failureResponse":["Do not ship additional Germany pages if the hub no longer links to the recognition and calculator paths.","Fix route-choice links before testing EU Blue Card or Chancenkarte query snippets."],"relatedBattlecards":["germany-blue-card-salary-recognition","germany-chancenkarte-points-cost"],"relatedForecastCohorts":["calculators-tools","core-route-reference","longtail-navigation"],"privateEvidenceBoundary":"Public links describe route-choice context. User qualifications, calculator inputs and unreviewed legal-risk notes stay local."},{"id":"processing-time-reliability","label":"Processing-time reliability authority","priority":"high","intentCluster":"Applicants comparing official decision-time clocks, uncertainty and planning reliability across destinations and visa routes.","primaryHub":"/processing-times","supportingPages":["/research/processing-time-reliability-index-2026","/processing-times/uk","/processing-times/germany","/processing-times/canada","/api/public/processing-times","/api/public/processing-reliability"],"sourceDatasets":["/api/public/processing-times","/api/public/processing-reliability","/api/public/freshness"],"targetQueries":["visa processing times","skilled worker visa processing time","Germany Blue Card processing time","immigration processing reliability"],"internalLinkRules":["Processing route pages should link up to the processing-times hub and sideways to the reliability index.","Reliability index rows should point back to official processing-time detail pages, not only the JSON score.","Freshness caveats should appear near processing-time claims and link to the public freshness report."],"anchorTextPatterns":["processing-time planning reliability","official processing-time clock","source freshness report","decision-time band"],"crawlEntryPoints":["/processing-times","/research/processing-time-reliability-index-2026","/api/public/processing-times","/api/public/processing-reliability"],"evidenceCommands":["npm run audit:processing-reliability","npm run audit:freshness","npm run audit:rendered-seo"],"successSignals":["Processing-time detail pages, reliability index and freshness report form a visible path.","Pages distinguish official clock availability from individual outcome predictions.","Stale processing figures block freshness-sensitive claims."],"failureResponse":["Remove or caveat processing claims when the source freshness report flags stale or invalid data.","Do not create new processing-time landing pages without a source-backed detail page and reliability context."],"relatedBattlecards":["processing-time-comparison-reliability"],"relatedForecastCohorts":["freshness-policy","data-reference","core-route-reference"],"privateEvidenceBoundary":"Official processing-time data and reliability scores are public. Individual case timelines and support requests are not evidence for this cluster."},{"id":"country-comparison-longtail","label":"Country comparison and long-tail navigation authority","priority":"high","intentCluster":"Users comparing countries, nationality corridors, professions and route trade-offs before choosing a destination path.","primaryHub":"/compare","supportingPages":["/from/indian/to/uk","/from/nigerian/to/canada","/professions/software-engineer/in/germany","/professions/nurse/in/uk","/rankings","/best","/api/public/country-comparisons","/api/public/indexable-pages"],"sourceDatasets":["/api/public/country-comparisons","/api/public/indexable-pages","/api/public/search-index","/api/public/visas"],"targetQueries":["best country for skilled migration","UK vs Canada immigration comparison","software engineer visa Germany","Indian to UK visa options"],"internalLinkRules":["Comparison and corridor pages should link to the strongest route, cost, salary and processing detail pages for the user intent.","Sparse generated pages must stay out of the sitemap until they expose unique source-backed value.","Profession pages should link to country comparison and route pages when the same salary or sponsorship evidence applies."],"anchorTextPatterns":["compare immigration routes","corridor at-a-glance","profession visa options","country comparison data"],"crawlEntryPoints":["/compare","/from/indian/to/uk","/professions/software-engineer/in/germany","/api/public/country-comparisons","/api/public/indexable-pages"],"evidenceCommands":["npm run audit:thin","npm run audit:longtail-depth","npm run audit:longtail-provenance","npm run audit:indexable-page-manifest"],"successSignals":["Indexable long-tail pages expose source-basis blocks and links to stronger route or data pages.","Sitemap and indexable-page manifest agree on which generated pages should be crawled.","Compare pages connect back to cost, salary, processing and route evidence."],"failureResponse":["Noindex or remove long-tail pages that do not provide unique sourced value.","Route users and crawlers to stronger hubs before expanding generated URL classes."],"relatedBattlecards":["country-comparison-longtail","profession-route-navigation"],"relatedForecastCohorts":["longtail-navigation","core-route-reference"],"privateEvidenceBoundary":"The manifest and sitemap publish indexability intent. GSC URL performance, query rows and CTR tests stay local until aggregate review."},{"id":"policy-freshness-change","label":"Policy freshness and change authority","priority":"high","intentCluster":"Readers and AI systems checking what changed, when it changed, and which source-backed figures or policy claims are current.","primaryHub":"/policy-updates","supportingPages":["/changelog","/freshness","/research/monthly-immigration-figure-changes","/api/public/policy-updates","/api/public/policy-claims","/api/public/fact-changes","/api/public/monthly-figure-changes","/api/public/freshness"],"sourceDatasets":["/api/public/policy-updates","/api/public/policy-claims","/api/public/fact-changes","/api/public/monthly-figure-changes","/api/public/freshness"],"targetQueries":["immigration rule changes 2026","visa fee changes","salary threshold changes","immigration policy update source"],"internalLinkRules":["Policy update pages should link to affected route pages and the atomic policy-claim feed.","Figure-change pages should link back to the current owning route, fee, salary or processing page.","Freshness failures should block snippets that imply currentness until the source chain is fixed."],"anchorTextPatterns":["policy update claim","fact-change feed","source freshness report","monthly figure changes"],"crawlEntryPoints":["/policy-updates","/changelog","/freshness","/api/public/policy-claims","/api/public/fact-changes","/llms.txt"],"evidenceCommands":["npm run audit:freshness","npm run audit:stale","npm run audit:policy-claims","npm run audit:monthly-figure-changes"],"successSignals":["Policy updates, claims, fact changes and freshness reports link to each other with dated context.","AI and search discovery files include both human pages and JSON change feeds.","Stale or invalid source records prevent currentness claims."],"failureResponse":["Freeze affected expansion or snippet tests until stale high-risk facts are refreshed.","Keep old/new values and effective dates visible when a changed figure is cited."],"relatedBattlecards":["freshness-policy-change","source-backed-currentness"],"relatedForecastCohorts":["freshness-policy","data-reference","research-authority"],"privateEvidenceBoundary":"Public feeds expose reviewed policy and figure changes. Working notes, failed probes and unreviewed source-refresh logs remain local until triaged."}]}