Detect money mule accounts

Decide whether an account is a money mule, whether the holder is complicit or was deceived by a job or romance scam, and whether to restrict or close it.

Grayson decides whether an account is being used as a money mule, whether the holder is complicit or was deceived by a fake job or romance scam, and whether to keep monitoring, restrict the account and contact the customer, or close it and refer it for a suspicious activity report (SAR). It reads data your institution already holds, from the customer profile and months of transactions to counterparties, devices, linked accounts, reports from other institutions and the customer's own messages, and costs about $0.47 to $0.74 per 1,000 decisions.

  • Decides: Whether an account is passing other people's money through, whether the holder knows, and what to do
  • Call it: When monitoring flags pass-through activity on an account
  • Questions: 1 yes/no, 2 choice, 1 score
  • Cost: $0.00047 to $0.00074 per decision ($0.47 to $0.74 per 1,000) for these examples' 13,501 to 21,061 input tokens
  • Latency: 200 to 309 ms for these examples, the median of 5 calls each through api.finic.ai from US-West

Examples

Three pass-through alerts on personal checking accounts, each sent with 12 months of monthly totals, every posted transaction since August 1 (about 120 to 250 of them), the counterparties, devices and logins, reports from other institutions and what the customer has said. They are a widowed retiree forwarding money for a fiancé she met online, a hairstylist whose new booth-rental business brings in dozens of P2P payers, and a customer selling crypto for cash whose payers include scam victims.

Open in Playground

Open in Playground

Open in Playground

A yes/no answer is Grayson's probability that it's true. A choice answer is the top option and Grayson's confidence: 0% when every option is equally likely, 100% when one option has all the probability. A score answer is the expected level, numbering the levels in its criteria from 0, with its confidence measured the same way and, when no level reaches 70%, each level's probability. A multiple-choice answer lists the options at 50% or more.

  • is_mule: below a threshold chosen on your past alerts, close the alert as a false positive; above it, act on the role and action answers.
  • holder_role: give a close call between complicit and unwitting to an investigator who can call the customer, and send not_in_control to your takeover team.
  • action: send close_and_refer and restrict above their thresholds to your exit and restriction workflows, and everything below them to an analyst queue. The action can be clear while is_mule isn't, as with the crypto seller: dealing crypto for strangers through a personal account, with scam claims against it, calls for an exit whatever the holder's role.

Call it from your code

Save an example as request.json, such as fraud.json, and send it with your API key in GRAYSON_API_KEY:

curl https://api.finic.ai/v1/decide \
  -H "Authorization: Bearer $GRAYSON_API_KEY" \
  -H "Content-Type: application/json" \
  --data @request.json

The problem

A mule account rarely breaks a rule with any single transaction. What gives it away is the shape over days: many unrelated senders, money that leaves within hours, a balance that keeps returning to near zero. Rules that flag that shape also flag roommates splitting rent and small side businesses, and they can't read a customer's message about a new job or an online fiancé.

What to send

Send the account as an analyst would review it, with the alert that raised it. The examples send 12 months of monthly totals and about two months of posted transactions, in 13,500 to 21,000 input tokens.

  • Who sends money in. Many new, unrelated senders with memos like "deposit" or "rent" suggest scam proceeds.
  • How fast and where it leaves. A roughly fixed share left behind after each fast exit can be the mule's cut.
  • Account history against the stated profile. A dormant account suddenly taking in many times its expected volume is a common sign of recruitment.
  • Amounts against limits. Transfers just under a hold threshold, or cash under the $10,000 CTR threshold, show amounts being shaped.
  • Shared devices and accounts. Sharing with other customers points to an organized network, not an isolated, deceived customer.
  • Reports from other institutions. Scam claims, ACH return requests, wire recalls and 314(b) replies are often the strongest evidence of where the money came from and where it went.
  • What the customer has said, word for word. A remote job "processing payments" or a fiancé whose account is "frozen" often separates an unwitting mule from a complicit one.

Add your own policy

Some institutions exit every account that has passed on fraud proceeds, while others keep a deceived long-time customer, stop the money and explain the scam, so put your procedure in the state in your team's words. This one keeps deceived long-time customers after a first occurrence, restricting the account and calling the customer instead of closing it.

Your deceived-customer procedure adds this to the state of the obvious example:

{
  "institution_policy": "Money mule procedure, section 4 (revised 2026-06): For a customer of more than three years whose own messages show they believe the payments are legitimate work or help for someone they trust, and who shares no device, phone number, email or linked external account with other customers: restrict outbound transfers, return any reported funds still in the account to the sending institution, and call the customer to explain the scam. Do not close the account on a first occurrence, even when sending institutions have reported credits as fraud. Close it and refer it to the BSA/AML team only if the activity continues after that call, or if the evidence shows the customer knew the money was stolen. Whether to file a SAR on the activity is decided by the BSA/AML team in every case."
}
QuestionWithoutWith your deceived-customer procedure
is_mule90% true91% true
holder_roleunwitting, confidence 98%unwitting, confidence 99%
fraud_proceeds3.84 of 4, confidence 87%3.84 of 4, confidence 86%
actionclose_and_refer, confidence 80%restrict, confidence 92%

Applied to the obvious-fraud example: the retiree has banked here since 2011, wrote that she forwards the money for a fiancé she trusts, and shares no device, phone number, email or linked account with other customers, so the action moves from closing the account to restricting it and calling her, while her role and the other answers stay the same.

Where to call it

  • On each monitoring alert, before it reaches an analyst, and again when another institution reports a credit.
  • Before money leaves an alerted account, in the payment path for P2P payments, external transfers and wires.
  • When the answer is uncertain, send it to an analyst; whoever contacts the customer must not say whether a SAR has been or will be filed.

Cost and latency

ExampleInput tokensPer decisionPer 1,000 decisionsLatency
Obvious13,501$0.00047$0.47200 ms
Legitimate21,061$0.00074$0.74309 ms
Ambiguous17,953$0.00063$0.63242 ms

You pay only for input tokens, at $0.035 per million, and each request is rounded up to the next millionth of a dollar, so a request with a larger state costs proportionally more; every response reports its size in usage.input_tokens. Latency is the median of 5 calls each through api.finic.ai from US-West, and grows with the number of input tokens. Add your own network time to api.finic.ai.

Evaluate on your own data

Score Grayson on your own past cases before you use it: a CSV with one row per case and a column with the right answer to each question. Every other column is sent as the case.

pipx install https://docs.finic.ai/downloads/grayson_cli-0.4.0-py3-none-any.whl
grayson eval my-cases.csv --questions https://docs.finic.ai/recipes/money-mule-detection/questions.json --label is_mule=<column> --label holder_role=<column> --label fraud_proceeds=<column> --label action=<column>

Each --label names the column with that question's right answer:

  • is_mule: true or false
  • holder_role: complicit, unwitting, not_in_control, no_mule_activity
  • fraud_proceeds: a level, such as "Very likely (over 90%)"
  • action: monitor, restrict, close_and_refer

Or run grayson on its own to set up your questions step by step. You get each question's accuracy and a CSV with Grayson's answer next to yours for every case.

FAQ

Can Grayson tell a complicit mule from one recruited through a job scam?

It can when the evidence is in the state. Long tenure, the customer's usual device, transfers to an account in their own name and a message about a new job point to an unwitting mule; a new account, devices shared with other customers, explanations that change and cash kept under reporting thresholds point to a complicit one. If your team also uses the FBI's middle category, witting (a customer who ignores obvious red flags), add it as an option with that definition.

Do we still file a SAR if the customer was deceived?

Often, yes. The obligation to file depends on what the institution knows or suspects about the transactions, not on whether the customer meant to launder money, so an unwitting mule's activity can still need a SAR. What usually differs is how you treat the customer, and the filing decision stays with your BSA officer.

What if we don't have device data or customer messages?

Send what you have: credits, debits, tenure and the stated profile are usually enough to answer is_mule. Without messages or device data, expect more of holder_role's probability to sit between complicit and unwitting, and route those cases to someone who can call the customer.

On this page