Retail Banking Transactions and Fraud Analytics Set (GB)
Overview
FINFRD996 follows a synthetic United Kingdom retail bank from customer onboarding through account and card issue, everyday card and payment activity, authorisation and decline, fraud detection, investigation, chargeback and recovery. Forty linked tables cover the customer book with effective-dated addresses, contacts, employment and due diligence reviews; the product estate of current accounts, savings and credit cards, each account carrying a full IBAN whose check digits are real modulo-97 digits over its own sort code and account number; the card estate stored the way a compliant warehouse stores it, masked over numbers that were Luhn valid before masking; a merchant estate of seven thousand four hundred merchants on the real ISO 18245 category codes; and a transaction spine of more than a million posted movements over twelve months. Fraud is not a separate population bolted on beside the genuine data. Compromise events are laid over real customers and real cards, so a fraudulent transaction is an ordinary account behaving wrongly, and the two distributions overlap the way they do in life: average genuine spend of one hundred and thirty six pounds against average fraud of four hundred and fifteen, at roughly one transaction in six hundred. Twelve typologies are represented, from card-not-present and counterfeit through account takeover and SIM swap to the six authorised push payment scam categories the reimbursement rules are written against. Two tables make this usable as a benchmark rather than a demonstration. The fraud label is ground truth, confirmed days or weeks after the transaction, and is not what the bank knew at the time. Alongside it sits what the incumbent monitoring actually fired: fourteen thousand alerts at roughly nine percent precision and seventy five percent recall, eight alerts for every confirmed fraud. A model can therefore be scored against the truth and against the estate it would replace, on the same rows. Line-level detail covers the most recent twelve months and monthly aggregates reach back forty-two, which is how a bank really holds it: detail online for about thirteen months, rolled into aggregates after that. Identifiers are drawn from keyed hashes rather than counters, so no column runs 0001, 0002, 0003 and no model can learn the ordering instead of the signal.
Analytics
Four entries from the packaged tables, with the performance the dataset records for them. Every value below is read from the shipped files.
Row Counts by Table
Counted from the files that ship, not estimated.
| Table | Rows |
|---|---|
| gb_bank_customers | 5,000 |
| gb_bank_customer_addresses | 6,974 |
| gb_bank_customer_contacts | 10,000 |
| gb_bank_customer_employment | 5,000 |
| gb_bank_kyc_reviews | 21,979 |
| gb_bank_accounts | 9,055 |
| gb_bank_account_holders | 9,914 |
| gb_bank_cards | 7,028 |
| gb_bank_card_events | 13,061 |
| gb_bank_device_bindings | 10,024 |
| gb_bank_merchants | 7,400 |
| gb_bank_merchant_terminals | 13,284 |
| gb_bank_acquirers | 34 |
| gb_bank_transactions | 1,060,383 |
| gb_bank_authorisations | 133,747 |
| gb_bank_declines | 48,000 |
| gb_bank_reversals | 8,013 |
| gb_bank_fraud_labels | 1,687 |
| gb_bank_fraud_alerts | 14,772 |
| gb_bank_fraud_cases | 3,926 |
| gb_bank_case_actions | 13,700 |
| gb_bank_chargebacks | 794 |
| gb_bank_recoveries | 363 |
| gb_bank_login_events | 137,938 |
| gb_bank_account_monthly_balances | 186,360 |
| gb_bank_customer_monthly_activity | 210,000 |
| gb_bank_products | 14 |
| gb_bank_branches | 134 |
| gb_bank_merchant_categories | 63 |
| gb_bank_channels | 8 |
| gb_bank_transaction_types | 12 |
| gb_bank_decline_reasons | 12 |
| gb_bank_device_types | 8 |
| gb_bank_fraud_typologies | 14 |
| gb_bank_risk_bands | 4 |
| gb_bank_employment_sectors | 20 |
| gb_bank_cities | 60 |
| gb_bank_regions | 12 |
| gb_bank_countries | 20 |
| gb_bank_currencies | 12 |
Table Relationships
One parent record and seven child tables, each joined back on the same key.
Schema
Every table ships with typed columns, referential integrity, and documentation.
| Column | Type | Description |
|---|---|---|
| customer_id | varchar(16) | Customer key. Primary key of customers and the foreign key on every table that hangs off a person. |
| customer_number | varchar(16) | Ten digit customer number as it appears on correspondence. Sparse and non-sequential, so it carries no information about when the customer joined. |
| forename | varchar(16) | Given name. A real name token; the person is generated. |
| surname | varchar(24) | Family name, drawn with British frequency weighting so the book is four percent Smith rather than uniform across a list. |
| sex | varchar(16) | Sex recorded at onboarding, F or M. |
| date_of_birth | date | Date of birth, ISO 8601. Drives age-based segmentation and the student product test. |
| joined_on | date | Date the relationship opened, which is not the date any particular account opened. |
+9 more columns in gb_bank_customers. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| address_id | varchar(24) | Address key. A customer has one row per address they have lived at, not one row. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| address_line_1 | varchar(32) | Street and building number. |
| address_line_2 | varchar(32) | London borough where the postcode area names one, otherwise empty. |
| city_name | varchar(24) | Human-readable city name. All people and organisations are modelled. |
| city_id | varchar(16) | Stable identifier for city; use it for declared joins. |
| postcode | varchar(16) | UK postcode in the real format, with an area that genuinely serves the town and a district inside that area real range. |
+5 more columns in gb_bank_customer_addresses. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| contact_id | varchar(24) | Stable identifier for contact; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| contact_type | varchar(16) | email or mobile. |
| contact_value | varchar(56) | The address or number. Mail domains are generated and were checked as unregistered at build time; mobile numbers sit in the Ofcom 07700 900xxx drama range, which is reserved and never allocated to a subscriber. |
| recorded_on | date | recorded on as an ISO 8601 calendar date. |
| is_primary | varchar(16) | The channel the bank uses first for this contact type. |
| verification_status | varchar(16) | Whether the channel has been proven to reach the customer. An unverified channel cannot carry a one-time passcode. |
+1 more columns in gb_bank_customer_contacts. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| employment_id | varchar(16) | Stable identifier for employment; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| sector_id | varchar(16) | Stable identifier for sector; use it for declared joins. |
| sector_name | varchar(48) | Human-readable sector name. All people and organisations are modelled. |
| declared_income_gbp | integer | Gross annual income the customer declared, in pounds. Self-declared, so it is what the bank was told rather than what was earned. |
| employment_type | varchar(24) | permanent, fixed_term, part_time, self_employed or not_employed. |
| declared_on | date | When the declaration was made. It is not refreshed on every review, so it ages. |
+1 more columns in gb_bank_customer_employment. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| review_id | varchar(24) | One customer due diligence review. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| review_date | date | review date as an ISO 8601 calendar date. |
| risk_band | varchar(16) | Band the review concluded on, which may differ from the band the customer carries now. |
| review_outcome | varchar(16) | cleared or escalated. An escalation does not by itself mean anything was found. |
| review_trigger | varchar(16) | onboarding, periodic on the band cadence, or event_driven because something happened. |
| sar_filed | varchar(16) | Whether a suspicious activity report was filed to the NCA off the back of the review. |
+1 more columns in gb_bank_kyc_reviews. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| account_id | varchar(24) | Account key. Primary key of accounts and the foreign key on every transaction. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| product_id | varchar(16) | Stable identifier for product; use it for declared joins. |
| sort_code | varchar(16) | Six digit UK sort code in nn-nn-nn form. |
| account_number | varchar(16) | Eight digit UK account number. |
| iban | varchar(32) | Full IBAN. The check digits are real ISO 13616 modulo-97 digits over this sort code and account number, so the value validates in any IBAN library. |
| bic | varchar(16) | SWIFT BIC of the issuing bank. |
+8 more columns in gb_bank_accounts. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| holder_id | varchar(24) | One person on one account. A joint account has two rows. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| holder_role | varchar(16) | primary or joint. Both can transact; the primary receives correspondence. |
| added_on | date | added on as an ISO 8601 calendar date. |
| Column | Type | Description |
|---|---|---|
| card_id | varchar(24) | Card key. Primary key of cards and the foreign key on a card transaction. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| scheme | varchar(16) | Card scheme the product runs on. |
| bin | integer | Bank identification number, the first six digits. Assigned inside this dataset and not an ITA allocation. |
| masked_pan | varchar(24) | The card number as a compliant warehouse stores it: first six, six asterisks, last four. The underlying number was Luhn valid before masking. |
| last_four | varchar(8) | Last four digits, which is what a customer quotes and what a dispute is matched on. |
+7 more columns in gb_bank_cards. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| event_id | varchar(24) | Stable identifier for event; use it for declared joins. |
| card_id | varchar(24) | Stable identifier for card; use it for declared joins. |
| event_type | varchar(16) | issued, reissued, blocked or expired. |
| event_at | varchar(32) | When the event happened, UTC. |
| event_reason | varchar(24) | Why the event happened. On a block this is the difference between a lost card and a suspected compromise. |
| notes | text | Free-text note left by the operator. Empty on automated events. |
| Column | Type | Description |
|---|---|---|
| device_id | varchar(24) | A device the customer has used for digital banking. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| device_type | varchar(24) | Kind of device. Joins gb_bank_device_types. |
| bound_at | varchar(32) | When the device was first seen on the relationship. |
| is_primary | varchar(16) | True for the single row of this type that the ERP treats as the default for the vendor. |
| trust_state | varchar(16) | trusted or unrecognised. A payment from an unrecognised device shortly after binding is the account takeover signature. |
| device_fingerprint | varchar(24) | Opaque device fingerprint. Stable per device, meaningless across datasets. |
+1 more columns in gb_bank_device_bindings. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| merchant_id | varchar(24) | Merchant key. Foreign key on card transactions, declines and alerts. |
| merchant_number | varchar(24) | Thirteen digit acquirer merchant identifier, as it appears in the scheme message. |
| merchant_name | varchar(56) | Trading name. Generated from British place-name and trade morphology; no row names a real trading company. |
| mcc | varchar(8) | ISO 18245 merchant category code. Joins gb_bank_merchant_categories. |
| category_group | varchar(16) | Internal sourcing category label for the segment, as a buyer would name it. |
| city_id | varchar(16) | Stable identifier for city; use it for declared joins. |
| country_code | varchar(8) | ISO 3166-1 alpha-2 country code. |
+6 more columns in gb_bank_merchants. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| terminal_id | varchar(24) | A physical terminal or an e-commerce gateway. |
| merchant_id | varchar(24) | Stable identifier for merchant; use it for declared joins. |
| terminal_number | varchar(16) | Eight digit terminal identifier inside the merchant estate. |
| terminal_type | varchar(24) | countertop, portable, unattended or ecommerce_gateway. Unattended terminals carry a different fraud profile because nobody is watching. |
| city_id | varchar(16) | Stable identifier for city; use it for declared joins. |
| contactless_capable | varchar(16) | Whether the terminal accepts contactless. |
| Column | Type | Description |
|---|---|---|
| acquirer_id | varchar(16) | Acquiring bank that presents the merchant transaction into the scheme. |
| acquirer_name | varchar(40) | Human-readable acquirer name. All people and organisations are modelled. |
| country_code | varchar(8) | ISO 3166-1 alpha-2 country code. |
| interchange_bps | numeric(6,3) | Interchange the acquirer pays, in basis points of transaction value. |
| Column | Type | Description |
|---|---|---|
| transaction_id | varchar(24) | Transaction key. Primary key of the spine and the foreign key from labels, alerts, chargebacks, reversals and authorisations. |
| transaction_reference | varchar(16) | Twelve character acquirer-style reference, which is what appears on a statement and what a customer quotes in a dispute. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| card_id | varchar(24) | Card used. Empty on transactions that did not involve a card, such as a faster payment. |
| merchant_id | varchar(24) | Merchant paid. Empty on transactions with no merchant, such as an internal transfer. |
| terminal_id | varchar(24) | Stable identifier for terminal; use it for declared joins. |
+14 more columns in gb_bank_transactions. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| authorisation_id | varchar(24) | The authorisation message, which is what a real-time model actually scores. |
| transaction_id | varchar(24) | Stable identifier for transaction; use it for declared joins. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| card_id | varchar(24) | Stable identifier for card; use it for declared joins. |
| merchant_id | varchar(24) | Stable identifier for merchant; use it for declared joins. |
| authorised_at | varchar(32) | When the authorisation was requested, always before the transaction settled. |
| authorised_amount_gbp | numeric(9,2) | Amount authorised, which can differ from the amount that finally settles. |
+8 more columns in gb_bank_authorisations. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| decline_id | varchar(24) | A declined authorisation. These never became transactions, which is why they are here and not on the spine. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| card_id | varchar(24) | Stable identifier for card; use it for declared joins. |
| merchant_id | varchar(24) | Stable identifier for merchant; use it for declared joins. |
| declined_at | varchar(32) | When the authorisation was refused, UTC. |
| decline_date | date | decline date as an ISO 8601 calendar date. |
| decline_month | varchar(16) | Year and month of the refusal. |
+7 more columns in gb_bank_declines. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| reversal_id | varchar(24) | A reversal against a settled transaction. |
| transaction_id | varchar(24) | Stable identifier for transaction; use it for declared joins. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| reversed_at | varchar(32) | When the reversal posted, UTC. |
| reversed_amount_gbp | numeric(8,2) | Amount reversed. Equal to the original in a full reversal, less in a partial one. |
| currency_code | varchar(8) | Stable code for currency; its companion description carries the meaning. |
| reversal_reason | varchar(24) | Why it was reversed. A merchant refund and a duplicate charge look the same on a statement and are not the same event. |
+1 more columns in gb_bank_reversals. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| label_id | varchar(24) | One confirmed fraud. The ground truth table. |
| transaction_id | varchar(24) | Stable identifier for transaction; use it for declared joins. |
| card_id | varchar(24) | Stable identifier for card; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| typology_code | varchar(32) | Stable code for typology; its companion description carries the meaning. |
| loss_class | varchar(16) | How the loss is categorised for reporting. Joins the same column on gb_bank_fraud_typologies. |
| confirmed_at | varchar(32) | When the fraud was confirmed, which is days or weeks AFTER the transaction. Training on features observable only at this timestamp leaks the future into the model. |
+5 more columns in gb_bank_fraud_labels. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| alert_id | varchar(24) | One alert the incumbent monitoring raised. |
| transaction_id | varchar(24) | Stable identifier for transaction; use it for declared joins. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| card_id | varchar(24) | Stable identifier for card; use it for declared joins. |
| alerted_at | varchar(32) | When the alert fired, UTC. Within minutes of the transaction, which is what makes it usable in real time. |
| alert_date | date | alert date as an ISO 8601 calendar date. |
+7 more columns in gb_bank_fraud_alerts. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| case_id | varchar(24) | Investigation case reference in the CS-year-number form an analyst quotes. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| opened_at | varchar(32) | When the case was opened, UTC. |
| opened_date | date | opened date as an ISO 8601 calendar date. |
| opened_month | varchar(16) | Year and month the case opened. |
| closed_at | varchar(32) | When the case closed. Empty on a case still open at the end of the window. |
+6 more columns in gb_bank_fraud_cases. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| action_id | varchar(24) | One step in the investigation, in order. |
| case_id | varchar(24) | Stable identifier for case; use it for declared joins. |
| action_at | varchar(32) | When the step was taken, UTC. Steps are in order within a case. |
| action_type | varchar(24) | What the investigator did at that step. |
| agent_id | varchar(16) | Stable identifier for agent; use it for declared joins. |
| action_note | text | Investigator note on the step. Empty where the action speaks for itself. |
| Column | Type | Description |
|---|---|---|
| chargeback_id | varchar(24) | A chargeback raised against a card transaction. |
| transaction_id | varchar(24) | Stable identifier for transaction; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| raised_at | varchar(32) | When the chargeback was raised with the scheme, UTC. |
| raised_date | date | raised date as an ISO 8601 calendar date. |
| raised_month | varchar(16) | Year and month it was raised, for joining to monthly reporting. |
| disputed_amount_gbp | numeric(9,2) | Amount disputed, which is normally the full transaction. |
+5 more columns in gb_bank_chargebacks. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| recovery_id | varchar(24) | Money actually recovered against a loss. |
| transaction_id | varchar(24) | Stable identifier for transaction; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| recovered_at | varchar(32) | When the money was actually recovered, which is well after the loss. |
| recovered_amount_gbp | numeric(9,2) | Amount recovered, usually less than the loss. |
| currency_code | varchar(8) | Stable code for currency; its companion description carries the meaning. |
| recovery_route | varchar(24) | scheme_chargeback for card losses, psr_reimbursement where the customer was made whole under the APP reimbursement rules. |
+1 more columns in gb_bank_recoveries. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| login_id | varchar(24) | One authentication attempt on a digital channel. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| device_id | varchar(24) | Stable identifier for device; use it for declared joins. |
| occurred_at | varchar(32) | When the authentication attempt happened, UTC. |
| login_date | date | login date as an ISO 8601 calendar date. |
| login_month | varchar(16) | Year and month of the attempt. |
| channel_code | varchar(24) | Stable code for channel; its companion description carries the meaning. |
+5 more columns in gb_bank_login_events. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| balance_id | varchar(24) | One account, one month. |
| account_id | varchar(24) | Stable identifier for account; use it for declared joins. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| balance_month | varchar(16) | Year and month the row closes. |
| closing_balance_gbp | numeric(10,2) | Balance at month end. Negative where the account is overdrawn or is a credit card. |
| total_debits_gbp | numeric(10,2) | Money out during the month. |
| total_credits_gbp | numeric(9,2) | Money in during the month. |
+3 more columns in gb_bank_account_monthly_balances. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| activity_id | varchar(24) | One customer, one month. |
| customer_id | varchar(16) | Stable identifier for customer; use it for declared joins. |
| activity_month | varchar(16) | Year and month. |
| transaction_count | integer | Transactions across all of the customer accounts that month. |
| total_spend_gbp | numeric(10,2) | Total value across all of their accounts that month. |
| cnp_transaction_count | integer | How many were card-not-present, which is the exposure that matters for remote fraud. |
| fraud_transaction_count | integer | How many were confirmed fraudulent. |
+2 more columns in gb_bank_customer_monthly_activity. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| product_id | varchar(16) | Stable identifier for product; use it for declared joins. |
| product_name | varchar(40) | Human-readable product name. All people and organisations are modelled. |
| product_family | varchar(16) | current, savings or credit_card. |
| monthly_fee_gbp | integer | Account fee charged monthly, zero on fee-free products. |
| interest_rate_pct | numeric(6,2) | Credit interest on a savings product, or representative APR on a card. |
| default_limit_gbp | integer | Arranged overdraft on a current account, or the starting credit limit on a card. |
| currency_code | varchar(8) | Stable code for currency; its companion description carries the meaning. |
+2 more columns in gb_bank_products. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| branch_id | varchar(16) | Stable identifier for branch; use it for declared joins. |
| branch_name | varchar(56) | Human-readable branch name. All people and organisations are modelled. |
| city_id | varchar(16) | Stable identifier for city; use it for declared joins. |
| sort_code | varchar(16) | Six digit UK sort code in nn-nn-nn form. Assigned inside this dataset; not an allocation of any real institution. |
| opened_on | date | opened on as an ISO 8601 calendar date. |
| branch_status | varchar(16) | Whether the branch is still trading. Closed branches keep their accounts. |
| Column | Type | Description |
|---|---|---|
| mcc | varchar(8) | ISO 18245 merchant category code. The real four digit scheme code. |
| mcc_description | varchar(72) | Official ISO 18245 title for the code. |
| category_group | varchar(16) | Coarser grouping this dataset adds over the standard, so a query can ask for fuel without listing both service station codes. |
| risk_weight | numeric(4,1) | Relative fraud propensity of the category in this simulation, 1.0 being average. A modelling input, not part of the standard. |
| Column | Type | Description |
|---|---|---|
| channel_code | varchar(24) | How the payment reached the bank. |
| channel_name | varchar(40) | Human-readable channel name. All people and organisations are modelled. |
| presentment_mode | varchar(24) | Whether the card was physically present, remote, or no card was involved. |
| volume_share | numeric(6,3) | Share of transactions on the channel across the portfolio. |
| Column | Type | Description |
|---|---|---|
| transaction_type | varchar(24) | The instrument and direction together, for example faster_payment_out. |
| transaction_type_name | varchar(24) | Human-readable transaction type name. All people and organisations are modelled. |
| direction | varchar(16) | Whether the type moves money out of the account or into it. |
| Column | Type | Description |
|---|---|---|
| decline_reason | varchar(24) | Why the authorisation was refused. |
| decline_reason_name | varchar(48) | Human-readable decline reason name. All people and organisations are modelled. |
| reason_group | varchar(24) | Whether the refusal was about balance, limits, authentication, card status, risk, the acquirer or a technical failure. |
| Column | Type | Description |
|---|---|---|
| device_type | varchar(24) | Kind of device a digital session came from. |
| device_type_name | varchar(24) | The device type in words. |
| form_factor | varchar(16) | mobile, tablet, desktop or unknown. Fraud rates differ sharply between them, so this is worth a feature on its own. |
| Column | Type | Description |
|---|---|---|
| typology_code | varchar(32) | The fraud pattern, in the vocabulary a UK fraud team uses. |
| typology_name | varchar(48) | Human-readable typology name. All people and organisations are modelled. |
| typology_family | varchar(16) | card, digital, app, mule or first_party. APP means the customer authorised the payment themselves, which changes both the liability and the detection problem. |
| typology_description | varchar(104) | Human-readable meaning of typology. |
| base_rate_per_mille | numeric(5,2) | Incidence per thousand eligible transactions used to drive the simulation. A modelling input, published so the class balance is reproducible. |
| loss_class | varchar(16) | How the loss is categorised for reporting: card_fraud, unauthorised, app_scam, mule or first_party. |
| Column | Type | Description |
|---|---|---|
| risk_band | varchar(16) | Customer due diligence band under the money laundering regulations. |
| risk_band_name | varchar(16) | Human-readable risk band name. All people and organisations are modelled. |
| severity_order | integer | Sort order, 1 lowest. Use this rather than sorting the band alphabetically. |
| policy_note | varchar(72) | What the band obliges the bank to do. |
| Column | Type | Description |
|---|---|---|
| sector_id | varchar(16) | Stable identifier for sector; use it for declared joins. |
| sector_name | varchar(48) | ONS-style industry section the customer declared. |
| Column | Type | Description |
|---|---|---|
| city_id | varchar(16) | Stable identifier for city; use it for declared joins. |
| city_name | varchar(24) | Human-readable city name. All people and organisations are modelled. |
| region_id | varchar(16) | Stable identifier for region; use it for declared joins. |
| latitude | numeric(8,4) | City centre latitude in decimal degrees, WGS 84. |
| longitude | numeric(7,4) | City centre longitude in decimal degrees, WGS 84. |
| population | integer | Approximate urban population, used to weight where customers and merchants are. |
| Column | Type | Description |
|---|---|---|
| region_id | varchar(16) | Stable identifier for region; use it for declared joins. |
| region_name | varchar(32) | Real ONS region or devolved nation name. |
| country_code | varchar(8) | ISO 3166-1 alpha-2 country code. |
| Column | Type | Description |
|---|---|---|
| country_code | varchar(8) | ISO 3166-1 alpha-2 country code. |
| country_name | varchar(32) | Country name in English. |
| currency_code | varchar(8) | Stable code for currency; its companion description carries the meaning. |
| card_usage_weight | numeric(7,4) | Share of this portfolio card spend that happens in the country. Sums to one across the table and is what makes a geo-velocity rule worth writing. |
| Column | Type | Description |
|---|---|---|
| currency_code | varchar(8) | ISO 4217 alphabetic currency code. |
| currency_numeric | integer | ISO 4217 numeric currency code. |
| currency_name | varchar(24) | Human-readable currency name. All people and organisations are modelled. |
| minor_units | integer | Digits after the decimal point the currency uses. JPY is 0, sterling is 2. |
| gbp_rate | numeric(7,4) | Units of this currency per pound, held flat for the period so a billing amount reconciles exactly. |
Sample Data
A snapshot of real rows from the dataset (values are fully synthetic).
| transaction_reference | transacted_at | amount_gbp | channel_code | mcc | country_code | is_fraud | fraud_typology |
|---|---|---|---|---|---|---|---|
| 2OJSM6CMIZ5H | 2025-07-01T00:00:12Z | 5.49 | ecommerce | 4111 | GB | N | |
| 391O0H54PKOY | 2025-07-01T00:01:03Z | 30.63 | pos_chip | 5942 | GB | N | |
| 3Z5OGF3ITPXW | 2025-07-01T00:02:59Z | 39.27 | pos_chip | 5732 | GB | N |
Version History
| v1.0.0 | 2026-08-26 | v1.0.0 - first release. Forty tables, 1.94 million rows. Twelve months of line-level transaction detail to 2026-06-30 with forty-two months of monthly aggregates behind it. Ground-truth fraud labels across twelve typologies at 0.16 percent of transactions, with the incumbent rule and model alerting published alongside so a buyer can measure against both. |
Related Datasets
Anti Money Laundering Transaction Monitoring Set (GB)
FinanceFINAML997 is a deterministic synthetic UK corporate banking warehouse: five thousand customer entities, eight thousand accounts, twenty-two thousand counterparties and six hundred thousand payments over twelve months, carrying confirmed laundering patterns and the incumbent monitoring estate that competes with them.
Consumer Credit Risk and Lending Decisioning Set (GB)
FinanceFINCRD995 is a deterministic synthetic UK consumer lender: 46,000 applicants, 65,000 applications and 15,000 agreements across the real Bank Rate cycle, and the counterfactual outcome for every applicant it turned down.
Digital Operational Resilience and ICT Third-Party Risk Analytics Set (EU)
FinanceFINICT999 is a deterministic synthetic EU financial-sector resilience warehouse connecting regulated entities, business functions, ICT assets, providers, contracts, risks, controls, incidents, recovery, testing, audit, remediation and financial effects.