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
A widowed retiree passes $40,425 through her account for a fiancé she met online. A retired, widowed customer since 2011 has taken in $40,425 since September 15 from ten people, two businesses and an elderly wire sender, and sent nearly all of it on within a day to her crypto exchange account, two new P2P payees and a new LLC. She writes that it belongs to a fiancé she met on a dating site in June, and five of the credits have already been reported as scams or business email compromise.
| Question | Grayson's answer |
|---|---|
is_mule | 90% true |
holder_role | unwitting, confidence 98% |
fraud_proceeds | 3.84 of 4, confidence 87% |
action | close_and_refer, confidence 80% |
13,501 input tokens, $0.00047 per decision, answered in 200 ms.
The request, with long lists cut short. The full request is fraud.json (46 KB).
{
"model": "grayson-1",
"state": {
"customer": {
"customer_id": "C-0418827",
"name": "Carol A. Brennan",
"age": 64,
"customer_since": "2011-05-23",
"home": "Toledo, OH; owns the home, at this address since 1998",
"occupation_on_file": "Retired (formerly medical billing specialist)",
"income_on_file": "Social Security and a pension",
"stated_annual_income_usd": 30500,
"expected_activity": {
"monthly_deposits_usd": 2600,
"deposit_sources": "Social Security, pension",
"p2p": "Occasional, family",
"wires": "None expected",
"virtual_currency": "No",
"cash": "Small ATM withdrawals"
},
"identity_verification": "In branch 2011-05-23 with an Ohio driver's license; re-verified 2023-04-18 when the joint owner was removed",
"last_kyc_refresh": "2024-03-11",
"risk_rating": "Low",
"prior_aml_alerts": [],
"prior_sars_filed": 0,
"contact_details": "Mobile phone on file since 2014 and email since 2017; no changes to phone, email or address in the last 24 months",
"products": [
"Personal checking x6604",
"Savings x6611",
"Debit card x4417"
]
},
"accounts": [
{
"account": "Personal checking x6604",
"opened": "2011-05-23",
"owners": "Carol A. Brennan (joint owner Richard J. Brennan removed 2023-04-18, deceased)",
"status": "Open, no restrictions",
"overdraft": "Not enrolled: card purchases decline and ACH debits return when funds are short",
"limits": {
"p2p_per_day_usd": 2500,
"external_transfer_per_day_usd": 3000,
"atm_per_day_usd": 500,
"online_wires": "Not enabled; wires only in branch"
},
"limit_changes": [
"2026-09-12: P2P daily limit raised from $1,000 to $2,500 at the customer's request in the app"
],
"balance_now_usd": 6805.85,
"average_daily_balance_2025_10_to_2026_08_usd": 3415.14
},
{
"account": "Savings x6611",
"opened": "2011-05-23",
"balance_now_usd": 5168.43,
"activity_since_2025_10": "Monthly interest only, and one transfer of $4,000.00 to checking on 2026-08-12"
}
],
"monthly_summary": {
"columns": [
"month",
"credits_usd",
"pay_benefits_and_settlements_usd",
"from_others_usd",
"from_others_count",
"… 7 more in fraud.json"
],
"rows": [
[
"2025-10",
3119.8,
3119.8,
0,
0,
"… 7 more in fraud.json"
],
[
"2025-11",
1895,
1895,
0,
0,
"… 7 more in fraud.json"
],
[
"2025-12",
3169.8,
3119.8,
50,
1,
"… 7 more in fraud.json"
],
[
"2026-01",
2559.4,
2559.4,
0,
0,
"… 7 more in fraud.json"
],
[
"2026-02",
2559.4,
2559.4,
0,
0,
"… 7 more in fraud.json"
],
"… 8 more in fraud.json"
]
},
"devices_and_logins": {
"devices": [
{
"device": "iPhone 12, our iOS app",
"first_seen": "2021-11-03",
"logins_last_90_days": 118,
"other_customers_seen_on_device": 0
},
{
"device": "iPad (9th generation), Safari",
"first_seen": "2019-12-27",
"logins_last_90_days": 31,
"other_customers_seen_on_device": 0
}
],
"login_locations_last_90_days": "All from one residential broadband connection in Toledo, OH and the customer's mobile carrier; no VPN, proxy or hosting-provider addresses",
"remote_access_software_detected": false,
"session_events": [
{
"ts": "2026-07-28T13:02:00Z",
"event": "Password reset with a one-time code sent to the phone on file"
},
{
"ts": "2026-08-12T01:14:00Z",
"event": "External account added: crypto exchange account x7720, instant verification, owner name matches"
},
{
"ts": "2026-09-12T12:03:00Z",
"event": "P2P daily limit increase requested in the app and approved automatically ($1,000 to $2,500)"
},
{
"ts": "2026-09-19T14:05:00Z",
"event": "P2P payee added: Cameron Rowe (phone token); scam warning shown; customer chose 'Paying a business' and continued"
},
{
"ts": "2026-09-30T12:14:00Z",
"event": "P2P payee added: Marcus Teague (email token); scam warning shown; customer chose 'Paying a business' and continued"
}
]
},
"links_to_other_customers": {
"shared_devices": 0,
"shared_phone_numbers": 0,
"shared_emails": 0,
"shared_addresses": 0,
"shared_login_ip_addresses_last_90_days": 0,
"shared_counterparties": [
"P2P payee Cameron Rowe was also paid by 2 other customers of ours since 2026-09-01; both accounts have open mule alerts",
"Wire beneficiary Varnell Ridge Supply LLC also received a wire from 1 other customer of ours on 2026-09-24; that account is restricted pending review"
]
},
"counterparties": {
"note": "Everyone the account received money from or sent money to by P2P, ACH, wire, check or external transfer since 2026-08-01; first_activity is the first item with this counterparty in our records",
"columns": [
"id",
"name",
"kind",
"institution",
"first_activity",
"… 5 more in fraud.json"
],
"rows": [
[
"C01",
"Crypto exchange account x7720",
"Own account at another institution",
"Large US crypto exchange",
"2026-08-12",
"… 5 more in fraud.json"
],
[
"C02",
"Emily Brennan",
"Individual",
"Large national bank",
"2019-06-14",
"… 5 more in fraud.json"
],
[
"C03",
"Sarah Whitcomb",
"Individual",
"Regional bank, TX",
"2026-09-15",
"… 5 more in fraud.json"
],
[
"C04",
"Dana Larkin",
"Individual",
"Credit union, MI",
"2026-09-17",
"… 5 more in fraud.json"
],
[
"C05",
"Travis Brandt",
"Individual",
"Large national bank",
"2026-09-18",
"… 5 more in fraud.json"
],
"… 14 more in fraud.json"
]
},
"transactions": {
"note": "Every posted item from 2026-08-01 to the alert; amounts signed (debits negative); balance is the ledger balance after the item; counterparty refers to the counterparties table",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"counterparty",
"detail"
],
"rows": [
[
"2026-08-02T18:05:18Z",
"card_purchase",
-45.09,
4434,
"KROGER #0547 TOLEDO OH",
null,
"mcc 5411, chip"
],
[
"2026-08-03T11:00:00Z",
"ach_debit",
-162.35,
4271.65,
"UHC MEDSUPP PREMIUM",
null,
"SEC PPD"
],
[
"2026-08-04T12:35:28Z",
"card_purchase",
-19.73,
4251.92,
"TIM HORTONS #2219 TOLEDO OH",
null,
"mcc 5814, contactless"
],
[
"2026-08-04T17:56:52Z",
"card_purchase",
-28.68,
4223.24,
"MARCO'S PIZZA #1043 TOLEDO OH",
null,
"mcc 5814, card not present"
],
[
"2026-08-05T13:00:22Z",
"card_purchase",
-50,
4173.24,
"HOLY ROSARY PARISH GIVING",
null,
"mcc 8661, card on file, recurring"
],
"… 116 more in fraud.json"
]
},
"reports_from_other_institutions": [
{
"received": "2026-10-02T21:40:00Z",
"type": "P2P network scam claim",
"from": "Rafael Valdez's bank (large national bank)",
"about": "P2P credit of $1,500.00 on 2026-09-22 (C08)",
"detail": "Sender says he paid a deposit on a 2-bedroom rental listed online; after he paid, the 'landlord' stopped answering and the house turned out to be occupied by its owner."
},
{
"received": "2026-10-05T13:10:00Z",
"type": "314(b) information request",
"from": "Beneficiary bank for the 2026-09-25 and 2026-10-02 wires (Houston, TX)",
"detail": "Varnell Ridge Supply LLC opened its account on 2026-08-27 and has since received $186,400 in wires from 9 institutions, most of it wired on to an account overseas within a day. The beneficiary bank has restricted the account and asks what we know about our customer's wires."
},
{
"received": "2026-10-05T15:55:00Z",
"type": "ACH request for return (R06) with letter of indemnity",
"from": "ODFI for Calloway Bend Orthodontics PLLC (community bank, KS)",
"about": "CCD credit of $9,460.00 on 2026-09-25 (C10)",
"detail": "The originator paid an equipment vendor's invoice using new bank details received by email. The vendor never changed its details; the email came from a look-alike domain. Requests return of the funds."
},
{
"received": "2026-10-05T19:20:00Z",
"type": "P2P network scam claim",
"from": "Lauren Fenwick's bank (credit union, GA)",
"about": "P2P credit of $975.00 on 2026-09-26 (C12)",
"detail": "Sender paid a deposit on a French bulldog puppy advertised online; the seller stopped responding and asked for more money for 'shipping insurance'."
},
{
"received": "2026-10-06T12:15:00Z",
"type": "Wire recall request",
"from": "Originating bank (regional bank, Scottsdale, AZ)",
"about": "Incoming Fedwire of $7,500.00 on 2026-09-29 from Margaret E. Sorensen (C13)",
"detail": "The originator, 79, says a man she met online asked her to wire the money to release a shipment held at customs, and has since asked for more. Requests return of any funds remaining."
},
{
"received": "2026-10-06T13:02:00Z",
"type": "P2P network scam claim",
"from": "Travis Brandt's bank (large national bank)",
"about": "P2P credit of $2,000.00 on 2026-09-18 (C05)",
"detail": "Sender paid a deposit on a pickup truck listed on an online marketplace; the seller stopped responding and the listing was removed."
}
],
"customer_contact": [
{
"ts": "2026-09-25T18:18:00Z",
"channel": "Branch, wire desk (Sylvania Ave branch)",
"note": "Customer requested an $8,900.00 domestic wire to Varnell Ridge Supply LLC. Purpose given: paying an equipment supplier for her fiancé's company; she showed an invoice on her phone. Asked how long she had known the company: 'about a month'. Standard scam-awareness questions read; customer said nobody was pressuring her. Wire sent after supervisor approval."
},
{
"ts": "2026-09-29T15:20:00Z",
"channel": "Phone, contact center",
"note": "Customer asked why a $1,950.00 check was returned and a $15.00 fee charged. Said the check came from a client of her fiancé's business. Agent explained the paying bank returned it as an altered or fictitious item and that the amount and fee were taken back. Customer said she would let her fiancé know."
},
{
"ts": "2026-10-02T17:52:00Z",
"channel": "Branch, wire desk (Sylvania Ave branch)",
"note": "Customer requested a $6,180.00 wire to the same beneficiary. She was on a phone call during the visit and read the beneficiary details from her phone. Held for wire operations review and callback; released 16:05 local after a callback to the phone on file."
},
{
"ts": "2026-10-02T19:10:00Z",
"channel": "Secure message from customer",
"text": "Why is my wire being held? It is for my fiance Daniel's business. He is an engineer working on an offshore platform and his bank account is frozen until he gets back, so his clients pay him through my account and I send it to his suppliers. I met him in June on a dating site and we talk every day. He is a good man and his supplier is waiting. Please release it today."
},
{
"ts": "2026-10-02T19:35:00Z",
"channel": "Secure message from bank",
"text": "Thank you for your message. Your wire was released at 4:05 PM after we verified it with you by phone. Please call us if you have any other questions."
},
{
"ts": "2026-10-05T19:22:00Z",
"channel": "Secure message from customer",
"text": "Daniel says a client sent $2,500 today and his supplier needs it before Friday. Can you raise my P2P limit to $5,000 so I don't have to keep going to the branch for wires? Thank you, Carol"
}
],
"case_notes": [
{
"ts": "2026-10-06T14:20:00Z",
"note": "Alert assigned. Account not restricted. No outreach to the customer yet; the 2026-10-05 secure message is unanswered."
}
],
"alert": {
"alert_id": "AML-PT-2026-100611",
"created": "2026-10-06T14:05:00Z",
"scenario": "Pass-through activity / possible money mule",
"status": "New",
"rules_fired": [
"PT-01 credits from others in 30 days at least 3x expected monthly deposits ($40,425.00 against $2,600)",
"PT-02 all credits in 30 days at least 2.5x expected monthly deposits ($44,934.40 against $2,600)",
"PT-04 8 or more first-time senders in 30 days (13)",
"PT-05 80% or more of credits from others moved out within 48 hours (94%)",
"PT-09 a sending institution reported an incoming credit as fraud or a scam (5)"
],
"monitoring_model_score": 0.97,
"last_30_days": {
"window": "2026-09-06T14:05:00Z to 2026-10-06T14:05:00Z",
"all_credits_usd": 44934.4,
"pay_benefits_and_settlements_usd": 2559.4,
"credits_from_others_usd": 40425,
"credits_from_others_count": 13,
"distinct_senders": 13,
"first_time_senders": 13,
"expected_monthly_deposits_usd": 2600,
"credits_from_others_moved_out_within_48h_pct": 94,
"out_by_p2p_usd": 11800,
"out_by_external_transfer_usd": 11860,
"out_by_wire_usd": 15080,
"out_as_cash_usd": 160,
"balance_at_end_usd": 6805.85
}
}
},
"questions": {
"is_mule": {
"type": "noul",
"instructions": "Is this account being used as a money mule account, receiving money from other people and passing it on to someone else?"
},
"holder_role": {
"type": "choice",
"instructions": "Which best describes the account holder's part in the money moving through this account?",
"criteria": {
"complicit": "The account holder knowingly moves money for others, for example for a cut of each payment or by selling or renting out the account",
"unwitting": "The account holder moves money for someone else without knowing it is criminal proceeds, for example after being recruited through a fake job offer or an online relationship",
"not_in_control": "Someone other than the account holder controls the account, for example after an account takeover or because it was opened with a stolen identity",
"no_mule_activity": "The account is not being used to move other people's money"
}
},
"fraud_proceeds": {
"type": "score",
"instructions": "How likely is it that most of the money other people sent to this account came from victims of fraud or scams?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"action": {
"type": "choice",
"instructions": "What should the institution do with this account now?",
"criteria": {
"monitor": "Keep the account open without restrictions and continue normal monitoring",
"restrict": "Restrict outbound transfers and cash withdrawals, and contact the customer about the activity",
"close_and_refer": "Close the account and refer it to the BSA/AML team for a suspicious activity report"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_f07e3599bb89427f81ca5c5fceafa84e",
"model": "grayson-1",
"answers": {
"is_mule": {
"type": "noul",
"noul": 0.9047
},
"holder_role": {
"type": "choice",
"choice": "unwitting",
"confidence": 0.982,
"probabilities": {
"complicit": 0.0024,
"unwitting": 0.9865,
"not_in_control": 0.0059,
"no_mule_activity": 0.0052
}
},
"fraud_proceeds": {
"type": "score",
"score": 3.843,
"legend": {
"0": "Very unlikely (under 10%)",
"1": "Unlikely (10-40%)",
"2": "Uncertain (40-60%)",
"3": "Likely (60-90%)",
"4": "Very likely (over 90%)"
},
"confidence": 0.8712,
"probabilities": {
"0": 0.0068,
"1": 0.0113,
"2": 0.0113,
"3": 0.0736,
"4": 0.8969
}
},
"action": {
"type": "choice",
"choice": "close_and_refer",
"confidence": 0.7991,
"probabilities": {
"monitor": 0.0011,
"restrict": 0.1328,
"close_and_refer": 0.866
}
}
},
"usage": {
"input_tokens": 13501,
"output_tokens": 0
}
}Open in Playground
A hairstylist's new booth-rental business brings in dozens of P2P payers a month. A customer since 2017 left her salon job in May to rent a booth, and clients now pay her by P2P (54 payments since August 1), by card through her reader and in cash, while she moves savings to a new account in her own name. The rules fired on the number of senders and the new external account, but the senders are recurring clients paying salon prices, the outflows are booth rent, supplies, taxes and savings, and nobody has reported a payment.
| Question | Grayson's answer |
|---|---|
is_mule | 1% true |
holder_role | no_mule_activity, confidence 96% |
fraud_proceeds | 0.02 of 4, confidence 98% |
action | monitor, confidence 99% |
21,061 input tokens, $0.00074 per decision, answered in 309 ms.
The request, with long lists cut short. The full request is legitimate.json (72 KB).
{
"model": "grayson-1",
"state": {
"customer": {
"customer_id": "C-1173064",
"name": "Alyssa M. Moreland",
"age": 31,
"customer_since": "2017-08-14",
"home": "Raleigh, NC; rents an apartment, at this address since 2023",
"occupation_on_file": "Hair stylist",
"income_on_file": "Employed by Copperleaf Salon Group (as of the last refresh)",
"stated_annual_income_usd": 41000,
"expected_activity": {
"monthly_deposits_usd": 3200,
"deposit_sources": "Payroll",
"p2p": "Occasional",
"wires": "None expected",
"virtual_currency": "No",
"cash": "Occasional"
},
"identity_verification": "In branch 2017-08-14 with a North Carolina driver's license",
"last_kyc_refresh": "2025-01-22",
"risk_rating": "Low",
"prior_aml_alerts": [],
"prior_sars_filed": 0,
"contact_details": "Mobile phone on file since 2017 and email since 2019; address changed 2023-03-30 (moved within Raleigh); no other changes in the last 24 months",
"products": [
"Personal checking x2290",
"Savings x2291",
"Debit card x6148"
]
},
"accounts": [
{
"account": "Personal checking x2290",
"opened": "2017-08-14",
"owners": "Alyssa M. Moreland",
"status": "Open, no restrictions",
"overdraft": "Not enrolled: card purchases decline and ACH debits return when funds are short",
"limits": {
"p2p_per_day_usd": 2500,
"external_transfer_per_day_usd": 5000,
"atm_per_day_usd": 500,
"online_wires": "Not enabled"
},
"limit_changes": [],
"balance_now_usd": 2289.82,
"average_daily_balance_2025_10_to_2026_08_usd": 3225.29
},
{
"account": "Savings x2291",
"opened": "2019-02-02",
"balance_now_usd": 310.44,
"activity_since_2025_10": "Monthly interest only"
}
],
"monthly_summary": {
"columns": [
"month",
"credits_usd",
"pay_benefits_and_settlements_usd",
"from_others_usd",
"from_others_count",
"… 7 more in legitimate.json"
],
"rows": [
[
"2025-10",
3241.54,
2431.54,
810,
2,
"… 7 more in legitimate.json"
],
[
"2025-11",
3362.43,
2497.43,
865,
5,
"… 7 more in legitimate.json"
],
[
"2025-12",
3648.68,
2798.68,
850,
3,
"… 7 more in legitimate.json"
],
[
"2026-01",
4684.24,
3839.24,
845,
3,
"… 7 more in legitimate.json"
],
[
"2026-02",
3537.64,
2707.64,
830,
3,
"… 7 more in legitimate.json"
],
"… 8 more in legitimate.json"
]
},
"devices_and_logins": {
"devices": [
{
"device": "iPhone 13, our iOS app",
"first_seen": "2022-10-08",
"last_seen": "2026-09-20",
"logins_last_90_days": 196,
"other_customers_seen_on_device": 0
},
{
"device": "iPhone 16 Pro, our iOS app",
"first_seen": "2026-09-21",
"logins_last_90_days": 41,
"other_customers_seen_on_device": 0
},
{
"device": "MacBook Air, Safari",
"first_seen": "2023-05-01",
"logins_last_90_days": 12,
"other_customers_seen_on_device": 0
}
],
"login_locations_last_90_days": "Home broadband in Raleigh, NC (shared with one other customer, see links), the customer's mobile carrier, and hotel Wi-Fi in Myrtle Beach, SC on 2026-07-04 and 2026-07-05; no VPN, proxy or hosting-provider addresses",
"remote_access_software_detected": false,
"session_events": [
{
"ts": "2026-08-20T23:41:00Z",
"event": "External account added: online savings account x5512, instant verification, owner name matches"
},
{
"ts": "2026-09-21T18:20:00Z",
"event": "New device (iPhone 16 Pro) at login; step-up passed with a one-time code to the phone on file; the iPhone 13 has not logged in since 2026-09-20"
}
]
},
"links_to_other_customers": {
"shared_devices": 0,
"shared_phone_numbers": 0,
"shared_emails": 0,
"shared_addresses": 1,
"shared_login_ip_addresses_last_90_days": 1,
"detail": [
"Address and home IP address shared with Marco J. Lin, a customer since 2019 with no alerts, who pays the customer $790.00 on or about the 28th each month ('rent + power') since 2024"
],
"shared_counterparties": []
},
"counterparties": {
"note": "Everyone the account received money from or sent money to by P2P, ACH, wire, check or external transfer since 2026-08-01; first_activity is the first item with this counterparty in our records",
"columns": [
"id",
"name",
"kind",
"institution",
"first_activity",
"… 5 more in legitimate.json"
],
"rows": [
[
"C01",
"Shannon Ortiz",
"Individual",
"Online bank",
"2025-11-11",
"… 5 more in legitimate.json"
],
[
"C02",
"Alicia Guzman",
"Individual",
"Large national bank",
"2025-11-19",
"… 5 more in legitimate.json"
],
[
"C03",
"Renee Fisher",
"Individual",
"Large national bank",
"2026-05-26",
"… 5 more in legitimate.json"
],
[
"C04",
"Linden Row Salon Suites LLC",
"Business",
"Regional bank, NC",
"2026-05-04",
"… 5 more in legitimate.json"
],
[
"C05",
"Tamara Long",
"Individual",
"Large national bank",
"2026-08-04",
"… 5 more in legitimate.json"
],
"… 43 more in legitimate.json"
]
},
"transactions": {
"note": "Every posted item from 2026-08-01 to the alert; amounts signed (debits negative); balance is the ledger balance after the item; counterparty refers to the counterparties table",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"counterparty",
"detail"
],
"rows": [
[
"2026-08-01T16:06:39Z",
"card_purchase",
-40.33,
7903.93,
"SHEETZ 0612 RALEIGH NC",
null,
"mcc 5542, chip"
],
[
"2026-08-01T18:16:07Z",
"p2p_in",
55,
7958.93,
"P2P FROM SHANNON ORTIZ",
"C01",
"no memo"
],
[
"2026-08-01T19:21:57Z",
"card_purchase",
-21.15,
7937.78,
"TJ MAXX #0817 RALEIGH NC",
null,
"mcc 5651, chip"
],
[
"2026-08-01T20:49:21Z",
"p2p_in",
52,
7989.78,
"P2P FROM ALICIA GUZMAN",
"C02",
"memo \"bang trim 8/1\""
],
[
"2026-08-01T22:55:23Z",
"p2p_in",
175,
8164.78,
"P2P FROM RENEE FISHER",
"C03",
"no memo"
],
"… 245 more in legitimate.json"
]
},
"reports_from_other_institutions": [
{
"received": "2026-09-10T19:05:00Z",
"type": "P2P network request to return a payment sent in error",
"from": "Monique Pryor's bank (credit union, NC)",
"about": "Two P2P credits of $95.00 a minute apart on 2026-09-10 (C32)",
"detail": "Sender says she paid twice by mistake and asks for one payment back. Customer sent $95.00 back to the sender at 19:31 the same day; the request was closed as resolved."
}
],
"customer_contact": [
{
"ts": "2026-05-14T16:05:00Z",
"channel": "Branch, personal banker (Falls Village branch)",
"note": "Customer asked about a business checking account because she now rents a booth in a salon suite and takes payments from her own clients. Banker explained the documents needed (EIN or DBA filing) and the monthly fee; customer said she would think about it. No business account opened."
},
{
"ts": "2026-09-21T18:34:00Z",
"channel": "Phone, contact center",
"note": "Customer called after a 'new device' text. Confirmed she bought a new iPhone today and that she logged in on it. Verified by one-time code and security questions."
}
],
"case_notes": [
{
"ts": "2026-10-05T13:45:00Z",
"note": "Alert assigned. Account not restricted. No outreach to the customer yet."
}
],
"alert": {
"alert_id": "AML-PT-2026-100504",
"created": "2026-10-05T13:30:00Z",
"scenario": "Pass-through activity / possible money mule",
"status": "New",
"rules_fired": [
"PT-02 all credits in 30 days at least 2.5x expected monthly deposits ($11,236.62 against $3,200)",
"PT-03 25 or more distinct senders in 30 days (31)",
"PT-07 external account linked in the last 60 days received $5,000 or more (x5512, linked 2026-08-20: $8,300.00)"
],
"monitoring_model_score": 0.71,
"last_30_days": {
"window": "2026-09-05T13:30:00Z to 2026-10-05T13:30:00Z",
"all_credits_usd": 11236.62,
"pay_benefits_and_settlements_usd": 4768.62,
"credits_from_others_usd": 5518,
"credits_from_others_count": 33,
"distinct_senders": 31,
"first_time_senders": 6,
"expected_monthly_deposits_usd": 3200,
"credits_from_others_moved_out_within_48h_pct": 18,
"out_by_p2p_usd": 95,
"out_by_external_transfer_usd": 2700,
"out_by_wire_usd": 0,
"out_as_cash_usd": 0,
"balance_at_end_usd": 2289.82
}
}
},
"questions": {
"is_mule": {
"type": "noul",
"instructions": "Is this account being used as a money mule account, receiving money from other people and passing it on to someone else?"
},
"holder_role": {
"type": "choice",
"instructions": "Which best describes the account holder's part in the money moving through this account?",
"criteria": {
"complicit": "The account holder knowingly moves money for others, for example for a cut of each payment or by selling or renting out the account",
"unwitting": "The account holder moves money for someone else without knowing it is criminal proceeds, for example after being recruited through a fake job offer or an online relationship",
"not_in_control": "Someone other than the account holder controls the account, for example after an account takeover or because it was opened with a stolen identity",
"no_mule_activity": "The account is not being used to move other people's money"
}
},
"fraud_proceeds": {
"type": "score",
"instructions": "How likely is it that most of the money other people sent to this account came from victims of fraud or scams?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"action": {
"type": "choice",
"instructions": "What should the institution do with this account now?",
"criteria": {
"monitor": "Keep the account open without restrictions and continue normal monitoring",
"restrict": "Restrict outbound transfers and cash withdrawals, and contact the customer about the activity",
"close_and_refer": "Close the account and refer it to the BSA/AML team for a suspicious activity report"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_ab35d19168d942479717f69ed31a2aff",
"model": "grayson-1",
"answers": {
"is_mule": {
"type": "noul",
"noul": 0.011
},
"holder_role": {
"type": "choice",
"choice": "no_mule_activity",
"confidence": 0.9577,
"probabilities": {
"complicit": 0.0138,
"unwitting": 0.0122,
"not_in_control": 0.0058,
"no_mule_activity": 0.9682
}
},
"fraud_proceeds": {
"type": "score",
"score": 0.023,
"legend": {
"0": "Very unlikely (under 10%)",
"1": "Unlikely (10-40%)",
"2": "Uncertain (40-60%)",
"3": "Likely (60-90%)",
"4": "Very likely (over 90%)"
},
"confidence": 0.9804,
"probabilities": {
"0": 0.9843,
"1": 0.0124,
"2": 0.0007,
"3": 0.0007,
"4": 0.0019
}
},
"action": {
"type": "choice",
"choice": "monitor",
"confidence": 0.9894,
"probabilities": {
"monitor": 0.9929,
"restrict": 0.0025,
"close_and_refer": 0.0046
}
}
},
"usage": {
"input_tokens": 21061,
"output_tokens": 0
}
}Open in Playground
A warehouse lead sells crypto to strangers for cash, and three payers report scams. A customer since 2023 who has bought crypto since 2024 began selling USDT for cash in July and moves each payment to his own exchange account within hours. 41 of 56 payments match orders on a P2P marketplace and he has cooperated, but three payers report scams, 48% of the money came from off-marketplace 'direct trades', and the exchange links one regular buyer's wallet to an investment-scam cluster.
| Question | Grayson's answer |
|---|---|
is_mule | 35% true |
holder_role | no_mule_activity, confidence 55% |
fraud_proceeds | 1.54 of 4, confidence 30% (Very unlikely 11%, Unlikely 44%, Uncertain 27%, Likely 14%, Very likely 3%) |
action | close_and_refer, confidence 90% |
17,953 input tokens, $0.00063 per decision, answered in 242 ms.
The request, with long lists cut short. The full request is ambiguous.json (62 KB).
{
"model": "grayson-1",
"state": {
"customer": {
"customer_id": "C-2290415",
"name": "Ryan P. Castellano",
"age": 28,
"customer_since": "2023-02-06",
"home": "Mesa, AZ; rents an apartment, at this address since 2023",
"occupation_on_file": "Warehouse operations lead",
"income_on_file": "Employed by Sonoran Link Distribution",
"stated_annual_income_usd": 56000,
"expected_activity": {
"monthly_deposits_usd": 4300,
"deposit_sources": "Payroll",
"p2p": "Occasional, friends and family",
"wires": "None expected",
"virtual_currency": "Yes: 'personal investing' (answered at account opening)",
"cash": "Small ATM withdrawals"
},
"identity_verification": "Online at opening 2023-02-06: Arizona driver's license authenticated, selfie match, bureau name, date of birth and SSN match",
"last_kyc_refresh": "2025-02-10",
"risk_rating": "Low (raised to Medium 2026-09-24 when this alert opened)",
"prior_aml_alerts": [],
"prior_sars_filed": 0,
"contact_details": "Mobile phone and email on file since opening; no changes in the last 24 months",
"products": [
"Personal checking x8153",
"Savings x8160",
"Debit card x2076"
]
},
"accounts": [
{
"account": "Personal checking x8153",
"opened": "2023-02-06",
"owners": "Ryan P. Castellano",
"status": "Open, no restrictions",
"overdraft": "Not enrolled: card purchases decline and ACH debits return when funds are short",
"limits": {
"p2p_per_day_usd": 2500,
"external_transfer_per_day_usd": 10000,
"atm_per_day_usd": 500,
"online_wires": "Not enabled"
},
"limit_changes": [
"2026-07-12: instant payments to linked accounts turned on in the app",
"2026-08-03: external transfer daily limit raised from $2,500 to $10,000 at the customer's request, after a one-time code to the phone on file"
],
"balance_now_usd": 9565.56,
"average_daily_balance_2025_10_to_2026_08_usd": 4162.24
},
{
"account": "Savings x8160",
"opened": "2023-02-06",
"balance_now_usd": 1040.12,
"activity_since_2025_10": "Monthly interest only"
}
],
"monthly_summary": {
"columns": [
"month",
"credits_usd",
"pay_benefits_and_settlements_usd",
"from_others_usd",
"from_others_count",
"… 7 more in ambiguous.json"
],
"rows": [
[
"2025-10",
5860.3,
5860.3,
0,
0,
"… 7 more in ambiguous.json"
],
[
"2025-11",
4388.55,
4323.55,
65,
2,
"… 7 more in ambiguous.json"
],
[
"2025-12",
4568.36,
3928.36,
0,
0,
"… 7 more in ambiguous.json"
],
[
"2026-01",
4174.58,
4174.58,
0,
0,
"… 7 more in ambiguous.json"
],
[
"2026-02",
4165.38,
4165.38,
0,
0,
"… 7 more in ambiguous.json"
],
"… 8 more in ambiguous.json"
]
},
"devices_and_logins": {
"devices": [
{
"device": "iPhone 15, our iOS app",
"first_seen": "2023-10-02",
"logins_last_90_days": 402,
"other_customers_seen_on_device": 0
},
{
"device": "Windows PC, Chrome",
"first_seen": "2024-01-15",
"logins_last_90_days": 37,
"other_customers_seen_on_device": 0
}
],
"login_locations_last_90_days": "Home broadband in Mesa, AZ, the customer's mobile carrier and his employer's guest Wi-Fi; 9 sessions on the Windows PC came through a commercial VPN service (exit nodes in Los Angeles and Dallas)",
"remote_access_software_detected": false,
"session_events": [
{
"ts": "2026-07-13T03:12:00Z",
"event": "Instant payments to linked accounts turned on"
},
{
"ts": "2026-08-03T15:40:00Z",
"event": "External transfer daily limit raised from $2,500 to $10,000; step-up passed with a one-time code to the phone on file"
}
]
},
"links_to_other_customers": {
"shared_devices": 0,
"shared_phone_numbers": 0,
"shared_emails": 0,
"shared_addresses": 0,
"shared_login_ip_addresses_last_90_days": 0,
"shared_counterparties": []
},
"counterparties": {
"note": "Everyone the account received money from or sent money to by P2P, ACH, wire, check or external transfer since 2026-08-01; first_activity is the first item with this counterparty in our records",
"columns": [
"id",
"name",
"kind",
"institution",
"first_activity",
"… 5 more in ambiguous.json"
],
"rows": [
[
"C01",
"Curtis Gutierrez",
"Individual",
"Credit union, OH",
"2026-08-02",
"… 5 more in ambiguous.json"
],
[
"C02",
"Crypto exchange account x3391",
"Own account at another institution",
"Large US crypto exchange",
"2024-03-02",
"… 5 more in ambiguous.json"
],
[
"C03",
"Lindsey Herrera",
"Individual",
"Online bank",
"2026-07-17",
"… 5 more in ambiguous.json"
],
[
"C04",
"Carlos Daniels",
"Individual",
"Regional bank, NV",
"2026-08-03",
"… 5 more in ambiguous.json"
],
[
"C05",
"Brittany Ford",
"Individual",
"Regional bank, FL",
"2026-08-04",
"… 5 more in ambiguous.json"
],
"… 23 more in ambiguous.json"
]
},
"transactions": {
"note": "Every posted item from 2026-08-01 to the alert; amounts signed (debits negative); balance is the ledger balance after the item; counterparty refers to the counterparties table",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"counterparty",
"detail"
],
"rows": [
[
"2026-08-02T17:17:48Z",
"p2p_in",
250,
6436.78,
"P2P FROM CURTIS GUTIERREZ",
"C01",
"no memo"
],
[
"2026-08-02T18:11:02Z",
"transfer_out",
-240,
6196.78,
"RTP TO CRYPTO EXCHANGE x3391",
"C02",
null
],
[
"2026-08-02T19:18:57Z",
"card_purchase",
-50.71,
6146.07,
"TACO BELL #031544 MESA AZ",
null,
"mcc 5814, contactless"
],
[
"2026-08-02T19:49:51Z",
"card_purchase",
-70.13,
6075.94,
"WAL-MART #1491 MESA AZ",
null,
"mcc 5310, chip"
],
[
"2026-08-02T21:58:46Z",
"card_purchase",
-44.39,
6031.55,
"DOORDASH*ORDER SAN FRANCISCO CA",
null,
"mcc 5814, card not present"
],
"… 189 more in ambiguous.json"
]
},
"reports_from_other_institutions": [
{
"received": "2026-09-24T16:55:00Z",
"type": "P2P network scam claim",
"from": "Marjorie Prescott's bank (regional bank, OH)",
"about": "P2P credit of $1,450.00 on 2026-09-18 (C20)",
"detail": "Sender, 71, says a caller posing as a federal agent told her that her savings were at risk and had her buy cryptocurrency to 'protect' them, giving her this recipient's details to pay. Funds had already left the account when the claim arrived."
},
{
"received": "2026-10-03T15:30:00Z",
"type": "P2P network scam claim",
"from": "Evan Dorsey's bank (credit union, TX)",
"about": "P2P credit of $900.00 on 2026-10-01 (C27)",
"detail": "Sender says he paid a deposit on a puppy advertised online and the seller stopped answering. Funds had already left the account when the claim arrived."
},
{
"received": "2026-10-05T16:20:00Z",
"type": "P2P network scam claim",
"from": "Aaron Perez's bank (regional bank, FL)",
"about": "P2P credit of $1,500.00 on 2026-09-26 (C23)",
"detail": "Sender says someone they met on a dating app talked them into a joint cryptocurrency investment and told them to pay this recipient to buy the coins for it; they have since been asked for a 'withdrawal fee'. Funds had already left the account when the claim arrived."
},
{
"received": "2026-10-06T18:10:00Z",
"type": "314(b) response from the crypto exchange (our request sent 2026-09-26)",
"from": "Large US crypto exchange (registered money services business)",
"detail": "The customer's exchange account has been open and identity-verified since 2024-03-02, with small recurring purchases until July 2026. From 2026-07-14 to 2026-10-03 it received $43,800.00 from our customer's account, nearly all used to buy USDT. About 52% of that USDT was withdrawn to deposit addresses belonging to a peer-to-peer crypto marketplace and the rest to 4 private wallets. The exchange's blockchain analytics links one of those wallets, which received 1,927 USDT on 2026-09-03 and 1,734 USDT on 2026-09-11, to a cluster reported for investment scams. The exchange has not restricted the account."
}
],
"customer_contact": [
{
"ts": "2026-10-02T17:15:00Z",
"channel": "Phone, outbound call from our fraud investigations team",
"note": "Asked about the many incoming P2P payments. Customer said that since mid-July he has sold USDT on a peer-to-peer crypto marketplace as a side income: buyers pay him by P2P, he releases the coins from the marketplace's escrow when the payment shows, and he buys more at his exchange. He said the marketplace verifies buyers' IDs, that he matches payments by amount and does not read the memos, and that he makes about 3 to 4% a trade. He also trades directly, outside the marketplace and at lower fees, with 'a few regulars' from a chat group. Told him one payment was reported as a scam and that our P2P service is for personal use. He asked whether what he is doing is illegal and agreed to send his trade history. Calm and cooperative throughout."
},
{
"ts": "2026-10-04T22:48:00Z",
"channel": "Secure message from customer",
"text": "Here is my trade history from the marketplace (CSV) and screenshots of some chats with my regular buyers. The direct trades are guys from a trading group I've been in since the summer, I've done a lot of trades with them and never had a problem. Some of them pay from their wife's or their business partner's account, that's normal in the group. I didn't know the lady was scammed, I would never take money like that. I'm stopping for now until I hear back from you. If I open a business account can I keep doing this?"
}
],
"case_notes": [
{
"ts": "2026-09-24T17:40:00Z",
"note": "Alert opened after the first scam claim. Risk rating raised to Medium. Account not restricted."
},
{
"ts": "2026-09-26T21:05:00Z",
"note": "314(b) request sent to the crypto exchange."
},
{
"ts": "2026-10-06T20:30:00Z",
"note": "Reconciled the customer's marketplace export (2026-07-14 to 2026-10-03) against our credits. Of 56 credits from others in that period ($45,350.00), 41 ($23,550.00) match a completed sell order by amount and by time (payment marked received within 25 minutes of our credit). The export shows each buyer's marketplace username and an 'ID verified' badge, not the buyer's legal name, so we cannot confirm the payers were the buyers, and the export is a file the customer downloaded himself; the marketplace has not been asked to confirm it. Two of the three scam-claim credits are matched orders, from buyers with 1 and 3 completed trades on the marketplace; the third (Aaron Perez, 2026-09-26) is a direct trade with @bluefin88. The other 15 credits ($21,800.00) have no marketplace order; the customer says they are direct trades with 4 regular buyers from a chat group, but they came from 6 different payers (he says some regulars pay from a relative's or a business partner's account), and he sent chat screenshots covering 6 of them. Sell prices in the export run 2.9% to 6.4% above the exchange's USDT price at the time (median 3.8%). 6 credits carry memos that don't describe a crypto purchase (\"concert tickets\", \"for Marcus\", \"invoice 4471\", \"loan\", \"puppy deposit\", \"rent deposit\"). The exchange's 314(b) reply links the wallet used for two of @desert_otc's direct trades (paid by Brittany Ford and Kevin Sandoval) to an investment-scam cluster. After the call he received 3 more payments on 2026-10-05 from earlier marketplace buyers and moved them to the exchange."
}
],
"alert": {
"alert_id": "AML-PT-2026-092417",
"created": "2026-09-24T17:40:00Z",
"scenario": "Pass-through activity / possible money mule",
"status": "In review; decision due",
"rules_fired": [
"PT-01 credits from others in 30 days at least 3x expected monthly deposits ($18,640.00 against $4,300)",
"PT-02 all credits in 30 days at least 2.5x expected monthly deposits ($23,182.45 against $4,300)",
"PT-04 8 or more first-time senders in 30 days (8)",
"PT-05 80% or more of credits from others moved out within 48 hours (96%)",
"PT-09 a sending institution reported an incoming credit as fraud or a scam (1)"
],
"monitoring_model_score": 0.88,
"last_30_days": {
"window": "2026-09-07T16:00:00Z to 2026-10-07T16:00:00Z",
"all_credits_usd": 23050.36,
"pay_benefits_and_settlements_usd": 3928.36,
"credits_from_others_usd": 17972,
"credits_from_others_count": 25,
"distinct_senders": 19,
"first_time_senders": 8,
"expected_monthly_deposits_usd": 4300,
"credits_from_others_moved_out_within_48h_pct": 96,
"out_by_p2p_usd": 40,
"out_by_external_transfer_usd": 17220,
"out_by_wire_usd": 0,
"out_as_cash_usd": 0,
"balance_at_end_usd": 9565.56
}
}
},
"questions": {
"is_mule": {
"type": "noul",
"instructions": "Is this account being used as a money mule account, receiving money from other people and passing it on to someone else?"
},
"holder_role": {
"type": "choice",
"instructions": "Which best describes the account holder's part in the money moving through this account?",
"criteria": {
"complicit": "The account holder knowingly moves money for others, for example for a cut of each payment or by selling or renting out the account",
"unwitting": "The account holder moves money for someone else without knowing it is criminal proceeds, for example after being recruited through a fake job offer or an online relationship",
"not_in_control": "Someone other than the account holder controls the account, for example after an account takeover or because it was opened with a stolen identity",
"no_mule_activity": "The account is not being used to move other people's money"
}
},
"fraud_proceeds": {
"type": "score",
"instructions": "How likely is it that most of the money other people sent to this account came from victims of fraud or scams?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"action": {
"type": "choice",
"instructions": "What should the institution do with this account now?",
"criteria": {
"monitor": "Keep the account open without restrictions and continue normal monitoring",
"restrict": "Restrict outbound transfers and cash withdrawals, and contact the customer about the activity",
"close_and_refer": "Close the account and refer it to the BSA/AML team for a suspicious activity report"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_c5705925133540b0b32678548f495d9a",
"model": "grayson-1",
"answers": {
"is_mule": {
"type": "noul",
"noul": 0.3486
},
"holder_role": {
"type": "choice",
"choice": "no_mule_activity",
"confidence": 0.5519,
"probabilities": {
"complicit": 0.1481,
"unwitting": 0.1679,
"not_in_control": 0.02,
"no_mule_activity": 0.6639
}
},
"fraud_proceeds": {
"type": "score",
"score": 1.541,
"legend": {
"0": "Very unlikely (under 10%)",
"1": "Unlikely (10-40%)",
"2": "Uncertain (40-60%)",
"3": "Likely (60-90%)",
"4": "Very likely (over 90%)"
},
"confidence": 0.304,
"probabilities": {
"0": 0.112,
"1": 0.4432,
"2": 0.2688,
"3": 0.1439,
"4": 0.0321
}
},
"action": {
"type": "choice",
"choice": "close_and_refer",
"confidence": 0.8957,
"probabilities": {
"monitor": 0.017,
"restrict": 0.0525,
"close_and_refer": 0.9305
}
}
},
"usage": {
"input_tokens": 17953,
"output_tokens": 0
}
}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 betweencomplicitandunwittingto an investigator who can call the customer, and sendnot_in_controlto your takeover team.action: sendclose_and_referandrestrictabove their thresholds to your exit and restriction workflows, and everything below them to an analyst queue. The action can be clear whileis_muleisn'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.jsonThe 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."
}| Question | Without | With your deceived-customer procedure |
|---|---|---|
is_mule | 90% true | 91% true |
holder_role | unwitting, confidence 98% | unwitting, confidence 99% |
fraud_proceeds | 3.84 of 4, confidence 87% | 3.84 of 4, confidence 86% |
action | close_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
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 13,501 | $0.00047 | $0.47 | 200 ms |
| Legitimate | 21,061 | $0.00074 | $0.74 | 309 ms |
| Ambiguous | 17,953 | $0.00063 | $0.63 | 242 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:trueorfalseholder_role:complicit,unwitting,not_in_control,no_mule_activityfraud_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.
Related recipes
Detect fraudulent incoming ACH credits and transfers
Release, hold or return an incoming credit that may be proceeds of BEC, account takeover or payroll diversion.
Detect account opening fraud and synthetic identities
Approve, step up or decline a deposit account application at risk of stolen or synthetic identity fraud.
Recipes
Every use case, with its questions and cost per decision.
AML alert triage
Decide whether a transaction monitoring alert is explained by what you know about the customer, which typology it fits, how likely it meets the SAR standard, and whether to close it, ask the customer, escalate or file.
Sanctions screening
Grayson compares a screening hit's list entry with your customer record, names the identifiers that rule it out, and picks clear, request information, escalate or block.