Regulatory compliance — sanctions screening and dark fleet research
How compliance teams at banks, traders, and shipping companies use NTHMAP to support OFAC sanctions screening and dark fleet research.
Trade finance compliance has become one of the hardest jobs in commodity markets. Sanctions regimes around Russia, Iran, Venezuela, and North Korea change weekly. Physical cargoes can be routed through intermediate ports to obscure origin. Dark fleet vessels disable AIS for days at a time.
NTHMAP is not a sanctions screening tool (we don't match against OFAC SDN lists), but it is a critical source of physical-world evidence that compliance teams use alongside their screening platforms.
The core use: voyage evidence
When a bank is asked to finance a crude cargo, due diligence often requires evidence of where the crude actually came from. NTHMAP can provide:
- Vessel track history for a specific MMSI (last 24 hours, longer on Enterprise)
- Port calls inferred from vessels loitering near port infrastructure
- Load events — a vessel's draught changes between two points in time
# Get a specific vessel
nthmap vessels get 311000001
# Get its track
nthmap vessels track 311000001 --format json > track.json
If the track shows the vessel spent 12 hours stationary within 3km of Primorsk (Russian Baltic crude terminal), that's physical-world evidence of a Russian-origin loading. The bank's compliance desk combines this with commercial documentation to reach a lending decision.
Detecting AIS gaps
A common dark-fleet tactic: disable AIS when entering a restricted zone, re-enable when leaving. NTHMAP doesn't currently auto-flag these, but the track data makes them detectable:
import nthmap
from datetime import datetime
client = nthmap.Client(api_key="ntm_live_...")
track = client.vessel_track("311000001")
# Sort oldest to newest
track.sort(key=lambda p: p["captured_at"])
# Look for gaps > 6 hours between consecutive points
for i in range(1, len(track)):
t1 = datetime.fromisoformat(track[i-1]["captured_at"])
t2 = datetime.fromisoformat(track[i]["captured_at"])
gap = (t2 - t1).total_seconds() / 3600
if gap > 6:
print(f"GAP: {gap:.1f} hours between {t1} and {t2}")
print(f" from {track[i-1]['lat']},{track[i-1]['lng']}")
print(f" to {track[i]['lat']},{track[i]['lng']}")
A vessel that goes dark for 18 hours and re-emerges 200 miles away in a different navigation status is exhibiting dark-fleet behavior. Whether it's actually evading sanctions is a separate legal question — but the physical pattern is objectively visible.
Flag-of-convenience clustering
Vessels carrying sanctioned crude often operate under permissive flags. A quick aggregation:
nthmap vessels list --types "Crude Tanker" --min-load 80 --format json | \
jq -r '[.[] | .flag] | group_by(.) | map({flag: .[0], count: length}) | sort_by(-.count)'
[
{"flag": "LR", "count": 42},
{"flag": "MH", "count": 38},
{"flag": "PA", "count": 31},
{"flag": "HK", "count": 24},
{"flag": "KM", "count": 19}
]
A surge in vessels flagged to Comoros (KM) or Gabon (GA) around a sanctioned port is a compliance red flag that's visible 2-3 weeks before it shows up in official reports.
STS (ship-to-ship) transfer detection
Another dark-fleet technique: transfer crude from a sanctioned vessel to a "clean" one mid-ocean. The signal: two vessels stationary, adjacent, for 12+ hours, with observable draught changes.
vessels = client.vessels(bbox=[20, 20, 40, 30]) # Eastern Mediterranean common STS zone
stationary = [v for v in vessels if (v["speed_knots"] or 0) < 0.5]
# Look for pairs within 1 nm
pairs = []
for i, a in enumerate(stationary):
for b in stationary[i+1:]:
# Rough distance
dx = (a["lng"] - b["lng"]) * 60 * 0.88
dy = (a["lat"] - b["lat"]) * 60
dist_nm = (dx**2 + dy**2) ** 0.5
if dist_nm < 1:
pairs.append((a, b, dist_nm))
for a, b, d in pairs:
print(f"STS candidate: {a['name']} ({a['flag']}) + {b['name']} ({b['flag']}) — {d:.2f} nm apart")
Not every stationary pair is an STS transfer (could be port congestion, bunkering, crew swap), but compliance teams use this as the filter stage before manual review.
Integration with screening platforms
NTHMAP data can feed into your existing compliance stack:
- Refinitiv World-Check / Dow Jones Risk Center — cross-reference MMSI with sanctioned entity list
- LexisNexis Bridger — voyage evidence attached to transaction records
- Accuity Firco — similar
- In-house screening engines — NTHMAP as physical-evidence layer
The typical pipeline: screening platform flags a potential match → compliance analyst pulls vessel history from NTHMAP → combined evidence package → lending decision.
What NTHMAP does NOT do
Be clear:
- No OFAC / EU / UK SDN list matching — that's your screening vendor's job
- No automated compliance decisions — NTHMAP provides data, not judgment
- No legal opinions — consult your compliance counsel
- No assertion that a vessel is "sanctioned" — we report positions and behavior, period
We supply the physical-world evidence. You supply the legal framework and the decision.
Enterprise features for compliance
Phase 3 adds several compliance-focused features currently available to enterprise customers:
- Longer track history — 90 days of positions per vessel
- Port call inference — automatic detection of in/out events
- STS transfer alerting — pre-computed pair detection
- SAR-based dark detection — fill in AIS gaps with satellite imagery
Email compliance@nthmap.com to discuss.