9 open38 to send

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.

Mode
Demo
recorded scenarios · $0 · no keys needed
API keys
0 of 13 set
recommended: OpenAI, Google Safe Browsing, SearchApi.io · Meta Ad Library, social accounts, AI answers, SerpApi, urlscan.io, VirusTotal
Residential proxy
Off
datacentre probes only
Daily budget
$0.0 · 100,000 calls
500 sites per scan at most
Team
1 user(s)
1 admin · 1 API token(s)

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.

Threat reputation · is this site already known as bad?
VirusTotalrecommendedevery trackthe site investigationget a key ↗
Verdicts from 70+ anti-virus and blocklist engines for every visited site. Also powers passive DNS on the infrastructure map and most of a finding's site & network investigation. · free public key · 4 requests/min
not set
URLhaus · abuse.chevery trackget a key ↗
Checks each URL against abuse.ch's feed of malware and phishing URLs (second in the reputation chain). · free key
not set
Google Safe Browsingrecommendedevery trackget a key ↗
The list Chrome, Firefox and Safari use to warn users. Checked for every visited site: shows whether Google already warns about it, so you can tell when BrandWatch found a kit first. · free for non-commercial use · Google Cloud key
not set
AbuseIPDBthe site investigationget a key ↗
Community abuse reports for every server in a finding's investigation: a 0–100 abuse score, how many reports, from how many reporters, and when last. · free daily quota
not set
Discovery & search · where look-alikes are found
SerpApirecommendedGoogle searchget a key ↗
Google results for the brand's search queries: the 'Google search' discovery stream, run per country. · free tier
not set
ScraperAPIGoogle search (fallback)get a key ↗
The fallback of SerpApi for the 'Google search' discovery stream: when SerpApi has no key, no quota left or is down, the same searches go to ScraperAPI (about 25 credits a search). · paid · free trial credits
not set
urlscan.iorecommendedStandard · Deepthe site investigationget a key ↗
Searches the urlscan.io archive for pages that mention the brand (a discovery stream), and submits fresh scans from a finding's investigation. · free key
not set
Domains & servers · who registered it and where it runs
Shodanthe infrastructure mapget a key ↗
Infrastructure map: what runs on each hosting server, and other servers that serve the same favicon. · paid membership for search
not set
WhoisXML APIWHOIS historyWHOIS by serviceget a key ↗
WHOIS history on the finding page: every past owner, registrar and privacy change, and owner details hidden after registration. Also WHOIS records when Lookups → WHOIS is 'Service' (the default RDAP method needs no key). · paid · WHOIS History is its own product on the same key
not set
Suspicious shops · ads selling the brand's products, and whether the seller exists
SearchApi.io · Meta Ad Library, social accounts, AI answersrecommendedsocial mediaadsAI answersget a key ↗
Finds Facebook and Instagram ads that sell the brand's products in each chosen country, and the shops they link to (brands whose products other shops resell); fake Facebook pages and Instagram profiles; and what ChatGPT, Gemini and Google AI Mode tell users about the brand's phone, e-mail and login. Meta's own Ad Library API only covers ads that ran in the EU/UK. · 100 free requests · then $40/month for 10k
not set
UK Companies Housescam-shop checks (UK)get a key ↗
Checks that a UK company number printed on a shop exists and is not dissolved. · free key
not set
OpenCorporatesscam-shop checksget a key ↗
Company numbers in 140+ countries — only needed for countries without a free official registry (otherwise BrandWatch searches Google for the company). · paid · optional
not set
AI · advisory only, never part of the score
OpenAIrecommendedAI second opinionSuggest with AIad relevanceget a key ↗
Writes the Google queries a phisher would target, gives the advisory second opinion on findings, and triages co-hosted pages on the infrastructure map. · paid per token
not set
No key needed · always on
✓crt.sh · CertSpotter — certificate transparency logs
✓RDAP · port-43 WHOIS — registration date, registrar, abuse contact
✓DNS — BrandWatch's own resolver walk, or public resolvers
✓Chromium (Playwright) — the sandboxed browser that visits every site
✓ip-api — where a server is (country, city, network)
✓whoisds — yesterday's newly registered domains
✓Israel Registrar of Companies (data.gov.il) — company numbers printed on Israeli shops
✓EU VIES — VAT numbers printed on EU shops
✓GLEIF — registered companies worldwide, by name (LEI holders)

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.

DNS — does a look-alike domain exist? which IP?
WHOIS — registration date, registrar, owner
Applies from the next scan. The scan trace records which method answered each look-up.

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.

A phone visit is also made from the data-centre IP (free) when "mobile" or "both" is chosen, because kits that target phones show the lure to a mobile browser whatever the address. Through the proxy it costs the same as a desktop visit, once per device and per proxy. Every visit except the crawler's is a real Chrome: its User-Agent, Accept-Language, client hints (sec-ch-ua), language and time zone agree with each other and with the proxy's country.

RESIDENTIAL PROXY

Connection details

MOBILE PROXY

Mobile proxy connection details

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.

paid calls over 24 h · 0 = no cap
paid calls only (free ones are not counted)
no track or brand visits more · Deep asks for 1500
0 = the home / mobile IP probe is off
one infrastructure map · 0 = the default $1

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.

UserRole & statusLast 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).

NamePrefixScopeExpiresLast 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.

WorkspaceUsersCreated
default12026-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.

Critical only = the fewest messages; Medium and above = everything that waits for a verdict.
log
Without PUBLIC_URL the links in a message are paths (/ui/findings/…); set it so Slack and mail make them clickable.

System

ModeDEMO (recorded scenarios, $0)
Schedulerdisabled (every 60s)
Queuethread

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.

brand related legit
15
legit
17
other brand phishing
1
phishing
16
scam shop
6
suspicious not phishing
10

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.

Classifier (advisory)

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.

  1. Validate the URL: http/https only, allowed ports, no credentials, no internal host names.
  2. 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.
  3. Connect pinned to the validated IP with the original Host header and TLS SNI (defeats DNS rebinding).
  4. Re-validate every redirect hop · at most 5 redirects.
  5. Response ≤ 5.0 MB · timeout 15.0 s.
  6. 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 →