Moov Watchman
Watchman is an open-source sanctions screening engine. One Docker command downloads OFAC (and EU, UK, UN, and others), keeps them in memory, and scores each customer or counterparty. You get a ranked hit and a score from 0 to 1 — Apache 2.0, in your network, with a scorer you can read. HTTP API, Go library, browser UI, optional MCP.
Start here: Using Watchman · Docker · For compliance and risk
Why teams pick it
- Named lists — OFAC SDN and Non-SDN, US Consolidated Screening List, FinCEN 311, EU, UK, UN, plus your own CSV files.
- Structured search — person, business, organization, vessel, or aircraft, with name, aliases, IDs, dates, addresses, and contact.
- How IDs work — a matching passport, IMO number, or crypto address (with country, when it applies) scores 1.0. A matching tax number or email raises the score; it does not declare a match by itself. Two national IDs that disagree lower the score.
- A cutoff you choose —
minMatchis the minimum score to return. 0.80 is a typical screening line; about 0.59 returns more possible hits. - Explainable hits —
debug=trueordebug=0.80shows which fields drove the score. - Built for onboarding and refresh — lists are partitioned by source and type; name and ID indexes pick candidates before scoring.
- Apache 2.0 — read the scorer, pin a release tag, run it in your network.
Included lists
Use INCLUDED_LISTS or the config file to choose what loads. Empty means the built-in downloadable lists.
| Source | List |
|---|---|
| OpenSanctions | Senzing-formatted datasets |
| European Union | Consolidated financial sanctions |
| US Government | Consolidated Screening List, FinCEN 311 |
| US Treasury | OFAC SDN and Non-SDN |
| United Kingdom | UK sanctions list |
| United Nations | UN consolidated list |
Start here
docker run -p 8084:8084 -e INCLUDED_LISTS=us_ofac moov/watchman
In another terminal, wait until OFAC is indexed, then screen at a production cutoff (minMatch=0.80). OFAC SDN 48603, Russian passport → 1.0:
until curl -sf http://localhost:8084/v2/listinfo | jq -e '.lists.us_ofac > 0' >/dev/null; do sleep 2; done
curl -s "http://localhost:8084/v2/search?type=person&name=Dmitry+Khoroshev&gov_passport=RU:2018278055&minMatch=0.80&limit=1" \
| jq '{name: .entities[0].name, match: .entities[0].match, sourceID: .entities[0].sourceID}'
# {"name":"Dmitry Yuryevich KHOROSHEV","match":1,"sourceID":"48603"}
The same name without an ID returns no rows at 0.80. Send the passport, date of birth, or IMO you already have. UI at http://localhost:8084. Full recipe: Using Watchman. API: Search. Knobs: Configuration.
About Moov
Moov builds open-source libraries for a single financial-services job each — ACH, wire, Watchman, and related formats — around correctness, performance, and code you can read.