Moov Watchman

Moov Watchman Logo

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 — minMatch is the minimum score to return. 0.80 is a typical screening line; about 0.59 returns more possible hits.
  • Explainable hits — debug=true or debug=0.80 shows 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.