<?xml version="1.0" encoding="UTF-8"?>
<!--
  Main sitemap index. Hand-maintained: nothing regenerates this file.

  sitemap-general.xml lives here in public/. sitemap-lenders.xml,
  sitemap-rankings.xml and sitemap-rankings-md.xml are built by
  apps/pSEO-generator (generateSitemaps()) into R2 and served by the consumer
  worker's R2 allowlist in workers/app.ts.

  sitemap-local.xml is deliberately NOT listed here. Sitemap index files cannot
  nest — Google ignores an index referenced from another index — so it is a
  SIBLING of this file, listed separately in robots.txt and submitted on its own
  in Search Console.

  sitemap-rankings-md.xml was removed 2026-09-02. It listed the .txt markdown twin of every
  ranking page, and those responses now send Link: <html-url>; rel="canonical". Submitting a URL
  in a sitemap asks Google to index it while the canonical asks it not to — Google honours the
  canonical, so the entries only spent crawl budget to be told the HTML is authoritative. The
  markdown is still published and still discoverable for AI crawlers via llms.txt; it is R2 and
  the generator that own it, not the sitemap index.

  The seven sitemap-places-*.xml entries were removed 2026-08-15. They listed
  ~301,431 URLs on the retired /places/... scheme; every one 301s to
  /local/places/... (a blind prefix-prepend rule in Cloudflare, not in this repo)
  and lands on a 404. The live equivalents are /local/<slug>/... and are covered
  by sitemap-local.xml. apps/consumer/scripts/generatePlacesSitemaps.ts still
  exists and would rewrite this file with those entries if it is ever run again.
-->
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://saferate.com/sitemap-general.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://saferate.com/sitemap-lenders.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://saferate.com/sitemap-rankings.xml</loc>
  </sitemap>
  <!--
    The three treasury sitemaps are SIBLINGS here, not a treasury index pointing
    at two children. A sitemap index referenced from another index is ignored,
    which is the same constraint that keeps sitemap-local.xml out of this file.

    They are ROUTES rather than files: treasury data is behind the TREASURY
    service binding and only the consumer worker is bound to it, so there is no
    generator that could write them into R2. See app/utils/sitemapXml.ts.

    Split by how often they change and how many URLs they hold, so Search
    Console's per-sitemap indexing report separates them:
      treasury             ~51 pages, content daily, URL set rarely
      treasury-curves      ~4,725, one fitted trading day each, one added a day
      treasury-securities  ~2,735, one per CUSIP, a few added a week
  -->
  <sitemap>
    <loc>https://saferate.com/sitemap-treasury.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://saferate.com/sitemap-treasury-curves.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://saferate.com/sitemap-treasury-securities.xml</loc>
  </sitemap>
</sitemapindex>
