Compliance screening
Compliance screening runs on every payment, not on a sample. Pre-execution screening blocks bad transactions before funds move. Post-execution audit records the full screening trail for the regulator.
Two-stage gate
| Stage | What runs | Latency |
|---|---|---|
| Pre-execution | Sanctions check on agent + counterparty, risk tier, drift score | < 100 ms |
| Execution | Payment runs against the configured rail | Rail-dependent |
| Post-execution | Audit log entry with full screening evidence + sealed envelope | Async |
Pre-execution is the hard gate. If it fails, the rail never sees the request.
Fail-closed
The screening engine refuses any transaction it cannot conclusively clear.
| Failure mode | Verdict |
|---|---|
| Screening service unavailable | BLOCKED |
| Evaluation timeout above 100 ms | BLOCKED |
| Ambiguous risk verdict | BLOCKED |
| Database connection lost | BLOCKED |
| All systems operational, clean check | ALLOWED |
There is no soft-fail. An outage produces silence on the wire, never silent settlement.
Sanctions coverage
Six concurrent sources. A hit on any returns sanctions_clean = false.
| Source | Cadence |
|---|---|
| OFAC SDN | 6 hours |
| UN Security Council | 6 hours |
| EU Sanctions Map | 12 hours |
| Chainalysis Sanctions API | live |
| TRM Labs API | live |
| Internal labeled-address graph | live |
The matched source is recorded in the Veris attestation and the activity log.
SDK methods
# Screen a counterparty before sendingscreen = client.compliance.screen( counterparty="0xA1b2...", chain="base-sepolia",)
print(screen.sanctions_clean) # Trueprint(screen.risk_tier) # 'Low'print(screen.matched_sources) # []
if not screen.sanctions_clean: raise RuntimeError(f"counterparty matched {screen.matched_sources}")const screen = await client.compliance.screen({ counterparty: '0xA1b2...', chain: 'base-sepolia',});
if (!screen.sanctionsClean) { throw new Error(`counterparty matched ${screen.matchedSources.join(', ')}`);}Embedded in every payment
client.payments.send() runs screening inline. The screening result is recorded on the bundle. A standalone compliance.screen() call is useful for pre-flight checks, marketplace listings, or batch counterparty validation.
Where to go next
- L3 Veris for the BLS-signed attestation behind the verdict.
- Sanctions screening compliance for the full rule table.
- Compliance API for the full endpoint reference.
- Activity log for how screening evidence is recorded.