Settings · default · signed in as admin (admin)
Everything that changes how BrandWatch runs, in one place: the data sources it calls, the money and limits it may spend, who can use it, and how good its detection is. Every change is written to the Activity log.
Provider API keys · AES-256-GCM envelope encryption, never shown again
The services BrandWatch calls during a scan. Demo mode answers every call from recorded scenarios, so no key is needed here. A missing key never breaks a scan: that source is skipped and the console says so. Each key gets its own random 32-byte data key (AES-256-GCM), wrapped by the master key and bound to workspace:provider; only the last four characters are ever displayed.
Lookups · DNS & WHOIS
How BrandWatch answers "does this look-alike domain exist, and who registered it?". Both default to free methods that need no key.
Residential / mobile proxy
Optional. Used only by the Tier-4 cloaking probe: re-fetching a suspicious site from a real home or phone-network IP, as a desktop browser and/or as a phone, to catch kits that hide from datacentre scanners or that only target mobile victims. The country is chosen per brand, from its audience. Never used to interact with a site.
Workspace & budget
Hard caps checked before every paid call, over the trailing 24 hours: a scan stops spending instead of overspending. Brands inherit these unless a brand override is set.
Security limits (SSRF guard, sizes, timeouts) are fixed in code and cannot be raised here — see them.
Users & roles
Admin · analyst · viewer — enforced identically in the UI and the API. The last active admin cannot be demoted or deactivated. Passwords are hashed with Argon2id.
| User | Role & status | Last login |
|---|---|---|
| admin active |
+ Add a user
admin: everything · analyst: scans, verdicts, reports, takedowns, investigations · viewer: read-only. A forgotten password: type a new one on the user's row and press Save (at least 10 characters; tell the user yourself).
My API access tokens
For a SIEM, a script or CI. Only the token's SHA-256 is stored and the token is shown once. A read token caps even an admin at viewer rights. Every UI action is also an API call (OpenAPI).
| Name | Prefix | Scope | Expires | Last used | |
|---|---|---|---|---|---|
| SIEM export (read) | bw_ctLILdB… | read | 2027-01-08 | — |
curl in 30 seconds
TOKEN=bw_… # create one above curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8765/api/findings?state=open curl -H "Authorization: Bearer $TOKEN" "http://127.0.0.1:8765/api/iocs?format=stix" -o iocs.stix.json curl -N -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8765/api/jobs/<job_id>/events/stream
Tenants · platform admin
Workspaces are fully isolated: brands, findings, evidence, campaigns, IOCs, keys and budgets never cross tenants.
| Workspace | Users | Created |
|---|---|---|
| default | 1 | 2026-10-07 18:33 |
+ Create a workspace
Notifications
Who hears about a new finding, and how. The channels themselves (Slack webhook, Telegram bot, SMTP) are set in the environment (NOTIFY_CHANNELS, PUBLIC_URL for clickable links); what goes through them is set here. Nothing is ever sent to third parties automatically — takedowns stay drafts until an analyst sends them.
System
| Mode | DEMO (recorded scenarios, $0) |
|---|---|
| Scheduler | disabled (every 60s) |
| Queue | thread |
Detection quality · golden dataset
How we know the scoring works: 65 recorded scenarios — including cloaked kits that hide by IP, by user-agent and by link parameter — run through the real pipeline on every CI build.
Gate: precision ≥ 0.9 · recall ≥ 0.9 · false-positive rate ≤ 0.05. Last measured 1.00 / 1.00 / 0.00. The same corpus drives the $0 demo.
ml-5edcdd68-20 trained on 48 labelled candidates (15 phishing) from golden labels · accuracy 94% · precision 88% · recall 93% (5-fold CV)
Top features: age_lt_30d +0.64 palette_match +0.56 screenshot_similarity_ge_90 +0.56 fp:age_gt_2y -0.56 credential_form +0.54
Its opinion is shown on each finding for context; it never changes the score.
Fixed security limits · not configurable by brand, workspace or environment
What happens before BrandWatch fetches anything from a suspect site — the same policy for the HTTP client, every Chromium sub-request and the TLS probe.
- Validate the URL: http/https only, allowed ports, no credentials, no internal host names.
- Resolve A / AAAA and fail closed if any address is private, loopback, link-local or cloud metadata — 24 blocked networks; IPv4-mapped IPv6 is unwrapped first.
- Connect pinned to the validated IP with the original Host header and TLS SNI (defeats DNS rebinding).
- Re-validate every redirect hop · at most 5 redirects.
- Response ≤ 5.0 MB · timeout 15.0 s.
- Infrastructure pivots stop at depth 2, 100 nodes, 300 edges.
security/fetcher_guard.py · security/limits.py (a frozen dataclass; tests assert none of its fields can appear in any configuration). How it works →