Detekta Β· data specification

Getting your client base into Detekta

Three files. This page defines every field, says plainly which ones we cannot work without, and explains what each one buys you in monitoring coverage.

If a field is not available in your systems, leave it blank. Do not guess β€” we would rather have an honest gap than invented data.

Which of these are you?

The answer changes how much of this you fill in, and nothing else.

First AML mandate

Newly in scope, and you have never been required to collect dates of birth, residential addresses, ownership percentages or source-of-funds statements. You will not have most of this, and that is fine. Send the nine mandatory client columns β€” things any practice already holds β€” and we collect the rest from the people themselves during verification.

Existing programme

You already run AML and hold a customer file. Send everything you have. The additional columns exist for you: they carry your existing verification and risk work across so nobody is asked the same question twice, and they let us cross-check what people tell us against what you already knew.

Only 9 of the 33 client columns are mandatory either way. The rest exist so that where you do hold something, it does not go to waste.

The two halves are not symmetrical

If this is your first mandate: client data barely exists yet, and transaction data already exists in full.

Clients & people

9 and 4 mandatory columns. The nine are things a practice already holds: your reference, the entity type, the legal name, an email, the country, the ABN, the date they became a client, their status, and β€” for a trust β€” what kind of trust it is. You have never been required to collect dates of birth, residential addresses, ownership percentages or source-of-funds statements, so we assume you do not have those. We gather them during verification.

Transactions

9 mandatory columns, all of which are already on your bank statement. Date, amount, direction, the narrative line and the other party are printed on every row of the export. Nothing here asks you to research anything.

This is why the monitoring can start before the verification finishes. Two clocks run in parallel: transaction rules run the day your file lands, because they need the transaction and the counterparty, not your client’s date of birth. Screening of your clients’ people starts when each person responds to their verification link.

What we determine, not you

We deliberately do not ask you to declare whether a client is politically exposed, foreign tax resident, or higher risk. Those are conclusions, and they are ours to reach β€” we screen every person against sanctions, PEP and adverse-media sources and we compute the risk from the entity, the structure and the actual transaction behaviour. A client-supplied declaration would only ever be something we then have to confirm or contradict, so asking for it is noise.

What we collect, so you do not have to

Give us an ABN and we pull the company’s officeholders, registration status and incorporation date from the registry ourselves β€” you do not need to type the directors. Give us a person’s name and email and the verification flow collects their date of birth, address and identity document from them directly, then screens them. Ownership percentages, PEP status and source of funds are gathered as part of that same conversation.

Where you already hold any of it, send it β€” it saves the client a question and it lets us cross-check what they tell us.

The three files

Load order matters: entities exist before the people attached to them, and both exist before transactions can be linked.

1a_clients.csv one row per entity

The entities you act for β€” companies, individuals, trusts, partnerships, SMSFs.

1b_client_persons.csv one row per person

The humans behind each entity. This is the file that makes identity verification possible.

2_transactions.csv one row per transaction

Money movement across your accounts, for monitoring.

Each template carries a few worked examples β€” including a family trust held through a corporate trustee, because that structure is the one most often filled in incorrectly. Replace them with your data, or leave them and we will strip anything beginning C-000 or P-000.

Priority levels

Every field below carries one of four levels. The gap between the second and the third is the one worth understanding.

Mandatory

The minimum needed to run the monitoring rules and keep the record under ongoing due diligence. A record missing any of these will load, and we will list exactly what is missing β€” but it cannot be monitored or reviewed until they arrive.

Improves detection

Monitoring runs without it, measurably worse. Where a specific pattern becomes undetectable, we name it.

Optional

Enrichment. Changes nothing structural.

Only what is genuinely needed to run the rules and maintain the record is marked mandatory. email is mandatory because verification and ongoing review both reach the person through it; phone is not, because nothing depends on it.

Alongside the level, each field carries an Applies when note. A dash means the field applies to every row; otherwise it is only expected under that condition β€” abn matters for an Australian business and not for a UK one, counterparty_iban matters for an international wire and not for a BPAY.

If a field is genuinely unavailable, send the file with the cell blank. Please do not use a placeholder. A fabricated date of birth is worse than a missing one β€” it produces a confident wrong verification result instead of an honest gap.

Three things that matter more than the rest

Ordered by how often each one breaks a migration.

01

client_ref is the spine

Your own client identifier, from whatever system you already use. It joins all three files together.

Two rules: unique per entity, and stable forever. If it changes between imports we create a duplicate client and the history splits in two.

02

Amounts are always positive β€” direction carries the sign

A refund is money_out with a positive amount, not a negative deposit. This is the single most common cause of broken monitoring in a migration, so it is worth a second look at your export before you send it.

03

If you hold client money, tag the underlying client

This applies to anyone operating a trust account, a controlled-money account or any client account β€” accountants, law firms, conveyancers, real estate agencies, brokers. If every transaction on that account is tagged to your firm, we monitor your firm and learn nothing about your clients.

Tagged to the underlying client, the same file lets us see that one client made two $9,850 cash deposits on consecutive days β€” which is exactly the pattern that matters. For movements that genuinely belong to the firm β€” your own fee transfers, bank charges β€” create a client_ref for the firm itself in 1a and use it rather than leaving it blank.

Format rules

All three files.

Encoding
UTF-8. Not CP1252 or Latin-1 β€” accented names break.
Dates
YYYY-MM-DD
Timestamps
ISO 8601 with timezone: 2026-06-02T09:14:00+10:00. A date alone is accepted; we treat it as 00:00 local.
Amounts
Positive, decimal point, no thousands separator, no currency symbol: 48500.00
Booleans
TRUE / FALSE
Blanks
Leave the cell empty. Not NULL, N/A, - or unknown.
Currency
ISO 4217 β€” AUD, USD, EUR
Country
ISO 3166-1 alpha-2 β€” AU, NZ, DE

1a Β· Clients

One row per entity you act for. 42 columns; most entities use a subset determined by entity_type.

Identity

FieldLevelApplies whenNotes
client_refMandatoryβ€”Your identifier. Unique, stable.
entity_typeMandatoryβ€”Determines which other fields we require. See accepted values.
legal_nameMandatoryβ€”Exactly as registered. For an individual, their full legal name.
countryMandatoryβ€”Where the entity is established.
trading_nameImproves detectionIf it trades under another nameHelps us match the name that appears in transaction narratives.
abnMandatoryEvery entity that has oneAU business entities. Without it there is no registry lookup, so the entity stays unverified.
acnImproves detectionAU companiesCompanies. Lets us pull officeholders directly from the registry.
other_registration_number
registration_country
Improves detectionNon-AU entitiesNon-AU entities. Company number in the home registry.
date_of_birthImproves detectionindividual Β· sole_traderindividual and sole_trader only. Identity verification is impossible without it.
date_of_incorporationImproves detectionAll types except individualEntity age is a genuine risk signal β€” newly formed entities score higher.

Contact and address

FieldLevelApplies whenNotes
registered_address_line1
…_suburb, _state,
…_postcode, _country
Improves detectionβ€”Cross-checked against the registry and against proof of address.
emailMandatoryβ€”Where the identity-verification link is sent. No email, no KYC.
phoneOptionalβ€”Fallback delivery and a weak identity signal.
postal_address_same_as_registeredOptionalβ€”If FALSE, put the postal address in notes for now.

Business profile

FieldLevelApplies whenNotes
industry_descriptionImproves detectionAll types except individualDrives the risk model. β€œConsulting” and β€œmoney remittance” are not the same risk.
anzsic_codeOptionalIf you already hold itIf you already hold it.
relationship_start_dateMandatoryβ€”Distinguishes a new client from a ten-year one.
client_statusMandatoryβ€”active Β· inactive Β· ceased Β· prospective
cash_intensiveImproves detectionβ€”TRUE if the client routinely deals in cash. Turns on cash-specific rules.
notesOptionalβ€”Anything that does not fit a column. We read it.

Trusts

If the trustee is a company, give that company its own row in 1a and point trustee_client_ref at it. That is how we unwrap the structure and show the people behind it. If the trustee is an individual, list them in 1b with role trustee and leave trustee_client_ref blank.

The template shows this worked end to end: client-0003 is the trust, client-0004 is its corporate trustee with its own row, and the trustee’s sole director appears in 1b.

Discretionary trusts have no ownership percentages. That is the nature of them β€” the trustee decides distributions. Leave ownership_percentage blank for a discretionary beneficiary and still set is_beneficial_owner = TRUE: they are a beneficial owner by benefit and control, not by a measurable share. Unit trusts and partnerships do have measurable interests, so send those.

FieldLevelApplies whenNotes
trust_typeMandatorytrust Β· smsfdiscretionary Β· unit Β· testamentary Β· charitable Β· smsf
trustee_client_refImproves detectiontrust Β· smsf with a corporate trusteePoints at the trustee’s own row in this file, when the trustee is a company.
settlor_nameImproves detectiontrustAUSTRAC names the settlor specifically for trusts.
trust_deed_dateOptionaltrust Β· smsf
partnership_type
number_of_partners
Improves detectionpartnershipPartnerships. We reconcile the count against 1b; a mismatch flags an incomplete structure.

Expected activity

These are the baseline the monitoring compares against. Without them every rule falls back to a generic threshold, which produces both false positives and misses.

FieldLevelApplies whenNotes
expected_annual_turnoverImproves detectionβ€”A $40,000 transaction is unremarkable for a $10m client and a red flag for a $200k one. Blank means we cannot tell the difference.
expected_transaction_count_monthlyImproves detectionβ€”Enables velocity rules.
expected_transaction_value_monthlyImproves detectionβ€”Enables value-deviation rules.
funds_source_descriptionOptionalβ€”Source of funds is a standing obligation, not an optional field. Free text is fine.
purpose_of_relationshipOptionalβ€”Why they engaged you. Free text.

1b Β· People

One row per person behind each entity. Entities are verified against a registry; people are verified against documents, and that is impossible without these rows.

Yes β€” client_ref in this file is exactly the same value as the entity’s client_ref in 1a. That is the join. A person attached to Harbour Freight carries client-0001; the same human attached to the trust carries client-0003 on a second row.

There is no β€œdate became client” on a person β€” that belongs to the entity, in 1a. What a person has is appointed_date: when they took the role. For company directors the registry gives us that from the ABN, so you do not need to type it.

What each role actually needs

Everyone goes in the same file. For the four roles we have to verify, all we need from you is a name and an email β€” the person supplies the rest to us. A settlor is a matter of record, so the name alone is enough. Directors we can usually pull from the registry with the ABN, so send them only if it is easy.

RoleNameEmailEverything else
uboYou sendYou sendWe collect
trusteeYou sendYou sendWe collect
partnerYou sendYou sendWe collect
authorised_representativeYou sendYou sendWe collect
directorYou sendIf you have itRegistry, or not needed
settlorYou sendNot neededNot needed

A director who is also a beneficial owner follows the beneficial-owner row. Set role = director and is_beneficial_owner = TRUE and send the full set β€” that is the common case in a small company, and it is how the template’s client-0001 example is filled in.

Where a role appears twice for the same human under different entities β€” Margaret is a client in her own right, the settlor of the trust, and the director of the corporate trustee β€” send all three rows with the same person_ref. We verify her once and link the three.

All fields

FieldLevelApplies whenNotes
client_refMandatoryβ€”Which entity from 1a this person belongs to.
person_refMandatoryβ€”Your identifier for the person. Reuse the same value when the same human appears under several clients β€” that is how we see one person controlling four entities, which is worth seeing.
roleMandatoryβ€”A trust beneficiary goes in as ubo. See accepted values.
is_beneficial_ownerImproves detectionβ€”TRUE if they ultimately own or control the entity. role is the label; this is the substance the regulator cares about.
full_nameMandatoryβ€”Full legal name, as it appears on their ID.
date_of_birthImproves detectionSee per-role tableThe field most often missing in a migration, and it stops verification dead.
ownership_percentageImproves detectionWhen the interest is measurable β€” see noteubo and partner. We apply the 25% beneficial-ownership threshold to this; blank means we cannot compute who qualifies.
emailMandatorySee per-role tableWhere the verification link goes. Each person needs their own β€” one shared office address means only one person can be verified.
residential_address_line1
…_suburb, _state, _postcode
Improves detectionSee per-role tableResidential, not business. A registered office address fails an address check.
country_of_residenceImproves detectionβ€”Determines which verification method and which sanctions lists apply.
phoneOptionalβ€”
nationalityOptionalβ€”
is_pep
pep_details
Optionalβ€”As declared to you. We screen independently.
appointed_date
ceased_date
Optionalβ€”Leave ceased_date blank for current people. Historical people are still worth sending.
place_of_birthOptionalβ€”Improves sanctions match accuracy on common names.
notesOptionalβ€”

2 Β· Transactions

One row per money movement.

Core

FieldLevelApplies whenNotes
client_refMandatoryβ€”The underlying client the money belongs to β€” not your own firm, where you hold client money. See point 03 above.
transaction_refMandatoryβ€”Unique and stable. This is how we avoid double-counting when next month’s file overlaps. The bank’s own reference is ideal.
occurred_atMandatoryβ€”When it happened, with timezone.
amountMandatoryβ€”Positive. Always.
currencyMandatoryβ€”
directionMandatoryβ€”money_in or money_out, from the account’s point of view.
descriptionMandatoryβ€”The bank’s narrative line, verbatim. Please do not clean it up. It is one of the richest signals available and it is already in your export.

The accounts

FieldLevelApplies whenNotes
account_bsb
account_number
Improves detectionβ€”Which of your accounts the money moved through.
account_typeImproves detectionβ€”trust Β· operating Β· general. These behave completely differently; without it we apply one profile to both.
account_nameMandatoryβ€”

The counterparty

FieldLevelApplies whenNotes
counterparty_nameMandatoryβ€”This is what gets screened against sanctions, PEP and adverse-media sources. Blank means no screening happened on that transaction.
counterparty_countryImproves detectionβ€”Drives the high-risk-jurisdiction rules. Blank and we cannot flag a payment into a FATF-listed country.
counterparty_iban
counterparty_swift_bic
Improves detectionrail = international_wireInternational transfers.
counterparty_typeImproves detectionβ€”individual Β· business
counterparty_bsb
counterparty_account_number
Improves detectionrail = npp Β· becsDomestic. Lets us recognise the same counterparty across transactions.

Classification and context

You are the most reliable source for the classification fields. When you declare them we take them as fact; when they are blank we infer, and inference is sometimes wrong.

FieldLevelApplies whenNotes
railImproves detectionβ€”Each rail carries a different risk profile. See accepted values.
balance_afterImproves detectionβ€”Sounds trivial. It is how we detect funds passing straight through β€” in and out, balance returning to near zero. A core layering pattern that is invisible without it.
lifecycle_eventImproves detectionIf not an original paymentDefaults to original_payment.
purposeImproves detectionβ€”Why the money moved. Free text.
related_transaction_refImproves detectionRefunds, reversals and disbursementsLinks a refund to its original, or a disbursement to the receipt that funded it.
channelOptionalβ€”online Β· branch Β· atm Β· api Β· phone
source_statement_ref
notes
Optionalβ€”Helps us reconcile against your statements.

How much history? Twelve months if you have it. Six is workable. Under three months the behavioural baselines have little to learn from, so early monitoring will be noisier while it calibrates.


Accepted values

Anything outside these lists is rejected at import rather than silently mapped to something else.

entity_type
individual Β· sole_trader Β· company Β· trust Β· partnership Β· smsf Β· association Β· government
role
ubo Β· trustee Β· partner Β· director Β· settlor Β· authorised_representative
trust_type
discretionary Β· unit Β· testamentary Β· charitable Β· smsf
partnership_type
general Β· limited Β· incorporated_limited
client_status
active Β· inactive Β· ceased Β· prospective
direction
money_in Β· money_out
account_type
trust Β· operating Β· general
rail
npp Β· becs Β· bpay Β· cash Β· cheque Β· card Β· international_wire Β· internal_transfer
lifecycle_event
original_payment Β· refund Β· reversal Β· fee Β· interest
counterparty_type
individual Β· business
channel
online Β· branch Β· atm Β· api Β· phone

Who to list in 1b

Send everyone who fits. An entity with no rows in 1b cannot be verified β€” it will import and sit as incomplete.

Entity typeWho to list
individual Β· sole_traderThe person, role = ubo, 100%
companyEvery director, plus anyone holding 25% or more
trustThe trustee (or point to the corporate trustee’s own row in 1a), the settlor, and every named beneficiary
partnershipEvery partner
smsfEvery member and every trustee
any of the aboveAnyone with authority to operate the account, as authorised_representative

What happens once you send these

  1. We load the clients and run registry lookups on the entities.
  2. Each person in 1b receives an identity-verification link by email, and is screened against sanctions, PEP and adverse-media sources.
  3. Transactions load and the rules run across the full history β€” so alerts appear for past patterns immediately, not only from today forward.
  4. We walk you through what fired and why, and tune the thresholds to your book before anything becomes an obligation.

Questions, or a field your system cannot produce? Tell us which ones and we will tell you exactly what it costs you in coverage, and whether there is a workaround. Nothing here is worth guessing at.