Review merchant risk alerts on your payments platform
Grayson reviews a flagged merchant's processing, payouts and onboarding record, separates real growth from bust-out fraud, transaction laundering and stolen-card attacks, and picks the action, from clearing the alert to holding payouts or closing the account.
When your monitoring flags one of your merchants, Grayson reads the merchant's onboarding record, processing history, payouts and dashboard activity, and returns what best explains the activity (real business, a business in trouble, stolen cards at its checkout, a bust-out, transaction laundering or an account takeover), whether it still matches the business the merchant declared, how likely you are to be left with the losses, and what to do: clear the alert, ask for documents, hold back payouts, suspend or terminate. It costs about $0.55 to $0.61 per 1,000 decisions.
- Decides: Whether a flagged merchant's activity is real business or fraud, how likely a loss is, and whether to hold payouts
- Call it: When monitoring flags one of your merchants
- Questions: 2 choice, 1 yes/no, 1 score
- Cost: $0.00055 to $0.00061 per decision ($0.55 to $0.61 per 1,000) for these examples' 15,693 to 17,559 input tokens
- Latency: 215 to 300 ms for these examples, the median of 5 calls each through api.finic.ai from US-West
Examples
Three alerts at a payment facilitator, each sent with the merchant's onboarding record, 12 months of monthly and 60 days of daily processing, every sale of $250 or more and refund of $100 or more in the last 30 days, disputes and issuer fraud reports, payouts, dashboard logins and what the merchant has told the risk team. They are an HVAC contractor keying out-of-state cards at night after changing its payout account, a pumpkin farm's October peak with new online tickets, and a phone repair shop selling refurbished phones to distant buyers by payment link.
Open in Playground
An HVAC contractor's account keys $96,245 of out-of-state cards at night. Four months after onboarding, an Arizona HVAC contractor changed its payout bank account, turned on instant payouts and started keying cards from 16 states and abroad into the virtual terminal late at night. Issuers have already filed 11 fraud reports and 4 chargebacks, the owner's phone ran the dashboard of a merchant terminated for keyed-card fraud, and his explanation doesn't hold.
| Question | Grayson's answer |
|---|---|
risk_type | bust_out, confidence 96% |
matches_declared_business | Under 1% true |
loss_likelihood | 3.89 of 4, confidence 94% |
action | terminate, confidence 92% |
17,559 input tokens, $0.00061 per decision, answered in 300 ms.
The request, with long lists cut short. The full request is fraud.json (72 KB).
{
"model": "grayson-1",
"state": {
"platform": {
"who_we_are": "We are a payment facilitator for small US businesses. Merchants take cards through our card readers and Tap to Pay, online checkout, payment links, invoices, and a virtual terminal (card numbers keyed into the dashboard). We settle through our sponsor bank and pay out to each merchant's bank account. Chargebacks, refunds and card network fines the merchant can't cover are our loss.",
"standard_payouts": "Automatic, every business day, of the previous business day's sales less fees, refunds and chargebacks",
"instant_payouts": "Available after 90 days in good standing: on-demand payout to a debit card, 1.75% fee, up to $15,000 a day",
"fees": "Card-present 2.6% + $0.15; online checkout, payment links and invoices 2.9% + $0.30; keyed 3.5% + $0.15; chargeback fee $15",
"dispute_window": "Most cardholder disputes arrive within 120 days of the sale, or of the expected delivery date for goods and services not yet delivered"
},
"merchant": {
"merchant_id": "mer_5KQ2V8XH",
"legal_name": "Kessler Ridge Heating & Air LLC",
"dba": "Kessler Ridge HVAC",
"entity": "Arizona LLC, single member",
"formed": "2026-04-30 (Arizona Corporation Commission: active; statutory agent is a commercial registered-agent service)",
"ein": "xx-xxx4417 (IRS TIN match: name and EIN match)",
"business_address": "2150 W Southern Ave Ste 114, Mesa, AZ 85202",
"address_check": "Commercial mail receiving agency (a mailbox store); owner's home address in Mesa, AZ also on file",
"phone": "(480) 555-0137 (non-fixed VoIP)",
"email": "office@kesslerridgehvac.example",
"website": "kesslerridgehvac.example",
"mcc": "1711 Heating, plumbing and air-conditioning contractors",
"declared_business": "Residential heating and air-conditioning repair, maintenance and replacement in the Phoenix metro area. Technicians take payment at the customer's home on a card reader, or by emailed invoice.",
"onboarded": "2026-05-28",
"account_status": "Active; instant payouts paused automatically at 2026-10-07T14:20Z when this alert fired"
},
"owners": [
{
"name": "Travis R. Kessler",
"role": "Owner and managing member",
"ownership_pct": 100,
"home": "Mesa, AZ",
"id_check": "Arizona driver license verified; selfie matched (2026-05-28)",
"ssn_check": "Name, date of birth and SSN match; credit file opened 2023, 2 tradelines",
"sanctions_and_pep": "No match",
"other_merchants_on_platform": "None under this name, SSN or email"
}
],
"underwriting": {
"risk_tier": "Standard (new business)",
"declared_monthly_volume_usd": 18000,
"declared_average_ticket_usd": 380,
"declared_max_ticket_usd": 4500,
"declared_channels": "70% card reader at the customer's home, 30% emailed invoices; no keyed sales",
"declared_customers": "Homeowners in the Phoenix metro area",
"refund_policy": "Parts and labor warranty, 1 year",
"fulfillment": "Service performed before or at the time of payment",
"processing_limits": "Monthly $40,000 (raised from $25,000 on 2026-09-22), single sale $5,000; soft limits that raise a review",
"reserve": "None",
"notes": "2026-05-28 approved: new entity, owner's thin credit file and a mailbox-store address accepted with the home address on file. 2026-09-22 limit raised on an uploaded 2-page service contract with Saguaro Point Property Group for 'HVAC replacement across managed units'; the counterparty was not contacted."
},
"payout_account": {
"current": "Checking x0472, US online bank (verified 2026-09-29 by micro-deposits; account holder name not returned)",
"previous": "Business checking x3391, Arizona regional bank (verified at onboarding with a voided check; name matched)",
"changes": [
{
"ts": "2026-09-29T15:42:10Z",
"change": "Bank account changed from x3391 to x0472",
"how": "Owner's iPhone, our app, Mesa AZ residential ISP; texted code to the phone on file entered"
},
{
"ts": "2026-09-30T02:18:44Z",
"change": "Instant payouts turned on to debit card x8834 (issued on checking x0472); automatic payouts turned off",
"how": "Owner's iPhone, our app"
}
]
},
"balance": {
"as_of": "2026-10-07T14:20:00Z",
"available_usd": 12621.56,
"paid_out_since_2026_10_01_usd": 75000,
"keyed_sales_since_2026_10_01_usd": 96245,
"note": "Instant payouts paused by this alert; an instant payout of $15,000.00 requested at 2026-10-07T14:41Z was refused"
},
"payouts_30_days": {
"columns": [
"ts",
"type",
"amount_usd",
"instant_fee_usd",
"destination",
"status"
],
"rows": [
[
"2026-09-08T13:00:00Z",
"standard",
292.38,
0,
"x3391 regional bank",
"paid"
],
[
"2026-09-09T13:00:00Z",
"standard",
86.54,
0,
"x3391 regional bank",
"paid"
],
[
"2026-09-10T13:00:00Z",
"standard",
992.15,
0,
"x3391 regional bank",
"paid"
],
[
"2026-09-11T13:00:00Z",
"standard",
672.1,
0,
"x3391 regional bank",
"paid"
],
[
"2026-09-15T13:00:00Z",
"standard",
1814.79,
0,
"x3391 regional bank",
"paid"
],
"… 11 more in fraud.json"
]
},
"monthly_processing": {
"columns": [
"month",
"sales",
"gross_usd",
"avg_ticket_usd",
"card_present_pct",
"… 6 more in fraud.json"
],
"rows": [
[
"2026-06",
13,
6006.68,
462.05,
86.9,
"… 6 more in fraud.json"
],
[
"2026-07",
19,
8629.11,
454.16,
92.6,
"… 6 more in fraud.json"
],
[
"2026-08",
18,
9207.41,
511.52,
88.9,
"… 6 more in fraud.json"
],
[
"2026-09",
21,
7553.15,
359.67,
88,
"… 6 more in fraud.json"
],
[
"2026-10 (to Oct 6)",
59,
96245,
1631.27,
0,
"… 6 more in fraud.json"
]
]
},
"daily_processing_60_days": {
"columns": [
"date",
"day",
"sales",
"gross_usd",
"card_present_usd",
"… 6 more in fraud.json"
],
"rows": [
[
"2026-08-08",
"Sat",
1,
89,
89,
"… 6 more in fraud.json"
],
[
"2026-08-09",
"Sun",
0,
0,
0,
"… 6 more in fraud.json"
],
[
"2026-08-10",
"Mon",
2,
465.72,
346.72,
"… 6 more in fraud.json"
],
[
"2026-08-11",
"Tue",
0,
0,
0,
"… 6 more in fraud.json"
],
[
"2026-08-12",
"Wed",
1,
119,
119,
"… 6 more in fraud.json"
],
"… 55 more in fraud.json"
]
},
"card_mix_30_days": {
"window": "2026-09-07 to 2026-10-06",
"all_sales": {
"count": 77,
"distinct_cards": 71,
"card_types": {
"credit": "59 (77%)",
"debit": "12 (16%)",
"prepaid": "6 (8%)"
},
"non_us_cards": 3,
"declined_attempts": 24
},
"card_not_present_sales": {
"count": 61,
"gross_usd": 97149.34,
"distinct_cards": 55,
"cards_with_more_than_one_sale": 6,
"entry": {
"keyed": "59 (97%)",
"invoice": "2 (3%)"
},
"brands": {
"Visa": "38 (62%)",
"Mastercard": "19 (31%)",
"Amex": "3 (5%)",
"Discover": "1 (2%)"
},
"card_types": {
"credit": "48 (79%)",
"debit": "7 (11%)",
"prepaid": "6 (10%)"
},
"issuers": {
"US national bank": "12 (20%)",
"Texas credit union": "11 (18%)",
"US regional bank": "9 (15%)",
"US card issuer": "7 (11%)",
"US credit union": "6 (10%)",
"US online bank": "5 (8%)",
"US prepaid program": "4 (7%)",
"American Express": "3 (5%)",
"Canadian bank": "2 (3%)",
"UK bank": "1 (2%)",
"Discover": "1 (2%)"
},
"issuer_countries": {
"US": "58 (95%)",
"GB": "2 (3%)",
"CA": "1 (2%)"
},
"billing_zip_states": {
"TX": "14 (23%)",
"IL": "8 (13%)",
"OH": "5 (8%)",
"NJ": "4 (7%)",
"FL": "3 (5%)",
"CA": "3 (5%)",
"MD": "3 (5%)",
"PA": "3 (5%)",
"AZ": "2 (3%)",
"NY": "2 (3%)",
"NC": "2 (3%)",
"TN": "2 (3%)",
"MI": "2 (3%)",
"CO": "2 (3%)",
"VA": "1 (2%)",
"WA": "1 (2%)",
"GA": "1 (2%)"
},
"avs": {
"N": "21 (34%)",
"Z": "18 (30%)",
"Y": "16 (26%)",
"A": "3 (5%)",
"U": "3 (5%)"
},
"cvv": {
"M": "61 (100%)"
},
"declined_attempts": 24
},
"note": "Card-not-present sales before 2026-10-01 were invoices with Arizona billing ZIPs. 15 of the cards keyed since 2026-10-01 (approved or declined) are Visa credit cards on one Texas credit union's BIN."
},
"transactions_250_plus_30_days": {
"columns": [
"ts",
"id",
"type",
"amount_usd",
"entry",
"… 8 more in fraud.json"
],
"rows": [
[
"2026-09-09T17:36:28Z",
"py_xhku6fzn8p",
"sale",
340.71,
"contactless",
"… 8 more in fraud.json"
],
[
"2026-09-09T18:40:37Z",
"py_19kglbk9nu",
"sale",
678.23,
"contactless",
"… 8 more in fraud.json"
],
[
"2026-09-11T01:28:24Z",
"py_4sa6ftrb4c",
"sale",
573.27,
"invoice",
"… 8 more in fraud.json"
],
[
"2026-09-14T23:35:50Z",
"py_nrz1szawhy",
"sale",
1734.54,
"contactless",
"… 8 more in fraud.json"
],
[
"2026-09-21T21:40:33Z",
"py_sgkaigm1ig",
"sale",
291.65,
"chip",
"… 8 more in fraud.json"
],
"… 87 more in fraud.json"
]
},
"disputes_and_fraud_reports": {
"columns": [
"received",
"kind",
"sale_id",
"sale_ts",
"amount_usd",
"… 4 more in fraud.json"
],
"rows": [
[
"2026-10-03",
"fraud report",
"py_08n4cv5jja",
"2026-10-02T06:07:40Z",
2180,
"… 4 more in fraud.json"
],
[
"2026-10-03",
"fraud report",
"py_t5ua6rma30",
"2026-10-02T06:16:09Z",
2180,
"… 4 more in fraud.json"
],
[
"2026-10-04",
"fraud report",
"py_gkptz1dofw",
"2026-10-02T06:24:41Z",
1240,
"… 4 more in fraud.json"
],
[
"2026-10-04",
"fraud report",
"py_ctzodz0ifl",
"2026-10-02T06:34:31Z",
890,
"… 4 more in fraud.json"
],
[
"2026-10-04",
"fraud report",
"py_23482ck2nx",
"2026-10-02T06:44:31Z",
1090,
"… 4 more in fraud.json"
],
"… 10 more in fraud.json"
]
},
"dashboard_activity_90_days": {
"columns": [
"ts",
"user",
"event",
"device",
"ip_location"
],
"rows": [
[
"2026-07-10T02:12:27Z",
"Travis Kessler (owner)",
"Login",
"iPhone 13, our app (dev_7f3a91)",
"Mesa AZ, residential ISP"
],
[
"2026-07-23T03:06:19Z",
"Travis Kessler (owner)",
"Login",
"iPhone 13, our app (dev_7f3a91)",
"Mesa AZ, residential ISP"
],
[
"2026-08-05T01:36:28Z",
"Travis Kessler (owner)",
"Login",
"iPhone 13, our app (dev_7f3a91)",
"Mesa AZ, residential ISP"
],
[
"2026-08-20T04:00:43Z",
"Travis Kessler (owner)",
"Login",
"iPhone 13, our app (dev_7f3a91)",
"Mesa AZ, residential ISP"
],
[
"2026-09-03T02:24:40Z",
"Travis Kessler (owner)",
"Login",
"iPhone 13, our app (dev_7f3a91)",
"Mesa AZ, residential ISP"
],
"… 20 more in fraud.json"
]
},
"linked_accounts": {
"devices": "dev_7f3a91 (the owner's iPhone, used for every app login since onboarding) also logged in to the dashboard of Copperline Mobile Detailing LLC (Tucson, AZ) from 2026-03-11 to 2026-08-12. Copperline was terminated on 2026-08-14 for keyed-card fraud (31 issuer fraud reports in 9 days) and listed on MATCH; its owner of record is a different person.",
"bank_accounts": "Checking x0472 is not on file for any other merchant",
"people_and_addresses": "No other merchant shares the owner's name, SSN, phone, email or home address",
"cards": "4 of this merchant's keyed cards were declined at two other merchants on our platform in the last 10 days; both are under review for keyed sales"
},
"website_and_business_checks": {
"checked": "2026-10-07",
"website": "One-page site on a website builder; domain registered 2026-04-28; stock photos; phone number matches; no license number shown",
"contractor_license": "The Arizona contractor license number given at onboarding is not found in the state's public license lookup, and no license is found under the business or owner name",
"online_presence": "No map listing or customer reviews found",
"business_address": "Mailbox store, as at onboarding"
},
"earlier_reviews": [
{
"date": "2026-05-28",
"type": "Onboarding underwriting",
"result": "Approved, standard tier, $25,000 monthly limit"
},
{
"date": "2026-09-22",
"type": "Limit increase request",
"result": "Raised to $40,000 a month on the uploaded contract"
}
],
"merchant_contacts": [
{
"ts": "2026-09-19T17:05:31Z",
"channel": "Support chat",
"summary": "Owner asked for a $60,000 monthly limit: 'We just signed a commercial maintenance contract with a property management company, 40+ units, and need to run the deposits.'"
},
{
"ts": "2026-10-06T17:30:00Z",
"channel": "Phone call from our risk analyst to the phone on file",
"summary": "Owner said the keyed sales are replacements for the property management company's units 'in several states' using subcontracted installers, and that tenants and unit owners pay him directly by phone, which is why the cards are from many states. He could not name the subcontractors. He keys the sales late at night because 'that's when I do my paperwork'. He promised invoices."
},
{
"ts": "2026-10-07T03:12:00Z",
"channel": "Email from the merchant",
"summary": "Three invoices attached (word-processor template, no license number). Service addresses are in Houston TX, Atlanta GA and Orlando FL; the amounts match three keyed sales, but the customer names on them differ from the names typed with those sales."
}
],
"legend": {
"entry": {
"chip": "Chip read on our card reader",
"contactless": "Tap on our card reader (card or phone wallet)",
"tap to pay": "Tap on the merchant's phone with our app",
"keyed": "Card number typed into the virtual terminal in the merchant's dashboard",
"online checkout": "Our hosted checkout on the merchant's website; the customer enters the card",
"payment link": "Link the merchant texts or emails to the customer; the customer enters the card",
"invoice": "Invoice emailed from the dashboard and paid by card on our invoice page"
},
"checks": "AVS (address check, card-not-present only): Y street and ZIP match, Z ZIP only, A street only, N no match, U not supported (non-US card). CVV: M match, N no match. 3DS: our online checkout and payment links request 3-D Secure only when the merchant turns it on.",
"billing_zip_state": "State of the billing ZIP entered with a card-not-present sale",
"card_history": "Earlier approved sales on the same card at this merchant",
"response": "00 approved, 05 do not honor, 51 insufficient funds, 54 expired card, N7 CVV mismatch, 59 suspected fraud"
},
"alert": {
"id": "alert_8NC4W2",
"raised": "2026-10-07T14:20:00Z",
"rules_fired": [
"Volume: $96,245.00 of keyed sales in 6 days; October to date is 241% of the $40,000 monthly limit",
"Entry mode: keyed sales are 100% of the last 7 days' volume; declared 0%",
"Issuer fraud reports: 11 in 5 days",
"Chargebacks: 4 fraud chargebacks in 3 days",
"Payout account changed 2 days before the volume spike; instant payouts turned on the next day",
"Device link to a terminated merchant listed on MATCH"
],
"our_merchant_risk_score": "94 (0 to 100; our review threshold is 70)",
"assigned_to": "Merchant risk analyst"
}
},
"questions": {
"risk_type": {
"type": "choice",
"instructions": "From the payments platform's point of view, which best explains the merchant activity that raised this review?",
"criteria": {
"legitimate_business": "The merchant's real business explains it: growth, a seasonal peak, a promotion, a large genuine order, or a new product or sales channel, paid for by real customers",
"business_trouble": "A real business whose refunds or chargebacks come from late or failed delivery, quality complaints or money trouble, not from fraud",
"stolen_cards_at_checkout": "Fraudsters, not the merchant, are paying with stolen card numbers at the merchant's checkout, by card testing with small payments or by buying goods to resell; the merchant is a victim",
"bust_out": "The merchant itself is running sales it knows are fraudulent (stolen cards keyed in, its own or accomplices' cards, or orders it never means to fulfill) to collect payouts before the chargebacks arrive",
"transaction_laundering": "The account is processing payments for a different, undisclosed business, often a prohibited or higher-risk one, behind the business it declared",
"account_takeover": "Someone other than the merchant has taken over its dashboard or account, for example to change the payout bank account or to issue refunds"
}
},
"matches_declared_business": {
"type": "noul",
"instructions": "Does the merchant's recent processing match the business it declared at onboarding: the products or services it sells, its price points, how its customers pay (in person, online, invoiced or keyed) and where its customers are? Growth in the same business, and seasonal peaks the business has had before, still match."
},
"loss_likelihood": {
"type": "score",
"instructions": "If payouts continue on their normal schedule, how likely is it that the platform will have to pay for chargebacks, refunds or card network fines on this merchant's recent sales because the merchant can't or won't cover them?",
"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 merchant risk team do with this merchant account now?",
"criteria": {
"no_action": "Clear the alert: keep processing and payouts on their normal schedule, raising processing limits if the growth is genuine",
"request_documents": "Keep processing and payouts going, and ask the merchant for documents that explain the activity (invoices, proof of delivery, supplier receipts, contracts)",
"reserve_or_delay_payouts": "Keep processing, but hold back a reserve or delay payouts to cover the chargebacks and refunds we could be left with",
"suspend": "Stop new payments and hold all payouts while the team investigates",
"terminate": "Close the merchant account, keep its funds to cover chargebacks through the dispute window, and list it on Mastercard's MATCH file where the reason qualifies"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_898983617e764e1d8a86f551fe2a79ee",
"model": "grayson-1",
"answers": {
"risk_type": {
"type": "choice",
"choice": "bust_out",
"confidence": 0.9598,
"probabilities": {
"legitimate_business": 0.0095,
"business_trouble": 0.0035,
"stolen_cards_at_checkout": 0.0074,
"bust_out": 0.9665,
"transaction_laundering": 0.0074,
"account_takeover": 0.0057
}
},
"matches_declared_business": {
"type": "noul",
"noul": 0.0028
},
"loss_likelihood": {
"type": "score",
"score": 3.892,
"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.9388,
"probabilities": {
"0": 0.012,
"1": 0.0082,
"2": 0.0064,
"3": 0.0224,
"4": 0.951
}
},
"action": {
"type": "choice",
"choice": "terminate",
"confidence": 0.9177,
"probabilities": {
"no_action": 0.0009,
"request_documents": 0.0026,
"reserve_or_delay_payouts": 0.0026,
"suspend": 0.0597,
"terminate": 0.9342
}
}
},
"usage": {
"input_tokens": 17559,
"output_tokens": 0
}
}Open in Playground
A pumpkin farm's October peak, with new online tickets and a new bank account. A family farm's daily volume jumped to 14.6 times its summer average, about half of it online, three weeks after it changed its payout bank account. The record explains each part: the same peak in the last three Octobers, timed tickets launched on its own website, a verified account in the farm's name the owner called about first, and a storm closure behind the refunds.
| Question | Grayson's answer |
|---|---|
risk_type | legitimate_business, confidence 97% |
matches_declared_business | 99% true |
loss_likelihood | 0.05 of 4, confidence 95% |
action | no_action, confidence 97% |
15,693 input tokens, $0.00055 per decision, answered in 286 ms.
The request, with long lists cut short. The full request is legitimate.json (63 KB).
{
"model": "grayson-1",
"state": {
"platform": {
"who_we_are": "We are a payment facilitator for small US businesses. Merchants take cards through our card readers and Tap to Pay, online checkout, payment links, invoices, and a virtual terminal (card numbers keyed into the dashboard). We settle through our sponsor bank and pay out to each merchant's bank account. Chargebacks, refunds and card network fines the merchant can't cover are our loss.",
"standard_payouts": "Automatic, every business day, of the previous business day's sales less fees, refunds and chargebacks",
"instant_payouts": "Available after 90 days in good standing: on-demand payout to a debit card, 1.75% fee, up to $15,000 a day",
"fees": "Card-present 2.6% + $0.15; online checkout, payment links and invoices 2.9% + $0.30; keyed 3.5% + $0.15; chargeback fee $15",
"dispute_window": "Most cardholder disputes arrive within 120 days of the sale, or of the expected delivery date for goods and services not yet delivered"
},
"merchant": {
"merchant_id": "mer_2TG7M4PB",
"legal_name": "Hollis Family Farm LLC",
"dba": "Hollis Farm Pumpkin Patch & Corn Maze",
"entity": "Ohio LLC, two members",
"formed": "2011-03-02 (Ohio Secretary of State: active)",
"ein": "xx-xxx8810 (IRS TIN match: name and EIN match)",
"business_address": "4470 Corwin Rd, Waynesville, OH 45068 (the farm)",
"address_check": "Agricultural property; matches county records for the owners",
"phone": "(513) 555-0164 (landline)",
"email": "tickets@hollisfarm.example",
"website": "hollisfarm.example",
"mcc": "7999 Recreation services",
"declared_business": "Family farm: fall pumpkin patch, corn maze and hayrides (mid-September to November 1), farm market, spring strawberry picking (May and June), Christmas wreaths in December. School field trips and parties invoiced in advance.",
"onboarded": "2023-08-14",
"account_status": "Active"
},
"owners": [
{
"name": "Ruth A. Hollis",
"role": "Member, manager",
"ownership_pct": 50,
"home": "Waynesville, OH",
"id_check": "Ohio driver license verified (2023-08-14)",
"ssn_check": "Match; credit file since 1987",
"sanctions_and_pep": "No match",
"other_merchants_on_platform": "None"
},
{
"name": "Daniel J. Hollis",
"role": "Member",
"ownership_pct": 50,
"home": "Waynesville, OH",
"id_check": "Ohio driver license verified (2023-08-14)",
"ssn_check": "Match; credit file since 1992",
"sanctions_and_pep": "No match",
"other_merchants_on_platform": "None"
}
],
"underwriting": {
"risk_tier": "Standard (seasonal)",
"declared_monthly_volume_usd": "Seasonal: about $35,000 in a typical month; $250,000 to $300,000 in October",
"declared_average_ticket_usd": 38,
"declared_max_ticket_usd": 6000,
"declared_channels": "85% card readers at the gate and farm market, 15% invoices and online bookings",
"declared_customers": "Families from the Cincinnati and Dayton areas; schools and companies for group visits",
"refund_policy": "Tickets refunded if the farm closes for weather; otherwise no refunds",
"fulfillment": "Same day at the gate; online tickets and group visits are for a chosen date in the season",
"processing_limits": "Monthly $350,000, single sale $10,000; soft limits that raise a review",
"reserve": "None",
"notes": "Seasonal volume reviewed and accepted at onboarding; limits set for the October peak."
},
"payout_account": {
"current": "Business checking x5583 at a different bank (verified 2026-09-16 by instant account verification; account holder HOLLIS FAMILY FARM LLC matches)",
"previous": "Business checking x2207, Ohio community bank (2023-08-14 to 2026-09-16)",
"changes": [
{
"ts": "2026-09-16T13:22:51Z",
"change": "Bank account changed from x2207 to x5583",
"how": "Ruth Hollis's usual MacBook, Chrome, Waynesville OH fixed-wireless ISP; texted code to the phone on file entered"
}
]
},
"balance": {
"as_of": "2026-10-06T13:50:00Z",
"available_usd": 706.2,
"next_payout": "2026-10-07, automatic",
"online_tickets_for_future_dates_usd": 14039,
"invoiced_group_visits_for_future_dates_usd": 31977,
"undelivered_sales_for_future_dates_usd": 46016
},
"payouts_30_days": {
"columns": [
"ts",
"type",
"amount_usd",
"instant_fee_usd",
"destination",
"status"
],
"rows": [
[
"2026-09-08T10:00:00Z",
"standard",
10986.8,
0,
"x2207 community bank",
"paid"
],
[
"2026-09-09T10:00:00Z",
"standard",
2491.33,
0,
"x2207 community bank",
"paid"
],
[
"2026-09-10T10:00:00Z",
"standard",
1933.76,
0,
"x2207 community bank",
"paid"
],
[
"2026-09-11T10:00:00Z",
"standard",
5494.24,
0,
"x2207 community bank",
"paid"
],
[
"2026-09-14T10:00:00Z",
"standard",
29270.14,
0,
"x2207 community bank",
"paid"
],
"… 16 more in legitimate.json"
]
},
"monthly_processing": {
"columns": [
"month",
"sales",
"gross_usd",
"avg_ticket_usd",
"card_present_pct",
"… 6 more in legitimate.json"
],
"rows": [
[
"2025-10",
6932,
247851.04,
35.75,
93.2,
"… 6 more in legitimate.json"
],
[
"2025-11",
645,
22127.73,
34.31,
100,
"… 6 more in legitimate.json"
],
[
"2025-12",
211,
10695,
50.69,
100,
"… 6 more in legitimate.json"
],
[
"2026-01",
22,
188,
8.55,
100,
"… 6 more in legitimate.json"
],
[
"2026-02",
10,
82,
8.2,
100,
"… 6 more in legitimate.json"
],
"… 8 more in legitimate.json"
]
},
"season_history": "October gross: 2023 $171,480; 2024 $226,915; 2025 in the monthly table. Each season raised a volume alert that was cleared.",
"daily_processing_60_days": {
"columns": [
"date",
"day",
"sales",
"gross_usd",
"card_present_usd",
"… 6 more in legitimate.json"
],
"rows": [
[
"2026-08-07",
"Fri",
13,
183.9,
183.9,
"… 6 more in legitimate.json"
],
[
"2026-08-08",
"Sat",
17,
312.79,
312.79,
"… 6 more in legitimate.json"
],
[
"2026-08-09",
"Sun",
28,
443.08,
443.08,
"… 6 more in legitimate.json"
],
[
"2026-08-10",
"Mon",
0,
0,
0,
"… 6 more in legitimate.json"
],
[
"2026-08-11",
"Tue",
0,
0,
0,
"… 6 more in legitimate.json"
],
"… 55 more in legitimate.json"
]
},
"card_mix_30_days": {
"window": "2026-09-06 to 2026-10-05",
"all_sales": {
"count": 5000,
"distinct_cards": 4914,
"card_types": {
"credit": "3074 (61%)",
"debit": "1810 (36%)",
"prepaid": "116 (2%)"
},
"non_us_cards": 29,
"declined_attempts": 91
},
"card_not_present_sales": {
"count": 1459,
"gross_usd": 129027,
"distinct_cards": 1459,
"cards_with_more_than_one_sale": 0,
"entry": {
"online checkout": "1415 (97%)",
"invoice": "44 (3%)"
},
"brands": {
"Visa": "779 (53%)",
"Mastercard": "392 (27%)",
"Amex": "174 (12%)",
"Discover": "114 (8%)"
},
"card_types": {
"credit": "908 (62%)",
"debit": "522 (36%)",
"prepaid": "29 (2%)"
},
"issuers": {
"US national bank": "385 (26%)",
"US regional bank": "243 (17%)",
"US credit union": "199 (14%)",
"US card issuer": "190 (13%)",
"American Express": "174 (12%)",
"Discover": "114 (8%)",
"US online bank": "83 (6%)",
"US bank, commercial purchasing card": "42 (3%)",
"US prepaid program": "29 (2%)"
},
"issuer_countries": {
"US": "1447 (99%)",
"CA": "12 (1%)"
},
"billing_zip_states": {
"OH": "1447 (99%)"
},
"avs": {
"Y": "1262 (86%)",
"Z": "135 (9%)",
"N": "50 (3%)",
"U": "12 (1%)"
},
"cvv": {
"M": "1459 (100%)"
},
"declined_attempts": 49
},
"note": "Card-not-present sales are online timed tickets (from 2026-08-20), birthday packages and invoices; most invoices are paid by schools' purchasing cards."
},
"transactions_250_plus_30_days": {
"columns": [
"ts",
"id",
"type",
"amount_usd",
"entry",
"… 8 more in legitimate.json"
],
"rows": [
[
"2026-09-06T13:23:21Z",
"py_yoaht7wm2q",
"sale",
1023,
"invoice",
"… 8 more in legitimate.json"
],
[
"2026-09-06T20:05:15Z",
"py_cuc9ub4neg",
"sale",
375,
"online checkout",
"… 8 more in legitimate.json"
],
[
"2026-09-07T14:37:41Z",
"py_67upfkgzrz",
"sale",
705,
"invoice",
"… 8 more in legitimate.json"
],
[
"2026-09-07T16:17:00Z",
"py_rinj3rrv72",
"sale",
1017,
"invoice",
"… 8 more in legitimate.json"
],
[
"2026-09-08T15:26:50Z",
"py_jcoynh28a6",
"sale",
648,
"invoice",
"… 8 more in legitimate.json"
],
"… 57 more in legitimate.json"
]
},
"disputes_and_fraud_reports": {
"columns": [
"received",
"kind",
"sale_id",
"sale_ts",
"amount_usd",
"… 4 more in legitimate.json"
],
"rows": [
[
"2025-11-13",
"chargeback",
"py_kkyivf4wt7",
"2025-10-09T15:22:28Z",
22.77,
"… 4 more in legitimate.json"
],
[
"2025-11-13",
"chargeback",
"py_6ahpk8a60g",
"2025-10-21T14:19:29Z",
48,
"… 4 more in legitimate.json"
],
[
"2026-07-08",
"chargeback",
"py_6mre4y8cjq",
"2026-06-06T20:01:26Z",
18,
"… 4 more in legitimate.json"
],
[
"2026-10-01",
"fraud report",
"py_q89ky3uwwo",
"2026-09-20T11:34:46Z",
64,
"… 4 more in legitimate.json"
],
[
"2026-10-02",
"chargeback",
"py_x5wc3a5nku",
"2026-09-25T19:16:39Z",
101,
"… 4 more in legitimate.json"
],
[
"2026-10-03",
"chargeback",
"py_q89ky3uwwo",
"2026-09-20T11:34:46Z",
64,
"… 4 more in legitimate.json"
]
]
},
"dashboard_activity_90_days": {
"columns": [
"ts",
"user",
"event",
"device",
"ip_location"
],
"rows": [
[
"2026-07-13T12:12:21Z",
"Ruth Hollis (owner)",
"Login",
"MacBook, Chrome (dev_a41c07)",
"Waynesville OH, fixed-wireless ISP"
],
[
"2026-07-27T11:54:48Z",
"Ruth Hollis (owner)",
"Login",
"MacBook, Chrome (dev_a41c07)",
"Waynesville OH, fixed-wireless ISP"
],
[
"2026-08-10T12:24:07Z",
"Ruth Hollis (owner)",
"Login",
"MacBook, Chrome (dev_a41c07)",
"Waynesville OH, fixed-wireless ISP"
],
[
"2026-08-25T01:06:01Z",
"Ruth Hollis (owner)",
"Login",
"MacBook, Chrome (dev_a41c07)",
"Waynesville OH, fixed-wireless ISP"
],
[
"2026-09-14T11:36:09Z",
"Ruth Hollis (owner)",
"Login",
"MacBook, Chrome (dev_a41c07)",
"Waynesville OH, fixed-wireless ISP"
],
"… 13 more in legitimate.json"
]
},
"linked_accounts": {
"devices": "No device that used this dashboard has used another merchant's",
"bank_accounts": "Checking x5583 is not on file for any other merchant",
"people_and_addresses": "None shared with other merchants",
"cards": "No cards from this merchant's sales are linked to fraud at other merchants on our platform"
},
"website_and_business_checks": {
"checked": "2026-10-06",
"website": "Site live since at least 2014; season dates (Sept 12 to Nov 1), prices ($16 weekend, $12 weekday), timed-entry tickets through our checkout, field trip booking form, and a weather policy promising refunds when the farm closes",
"weather_notice": "Banner and social post on 2026-09-27: 'Closing at 1 pm today for the severe thunderstorm warning. Afternoon tickets will be refunded automatically.'",
"online_presence": "Map listing with 2,140 reviews, 4.7 stars; listed in the county's fall farm guide",
"business_address": "Working farm, matches the website and county records"
},
"earlier_reviews": [
{
"date": "2023-08-14",
"type": "Onboarding underwriting",
"result": "Approved, seasonal tier"
},
{
"date": "2023-10-03",
"type": "Volume alert",
"result": "Cleared: first fall season, matches declared seasonality"
},
{
"date": "2024-10-08",
"type": "Volume alert",
"result": "Cleared: seasonal, same pattern as 2023"
},
{
"date": "2025-10-07",
"type": "Volume alert",
"result": "Cleared: seasonal; October 2025 up 9% on 2024"
}
],
"merchant_contacts": [
{
"ts": "2026-08-19T14:10:22Z",
"channel": "Support chat",
"summary": "Owner asked how to sell timed-entry tickets online through our checkout: 'Lines at the gate were too long last year.'"
},
{
"ts": "2026-09-15T18:05:00Z",
"channel": "Inbound call from the phone on file",
"summary": "Ruth Hollis said they refinanced the farm's operating line with a new lender, who requires the operating account at its bank, and that she would change the payout account tomorrow."
},
{
"ts": "2026-09-28T13:30:00Z",
"channel": "Email from the merchant",
"summary": "'We closed at 1 pm Sunday for the storm and refunded every afternoon ticket for the 27th, so you'll see a lot of refunds. Please don't flag us!'"
}
],
"legend": {
"entry": {
"chip": "Chip read on our card reader",
"contactless": "Tap on our card reader (card or phone wallet)",
"tap to pay": "Tap on the merchant's phone with our app",
"keyed": "Card number typed into the virtual terminal in the merchant's dashboard",
"online checkout": "Our hosted checkout on the merchant's website; the customer enters the card",
"payment link": "Link the merchant texts or emails to the customer; the customer enters the card",
"invoice": "Invoice emailed from the dashboard and paid by card on our invoice page"
},
"checks": "AVS (address check, card-not-present only): Y street and ZIP match, Z ZIP only, A street only, N no match, U not supported (non-US card). CVV: M match, N no match. 3DS: our online checkout and payment links request 3-D Secure only when the merchant turns it on.",
"billing_zip_state": "State of the billing ZIP entered with a card-not-present sale",
"card_history": "Earlier approved sales on the same card at this merchant",
"response": "00 approved, 05 do not honor, 51 insufficient funds, 54 expired card, N7 CVV mismatch, 59 suspected fraud"
},
"alert": {
"id": "alert_3RW9K6",
"raised": "2026-10-06T13:50:00Z",
"rules_fired": [
"Volume: last 30 days' daily average is 14.6 times the previous 90 days'",
"Channel: card-not-present share 53% in the last 30 days; declared 15%",
"Payout account changed 20 days before the volume spike",
"Refunds: 2026-09-27 refund rate over 20% of the day's sales",
"New dashboard user added in the last 30 days"
],
"our_merchant_risk_score": "71 (0 to 100; our review threshold is 70)",
"assigned_to": "Merchant risk analyst"
}
},
"questions": {
"risk_type": {
"type": "choice",
"instructions": "From the payments platform's point of view, which best explains the merchant activity that raised this review?",
"criteria": {
"legitimate_business": "The merchant's real business explains it: growth, a seasonal peak, a promotion, a large genuine order, or a new product or sales channel, paid for by real customers",
"business_trouble": "A real business whose refunds or chargebacks come from late or failed delivery, quality complaints or money trouble, not from fraud",
"stolen_cards_at_checkout": "Fraudsters, not the merchant, are paying with stolen card numbers at the merchant's checkout, by card testing with small payments or by buying goods to resell; the merchant is a victim",
"bust_out": "The merchant itself is running sales it knows are fraudulent (stolen cards keyed in, its own or accomplices' cards, or orders it never means to fulfill) to collect payouts before the chargebacks arrive",
"transaction_laundering": "The account is processing payments for a different, undisclosed business, often a prohibited or higher-risk one, behind the business it declared",
"account_takeover": "Someone other than the merchant has taken over its dashboard or account, for example to change the payout bank account or to issue refunds"
}
},
"matches_declared_business": {
"type": "noul",
"instructions": "Does the merchant's recent processing match the business it declared at onboarding: the products or services it sells, its price points, how its customers pay (in person, online, invoiced or keyed) and where its customers are? Growth in the same business, and seasonal peaks the business has had before, still match."
},
"loss_likelihood": {
"type": "score",
"instructions": "If payouts continue on their normal schedule, how likely is it that the platform will have to pay for chargebacks, refunds or card network fines on this merchant's recent sales because the merchant can't or won't cover them?",
"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 merchant risk team do with this merchant account now?",
"criteria": {
"no_action": "Clear the alert: keep processing and payouts on their normal schedule, raising processing limits if the growth is genuine",
"request_documents": "Keep processing and payouts going, and ask the merchant for documents that explain the activity (invoices, proof of delivery, supplier receipts, contracts)",
"reserve_or_delay_payouts": "Keep processing, but hold back a reserve or delay payouts to cover the chargebacks and refunds we could be left with",
"suspend": "Stop new payments and hold all payouts while the team investigates",
"terminate": "Close the merchant account, keep its funds to cover chargebacks through the dispute window, and list it on Mastercard's MATCH file where the reason qualifies"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_28c9ac70d7994198a42c6ae31138c7ed",
"model": "grayson-1",
"answers": {
"risk_type": {
"type": "choice",
"choice": "legitimate_business",
"confidence": 0.9715,
"probabilities": {
"legitimate_business": 0.9763,
"business_trouble": 0.0084,
"stolen_cards_at_checkout": 0.0027,
"bust_out": 0.0058,
"transaction_laundering": 0.0027,
"account_takeover": 0.004
}
},
"matches_declared_business": {
"type": "noul",
"noul": 0.9859
},
"loss_likelihood": {
"type": "score",
"score": 0.052,
"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.9541,
"probabilities": {
"0": 0.9633,
"1": 0.0291,
"2": 0.0027,
"3": 0.0019,
"4": 0.0031
}
},
"action": {
"type": "choice",
"choice": "no_action",
"confidence": 0.9651,
"probabilities": {
"no_action": 0.9721,
"request_documents": 0.0139,
"reserve_or_delay_payouts": 0.0074,
"suspend": 0.0045,
"terminate": 0.0021
}
}
},
"usage": {
"input_tokens": 15693,
"output_tokens": 0
}
}Open in Playground
A phone repair shop starts selling refurbished iPhones by payment link. A three-year repair shop began selling refurbished phones to buyers in other states through texted payment links, and its card-not-present share went from almost nothing to about half. It sent supplier invoices and tracking and sells the same phones in store, but five sales drew issuer fraud reports and several went to a package forwarder seen at other merchants.
| Question | Grayson's answer |
|---|---|
risk_type | legitimate_business, confidence 83% |
matches_declared_business | Under 1% true |
loss_likelihood | 0.48 of 4, confidence 61% (Very unlikely 69%, Unlikely 22%, Uncertain 3%, Likely 3%, Very likely 2%) |
action | request_documents, confidence 32% |
16,161 input tokens, $0.00057 per decision, answered in 215 ms.
The request, with long lists cut short. The full request is ambiguous.json (65 KB).
{
"model": "grayson-1",
"state": {
"platform": {
"who_we_are": "We are a payment facilitator for small US businesses. Merchants take cards through our card readers and Tap to Pay, online checkout, payment links, invoices, and a virtual terminal (card numbers keyed into the dashboard). We settle through our sponsor bank and pay out to each merchant's bank account. Chargebacks, refunds and card network fines the merchant can't cover are our loss.",
"standard_payouts": "Automatic, every business day, of the previous business day's sales less fees, refunds and chargebacks",
"instant_payouts": "Available after 90 days in good standing: on-demand payout to a debit card, 1.75% fee, up to $15,000 a day",
"fees": "Card-present 2.6% + $0.15; online checkout, payment links and invoices 2.9% + $0.30; keyed 3.5% + $0.15; chargeback fee $15",
"dispute_window": "Most cardholder disputes arrive within 120 days of the sale, or of the expected delivery date for goods and services not yet delivered"
},
"merchant": {
"merchant_id": "mer_8DJ3R5NL",
"legal_name": "Northgate Device Repair LLC",
"dba": "Northgate Phone & Tablet Repair",
"entity": "California LLC, single member",
"formed": "2019-06-11 (California Secretary of State: active)",
"ein": "xx-xxx2093 (IRS TIN match: name and EIN match)",
"business_address": "3318 Northgate Blvd Ste C, Sacramento, CA 95834",
"address_check": "Retail storefront in a strip mall; street imagery shows the shop's sign",
"phone": "(916) 555-0122 (landline)",
"email": "minh@northgaterepair.example",
"website": "northgaterepair.example",
"mcc": "7622 Electronics repair shops",
"declared_business": "Phone and tablet repair (screens, batteries, charging ports) and accessories, in store. Occasional invoices to local business customers.",
"onboarded": "2023-03-20",
"account_status": "Active"
},
"owners": [
{
"name": "Minh Q. Dao",
"role": "Owner",
"ownership_pct": 100,
"home": "Sacramento, CA",
"id_check": "California driver license verified (2023-03-20)",
"ssn_check": "Match; credit file since 2009",
"sanctions_and_pep": "No match",
"other_merchants_on_platform": "None"
}
],
"underwriting": {
"risk_tier": "Standard",
"declared_monthly_volume_usd": 16000,
"declared_average_ticket_usd": 110,
"declared_max_ticket_usd": 700,
"declared_channels": "95% card reader in store, 5% invoices",
"declared_customers": "Walk-in customers in the Sacramento area; a few local businesses",
"refund_policy": "90-day warranty on repairs; accessories returnable within 14 days",
"fulfillment": "Same day in store",
"processing_limits": "Monthly $30,000, single sale $1,500; soft limits that raise a review",
"reserve": "None",
"notes": "Annual review 2025-03-24: no changes."
},
"payout_account": {
"current": "Business checking x6125, California community bank (verified 2023-03-20 with a voided check; name matched)",
"previous": "None",
"changes": [],
"returned_debits": "2026-07-15: our debit of $177.04 to cover a negative balance after a chargeback returned R01 (insufficient funds); repaid by the merchant on 2026-07-17"
},
"balance": {
"as_of": "2026-10-07T16:05:00Z",
"available_usd": 0,
"next_payout": "2026-10-08, automatic",
"payment_link_sales_since_2026_09_08_usd": 24182,
"payment_link_sales_shipped_or_picked_up_usd": 22144
},
"payouts_30_days": {
"columns": [
"ts",
"type",
"amount_usd",
"instant_fee_usd",
"destination",
"status"
],
"rows": [
[
"2026-09-08T13:00:00Z",
"standard",
3350.62,
0,
"x6125 business checking",
"paid"
],
[
"2026-09-09T13:00:00Z",
"standard",
1202.16,
0,
"x6125 business checking",
"paid"
],
[
"2026-09-10T13:00:00Z",
"standard",
1604.68,
0,
"x6125 business checking",
"paid"
],
[
"2026-09-11T13:00:00Z",
"standard",
823.61,
0,
"x6125 business checking",
"paid"
],
[
"2026-09-14T13:00:00Z",
"standard",
4533.84,
0,
"x6125 business checking",
"paid"
],
"… 16 more in ambiguous.json"
]
},
"monthly_processing": {
"columns": [
"month",
"sales",
"gross_usd",
"avg_ticket_usd",
"card_present_pct",
"… 6 more in ambiguous.json"
],
"rows": [
[
"2025-10",
153,
18994.93,
124.15,
95.5,
"… 6 more in ambiguous.json"
],
[
"2025-11",
159,
19529.9,
122.83,
100,
"… 6 more in ambiguous.json"
],
[
"2025-12",
231,
26518.02,
114.8,
100,
"… 6 more in ambiguous.json"
],
[
"2026-01",
183,
22009.37,
120.27,
98.8,
"… 6 more in ambiguous.json"
],
[
"2026-02",
170,
20553.26,
120.9,
100,
"… 6 more in ambiguous.json"
],
"… 8 more in ambiguous.json"
]
},
"daily_processing_60_days": {
"columns": [
"date",
"day",
"sales",
"gross_usd",
"card_present_usd",
"… 6 more in ambiguous.json"
],
"rows": [
[
"2026-08-08",
"Sat",
6,
574.17,
574.17,
"… 6 more in ambiguous.json"
],
[
"2026-08-09",
"Sun",
5,
636.19,
636.19,
"… 6 more in ambiguous.json"
],
[
"2026-08-10",
"Mon",
6,
789.51,
789.51,
"… 6 more in ambiguous.json"
],
[
"2026-08-11",
"Tue",
3,
178.33,
178.33,
"… 6 more in ambiguous.json"
],
[
"2026-08-12",
"Wed",
7,
578.52,
578.52,
"… 6 more in ambiguous.json"
],
"… 55 more in ambiguous.json"
]
},
"card_mix_30_days": {
"window": "2026-09-07 to 2026-10-06",
"all_sales": {
"count": 221,
"distinct_cards": 217,
"card_types": {
"credit": "137 (62%)",
"debit": "79 (36%)",
"prepaid": "5 (2%)"
},
"non_us_cards": 0,
"declined_attempts": 10
},
"card_not_present_sales": {
"count": 31,
"gross_usd": 25411.96,
"distinct_cards": 27,
"cards_with_more_than_one_sale": 3,
"entry": {
"payment link": "28 (90%)",
"invoice": "3 (10%)"
},
"brands": {
"Visa": "17 (55%)",
"Mastercard": "7 (23%)",
"Amex": "5 (16%)",
"Discover": "2 (6%)"
},
"card_types": {
"credit": "24 (77%)",
"debit": "7 (23%)"
},
"issuers": {
"US national bank": "9 (29%)",
"US regional bank": "6 (19%)",
"American Express": "5 (16%)",
"US card issuer": "5 (16%)",
"US credit union": "3 (10%)",
"Discover": "2 (6%)",
"US online bank": "1 (3%)"
},
"issuer_countries": {
"US": "31 (100%)"
},
"billing_zip_states": {
"CA": "8 (26%)",
"TX": "3 (10%)",
"AZ": "3 (10%)",
"NJ": "3 (10%)",
"OR": "2 (6%)",
"NV": "2 (6%)",
"WA": "2 (6%)",
"FL": "2 (6%)",
"GA": "2 (6%)",
"NY": "2 (6%)",
"IL": "1 (3%)",
"PA": "1 (3%)"
},
"avs": {
"Y": "27 (87%)",
"Z": "3 (10%)",
"N": "1 (3%)"
},
"cvv": {
"M": "31 (100%)"
},
"declined_attempts": 9
},
"note": "Before 2026-09-08 this merchant's only card-not-present sales were invoices to local businesses."
},
"transactions_250_plus_30_days": {
"columns": [
"ts",
"id",
"type",
"amount_usd",
"entry",
"… 8 more in ambiguous.json"
],
"rows": [
[
"2026-09-07T17:02:53Z",
"py_9ksf7tkyq7",
"sale",
270.79,
"contactless",
"… 8 more in ambiguous.json"
],
[
"2026-09-08T21:24:52Z",
"py_6i74u7ilri",
"sale",
649,
"payment link",
"… 8 more in ambiguous.json"
],
[
"2026-09-10T01:06:19Z",
"py_9150gptt9h",
"sale",
899,
"payment link",
"… 8 more in ambiguous.json"
],
[
"2026-09-10T01:43:16Z",
"py_do23c2ke3w",
"sale",
292.54,
"contactless",
"… 8 more in ambiguous.json"
],
[
"2026-09-10T20:55:38Z",
"py_9g6km3jkxu",
"sale",
705.79,
"contactless",
"… 8 more in ambiguous.json"
],
"… 57 more in ambiguous.json"
]
},
"disputes_and_fraud_reports": {
"columns": [
"received",
"kind",
"sale_id",
"sale_ts",
"amount_usd",
"… 4 more in ambiguous.json"
],
"rows": [
[
"2025-11-28",
"chargeback",
"py_4dgg4sg2lw",
"2025-11-04T20:37:08Z",
249.04,
"… 4 more in ambiguous.json"
],
[
"2025-11-28",
"chargeback",
"py_r9d30o4fsv",
"2025-11-04T22:05:44Z",
107.66,
"… 4 more in ambiguous.json"
],
[
"2026-07-14",
"chargeback",
"py_godwl8tq7g",
"2026-07-02T22:15:34Z",
162.04,
"… 4 more in ambiguous.json"
],
[
"2026-10-01",
"fraud report",
"py_ad5bfd9mld",
"2026-09-16T09:53:55Z",
1089,
"… 4 more in ambiguous.json"
],
[
"2026-10-03",
"fraud report",
"py_ic02ratkwt",
"2026-09-23T06:40:08Z",
1049,
"… 4 more in ambiguous.json"
],
"… 4 more in ambiguous.json"
]
},
"shipping_evidence": {
"uploaded": "2026-10-06T23:40:00Z",
"orders_shipped": 24,
"tracking_numbers_provided": 24,
"delivered_per_carrier": 22,
"in_transit": 2,
"signature_required": "On 9 shipments, all sent since 2026-10-01; earlier shipments left at the door",
"delivered_to": "The ship-to address on each payment link, including both shipments to the New Castle DE forwarding warehouse"
},
"dashboard_activity_90_days": {
"columns": [
"ts",
"user",
"event",
"device",
"ip_location"
],
"rows": [
[
"2026-07-11T03:30:58Z",
"Minh Dao (owner)",
"Login",
"iPhone 14, our app (dev_5b8e13)",
"Sacramento CA, cable ISP"
],
[
"2026-07-17T16:06:13Z",
"Minh Dao (owner)",
"Login",
"iPhone 14, our app (dev_5b8e13)",
"Sacramento CA, cable ISP"
],
[
"2026-08-01T04:12:50Z",
"Minh Dao (owner)",
"Login",
"iPhone 14, our app (dev_5b8e13)",
"Sacramento CA, cable ISP"
],
[
"2026-08-15T03:48:10Z",
"Minh Dao (owner)",
"Login",
"iPhone 14, our app (dev_5b8e13)",
"Sacramento CA, cable ISP"
],
[
"2026-08-29T04:24:46Z",
"Minh Dao (owner)",
"Login",
"iPhone 14, our app (dev_5b8e13)",
"Sacramento CA, cable ISP"
],
"… 19 more in ambiguous.json"
]
},
"linked_accounts": {
"devices": "No device that used this dashboard has used another merchant's",
"bank_accounts": "Checking x6125 is not on file for any other merchant",
"people_and_addresses": "None shared with other merchants",
"cards": "2 cards declined on this merchant's payment links (both shipping to the New Castle DE warehouse) were declined at another merchant on our platform selling game consoles in the last 30 days",
"ship_to": "The New Castle DE warehouse address appears on payment links at 3 other merchants on our platform in the last 90 days, all for phones, laptops or consoles"
},
"website_and_business_checks": {
"checked": "2026-10-07",
"website": "Repair price list unchanged. A 'Shop' page added 2026-08-30 lists 14 refurbished iPhones and Galaxy phones at $529 to $1,149 with photos taken in the shop, a 30-day return policy, 'ships nationwide' and 'text us to buy'. Website monitoring flagged the new page as a new product category.",
"online_presence": "Map listing with 384 reviews, 4.6 stars; recent reviews mention buying a refurbished phone in the shop",
"business_address": "Storefront matches the listing and street imagery",
"supplier_documents": "Two invoices from Delta Coast Wholesale Electronics (Hayward CA) dated 2026-08-27 and 2026-09-18 for 40 graded refurbished phones, $18,640 total; the supplier's website and California business registration exist; we have not contacted the supplier"
},
"earlier_reviews": [
{
"date": "2023-03-20",
"type": "Onboarding underwriting",
"result": "Approved, standard tier"
},
{
"date": "2025-03-24",
"type": "Annual review",
"result": "No changes"
},
{
"date": "2025-12-01",
"type": "Chargeback review (2 disputes in November)",
"result": "Closed: merchant added a written repair warranty to receipts"
}
],
"merchant_contacts": [
{
"ts": "2026-10-06T19:10:00Z",
"channel": "Phone call from our risk analyst to the shop's phone",
"summary": "Minh Dao said he started selling refurbished phones in late August because repairs are slow, buying graded stock from a wholesaler in Hayward. Buyers find him through his listings on online marketplaces and text him; he sends a payment link and ships by UPS the same or next day. He didn't know he should tell us about the new product line. He said he turned on the address check on October 1 and now requires a signature, and refunded two buyers who asked to change the address after paying. Asked about the Delaware address, he said 'two different buyers used it, I figured it was their office.' He agreed to send supplier invoices and tracking."
}
],
"legend": {
"entry": {
"chip": "Chip read on our card reader",
"contactless": "Tap on our card reader (card or phone wallet)",
"tap to pay": "Tap on the merchant's phone with our app",
"keyed": "Card number typed into the virtual terminal in the merchant's dashboard",
"online checkout": "Our hosted checkout on the merchant's website; the customer enters the card",
"payment link": "Link the merchant texts or emails to the customer; the customer enters the card",
"invoice": "Invoice emailed from the dashboard and paid by card on our invoice page"
},
"checks": "AVS (address check, card-not-present only): Y street and ZIP match, Z ZIP only, A street only, N no match, U not supported (non-US card). CVV: M match, N no match. 3DS: our online checkout and payment links request 3-D Secure only when the merchant turns it on.",
"billing_zip_state": "State of the billing ZIP entered with a card-not-present sale",
"card_history": "Earlier approved sales on the same card at this merchant",
"response": "00 approved, 05 do not honor, 51 insufficient funds, 54 expired card, N7 CVV mismatch, 59 suspected fraud"
},
"alert": {
"id": "alert_6HV1P8",
"raised": "2026-10-07T16:05:00Z",
"rules_fired": [
"Channel: card-not-present share 48% of the last 30 days' volume; declared 5%",
"Ticket size: average sale $239.89 in the last 30 days, against $118.50 in the 12 months before; payment link sales of $589 to $1,149",
"Issuer fraud reports: 5 in 7 days, 2 of them since the merchant was called",
"First fraud chargeback (Visa 10.4)",
"Website monitoring: new product category (refurbished phones)"
],
"our_merchant_risk_score": "76 (0 to 100; our review threshold is 70)",
"assigned_to": "Merchant risk analyst"
}
},
"questions": {
"risk_type": {
"type": "choice",
"instructions": "From the payments platform's point of view, which best explains the merchant activity that raised this review?",
"criteria": {
"legitimate_business": "The merchant's real business explains it: growth, a seasonal peak, a promotion, a large genuine order, or a new product or sales channel, paid for by real customers",
"business_trouble": "A real business whose refunds or chargebacks come from late or failed delivery, quality complaints or money trouble, not from fraud",
"stolen_cards_at_checkout": "Fraudsters, not the merchant, are paying with stolen card numbers at the merchant's checkout, by card testing with small payments or by buying goods to resell; the merchant is a victim",
"bust_out": "The merchant itself is running sales it knows are fraudulent (stolen cards keyed in, its own or accomplices' cards, or orders it never means to fulfill) to collect payouts before the chargebacks arrive",
"transaction_laundering": "The account is processing payments for a different, undisclosed business, often a prohibited or higher-risk one, behind the business it declared",
"account_takeover": "Someone other than the merchant has taken over its dashboard or account, for example to change the payout bank account or to issue refunds"
}
},
"matches_declared_business": {
"type": "noul",
"instructions": "Does the merchant's recent processing match the business it declared at onboarding: the products or services it sells, its price points, how its customers pay (in person, online, invoiced or keyed) and where its customers are? Growth in the same business, and seasonal peaks the business has had before, still match."
},
"loss_likelihood": {
"type": "score",
"instructions": "If payouts continue on their normal schedule, how likely is it that the platform will have to pay for chargebacks, refunds or card network fines on this merchant's recent sales because the merchant can't or won't cover them?",
"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 merchant risk team do with this merchant account now?",
"criteria": {
"no_action": "Clear the alert: keep processing and payouts on their normal schedule, raising processing limits if the growth is genuine",
"request_documents": "Keep processing and payouts going, and ask the merchant for documents that explain the activity (invoices, proof of delivery, supplier receipts, contracts)",
"reserve_or_delay_payouts": "Keep processing, but hold back a reserve or delay payouts to cover the chargebacks and refunds we could be left with",
"suspend": "Stop new payments and hold all payouts while the team investigates",
"terminate": "Close the merchant account, keep its funds to cover chargebacks through the dispute window, and list it on Mastercard's MATCH file where the reason qualifies"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_10d34c5184af420495427f975ab17d0d",
"model": "grayson-1",
"answers": {
"risk_type": {
"type": "choice",
"choice": "legitimate_business",
"confidence": 0.8307,
"probabilities": {
"legitimate_business": 0.8589,
"business_trouble": 0.0178,
"stolen_cards_at_checkout": 0.0705,
"bust_out": 0.0377,
"transaction_laundering": 0.0123,
"account_takeover": 0.0027
}
},
"matches_declared_business": {
"type": "noul",
"noul": 0.0025
},
"loss_likelihood": {
"type": "score",
"score": 0.477,
"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.6105,
"probabilities": {
"0": 0.6884,
"1": 0.2235,
"2": 0.0343,
"3": 0.0302,
"4": 0.0236
}
},
"action": {
"type": "choice",
"choice": "request_documents",
"confidence": 0.3188,
"probabilities": {
"no_action": 0.4016,
"request_documents": 0.455,
"reserve_or_delay_payouts": 0.048,
"suspend": 0.0698,
"terminate": 0.0257
}
}
},
"usage": {
"input_tokens": 16161,
"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.
actionis the recommendation. Sendterminateandsuspendabove their thresholds straight to holding funds, andreserve_or_delay_payoutsto the analyst who sets the reserve; when the top two options are close, take the more cautious one until an analyst has looked.loss_likelihood: threshold the sum of "Likely" and "Very likely" to decide which alerts get a payout hold before an analyst reviews them, and weight it by the money still to be paid out.risk_typeroutes the case:stolen_cards_at_checkoutandaccount_takeovermean the merchant is a victim, so help it lock down its checkout or dashboard instead of treating it as the suspect;transaction_launderingandbust_outgo to your financial crimes team.
Call it from your code
Save an example as request.json, such as legitimate.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
Monitoring rules fire on volume spikes, new sales channels, refund rates and payout account changes, and in a seasonal or growing business all of those are normal, so most alerts are cleared by hand. The few that matter look like the rest until you read the whole record: who keyed which cards and when, whether the payout account change came from the owner's usual device, whether the business had the same peak last year, and what the merchant's explanation leaves out. By the time chargebacks arrive, the payouts are gone.
What to send
Send the merchant as your risk analyst would review it, with the alert that raised it. The examples are about 15,700 to 17,600 input tokens each.
- The onboarding record: declared business and category code, expected volume and ticket size, how customers pay, and the owners' identity checks. The question is always whether today's activity fits what was declared.
- Processing history and card mix: monthly totals for a year (to show seasonality) and daily totals for two months, with entry mode, card types and issuing countries.
- The sales themselves: larger sales and refunds with entry mode, address and security code results, billing ZIP, ship-to and the customer's IP location. Cards keyed late at night from many states tell a different story from invoices paid by local schools.
- Disputes and issuer fraud reports, with reason codes. Fraud reports arrive days before chargebacks and are the earliest outside evidence.
- Payout account changes and dashboard activity: who made the change, from which device, and how the new account was verified.
- Links to other merchants: devices, bank accounts, cards and ship-to addresses shared with merchants you have terminated or are reviewing.
- Website checks, earlier reviews and what the merchant said, word for word where you can.
Add your own policy
Some platforms only hold funds when they suspect fraud, while others always cover exposure they can measure, such as tickets sold for dates that haven't happened yet, so put your policy in the state and Grayson applies it.
Your future-delivery reserve policy adds this to the state of the legitimate example:
{
"risk_policy": "Merchant risk policy, section 6: future delivery (rev. 2026-07). If a merchant closes or cancels, every sale it took for a date that hasn't happened yet can come back to us as a chargeback. We never clear an alert on a merchant whose undelivered sales for future dates are over $25,000 without a reserve, however legitimate the merchant is. Keep processing, hold back a reserve from its payouts equal to those undelivered sales, release it as the dates pass, and tell the merchant it is our standard future-delivery reserve, not a suspicion of fraud."
}| Question | Without | With your future-delivery reserve policy |
|---|---|---|
risk_type | legitimate_business, confidence 97% | legitimate_business, confidence 85% |
matches_declared_business | 99% true | 95% true |
loss_likelihood | 0.05 of 4, confidence 95% | 0.44 of 4, confidence 67% |
action | no_action, confidence 97% | reserve_or_delay_payouts, confidence 94% |
Applied to the likely-legitimate example: the farm holds about $46,000 of online tickets and invoiced group visits for dates after today, over the policy's $25,000 trigger, so the action moves from clearing the alert to holding a reserve, while the farm is still judged a legitimate business whose sales match what it declared.
Where to call it
- On every merchant monitoring alert, before it reaches an analyst, so the riskiest are at the top of the queue and the clear seasonal ones are closed.
- Before a payout leaves, for merchants with an open alert or a payout account changed in the last 30 days.
- When outside evidence arrives: a new issuer fraud report, a chargeback, or a website change found by your monitoring vendor.
Cost and latency
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 17,559 | $0.00061 | $0.61 | 300 ms |
| Legitimate | 15,693 | $0.00055 | $0.55 | 286 ms |
| Ambiguous | 16,161 | $0.00057 | $0.57 | 215 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/merchant-risk-review/questions.json --label risk_type=<column> --label matches_declared_business=<column> --label loss_likelihood=<column> --label action=<column>Each --label names the column with that question's right answer:
risk_type:legitimate_business,business_trouble,stolen_cards_at_checkout,bust_out,transaction_laundering,account_takeovermatches_declared_business:trueorfalseloss_likelihood: a level, such as "Very likely (over 90%)"action:no_action,request_documents,reserve_or_delay_payouts,suspend,terminate
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 bust-out from a merchant whose customers are using stolen cards?
It can when the state carries the evidence that separates them. Sales the merchant keys in itself, a payout account changed just before the spike, instant payouts and links to terminated merchants point to the merchant; buyers who pay through the merchant's own checkout or links from VPNs and ship to forwarding addresses, at a merchant with a long clean history, point to a victim. Send who entered each sale and from which device, not just the totals.
Does it detect transaction laundering?
It reads what your systems give it: sales that don't fit the declared business (ticket sizes, card countries, hours, descriptors), referring websites, and your website monitoring results. If you run test purchases or crawl for undisclosed websites, add those results to the state; they are often the deciding evidence.
Should Grayson's action hold payouts automatically?
Start by using it to order your queue and to hold payouts only above a high threshold, with an analyst confirming within hours. Check your merchant agreement and your sponsor bank's rules for when you can hold funds and what notice you owe the merchant, and compare Grayson's answers with your analysts' decisions on past alerts before you automate more.
Related recipes
Review business onboarding (KYB) applications
Approve, approve with limits, request documents or decline a business applying for card processing or another business product.
Screen card authorizations for fraud in real time
Score card authorizations for fraud and choose approve, step up or decline, next to your existing rules.
Detect money mule accounts
Whether an account is passing other people's money through, whether the holder knows, and what to do
Recipes
Every use case, with its questions and cost per decision.
Merchant and platform risk
The merchants on your payments platform, and abuse of your rewards and promotions. Ready-to-run Grayson recipes with real responses, cost and latency.
Promotion abuse
Grayson decides whether a sign-up bonus or referral reward is being claimed through multiple accounts, a referral ring or staged deposits, and whether to pay it, hold it, deny it or close the account.