UI: Scan list
Reference for the scans list — table/grid views, the full filter bar, row contents, and the public report.
Route: /scans.
Views
A toggle switches between Table and Grid layouts of the same results.
Filter bar
Filters narrow the list: URL search, status, group, campaign, run, geo, tags, labels, and a date range. Filters combine (AND) and the list paginates, so you can drill from "all scans in this run" to "...with tag X in geo US".
Rows
Each row links to the scan detail and shows the status, URL, geo, and key tags at a glance.
Two badges explain rows a run produced beyond one per URL. #2/5 is the
scan's position in a repeat group — the same
URL, geo, and device scanned five times. An amber Retry 1/3 means the
scan was re-crawled after a technical failure; it is still one scan, on
its second attempt. Both are hidden at their defaults, and both appear
in the grid view and in the dashboard's Recent Scans widget too.
Public report
Route: /public/scans/:id. A read-only, unauthenticated subset of a
scan (info, tags, redirect tree, screenshot) reachable via the copy
public link action on the scan detail — for sharing with partners who
have no account.
An ad-discovery scan adds an Ad Detection grid between the
screenshots and the redirect tree, headed Ad Detection (N) with the
violation count — the same grid the
scan detail shows, so both surfaces
look and behave alike. One card per discovered ad block shows the
preview (or No creative screenshot / No landing screenshot),
Ad #N, the kind, the network, the creative size, the target URL, the
tags, and a verdict pill: red Violation, green Clean once the
block finished without one, grey Pending while it is still running.
A block that failed or was cancelled shows its status only — there is no
verdict to give.
The network is shown as two separate things: the ad network's name (ExoClick, PropellerAds, TrafficStars) when we recognise the ad server, and the ad server's domain, which is always shown. An ad server we cannot put a name to therefore still tells you the domain it came from instead of leaving the field blank, and infrastructure that is not an ad network at all — tag managers, analytics, the publisher's own creative CDN — is never labelled as one.
A Creative / Landing switch above the grid picks which capture every
card previews; it starts on Creative and a block missing the chosen
capture says so rather than falling back to the other one. Cards link to
the block's own report — /public/scans/:child_id here, the
authenticated report on the scan detail. While the parent is still
crawling the grid polls and shows Scanning the page for ads…; a page
with nothing found shows No ads detected on this page.
On the shared report the tag pills are limited to the tags cleared for public reports; in the cabinet they cover everything your organization may see.