Skip to content

Help us find your pages

When AlertaVuln runs a hosted DAST scan, it starts at your target’s home page and follows the links it finds. That works for a server-rendered site, but two very common shapes give the crawler nothing to follow:

  • Single-page apps (React, Vue, Angular, Svelte) ship an almost-empty HTML shell and build the page in the browser. The crawler fetches the shell, finds no <a href> links to the real routes, and scans only the landing page.
  • APIs have no HTML and no links at all. Without a map of endpoints, the scanner has nothing to probe.

In both cases the scan comes back nearly empty - not because your app is clean, but because the scanner never reached the pages that matter. Seeding fixes that: you hand the scan a starting map - a list of URLs, an OpenAPI spec, or both - and it scans everything on the map instead of guessing from links.

In the web app, open the Dynamic Scan page for your project and find the Scan it for me panel. Each target has a Help us find your pages section with two inputs:

  1. Page & entry URLs - a list of URLs the scan should visit, one per line. Give it the routes a crawler can’t discover: your SPA’s main views, deep links, and anything not linked from the home page.

  2. OpenAPI / Swagger spec - the address of your API’s machine-readable description, or the spec itself pasted in. The scan reads every path and method from it and probes them directly.

Provide either one, or both. For a typical SPA-with-an-API you’ll want both: the URL list covers the browser-rendered pages, and the spec covers the API behind them.

Most API frameworks already generate an OpenAPI (formerly Swagger) document - you often just need to know its URL. Here’s the default location per framework:

FastAPI serves the spec automatically:

https://api.example.com/openapi.json

The Swagger UI at /docs and ReDoc at /redoc both read that same file. If you mounted the app under a path or set root_path, the spec moves with it (e.g. /api/openapi.json).

You can paste the spec’s JSON or YAML straight into the panel instead of giving a URL. Do that when the spec isn’t reachable from the public internet - for example it’s only served behind your VPN, requires a login to fetch, or you generate it at build time and never host it. A pasted spec is used as-is; the scan doesn’t need to fetch it.

If your API has no spec, you don’t need to invent one. List your key endpoints as Page & entry URLs instead - one URL per line, including the method’s path and any required query string. The scan probes each URL you list. It’s more work than a spec, but it gets the important endpoints covered.

For the Page & entry URLs box, you’re after the routes a link-follower would miss. Good sources:

  • Your SPA’s router. The route table (React Router, Vue Router, Angular routes) is the definitive list of client-side views. Turn each route into a full URL: /dashboard, /orders/123, /settings/profile.
  • A sitemap. If you publish https://example.com/sitemap.xml, it already lists your canonical URLs - copy them in.
  • Key deep links. Anything you’d bookmark: a specific report, a search results page with a representative query, an item detail page.

You don’t need every URL - a handful of representative pages per section is usually enough for the scanner to exercise the app. Use real IDs that exist in the environment you’re scanning (staging), not placeholders.

Seeding tells the scan where to look; authentication lets it in. If the pages and endpoints you seeded sit behind a login, set up an Authenticated scan on the same target (a bearer token, header, or cookie) so the scanner sends credentials with every request. Without it, seeded URLs behind a login just return the sign-in page and the scan still finds nothing.

A spec plus a token is the strongest combination for an API: the spec maps every endpoint, and the token gets the scanner past the auth wall to actually exercise them.

A self-hosted av dast scan seeds the same way, with flags instead of the panel:

Terminal window
av dast scan --target https://staging.example.com \
--seed-urls ./urls.txt \
--openapi https://staging.example.com/openapi.json
  • --seed-urls takes a file with one URL per line (the Page & entry URLs equivalent).
  • --openapi takes a spec URL or a local file path (the OpenAPI / Swagger spec equivalent).

The same same-site rule applies: URLs outside the target’s registrable domain are dropped. See av dast scan for the full flag list.