AI Agent Allowlist
Home Page-Types Database Agent Guardrails 2026 Incidents API Docs Pricing
Resources
Use Cases Industries & Buyers Learn: Core Concepts Implementation Guides Comparisons Schema & Data Reference FAQ Glossary
Why It Matters
2026 Agent Incidents Category Targeting Database Refreshes Contact Customer Login
Download Free Sample
page detection, done right

Guessing /login Was Always Going to Fail. Verified URLs Don't.

Point an agent at a domain and tell it to find the login page. It will try /login, then /signin, then give up or hallucinate a URL that returns a 404. That approach fails constantly in production — not because the idea is wrong, but because the modern web stopped putting pages at predictable paths years ago. Verified URLs, discovered by crawling and confirmed against the live site, are the alternative that actually works at scale.

28Page types, verified per domain
40M+Domains covered
10B+Links individually analyzed
0Guessed paths in the database

Several 2026 incidents involved agents reaching pages nobody meant for them to reach — the Hugging Face breach, the DseWiki hijack, the JFrog Artifactory covert channel, and a string of third-party account takeovers. A database of verified page-type URLs plus egress rules would have denied almost every one of those requests before it left the network. Every 2026 agent escape, mapped to the rule that stops it → See specifically how the DseWiki hijack ran through URL shapes no guessed-path list would have contained.

The problem with guessing

A guessed path is a bet, not a fact

Every guessed-path scheme rests on an assumption: that a page type lives at one of a handful of conventional locations. That assumption held reasonably well on the server-rendered web of 2010. It does not hold on a web built from single-page apps, regional deployments, and outsourced identity, where the same page type can live at a dozen different shapes of URL depending on the site’s stack, its market, and its vendor choices.

  Guessed-path detection

  • Tries a short static list: /login, /signin, /account/login, /auth
  • Breaks the moment a site adds a locale or region prefix
  • Cannot see a subdomain it never thought to try
  • Gets a 200 response from a single-page app for every path it tries, verified or not
  • Has no way to tell a third-party identity provider's domain from the target site's own
  • Silently fails: a wrong guess looks identical to a correct one until an agent submits credentials to the wrong form

  Crawl-verified detection

  • Discovers the real URL from the site's own link graph and rendered navigation
  • Handles locale and region prefixes because it observed the actual localized URL
  • Follows a domain onto its real identity subdomain and records that host
  • Confirms the destination actually renders the page type it claims, not just a 200 status
  • Attributes third-party identity providers correctly, per domain
  • Fails loudly: if no verified URL exists for a page type on a domain, the record says so instead of guessing

The gap between the two approaches widens with scale. A guessing scheme built for a handful of familiar domains can be patched by hand every time it fails — someone notices the miss, adds a new path variant, and moves on. That workaround stops being available the moment an agent needs to operate across tens of thousands of domains it has never seen before, each with its own routing conventions, its own identity vendor, and its own rendering stack. At that scale there is no human in the loop to notice a silent miss and patch the list; the only options are a crawl-and-verify pipeline that discovers the real answer per domain, or an agent that quietly fails on an unknown but non-trivial fraction of its targets and never tells anyone.

Same page type, different reality

One page type, a dozen real shapes

Login is the page type every guessing scheme claims to handle, so it is the clearest place to see the gap. These are illustrative shapes — the pattern any team doing this work runs into, not records pulled from a specific customer’s data. A path-guessing agent has to hard-code every one of these shapes in advance and still misses the ones nobody thought to add.

Site patternGuessed path an agent triesWhere the real login page actually sits
Regional SaaS deployment/login/de-de/login or /en-gb/account/sign-in
Identity split onto its own host/signinaccounts.example.com/signin
Outsourced identity provider/loginexample.okta.com or example.auth0.com/login
Single-page app, client-side router/login/app#/login (only rendered after JS executes)
Consumer platform, brand-specific naming/account/login/accounts/ServiceLoginAuth or /signin/v2/identifier
Enterprise SSO gateway/loginsso.example.com/login?service=main-app
Marketplace with separate buyer/seller portals/login/seller-center/login (buyer login lives elsewhere entirely)

Multiply this by 28 page types and 40 million domains and the scale of the guessing problem becomes clear: there is no static list long enough, and every entry you add to make the guesser smarter is really an admission that the answer needs to come from crawling the actual site, not from a convention.

Four ways guessing breaks

Why /login fails in practice

These are not edge cases. They are the default condition of a meaningful share of the modern web, and any one of them is enough to make a guessed path wrong.

01

Locale prefixes

A site serving 40 markets does not put every login page at the same path. Country and language codes shift the URL — /fr/connexion, /jp/login, /en-au/account/sign-in — and a guesser has to know the exact locale scheme for every domain in advance, which defeats the purpose of guessing.

02

Identity on a subdomain

Plenty of sites move authentication onto its own host entirely — accounts.example.com, id.example.com, login.example.com — sometimes on a completely different second-level domain when identity is outsourced. A path guess never leaves the root domain, so it never finds these.

03

SPA client-side routing

Single-page applications often return the same shell document with HTTP 200 for every path, then render the actual page in JavaScript after the route resolves. A guesser reading only the HTTP status code cannot tell a real login form from a blank shell — both say "200 OK."

04

Third-party identity providers

Auth0, Okta, WorkOS, Ping and similar providers host the actual login form on their own domain, embedded or redirected from the site an agent is researching. The page type an agent needs to allow or deny may not even be part of the target domain at all.

Who hits this wall

Three agent roles, the same broken assumption

The failure modes above are not theoretical for anyone actually running browsing agents in production. They show up as support tickets and silent task failures within the first week.

Procurement research agents

Sent to compare vendor pricing across dozens of SaaS domains, these agents lose hours to pricing pages hidden behind JavaScript tabs or region-specific paths, and occasionally wander toward a checkout page while trying alternate guesses — exactly the surface their policy should have denied outright.

Support and status-monitoring agents

Tasked with checking a vendor's current incident status, these agents fail quietly when the real status page lives on a separate status-page vendor's domain the guesser never tries, reporting "all clear" simply because it never found the page at all.

Recruiting and sourcing agents

Harvesting open roles across thousands of company domains, these agents miss careers pages hosted on external applicant-tracking platforms unless the crawl already knows to follow the link off-domain to where the real listings live.

The alternative

How crawl-verification actually works

Instead of guessing a path and hoping, our approach starts from the site’s own structure and confirms every candidate before it becomes a record. The output is a URL an agent can trust, or an honest absence when no such page exists yet.

Traverse the real link graph

Crawling follows the site’s own navigation, sitemaps, and rendered links — including JavaScript-rendered ones — rather than assuming a path convention. This is how identity subdomains and locale-prefixed routes get discovered in the first place.

Classify the candidate page

A discovered URL is classified into one of the 28 page types based on its actual rendered content and structure, not its path string — so a URL that happens to contain the word "login" but shows a marketing page is not misfiled.

Verify against the live site

Before a URL is recorded, it is confirmed to actually serve that page type on the live domain. A URL is in the database only if that domain genuinely serves it — nothing is filled in by convention or extrapolated from similar domains.

Re-verify on refresh

Sites redesign, migrate identity providers, and change routing schemes. Each update cycle re-checks page-type URLs against the current live site, so a URL that verified last quarter but has since moved does not sit in the database as a stale, silently wrong record.

The practical effect for a policy engine is that a lookup against the page-types database returns either a URL that is confirmed to exist and to be that page type, or nothing at all. Nothing at all is a safe, honest answer a default-deny policy can act on. A wrong guess dressed up as an answer is not.

One honest note on coverage: the eight action-type page keys — signup, password_reset, cart, checkout, upload, post_create, comment and subscribe — ship with the current reclassification cycle and are added per domain as records are re-verified. A domain without one of those keys today does not mean the page does not exist; it means verification has not reached it yet in this cycle. That is a materially different, and more honest, statement than a guessing scheme could ever make about its own gaps, because a guesser has no concept of "not yet verified" — it only has "tried" and "not tried."

Beyond login

The same guessing problem repeats across all 28 page types

Login gets the attention because it is the credential surface everyone worries about, but the guessing problem is identical for every other page type an agent needs to find. A procurement agent hunting for a pricing page, a support agent looking for a status page, or a recruiting agent trying to reach a careers page all hit the same wall: the obvious path is often wrong, and the real one is discoverable only by looking at what the site actually publishes.

Page typeGuessed path an agent triesCommon real-world shape instead
Pricing/pricing/plans, /packages, or a locale-prefixed /en/pricing
Status/statusstatus.example.com, hosted on a separate status-page vendor entirely
Careers/careers/jobs, or an external careers portal on a recruiting platform's domain
Documentation/docsdocs.example.com, or /developers/reference under a versioned path
Checkout/checkout/cart/review, or a payment processor's own hosted checkout domain

Status pages are a particularly clean example: a large share of sites run their status page on a dedicated third-party status-page vendor's domain rather than their own, so no path guess on the primary domain will ever find it — the only reliable answer is a crawl that follows the site's own links to wherever it actually points.

What a wrong guess costs

A wrong guess is not a harmless miss

In a research context, a wrong guess just wastes a request and a retry. In a policy-enforcement context, the failure mode is worse, because a guessing scheme cannot distinguish "I found nothing" from "I found the wrong thing with high confidence."

Consider a procurement agent operating under a policy that allows pricing and documentation pages but denies checkout and account pages. If the agent's path-guessing logic mistakes a marketing landing page at /plans for the real pricing page and never discovers the actual /pricing/enterprise page behind a JavaScript-rendered tab, the agent either stalls on a task it should be able to complete, or — more dangerously — falls back to exploratory clicking that was never covered by policy in the first place. Either failure traces back to the same root cause: the policy engine was asked to make a decision about a URL nobody had actually verified.

This is why a default-deny posture and verified URLs work together rather than as alternatives. Default-deny assumes the worst about anything unclassified; verified URLs shrink the unclassified set down to the genuine long tail, instead of leaving it artificially large because a guessing scheme could not find pages that were there all along.

Why this matters for agent policy

A policy engine is only as good as its input

A zero-trust policy that checks every URL before an agent visits it is only as reliable as the map it checks against. Feed it guessed paths and it will confidently allow or deny the wrong page. Feed it verified URLs and the same policy logic becomes trustworthy, because the underlying fact — "this URL is the checkout page for this domain" — was actually confirmed rather than assumed.

28Page types, each independently verified
40M+Domains, 99.99% of active usage
1Lookup replaces a multi-step guess-and-check crawl
0Extrapolated or assumed URLs in the data
Where this fits

From verified URL to enforced policy

Knowing the real URL for a page type is the first layer. What an agent is allowed to do once it has that URL is a policy decision built on top of it, and it belongs alongside two other ideas: never trusting a destination just because a prior visit succeeded, and treating account creation, checkout, and content-write pages as high-scrutiny surfaces by default.

FAQ

Verified URLs, answered

Why can't an agent just try common paths until one works?
Because "works" is ambiguous. A single-page app returns HTTP 200 for almost any path, a guessed path can land on a page that merely mentions login without being the login form, and a guess can never find a URL on a subdomain or third-party identity provider it never thought to try. Trying paths until one "works" produces false positives that look identical to correct answers until an agent acts on the wrong one.
How is a verified URL different from a URL pattern rule?
A verified URL is a specific, confirmed address on a specific domain — stripe.com's actual checkout page, for example. A URL pattern rule, like the ones in the egress rules library, matches a shape (a wiki-edit path, a WebDAV endpoint) on any domain, verified or not. The two are complementary: verified URLs cover the 28 known page types per domain, and pattern rules catch risky shapes everywhere else.
What happens when a page type genuinely doesn't exist on a domain?
The record says so. Absence is itself meaningful: if a domain has no verified signup page, that is recorded as absent rather than filled in with a guess. A policy engine reading an absent record can treat it the same as any other unresolved destination — typically default-deny.
Do locale and subdomain variants ever get missed?
Coverage depends on what the site itself exposes through its link graph and rendered navigation at crawl time, and each refresh cycle re-checks and re-verifies. No crawl-based approach claims perfect, instant coverage of every locale variant the moment it ships — but it improves with every re-verification pass, where a static guessed-path list never improves at all.
Does this replace robots.txt or sitemap.xml as a data source?
No — those are inputs the crawl considers, not a substitute for verification. A sitemap entry or a robots.txt allowance tells you a URL exists in principle; it does not tell you which of the 28 page types that URL actually renders. Classification and confirmation happen on top of whatever the site publishes.

Stop guessing. Start looking up verified URLs.

28 page types, 40 million+ domains, every URL confirmed against the live site. See the schema, then check a real domain against the API.

See Pricing