Detect check fraud in mobile and branch 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.
Grayson decides whether a check deposited through a mobile app or at a branch is counterfeit, altered, stolen or a duplicate, and whether to make the funds available on your normal schedule, place an exception hold or reject the deposit. It reads the account's activity and deposit history, your image-analysis, duplicate-detection and check-verification results, and what happened on the account around the deposit, and costs about $0.52 to $0.80 per 1,000 decisions.
- Decides: Release, hold or reject a check deposit that may be counterfeit, altered, stolen or a duplicate.
- Call it: When a mobile or branch check deposit is submitted
- Questions: 1 score, 2 choice
- Cost: $0.00052 to $0.00080 per decision ($0.52 to $0.80 per 1,000) for these examples' 14,765 to 22,948 input tokens
- Latency: 212 to 291 ms for these examples, the median of 5 calls each through api.finic.ai from US-West
Examples
Three mobile deposits waiting in a review queue, each sent with a year of account activity, two years of check deposits, 90 days of logins and every vendor result on the item: a counterfeit "new employer" check from a member who just lost his job, a freelance designer's first check from a new client, deposited from a hotel on a new phone, and a laid-off member's final paycheck, handwritten from outside her employer's payroll series.
Open in Playground
A counterfeit 'new employer' check from a member who just lost his job. A member laid off in August deposits a $4,860 business check from a company he says just hired him, then tries to send most of it to a new P2P recipient for 'work equipment'. The check number is far outside the maker's recent range and the check has none of the usual security features, though the maker's account is open and nothing has come back on it yet.
| Question | Grayson's answer |
|---|---|
return_likelihood | 3.89 of 4, confidence 93% |
check_problem | counterfeit, confidence 96% |
funds_action | reject, confidence 79% |
14,765 input tokens, $0.00052 per decision, answered in 212 ms.
The request, with long lists cut short. The full request is fraud.json (46 KB).
{
"model": "grayson-1",
"state": {
"account_holder": {
"name": "Jordan A. Pruitt",
"age": 29,
"member_since": "2023-03-14",
"address": "Kettering, OH; same address since 2022",
"occupation_on_file": "Not currently employed (changed 2026-08-26 from 'Warehouse associate, Kestrel Fulfillment')",
"phone_on_file": "555-0142, since 2023-03-14",
"email_on_file": "jpruitt.mail@example.com, since 2023-03-14",
"identity_verified_at_opening": "In branch, driver license",
"prior_fraud_or_scam_reports": "None"
},
"accounts_and_limits": {
"checking": "x4471, opened 2023-03-14",
"savings": "x4470, balance $650.00",
"debit_card": "x8836 (reissued 2026-07-11 on expiry of x2290)",
"mobile_deposit_limits": "$5,000 per business day; $10,000 per rolling 30 days",
"mobile_deposit_enrolled": "2023-04-02",
"p2p_limit": "$2,500 per day",
"p2p_recipients_before_deposit_day": [
"Darnell Webb (since 2023)",
"Tasha Pruitt (since 2023)",
"Kayla Brooks (since 2024)",
"Carol J. Pruitt (since 2024)"
],
"overdraft_coverage": "Opted out for debit card; standard for ACH and checks"
},
"account_changes_last_12_months": [
{
"ts": "2026-07-11T10:02:00-04:00",
"change": "Debit card reissued on expiry (x2290 to x8836), mailed to address on file"
},
{
"ts": "2026-08-26T15:41:20-04:00",
"change": "Occupation updated by contact center at member's request"
}
],
"contact_history_before_deposit": [
{
"ts": "2026-06-03T13:58:00-04:00",
"channel": "Chat",
"summary": "Member disputed a duplicate DoorDash charge of $23.18. Provisional credit given; merchant later confirmed the duplicate."
},
{
"ts": "2026-08-26T15:30:00-04:00",
"channel": "Phone",
"summary": "Member said he was laid off from Kestrel Fulfillment last week and asked about lowering his car payment. Referred to his auto lender; occupation updated."
}
],
"devices": [
{
"device": "iPhone 12",
"first_seen": "2024-01-08",
"enrolled_by": "SMS code to phone on file",
"last_seen": "2026-10-06T08:29:40-04:00"
},
{
"device": "Windows PC, Chrome (online banking)",
"first_seen": "2023-03-20",
"enrolled_by": "SMS code to phone on file"
}
],
"logins_last_90_days_summary": {
"columns": [
"channel",
"device",
"network",
"logins",
"first_in_window",
"last"
],
"rows": [
[
"Mobile app",
"iPhone 12 (enrolled 2024-01-08)",
"Residential cable ISP, Kettering OH",
77,
"2026-07-08T07:58:40-04:00",
"2026-10-06T08:29:40-04:00"
],
[
"Mobile app",
"iPhone 12 (enrolled 2024-01-08)",
"Mobile carrier network, Dayton OH area",
19,
"2026-07-10T23:43:55-04:00",
"2026-10-02T18:51:23-04:00"
],
[
"Online banking",
"Windows PC, Chrome",
"Residential cable ISP, Kettering OH",
15,
"2026-07-10T07:47:09-04:00",
"2026-10-03T23:09:08-04:00"
]
]
},
"logins_last_30_days": {
"columns": [
"ts",
"channel",
"device",
"ip",
"network",
"auth"
],
"rows": [
[
"2026-09-06T16:36:51-04:00",
"Online banking",
"Windows PC, Chrome",
"198.51.100.73",
"Residential cable ISP, Kettering OH",
"Password"
],
[
"2026-09-09T15:05:02-04:00",
"Mobile app",
"iPhone 12 (enrolled 2024-01-08)",
"198.51.100.73",
"Residential cable ISP, Kettering OH",
"Face ID"
],
[
"2026-09-09T15:57:47-04:00",
"Mobile app",
"iPhone 12 (enrolled 2024-01-08)",
"198.51.100.73",
"Residential cable ISP, Kettering OH",
"Face ID"
],
[
"2026-09-10T11:34:38-04:00",
"Mobile app",
"iPhone 12 (enrolled 2024-01-08)",
"198.51.100.73",
"Residential cable ISP, Kettering OH",
"Face ID"
],
[
"2026-09-10T13:29:46-04:00",
"Mobile app",
"iPhone 12 (enrolled 2024-01-08)",
"198.51.100.73",
"Residential cable ISP, Kettering OH",
"Face ID"
],
"… 28 more in fraud.json"
]
},
"monthly_summary_before_detail": {
"columns": [
"month",
"credits",
"credits_usd",
"debits",
"debits_usd",
"… 4 more in fraud.json"
],
"rows": [
[
"2025-10",
4,
4234.78,
45,
3006.99,
"… 4 more in fraud.json"
],
[
"2025-11",
3,
3048.56,
43,
3485.44,
"… 4 more in fraud.json"
],
[
"2025-12",
6,
3276.7,
38,
3132.38,
"… 4 more in fraud.json"
],
[
"2026-01",
3,
2439.54,
39,
2951.71,
"… 4 more in fraud.json"
],
[
"2026-02",
3,
2946.38,
30,
2601.47,
"… 4 more in fraud.json"
],
[
"2026-03",
3,
2399.93,
37,
2595.56,
"… 4 more in fraud.json"
],
[
"2026-04",
7,
3934.68,
38,
4445.99,
"… 4 more in fraud.json"
],
[
"2026-05",
6,
4647.71,
40,
3442.45,
"… 4 more in fraud.json"
]
]
},
"checking_transactions_since_2026_06_01": {
"columns": [
"posted_at",
"type",
"description",
"amount_usd",
"balance_usd"
],
"rows": [
[
"2026-06-01T07:02:00-04:00",
"ACH debit",
"BRIARLEIGH TERRACE RENT WEB PMT",
-1045,
1121.29
],
[
"2026-06-01T14:17:47-04:00",
"Debit card",
"CHIPOTLE 1820 DAYTON OH",
-14.84,
1106.45
],
[
"2026-06-02T08:11:52-04:00",
"Debit card",
"WALMART SC #2124 BEAVERCREEK OH",
-64.17,
1042.28
],
[
"2026-06-02T22:16:55-04:00",
"Debit card",
"WENDYS #3112 KETTERING OH",
-10.18,
1032.1
],
[
"2026-06-03T07:02:00-04:00",
"Debit card",
"SPECTRUM.COM STAMFORD CT",
-79.99,
952.11
],
"… 147 more in fraud.json"
]
},
"check_deposits_last_24_months": {
"columns": [
"deposited_on",
"channel",
"maker",
"maker_type",
"serial",
"amount_usd",
"result",
"return_reason"
],
"rows": [
[
"2024-12-21",
"Mobile",
"Carol J. Pruitt",
"Personal",
"2231",
150,
"Paid",
null
],
[
"2025-06-09",
"Branch",
"Carol J. Pruitt",
"Personal",
"2287",
200,
"Paid",
null
],
[
"2025-08-15",
"Mobile",
"Kestrel Fulfillment LLC (employer)",
"Business",
"51877",
86.5,
"Paid",
null
],
[
"2025-12-20",
"Mobile",
"Carol J. Pruitt",
"Personal",
"2340",
150,
"Paid",
null
],
[
"2026-05-30",
"Mobile",
"Darnell Webb",
"Personal",
"1129",
260,
"Paid",
null
]
]
},
"deposit_session": {
"submitted_at": "2026-10-05T19:12:44-04:00",
"business_day_of_deposit": "2026-10-06 (submitted after the 6:00 p.m. ET cutoff)",
"device": "iPhone 12 (enrolled 2024-01-08), our app 8.3.1; not jailbroken; no emulator; no screen-sharing or remote-access app active",
"ip": "198.51.100.73",
"network": "Residential cable ISP, Kettering OH (same as most logins in the last 90 days)",
"login_auth": "Face ID",
"time_in_deposit_flow": "2 min 51 s",
"capture": "Front: auto-capture, 1 attempt. Back: 2 attempts (first rejected by the app: endorsement not detected).",
"amount_keyed_by_member_usd": 4860,
"scam_warning": "Shown at 19:11:58 because this is the member's first check from the maker and over $2,500 ('Did someone you met online or a new employer send you this check? Scammers send fake checks and ask you to send money back.'); member tapped Continue after 4 seconds",
"member_answers": {
"What is this check for?": "Refund or reimbursement",
"Has anyone asked you to send part of this money to someone else?": "No"
}
},
"after_the_deposit": [
{
"ts": "2026-10-05T19:20:13-04:00",
"event": "P2P recipient added",
"detail": "Marcus Hale, by mobile number 555-0187, enrolled at another institution; first payment to this recipient from any of our members"
},
{
"ts": "2026-10-05T19:24:40-04:00",
"event": "P2P send attempt",
"detail": "$2,450.00 to Marcus Hale: declined, insufficient available funds (available $882.52; deposit pending review)"
},
{
"ts": "2026-10-05T19:27:02-04:00",
"event": "P2P send attempt",
"detail": "$2,450.00 to Marcus Hale: declined, insufficient available funds"
},
{
"ts": "2026-10-05T19:29:15-04:00",
"event": "Secure message from member",
"detail": "Hi, I deposited a check from my new job tonight. They need me to buy my work laptop and software from their vendor by tomorrow morning. Can the money be available tonight or first thing tomorrow?"
},
{
"ts": "2026-10-05T19:35:08-04:00",
"event": "P2P send",
"detail": "$500.00 to Marcus Hale: completed"
},
{
"ts": "2026-10-06T08:04:31-04:00",
"event": "Inbound call (contact center note)",
"detail": "Member asked when the 10/5 mobile deposit will be available and asked to raise his P2P limit to $5,000. Said the check is from his new remote employer, Pellmont Clinical Staffing, for home-office equipment he must buy from the company's approved vendor, and that he was hired last week after an interview by text chat. Told him the deposit is in review and the limit can't be changed today. Member said the company's onboarding coordinator is waiting for the payment."
},
{
"ts": "2026-10-06T08:47:19-04:00",
"event": "P2P send attempt",
"detail": "$1,950.00 to Marcus Hale: declined, insufficient available funds"
}
],
"balances_now": {
"ledger_balance_usd": 382.52,
"available_balance_usd": 382.52,
"deposit_under_review_usd": 4860
},
"review_alert": {
"queue": "Deposit review: mobile check deposits held for an analyst before acceptance",
"queued_at": "2026-10-05T19:12:53-04:00",
"rules_fired": [
"R-112 First check from this maker for this member, over $2,500",
"R-131 Amount over 3x the member's 12-month average check deposit ($205.00)",
"R-140 New P2P recipient added within 24 hours of the deposit",
"R-142 P2P send attempted to that recipient within 24 hours of the deposit"
],
"vendor_deposit_risk_score": {
"score": 938,
"range": "0-999, higher is riskier",
"reasons": [
"Serial number outside the maker's recent range",
"No security features detected",
"First item from this maker for this depositor",
"Amount far above the depositor's check history"
]
},
"exposure": {
"deposit_usd": 4860,
"member_funds_available_usd": 1032.52,
"uncovered_if_returned_usd": 3827.48,
"basis": "Available checking plus savings balances"
},
"decision_requested_at": "2026-10-06T09:20:00-04:00"
},
"item_under_review": {
"deposit_id": "MD-20261005-118342",
"channel": "Mobile app",
"amount_usd": 4860,
"courtesy_amount_read": 4860,
"legal_amount_read": "Four thousand eight hundred sixty and 00/100",
"check_type": "Business check",
"maker_name_printed": "PELLMONT CLINICAL STAFFING LLC",
"maker_address_printed": "Suite address in Plano, TX; phone 555-0119",
"paying_bank": "A national bank in Texas (routing xxxxx2187)",
"micr": {
"routing": "xxxxx2187",
"account": "x6604",
"serial": "1206",
"serial_field": "On-us field (personal-check layout); no auxiliary on-us field"
},
"check_number_printed": "1206",
"check_date": "2026-10-01",
"payee": "JORDAN PRUITT",
"memo": "Home office equipment",
"signature": "One signature, uniform printed-style strokes",
"endorsement": "Member's signature and 'For mobile deposit only' with our institution's name, as required",
"image_quality": {
"front": "Pass",
"back": "Pass (second attempt)"
},
"image_analysis": {
"courtesy_and_legal_amounts_agree": true,
"signs_of_alteration": "None detected (fonts and ink consistent across payee, amount and date)",
"security_features": "None detected: no padlock icon or security-feature legend, no microprint signature line, no void pantograph",
"check_stock_comparison": "Not available: the paying bank does not contribute check images to the comparison service"
},
"duplicate_detection": {
"our_institution": "No match",
"shared_image_network": "No match"
},
"check_verification_service": {
"maker_account_status": "Open, valid (open more than 5 years)",
"serial_vs_recent_items": "Outside range: recent paid items from this account are numbered 30412 to 30977",
"account_owner_name_match": "Not available: paying bank does not contribute owner names",
"issued_item_data": "Not available for this account",
"network_activity_last_30_days": "57 items from this account presented at 21 institutions; none returned",
"paid_item_status": "No paid record for serial 1206"
},
"maker_history": {
"this_member": "No earlier checks from this maker",
"our_institution": "No items from this maker account deposited by any member in 24 months"
}
},
"funds_availability_if_accepted": "Per the mobile deposit agreement: $275 on the next business day after the business day of deposit, the rest on the second business day",
"funds_availability_if_held": "Exception hold under the mobile deposit agreement: up to 7 business days, with a notice to the member giving the reason"
},
"questions": {
"return_likelihood": {
"type": "score",
"instructions": "How likely is it that the check under review will be returned unpaid?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"check_problem": {
"type": "choice",
"instructions": "What is most likely wrong with the check under review?",
"criteria": {
"none": "Nothing: it appears to be a legitimate check payable to the account holder",
"counterfeit": "Counterfeit: a fake check, possibly printed with a real account's routing and account numbers",
"altered": "Altered: a genuine check whose payee or amount was changed",
"stolen": "Stolen: a genuine, unaltered check deposited by someone not entitled to it",
"duplicate": "Duplicate: a check that has already been deposited or cashed elsewhere"
}
},
"funds_action": {
"type": "choice",
"instructions": "What should happen to the funds from the check under review?",
"criteria": {
"normal_availability": "Accept the deposit and make the funds available on the normal schedule",
"exception_hold": "Accept the deposit and place an exception hold until the check clears, with a notice giving the reason",
"reject": "Reject the deposit and don't credit the account"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_33394e196a9345d9b9824a50cc36e337",
"model": "grayson-1",
"answers": {
"return_likelihood": {
"type": "score",
"score": 3.889,
"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.9316,
"probabilities": {
"0": 0.0105,
"1": 0.0093,
"2": 0.0064,
"3": 0.0285,
"4": 0.9453
}
},
"check_problem": {
"type": "choice",
"choice": "counterfeit",
"confidence": 0.9559,
"probabilities": {
"none": 0.0156,
"counterfeit": 0.9648,
"altered": 0.0083,
"stolen": 0.0074,
"duplicate": 0.0039
}
},
"funds_action": {
"type": "choice",
"choice": "reject",
"confidence": 0.792,
"probabilities": {
"normal_availability": 0.0066,
"exception_hold": 0.1321,
"reject": 0.8613
}
}
},
"usage": {
"input_tokens": 14765,
"output_tokens": 0
}
}Open in Playground
A freelance designer's first check from a new client, deposited from a hotel. A nine-year member who deposits several client checks a month sends a $6,480 check from a local brewery she hasn't been paid by before, from a phone enrolled two weeks ago and a hotel in Chicago. Four rules fired, but the trip, the new phone and her client-check history are all in the record, and the check verifies cleanly: serial in range, owner name matching, stock matching the maker's own checks.
| Question | Grayson's answer |
|---|---|
return_likelihood | 0.02 of 4, confidence 98% |
check_problem | none, confidence 98% |
funds_action | normal_availability, confidence 93% |
22,948 input tokens, $0.00080 per decision, answered in 291 ms.
The request, with long lists cut short. The full request is legitimate.json (76 KB).
{
"model": "grayson-1",
"state": {
"account_holder": {
"name": "Lena M. Marchetti",
"age": 38,
"member_since": "2017-05-22",
"address": "Columbus, OH; owns home, same address since 2019",
"occupation_on_file": "Self-employed graphic designer; DBA 'Marchetti Studio' on file since 2019-02-11 (certificate of trade name provided)",
"phone_on_file": "555-0163, since 2017-05-22",
"email_on_file": "lena@marchetti-studio.example.com, since 2019-02-11",
"identity_verified_at_opening": "In branch, driver license",
"prior_fraud_or_scam_reports": "None"
},
"accounts_and_limits": {
"checking": "x8812, opened 2017-05-22; accepts items payable to the DBA",
"savings": "x8810, balance $27,400.00",
"credit_card": "Visa x5531 with us, paid from checking",
"debit_card": "x0937",
"mobile_deposit_limits": "$10,000 per business day; $25,000 per rolling 30 days (raised 2021-04 for business-check volume)",
"mobile_deposit_enrolled": "2017-06-01",
"p2p_limit": "$2,500 per day",
"external_accounts_linked": [
"Brokerage (SEP-IRA) at Fidelity, linked 2019-04-08"
],
"overdraft_coverage": "Linked to savings x8810"
},
"account_changes_last_12_months": [
{
"ts": "2026-09-21T15:38:12-04:00",
"change": "New device enrolled in the mobile app (iPhone 17) with password and SMS code to the phone on file; iPhone 12 Pro not seen since 2026-09-21"
}
],
"contact_history_before_deposit": [
{
"ts": "2026-01-09T11:20:00-05:00",
"channel": "Phone",
"summary": "Member asked for her 2025 interest statement (1099-INT); sent by secure message."
},
{
"ts": "2026-09-21T16:02:00-04:00",
"channel": "Secure message",
"summary": "Member: 'Got a new phone today. Is there anything I need to do for Face ID on the new device?' Agent sent the setup steps."
}
],
"devices": [
{
"device": "iPhone 17",
"first_seen": "2026-09-21",
"enrolled_by": "Password + SMS code to phone on file",
"last_seen": "2026-10-06T08:52:18-04:00"
},
{
"device": "iPhone 12 Pro",
"first_seen": "2021-10-02",
"enrolled_by": "SMS code to phone on file",
"last_seen": "2026-09-21"
},
{
"device": "MacBook, Safari (online banking)",
"first_seen": "2020-07-14",
"enrolled_by": "SMS code to phone on file"
}
],
"logins_last_90_days_summary": {
"columns": [
"channel",
"device",
"network",
"logins",
"first_in_window",
"last"
],
"rows": [
[
"Online banking",
"MacBook, Safari",
"Residential fiber ISP, Columbus OH",
69,
"2026-07-08T09:44:01-04:00",
"2026-10-03T12:43:11-04:00"
],
[
"Mobile app",
"iPhone 12 Pro (enrolled 2021-10-02)",
"Residential fiber ISP, Columbus OH",
55,
"2026-07-08T17:25:50-04:00",
"2026-09-19T22:23:49-04:00"
],
[
"Mobile app",
"iPhone 12 Pro (enrolled 2021-10-02)",
"Mobile carrier network, Columbus OH area",
20,
"2026-07-11T18:44:35-04:00",
"2026-09-19T11:43:13-04:00"
],
[
"Mobile app",
"iPhone 17 (enrolled 2026-09-21)",
"Residential fiber ISP, Columbus OH",
9,
"2026-09-21T09:06:14-04:00",
"2026-10-02T19:34:48-04:00"
],
[
"Mobile app",
"iPhone 17 (enrolled 2026-09-21)",
"Mobile carrier network, Columbus OH area",
6,
"2026-09-22T21:09:02-04:00",
"2026-10-02T09:39:44-04:00"
],
[
"Mobile app",
"iPhone 17 (enrolled 2026-09-21)",
"Hotel network, Chicago IL",
5,
"2026-10-04T08:00:55-04:00",
"2026-10-06T08:52:18-04:00"
],
[
"Mobile app",
"iPhone 17 (enrolled 2026-09-21)",
"Mobile carrier network, Chicago IL",
1,
"2026-10-05T11:56:17-04:00",
"2026-10-05T11:56:17-04:00"
]
]
},
"logins_last_30_days": {
"columns": [
"ts",
"channel",
"device",
"ip",
"network",
"auth"
],
"rows": [
[
"2026-09-06T11:45:07-04:00",
"Mobile app",
"iPhone 12 Pro (enrolled 2021-10-02)",
"203.0.113.24",
"Residential fiber ISP, Columbus OH",
"Face ID"
],
[
"2026-09-07T23:24:33-04:00",
"Mobile app",
"iPhone 12 Pro (enrolled 2021-10-02)",
"203.0.113.24",
"Residential fiber ISP, Columbus OH",
"Face ID"
],
[
"2026-09-08T18:28:53-04:00",
"Online banking",
"MacBook, Safari",
"203.0.113.24",
"Residential fiber ISP, Columbus OH",
"Password"
],
[
"2026-09-09T17:51:06-04:00",
"Online banking",
"MacBook, Safari",
"203.0.113.24",
"Residential fiber ISP, Columbus OH",
"Password"
],
[
"2026-09-09T22:32:20-04:00",
"Mobile app",
"iPhone 12 Pro (enrolled 2021-10-02)",
"203.0.113.24",
"Residential fiber ISP, Columbus OH",
"Face ID"
],
"… 52 more in legitimate.json"
]
},
"monthly_summary_before_detail": {
"columns": [
"month",
"credits",
"credits_usd",
"debits",
"debits_usd",
"… 4 more in legitimate.json"
],
"rows": [
[
"2025-10",
7,
10596.36,
36,
4677.64,
"… 4 more in legitimate.json"
],
[
"2025-11",
7,
6651.11,
38,
11123.33,
"… 4 more in legitimate.json"
],
[
"2025-12",
6,
7240.01,
40,
4628.03,
"… 4 more in legitimate.json"
],
[
"2026-01",
5,
4043.25,
45,
7348.17,
"… 4 more in legitimate.json"
],
[
"2026-02",
9,
9154.28,
42,
6134.89,
"… 4 more in legitimate.json"
],
[
"2026-03",
12,
13869.28,
50,
10411.09,
"… 4 more in legitimate.json"
],
[
"2026-04",
8,
9209.62,
33,
6705.54,
"… 4 more in legitimate.json"
],
[
"2026-05",
9,
10248.76,
53,
18163.89,
"… 4 more in legitimate.json"
]
]
},
"checking_transactions_since_2026_06_01": {
"columns": [
"posted_at",
"type",
"description",
"amount_usd",
"balance_usd"
],
"rows": [
[
"2026-06-01T05:06:00-04:00",
"ACH debit",
"LAKESHORE HOME LOANS MTG PMT",
-1486.22,
8533.87
],
[
"2026-06-01T09:21:26-04:00",
"Debit card",
"TRADER JOE'S #678 COLUMBUS OH",
-69.45,
8464.42
],
[
"2026-06-02T05:45:00-04:00",
"Debit card",
"SPOTIFY USA NEW YORK NY",
-11.99,
8452.43
],
[
"2026-06-02T06:30:00-04:00",
"Mobile check deposit",
"MOBILE DEPOSIT CHECK 4696",
845,
9297.43
],
[
"2026-06-02T08:39:56-04:00",
"Debit card",
"KROGER #0517 COLUMBUS OH",
-98.57,
9198.86
],
"… 204 more in legitimate.json"
]
},
"check_deposits_last_24_months": {
"columns": [
"deposited_on",
"channel",
"maker",
"maker_type",
"serial",
"amount_usd",
"result",
"return_reason"
],
"rows": [
[
"2024-10-18",
"Mobile",
"Quarry Hill Veterinary Clinic",
"Business",
"6121",
810,
"Paid",
null
],
[
"2024-10-28",
"Mobile",
"Wexley Community Theater",
"Nonprofit",
"2089",
1720,
"Paid",
null
],
[
"2024-10-30",
"Mobile",
"Copperline Cycles LLC",
"Business",
"1186",
613.57,
"Paid",
null
],
[
"2024-11-05",
"Mobile",
"Copperline Cycles LLC",
"Business",
"1220",
708.63,
"Paid",
null
],
[
"2024-11-07",
"Mobile",
"Fernhollow Dental Partners",
"Business",
"4418",
1045,
"Paid",
null
],
"… 85 more in legitimate.json"
]
},
"deposit_session": {
"submitted_at": "2026-10-05T22:41:09-04:00",
"business_day_of_deposit": "2026-10-06 (submitted after the 6:00 p.m. ET cutoff)",
"device": "iPhone 17 (enrolled 2026-09-21), our app 8.3.1; not jailbroken; no emulator; no screen-sharing or remote-access app active",
"ip": "203.0.113.140",
"network": "Hotel network, Chicago IL (about 350 miles from home address)",
"login_auth": "Face ID",
"time_in_deposit_flow": "1 min 58 s",
"capture": "Front: 2 attempts (first rejected by the app for glare). Back: auto-capture, 1 attempt.",
"amount_keyed_by_member_usd": 6480,
"scam_warning": "Shown at 22:40:31 because this is the member's first check from the maker and over $2,500; member tapped Continue after 9 seconds",
"member_answers": {
"What is this check for?": "Payment for goods or services I sold",
"Has anyone asked you to send part of this money to someone else?": "No"
}
},
"after_the_deposit": [
{
"ts": "2026-10-06T07:51:40-04:00",
"event": "Debit card",
"detail": "INTELLIGENTSIA COFFEE CHICAGO IL, $6.95, approved"
},
{
"ts": "2026-10-06T08:26:12-04:00",
"event": "Debit card",
"detail": "LYFT *RIDE TUE 7AM, $18.20, approved"
},
{
"ts": "2026-10-06T08:55:03-04:00",
"event": "External transfer scheduled",
"detail": "$2,000.00 to her linked Fidelity SEP-IRA (linked 2019), to send 2026-10-07"
}
],
"balances_now": {
"ledger_balance_usd": 6901.2,
"pending_card_authorizations": [
{
"ts": "2026-10-04T15:10:22-04:00",
"merchant": "THE LARKIN HOTEL CHICAGO IL",
"amount_usd": 650,
"note": "Hotel check-in hold"
},
{
"ts": "2026-10-06T07:51:40-04:00",
"merchant": "INTELLIGENTSIA COFFEE CHICAGO IL",
"amount_usd": 6.95
},
{
"ts": "2026-10-06T08:26:12-04:00",
"merchant": "LYFT *RIDE TUE 7AM",
"amount_usd": 18.2
}
],
"available_balance_usd": 6226.05,
"savings_balance_usd": 27400,
"deposit_under_review_usd": 6480
},
"review_alert": {
"queue": "Deposit review: mobile check deposits held for an analyst before acceptance",
"queued_at": "2026-10-05T22:41:16-04:00",
"rules_fired": [
"R-112 First check from this maker for this member, over $2,500",
"R-131 Amount over 3x the member's 12-month average check deposit ($1,300.69)",
"R-207 Deposit from a device enrolled less than 30 days ago",
"R-215 Deposit session more than 250 miles from the home address"
],
"vendor_deposit_risk_score": {
"score": 604,
"range": "0-999, higher is riskier",
"reasons": [
"First item from this maker for this depositor",
"Amount above the depositor's check history",
"Recently enrolled device",
"Session location away from home"
]
},
"exposure": {
"deposit_usd": 6480,
"member_funds_available_usd": 33626.05,
"uncovered_if_returned_usd": 0,
"basis": "Available checking plus savings balances"
},
"decision_requested_at": "2026-10-06T09:40:00-04:00"
},
"item_under_review": {
"deposit_id": "MD-20261005-120977",
"channel": "Mobile app",
"amount_usd": 6480,
"courtesy_amount_read": 6480,
"legal_amount_read": "Six thousand four hundred eighty and 00/100",
"check_type": "Business check (three-to-a-page ledger stock)",
"maker_name_printed": "HARROW LANE BREWING CO. LLC",
"maker_address_printed": "Street address in Columbus, OH; phone 555-0131",
"paying_bank": "A regional bank in Ohio (routing xxxxx0451)",
"micr": {
"routing": "xxxxx0451",
"account": "x2093",
"serial": "3318",
"serial_field": "Auxiliary on-us field (business-check layout)"
},
"check_number_printed": "3318",
"check_date": "2026-10-02",
"payee": "MARCHETTI STUDIO",
"memo": "INV 2026-114 rebrand ph 2",
"signature": "One handwritten signature",
"endorsement": "'Marchetti Studio, Lena Marchetti' and 'For mobile deposit only' with our institution's name, as required",
"image_quality": {
"front": "Pass (second attempt)",
"back": "Pass"
},
"image_analysis": {
"courtesy_and_legal_amounts_agree": true,
"signs_of_alteration": "None detected (fonts and ink consistent across payee, amount and date)",
"security_features": "Padlock icon with security-feature legend on the back, microprint signature line, background pattern",
"check_stock_comparison": "Match: layout matches 9 of 9 reference images from this maker account"
},
"duplicate_detection": {
"our_institution": "No match",
"shared_image_network": "No match"
},
"check_verification_service": {
"maker_account_status": "Open, valid (open more than 5 years)",
"serial_vs_recent_items": "Within range: recent paid items from this account are numbered 3241 to 3330",
"account_owner_name_match": "Match: HARROW LANE BREWING CO LLC",
"issued_item_data": "Not available for this account",
"network_activity_last_30_days": "38 items from this account presented at 14 institutions; none returned",
"paid_item_status": "No paid record for serial 3318"
},
"maker_history": {
"this_member": "No earlier checks from this maker",
"our_institution": "4 items from this maker account deposited by 3 other members in 24 months, all paid"
}
},
"funds_availability_if_accepted": "Per the mobile deposit agreement: $275 on the next business day after the business day of deposit, the rest on the second business day",
"funds_availability_if_held": "Exception hold under the mobile deposit agreement: up to 7 business days, with a notice to the member giving the reason"
},
"questions": {
"return_likelihood": {
"type": "score",
"instructions": "How likely is it that the check under review will be returned unpaid?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"check_problem": {
"type": "choice",
"instructions": "What is most likely wrong with the check under review?",
"criteria": {
"none": "Nothing: it appears to be a legitimate check payable to the account holder",
"counterfeit": "Counterfeit: a fake check, possibly printed with a real account's routing and account numbers",
"altered": "Altered: a genuine check whose payee or amount was changed",
"stolen": "Stolen: a genuine, unaltered check deposited by someone not entitled to it",
"duplicate": "Duplicate: a check that has already been deposited or cashed elsewhere"
}
},
"funds_action": {
"type": "choice",
"instructions": "What should happen to the funds from the check under review?",
"criteria": {
"normal_availability": "Accept the deposit and make the funds available on the normal schedule",
"exception_hold": "Accept the deposit and place an exception hold until the check clears, with a notice giving the reason",
"reject": "Reject the deposit and don't credit the account"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_ea18f5c35dec4f00b597193d107ef79b",
"model": "grayson-1",
"answers": {
"return_likelihood": {
"type": "score",
"score": 0.023,
"legend": {
"0": "Very unlikely (under 10%)",
"1": "Unlikely (10-40%)",
"2": "Uncertain (40-60%)",
"3": "Likely (60-90%)",
"4": "Very likely (over 90%)"
},
"confidence": 0.9824,
"probabilities": {
"0": 0.9859,
"1": 0.0097,
"2": 0.0015,
"3": 0.001,
"4": 0.0019
}
},
"check_problem": {
"type": "choice",
"choice": "none",
"confidence": 0.9828,
"probabilities": {
"none": 0.9862,
"counterfeit": 0.0075,
"altered": 0.0017,
"stolen": 0.004,
"duplicate": 0.0005
}
},
"funds_action": {
"type": "choice",
"choice": "normal_availability",
"confidence": 0.9325,
"probabilities": {
"normal_availability": 0.955,
"exception_hold": 0.042,
"reject": 0.003
}
}
},
"usage": {
"input_tokens": 22948,
"output_tokens": 0
}
}Open in Playground
A laid-off member's final paycheck, handwritten from outside the payroll series. A four-year member who lost her job in September deposits a $2,318.62 final paycheck that she says her employer mailed because her direct deposit had been stopped. It's drawn on the employer's real payroll account, but it's a handwritten desk check numbered far outside the payroll series and missing from the employer's issued-item file, so only the employer can say whether it's genuine.
| Question | Grayson's answer |
|---|---|
return_likelihood | 1.12 of 4, confidence 50% (Very unlikely 60%, Unlikely 12%, Uncertain 3%, Likely 5%, Very likely 20%) |
check_problem | none, confidence 61% |
funds_action | exception_hold, confidence 55% |
16,723 input tokens, $0.00059 per decision, answered in 259 ms.
The request, with long lists cut short. The full request is ambiguous.json (51 KB).
{
"model": "grayson-1",
"state": {
"account_holder": {
"name": "Devon R. Haskins",
"age": 44,
"member_since": "2022-06-13",
"address": "Toledo, OH; same address since 2020 (rents)",
"occupation_on_file": "Dispatcher, Lakemont Freight Services (from account opening, not updated)",
"phone_on_file": "555-0108, since 2022-06-13",
"email_on_file": "dhaskins419@example.net, since 2022-06-13",
"identity_verified_at_opening": "In branch, state ID",
"prior_fraud_or_scam_reports": "None"
},
"accounts_and_limits": {
"checking": "x2208, opened 2022-06-13",
"savings": "x2207, balance $12.40",
"debit_card": "x7741",
"mobile_deposit_limits": "$3,000 per business day; $6,000 per rolling 30 days",
"mobile_deposit_enrolled": "2022-07-01",
"p2p_limit": "$2,500 per day",
"p2p_recipients_before_deposit_day": [
"Gary Lindqvist (since 2022-07; landlord, paid monthly)",
"Andre Haskins (since 2022)",
"Tamika Reed (since 2023)"
],
"external_accounts_linked": [
"Own checking x5520 at another institution (an online bank), linked 2023-08-02 by micro-deposits; used for transfers both ways"
],
"overdraft_coverage": "Opted in for debit card; standard for ACH and checks"
},
"account_changes_last_12_months": [],
"contact_history_before_deposit": [
{
"ts": "2026-09-29T12:16:00-04:00",
"channel": "Phone",
"summary": "Member asked to waive the 9/25 overdraft fee and the 9/28 NSF fee; said her job at Lakemont ended mid-September and her last paycheck didn't come by direct deposit on 9/25. One fee ($29.00) refunded as a courtesy, to post 2026-10-01."
}
],
"devices": [
{
"device": "Samsung Galaxy S23",
"first_seen": "2023-11-20",
"enrolled_by": "SMS code to phone on file",
"last_seen": "2026-10-05T08:29:11-04:00"
}
],
"logins_last_90_days_summary": {
"columns": [
"channel",
"device",
"network",
"logins",
"first_in_window",
"last"
],
"rows": [
[
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"Residential fiber ISP, Toledo OH",
92,
"2026-07-07T18:50:01-04:00",
"2026-10-05T08:29:11-04:00"
],
[
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"Mobile carrier network, Toledo OH area",
28,
"2026-07-08T21:01:14-04:00",
"2026-10-03T10:08:02-04:00"
]
]
},
"logins_last_30_days": {
"columns": [
"ts",
"channel",
"device",
"ip",
"network",
"auth"
],
"rows": [
[
"2026-09-06T19:52:16-04:00",
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"203.0.113.58",
"Residential fiber ISP, Toledo OH",
"Fingerprint"
],
[
"2026-09-07T14:10:22-04:00",
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"192.0.2.27",
"Mobile carrier network, Toledo OH area",
"Fingerprint"
],
[
"2026-09-07T23:00:18-04:00",
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"192.0.2.27",
"Mobile carrier network, Toledo OH area",
"Fingerprint"
],
[
"2026-09-09T13:02:52-04:00",
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"203.0.113.58",
"Residential fiber ISP, Toledo OH",
"Fingerprint"
],
[
"2026-09-10T13:21:46-04:00",
"Mobile app",
"Samsung Galaxy S23 (enrolled 2023-11-20)",
"203.0.113.58",
"Residential fiber ISP, Toledo OH",
"Fingerprint"
],
"… 43 more in ambiguous.json"
]
},
"monthly_summary_before_detail": {
"columns": [
"month",
"credits",
"credits_usd",
"debits",
"debits_usd",
"… 4 more in ambiguous.json"
],
"rows": [
[
"2025-10",
4,
4672.36,
39,
3093.63,
"… 4 more in ambiguous.json"
],
[
"2025-11",
2,
3315.47,
42,
4338.8,
"… 4 more in ambiguous.json"
],
[
"2025-12",
6,
4549.76,
40,
4552.3,
"… 4 more in ambiguous.json"
],
[
"2026-01",
6,
6068.88,
39,
4006.61,
"… 4 more in ambiguous.json"
],
[
"2026-02",
5,
5953.47,
34,
3738.85,
"… 4 more in ambiguous.json"
],
[
"2026-03",
3,
3431.55,
43,
7464.03,
"… 4 more in ambiguous.json"
],
[
"2026-04",
3,
3730.19,
42,
2932.93,
"… 4 more in ambiguous.json"
],
[
"2026-05",
3,
3287.72,
44,
4297.82,
"… 4 more in ambiguous.json"
]
]
},
"checking_transactions_since_2026_06_01": {
"columns": [
"posted_at",
"type",
"description",
"amount_usd",
"balance_usd"
],
"rows": [
[
"2026-06-01T09:14:00-04:00",
"P2P out",
"ZELLE TO GARY LINDQVIST",
-1150,
84.43
],
[
"2026-06-02T00:30:00-04:00",
"External transfer",
"EXT XFER FROM x5520 (own account, linked 2023)",
350,
434.43
],
[
"2026-06-02T10:30:35-04:00",
"Debit card",
"WENDYS #0921 TOLEDO OH",
-11.08,
423.35
],
[
"2026-06-04T15:28:45-04:00",
"Debit card",
"WENDYS #0921 TOLEDO OH",
-12.95,
410.4
],
[
"2026-06-05T06:00:13-04:00",
"ACH credit",
"LAKEMONT FREIGHT PAYROLL PPD",
1653.92,
2064.32
],
"… 166 more in ambiguous.json"
]
},
"check_deposits_last_24_months": {
"columns": [
"deposited_on",
"channel",
"maker",
"maker_type",
"serial",
"amount_usd",
"result",
"return_reason"
],
"rows": [
[
"2024-12-23",
"Mobile",
"Linda Haskins (individual)",
"Personal",
"4412",
300,
"Paid",
null
],
[
"2025-07-14",
"Mobile",
"A national auto insurer (claim payment)",
"Business",
"70221854",
1204.5,
"Paid",
null
],
[
"2026-01-06",
"Mobile",
"Linda Haskins (individual)",
"Personal",
"4498",
250,
"Paid",
null
]
]
},
"deposit_session": {
"submitted_at": "2026-10-05T08:12:31-04:00",
"business_day_of_deposit": "2026-10-05",
"device": "Samsung Galaxy S23 (enrolled 2023-11-20), our app 8.3.1; not rooted; no emulator; no screen-sharing or remote-access app active",
"ip": "203.0.113.58",
"network": "Residential fiber ISP, Toledo OH (same as most logins in the last 90 days)",
"login_auth": "Fingerprint",
"time_in_deposit_flow": "1 min 37 s",
"capture": "Front: auto-capture, 1 attempt. Back: auto-capture, 1 attempt.",
"amount_keyed_by_member_usd": 2318.62,
"scam_warning": "Not shown (shown only for a first check from a maker over $2,500)",
"member_answers": {
"What is this check for?": "Paycheck",
"Has anyone asked you to send part of this money to someone else?": "No"
}
},
"after_the_deposit": [
{
"ts": "2026-10-05T08:19:55-04:00",
"event": "P2P send attempt",
"detail": "$1,150.00 to Gary Lindqvist (existing recipient since 2022-07, paid $1,150.00 on or near the 1st of each month): declined, insufficient available funds (available $290.77)"
},
{
"ts": "2026-10-05T08:31:02-04:00",
"event": "Secure message from member",
"detail": "Hi, I deposited my last paycheck from Lakemont this morning. They mailed a paper check instead of direct deposit and it only came Saturday. How soon will it be available? My rent is late."
},
{
"ts": "2026-10-05T08:44:18-04:00",
"event": "ATM balance inquiry",
"detail": "Our branch 4 ATM, Toledo OH, debit card x7741"
},
{
"ts": "2026-10-05T09:12:40-04:00",
"event": "Inbound call (contact center note)",
"detail": "Member asked when the check will be available. Said Lakemont's payroll office mailed her final pay as a paper check because her direct deposit was stopped when she left. Said she will pay rent as soon as the funds are available. Told her the deposit is in review; no availability promised."
}
],
"balances_now": {
"ledger_balance_usd": 290.77,
"available_balance_usd": 290.77,
"deposit_under_review_usd": 2318.62
},
"review_alert": {
"queue": "Deposit review: mobile check deposits held for an analyst before acceptance",
"queued_at": "2026-10-05T08:12:42-04:00",
"rules_fired": [
"R-120 Check verification: serial outside the maker's recent range",
"R-125 No issued-item record on an account that has issued-item data",
"R-131 Amount over 3x the member's 12-month average check deposit ($250.00)",
"R-160 Overdraft or returned item on the account in the last 15 days",
"R-142 P2P send attempted within 24 hours of the deposit"
],
"vendor_deposit_risk_score": {
"score": 742,
"range": "0-999, higher is riskier",
"reasons": [
"Serial number outside the maker's recent range",
"No issued-item record",
"Low balance relative to deposit"
]
},
"exposure": {
"deposit_usd": 2318.62,
"member_funds_available_usd": 303.17,
"uncovered_if_returned_usd": 2015.45,
"basis": "Available checking plus savings balances"
},
"decision_requested_at": "2026-10-05T10:05:00-04:00"
},
"item_under_review": {
"deposit_id": "MD-20261005-104416",
"channel": "Mobile app",
"amount_usd": 2318.62,
"courtesy_amount_read": 2318.62,
"legal_amount_read": "Two thousand three hundred eighteen and 62/100",
"check_type": "Business check (three-to-a-page desk check)",
"maker_name_printed": "LAKEMONT FREIGHT SERVICES INC",
"maker_address_printed": "Street address in Toledo, OH",
"paying_bank": "A regional bank in Ohio (routing xxxxx0377)",
"micr": {
"routing": "xxxxx0377",
"account": "x9152",
"serial": "5108",
"serial_field": "Auxiliary on-us field (business-check layout)"
},
"check_number_printed": "5108",
"check_date": "2026-09-25",
"payee": "DEVON R HASKINS",
"memo": "Final pay 9/6-9/19 + PTO",
"signature": "Handwritten signature (the maker's payroll items carry a printed facsimile signature)",
"endorsement": "Member's signature and 'For mobile deposit only' with our institution's name, as required",
"image_quality": {
"front": "Pass",
"back": "Pass"
},
"image_analysis": {
"courtesy_and_legal_amounts_agree": true,
"signs_of_alteration": "None detected (fonts and ink consistent across payee, amount and date)",
"security_features": "Padlock icon with security-feature legend on the back, microprint signature line, void pantograph",
"check_stock_comparison": "Partial match: logo, maker name, address and MICR layout match the 15 reference images from this account, but this item is a three-to-a-page desk check without the payroll stub that all 15 reference items have"
},
"duplicate_detection": {
"our_institution": "No match",
"shared_image_network": "No match"
},
"check_verification_service": {
"maker_account_status": "Open, valid (open more than 5 years)",
"serial_vs_recent_items": "Outside range: recent paid items from this account are numbered 88102 to 88460",
"account_owner_name_match": "Match: LAKEMONT FREIGHT SERVICES INC",
"issued_item_data": "No record for serial 5108 (the paying bank holds issued-item data for this account; serials 88102 to 88460 are in it)",
"network_activity_last_30_days": "412 items from this account presented at 37 institutions; none returned",
"paid_item_status": "No paid record for serial 5108"
},
"maker_history": {
"this_member": "No earlier checks from this maker; paid by direct deposit from the same employer until 2026-09-11",
"our_institution": "61 items from this maker account deposited by 7 members in 24 months, all in the 88000 payroll series; 1 returned ('C - Stop payment', 2025-02)"
}
},
"funds_availability_if_accepted": "Per the mobile deposit agreement: $275 on the next business day, the rest on the second business day",
"funds_availability_if_held": "Exception hold under the mobile deposit agreement: up to 7 business days, with a notice to the member giving the reason"
},
"questions": {
"return_likelihood": {
"type": "score",
"instructions": "How likely is it that the check under review will be returned unpaid?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"check_problem": {
"type": "choice",
"instructions": "What is most likely wrong with the check under review?",
"criteria": {
"none": "Nothing: it appears to be a legitimate check payable to the account holder",
"counterfeit": "Counterfeit: a fake check, possibly printed with a real account's routing and account numbers",
"altered": "Altered: a genuine check whose payee or amount was changed",
"stolen": "Stolen: a genuine, unaltered check deposited by someone not entitled to it",
"duplicate": "Duplicate: a check that has already been deposited or cashed elsewhere"
}
},
"funds_action": {
"type": "choice",
"instructions": "What should happen to the funds from the check under review?",
"criteria": {
"normal_availability": "Accept the deposit and make the funds available on the normal schedule",
"exception_hold": "Accept the deposit and place an exception hold until the check clears, with a notice giving the reason",
"reject": "Reject the deposit and don't credit the account"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_2f6fd971485441008f9ad1a07e9933e1",
"model": "grayson-1",
"answers": {
"return_likelihood": {
"type": "score",
"score": 1.117,
"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.503,
"probabilities": {
"0": 0.6024,
"1": 0.1186,
"2": 0.034,
"3": 0.0494,
"4": 0.1956
}
},
"check_problem": {
"type": "choice",
"choice": "none",
"confidence": 0.6079,
"probabilities": {
"none": 0.6863,
"counterfeit": 0.2861,
"altered": 0.0126,
"stolen": 0.0098,
"duplicate": 0.0052
}
},
"funds_action": {
"type": "choice",
"choice": "exception_hold",
"confidence": 0.555,
"probabilities": {
"normal_availability": 0.2015,
"exception_hold": 0.7033,
"reject": 0.0952
}
}
},
"usage": {
"input_tokens": 16723,
"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.
funds_actionroutes the deposit. Anexception_holdon a check covered by Regulation CC means sending a notice that gives the reason.check_problemsets the follow-up: call a likely scam victim the same day, confirm a doubtful check with its maker or the paying bank, find a duplicate's first deposit.return_likelihood: set hold thresholds on the sum of "Likely" and "Very likely", choosing the cut-off from your own return history.
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
Customers expect deposited funds within a day or two, but a bad check can come back days later, after the money has left by P2P, ATM or debit card. Many people who deposit counterfeit checks are scam victims, and holding every unusual check frustrates good customers.
What to send
Send the account's history, the item with your vendors' results on it, and what happened around the deposit. The examples send a year of transactions and two years of check deposits; send as much as your case system shows an analyst.
- Account activity and deposit history. Pay, bills and earlier checks show what's normal for this member, and a job loss, a run of overdrafts or a first large check stands out against them.
- The maker and the customer's history with it. A first check from a business that has never paid them raises the question why.
- Check number against the maker's range. A number far outside the maker's recent range is a strong counterfeit signal, though off-cycle checks such as a final paycheck can come from another series.
- Image analysis. Mismatched amounts, or different ink on the payee or amount line, point to alteration; missing security features, or a layout unlike the maker's other checks, point to a counterfeit.
- Duplicate detection. Whether the same item was already deposited, at your institution or through a shared image network.
- Logins, devices and the deposit session. A new phone or an unusual location matters less when the record shows why.
- Activity around the deposit. Money that leaves straight away, a new P2P recipient, or messages and calls asking for the funds suggest someone expects the check to bounce, or a scammer is pressing.
Add your own policy
Grayson follows your mobile deposit procedure when it's in the request, even where it's stricter than a general reviewer would be. This one rejects a mobile deposit instead of holding it when the member has never deposited a check from the maker and the check-verification service reports the number out of range or the maker's account closed, because members treat a held deposit as money they have.
Your mobile deposit procedure adds this to the state of the ambiguous example:
{
"institution_policy": "Our mobile deposit procedure MD-4. Reject a mobile check deposit, rather than accepting it with a hold, when both of these are true: (1) the member has never deposited a check from this maker before; (2) the check-verification service reports the check number outside the maker's recent range, or the maker's account as closed. Do not credit the account. Call the member the same day: explain that we can't accept the check through the app, offer to take it at a branch under the standard hold rules, and warn them not to send money to anyone who asks for part of it back. We reject instead of holding because members see a held deposit in their balance, treat it as money they have, and send their own funds on before the check comes back. Branch deposits, and checks from makers the member has deposited before, follow the standard hold rules."
}| Question | Without | With your mobile deposit procedure |
|---|---|---|
return_likelihood | 1.12 of 4, confidence 50% (Very unlikely 60%, Unlikely 12%, Uncertain 3%, Likely 5%, Very likely 20%) | 1.64 of 4, confidence 26% (Very unlikely 41%, Unlikely 15%, Uncertain 7%, Likely 12%, Very likely 25%) |
check_problem | none, confidence 61% | none, confidence 41% |
funds_action | exception_hold, confidence 55% | reject, confidence 86% |
Both conditions hold for the ambiguous example's final paycheck: the member has never deposited a check from her former employer, and its number is far outside the employer's recent range. So the funds decision moves from an exception hold to rejecting the deposit, even though the check may well be genuine (she can still bring it to a branch). The counterfeit is rejected with or without the procedure, and the designer's check, though her first from that maker, is numbered within its range.
Where to call it
- Mobile deposits: after image analysis, duplicate detection and check verification return, and before the app confirms the deposit.
- Branch deposits: when the teller scans the item, so a rejection happens while the check is still at the window.
- When the answer is uncertain, hold rather than release and verify with the paying bank; call again if the customer tries to move the money.
Cost and latency
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 14,765 | $0.00052 | $0.52 | 212 ms |
| Legitimate | 22,948 | $0.00080 | $0.80 | 291 ms |
| Ambiguous | 16,723 | $0.00059 | $0.59 | 259 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/check-deposit-fraud/questions.json --label return_likelihood=<column> --label check_problem=<column> --label funds_action=<column>Each --label names the column with that question's right answer:
return_likelihood: a level, such as "Very likely (over 90%)"check_problem:none,counterfeit,altered,stolen,duplicatefunds_action:normal_availability,exception_hold,reject
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 an exception hold be based on Grayson's answer under Regulation CC?
For checks deposited at a branch or ATM, Regulation CC lets you extend a hold when you have reasonable cause to believe the check is uncollectible, based on facts that would cause a well-grounded belief in the mind of a reasonable person, not on the check or the depositor belonging to a particular class. The hold notice has to give the reason, so cite the facts Grayson weighed, such as a check number outside the maker's range, not a score. Regulators haven't settled whether Regulation CC's availability schedule covers mobile deposits, so many institutions set mobile availability in their mobile deposit agreement; confirm yours with your compliance team.
Can it tell a scam victim from someone depositing a bad check on purpose?
Add a question for it, such as a noul asking whether the account holder appears to be the victim of a fake-check scam rather than a participant. A message about a new job, an online sale or an overpayment and a long, ordinary account history point one way; a new account followed by ATM withdrawals at several locations points the other. The answer changes the conversation with the customer, not the hold.
What if I don't have check-verification or duplicate-detection data?
Send what you have. Without a check-verification service, Grayson can't compare the check number with the maker's range or confirm that the maker's account is open, so its answers will be less certain. Treat an uncertain answer as a reason to hold and verify with the paying bank, not to release.
Related recipes
Detect fraudulent incoming ACH credits and transfers
Release, hold or return an incoming credit that may be proceeds of BEC, account takeover or payroll diversion.
Detect 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.
Business email compromise
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.
Incoming payments
Decide whether an incoming ACH credit is the proceeds of fraud at the sender, and whether to release, hold or return it, from the account's history, the ACH entry and what happened after it posted.