Skip to main content

Wire a brand-identity watchlist and run smishing takedown cases

This guide walks the full operator loop end to end: declare which tokens are legitimately yours, scan candidates you observe in the wild, open a takedown case for a hostile candidate, and work that case through to resolution. The reference material — detection signals, band thresholds, matching rules — lives in Brand impersonation watchlist, scan & takedown cases; this page is the task walkthrough. Every step uses cURL against the six endpoints under /api/v1/brand-identity/impersonation/*. The same surface is in the dashboard under Settings → Compliance → Brand impersonation watchlist.

1. What the impersonation monitor is

The impersonation monitor is a tenant-owned watchlist: you declare the brand names, domains, and sender IDs that are legitimately yours, and the scanner compares candidates you observe against those tokens. The watchlist persists under your organization settings (brand_impersonation_watchlist), so it is tenant-isolated and needs no schema migration — the same posture as other settings-backed compliance modules. Candidates come in three classes:
  • Lookalike domains — the host behind a smishing shortlink (acme-verify.tk, acnne.com).
  • Spoofed sender IDs — an SMS/RCS sender string that reads as your brand.
  • Display-name lookalikes — the sender name shown on WhatsApp, RCS, or a messaging platform.
The service is advisory only. It scores and prepares evidence; it never routes or sends anything, and no case status advances on its own. Filing a takedown notice with a registrar, carrier, or platform abuse desk is your action, done outside the product.

2. Create the watchlist

A PUT replaces the whole watchlist, so send all three lists every time:
cURL
Node SDK
Constraints, validated at the edge: Reads resolve to empty lists when you have never configured the watchlist; writes require an owner, admin, or developer role. Every replacement is recorded in your audit log (brand_identity.impersonation_watchlist.updated) with the entry counts, so you can trace who changed the declaration and when. Read the current watchlist back with GET on the same path.

3. Score a candidate

POST /brand-identity/impersonation/scan scores a batch of candidates against your watchlist. It is read-only: nothing persists, and repeating the same batch returns the same verdicts, so use it freely to triage before deciding whether a candidate deserves a case.
cURL
Each candidate’s verdict carries a score (0–100), a band (clean / suspicious / malicious), a recommendation (monitor / investigate / urgent_takedown), and the named findings that built the score. A sample verdict:
Batches are capped at 50 candidates, duplicates collapse by (type, value), and verdicts sort worst score first. Your own registered assets always return a clean verdict — matching your own brand is not impersonation.

4. Assemble a takedown case

When a verdict deserves action, post the candidate to cases. The endpoint re-scores it, assembles a filing-ready evidence pack, stores the case, and returns its id:
cURL
The response’s data.caseId (formatted bpcase_…) is the handle you PATCH later. The evidence pack fields: Recipient classes map from the candidate type: For a lookalike domain you may also need hosting_provider_abuse — pick the desk that owns the infrastructure the attacker is using. The pack assembles the evidence; it transmits nothing. Supply the screenshots and sample messages you collected through the candidate’s sample_text and source_url fields so they ride along into the stored pack.

5. Work the case

List cases, newest first, optionally filtered to one status:
cURL
Advance or dismiss with PATCH on the case id:
cURL
The lifecycle is a state machine; only these transitions are legal: Setting a case to its current status is an idempotent no-op, so retrying a transition is safe. The dismissal path is always available from any active state for false positives or accepted risk, and a dismissed case can be reopened to open. Every status change is written to your audit log (brand_identity.impersonation_case.status_changed).

6. Operate

Case storage is bounded: the list is pruned down to its cap as cases accumulate, dropping the oldest resolved/dismissed entries first, so active cases stay until everything closed has been trimmed. Case state — like the watchlist — lives under your organization settings (brand_impersonation_cases), tenant-isolated with no schema migration. Errors to handle: Writes (watchlist PUT, case create, case PATCH) need the owner, admin, or developer role; reads also allow viewer.

7. See also