For finance & AML teams

Financial-crime tooling today is a patchwork: a sanctions screener, a transaction-monitoring engine, a data warehouse, a case-management tool, and an entity-resolution vendor — each holding a different copy of "who is who." RelataDB collapses it into one governed fabric where identity is deterministic (not LLM-guessed), every money trail is queryable as a graph, and every fact you act on is provable to a regulator.

What you replace

Today (polyglot)With Relata
Sanctions screening vendorNative sanctions_screen + relata pull-ioc (OFAC/UN/EU/OFSI/MEA/RBI/OpenSanctions)
Transaction monitoring + alertingDetection rules over Transaction types, firing at commit time
Entity-resolution vendor (lossy, LLM)Deterministic canonicalization (76 types: IBAN, phone, crypto wallet…) — zero hallucination
Graph DB for ring/UBO detectionbeneficial_ownership_chain, crypto_trace, wire_reconstruction, hawala_trace as governed SQL operators
Case management + audit warehouseBi-temporal case rows + PROV-O provenance + tamper-evident audit chain

Identity fusion — deterministic, not LLM-guessed

A person shows up as +44 7700 900123 in a wire, 07700 900123 in a CRM, an email at onboarding, and a wallet 0xabc… on-chain. Relata canonicalizes each (E.164 uint64 for phone, checksum-verified IBAN, checksummed address) and auto-merges them into one entity — the same identity across every source. No model in the loop, no hallucination, byte-identical every run.

PURPOSE 'compliance'
-- Resolve everything known about this identity across all sources
SELECT * FROM RESOLVE_IDENTITY('+44 7700 900123', MODE => 'cluster');
 
-- Is this the same person as the wallet owner?
SELECT SAME_IDENTITY('Person:alice', 'Wallet:0xabc...') AS same;

SmartIngest runs the 76 canonical-type detectors on ingest — you don't build the matching pipeline, you configure it. See Identity.

Financial-intelligence operators

Ten governed AML/intel operators, all in SQL or via the SDK/MCP:

PURPOSE 'compliance'
-- Trace a crypto wallet through hops
SELECT * FROM CRYPTO_TRACE('0xabc...', MAX_HOPS => 5, MIN_AMOUNT => 1000);
 
-- Reconstruct a wire chain with tolerance for timing/amount gaps
SELECT * FROM WIRE_RECONSTRUCTION('ACC-12345', TOLERANCE_PCT => 5);
 
-- Beneficial ownership up to N levels deep
SELECT * FROM BENEFICIAL_OWNERSHIP('Acme Holdings', MAX_DEPTH => 6);
 
-- Hawala/informal-value-transfer pairing
SELECT * FROM HAWALA_TRACE('seed-lead', MAX_HOPS => 5);
# Python SDK — same operators
client.crypto_trace("0xabc...", purpose="compliance")
client.wire_reconstruction("ACC-12345", tolerance_pct=5.0)
client.beneficial_ownership_chain("Acme Holdings", max_depth=6)
client.hawala_trace("seed-lead", max_hops=5)

Plus sanctions_screen, convoy_detect, burner_detect, dns_tunnel_detect, crime_pattern_cluster, geofence. Typed decoders in relata.aml (decode_sanctions_hits, decode_beneficial_owners, decode_crypto_trace, decode_wire_hops, decode_hawala_pairs) give you typed result objects.

See AML — Sanctions Screening for the end-to-end worked example.

Sanctions ingest, native

relata pull-ioc   # OFAC / UN / EU / OFSI / MEA / RBI / OpenSanctions

Sanctions lists land as governed rows; sanctions_screen runs at query time against the live list. STIX/MISP/TAXII feeds land via POST /import?format=stix, relata misp-pull, relata taxii-poll.

Bi-temporal — answer the regulator's real question

The regulator doesn't ask "what do you know now?" — they ask "what did you know on the date you approved this transaction?" AS OF reconstructs the exact state of the world at any past moment, including the sanctions list version and the identity graph as it was then.

PURPOSE 'regulator-response'
-- What did we know about this entity when we filed the SAR?
SELECT * FROM Person AS OF '2026-03-15T00:00:00'
WHERE _pk = 'alice-001';
 
-- Was this wallet on any sanctions list at the time of the transfer?
SELECT * FROM SanctionsHit AS OF '2026-03-15T09:30:00'
WHERE entity_id = '0xabc...';

Every decision is reconstructable — court-grade replay via EXPLAIN_REPLAY if you need byte-identical exhibit reconstruction. See For Legal & Compliance.

Provenance — every fact is defensible

Every row carries PROV-O provenance (source connector, batch, offset, observed_at, recorded_at) and is stamped into the tamper-evident audit hash chain. When a regulator asks "where did this fact come from?", justify returns the full chain:

curl 'http://127.0.0.1:9090/memory/justify/<fact-id>' \
  -H 'Authorization: Bearer <token>'
curl 'http://127.0.0.1:9090/audit/proof' \
  -H 'Authorization: Bearer <token>'   # hash-chain validity proof

Sign a case report as a governed, timestamped PDF: POST /report/pdf.

How to start

  1. Pull sanctions listsrelata pull-ioc.
  2. Ingest customers + transactions via POST /ingest/bulk or the Mongo/pg doors (your existing app keeps writing).
  3. Configure detector packsRELATA_DETECT_PACKS=network,contact,crypto,financial,payment.
  4. Write AML detection rules as SQL WHERE over Transaction / Wire / CryptoTransfer.
  5. Investigate with the AML operators + PATHS_BETWEEN graph traversals.
  6. Respond to regulators with AS OF reconstruction + signed PDF reports.

See also