# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
User-agent: *
Allow: /
# Private / authenticated surfaces — not for indexing.
Disallow: /app
Disallow: /admin
Disallow: /developers/dashboard
Disallow: /checkout
Disallow: /f/
# AUTH FORMS LINKED FROM 1.4M PAGES (2026-10-15, from production logs). Every public bill page
# links to /signup with `return_to` and `bill_ids`, and the gated search page links to /signup and
# /login with `return_to: request.fullpath` — so the corpus advertises a DISTINCT auth URL per
# bill and per filter combination, each one the same form. Crawlers were walking them.
#
# ONLY THE QUERY-STRING VARIANTS ARE BLOCKED. Bare /signup and /login stay crawlable ON PURPOSE:
# they carry `X-Robots-Tag: noindex` (AuthPagesNotIndexable), and a crawler has to be allowed to
# FETCH a page to see that header. Disallowing them outright would hide the noindex and freeze
# whatever is already indexed instead of removing it.
Disallow: /signup?
Disallow: /login?
# FILTER COMBINATIONS (2026-10-21, from production logs). Every public bill list links to itself
# with each state added and each page number, so the state × page space is effectively infinite —
# a crawl was walking "states=9,18,20,24,32,46&page=3" at hundreds of requests a second. The
# unfiltered /bills and every /bills/:id page stay crawlable; the filtered views also say noindex.
Disallow: /bills?*states=
Disallow: /bills?*fed=
Disallow: /bills?*page=
Sitemap: https://www.oneclickpolitics.com/sitemap.xml