Skip to content
Oris Docs

Compliance screening

LIVE

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

StageWhat runsLatency
Pre-executionSanctions check on agent + counterparty, risk tier, drift score< 100 ms
ExecutionPayment runs against the configured railRail-dependent
Post-executionAudit log entry with full screening evidence + sealed envelopeAsync

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 modeVerdict
Screening service unavailableBLOCKED
Evaluation timeout above 100 msBLOCKED
Ambiguous risk verdictBLOCKED
Database connection lostBLOCKED
All systems operational, clean checkALLOWED

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.

SourceCadence
OFAC SDN6 hours
UN Security Council6 hours
EU Sanctions Map12 hours
Chainalysis Sanctions APIlive
TRM Labs APIlive
Internal labeled-address graphlive

The matched source is recorded in the Veris attestation and the activity log.

SDK methods

# Screen a counterparty before sending
screen = client.compliance.screen(
counterparty="0xA1b2...",
chain="base-sepolia",
)
print(screen.sanctions_clean) # True
print(screen.risk_tier) # 'Low'
print(screen.matched_sources) # []
if not screen.sanctions_clean:
raise RuntimeError(f"counterparty matched {screen.matched_sources}")

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