Premium · One UAE bank, 10,000 customers, eighteen months

AML Transaction Monitoring

A UAE bank's whole trail from KYC to STR, with the laundering nobody caught

11,621,027 rows in 16 linked tables: 10,000 customers, 7,116,298 transactions, 6,947 alerts, 708 cases and 216 suspicious transaction reports over eighteen months (2025-05-01 to 2026-10-30), with 11 laundering and 5 fraud typologies planted and labelled.

Why it exists

Public AML datasets give you a transaction table and a label. A bank has much more: who the customer is, what the rules flagged, which alerts an investigator dismissed, which became a suspicious transaction report (STR) and when, and the crime nobody ever found. This dataset has all of it, with two labels on every transaction: what actually happened, and what the bank's records show.

Uses

What it is built for

  • Transaction monitoring and model benchmarks

    score a detector against the truth, not against the bank's partial labels. 43.0% of truly suspicious transactions were never labelled by the bank, so a model trained on the observed labels can be tested on what it would really miss.

  • Alert triage and false positives

    6,947 rule alerts, 91.6% of them false positives, the share banks report. Build a triage model, tune rule thresholds, or measure each rule's productivity.

  • Case management and STR workflow

    every alert worked by a first-line analyst (11.0% escalated, the rest closed as false positives, some real laundering among them), cases opened from the escalations with investigators, outcomes and filing dates, STRs filed without delay (a median 5 days after an analyst escalated the alert), and the goAML XML report for each one, the format the UAE FIU takes.

  • Targeted financial sanctions

    a few customers are listed while they bank here; each is frozen within a day of the listing, the debits they try afterwards are blocked and their accounts read frozen, beside a screening test set of confirmed matches and namesakes.

  • Drift and robustness

    crypto_offramp from 2026-02 and app_scam from 2026-04 are schemes the bank has never seen before they start. Train on the early months and watch a model meet them.

  • Graph and network detection

    rings with roles (principal, mule, pass-through), mule herds whose members bank here and pass money on to their collector, layering chains through other customers' accounts, and a counterparty network.

  • KYC, beneficial ownership and screening

    risk ratings with their reasons, owners behind business customers, PEPs, and planted watchlist near-matches with the decision a screener should reach.

  • A bank that lives in the UAE

    salaries paid through the Wage Protection System at the month's turn, with overtime for hourly trades; firms' payroll files, VAT for those past the registration threshold, corporate tax from 2024; expatriates sending home a part of pay that falls as pay rises; rent by post-dated cheques; homes, offices and labour accommodation by emirate and district; the Saturday-Sunday week for banks and firms while people shop through weekends and Eid; Ramadan's late nights and the run-up to Eid.

  • Teaching and demos

    a complete AML data model for a course, a dashboard, or a RegTech or case-management demo.

Compared

Against the public datasets

What each of the best-known public datasets in this field ships with, from its own paper or page.

This datasetIBM AMLworldSAML-DPaySimSynthAML
Customer and KYC tableyesnononono
Rule alerts with outcomesyes, 92% false positivesnonoone threshold flagyes, 17% reported (its authors call that high)
Investigator cases and STR filingsyes, plus goAML reportsnononoalert outcome only
Truth and observed label, separatelyyesnononono
Typologies168 patterns28 (11 normal)fraud onlynot labelled
Drift with a known start dateyesnononodates to the quarter
Beneficial owners, sanctions screeningyesnononono
Shortcut audit publishedyesnonobalances leak the labelno

Answer key

The truth, in its own columns

What a model, a control chart or an analyst is trying to find ships next to the data, so you can score an answer instead of guessing at it. Each line is measured from the full files.

  • transactions.is_suspiciousThe truth: the transaction is part of a laundering or fraud scheme, whether or not anyone found it.true on 0.1% of rows
  • transactions.typologyWhich of the sixteen schemes it belongs to.16 values: cash_commingling, mule_funnel, synthetic_identity…, 99.9% empty
  • transactions.ring_idThe scheme instance, joining to rings and ring_members for every account it touched.211 values: R00001, R00009, R00004…, 99.9% empty
  • transactions.label_observedWhat the bank's records show: the typology an investigation confirmed, empty where nothing was found.16 values: cash_commingling, mule_funnel, funnel_account…, 99.9% empty
  • transactions.labelled_atWhen the bank learned it, weeks or months after the activity; empty if it had not by the end of the data.2025-07-05 00:44:28 to 2026-10-30 19:17:20, 99.9% empty
  • transactions.lookalike_ofHonest activity that resembles a scheme: the false positives a good model must leave alone.15 values: mule_funnel, cash_commingling, funnel_account…, 100% empty
  • customers.is_suspiciousThe customers who are laundering principals, exactly the share the recipe asked for.true on 1.4% of rows
  • alerts.is_true_positiveWhether the rule alert pointed at real crime.true on 8.4% of rows
  • alerts.typologyThe scheme a true alert pointed at; empty on false positives, so it is truth, not a feature.16 values: layering, structuring, trade_based…, 91.6% empty
  • screening_expected.expected_decisionThe decision a sanctions screener should reach on each planted near-match.2 values: false_positive, true_match

How it behaves

Measured on the files you download

Each of these is computed from the delivered rows when the dataset is packaged, not written as a target.

  • 91.6% of alerts are false positives (banks report 90-98%; SynthAML, built from a real bank, reports 95-98%).
  • 3.1% of alerts end in an STR (typical programmes 1-5%).
  • 0.103% of transactions are truly suspicious (public synthetic sets sit at 0.10-0.2%).
  • STRs are filed a median 5 days after an analyst escalated the alert, never more than 10: the UAE requires reporting without delay. Counted from the rule's alert, its wait in the first-line queue included, the median is 13 days.
  • The bank's records label 57.0% of truly suspicious transactions; the rest were never found.
  • 53.3% of structuring cash deposits sit within 20% under the AED 55,000 line and none above it, against 0.03% of honest cash deposits.
  • Mule accounts pass money on fast: 28.5% of value leaves within 15 minutes of the last deposit, 43.9% within an hour, 74.0% within a day.
  • Honest amounts follow Benford's first-digit law (MAD 0.0043); suspicious ones conform less (MAD 0.0139).
  • Shortcut audit: no column on its own finds the crime. The strongest, amount, reaches an average precision of 0.019 against a base rate of 0.0010.

Audit

111 of 111 checks pass

Re-run on the delivered files by an independent script with plain pandas. The results ship in INTEGRITY.json.

  • every key resolves and every primary key is unique; a transaction's customer owns its account; nothing happens before the account opens or the customer is onboarded; a case opens on or after its first alert and files its STR after it opens;
  • every goAML report parses and belongs to a case with an STR;
  • every customer was an adult when onboarded; dormant accounts have been quiet for a year; closed accounts stop;
  • no value of any column, nor its being empty, marks crime on its own: declined payments, new devices and transfers between customers are overwhelmingly honest, as in a real bank;
  • honest look-alike customers never carry a truly suspicious transaction;
  • each scheme that starts part-way through starts when the recipe says;
  • no column on its own gives the label away (the shortcut audit below).
All 111 checks
  • ✓ accounts.account_id unique
  • ✓ alerts.alert_id unique
  • ✓ beneficial_owners.owner_id unique
  • ✓ cases.case_id unique
  • ✓ counterparties.counterparty_id unique
  • ✓ customers.customer_id unique
  • ✓ logins.login_id unique
  • ✓ lookalikes.lookalike_id unique
  • ✓ payees.payee_id unique
  • ✓ ring_members.member_id unique
  • ✓ rings.ring_id unique
  • ✓ screening_expected.pair_id unique
  • ✓ str_reports.report_id unique
  • ✓ transactions.transaction_id unique
  • ✓ watchlist.entry_id unique
  • ✓ watchlist_aliases.alias_id unique
  • ✓ accounts.customer_id -> customers.customer_id: 0 orphans of 17,282
  • ✓ transactions.account_id -> accounts.account_id: 0 orphans of 7,116,298
  • ✓ transactions.customer_id -> customers.customer_id: 0 orphans of 7,116,298
  • ✓ alerts.customer_id -> customers.customer_id: 0 orphans of 6,947
  • ✓ alerts.account_id -> accounts.account_id: 0 orphans of 6,947
  • ✓ cases.customer_id -> customers.customer_id: 0 orphans of 708
  • ✓ cases.first_alert_id -> alerts.alert_id: 0 orphans of 708
  • ✓ ring_members.ring_id -> rings.ring_id: 0 orphans of 384
  • ✓ ring_members.customer_id -> customers.customer_id: 0 orphans of 384
  • ✓ ring_members.account_id -> accounts.account_id: 0 orphans of 384
  • ✓ lookalikes.customer_id -> customers.customer_id: 0 orphans of 100
  • ✓ beneficial_owners.customer_id -> customers.customer_id: 0 orphans of 4,933
  • ✓ screening_expected.customer_id -> customers.customer_id: 0 orphans of 63
  • ✓ str_reports.case_id -> cases.case_id: 0 orphans of 216
  • ✓ transactions.ring_id -> rings
  • ✓ a transaction's customer owns its account
  • ✓ no transaction before its account opened: 0 early
  • ✓ no account opened before its customer was onboarded
  • ✓ a case opens on or after its first alert
  • ✓ a case closes on or after it opened
  • ✓ every SAR is filed after its case opened
  • ✓ every SAR is filed on a closed case or one still open
  • ✓ no label known before its transaction
  • ✓ a sanctioned customer is frozen within a day of the listing: 3 frozen
  • ✓ only a frozen customer's debits after the freeze are blocked, and all of those are: 17 blocked
  • ✓ the accounts of a frozen customer, and only those, read frozen
  • ✓ an alert is reviewed after it was raised
  • ✓ every reviewed alert names its analyst; a pending one has neither
  • ✓ queued alerts are reviewed on working days in office hours: 0 outside
  • ✓ cases open only from escalated alerts
  • ✓ a case opens after its first alert was escalated
  • ✓ every STR is filed on a banking day in office hours: 0 outside
  • ✓ an STR is filed at least an hour after its case opened
  • ✓ no customer is reported twice within 90 days (continuing activity is covered by the earlier report): 12 repeat reports
  • ✓ a reported customer is rated high now
  • ✓ every freeze is reported (Fund Freeze Report) within two business days: 3 reports, slowest 0 business days
  • ✓ a closing day is on closed accounts only (or frozen ones closed before)
  • ✓ nothing posts to an account after it closed: 0 after
  • ✓ every Emirates ID has the card's layout and a check digit that cannot verify (never a real number): 7,170 ids
  • ✓ no firm has an Emirates ID, a sex, a birth date or a visa
  • ✓ every firm has a trade licence and its licensing authority, and only firms
  • ✓ no payment reaches a country the FATF calls for countermeasures against (Iran, North Korea)
  • ✓ a foreign-currency account's transactions are in its currency, and only those: 221,596 in EUR, GBP, USD
  • ✓ an alert's trigger transaction is its customer's: 6,947 of 6,947 alerts linked
  • ✓ an app or web payment follows a login by the same customer: 100.0%
  • ✓ a payee is registered before it is first paid: 368,068 payees
  • ✓ a takeover's payee is added from the new device minutes after it logged in: 28 payees
  • ✓ every goAML report parses as XML: 216 files
  • ✓ every goAML report is for a case with a SAR
  • ✓ taking part in crime is independent of nationality: p = 0.183; AE 4.1%, BD 5.5%, CN 3.9%, EG 3.2%, IN 3.6%, LK 5.0%, PH 3.3%, PK 5.4%, other 3.7%
  • ✓ taking part in crime is independent of sex: p = 0.419; Female 3.8%, Male 4.2%
  • ✓ honest residents who are not citizens are alerted alike whatever their nationality: p = 0.086; BD 20.3%, CN 18.8%, EG 17.7%, IN 17.5%, LK 22.6%, PH 19.5%, PK 22.0%, other 20.4%
  • ✓ honest customers alerted, citizens against everyone else: 22.0% against 19.4% (behaviour differs only where published figures say it does: income, and money sent home)
  • ✓ alerts that are false positives (published 90-98%: SynthAML/Spar Nord, AMLGentex): 91.6%
  • ✓ reviewed alerts escalated to a case (published 10-20%): 11.0%
  • ✓ launderers the bank reported (customer-level recall): 55.9%
  • ✓ alerts that become a SAR (published 1-15%, typical 1-5%): 3.1%
  • ✓ truly suspicious share of transactions (public sets 0.10-0.2%): 0.103%
  • ✓ STR filed within 10 days of detection, the analyst's escalation (UAE: report without delay): median 5, max 10 days
  • ✓ days from the first alert's raising to the SAR, its time in the queue included: median 13, 90th pct 22, max 28
  • ✓ alerts per alerted customer (skewed in SynthAML): median 2, max 20, top 10% of customers hold 40.2%
  • ✓ truly suspicious transactions the bank's records label: 57.0% (the rest were never found)
  • ✓ honest transactions labelled suspicious anyway: 366, 5.0% of the truly suspicious count
  • ✓ days from a suspicious transaction to its label: median 84, max 459
  • ✓ structuring piles up just under the AED 55,000 line; honest cash does not: 53.3% of structuring cash deposits within 20% under it vs 0.03% of honest ones
  • ✓ structuring never crosses the line it is avoiding
  • ✓ mule value leaving after the last deposit (Lloyds: 28% / 53% / 85%+): 28.5% within 15 min, 43.9% within 1 h, 74.0% within 24 h
  • ✓ honest amounts follow Benford's first digit (Nigrini MAD < 0.012): MAD 0.0043
  • ✓ suspicious amounts against Benford (they conform less in real data, Monese study): MAD 0.0139
  • ✓ customers per counterparty (heavy-tailed; Fedwire gamma about 2.1): median 5, max 7616, tail exponent 2.09 above 5
  • ✓ weekend share by channel: atm 21.0%, branch 0.0%, card 19.6%, card_not_present 28.4%, cheque 0.0%, mobile 10.0%, online 6.4%, wire 1.2%
  • ✓ people's card purchases per day by weekday, Mon to Sun (1.00 is the average day): 1.00 1.01 1.01 1.00 0.99 1.00 1.00
  • ✓ people's card purchases on Eid days against an ordinary day: 0.98x over 9 days
  • ✓ people's card purchases after 8pm, in Ramadan / the rest of the year: 35.6% / 26.4%
  • ✓ ATM withdrawals: median 200 AED, 97.0% in whole hundreds
  • ✓ no card draws more than AED 10,000 from ATMs in a day (the usual UAE daily limit): largest day 10,000
  • ✓ share of pay wired abroad, median by pay quarter (lowest to highest): 30.2% 24.5% 15.8% 4.2%
  • ✓ hours from alert to analyst review: median 177, 90th pct 364, max 563
  • ✓ channel mix by count / by value: mobile 30.0%/19.8%, online 26.6%/35.9%, card 17.4%/0.9%, wire 12.1%/40.0%, atm 6.0%/1.6%, card_not_present 5.6%/0.3%, branch 2.2%/0.8%, cheque 0.2%/0.8%
  • ✓ drift: crypto_offramp first appears from 2026-02: first seen 2026-04-13
  • ✓ drift: app_scam first appears from 2026-04: first seen 2026-04-16
  • ✓ typologies present: 16: account_takeover, app_scam, bust_out, card_testing, cash_commingling, crypto_offramp, cuckoo_smurfing, dormant_reactivation, funnel_account, layering, mule_funnel, pep_flows, round_tripping, structuring, synthetic_identity, trade_based
  • ✓ customers by segment: retail 7,390, small_business 1,709, corporate 702, private_banking 199
  • ✓ politically exposed persons: 122 (1.22%)
  • ✓ honest look-alikes are never on a truly suspicious transaction: 100 look-alikes
  • ✓ planted sanctions-screening pairs: false_positive 60, true_match 3
  • ✓ every customer was an adult when onboarded: youngest 18.0 years
  • ✓ dormant accounts have had no activity for a year: 0 of 1192 active within the year
  • ✓ closed accounts stop before the data ends: 100.0% stopped
  • ✓ no pile-up of labels at a midnight: 0 labels at exactly 00:00:00
  • ✓ a new device is not a sign of takeover on its own: 51,429 new-device logins, 0.0% of them takeovers
  • ✓ declined payments are mostly honest: 18,712 declined, 0.6% suspicious
  • ✓ a transfer to another customer's account is mostly honest: 94,021 on-us transfers, 0.19% suspicious
  • ✓ honest foreign corridors: India 25.5%, Pakistan 13.3%, Bangladesh 7.5%, Philippines 6.6%, Egypt 5.1%, Hong Kong 4.2%, Saudi Arabia 2.6%, Spain 2.2%
  • ✓ most transactions at one second: 135 at 2026-10-29 08:47:43 (salary_credit)
  • ✓ transactions.amount alone does not give the label away: average precision 0.019 (base rate 0.0010), AUC 0.867
  • ✓ transactions.amount_base alone does not give the label away: average precision 0.019 (base rate 0.0010), AUC 0.867
  • ✓ transactions.amount_own alone does not give the label away: average precision 0.018 (base rate 0.0010), AUC 0.864
  • ✓ transactions.txn_type alone does not give the label away: average precision 0.007 (base rate 0.0010), AUC 0.879
  • ✓ transactions.location alone does not give the label away: average precision 0.006 (base rate 0.0010), AUC 0.738
  • ✓ transactions.channel alone does not give the label away: average precision 0.005 (base rate 0.0010), AUC 0.806
  • ✓ transactions.is_cash alone does not give the label away: average precision 0.004 (base rate 0.0010), AUC 0.733
  • ✓ transactions.counterparty_country alone does not give the label away: average precision 0.002 (base rate 0.0010), AUC 0.660
  • ✓ transactions.direction alone does not give the label away: average precision 0.002 (base rate 0.0010), AUC 0.678
  • ✓ transactions.currency alone does not give the label away: average precision 0.001 (base rate 0.0010), AUC 0.521
  • ✓ transactions.status alone does not give the label away: average precision 0.001 (base rate 0.0010), AUC 0.507
  • ✓ transactions.beneficiary_account_id alone does not give the label away: average precision 0.001 (base rate 0.0010), AUC 0.506
  • ✓ transactions.txn_at alone does not give the label away: average precision 0.001 (base rate 0.0010), AUC 0.507
  • ✓ transactions.txn_type: no value is mostly crime: worst cash_deposit at 1.05% of 303,859
  • ✓ transactions.direction: no value is mostly crime: worst credit at 0.20% of 2,791,811
  • ✓ transactions.channel: no value is mostly crime: worst branch at 0.93% of 156,137
  • ✓ transactions.currency: no value is mostly crime: worst USD at 0.28% of 124,717
  • ✓ transactions.amount_base: no value is mostly crime: worst <set> at 0.10% of 7,116,298
  • ✓ transactions.counterparty_country: no value is mostly crime: worst Russia at 3.70% of 594
  • ✓ transactions.is_cash: no value is mostly crime: worst True at 0.69% of 583,733
  • ✓ transactions.location: no value is mostly crime: worst Abu Dhabi at 0.98% of 99,328
  • ✓ transactions.status: no value is mostly crime: worst declined at 0.63% of 18,712
  • ✓ transactions.beneficiary_account_id: no value is mostly crime: worst <set> at 0.19% of 94,021
  • ✓ transactions.amount_own: no value is mostly crime: worst <set> at 0.10% of 7,116,298

Tables

16 tables, 11,621,027 rows

Every table in the zip with what it holds, its rows and its columns. The bars are on a log scale, so the small reference tables still show.

  • transactionsEvery movement: channel, type, direction, amount, cash flag, counterparty country, status (approved, declined, or blocked under a sanctions freeze); the truth (is_suspicious, typology, ring_id), what the bank's records show (label_observed, labelled_at), and lookalike_of for honest activity that resembles a scheme7,116,298 rows · 22 cols
  • loginsOnline and mobile banking logins with device ids, one opening each session a payment is made in and others that only look: customers change phones and browsers, and a takeover arrives on a new device among many honest ones4,069,456 rows · 8 cols
  • payeesEach payee a customer registered before first paying them, when and through which channel; a takeover's payee is added from the new device minutes after it logged in368,068 rows · 9 cols
  • counterpartiesThe people, firms, banks and exchange houses on the other side of payments, each named as its own country names it, with country25,000 rows · 5 cols
  • accountsCurrent, savings, business and foreign-currency accounts with UAE-format IBANs (valid check digits, never live) and BIC; status active, dormant, closed (with the day it closed) or frozen17,282 rows · 10 cols
  • customersRetail, small-business, corporate and private-banking customers: KYC risk rating at onboarding and its reason, the rating as it stands now (raised after a report), PEP flag and PEP ownership, nationality, residency and visa, Emirates ID, occupation, income, the monthly volume they declared at onboarding, onboarding channel; for a firm its trade licence and licensing authority, office or yard and company email; and the truth (is_suspicious)10,000 rows · 34 cols
  • alertsWhat the monitoring rules raised: rule, score, the transaction it fired on, the first-line review (analyst, when the queue reached it, escalated or closed as a false positive), and the truth (is_true_positive, typology)6,947 rows · 12 cols
  • beneficial_ownersThe people who own or control each business customer, with their share4,933 rows · 9 cols
  • watchlist_aliasesSpelling variants, transliterations and aliases of watchlist names861 rows · 5 cols
  • casesInvestigations opened from escalated alerts: opened, closed, investigator, alerts taken in, outcome (closed, escalated, STR filed, or covered by a report filed in the last 90 days), filing date and confirmed typology708 rows · 11 cols
  • watchlistA sanctions-style watchlist of invented names500 rows · 10 cols
  • ring_membersWho was in each scheme and their role: principal, mule, pass-through, victim, unwitting beneficiary384 rows · 5 cols
  • str_reportsOne goAML suspicious transaction report per filing, the XML file next to it in goaml/: reporting officer, the customer as goAML holds them (Emirates ID or trade licence), the grounds written out, and the transactions reported216 rows · 6 cols
  • ringsEvery scheme planted: typology, kind, start, end, accounts, transactions, amount, parameters211 rows · 11 cols
  • lookalikesHonest customers whose behaviour resembles a typology, and what it resembles100 rows · 4 cols
  • screening_expectedPlanted pairs between customers and the watchlist, with the decision a screener should reach and, for a confirmed match, when the customer was frozen and when the freeze was reported (a Fund Freeze Report within two business days)63 rows · 11 cols

Explore

Every table, profiled

Each column's type, spread, empties and most common values, measured from the full CSVs. Switch to the first rows to see the data as it sits in the file.

transactions.csv

7,116,298 rows · 22 columns · 5 foreign keys

transaction_idprimary key
unique on every row
7.12M distinctno empties
account_idforeign key
points to accounts.account_id
16,278 distinctno empties
customer_idforeign key
points to customers.customer_id
9,708 distinctno empties
counterparty_idforeign key
points to counterparties.counterparty_id
23,890 distinct34% empty
txn_atdate
May 2025Oct 2026
2025-05-01 to 2026-10-30no empties
txn_typecategory
  • card_purchase
    17%
  • transfer_in
    14%
  • supplier_payment
    14%
  • transfer_out
    13%
  • customer_receipt
    8.9%
  • 11 more values · 32%
16 valuesno empties
directioncategory
  • debit
    61%
  • credit
    39%
2 valuesno empties
channelcategory
  • mobile
    30%
  • online
    27%
  • card
    17%
  • wire
    12%
  • atm
    6.0%
  • 3 more values · 7.9%
8 valuesno empties
amountnumber
3.86log scale58,470
mean 3,091.7median 501.80.11 to 21.3Mno empties
currencycategory
  • AED
    97%
  • USD
    1.8%
  • EUR
    0.8%
  • GBP
    0.5%
4 valuesno empties
amount_basenumber
4.34log scale59,000
mean 3,149.7median 531.30.5 to 21.3Mno empties
counterparty_countrycategory
  • United Arab Emirates
    97%
  • India
    0.8%
  • Pakistan
    0.4%
  • Bangladesh
    0.2%
  • Philippines
    0.2%
  • 31 more values · 1.5%
36 values34% empty
is_cashyes / no
true · 8.2%false · 92%
no empties
is_suspiciousyes / no
true · 0.1%false · 100%
no empties
typologycategory
  • cash_commingling
    38%
  • mule_funnel
    20%
  • synthetic_identity
    9.0%
  • funnel_account
    7.4%
  • bust_out
    5.3%
  • 11 more values · 20%
16 values100% empty
ring_idforeign key
points to rings.ring_id
211 distinct100% empty
locationcategory
  • Dubai
    38%
  • Abu Dhabi
    17%
  • Sharjah
    16%
  • Ajman
    9.7%
  • Al Ain
    9.3%
  • 3 more values · 9.6%
8 values92% empty
statuscategory
  • approved
    100%
  • declined
    0.3%
  • blocked
    <0.1%
3 valuesno empties
beneficiary_account_idforeign key
points to accounts.account_id
14,343 distinct99% empty
lookalike_ofcategory
  • mule_funnel
    21%
  • cash_commingling
    11%
  • funnel_account
    11%
  • structuring
    9.8%
  • dormant_reactivation
    8.5%
  • 10 more values · 39%
15 values100% empty
label_observedcategory
  • cash_commingling
    49%
  • mule_funnel
    13%
  • funnel_account
    9.8%
  • bust_out
    5.9%
  • dormant_reactivation
    5.4%
  • 11 more values · 17%
16 values100% empty
labelled_atdate
Jul 2025Oct 2026
2025-07-05 to 2026-10-30100% empty

Keys

Every join resolves

28 foreign keys, 23,888,869 references checked against the table each one points at. None points at a row that does not exist.

accounts

  • customer_idcustomers.customer_id0 orphans

alerts

  • customer_idcustomers.customer_id0 orphans
  • account_idaccounts.account_id0 orphans
  • trigger_transaction_idtransactions.transaction_id0 orphans

beneficial_owners

  • customer_idcustomers.customer_id0 orphans

cases

  • customer_idcustomers.customer_id0 orphans
  • first_alert_idalerts.alert_id0 orphans

logins

  • customer_idcustomers.customer_id0 orphans
  • ring_idrings.ring_id0 orphans

lookalikes

  • customer_idcustomers.customer_id0 orphans

payees

  • customer_idcustomers.customer_id0 orphans
  • counterparty_idcounterparties.counterparty_id0 orphans
  • beneficiary_account_idaccounts.account_id0 orphans
  • ring_idrings.ring_id0 orphans

ring_members

  • ring_idrings.ring_id0 orphans
  • customer_idcustomers.customer_id0 orphans
  • account_idaccounts.account_id0 orphans

rings

  • primary_customer_idcustomers.customer_id0 orphans

screening_expected

  • customer_idcustomers.customer_id0 orphans
  • entry_idwatchlist.entry_id0 orphans

str_reports

  • case_idcases.case_id0 orphans
  • customer_idcustomers.customer_id0 orphans

transactions

  • account_idaccounts.account_id0 orphans
  • customer_idcustomers.customer_id0 orphans
  • counterparty_idcounterparties.counterparty_id0 orphans
  • ring_idrings.ring_id0 orphans
  • beneficiary_account_idaccounts.account_id0 orphans

watchlist_aliases

  • entry_idwatchlist.entry_id0 orphans

In the zip

What you get

  • CSVs: one file per table, with a header row and ISO dates.
  • README.md: what each table holds, how the data behaves (measured), what was checked and what to know.
  • INTEGRITY.json: the 111 audit checks and their results.
  • RECIPE.json: the Misata blueprint that made these exact rows, seed 20261029.
All 235 files
  • customers.csv3.6 MB
  • beneficial_owners.csv363 KB
  • accounts.csv1.5 MB
  • counterparties.csv1.6 MB
  • transactions.csv918.7 MB
  • logins.csv238.5 MB
  • payees.csv17.7 MB
  • alerts.csv875 KB
  • cases.csv70 KB
  • str_reports.csv12 KB
  • rings.csv24 KB
  • ring_members.csv12 KB
  • lookalikes.csv7 KB
  • watchlist.csv85 KB
  • watchlist_aliases.csv42 KB
  • screening_expected.csv10 KB
  • goaml/STR-case-1.xml3 KB
  • goaml/STR-case-10.xml12 KB
  • goaml/STR-case-102.xml30 KB
  • goaml/STR-case-107.xml5 KB
  • goaml/STR-case-11.xml15 KB
  • goaml/STR-case-110.xml33 KB
  • goaml/STR-case-116.xml4 KB
  • goaml/STR-case-120.xml5 KB
  • goaml/STR-case-124.xml6 KB
  • goaml/STR-case-126.xml5 KB
  • goaml/STR-case-128.xml3 KB
  • goaml/STR-case-129.xml33 KB
  • goaml/STR-case-13.xml31 KB
  • goaml/STR-case-130.xml33 KB
  • goaml/STR-case-132.xml5 KB
  • goaml/STR-case-137.xml30 KB
  • goaml/STR-case-144.xml15 KB
  • goaml/STR-case-145.xml33 KB
  • goaml/STR-case-150.xml32 KB
  • goaml/STR-case-152.xml17 KB
  • goaml/STR-case-153.xml30 KB
  • goaml/STR-case-155.xml5 KB
  • goaml/STR-case-159.xml13 KB
  • goaml/STR-case-160.xml5 KB
  • goaml/STR-case-161.xml33 KB
  • goaml/STR-case-171.xml30 KB
  • goaml/STR-case-172.xml8 KB
  • goaml/STR-case-179.xml33 KB
  • goaml/STR-case-180.xml17 KB
  • goaml/STR-case-194.xml33 KB
  • goaml/STR-case-200.xml3 KB
  • goaml/STR-case-208.xml8 KB
  • goaml/STR-case-211.xml11 KB
  • goaml/STR-case-215.xml7 KB
  • goaml/STR-case-218.xml33 KB
  • goaml/STR-case-220.xml9 KB
  • goaml/STR-case-221.xml33 KB
  • goaml/STR-case-222.xml33 KB
  • goaml/STR-case-225.xml12 KB
  • goaml/STR-case-227.xml3 KB
  • goaml/STR-case-232.xml20 KB
  • goaml/STR-case-240.xml33 KB
  • goaml/STR-case-241.xml6 KB
  • goaml/STR-case-243.xml30 KB
  • goaml/STR-case-248.xml33 KB
  • goaml/STR-case-253.xml31 KB
  • goaml/STR-case-259.xml32 KB
  • goaml/STR-case-260.xml30 KB
  • goaml/STR-case-263.xml32 KB
  • goaml/STR-case-270.xml30 KB
  • goaml/STR-case-276.xml4 KB
  • goaml/STR-case-28.xml8 KB
  • goaml/STR-case-280.xml9 KB
  • goaml/STR-case-283.xml14 KB
  • goaml/STR-case-285.xml5 KB
  • goaml/STR-case-295.xml15 KB
  • goaml/STR-case-297.xml33 KB
  • goaml/STR-case-306.xml29 KB
  • goaml/STR-case-307.xml18 KB
  • goaml/STR-case-313.xml33 KB
  • goaml/STR-case-314.xml3 KB
  • goaml/STR-case-315.xml4 KB
  • goaml/STR-case-32.xml5 KB
  • goaml/STR-case-325.xml32 KB
  • goaml/STR-case-327.xml4 KB
  • goaml/STR-case-328.xml32 KB
  • goaml/STR-case-33.xml4 KB
  • goaml/STR-case-331.xml30 KB
  • goaml/STR-case-332.xml29 KB
  • goaml/STR-case-338.xml3 KB
  • goaml/STR-case-34.xml31 KB
  • goaml/STR-case-340.xml9 KB
  • goaml/STR-case-342.xml19 KB
  • goaml/STR-case-347.xml5 KB
  • goaml/STR-case-348.xml4 KB
  • goaml/STR-case-35.xml4 KB
  • goaml/STR-case-350.xml11 KB
  • goaml/STR-case-351.xml5 KB
  • goaml/STR-case-354.xml3 KB
  • goaml/STR-case-355.xml3 KB
  • goaml/STR-case-358.xml8 KB
  • goaml/STR-case-36.xml4 KB
  • goaml/STR-case-364.xml28 KB
  • goaml/STR-case-366.xml33 KB
  • goaml/STR-case-37.xml5 KB
  • goaml/STR-case-372.xml33 KB
  • goaml/STR-case-373.xml5 KB
  • goaml/STR-case-375.xml33 KB
  • goaml/STR-case-38.xml5 KB
  • goaml/STR-case-381.xml25 KB
  • goaml/STR-case-383.xml33 KB
  • goaml/STR-case-39.xml31 KB
  • goaml/STR-case-392.xml13 KB
  • goaml/STR-case-395.xml9 KB
  • goaml/STR-case-396.xml15 KB
  • goaml/STR-case-397.xml30 KB
  • goaml/STR-case-400.xml30 KB
  • goaml/STR-case-401.xml9 KB
  • goaml/STR-case-403.xml32 KB
  • goaml/STR-case-405.xml25 KB
  • goaml/STR-case-406.xml10 KB
  • goaml/STR-case-408.xml8 KB
  • goaml/STR-case-412.xml33 KB
  • goaml/STR-case-417.xml29 KB
  • goaml/STR-case-42.xml33 KB
  • goaml/STR-case-422.xml26 KB
  • goaml/STR-case-428.xml8 KB
  • goaml/STR-case-434.xml22 KB
  • goaml/STR-case-442.xml33 KB
  • goaml/STR-case-443.xml5 KB
  • goaml/STR-case-447.xml5 KB
  • goaml/STR-case-449.xml5 KB
  • goaml/STR-case-453.xml12 KB
  • goaml/STR-case-455.xml8 KB
  • goaml/STR-case-457.xml22 KB
  • goaml/STR-case-460.xml33 KB
  • goaml/STR-case-465.xml33 KB
  • goaml/STR-case-466.xml33 KB
  • goaml/STR-case-470.xml32 KB
  • goaml/STR-case-471.xml6 KB
  • goaml/STR-case-473.xml9 KB
  • goaml/STR-case-478.xml33 KB
  • goaml/STR-case-482.xml33 KB
  • goaml/STR-case-486.xml30 KB
  • goaml/STR-case-49.xml33 KB
  • goaml/STR-case-490.xml10 KB
  • goaml/STR-case-493.xml29 KB
  • goaml/STR-case-499.xml17 KB
  • goaml/STR-case-5.xml3 KB
  • goaml/STR-case-501.xml12 KB
  • goaml/STR-case-508.xml6 KB
  • goaml/STR-case-512.xml33 KB
  • goaml/STR-case-518.xml25 KB
  • goaml/STR-case-522.xml16 KB
  • goaml/STR-case-527.xml4 KB
  • goaml/STR-case-530.xml33 KB
  • goaml/STR-case-534.xml3 KB
  • goaml/STR-case-536.xml6 KB
  • goaml/STR-case-537.xml3 KB
  • goaml/STR-case-538.xml33 KB
  • goaml/STR-case-539.xml5 KB
  • goaml/STR-case-54.xml11 KB
  • goaml/STR-case-540.xml5 KB
  • goaml/STR-case-542.xml4 KB
  • goaml/STR-case-543.xml7 KB
  • goaml/STR-case-544.xml33 KB
  • goaml/STR-case-548.xml29 KB
  • goaml/STR-case-555.xml33 KB
  • goaml/STR-case-558.xml14 KB
  • goaml/STR-case-565.xml17 KB
  • goaml/STR-case-567.xml33 KB
  • goaml/STR-case-568.xml6 KB
  • goaml/STR-case-570.xml8 KB
  • goaml/STR-case-571.xml3 KB
  • goaml/STR-case-572.xml3 KB
  • goaml/STR-case-573.xml6 KB
  • goaml/STR-case-575.xml33 KB
  • goaml/STR-case-576.xml5 KB
  • goaml/STR-case-577.xml3 KB
  • goaml/STR-case-586.xml31 KB
  • goaml/STR-case-589.xml33 KB
  • goaml/STR-case-59.xml8 KB
  • goaml/STR-case-592.xml30 KB
  • goaml/STR-case-593.xml32 KB
  • goaml/STR-case-597.xml20 KB
  • goaml/STR-case-599.xml30 KB
  • goaml/STR-case-608.xml33 KB
  • goaml/STR-case-61.xml32 KB
  • goaml/STR-case-610.xml5 KB
  • goaml/STR-case-611.xml33 KB
  • goaml/STR-case-622.xml17 KB
  • goaml/STR-case-623.xml33 KB
  • goaml/STR-case-624.xml33 KB
  • goaml/STR-case-626.xml33 KB
  • goaml/STR-case-629.xml14 KB
  • goaml/STR-case-633.xml15 KB
  • goaml/STR-case-635.xml25 KB
  • goaml/STR-case-636.xml30 KB
  • goaml/STR-case-639.xml33 KB
  • goaml/STR-case-640.xml5 KB
  • goaml/STR-case-641.xml11 KB
  • goaml/STR-case-643.xml8 KB
  • goaml/STR-case-646.xml33 KB
  • goaml/STR-case-649.xml33 KB
  • goaml/STR-case-655.xml28 KB
  • goaml/STR-case-657.xml33 KB
  • goaml/STR-case-658.xml29 KB
  • goaml/STR-case-659.xml33 KB
  • goaml/STR-case-661.xml3 KB
  • goaml/STR-case-667.xml33 KB
  • goaml/STR-case-668.xml11 KB
  • goaml/STR-case-679.xml33 KB
  • goaml/STR-case-680.xml33 KB
  • goaml/STR-case-681.xml20 KB
  • goaml/STR-case-682.xml14 KB
  • goaml/STR-case-684.xml20 KB
  • goaml/STR-case-69.xml33 KB
  • goaml/STR-case-690.xml17 KB
  • goaml/STR-case-694.xml17 KB
  • goaml/STR-case-695.xml19 KB
  • goaml/STR-case-697.xml22 KB
  • goaml/STR-case-701.xml20 KB
  • goaml/STR-case-702.xml32 KB
  • goaml/STR-case-705.xml33 KB
  • goaml/STR-case-706.xml4 KB
  • goaml/STR-case-72.xml14 KB
  • goaml/STR-case-77.xml8 KB
  • goaml/STR-case-79.xml32 KB
  • goaml/STR-case-8.xml8 KB
  • goaml/STR-case-84.xml4 KB
  • goaml/STR-case-86.xml4 KB
  • goaml/STR-case-87.xml5 KB
  • goaml/STR-case-90.xml5 KB
  • goaml/STR-case-91.xml5 KB
  • goaml/STR-case-93.xml4 KB
  • goaml/STR-case-94.xml31 KB
  • README.md18 KB
  • INTEGRITY.json24 KB
  • RECIPE.json2 KB

Before you use it

Things to know

  • Everything is synthetic: customers, names, nationalities, companies, accounts and the watchlist. The mix of nationalities, names, pay and other group patterns is an approximation from the little public information available, made for realism; it is not the true distribution of the UAE's population or of any bank's customers. IBANs and BICs have valid check digits but belong to no real account. No real person or institution is represented.
  • This is test and teaching data. It is not evidence that a model will catch real criminals, and it does not make any system compliant with any regulation.
  • is_suspicious is the truth; label_observed is what the bank knew, and labelled_at when it knew it (empty if the label had not arrived by the end of the data). Use the truth to score and the observed label to train, as a bank must.
  • Amounts are in UAE dirhams (AED) except on a foreign-currency account. The UAE has no US-style cash transaction report; structuring here stays under the AED 55,000 due-diligence line for occasional transactions (Cabinet Decision No. 10 of 2019, Art. 6(2)). Cabinet Resolution No. 134 of 2025 replaced that decision from 14 December 2025 and its figure is not confirmed here.
  • cases.sar_filed and sar_filed_at record a suspicious transaction report filed with the UAE FIU by the reporting officer on a banking day; the 1-10 day lag after detection (an analyst's escalation) is a modelling assumption for "without delay", as no published distribution exists. Continuing activity is covered by a report for 90 days before it is reported again.
  • A foreign-currency account moves its own currency (currency); amount_base is every amount in dirhams, as monitoring reads it. goAML indicator codes marked SYN- are the dataset's own and stand for the FIU's lookup codes.
  • labelled_at later than the data's end means the label arrives after the cut-off; label_observed is empty there.
  • Truth columns are for scoring, never for training: is_suspicious, typology, ring_id and lookalike_of on transactions; customers.is_suspicious; alerts.is_true_positive and alerts.typology; typology and ring_id on logins and payees; and the rings, ring_members, lookalikes and screening_expected tables.
  • customers.is_suspicious marks a laundering principal. A fraud's principal, a mule or a victim can carry suspicious transactions without it: for a label per customer, use whether any of their transactions is suspicious. label_observed and labelled_at, and an alert's first-line disposition, are the bank's own records: train on those.
  • Alerts come from rules a bank would run, not from the truth, so most are false positives and some crime raises none.
  • The bank reports 55.9% of its launderers. A launderer whose story holds at first-line review (real invoices behind a trade, takings a cash business declared, a PEP's declared wealth) has every alert closed, as an honest customer's would be. How much monitoring misses is not published: the order of the schemes follows FATF's account of which are hardest to see, with trade-based laundering the hardest, and the shares are assumptions.

Questions

Before you buy

Is this real data?
No. This is synthetic data generated by software. No row describes a real person, company, patient, store, machine or transaction. The patterns are modelled to be realistic and the statistics quoted are measured on these files, but they do not describe any real population or market. Use it for learning, testing, demos, benchmarks and prototyping, not as evidence about the real world. Provided as is, without warranty.
What do I get?
One zip of 221.1 MB: 16 linked tables and 11,621,027 rows as CSV, a README of what each table holds and how the data behaves, INTEGRITY.json with the 111 audit checks, and RECIPE.json, the Misata blueprint that made these exact rows (seed 20261029).
Can I try it before buying?
Yes. The free preview (2.8 MB) is a slice of the same data with the keys intact, plus the README, so you can load it and check it fits before you pay.
How was it checked?
111 of 111 checks pass, re-run on the delivered files by an independent script with plain pandas: every key resolves and every primary key is unique; a transaction's customer owns its account; nothing happens before the account opens or the customer is onboarded; a case opens on or after its first alert and files its STR after it opens; every goAML report parses and belongs to a case with an STR; every customer was an adult when onboarded; dormant accounts have been quiet for a year; closed accounts stop; no value of any column, nor its being empty, marks crime on its own: declined payments, new devices and transfers between customers are overwhelmingly honest, as in a real bank; honest look-alike customers never carry a truly suspicious transaction; each scheme that starts part-way through starts when the recipe says; no column on its own gives the label away (the shortcut audit below).
Can I use it commercially?
Yes: in any project, course, benchmark, demo or product, commercial or not. You may not resell or redistribute the dataset itself as a dataset.
What should I know before using it?
Everything is synthetic: customers, names, nationalities, companies, accounts and the watchlist. The mix of nationalities, names, pay and other group patterns is an approximation from the little public information available, made for realism; it is not the true distribution of the UAE's population or of any bank's customers. IBANs and BICs have valid check digits but belong to no real account. No real person or institution is represented. This is test and teaching data. It is not evidence that a model will catch real criminals, and it does not make any system compliant with any regulation. is_suspicious is the truth; label_observed is what the bank knew, and labelled_at when it knew it (empty if the label had not arrived by the end of the data). Use the truth to score and the observed label to train, as a bank must. Amounts are in UAE dirhams (AED) except on a foreign-currency account. The UAE has no US-style cash transaction report; structuring here stays under the AED 55,000 due-diligence line for occasional transactions (Cabinet Decision No. 10 of 2019, Art. 6(2)). Cabinet Resolution No. 134 of 2025 replaced that decision from 14 December 2025 and its figure is not confirmed here. cases.sar_filed and sar_filed_at record a suspicious transaction report filed with the UAE FIU by the reporting officer on a banking day; the 1-10 day lag after detection (an analyst's escalation) is a modelling assumption for "without delay", as no published distribution exists. Continuing activity is covered by a report for 90 days before it is reported again. A foreign-currency account moves its own currency (currency); amount_base is every amount in dirhams, as monitoring reads it. goAML indicator codes marked SYN- are the dataset's own and stand for the FIU's lookup codes. labelled_at later than the data's end means the label arrives after the cut-off; label_observed is empty there. Truth columns are for scoring, never for training: is_suspicious, typology, ring_id and lookalike_of on transactions; customers.is_suspicious; alerts.is_true_positive and alerts.typology; typology and ring_id on logins and payees; and the rings, ring_members, lookalikes and screening_expected tables. customers.is_suspicious marks a laundering principal. A fraud's principal, a mule or a victim can carry suspicious transactions without it: for a label per customer, use whether any of their transactions is suspicious. label_observed and labelled_at, and an alert's first-line disposition, are the bank's own records: train on those. Alerts come from rules a bank would run, not from the truth, so most are false positives and some crime raises none. The bank reports 55.9% of its launderers. A launderer whose story holds at first-line review (real invoices behind a trade, takings a cash business declared, a PEP's declared wealth) has every alert closed, as an honest customer's would be. How much monitoring misses is not published: the order of the schemes follows FATF's account of which are hardest to see, with trade-based laundering the hardest, and the shares are assumptions.
Can I get a bigger or different version?
Yes. RECIPE.json runs in Misata Studio or through Misata's MCP server to make a variant, or ask us to build one to your spec.

Want it bigger, in another setting, or with your own columns? Have us build it or make it in Studio.

More premium datasets

All 8
  • Weekly sales, at regular price and on promotion

    Grocery chain, 10 stores, fiscal 2024 and 2025

    Two fiscal years of a grocery chain, from the shelf to the receipt

    Answer key

    • baseline_units
    • price_effect
    • promo_lift
    • +7 more
    Rows
    2,790,852
    Tables
    14
    Checks
    117 of 117
    Free preview18-question projectProfile and preview
  • An X-bar chart with the truth underneath: flatness, characteristic 139

    3 plants, 36 CNC machines, six months

    Six months of control charts with the ground truth underneath

    Answer key

    • active_cause_id
    • true_cause_shift_sigma
    • true_tool_wear_sigma
    • +6 more
    Rows
    515,442
    Tables
    15
    Checks
    101 of 101
    Free preview18-question projectProfile and preview
  • Vibration through a life that ends in failure

    240 machines at 4 plants, two years

    Two years of sensor readings, failures, repairs and costs for 240 machines

    Answer key

    • failure_mode
    • true_life_days
    • true_failure_at
    • +6 more
    Rows
    179,004
    Tables
    6
    Checks
    68 of 68
    Free preview18-question projectProfile and preview