Detect business email compromise in vendor payments
Decide whether a change to a vendor's bank details is business email compromise, and whether to release, hold or block the payment, from AP, email and login records.
Grayson decides whether a change to a vendor's bank details is business email compromise (BEC), whether the new account has really been confirmed with the vendor, and whether the next payment should be released, held for a call-back or blocked. It reads the vendor's payment and email history, the change request with its headers, each verification step and the sessions of the users involved, and costs about $0.57 to $0.60 per 1,000 decisions.
- Decides: Catch payments to a vendor's new bank account after a fake or compromised change request.
- Call it: Before a payment goes to a vendor's recently changed bank details
- Questions: 1 score, 1 yes/no, 1 choice
- Cost: $0.00057 to $0.00060 per decision ($0.57 to $0.60 per 1,000) for these examples' 16,229 to 17,259 input tokens
- Latency: 221 to 284 ms for these examples, the median of 5 calls each through api.finic.ai from US-West
Examples
Three payments to vendor bank details changed in the last month, each sent with the vendor record, at least a year of invoices and payments, months of the vendor's email, the customer's other payables and six weeks of sign-ins: a lookalike domain that hijacks a veterinary supplier's invoice thread, a sheet-metal supplier's real move to a new local bank, and a produce distributor's request from its own mailbox that only email has confirmed.
Open in Playground
A lookalike domain hijacks a supplier's invoice thread before a $46,850 payment. Two days after a veterinary group's supplier emailed a genuine $46,850 invoice, a reply in the same thread from a domain one letter off, registered four days earlier, moved payment to a new account in Texas. The AP clerk confirmed it by calling the number in that email, the owner name check returned no match, and the same account was set up for a different vendor at another of our customers.
| Question | Grayson's answer |
|---|---|
bec_likelihood | 3.66 of 4, confidence 84% |
verified_out_of_band | Under 1% true |
action | block_and_alert, confidence 89% |
17,259 input tokens, $0.00060 per decision, answered in 221 ms.
The request, with long lists cut short. The full request is fraud.json (66 KB).
{
"model": "grayson-1",
"state": {
"review": {
"as_of": "2026-10-08T13:06:00Z",
"queue": "Treasury payments fraud review",
"trigger": "Same-day ACH payment approved to vendor bank details changed in the last 30 days",
"rules_fired": [
{
"rule": "PAY-BC30",
"description": "Payment to vendor bank details changed in the last 30 days"
},
{
"rule": "PAY-MAX",
"description": "Amount above the largest earlier payment to this vendor ($41,200.00)"
},
{
"rule": "PAY-RAIL",
"description": "Same-day ACH; this vendor has always been paid by standard ACH"
}
],
"payment_status": "Held for review; same-day ACH cut-off for this payment is 2026-10-08T18:45:00Z"
},
"customer": {
"name": "Alderwick Veterinary Partners, PLLC",
"business": "Three small-animal veterinary clinics (Denver, Lakewood and Aurora, CO); about 48 employees",
"customer_since": "2023-02-14",
"payables_module_since": "2023-02-21",
"accounts": [
{
"account": "Operating checking x0912",
"avg_ledger_balance_90d_usd": 412380.55
},
{
"account": "Payroll checking x0930",
"funding": "Transfer from x0912 every other Thursday"
}
],
"payment_controls": {
"dual_approval_over_usd": 10000,
"vendor_bank_change": "The user making the change must tick an attestation that they called the vendor to confirm; no call details are required",
"daily_ach_limit_usd": 150000,
"same_day_ach": "Enabled 2023-02-21; used twice before (2024-12-31 and 2025-06-30, both rent payments sent late)"
},
"users": [
{
"name": "Ben Carter",
"role": "AP specialist",
"entitlements": "Enter bills, edit vendors, create payments",
"user_since": "2024-02-05",
"devices": [
{
"id": "d-4c1a",
"type": "Windows 11 laptop, Chrome",
"first_seen": "2024-02-05"
}
],
"usual_access": "d-4c1a on the Denver office network, weekdays 07:30-17:00 MT",
"mfa": "Authenticator push"
},
{
"name": "Rachel Moss",
"role": "Controller",
"entitlements": "Approve payments, edit vendors, administer users",
"user_since": "2023-02-14",
"devices": [
{
"id": "d-91e2",
"type": "MacBook, Safari",
"first_seen": "2023-02-14"
},
{
"id": "d-7b30",
"type": "iPhone, mobile app",
"first_seen": "2025-04-02"
}
],
"usual_access": "Denver office or home (Littleton, CO); mobile app for evening approvals",
"mfa": "Authenticator push"
},
{
"name": "Dr. Priya Raman",
"role": "Managing partner",
"entitlements": "View accounts, approve payments",
"user_since": "2023-02-14",
"devices": [
{
"id": "d-22f8",
"type": "iPad, mobile app",
"first_seen": "2023-06-19"
}
],
"usual_access": "Home (Englewood, CO), mostly Saturday mornings",
"mfa": "Authenticator push"
},
{
"name": "Linda Ferro",
"role": "Former AP specialist",
"status": "Disabled 2024-01-31"
}
],
"known_networks": [
{
"label": "Denver office",
"ip": "198.51.100.24",
"type": "Business fiber, Denver, CO",
"first_seen": "2023-02-14"
},
{
"label": "home, Littleton CO",
"ip": "203.0.113.57",
"type": "Residential cable (Rachel Moss)",
"first_seen": "2023-03-02"
},
{
"label": "home, Englewood CO",
"ip": "203.0.113.140",
"type": "Residential fiber (Priya Raman)",
"first_seen": "2023-06-19"
}
]
},
"vendor": {
"vendor_id": "V-00118",
"legal_name": "Bellhaven Veterinary Supply Co.",
"tax_id": "xx-xxx4417",
"category": "Veterinary pharmaceuticals and medical supplies distributor",
"address": "1250 Keystone Ct, Unit B, Broomfield, CO 80020",
"vendor_since": "2023-03-01",
"payment_terms": "Net 10",
"usual_rail": "Standard ACH (CCD+), remittance advice emailed to the remittance email",
"domain_on_file": "bellhavenvetsupply.example.com",
"contacts": [
{
"name": "Karen Liu",
"role": "Accounts receivable",
"email": "billing@bellhavenvetsupply.example.com",
"phone": "+1-303-555-0147",
"on_file_since": "2023-03-01"
},
{
"name": "Tom Alcott",
"role": "Account representative",
"email": "tom.alcott@bellhavenvetsupply.example.com",
"phone": "+1-303-555-0152",
"on_file_since": "2024-01-10"
},
{
"name": "Accounts team",
"role": "Remittance contact",
"email": "accounts@bellhavenvetsuply.example.com",
"phone": "+1-720-555-0189",
"on_file_since": "2026-10-02"
}
],
"bank_accounts": [
{
"bank": "First Wolden Bank, Broomfield, CO",
"routing": "xxxxx2190",
"account": "Business checking x4410",
"added": "2023-03-01",
"status": "Replaced 2026-10-02",
"verification": "Call-back to +1-303-555-0147 on 2023-03-02 by Rachel Moss; owner name check: match",
"payments_received": 56
},
{
"bank": "Quarrystone Commerce Bank, Houston, TX",
"routing": "xxxxx0418",
"account": "Checking x7731",
"added": "2026-10-02",
"status": "Active",
"payments_received": 0
}
],
"master_change_log": [
{
"ts": "2023-03-01T16:22:10Z",
"by": "Rachel Moss",
"change": "Vendor created; bank First Wolden x4410; contact Karen Liu"
},
{
"ts": "2024-01-10T15:41:03Z",
"by": "Linda Ferro",
"change": "Added contact Tom Alcott"
},
{
"ts": "2025-03-17T15:09:47Z",
"by": "Ben Carter",
"change": "Address Unit A to Unit B (from invoice letterhead)"
},
{
"ts": "2026-10-02T17:41:16Z",
"by": "Ben Carter",
"change": "Bank First Wolden x4410 to Quarrystone x7731; remittance email billing@bellhavenvetsupply.example.com to accounts@bellhavenvetsuply.example.com; added phone +1-720-555-0189",
"attestation": "Called the vendor to confirm",
"source_document": "Email of 2026-10-02 16:48 UTC (.eml uploaded)"
}
]
},
"vendor_payment_history": {
"summary": "56 payments since 2023-03, all by standard ACH to First Wolden x4410, none returned; monthly orders $9,800 to $22,400, quarterly stock orders $28,410.50 to $41,200.00",
"columns": [
"invoice",
"invoice_date",
"kind",
"amount_usd",
"due",
"… 5 more in fraud.json"
],
"rows": [
[
"INV-14498",
"2023-03-17",
"Monthly order",
16423,
"2023-03-27",
"… 5 more in fraud.json"
],
[
"INV-14604",
"2023-04-14",
"Monthly order",
11377.4,
"2023-04-24",
"… 5 more in fraud.json"
],
[
"INV-14723",
"2023-05-12",
"Monthly order",
10475.64,
"2023-05-22",
"… 5 more in fraud.json"
],
[
"INV-14825",
"2023-06-13",
"Monthly order",
12790.23,
"2023-06-23",
"… 5 more in fraud.json"
],
[
"INV-14951",
"2023-07-04",
"Quarterly stock order",
28410.5,
"2023-07-14",
"… 5 more in fraud.json"
],
"… 51 more in fraud.json"
]
},
"vendor_email_history": {
"mailbox": "ap@alderwickvet.example.com, connected to our payables module since 2023-02-21 (inbound mail from the vendor's domains)",
"before_period": "2023-03 to 2025-09: 71 messages from bellhavenvetsupply.example.com (billing@ and tom.alcott@), all SPF, DKIM and DMARC pass, all sent through the vendor's Microsoft 365 tenant",
"columns": [
"received",
"from",
"subject",
"auth_spf_dkim_dmarc",
"sent_via",
"attachments"
],
"rows": [
[
"2025-10-01T13:34:27Z",
"billing@bellhavenvetsupply.example.com",
"Bellhaven Veterinary Supply - Statement Sep",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Statement.pdf"
],
[
"2025-10-06T20:48:19Z",
"billing@bellhavenvetsupply.example.com",
"Bellhaven Invoice INV-18984 - Quarterly stock order",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"INV-18984.pdf"
],
[
"2025-10-10T19:48:19Z",
"billing@bellhavenvetsupply.example.com",
"Bellhaven Invoice INV-19085 - Monthly order",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"INV-19085.pdf"
],
[
"2025-10-22T20:18:40Z",
"tom.alcott@bellhavenvetsupply.example.com",
"Order confirmation SO-88756",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"SO-88756.pdf"
],
[
"2025-11-03T16:56:30Z",
"billing@bellhavenvetsupply.example.com",
"Bellhaven Veterinary Supply - Statement Oct",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Statement.pdf"
],
"… 39 more in fraud.json"
]
},
"payables_last_60_days": {
"period": "2026-08-12 to 2026-10-07",
"note": "Payments created in our payables module from operating account x0912, excluding the payment under review. Payment runs are created on Wednesdays for Thursday settlement.",
"columns": [
"created",
"payee",
"reference",
"amount_usd",
"rail",
"… 4 more in fraud.json"
],
"rows": [
[
"2026-08-12",
"Clearwater Linen Service",
"CW30120",
518.59,
"ACH",
"… 4 more in fraud.json"
],
[
"2026-08-12",
"Pinecrest Reference Laboratory",
"PRL-58211",
2321.54,
"ACH",
"… 4 more in fraud.json"
],
[
"2026-08-12",
"Range Animal Nutrition",
"RAN-7714",
6205.91,
"ACH",
"… 4 more in fraud.json"
],
[
"2026-08-12",
"Talus Pet Crematory",
"TPC-2209",
1025.21,
"ACH",
"… 4 more in fraud.json"
],
[
"2026-08-19",
"Bellhaven Veterinary Supply Co.",
"INV-20561",
18521.85,
"ACH",
"… 4 more in fraud.json"
],
"… 43 more in fraud.json"
]
},
"online_banking_sessions": {
"period": "2026-08-24 to 2026-10-08",
"note": "One row per sign-in",
"columns": [
"start",
"user",
"device",
"network",
"sign_in",
"minutes",
"activity"
],
"rows": [
[
"2026-08-24T14:26:21Z",
"Ben Carter",
"d-4c1a",
"Denver office",
"password + push",
15,
"entered 4 bills"
],
[
"2026-08-25T14:45:13Z",
"Ben Carter",
"d-4c1a",
"Denver office",
"password + push",
6,
"entered 6 bills"
],
[
"2026-08-26T20:11:49Z",
"Ben Carter",
"d-4c1a",
"Denver office",
"password + push",
35,
"entered 2 bills; created 8 payments ($50,077.98)"
],
[
"2026-08-27T13:34:08Z",
"Rachel Moss",
"d-91e2",
"home, Littleton CO",
"password + push",
8,
"approved 2 payments ($26,050.00)"
],
[
"2026-08-27T14:25:10Z",
"Rachel Moss",
"d-91e2",
"Denver office",
"password + push",
15,
"viewed balances"
],
"… 49 more in fraud.json"
]
},
"invoice": {
"number": "INV-20931",
"invoice_date": "2026-09-29",
"received": "2026-09-30T15:05:12Z",
"from": "billing@bellhavenvetsupply.example.com",
"description": "Q4 quarterly stock order",
"lines": [
{
"item": "Vaccines (canine and feline core, rabies)",
"amount_usd": 22310
},
{
"item": "Surgical consumables",
"amount_usd": 13975.5
},
{
"item": "Anesthesia and IV fluids",
"amount_usd": 7842.25
},
{
"item": "Dental supplies",
"amount_usd": 2722.25
}
],
"amount_usd": 46850,
"due": "2026-10-09",
"remit_to_printed_on_invoice": "First Wolden Bank, account ending 4410",
"goods_received": "Delivered 2026-10-01 to all three clinics; receipt logged by each clinic manager",
"thread": [
{
"ts": "2026-09-30T15:05:12Z",
"from": "billing@bellhavenvetsupply.example.com",
"cc": "tom.alcott@bellhavenvetsupply.example.com",
"text": "Hi Ben, please find attached INV-20931 for the Q4 stock order shipping 10/1. Thanks, Karen Liu, Accounts Receivable"
},
{
"ts": "2026-09-30T16:20:44Z",
"from": "ap@alderwickvet.example.com (Ben Carter)",
"cc": "tom.alcott@bellhavenvetsupply.example.com",
"text": "Thanks Karen, INV-20931 is scheduled for 10/8."
}
]
},
"bank_change_request": {
"received": "2026-10-02T16:48:31Z",
"channel": "Email to the customer's AP mailbox, as a reply in the INV-20931 thread",
"headers": {
"From": "\"Karen Liu | Bellhaven Billing\" <billing@bellhavenvetsuply.example.com>",
"Reply-To": "accounts@bellhavenvetsuply.example.com",
"To": "Ben Carter <ap@alderwickvet.example.com>",
"Cc": "",
"Subject": "RE: Bellhaven Invoice INV-20931 - Q4 stock order",
"Date": "Fri, 2 Oct 2026 11:48:22 -0500",
"Message-ID": "<20261002164822.7f3a91c2@mail.bellhavenvetsuply.example.com>",
"In-Reply-To": "<a83c1e0f9b2d4e7a@ap.alderwickvet.example.com>",
"Return-Path": "<bounce-7731@bellhavenvetsuply.example.com>",
"Received": "from mail.bellhavenvetsuply.example.com (203.0.113.88) by our mail gateway; Fri, 2 Oct 2026 16:48:31 +0000",
"Authentication-Results": "spf=pass smtp.mailfrom=bellhavenvetsuply.example.com; dkim=pass header.d=bellhavenvetsuply.example.com; dmarc=none (no record) header.from=bellhavenvetsuply.example.com"
},
"gateway_analysis": {
"sender_domain": "bellhavenvetsuply.example.com",
"vendor_domain_on_file": "bellhavenvetsupply.example.com",
"domain_similarity": "One character different from the vendor's domain on file",
"sender_domain_registered": "2026-09-28T19:02:00Z",
"first_message_from_sender_domain_seen_by_us": "2026-10-02T16:48:31Z (any customer)",
"sending_ip": "203.0.113.88, hosting provider, Amsterdam, NL; none of the vendor's 112 earlier messages came from it",
"display_name": "Matches the vendor contact on file (Karen Liu)",
"thread": "Quotes the INV-20931 thread including Ben Carter's reply of 2026-09-30; the Cc to tom.alcott@bellhavenvetsupply.example.com was removed"
},
"body": "Hi Ben,\n\nThank you for confirming the payment date. Please note that following our annual audit we have moved our banking to Quarrystone Commerce Bank. Kindly update our remittance details using the attached letter before you release payment for INV-20931. Our First Wolden account is being closed on October 9, so any payment sent there after that date will be returned and may delay your next order.\n\nOur main line is being upgraded this week, so for any questions please call our accounts team directly at +1-720-555-0189 or write to accounts@bellhavenvetsuply.example.com.\n\nKind regards,\nKaren Liu\nAccounts Receivable | Bellhaven Veterinary Supply Co.\n\n> On Wed, Sep 30, 2026, Ben Carter wrote:\n> Thanks Karen, INV-20931 is scheduled for 10/8.",
"attachments": [
{
"name": "Bellhaven_Remittance_Update.pdf",
"pages": 1,
"pdf_producer": "Microsoft: Print To PDF",
"pdf_created": "2026-10-02T15:58:40Z",
"content": "Letter on Bellhaven letterhead dated October 1, 2026, unsigned: new bank Quarrystone Commerce Bank, routing ending 0418, account ending 7731, account name 'Bellhaven Veterinary Supply'; payments to be sent there effective immediately"
}
],
"later_messages": [
{
"ts": "2026-10-02T18:05:51Z",
"from": "ap@alderwickvet.example.com (Ben Carter)",
"to": "accounts@bellhavenvetsuply.example.com",
"text": "Hi Karen, updated on our side. Thanks."
},
{
"ts": "2026-10-05T15:22:10Z",
"from": "accounts@bellhavenvetsuply.example.com",
"text": "Hi Ben, thank you. Can you confirm INV-20931 will go out before the 9th?"
},
{
"ts": "2026-10-05T16:40:02Z",
"from": "ap@alderwickvet.example.com (Ben Carter)",
"to": "accounts@bellhavenvetsuply.example.com",
"text": "Yes, scheduled for 10/8."
},
{
"ts": "2026-10-07T14:51:37Z",
"from": "accounts@bellhavenvetsuply.example.com",
"text": "Hi Ben, please send INV-20931 by same-day ACH so the funds land in the new account before the old one closes on the 9th, and send the remittance advice to this address. Thank you for your help. Karen"
}
]
},
"verification_and_changes": [
{
"ts": "2026-10-02T17:20:05Z",
"type": "phone_call",
"by": "Ben Carter",
"number_dialed": "+1-720-555-0189",
"number_source": "Body and signature of the 2026-10-02 change-request email; not on the vendor record before the request",
"duration": "4 min 12 s",
"note": "Spoke with Karen in accounts, who confirmed the new account details"
},
{
"ts": "2026-10-02T17:41:16Z",
"type": "vendor_bank_details_changed",
"by": "Ben Carter",
"device": "d-4c1a",
"network": "Denver office",
"attestation": "Called the vendor to confirm"
},
{
"ts": "2026-10-02T17:42:03Z",
"type": "micro_deposits_sent",
"to": "Quarrystone x7731",
"detail": "Two credits under $1.00, settling 2026-10-05"
},
{
"ts": "2026-10-05T14:30:18Z",
"type": "micro_deposits_confirmed",
"detail": "Both amounts entered correctly through a link emailed to accounts@bellhavenvetsuply.example.com (the remittance email set on 2026-10-02)"
}
],
"account_validation": {
"checked_at": "2026-10-02T17:41:22Z",
"service": "Account validation network (bank-reported account data)",
"account": "Quarrystone Commerce Bank, routing ending 0418, account x7731",
"account_status": "Open, valid",
"can_receive_ach_credits": true,
"owner_name_checked": "Bellhaven Veterinary Supply Co.",
"owner_name_result": "No match",
"routing_directory": "Quarrystone Commerce Bank, Houston, TX"
},
"vendor_network": {
"matched_on": "Vendor tax ID xx-xxx4417",
"other_customers_paying_vendor": 6,
"bank_on_file_at_other_customers": "All 6: First Wolden Bank x4410",
"recent_payments_to_old_account": "4 payments from 3 customers to First Wolden x4410 between 2026-09-29 and 2026-10-06 (latest $12,906.40 on 2026-10-06), all settled, none returned",
"bank_change_requests_at_other_customers": "None recorded",
"new_account_elsewhere": "Quarrystone x7731 was added on 2026-09-30 by one other customer of ours as the remittance account of a different vendor (a laboratory supply company); one payment of $18,420.00 sent there on 2026-10-01"
},
"payment_under_review": {
"payment_id": "PMT-0094417",
"invoice": "INV-20931",
"amount_usd": 46850,
"rail": "Same-day ACH (CCD+)",
"effective_date": "2026-10-08",
"destination": "Quarrystone Commerce Bank x7731",
"remittance_advice_to": "accounts@bellhavenvetsuply.example.com",
"memo": "Per vendor, funds must reach new account before 10/9",
"created": {
"ts": "2026-10-07T21:40:09Z",
"by": "Ben Carter",
"device": "d-4c1a",
"network": "Denver office"
},
"approved": {
"ts": "2026-10-08T13:05:41Z",
"by": "Rachel Moss",
"device": "d-91e2",
"network": "home, Littleton CO"
}
}
},
"questions": {
"bec_likelihood": {
"type": "score",
"instructions": "How likely is it that the change to the vendor's bank details is fraudulent, that is, requested by someone impersonating the vendor or made through a compromised email account or login, rather than requested by the vendor?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"verified_out_of_band": {
"type": "noul",
"instructions": "Has the vendor confirmed the new bank details through a channel the requester could not control, such as a call to a phone number that was on file before the change was requested?"
},
"action": {
"type": "choice",
"instructions": "What should happen to the vendor payment under review?",
"criteria": {
"release": "Release the payment to the new bank account",
"hold_and_verify": "Hold the payment until the vendor confirms the new bank details on a call to a phone number that was on file before the change",
"block_and_alert": "Cancel the payment, restore the vendor's previous verified bank details and alert the customer to suspected business email compromise"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_dc7701a46bcb4bc399005c5af2a58f0b",
"model": "grayson-1",
"answers": {
"bec_likelihood": {
"type": "score",
"score": 3.658,
"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.8429,
"probabilities": {
"0": 0.0493,
"1": 0.0264,
"2": 0.016,
"3": 0.0339,
"4": 0.8744
}
},
"verified_out_of_band": {
"type": "noul",
"noul": 0.0004
},
"action": {
"type": "choice",
"choice": "block_and_alert",
"confidence": 0.8945,
"probabilities": {
"release": 0.003,
"hold_and_verify": 0.0673,
"block_and_alert": 0.9297
}
}
},
"usage": {
"input_tokens": 17259,
"output_tokens": 0
}
}Open in Playground
A supplier of seven years moves banks, confirmed on the number on file. An HVAC contractor's sheet-metal supplier sent a signed notice of a new local bank, and the AP manager confirmed the account digits with the supplier's controller on the phone number on file since 2019. The payment is the largest yet and was approved from a new phone at a Las Vegas hotel, but it matches a purchase order and three other customers of ours confirmed the same change by phone.
| Question | Grayson's answer |
|---|---|
bec_likelihood | 0.01 of 4, confidence over 99% |
verified_out_of_band | Over 99% true |
action | release, confidence over 99% |
16,229 input tokens, $0.00057 per decision, answered in 256 ms.
The request, with long lists cut short. The full request is legitimate.json (61 KB).
{
"model": "grayson-1",
"state": {
"review": {
"as_of": "2026-10-06T22:48:00Z",
"queue": "Treasury payments fraud review",
"trigger": "Payment approved to vendor bank details changed in the last 30 days",
"rules_fired": [
{
"rule": "PAY-BC30",
"description": "Payment to vendor bank details changed in the last 30 days"
},
{
"rule": "PAY-MAX",
"description": "Amount above the largest earlier payment to this vendor ($27,900.00)"
},
{
"rule": "USR-NEWDEV",
"description": "Approved from a device registered in the last 7 days, at a network first seen in the last 7 days"
}
],
"payment_status": "Held for review; standard ACH file for 2026-10-07 settlement closes 2026-10-07T14:00:00Z"
},
"customer": {
"name": "Sandvale Mechanical, Inc.",
"business": "Commercial HVAC and plumbing contractor, Columbus, OH; about 60 employees",
"customer_since": "2019-08-20",
"payables_module_since": "2019-09-03",
"accounts": [
{
"account": "Operating checking x3381",
"avg_ledger_balance_90d_usd": 688240.17
},
{
"account": "Payroll checking x3399",
"funding": "Transfer from x3381 every other Friday"
},
{
"account": "Revolving line of credit x3402",
"limit_usd": 750000,
"outstanding_usd": 0
}
],
"payment_controls": {
"dual_approval_at_or_over_usd": 15000,
"vendor_bank_change": "Call-back to a phone number already on the vendor record, with a call note; a second user must review the change before it takes effect",
"wires": "Two approvers",
"daily_ach_limit_usd": 250000
},
"users": [
{
"name": "Megan Pruitt",
"role": "Office and AP manager",
"entitlements": "Enter bills, edit vendors, create payments",
"user_since": "2019-08-20",
"devices": [
{
"id": "d-5a07",
"type": "Windows 11 desktop, Edge",
"first_seen": "2022-11-14"
}
],
"usual_access": "d-5a07 on the Columbus office network, weekdays 07:00-16:30 ET",
"mfa": "Authenticator push"
},
{
"name": "Greg Haskins",
"role": "CFO",
"entitlements": "Approve payments, review vendor changes, administer users",
"user_since": "2019-08-20",
"devices": [
{
"id": "d-c3e9",
"type": "Surface laptop, Chrome",
"first_seen": "2024-03-08"
},
{
"id": "d-1f62",
"type": "iPhone, mobile app",
"first_seen": "2023-05-11",
"status": "Removed by user 2026-10-03"
},
{
"id": "d-8d4b",
"type": "iPhone, mobile app",
"first_seen": "2026-10-03"
}
],
"usual_access": "Office or home (Dublin, OH); mobile app for evening approvals",
"locations_last_12_months": "Columbus area; Las Vegas, NV 2025-10-06 to 2025-10-09 (mobile app); Naples, FL 2026-03-21 to 2026-03-28 (mobile app)",
"mfa": "Authenticator push; Face ID in the mobile app"
},
{
"name": "Daniel Ostrowski",
"role": "President",
"entitlements": "View accounts, approve payments and wires",
"user_since": "2019-08-20",
"devices": [
{
"id": "d-77aa",
"type": "MacBook, Safari",
"first_seen": "2021-04-30"
}
],
"usual_access": "Home (Upper Arlington, OH), early in the month",
"mfa": "Authenticator push"
}
],
"known_networks": [
{
"label": "Columbus office",
"ip": "198.51.100.61",
"type": "Business cable, Columbus, OH",
"first_seen": "2019-08-20"
},
{
"label": "home, Dublin OH",
"ip": "203.0.113.19",
"type": "Residential fiber (Greg Haskins)",
"first_seen": "2020-03-16"
},
{
"label": "home, Upper Arlington OH",
"ip": "203.0.113.203",
"type": "Residential cable (Daniel Ostrowski)",
"first_seen": "2021-04-30"
},
{
"label": "hotel Wi-Fi, Las Vegas NV",
"ip": "192.0.2.77",
"type": "Hotel network, Las Vegas, NV",
"first_seen": "2026-10-05"
}
]
},
"vendor": {
"vendor_id": "V-0042",
"legal_name": "Larkspur Sheet Metal Supply, Inc.",
"tax_id": "xx-xxx8803",
"category": "Sheet metal, ductwork and HVAC fittings distributor",
"address": "2290 Fairwood Industrial Pkwy, Columbus, OH 43207",
"vendor_since": "2019-09-03",
"payment_terms": "Net 30",
"usual_rail": "Standard ACH (CCD+), remittance advice emailed",
"domain_on_file": "larkspursheetmetal.example.com",
"contacts": [
{
"name": "Janet Kowalczyk",
"role": "Controller",
"email": "jkowalczyk@larkspursheetmetal.example.com",
"phone": "+1-614-555-0123",
"on_file_since": "2019-09-03 (email added 2021-02-10)"
},
{
"name": "Invoicing",
"email": "invoices@larkspursheetmetal.example.com",
"on_file_since": "2019-09-03"
},
{
"name": "Ray Delgado",
"role": "Outside sales",
"email": "rdelgado@larkspursheetmetal.example.com",
"phone": "+1-614-555-0127",
"on_file_since": "2022-04-11"
},
{
"name": "Remittance advices",
"email": "ar@larkspursheetmetal.example.com",
"on_file_since": "2026-09-15"
}
],
"bank_accounts": [
{
"bank": "Fernhill National Bank, Columbus, OH",
"routing": "xxxxx0115",
"account": "Business checking x2208",
"added": "2019-09-03",
"status": "Replaced 2026-09-15",
"verification": "Call-back to +1-614-555-0123 on 2019-09-04 by Megan Pruitt; owner name check: match",
"payments_received": 169
},
{
"bank": "Alder Point Bank, Columbus, OH",
"routing": "xxxxx0277",
"account": "Business checking x5512",
"added": "2026-09-15",
"status": "Active",
"payments_received": 0
}
],
"master_change_log": [
{
"ts": "2019-09-03T14:02:55Z",
"by": "Megan Pruitt",
"change": "Vendor created; bank Fernhill x2208; contact Janet Kowalczyk"
},
{
"ts": "2021-02-10T16:20:31Z",
"by": "Megan Pruitt",
"change": "Added email jkowalczyk@larkspursheetmetal.example.com"
},
{
"ts": "2022-04-11T13:47:09Z",
"by": "Megan Pruitt",
"change": "Added contact Ray Delgado"
},
{
"ts": "2023-07-18T15:30:12Z",
"by": "Megan Pruitt",
"change": "Address 880 Marion Rd to 2290 Fairwood Industrial Pkwy",
"verification": "Call-back to +1-614-555-0123; spoke with Janet Kowalczyk",
"reviewed_by": "Greg Haskins"
},
{
"ts": "2026-09-15T14:18:37Z",
"by": "Megan Pruitt",
"change": "Bank Fernhill x2208 to Alder Point x5512; added remittance email ar@larkspursheetmetal.example.com",
"attestation": "Called the vendor at a number on file",
"call_note_attached": true,
"source_document": "Email of 2026-09-14 13:22 UTC (.eml uploaded)",
"reviewed_by": "Greg Haskins, 2026-09-15T17:02:11Z"
}
]
},
"vendor_payment_history": {
"before_period": "2019-09 to 2025-03: 135 payments totaling $1,386,412.55, all by standard ACH to Fernhill x2208, none returned; largest $24,310.00 (2024-05)",
"columns": [
"invoice",
"po",
"invoice_date",
"amount_usd",
"due",
"… 5 more in legitimate.json"
],
"rows": [
[
"LSM-114515",
"PO 3920",
"2025-03-21",
9594.95,
"2025-04-20",
"… 5 more in legitimate.json"
],
[
"LSM-114590",
"PO 3940",
"2025-04-04",
22234.37,
"2025-05-04",
"… 5 more in legitimate.json"
],
[
"LSM-114674",
"PO 3960",
"2025-04-21",
9566.15,
"2025-05-21",
"… 5 more in legitimate.json"
],
[
"LSM-114814",
"PO 3977",
"2025-05-05",
10706.79,
"2025-06-04",
"… 5 more in legitimate.json"
],
[
"LSM-114952",
"PO 3992",
"2025-05-19",
21080.01,
"2025-06-18",
"… 5 more in legitimate.json"
],
"… 29 more in legitimate.json"
]
},
"vendor_email_history": {
"mailbox": "ap@sandvalemech.example.com, connected to our payables module since 2019-09-03 (inbound mail from the vendor's domain)",
"before_period": "2019-09 to 2025-09: 212 messages from larkspursheetmetal.example.com (invoices@, jkowalczyk@, rdelgado@), all SPF, DKIM and DMARC pass, all sent through the vendor's Google Workspace tenant",
"columns": [
"received",
"from",
"subject",
"auth_spf_dkim_dmarc",
"sent_via",
"attachments"
],
"rows": [
[
"2025-10-01T11:48:06Z",
"invoices@larkspursheetmetal.example.com",
"Statement of account - Sep",
"pass/pass/pass",
"Google Workspace (vendor tenant)",
"Statement.pdf"
],
[
"2025-10-03T13:37:31Z",
"invoices@larkspursheetmetal.example.com",
"Invoice LSM-116048 (PO 4124)",
"pass/pass/pass",
"Google Workspace (vendor tenant)",
"LSM-116048.pdf"
],
[
"2025-10-14T19:52:36Z",
"rdelgado@larkspursheetmetal.example.com",
"Quote Q-22340",
"pass/pass/pass",
"Google Workspace (vendor tenant)",
"Q-22340.pdf"
],
[
"2025-10-20T16:46:11Z",
"invoices@larkspursheetmetal.example.com",
"Invoice LSM-116123 (PO 4139)",
"pass/pass/pass",
"Google Workspace (vendor tenant)",
"LSM-116123.pdf"
],
[
"2025-11-03T12:49:04Z",
"invoices@larkspursheetmetal.example.com",
"Statement of account - Oct",
"pass/pass/pass",
"Google Workspace (vendor tenant)",
"Statement.pdf"
],
"… 42 more in legitimate.json"
]
},
"payables_last_60_days": {
"period": "2026-08-11 to 2026-10-06",
"note": "Payments created in our payables module from operating account x3381, excluding the payment under review. Payment runs are created on Tuesdays for Wednesday settlement.",
"columns": [
"created",
"payee",
"reference",
"amount_usd",
"rail",
"… 4 more in legitimate.json"
],
"rows": [
[
"2026-08-11",
"Brightwater Fleet Fuel",
"Fuel stmt 7703",
2497.52,
"ACH",
"… 4 more in legitimate.json"
],
[
"2026-08-11",
"Coldline Refrigerant Supply",
"CRS-1189",
5429.33,
"ACH",
"… 4 more in legitimate.json"
],
[
"2026-08-11",
"Delmar Insulation LLC",
"Draw 341",
8485.16,
"ACH",
"… 4 more in legitimate.json"
],
[
"2026-08-11",
"Grantley Pipe & Valve",
"GPV248138",
3018.36,
"ACH",
"… 4 more in legitimate.json"
],
[
"2026-08-11",
"Heron Electrical Supply",
"HES-90118",
1801.73,
"ACH",
"… 4 more in legitimate.json"
],
"… 49 more in legitimate.json"
]
},
"online_banking_sessions": {
"period": "2026-08-22 to 2026-10-06",
"note": "One row per sign-in",
"columns": [
"start",
"user",
"device",
"network",
"sign_in",
"minutes",
"activity"
],
"rows": [
[
"2026-08-24T12:14:36Z",
"Megan Pruitt",
"d-5a07",
"Columbus office",
"password + push",
40,
"entered 3 bills"
],
[
"2026-08-25T13:41:22Z",
"Greg Haskins",
"d-c3e9",
"Columbus office",
"password + push",
16,
"downloaded statements"
],
[
"2026-08-25T14:15:18Z",
"Megan Pruitt",
"d-5a07",
"Columbus office",
"password + push",
55,
"entered 8 bills; created 6 payments ($36,855.49)"
],
[
"2026-08-25T20:47:43Z",
"Greg Haskins",
"d-c3e9",
"Columbus office",
"password + push",
6,
"approved 1 payment ($18,500.00)"
],
[
"2026-08-26T13:10:11Z",
"Greg Haskins",
"d-c3e9",
"Columbus office",
"password + push",
21,
"ran cash forecast"
],
"… 42 more in legitimate.json"
]
},
"invoice": {
"number": "LSM-118204",
"po": "PO 4471, Riverside Commons rooftop unit replacement, ductwork package",
"invoice_date": "2026-09-08",
"received": "2026-09-08T15:44:26Z",
"from": "invoices@larkspursheetmetal.example.com",
"amount_usd": 38615.4,
"due": "2026-10-08",
"three_way_match": "Matched: PO 4471 created 2026-08-12 by Greg Haskins for $38,615.40 (Larkspur quote Q-22871 attached); delivery to the Riverside Commons jobsite received 2026-09-03, logged by Megan Pruitt 2026-09-04",
"remit_to_printed_on_invoice": "Fernhill National Bank, account ending 2208 (invoice issued before the change)",
"remit_to_printed_on_statement_2026_10_01": "Alder Point Bank, account ending 5512"
},
"bank_change_request": {
"received": "2026-09-14T13:22:07Z",
"channel": "Email to the customer's AP mailbox (new thread)",
"headers": {
"From": "\"Janet Kowalczyk\" <ar@larkspursheetmetal.example.com>",
"Reply-To": "",
"To": "undisclosed-recipients:;",
"Cc": "",
"Subject": "Larkspur Sheet Metal Supply - New banking information effective October 1",
"Date": "Mon, 14 Sep 2026 09:22:01 -0400",
"Message-ID": "<CAJ7r2Lk0x9Qm4pT@mail.larkspursheetmetal.example.com>",
"Return-Path": "<ar@larkspursheetmetal.example.com>",
"Received": "from mail-relay (198.51.100.140, Google Workspace) by our mail gateway; Mon, 14 Sep 2026 13:22:07 +0000",
"Authentication-Results": "spf=pass smtp.mailfrom=larkspursheetmetal.example.com; dkim=pass header.d=larkspursheetmetal.example.com; dmarc=pass (p=reject) header.from=larkspursheetmetal.example.com"
},
"gateway_analysis": {
"sender_domain": "larkspursheetmetal.example.com (the vendor's domain on file)",
"sender_domain_registered": "2011-05-02",
"sender_address": "ar@ had not written to this customer before; the vendor's other addresses have since 2019",
"sending_infrastructure": "Same Google Workspace tenant as all 257 earlier messages from the vendor",
"display_name": "Matches the vendor contact on file (Janet Kowalczyk)",
"thread": "New thread; sent to undisclosed recipients (a notice to many customers)"
},
"body": "Dear valued customer,\n\nLarkspur Sheet Metal Supply has moved its banking relationship to Alder Point Bank here in Columbus. Beginning October 1, 2026, please send ACH payments to the account shown on the attached letter. Our account at Fernhill National Bank will stay open through December 31, 2026, so payments sent there in the meantime will still reach us.\n\nTo protect both of us, please confirm these details by calling our office at the number you already have on file for us. We will never ask you to change banking information by email alone. Remittance advices can now go to ar@larkspursheetmetal.example.com.\n\nThank you for your business,\nJanet Kowalczyk\nController, Larkspur Sheet Metal Supply, Inc.\n2290 Fairwood Industrial Pkwy, Columbus, OH 43207\n614-555-0123",
"attachments": [
{
"name": "Larkspur_Banking_Change_Letter.pdf",
"pages": 1,
"pdf_producer": "Adobe Acrobat Pro",
"pdf_created": "2026-09-11T18:32:10Z",
"content": "Letter on Larkspur letterhead dated September 11, 2026, signed by Janet Kowalczyk (Controller) and Carl Bremer (President): new bank Alder Point Bank, Columbus, OH, routing ending 0277, account ending 5512, account name Larkspur Sheet Metal Supply, Inc.; old account open through December 31, 2026"
},
{
"name": "AlderPoint_Account_Verification_Letter.pdf",
"pages": 1,
"pdf_producer": "Adobe Acrobat Pro",
"pdf_created": "2026-09-10T14:05:44Z",
"content": "Letter on Alder Point Bank letterhead signed by a relationship manager, confirming business checking ending 5512 titled Larkspur Sheet Metal Supply, Inc., opened 2026-08-27"
},
{
"name": "Larkspur_W9_2026.pdf",
"pages": 1,
"content": "W-9, tax ID unchanged (xx-xxx8803)"
}
]
},
"verification_and_changes": [
{
"ts": "2026-09-15T14:05:22Z",
"type": "phone_call",
"by": "Megan Pruitt",
"number_dialed": "+1-614-555-0123",
"number_source": "Vendor record, on file since 2019-09-03; the same number Megan called for the 2023-07-18 address change",
"duration": "6 min 40 s",
"note": "Spoke with Janet Kowalczyk. Read back Alder Point routing ending 0277 and account ending 5512 from the letter; Janet confirmed both. Fernhill stays open through 12/31. Confirmed ar@ is their new remittance mailbox."
},
{
"ts": "2026-09-15T14:18:37Z",
"type": "vendor_bank_details_changed",
"by": "Megan Pruitt",
"device": "d-5a07",
"network": "Columbus office",
"attestation": "Called the vendor at a number on file; call note attached"
},
{
"ts": "2026-09-15T14:19:30Z",
"type": "ach_prenote_sent",
"to": "Alder Point x5512",
"detail": "Zero-dollar prenotification, settling 2026-09-16"
},
{
"ts": "2026-09-15T17:02:11Z",
"type": "vendor_change_reviewed",
"by": "Greg Haskins",
"device": "d-c3e9",
"network": "Columbus office",
"result": "Approved"
},
{
"ts": "2026-09-18T21:00:00Z",
"type": "ach_prenote_result",
"detail": "No return and no notification of change received"
}
],
"account_validation": {
"checked_at": "2026-09-15T14:18:52Z",
"service": "Account validation network (bank-reported account data)",
"account": "Alder Point Bank, routing ending 0277, account x5512",
"account_status": "Open, valid",
"can_receive_ach_credits": true,
"owner_name_checked": "Larkspur Sheet Metal Supply, Inc.",
"owner_name_result": "Match",
"routing_directory": "Alder Point Bank, Columbus, OH"
},
"vendor_network": {
"matched_on": "Vendor tax ID xx-xxx8803",
"other_customers_paying_vendor": 4,
"bank_changes_at_other_customers": "3 of 4 changed to Alder Point x5512 (2026-09-15, 2026-09-17 and 2026-09-22), each recording a call-back to a vendor phone number already on their vendor record",
"payments_to_new_account": "2 payments from those customers to Alder Point x5512 (2026-09-25 $7,412.80; 2026-10-02 $15,060.00), both settled, none returned",
"fourth_customer": "Still pays Fernhill x2208; last payment 2026-09-29, settled",
"new_account_elsewhere": "Alder Point x5512 is not on file for any other vendor"
},
"payment_under_review": {
"payment_id": "PMT-0310558",
"invoice": "LSM-118204 (PO 4471)",
"amount_usd": 38615.4,
"rail": "Standard ACH (CCD+)",
"effective_date": "2026-10-07",
"destination": "Alder Point Bank x5512",
"remittance_advice_to": "ar@larkspursheetmetal.example.com",
"created": {
"ts": "2026-10-06T14:10:33Z",
"by": "Megan Pruitt",
"device": "d-5a07",
"network": "Columbus office"
},
"approved": {
"ts": "2026-10-06T22:47:15Z",
"by": "Greg Haskins",
"device": "d-8d4b",
"network": "hotel Wi-Fi, Las Vegas NV",
"sign_in": "Face ID (mobile app)"
}
}
},
"questions": {
"bec_likelihood": {
"type": "score",
"instructions": "How likely is it that the change to the vendor's bank details is fraudulent, that is, requested by someone impersonating the vendor or made through a compromised email account or login, rather than requested by the vendor?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"verified_out_of_band": {
"type": "noul",
"instructions": "Has the vendor confirmed the new bank details through a channel the requester could not control, such as a call to a phone number that was on file before the change was requested?"
},
"action": {
"type": "choice",
"instructions": "What should happen to the vendor payment under review?",
"criteria": {
"release": "Release the payment to the new bank account",
"hold_and_verify": "Hold the payment until the vendor confirms the new bank details on a call to a phone number that was on file before the change",
"block_and_alert": "Cancel the payment, restore the vendor's previous verified bank details and alert the customer to suspected business email compromise"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_573e3273788d4be9bb4c34ddfcfc3169",
"model": "grayson-1",
"answers": {
"bec_likelihood": {
"type": "score",
"score": 0.006,
"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.9965,
"probabilities": {
"0": 0.9972,
"1": 0.0017,
"2": 0.0002,
"3": 0.0002,
"4": 0.0007
}
},
"verified_out_of_band": {
"type": "noul",
"noul": 0.9954
},
"action": {
"type": "choice",
"choice": "release",
"confidence": 0.9963,
"probabilities": {
"release": 0.9975,
"hold_and_verify": 0.0012,
"block_and_alert": 0.0013
}
}
},
"usage": {
"input_tokens": 16229,
"output_tokens": 0
}
}Open in Playground
A supplier's real mailbox asks for a new bank, but only email has confirmed it. A restaurant group's produce distributor asked, from its real mailbox and in a real statement thread, to move weekly payments to a new local bank that came with a new credit line. The owner name check is a partial match, two calls to the number on file (a voicemail, then a message left with the warehouse) haven't been returned, and only a reply from the same mailbox has confirmed the account.
| Question | Grayson's answer |
|---|---|
bec_likelihood | 1.50 of 4, confidence 33% (Very unlikely 46%, Unlikely 13%, Uncertain 7%, Likely 12%, Very likely 22%) |
verified_out_of_band | 1% true |
action | hold_and_verify, confidence 47% |
16,988 input tokens, $0.00060 per decision, answered in 284 ms.
The request, with long lists cut short. The full request is ambiguous.json (65 KB).
{
"model": "grayson-1",
"state": {
"review": {
"as_of": "2026-10-07T01:13:00Z",
"queue": "Treasury payments fraud review",
"trigger": "Payment approved to vendor bank details changed in the last 30 days",
"rules_fired": [
{
"rule": "PAY-BC30",
"description": "Payment to vendor bank details changed in the last 30 days"
},
{
"rule": "VND-NAME",
"description": "Owner name check on the new account was not a full match"
},
{
"rule": "VND-ATT",
"description": "Change attested as confirmed by phone, but the call log records voicemail"
}
],
"payment_status": "Held for review; standard ACH file for 2026-10-07 settlement closes 2026-10-07T14:00:00Z"
},
"customer": {
"name": "Redfern Hospitality Group, LLC",
"business": "Four full-service restaurants in Nashville, TN; about 140 employees",
"customer_since": "2021-05-03",
"payables_module_since": "2021-05-10",
"accounts": [
{
"account": "Operating checking x7714",
"avg_ledger_balance_90d_usd": 236905.12
},
{
"account": "Payroll checking x7722",
"funding": "Transfer from x7714 every other Wednesday"
}
],
"payment_controls": {
"approval_at_or_over_usd": 5000,
"approver": "Owen Fairchild (single approver)",
"vendor_bank_change": "The user making the change ticks an attestation that they called the vendor, and records the number called, the outcome and a note",
"daily_ach_limit_usd": 80000
},
"users": [
{
"name": "Alicia Moreno",
"role": "Bookkeeper",
"entitlements": "Enter bills, edit vendors, create payments",
"user_since": "2021-05-03",
"devices": [
{
"id": "d-2e19",
"type": "Windows 11 laptop, Chrome",
"first_seen": "2024-08-26"
}
],
"usual_access": "d-2e19; Redfern office Tuesday to Thursday, home (East Nashville) Monday and Friday",
"mfa": "Authenticator push"
},
{
"name": "Owen Fairchild",
"role": "Owner and managing member",
"entitlements": "Approve payments, edit vendors, administer users",
"user_since": "2021-05-03",
"devices": [
{
"id": "d-6c40",
"type": "MacBook, Safari",
"first_seen": "2022-02-11"
},
{
"id": "d-a913",
"type": "iPhone, mobile app",
"first_seen": "2024-11-30"
}
],
"usual_access": "Mobile app from home (Brentwood, TN) in the evening; office occasionally",
"mfa": "Authenticator push; Face ID in the mobile app"
},
{
"name": "Tasha Greene",
"role": "Director of operations",
"entitlements": "View bills",
"user_since": "2025-06-02",
"devices": [
{
"id": "d-3b88",
"type": "iPad, mobile app",
"first_seen": "2025-06-02"
}
],
"usual_access": "Redfern office",
"mfa": "Authenticator push"
}
],
"known_networks": [
{
"label": "Redfern office",
"ip": "198.51.100.88",
"type": "Business cable, Nashville, TN",
"first_seen": "2021-05-03"
},
{
"label": "home, East Nashville",
"ip": "203.0.113.164",
"type": "Residential fiber (Alicia Moreno)",
"first_seen": "2022-09-12"
},
{
"label": "home, Brentwood TN",
"ip": "203.0.113.31",
"type": "Residential cable (Owen Fairchild)",
"first_seen": "2021-05-03"
},
{
"label": "hotel Wi-Fi, Chattanooga TN",
"ip": "192.0.2.140",
"type": "Hotel network, Chattanooga, TN",
"first_seen": "2026-09-19"
}
]
},
"vendor": {
"vendor_id": "V-0007",
"legal_name": "Calloway Fresh Provisions, Inc.",
"tax_id": "xx-xxx2659",
"category": "Produce, dairy and protein distributor",
"address": "415 Waldron Industrial Dr, La Vergne, TN 37086",
"vendor_since": "2021-06-14",
"payment_terms": "Weekly statement (week ends Saturday), due in 7 days",
"usual_rail": "Standard ACH (CCD+), created every Tuesday for Wednesday settlement",
"domain_on_file": "callowayfresh.example.com",
"contacts": [
{
"name": "Teresa Okafor",
"role": "Accounts receivable",
"email": "ar@callowayfresh.example.com",
"phone": "+1-615-555-0131 (main line)",
"on_file_since": "2022-01-10 (main line since 2021-06-14)"
},
{
"name": "Marcus Calloway",
"role": "President",
"email": "marcus@callowayfresh.example.com",
"phone": "+1-615-555-0138 (mobile)",
"on_file_since": "2021-06-14"
},
{
"name": "Derek Simms",
"role": "Route sales",
"email": "derek.simms@callowayfresh.example.com",
"phone": "+1-615-555-0144",
"on_file_since": "2023-08-01"
}
],
"bank_accounts": [
{
"bank": "Larchfield National Bank, Nashville, TN",
"routing": "xxxxx0381",
"account": "Business checking x1184",
"added": "2021-06-14",
"status": "Replaced 2023-03-21",
"verification": "Call-back to the main line 2021-06-15"
},
{
"bank": "Larchfield National Bank, Nashville, TN",
"routing": "xxxxx0381",
"account": "Business checking x6627",
"added": "2023-03-21",
"status": "Replaced 2026-10-02",
"verification": "Requested by a signed letter after check fraud on the vendor's old account; call-back to +1-615-555-0138 (Marcus Calloway) on 2023-03-21 by Alicia Moreno; owner name check: match",
"payments_received": 184
},
{
"bank": "Pellmont Bank & Trust, Murfreesboro, TN",
"routing": "xxxxx0662",
"account": "Business checking x3390",
"added": "2026-10-02",
"status": "Active",
"payments_received": 0
}
],
"master_change_log": [
{
"ts": "2021-06-14T15:20:41Z",
"by": "Alicia Moreno",
"change": "Vendor created; bank Larchfield x1184; contacts Lynn Baird (AR) and Marcus Calloway"
},
{
"ts": "2022-01-10T16:02:18Z",
"by": "Alicia Moreno",
"change": "AR contact Lynn Baird replaced by Teresa Okafor (same ar@ mailbox)"
},
{
"ts": "2023-03-21T19:44:05Z",
"by": "Alicia Moreno",
"change": "Bank Larchfield x1184 to Larchfield x6627",
"verification": "Call-back to Marcus Calloway at +1-615-555-0138"
},
{
"ts": "2023-08-01T14:11:56Z",
"by": "Alicia Moreno",
"change": "Added contact Derek Simms"
},
{
"ts": "2026-10-02T16:30:19Z",
"by": "Alicia Moreno",
"change": "Bank Larchfield x6627 to Pellmont x3390",
"attestation": "Called the vendor to confirm",
"call_record": "+1-615-555-0131, voicemail; note: Left VM, Teresa confirmed by email",
"source_document": "Email of 2026-10-02 04:41 UTC (.eml uploaded)"
}
]
},
"vendor_payment_history": {
"before_period": "2021-06 to 2025-09: 223 weekly payments totaling $2,046,118.74, all by standard ACH (to Larchfield x1184 until 2023-03-14, then x6627), none returned",
"columns": [
"statement",
"amount_usd",
"due",
"paid",
"rail",
"… 4 more in ambiguous.json"
],
"rows": [
[
"Week ending 2025-10-04",
9161.45,
"2025-10-11",
"2025-10-08",
"ACH",
"… 4 more in ambiguous.json"
],
[
"Week ending 2025-10-11",
8635.48,
"2025-10-18",
"2025-10-15",
"ACH",
"… 4 more in ambiguous.json"
],
[
"Week ending 2025-10-18",
8166.02,
"2025-10-25",
"2025-10-22",
"ACH",
"… 4 more in ambiguous.json"
],
[
"Week ending 2025-10-25",
11161.98,
"2025-11-01",
"2025-10-29",
"ACH",
"… 4 more in ambiguous.json"
],
[
"Week ending 2025-11-01",
8906.03,
"2025-11-08",
"2025-11-05",
"ACH",
"… 4 more in ambiguous.json"
],
"… 47 more in ambiguous.json"
]
},
"vendor_email_history": {
"mailbox": "ap@redfernhospitality.example.com, connected to our payables module since 2021-05-10 (inbound mail from the vendor's domain)",
"before_period": "2021-06 to 2026-03: 268 messages from callowayfresh.example.com (ar@, marcus@, derek.simms@), all SPF, DKIM and DMARC pass, all sent through the vendor's Microsoft 365 tenant, all between 06:52 and 18:40 Central time",
"columns": [
"received",
"from",
"subject",
"auth_spf_dkim_dmarc",
"sent_via",
"attachments"
],
"rows": [
[
"2026-04-04T13:19:27Z",
"ar@callowayfresh.example.com",
"Calloway Fresh Provisions - Statement 04/04",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Statement.pdf"
],
[
"2026-04-11T13:55:23Z",
"ar@callowayfresh.example.com",
"Calloway Fresh Provisions - Statement 04/11",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Statement.pdf"
],
[
"2026-04-14T12:52:58Z",
"derek.simms@callowayfresh.example.com",
"Protein pricing for next week",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Market_Update.pdf"
],
[
"2026-04-18T14:03:09Z",
"ar@callowayfresh.example.com",
"Calloway Fresh Provisions - Statement 04/18",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Statement.pdf"
],
[
"2026-04-25T13:28:20Z",
"ar@callowayfresh.example.com",
"Calloway Fresh Provisions - Statement 04/25",
"pass/pass/pass",
"Microsoft 365 (vendor tenant)",
"Statement.pdf"
],
"… 36 more in ambiguous.json"
]
},
"payables_last_60_days": {
"period": "2026-08-11 to 2026-10-06",
"note": "Payments created in our payables module from operating account x7714, excluding the payment under review. Payment runs are created on Tuesdays for Wednesday settlement.",
"columns": [
"created",
"payee",
"reference",
"amount_usd",
"rail",
"… 4 more in ambiguous.json"
],
"rows": [
[
"2026-08-11",
"Ashgrove Wine & Spirits",
"AWS900454",
6209.7,
"ACH",
"… 4 more in ambiguous.json"
],
[
"2026-08-11",
"Calloway Fresh Provisions, Inc.",
"Week ending 2026-08-08",
12679.61,
"ACH",
"… 4 more in ambiguous.json"
],
[
"2026-08-11",
"Hollow Creek Bakery",
"Stmt 3302",
908.34,
"ACH",
"… 4 more in ambiguous.json"
],
[
"2026-08-11",
"Keel Linen & Uniform",
"KLU-77124",
630.04,
"ACH",
"… 4 more in ambiguous.json"
],
[
"2026-08-11",
"Riverbend Seafood Co.",
"RSC-41882",
4022.66,
"ACH",
"… 4 more in ambiguous.json"
],
"… 63 more in ambiguous.json"
]
},
"online_banking_sessions": {
"period": "2026-08-22 to 2026-10-07",
"note": "One row per sign-in",
"columns": [
"start",
"user",
"device",
"network",
"sign_in",
"minutes",
"activity"
],
"rows": [
[
"2026-08-24T17:08:55Z",
"Alicia Moreno",
"d-2e19",
"home, East Nashville",
"password + push",
40,
"entered 11 bills"
],
[
"2026-08-25T14:27:48Z",
"Alicia Moreno",
"d-2e19",
"Redfern office",
"password + push",
49,
"entered 13 bills; created 10 payments ($77,544.40)"
],
[
"2026-08-26T00:21:22Z",
"Owen Fairchild",
"d-a913",
"home, Brentwood TN",
"Face ID (mobile app)",
5,
"approved 6 payments ($71,243.88)"
],
[
"2026-08-26T13:01:17Z",
"Alicia Moreno",
"d-2e19",
"Redfern office",
"password + push",
42,
"entered 9 bills"
],
[
"2026-08-28T19:20:23Z",
"Alicia Moreno",
"d-2e19",
"home, East Nashville",
"password + push",
12,
"entered 10 bills"
],
"… 34 more in ambiguous.json"
]
},
"invoice": {
"statement": "Week ending 2026-10-03",
"received": "2026-10-03T13:05:44Z",
"from": "ar@callowayfresh.example.com",
"deliveries": "9 delivery invoices across the four restaurants, each signed for by the kitchen manager and matching receiving logs",
"amount_usd": 11284.65,
"due": "2026-10-10",
"remit_to_printed_on_statement": "Larchfield National Bank, account ending 6627"
},
"bank_change_request": {
"received": "2026-10-02T04:41:27Z",
"channel": "Email to the customer's AP mailbox, as a reply in the Statement 09/26 thread",
"headers": {
"From": "\"Teresa Okafor\" <ar@callowayfresh.example.com>",
"Reply-To": "",
"To": "Alicia Moreno <ap@redfernhospitality.example.com>",
"Cc": "",
"Subject": "RE: Calloway Fresh Provisions - Statement 09/26",
"Date": "Thu, 1 Oct 2026 23:41:19 -0500",
"Message-ID": "<SA1PR14MB7342C9D1E0A5B8F2A0C4E61BD39A@SA1PR14MB7342.namprd14.prod.example.com>",
"In-Reply-To": "<SA1PR14MB7342A7F4C21D90E6B3F08812D31B@SA1PR14MB7342.namprd14.prod.example.com>",
"Return-Path": "<ar@callowayfresh.example.com>",
"Received": "from the vendor's Microsoft 365 tenant (198.51.100.212) by our mail gateway; Fri, 2 Oct 2026 04:41:27 +0000",
"Authentication-Results": "spf=pass smtp.mailfrom=callowayfresh.example.com; dkim=pass header.d=callowayfresh.example.com; dmarc=pass (p=none) header.from=callowayfresh.example.com"
},
"gateway_analysis": {
"sender_domain": "callowayfresh.example.com (the vendor's domain on file)",
"sender_domain_registered": "2009-03-17",
"sender_address": "Matches the AR contact on file; it sent every statement in the last 4 years",
"sending_infrastructure": "Same Microsoft 365 tenant as all 306 earlier messages from the vendor",
"display_name": "Matches the vendor contact on file (Teresa Okafor)",
"send_time": "23:41 Central; the first message from this vendor outside 06:52-18:40 Central",
"thread": "Reply in the Statement 09/26 thread; quotes the original statement email"
},
"body": "Hi Alicia,\n\nPlease see attached updated ACH information. We have moved our operating accounts to Pellmont Bank & Trust as part of our new line of credit with them. Please update your records and send all payments to the new account starting with this week's payment.\n\nLet me know once it's updated. Thank you!\n\nTeresa Okafor\nAccounts Receivable\nCalloway Fresh Provisions, Inc.\n415 Waldron Industrial Dr, La Vergne, TN 37086\n615-555-0131\n\nFrom: Teresa Okafor <ar@callowayfresh.example.com>\nSent: Saturday, September 26, 2026 8:14 AM\nSubject: Calloway Fresh Provisions - Statement 09/26\nPlease find attached your statement for the week ending 09/26.",
"attachments": [
{
"name": "ACH Update - Calloway Fresh.pdf",
"pages": 2,
"pdf_producer": "iOS Quartz PDFContext (phone scan)",
"pdf_created": "2026-10-01T22:15:09Z",
"content": "Page 1: Calloway Fresh vendor ACH form, filled in by hand, signed 'Marcus Calloway, President', dated 10/1/26: Pellmont Bank & Trust, routing ending 0662, account ending 3390, account name 'Calloway Fresh Provisions'. Page 2: voided check no. 1001 on Pellmont Bank & Trust, printed CALLOWAY FRESH PROVISIONS, 415 WALDRON INDUSTRIAL DR, LA VERGNE TN"
}
],
"later_messages": [
{
"ts": "2026-10-02T15:14:02Z",
"from": "ap@redfernhospitality.example.com (Alicia Moreno)",
"to": "ar@callowayfresh.example.com",
"text": "Hi Teresa, I left you a voicemail. Can you confirm the new routing number ending 0662 and account ending 3390 before I update? Thanks, Alicia"
},
{
"ts": "2026-10-02T16:02:51Z",
"from": "ar@callowayfresh.example.com",
"text": "Yes that's correct, thanks Alicia! Please use the new account starting with this week's payment. Teresa"
}
]
},
"verification_and_changes": [
{
"ts": "2026-10-02T15:10:40Z",
"type": "phone_call",
"by": "Alicia Moreno",
"number_dialed": "+1-615-555-0131",
"number_source": "Vendor record (main line), on file since 2021-06-14; also in the request's signature",
"duration": "0 min 48 s",
"outcome": "Voicemail (greeting: Calloway Fresh Provisions, please leave a message)",
"note": "Left VM for Teresa asking her to call back to confirm the new bank info"
},
{
"ts": "2026-10-02T16:30:19Z",
"type": "vendor_bank_details_changed",
"by": "Alicia Moreno",
"device": "d-2e19",
"network": "home, East Nashville",
"attestation": "Called the vendor to confirm"
},
{
"ts": "2026-10-02T16:32:10Z",
"type": "ach_prenote_sent",
"to": "Pellmont x3390",
"detail": "Zero-dollar prenotification, settling 2026-10-05"
},
{
"ts": "2026-10-05T14:38:12Z",
"type": "phone_call",
"by": "Alicia Moreno",
"number_dialed": "+1-615-555-0131",
"number_source": "Vendor record (main line)",
"duration": "1 min 35 s",
"outcome": "Answered by a warehouse employee",
"note": "Teresa not at her desk, left message for her to call me back about the bank change"
},
{
"ts": "2026-10-06T21:00:00Z",
"type": "ach_prenote_result",
"detail": "No return and no notification of change received"
},
{
"ts": "2026-10-07T01:13:00Z",
"type": "call_back_status",
"detail": "No return call from the vendor recorded",
"attempts_by_number_on_file": {
"+1-615-555-0131 (main line)": "2 calls, no confirmation",
"+1-615-555-0138 (Marcus Calloway)": "not called",
"+1-615-555-0144 (Derek Simms)": "not called"
}
}
],
"account_validation": {
"checked_at": "2026-10-02T16:31:07Z",
"service": "Account validation network (bank-reported account data)",
"account": "Pellmont Bank & Trust, routing ending 0662, account x3390",
"account_status": "Open, valid",
"can_receive_ach_credits": true,
"owner_name_checked": "Calloway Fresh Provisions, Inc.",
"owner_name_result": "Partial match",
"detail": "Business name matches in part; the service does not return the name on the account",
"account_open_date_reported": "2026-09-28",
"routing_directory": "Pellmont Bank & Trust, Murfreesboro, TN"
},
"vendor_network": {
"matched_on": "Vendor tax ID xx-xxx2659",
"other_customers_paying_vendor": 3,
"same_request_elsewhere": "One customer (a cafe group) uploaded the same request on 2026-10-02 (identical attachment) and changed to Pellmont x3390 on 2026-10-05, recording 'confirmed by vendor email'; no payment to x3390 yet",
"other_two_customers": "No bank change recorded; their AP mailboxes are not connected to our payables module. One paid Larchfield x6627 $4,912.30 on 2026-09-30 (settled); the other has a payment to x6627 scheduled for 2026-10-07",
"new_account_elsewhere": "Pellmont x3390 is not on file for any other vendor"
},
"payment_under_review": {
"payment_id": "PMT-0207733",
"invoice": "Statement, week ending 2026-10-03",
"amount_usd": 11284.65,
"rail": "Standard ACH (CCD+)",
"effective_date": "2026-10-07",
"destination": "Pellmont Bank & Trust x3390",
"remittance_advice_to": "ar@callowayfresh.example.com",
"created": {
"ts": "2026-10-06T14:20:18Z",
"by": "Alicia Moreno",
"device": "d-2e19",
"network": "Redfern office"
},
"approved": {
"ts": "2026-10-07T01:12:40Z",
"by": "Owen Fairchild",
"device": "d-a913",
"network": "home, Brentwood TN",
"sign_in": "Face ID (mobile app)"
}
}
},
"questions": {
"bec_likelihood": {
"type": "score",
"instructions": "How likely is it that the change to the vendor's bank details is fraudulent, that is, requested by someone impersonating the vendor or made through a compromised email account or login, rather than requested by the vendor?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"verified_out_of_band": {
"type": "noul",
"instructions": "Has the vendor confirmed the new bank details through a channel the requester could not control, such as a call to a phone number that was on file before the change was requested?"
},
"action": {
"type": "choice",
"instructions": "What should happen to the vendor payment under review?",
"criteria": {
"release": "Release the payment to the new bank account",
"hold_and_verify": "Hold the payment until the vendor confirms the new bank details on a call to a phone number that was on file before the change",
"block_and_alert": "Cancel the payment, restore the vendor's previous verified bank details and alert the customer to suspected business email compromise"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_ac74416bb4d9419aab4cdcae80c563b1",
"model": "grayson-1",
"answers": {
"bec_likelihood": {
"type": "score",
"score": 1.497,
"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.3273,
"probabilities": {
"0": 0.4619,
"1": 0.1323,
"2": 0.0708,
"3": 0.1168,
"4": 0.2182
}
},
"verified_out_of_band": {
"type": "noul",
"noul": 0.0052
},
"action": {
"type": "choice",
"choice": "hold_and_verify",
"confidence": 0.471,
"probabilities": {
"release": 0.0469,
"hold_and_verify": 0.6473,
"block_and_alert": 0.3058
}
}
},
"usage": {
"input_tokens": 16988,
"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.
bec_likelihood: add the "Likely" and "Very likely" probabilities rather than reading the top level, since a mixed case splits between the two ends; above your threshold, the payment shouldn't go out on the customer's checklist alone.verified_out_of_band: a low probability means the change isn't really confirmed, whatever the attestation says, so send the payment to a call-back queue.action: whenreleaseisn't clearly the most likely option, hold rather than release; a held payment can still go out on the due date.
Call it from your code
Save an example as request.json, such as ambiguous.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
Vendors do change banks, the invoice is real, the new account passes validation and the micro-deposits confirm, so every step of a BEC payment can look normal. A rule that holds every bank change flags changes that are almost all legitimate, and one that trusts a completed checklist misses a call-back placed to the number in the fraudulent email.
What to send
Send the vendor record and its change log, the invoices, payments and email you hold for the vendor, the change request as it arrived (with its headers and attachments), each verification step, the account validation result, what other customers show for the same vendor, and the sessions of the users involved:
- How the change was requested. A lookalike domain registered days earlier is close to conclusive; the vendor's real domain proves little.
- Timing and urgency. A change shortly before a large invoice is due, with pressure to update, fits the pattern.
- The new account. An owner name no-match is a strong signal; an account that is merely valid tells you little.
- How it was verified. A call-back counts only to a number on file before the request.
- The vendor's history. A first-ever bank change on a long relationship deserves more care.
- The users' sessions. A new device, a new country or repeated MFA prompts point to a taken-over login, not a fooled clerk.
Add your own policy
Teams differ on what a failed check means: some call the vendor after a name mismatch, while others treat an emailed change with a mismatch as fraud and cancel the payment outright. This policy takes the stricter line and spells out what counts as verification.
Your vendor bank-change policy adds this to the state of the ambiguous example:
{
"platform_policy": "AP-7, vendor bank-detail changes. A change counts as verified only after a call to a phone number that was on file before the request arrived; a number, name or link supplied in the request never counts, and neither do micro-deposits. If a change was requested by email and the account validation owner name check returns anything other than a full match, treat it as suspected business email compromise and do not hold the payment for a call-back: cancel the payment, restore the vendor's previous verified bank details, lock vendor edits for the customer, and phone the customer's administrator at the number on file. The customer must re-verify the vendor and submit a new payment."
}| Question | Without | With your vendor bank-change policy |
|---|---|---|
bec_likelihood | 1.50 of 4, confidence 33% (Very unlikely 46%, Unlikely 13%, Uncertain 7%, Likely 12%, Very likely 22%) | 2.48 of 4, confidence 40% (Very unlikely 28%, Unlikely 8%, Uncertain 5%, Likely 8%, Very likely 52%) |
verified_out_of_band | 1% true | Under 1% true |
action | hold_and_verify, confidence 47% | block_and_alert, confidence 83% |
In the ambiguous example, the produce distributor asked for the change by email and the owner name check returned a partial match, so under this policy the payment should be cancelled and the old bank details restored rather than held for a call-back.
Where to call it
- When a vendor's bank details change, before the change takes effect, to decide how much verification to require.
- When a payment to recently changed details is approved, before it is sent.
- When the answer is uncertain, hold the payment and call the vendor at the number on file.
Cost and latency
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 17,259 | $0.00060 | $0.60 | 221 ms |
| Legitimate | 16,229 | $0.00057 | $0.57 | 256 ms |
| Ambiguous | 16,988 | $0.00060 | $0.59 | 284 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/business-email-compromise/questions.json --label bec_likelihood=<column> --label verified_out_of_band=<column> --label action=<column>Each --label names the column with that question's right answer:
bec_likelihood: a level, such as "Very likely (over 90%)"verified_out_of_band:trueorfalseaction:release,hold_and_verify,block_and_alert
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
Do micro-deposits or an account-validation check prove the change is legitimate?
No. A confirmed micro-deposit proves only that whoever supplied the bank details can see the account, which a fraudster can do for an account they opened. An owner name check is stronger, but fraudsters open accounts under names close to the vendor's, so send these results as evidence together with how the vendor was actually contacted.
What if the request came from the vendor's real email address?
Then domain and email authentication checks pass, because a compromised vendor mailbox sends from the real domain, often inside a genuine invoice thread. The other signals carry the decision: the new bank, the owner name check, a phone number that appears only in the request, urgency before a large payment, and whether other customers of the vendor received the same change. Grayson weighs these together, so you don't need a separate rule for each.
Should I score the bank-detail change or the payment?
Both. At change time, ask whether the change is fraudulent and whether it has been verified, to decide what verification to require; at payment time, add the invoice, the amount and the approvers' sessions and ask the action question too, since money is about to move. Keep the wording of shared questions identical so thresholds carry over.
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.
Fraud typology classification
Label a fraud claim with a FraudClassifier class, scam type and contributing factors; decide reimbursement.
Recipes
Every use case, with its questions and cost per decision.
Payments and scams
Money going out and coming in: scam payments, vendor bank-detail fraud, incoming credits and check deposits. Ready-to-run Grayson recipes with real responses, cost and latency.
Check deposits
Grayson decides whether a deposited check is counterfeit, altered, stolen or a duplicate, and whether to release funds, place an exception hold or reject it.