Quick Start with Docker
Images: moov/watchman on Docker Hub, quay.io/moov/watchman for OpenShift. moov/watchman:v2-static ships frozen 2019 files for fast local tests.
Business API on :8084. Admin/metrics on :9094. Do not expose Watchman on the public internet. See Network access.
docker run -p 8084:8084 -e INCLUDED_LISTS=us_ofac moov/watchman
WASM UI: http://localhost:8084. In another terminal, wait until OFAC is indexed, then screen at a production cutoff:
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"}
That is OFAC SDN 48603. The passport is an identity key, so the score is 1.0 at minMatch=0.80. Full recipe: Using Watchman. Env vars: Configuration.
For an optional deepparse sidecar used in tests and examples:
make setup-deepparse
The same name without an ID is below the screening line. Date of birth clears it; the passport is 1.0:
# Name only — empty at minMatch=0.80
curl -s "http://localhost:8084/v2/search?type=person&name=Dmitry+Khoroshev&minMatch=0.80&limit=1" | jq .entities
# []
# Name + date of birth
curl -s "http://localhost:8084/v2/search?type=person&name=Dmitry+Khoroshev&birthDate=1993-04-17&minMatch=0.80&limit=1" \
| jq '{name: .entities[0].name, match: (.entities[0].match*1000|round/1000)}'
# {"name":"Dmitry Yuryevich KHOROSHEV","match":0.867}
Each result is the list record with match on the same object.