Detect sign-up bonus and referral reward 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.
Grayson reviews a reward your rules held before paying it, such as a sign-up bonus, referral reward, cash-back or offer payout, and returns how likely it is to be abuse, which pattern it follows, whether the account is controlled by the same person as other accounts, and whether to pay, keep holding, deny, or deny and close. It reads what your platform already holds, from the promotion's terms and the signup checks to devices, the referral tree, linked accounts and every transaction since opening, and costs about $0.35 to $0.40 per 1,000 decisions.
- Decides: Whether a sign-up, referral or offer reward is being abused, how, and whether to pay, hold, deny or close.
- Call it: When a rewards rule holds a sign-up bonus, referral reward or offer payout before it is paid
- Questions: 1 score, 2 choice, 1 yes/no
- Cost: $0.00035 to $0.00040 per decision ($0.35 to $0.40 per 1,000) for these examples' 10,027 to 11,330 input tokens
- Latency: 182 to 205 ms for these examples, the median of 5 calls each through api.finic.ai from US-West
Examples
Three held rewards at a consumer fintech app, each sent with the promotion's terms, the signup checks, devices and logins, every transaction since opening, the referral tree and the accounts that share something with it. They are a referee in a 17-account referral ring run from emulators, a husband his wife referred, and a deals-site customer whose phone opened a different customer's bonus account last year.
Open in Playground
A referred account in a 17-account referral ring that pays out to two prepaid cards. A referee opened on an emulator through a residential proxy, with a VoIP phone and a two-day-old email, at an apartment complex where 10 other referees of the same two referrers live. Its only deposit came from a new originator that has sent one 'direct deposit' each to 16 of them, and the money left for a prepaid card shared by 12 accounts within eight minutes.
| Question | Grayson's answer |
|---|---|
abuse_likelihood | 3.95 of 4, confidence 97% |
abuse_pattern | referral_ring, confidence 76% |
linked_to_other_accounts | 99% true |
action | deny_and_close, confidence 97% |
10,058 input tokens, $0.00035 per decision, answered in 185 ms.
The request, with long lists cut short. The full request is fraud.json (37 KB).
{
"model": "grayson-1",
"state": {
"platform": {
"who_we_are": "A consumer fintech app: a spending account held at our partner bank, a Visa debit card, instant transfers to and from linked debit cards and bank accounts, and a rewards program.",
"review_queue": "Rewards risk review. A reward goes to this queue instead of being paid when a rewards rule fires on it; analysts pay, keep holding, deny, or deny and close.",
"customer_base": "About 1.9 million funded accounts; 41,000 rewards paid in September 2026."
},
"promotion_terms": {
"name": "Give $50, Get $50 (referral program, terms revised 2026-03-01)",
"reward": "$50 to the new customer (referee) and $50 to the customer who referred them (referrer)",
"how_to_qualify": "The referee opens an account through the referrer's link or code, verifies their identity, and receives qualifying direct deposits totaling at least $200 within 45 days of opening.",
"qualifying_direct_deposit": "An ACH credit from an employer, payroll provider or government benefits payer. Transfers from your own accounts at other institutions, P2P payments, merchant payouts and cash loads don't qualify.",
"limits": "One account and one sign-up or referral reward per person, for new customers only. A referrer can earn up to 10 referral rewards ($500) per calendar year. You can't refer yourself or open accounts for other people.",
"timing": "Rewards are credited within 5 business days after the qualifying deposit posts, unless held for review.",
"our_rights": "We may withhold or reverse a reward, and close accounts under the account agreement, if we find self-referral, multiple accounts, fraudulent or staged qualifying activity, or other abuse of these terms."
},
"program_baselines": {
"referee_rewards_paid": 118400,
"median_days_open_to_first_qualifying_deposit": 12,
"referees_with_debit_card_purchases_in_first_30_days_pct": 81,
"referees_moving_over_90pct_of_first_deposit_out_within_24h_pct": 9,
"referees_sharing_home_address_with_referrer_pct": 7,
"of_those_sharing_an_address_paid_after_review_pct": 91,
"referrers_with_5_or_more_referrals_in_30_days_pct": 0.4,
"held_referral_rewards_confirmed_as_abuse_pct": 23
},
"legend": {
"ach": "SEC code PPD = consumer credit or debit originated by a company (payroll and benefits use it); company_name and entry_description are the originator's fields (16 and 10 characters); individual_name is the receiver's name as the originator sent it",
"device_check": "From our device intelligence vendor at each session: device_id is a hardware-level fingerprint that survives app reinstalls; emulator, app_cloner, rooted and mock_location are detections with confidence; accounts_on_device counts our accounts seen on the same device_id",
"ip_check": "From our IP intelligence vendor: connection type, ISP, geolocation and proxy score (0 to 100, higher means more likely a proxy, VPN or hosting network)",
"rewards_risk_score": "Our rewards risk model, 0 to 100; rewards at 60 or above are held automatically"
},
"account": {
"account": "x2061",
"name": "Tavon Mills",
"opened": "2026-09-30T03:12:41Z",
"status": "Open; reward held",
"acquisition": "Referral link from account x4836 (Derrick Sandoval, R1)",
"stated_occupation": "Warehouse associate",
"stated_employer": "Not asked at sign-up",
"date_of_birth": "1998-04-17",
"address": "Apt 14C, Westglen Pointe Apartments, Houston TX 77063",
"identity_verification": {
"method": "Database verification (no document or selfie required for accounts under our limits)",
"result": "Pass: name, date of birth and SSN found together in credit-header records",
"detail": "SSN first seen with this name in 2016; thin file (one closed student loan, one collection); the identity's address history is in Shreveport and Baton Rouge, LA, with no Houston address; the Westglen Pointe address doesn't match the identity"
},
"email": {
"address": "tmills.0929@example.com",
"check": "Free webmail; first seen anywhere 2026-09-28; no social or commerce history; name matches"
},
"phone": {
"number": "(713) 555-0161",
"check": "Non-fixed VoIP number; first seen 2026-09-27; not linked to the name in carrier records"
},
"signup_device": {
"device_id": "dfp_7c21e09a4b",
"reported_as": "Android 13, Google Pixel 7",
"emulator": "Detected (high confidence): no telephony hardware, sensor readings constant",
"app_cloner": "Detected: app running in a parallel-space container",
"rooted": "Yes",
"mock_location": "On; GPS reported Houston TX",
"device_time_zone": "UTC",
"accounts_on_device": "7 at sign-up, counting this one and R1"
},
"signup_ip": {
"ip": "203.0.113.84",
"check": "Residential proxy suspected, proxy score 92; geolocated Dallas TX; this IP was used for 6 other sign-ups on our app in the last 30 days"
}
},
"devices": [
{
"device_id": "dfp_7c21e09a4b",
"first_seen": "2026-09-08T02:41:10Z",
"last_seen": "2026-10-06T14:10:47Z",
"detections": "Emulator, app cloner, rooted, mock location",
"accounts_on_device": "This account, R1 x4836 (since 2026-09-08) and 7 other referees of R1 and R2: x4776 Alexis Lowe (opened 2026-09-08); x3994 Malik Grant (opened 2026-09-10); x1284 Destiny Kirby (opened 2026-09-16); x8431 Roderick Pace (opened 2026-09-24); x3244 Kiara Toler (opened 2026-09-25); x9024 Tasha Quarles (opened 2026-10-03); x9092 Quentin Yates (opened 2026-10-04)"
},
{
"device_id": "dfp_a93f10c2d7 and dfp_e5b8812f03",
"first_seen": "2026-09-11T03:02:51Z",
"last_seen": "2026-10-06T13:58:20Z",
"detections": "Emulator, app cloner, rooted, mock location",
"accounts_on_device": "Not seen on this account; together they opened 7 other referees of R1 and R2, and dfp_a93f10c2d7 logs in to R2"
}
],
"sessions_and_events": {
"columns": [
"ts",
"event",
"device_id",
"ip",
"detail"
],
"rows": [
[
"2026-09-30T03:06:41Z",
"Referral link opened",
"dfp_7c21e09a4b",
"203.0.113.84",
"Link from R1 (Derrick Sandoval), opened in the app's sign-up flow; no install attribution from an ad or store page"
],
[
"2026-09-30T03:12:41Z",
"Account opened",
"dfp_7c21e09a4b",
"203.0.113.84",
"Sign-up form completed in 41 seconds; name, date of birth, SSN and address pasted; identity verification passed"
],
[
"2026-09-30T03:14:51Z",
"Debit card ordered",
"dfp_7c21e09a4b",
"203.0.113.84",
"Physical card mailed to the Westglen Pointe address; virtual card issued"
],
[
"2026-09-30T05:31:05Z",
"Login",
"dfp_7c21e09a4b",
"203.0.113.19",
"Viewed the referral offer page and the direct deposit form"
],
[
"2026-09-30T05:33:52Z",
"Direct deposit form downloaded",
"dfp_7c21e09a4b",
"203.0.113.19",
"Pre-filled direct deposit form with our routing and account number"
],
"… 6 more in fraud.json"
]
},
"funding_and_payout_methods": [
{
"method": "Debit card x8812 (instant transfers out)",
"added": "2026-10-02",
"issuer": "Prepaid card program at another bank; name check not supported",
"used_on_our_platform": "Added as an instant-transfer destination on 12 of our accounts under 12 different names since 2026-09-12: R1 and 11 of the referees below, this account included; $3,126.09 pushed to it in total; it has never funded any of them"
},
{
"method": "No external bank account linked",
"added": null,
"issuer": null,
"used_on_our_platform": null
}
],
"instant_transfers_to_card_x8812": {
"note": "Every instant transfer to card x8812 from any of our accounts",
"columns": [
"ts",
"account",
"name",
"amount_usd",
"what_was_sent"
],
"rows": [
[
"2026-09-11T15:52:00Z",
"x4776",
"Alexis Lowe",
236.4,
"qualifying deposit, full balance"
],
[
"2026-09-12T12:09:41Z",
"x4836",
"Derrick Sandoval (R1)",
49.25,
"referrer reward"
],
[
"2026-09-12T15:49:47Z",
"x4776",
"Alexis Lowe",
49.25,
"referee reward"
],
[
"2026-09-15T13:47:21Z",
"x4836",
"Derrick Sandoval (R1)",
49.25,
"referrer reward"
],
[
"2026-09-15T15:13:10Z",
"x7375",
"Isaiah Hardy",
236.4,
"qualifying deposit, full balance"
],
"… 21 more in fraud.json"
]
},
"transactions_since_open": {
"note": "Every posted item since the account opened on 2026-09-29; amounts signed (debits negative)",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"detail"
],
"rows": [
[
"2026-10-06T14:02:17Z",
"ach_credit",
212.4,
212.4,
"BRISKPAY INC DIRDEP",
"SEC PPD; company_name BRISKPAY INC; entry_description DIRDEP; company_id 18xxxxx922; individual_name TAVON MILLS"
],
[
"2026-10-06T14:09:58Z",
"instant_transfer_out",
-209.21,
3.19,
"Instant transfer to card x8812",
"push to debit card; arrived 2026-10-06T14:10:03Z"
],
[
"2026-10-06T14:09:58Z",
"fee",
-3.19,
0,
"Instant transfer fee",
"1.5%"
]
]
},
"qualifying_deposit_originator": {
"company_name": "BRISKPAY INC",
"company_id": "18xxxxx922",
"originating_bank": "A small bank in Delaware",
"first_seen_on_our_platform": "2026-09-11",
"accounts_credited": 16,
"accounts_credited_that_opened_since_2026_09_01": 16,
"credits": "One credit to each account, $200.00 to $240.00; no account has received a second credit",
"moved_out_within_30_minutes": "15 of 16",
"comparison": "A payroll originator's first month on our platform usually means a handful of accounts receiving recurring credits on a fixed weekday."
},
"referral_graph": {
"referrer": {
"id": "R1",
"account": "x4836",
"name": "Derrick Sandoval",
"opened": "2026-07-21",
"joined_through": "Referral link from an account we closed on 2026-09-02 for promotion abuse",
"own_qualifying_deposits": "Two LONESTAR STAFFNG PAYROLL credits in August ($388.62, $412.05); none since",
"devices": "An iPhone 12 from 2026-07-21 to 2026-08-30; since 2026-09-08 only dfp_7c21e09a4b (the emulator this account was opened on)",
"referrals": "11 since 2026-09-08 (8 paid, the rest held); the annual cap is 10 paid referrals",
"ledger": {
"note": "Every posted item on the referrer's account since it opened on 2026-07-21; amounts signed",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"detail"
],
"rows": [
[
"2026-07-22T00:40:02Z",
"instant_transfer_in",
60,
60,
"Instant transfer from card x5120",
"debit card at a large national bank, name match DERRICK SANDOVAL"
],
[
"2026-07-22T20:39:46Z",
"card_purchase",
-40.32,
19.68,
"SHELL OIL 57444219 HOUSTON TX",
"mcc 5542, chip"
],
[
"2026-07-26T03:14:19Z",
"card_purchase",
-11.95,
7.73,
"WHATABURGER #0687 HOUSTON TX",
"mcc 5814, contactless"
],
[
"2026-08-07T08:01:09Z",
"ach_credit",
388.62,
396.35,
"LONESTAR STAFFNG PAYROLL",
"SEC PPD; company_name LONESTAR STAFFNG; entry_description PAYROLL; individual_name DERRICK SANDOVAL"
],
[
"2026-08-08T21:53:01Z",
"card_purchase",
-41.42,
354.93,
"KROGER #0393 HOUSTON TX",
"mcc 5411, chip"
],
"… 36 more in fraud.json"
]
}
},
"second_referrer": {
"id": "R2",
"account": "x5302",
"name": "Kiara Benton",
"opened": "2026-08-30",
"link_to_R1": "Logs in from device dfp_a93f10c2d7, which also opened 2 of R1's referees; pays out to card x3307, which 5 of the referees below also use",
"referrals": "6 since 2026-09-11 (3 paid)"
},
"referees_of_R1_and_R2": {
"columns": [
"account",
"name",
"opened",
"referred_by",
"address",
"… 6 more in fraud.json"
],
"rows": [
[
"x4776",
"Alexis Lowe",
"2026-09-08",
"R1",
"Apt 2A, Westglen Pointe Apartments, Houston TX 77063",
"… 6 more in fraud.json"
],
[
"x3994",
"Malik Grant",
"2026-09-10",
"R1",
"Apt 3B, Westglen Pointe Apartments, Houston TX 77063",
"… 6 more in fraud.json"
],
[
"x7375",
"Isaiah Hardy",
"2026-09-11",
"R2",
"Apt 7D, Westglen Pointe Apartments, Houston TX 77063",
"… 6 more in fraud.json"
],
[
"x9627",
"Brianna Foster",
"2026-09-13",
"R1",
"PMB 2207, a mail-and-parcel store on Bellaire Blvd, Houston TX 77036",
"… 6 more in fraud.json"
],
[
"x8574",
"Darius Mack",
"2026-09-14",
"R1",
"Apt 9A, Westglen Pointe Apartments, Houston TX 77063",
"… 6 more in fraud.json"
],
"… 12 more in fraud.json"
]
}
},
"linked_accounts": {
"note": "Accounts sharing an attribute with x2061, from our link analysis",
"columns": [
"link",
"accounts"
],
"rows": [
[
"Same device_id dfp_7c21e09a4b",
"R1 x4836 and 7 referees of R1 and R2"
],
[
"Same payout card x8812",
"R1 and 10 other referees of R1 and R2"
],
[
"Same building, Westglen Pointe Apartments",
"10 other accounts, all opened since 2026-09-08, all referees of R1 or R2"
],
[
"Same sign-up IP 203.0.113.84",
"6 other accounts opened in the last 30 days, 5 of them referees of R1 or R2"
],
[
"Same qualifying deposit originator BRISKPAY INC",
"15 other accounts, all referees of R1 or R2"
],
[
"Same phone, email or SSN",
"None"
]
]
},
"reward_history": {
"this_account": "None before this reward",
"referees_of_R1_and_R2": "11 referee rewards and 11 referrer rewards paid between 2026-09-12 and 2026-09-29 ($1,100), before the emulator, shared-device and shared-payout rules began holding rewards on 2026-09-29; none clawed back yet; every paid reward was pushed out to card x8812 or x3307 within 5 hours",
"earlier_ring": "R1 itself joined through the link of an account closed on 2026-09-02 for promotion abuse, after 8 of its referrals were denied"
},
"customer_contact": "None",
"rules_fired": [
"REF-01 referrer has 5 or more referrals in 30 days (R1: 11)",
"REF-04 qualifying deposit originator first seen on our platform under 30 days ago",
"REF-06 over 90% of the qualifying deposit moved out within 1 hour",
"DEV-02 emulator or app cloner detected at sign-up",
"DEV-03 device seen on more than 2 accounts",
"PAY-02 payout card used on more than 2 accounts",
"ID-05 address doesn't match the verified identity's address history"
],
"rewards_risk_score": 97,
"reward_under_review": {
"reward": "Referral reward: $50 to this account (referee) and $50 to R1 (referrer)",
"promotion": "Give $50, Get $50",
"triggered_by": "BRISKPAY INC ACH credit of $212.40 posted 2026-10-06T14:02:17Z, counted as a qualifying direct deposit (SEC PPD)",
"held_at": "2026-10-06T14:05:00Z",
"reviewed_at": "2026-10-07T15:12:00Z",
"balance_now_usd": 0
}
},
"questions": {
"abuse_likelihood": {
"type": "score",
"instructions": "From the promotion owner's point of view, how likely is it that this reward is being claimed through abuse: by someone the terms exclude (an extra account of a person who already has one, a self-referral), or through qualifying activity that was faked, staged or paid for with money that will be reversed? A customer who simply meets the terms, even one who joined mainly for the reward, is not abuse.",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"abuse_pattern": {
"type": "choice",
"instructions": "Which best describes how this reward was earned?",
"criteria": {
"legitimate": "No abuse: an eligible customer earned the reward through genuine qualifying activity",
"multi_accounting": "Multi-accounting: a person who already has or had an account with us opened another, under their own or someone else's identity, to claim a one-per-person reward again",
"referral_ring": "Referral ring: referral rewards collected through referred accounts that the referrer controls or recruited only to collect the reward, however their qualifying activity was produced",
"fake_offer_completion": "Faked qualifying activity outside a referral scheme: sign-up, offer or cash-back rewards earned with completions from bots, emulators or install farms, or with deposits or purchases staged only to trigger the reward and then reversed or moved straight back",
"bonus_bust_out": "Bust-out: rewards collected and the balance cashed out with money that is later returned or charged back, leaving us with a loss",
"other_abuse": "Another kind of abuse of the promotion terms"
}
},
"linked_to_other_accounts": {
"type": "noul",
"instructions": "Is the account under review controlled by the same person as one or more other accounts on our platform? Judge from shared devices, payment and payout methods, addresses, phone numbers, emails and identity details. A shared public or mobile-carrier network, or a family member with their own identity, phone and payment methods, does not make it the same person."
},
"action": {
"type": "choice",
"instructions": "What should we do with the reward under review?",
"criteria": {
"pay": "Pay the reward now",
"hold_for_review": "Keep holding the reward and send the account to an analyst, who may ask the customer for more information or verification, before paying or denying",
"deny": "Deny this reward under the promotion terms and keep the account open",
"deny_and_close": "Deny the reward, claw back other rewards earned the same way, and close the account and the accounts it controls under the account agreement"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_7fb539a461c14ce7a920a5180320e8a7",
"model": "grayson-1",
"answers": {
"abuse_likelihood": {
"type": "score",
"score": 3.952,
"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.9717,
"probabilities": {
"0": 0.0051,
"1": 0.0031,
"2": 0.0035,
"3": 0.0109,
"4": 0.9774
}
},
"abuse_pattern": {
"type": "choice",
"choice": "referral_ring",
"confidence": 0.7553,
"probabilities": {
"legitimate": 0.01,
"multi_accounting": 0.0396,
"referral_ring": 0.7961,
"fake_offer_completion": 0.1077,
"bonus_bust_out": 0.0069,
"other_abuse": 0.0396
}
},
"linked_to_other_accounts": {
"type": "noul",
"noul": 0.9914
},
"action": {
"type": "choice",
"choice": "deny_and_close",
"confidence": 0.966,
"probabilities": {
"pay": 0.0045,
"hold_for_review": 0.0031,
"deny": 0.0178,
"deny_and_close": 0.9745
}
}
},
"usage": {
"input_tokens": 10058,
"output_tokens": 0
}
}Open in Playground
A husband referred by his wife, sharing their home address, Wi-Fi and surname. Three rules held this referral: the referee and referrer share a home address and home IP address, and his phone was ported last month. The record explains them: they co-own the house, each has their own phone and device, his deposits are a split of a real weekly paycheck from an employer that has paid other customers since 2023, and he uses the card every day.
| Question | Grayson's answer |
|---|---|
abuse_likelihood | 0.02 of 4, confidence 98% |
abuse_pattern | legitimate, confidence 99% |
linked_to_other_accounts | Under 1% true |
action | pay, confidence 99% |
10,027 input tokens, $0.00035 per decision, answered in 182 ms.
The request, with long lists cut short. The full request is legitimate.json (36 KB).
{
"model": "grayson-1",
"state": {
"platform": {
"who_we_are": "A consumer fintech app: a spending account held at our partner bank, a Visa debit card, instant transfers to and from linked debit cards and bank accounts, and a rewards program.",
"review_queue": "Rewards risk review. A reward goes to this queue instead of being paid when a rewards rule fires on it; analysts pay, keep holding, deny, or deny and close.",
"customer_base": "About 1.9 million funded accounts; 41,000 rewards paid in September 2026."
},
"promotion_terms": {
"name": "Give $50, Get $50 (referral program, terms revised 2026-03-01)",
"reward": "$50 to the new customer (referee) and $50 to the customer who referred them (referrer)",
"how_to_qualify": "The referee opens an account through the referrer's link or code, verifies their identity, and receives qualifying direct deposits totaling at least $200 within 45 days of opening.",
"qualifying_direct_deposit": "An ACH credit from an employer, payroll provider or government benefits payer. Transfers from your own accounts at other institutions, P2P payments, merchant payouts and cash loads don't qualify.",
"limits": "One account and one sign-up or referral reward per person, for new customers only. A referrer can earn up to 10 referral rewards ($500) per calendar year. You can't refer yourself or open accounts for other people.",
"timing": "Rewards are credited within 5 business days after the qualifying deposit posts, unless held for review.",
"our_rights": "We may withhold or reverse a reward, and close accounts under the account agreement, if we find self-referral, multiple accounts, fraudulent or staged qualifying activity, or other abuse of these terms."
},
"program_baselines": {
"referee_rewards_paid": 118400,
"median_days_open_to_first_qualifying_deposit": 12,
"referees_with_debit_card_purchases_in_first_30_days_pct": 81,
"referees_moving_over_90pct_of_first_deposit_out_within_24h_pct": 9,
"referees_sharing_home_address_with_referrer_pct": 7,
"of_those_sharing_an_address_paid_after_review_pct": 91,
"referrers_with_5_or_more_referrals_in_30_days_pct": 0.4,
"held_referral_rewards_confirmed_as_abuse_pct": 23
},
"legend": {
"ach": "SEC code PPD = consumer credit or debit originated by a company (payroll and benefits use it); company_name and entry_description are the originator's fields (16 and 10 characters); individual_name is the receiver's name as the originator sent it",
"device_check": "From our device intelligence vendor at each session: device_id is a hardware-level fingerprint that survives app reinstalls; emulator, app_cloner, rooted and mock_location are detections with confidence; accounts_on_device counts our accounts seen on the same device_id",
"ip_check": "From our IP intelligence vendor: connection type, ISP, geolocation and proxy score (0 to 100, higher means more likely a proxy, VPN or hosting network)",
"rewards_risk_score": "Our rewards risk model, 0 to 100; rewards at 60 or above are held automatically"
},
"account": {
"account": "x7718",
"name": "Marcus Whitaker",
"opened": "2026-09-07T00:41:13Z",
"status": "Open; reward held",
"acquisition": "Referral link from account x3092 (Megan Whitaker)",
"stated_occupation": "HVAC service technician",
"stated_employer": "Not asked at sign-up",
"date_of_birth": "1989-11-02",
"address": "Single-family home, Hilliard OH 43026 (same address as the referrer)",
"identity_verification": {
"method": "Database verification (no document or selfie required for accounts under our limits)",
"result": "Pass: name, date of birth and SSN found together in credit-header records",
"detail": "SSN first seen with this name in 2006; credit file since 2008 with a mortgage on the Hilliard address since 2019 (joint with Megan Whitaker) and two auto loans; address matches"
},
"email": {
"address": "marcus.whitaker89@example.net",
"check": "Free webmail; first seen 2011; linked to many commerce accounts; name matches"
},
"phone": {
"number": "(614) 555-0137",
"check": "Mobile, postpaid; in his name since 2015; ported to a new carrier on 2026-08-12"
},
"signup_device": {
"device_id": "dfp_31d0b7a2c4",
"reported_as": "iOS 19, iPhone 14",
"emulator": "Not detected",
"app_cloner": "Not detected",
"rooted": "No",
"mock_location": "Off",
"device_time_zone": "America/New_York",
"accounts_on_device": 1
},
"signup_ip": {
"ip": "198.51.100.42",
"check": "Residential cable ISP, Hilliard OH, proxy score 3; also used by the referrer's account since 2022"
}
},
"devices": [
{
"device_id": "dfp_31d0b7a2c4",
"first_seen": "2026-09-07T00:32:13Z",
"last_seen": "2026-10-04T23:41:20Z",
"detections": "None; hardware first reported 2024-10 by the device vendor's network",
"accounts_on_device": "This account only"
}
],
"sessions_and_events": {
"columns": [
"ts",
"event",
"device_id",
"ip",
"detail"
],
"rows": [
[
"2026-09-07T00:32:13Z",
"Referral link opened",
"dfp_31d0b7a2c4",
"198.51.100.42",
"Link from Megan Whitaker, opened from a text message on his phone; app installed from the app store"
],
[
"2026-09-07T00:41:13Z",
"Account opened",
"dfp_31d0b7a2c4",
"198.51.100.42",
"Sign-up form completed in 6 minutes 12 seconds; fields typed; address chosen from autocomplete; identity verification passed"
],
[
"2026-09-07T00:49:50Z",
"Instant transfer in",
"dfp_31d0b7a2c4",
"198.51.100.42",
"$100.00 from his debit card x9034 (name match)"
],
[
"2026-09-08T16:14:09Z",
"Direct deposit form downloaded",
"dfp_31d0b7a2c4",
"192.0.2.211",
"Mobile carrier network, Columbus OH"
],
[
"2026-09-12T19:02:33Z",
"Card activated",
"dfp_31d0b7a2c4",
"198.51.100.42",
"Physical card activated; added to Apple Pay"
],
"… 11 more in legitimate.json"
]
},
"funding_and_payout_methods": [
{
"method": "Debit card x9034 (instant transfers in)",
"added": "2026-09-06",
"issuer": "Large national bank; name check: MARCUS WHITAKER, match",
"used_on_our_platform": "This account only"
},
{
"method": "No external bank account linked",
"added": null,
"issuer": null,
"used_on_our_platform": null
}
],
"transactions_since_open": {
"note": "Every posted item since the account opened on 2026-09-06; amounts signed (debits negative)",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"detail"
],
"rows": [
[
"2026-09-07T00:49:50Z",
"instant_transfer_in",
250,
250,
"Instant transfer from card x9034",
"debit card at a large national bank, name match MARCUS WHITAKER"
],
[
"2026-09-07T12:02:24Z",
"card_purchase",
-7.75,
242.25,
"TIM HORTONS #8817 COLUMBUS OH",
"mcc 5814, Apple Pay"
],
[
"2026-09-09T12:32:05Z",
"card_purchase",
-10.05,
232.2,
"TIM HORTONS #8817 COLUMBUS OH",
"mcc 5814, Apple Pay"
],
[
"2026-09-11T23:58:43Z",
"card_purchase",
-24.36,
207.84,
"AMAZON MKTPL*BV7Q21XK0 Amzn.com/bill WA",
"mcc 5942, card on file"
],
[
"2026-09-13T22:54:30Z",
"card_purchase",
-41.23,
166.61,
"SPEEDWAY 09412 COLUMBUS OH",
"mcc 5542, Apple Pay"
],
"… 28 more in legitimate.json"
]
},
"qualifying_deposit_originator": {
"company_name": "TRI-COUNTY HVAC",
"company_id": "31xxxxx407",
"originating_bank": "A regional bank in Ohio",
"first_seen_on_our_platform": "2023-04-07",
"accounts_credited": 5,
"accounts_credited_that_opened_since_2026_09_01": 1,
"credits": "Weekly on Fridays to 5 accounts; amounts vary by person and week, except this account's fixed $400.00, which looks like a split deposit",
"moved_out_within_30_minutes": "0 of 5",
"comparison": "A long-standing payroll originator with steady weekly credits."
},
"referral_graph": {
"referrer": {
"id": "R1",
"account": "x3092",
"name": "Megan Whitaker",
"opened": "2022-03-14",
"joined_through": "Organic sign-up from the app store",
"own_qualifying_deposits": "Biweekly RIVERBEND MED CTR PAYROLL credits since 2022-04",
"devices": "An iPhone 15 (dfp_88a4e1c09f) since 2024-11 and an iPad; no device shared with this account",
"referrals": "3 in four years: her sister (2023, Dayton OH), a coworker (2024, Columbus OH), and this account; the first two were paid and both accounts are still active",
"phone": "(614) 555-0112, mobile, postpaid; also ported to a new carrier on 2026-08-12",
"monthly_totals_12_months": {
"columns": [
"month",
"payroll_in_usd",
"transfers_from_marcus_bank_usd",
"card_spend_usd",
"mortgage_and_bills_usd",
"p2p_net_usd",
"ending_balance_usd"
],
"rows": [
[
"2025-10",
3684.31,
900,
1112.18,
1825.11,
0,
3787.57
],
[
"2025-11",
2433.95,
900,
1268.94,
1845.57,
0,
4007.01
],
[
"2025-12",
2487.32,
900,
1176.41,
1822.58,
0,
4395.34
],
[
"2026-01",
2487.67,
900,
1240.34,
1809.48,
0,
4733.19
],
[
"2026-02",
2502.96,
900,
721.72,
1856.93,
0,
5557.5
],
"… 7 more in legitimate.json"
]
},
"transactions_since_2026_09_01": {
"note": "Every posted item on the referrer's account since 2026-09-01; amounts signed",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"detail"
],
"rows": [
[
"2026-09-01T11:00:00Z",
"ach_debit",
-1642.18,
6414.69,
"HILLCREST MTG SVC MTG PYMT",
"SEC PPD; mortgage on the Hilliard home, joint with Marcus Whitaker"
],
[
"2026-09-02T11:13:20Z",
"card_purchase",
-43.94,
6370.75,
"SPEEDWAY 09388 HILLIARD OH",
"mcc 5542, Apple Pay"
],
[
"2026-09-04T02:41:18Z",
"card_purchase",
-35.83,
6334.92,
"AMAZON MKTPL*K20QX7BR1 Amzn.com/bill WA",
"mcc 5942, card on file"
],
[
"2026-09-04T10:01:40Z",
"ach_credit",
1276.64,
7611.56,
"RIVERBEND MED CTR PAYROLL",
"SEC PPD; company_name RIVERBEND MED; entry_description PAYROLL; individual_name MEGAN WHITAKER"
],
[
"2026-09-04T16:38:16Z",
"card_purchase",
-15.94,
7595.62,
"PANERA BREAD #600987 COLUMBUS OH",
"mcc 5814, Apple Pay"
],
"… 40 more in legitimate.json"
]
}
},
"referees_of_R1": {
"columns": [
"account",
"name",
"opened",
"address",
"device_id",
"qualifying_deposit",
"status",
"referral_reward"
],
"rows": [
[
"x1450",
"Lauren Pryor",
"2023-05-20",
"Dayton OH 45429",
"dfp_02c9e7d1a8",
"DAYTON PUBLIC SCH payroll, biweekly",
"Open, active",
"Paid 2023-06-09"
],
[
"x6633",
"Tamara Ellis",
"2024-08-03",
"Columbus OH 43229",
"dfp_6b10f4e2e3",
"RIVERBEND MED CTR payroll, biweekly",
"Open, active",
"Paid 2024-08-23"
],
[
"x7718",
"Marcus Whitaker",
"2026-09-06",
"Hilliard OH 43026 (same as R1)",
"dfp_31d0b7a2c4",
"TRI-COUNTY HVAC payroll, weekly",
"Under review",
"Held 2026-09-18 (this review)"
]
]
}
},
"linked_accounts": {
"note": "Accounts sharing an attribute with x7718, from our link analysis",
"columns": [
"link",
"accounts"
],
"rows": [
[
"Same address (Hilliard OH 43026)",
"x3092 Megan Whitaker (the referrer), customer since 2022"
],
[
"Same home IP 198.51.100.42",
"x3092 Megan Whitaker"
],
[
"Same surname",
"x3092 Megan Whitaker"
],
[
"P2P between the accounts",
"$150.00 from Megan on 2026-09-21; $86.50 to Megan on 2026-09-28"
],
[
"Same device_id, payout card, phone, email or SSN",
"None"
]
]
},
"reward_history": {
"this_account": "None before this reward",
"referrer": "Two referrer rewards (2023-06-09, 2024-08-23) and $212.40 in debit card cash back since 2022; no clawbacks",
"household": "No other account at this address has ever existed on our platform"
},
"customer_contact": [
{
"ts": "2026-09-29T23:12:45Z",
"channel": "In-app chat",
"account": "x3092 (the referrer)",
"summary": "Megan asked when the referral bonus would arrive: 'My husband signed up with my link and his paycheck has been going in for two weeks.' The agent told her it was being reviewed."
}
],
"rules_fired": [
"REF-02 referee and referrer share a home address",
"REF-03 referee signed up from an IP address the referrer uses",
"ID-07 referee phone number ported in the last 60 days"
],
"rewards_risk_score": 64,
"reward_under_review": {
"reward": "Referral reward: $50 to this account (referee) and $50 to Megan Whitaker (referrer)",
"promotion": "Give $50, Get $50",
"triggered_by": "TRI-COUNTY HVAC ACH credit of $400.00 posted 2026-09-18T10:02:11Z, counted as a qualifying direct deposit (SEC PPD)",
"held_at": "2026-09-18T10:05:00Z",
"reviewed_at": "2026-10-05T14:25:00Z",
"balance_now_usd": 409.97
}
},
"questions": {
"abuse_likelihood": {
"type": "score",
"instructions": "From the promotion owner's point of view, how likely is it that this reward is being claimed through abuse: by someone the terms exclude (an extra account of a person who already has one, a self-referral), or through qualifying activity that was faked, staged or paid for with money that will be reversed? A customer who simply meets the terms, even one who joined mainly for the reward, is not abuse.",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"abuse_pattern": {
"type": "choice",
"instructions": "Which best describes how this reward was earned?",
"criteria": {
"legitimate": "No abuse: an eligible customer earned the reward through genuine qualifying activity",
"multi_accounting": "Multi-accounting: a person who already has or had an account with us opened another, under their own or someone else's identity, to claim a one-per-person reward again",
"referral_ring": "Referral ring: referral rewards collected through referred accounts that the referrer controls or recruited only to collect the reward, however their qualifying activity was produced",
"fake_offer_completion": "Faked qualifying activity outside a referral scheme: sign-up, offer or cash-back rewards earned with completions from bots, emulators or install farms, or with deposits or purchases staged only to trigger the reward and then reversed or moved straight back",
"bonus_bust_out": "Bust-out: rewards collected and the balance cashed out with money that is later returned or charged back, leaving us with a loss",
"other_abuse": "Another kind of abuse of the promotion terms"
}
},
"linked_to_other_accounts": {
"type": "noul",
"instructions": "Is the account under review controlled by the same person as one or more other accounts on our platform? Judge from shared devices, payment and payout methods, addresses, phone numbers, emails and identity details. A shared public or mobile-carrier network, or a family member with their own identity, phone and payment methods, does not make it the same person."
},
"action": {
"type": "choice",
"instructions": "What should we do with the reward under review?",
"criteria": {
"pay": "Pay the reward now",
"hold_for_review": "Keep holding the reward and send the account to an analyst, who may ask the customer for more information or verification, before paying or denying",
"deny": "Deny this reward under the promotion terms and keep the account open",
"deny_and_close": "Deny the reward, claw back other rewards earned the same way, and close the account and the accounts it controls under the account agreement"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_1dc71aabf2944ae6b7bb5e608d7f660d",
"model": "grayson-1",
"answers": {
"abuse_likelihood": {
"type": "score",
"score": 0.022,
"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.9842,
"probabilities": {
"0": 0.9874,
"1": 0.0085,
"2": 0.0009,
"3": 0.001,
"4": 0.0022
}
},
"abuse_pattern": {
"type": "choice",
"choice": "legitimate",
"confidence": 0.9937,
"probabilities": {
"legitimate": 0.9948,
"multi_accounting": 0.0025,
"referral_ring": 0.0009,
"fake_offer_completion": 0.0006,
"bonus_bust_out": 0.0004,
"other_abuse": 0.0009
}
},
"linked_to_other_accounts": {
"type": "noul",
"noul": 0.0041
},
"action": {
"type": "choice",
"choice": "pay",
"confidence": 0.9918,
"probabilities": {
"pay": 0.9939,
"hold_for_review": 0.0028,
"deny": 0.0022,
"deny_and_close": 0.0012
}
}
},
"usage": {
"input_tokens": 10027,
"output_tokens": 0
}
}Open in Playground
A sign-up bonus on a phone that opened another customer's bonus account last year. A new customer from a bank-bonus deals site met the $1,000 direct deposit requirement with two fixed $500 splits of what looks like real pay, and moved each out within a day. His phone opened a different customer's account in 2025, which also came from the deals site, earned a bonus and sent its closing balance to the bank account he now uses; that account's thin identity logged in from his home Wi-Fi on evenings and weekends. They could be a couple sharing a phone or one person with two identities.
| Question | Grayson's answer |
|---|---|
abuse_likelihood | 0.75 of 4, confidence 55% (Very unlikely 64%, Unlikely 18%, Uncertain 3%, Likely 7%, Very likely 8%) |
abuse_pattern | legitimate, confidence 81% |
linked_to_other_accounts | 20% true |
action | pay, confidence 87% |
11,330 input tokens, $0.00040 per decision, answered in 205 ms.
The request, with long lists cut short. The full request is ambiguous.json (38 KB).
{
"model": "grayson-1",
"state": {
"platform": {
"who_we_are": "A consumer fintech app: a spending account held at our partner bank, a Visa debit card, instant transfers to and from linked debit cards and bank accounts, and a rewards program.",
"review_queue": "Rewards risk review. A reward goes to this queue instead of being paid when a rewards rule fires on it; analysts pay, keep holding, deny, or deny and close.",
"customer_base": "About 1.9 million funded accounts; 41,000 rewards paid in September 2026."
},
"promotion_terms": {
"name": "Fall new-customer bonus, campaign FALL150 (2026-08-20 to 2026-10-31; was $100 before 2026-08-20)",
"reward": "$150 sign-up bonus",
"how_to_qualify": "Open your first account with us during the campaign, verify your identity, and receive qualifying direct deposits totaling at least $1,000 within 60 days of opening.",
"qualifying_direct_deposit": "An ACH credit from an employer, payroll provider or government benefits payer. Transfers from your own accounts at other institutions, P2P payments, merchant payouts and cash loads don't qualify.",
"limits": "One account and one sign-up or referral reward per person, for new customers only. Not available if you have had an account with us before.",
"timing": "Paid within 5 business days after the deposit that completes the requirement, unless held for review. If you close the account within 90 days of opening, we may deduct the bonus.",
"our_rights": "We may withhold or reverse the bonus, and close accounts under the account agreement, if we find multiple accounts, fraudulent or staged qualifying activity, or other abuse of these terms."
},
"program_baselines": {
"bonuses_paid": 64200,
"recipients_moving_over_90pct_of_qualifying_deposits_out_within_48h_pct": 34,
"recipients_still_active_90_days_after_bonus_pct": 61,
"recipients_acquired_through_deal_and_affiliate_sites_pct": 22,
"held_signup_bonuses_confirmed_as_abuse_pct": 17
},
"legend": {
"ach": "SEC code PPD = consumer credit or debit originated by a company (payroll and benefits use it); company_name and entry_description are the originator's fields (16 and 10 characters); individual_name is the receiver's name as the originator sent it",
"device_check": "From our device intelligence vendor at each session: device_id is a hardware-level fingerprint that survives app reinstalls; emulator, app_cloner, rooted and mock_location are detections with confidence; accounts_on_device counts our accounts seen on the same device_id",
"ip_check": "From our IP intelligence vendor: connection type, ISP, geolocation and proxy score (0 to 100, higher means more likely a proxy, VPN or hosting network)",
"rewards_risk_score": "Our rewards risk model, 0 to 100; rewards at 60 or above are held automatically"
},
"account": {
"account": "x6127",
"name": "Andre Castillo",
"opened": "2026-08-25T02:06:48Z",
"status": "Open; bonus held",
"acquisition": "Affiliate link from a bank-bonus deals site, 4 days after the bonus rose from $100 to $150",
"stated_occupation": "Auto body technician",
"stated_employer": "Not asked at sign-up",
"date_of_birth": "1994-06-30",
"address": "Apartment, Phoenix AZ 85033",
"identity_verification": {
"method": "Database verification (no document or selfie required for accounts under our limits)",
"result": "Pass: name, date of birth and SSN found together in credit-header records",
"detail": "SSN first seen with this name in 2012; credit file since 2013 with an auto loan and two cards; address matches since 2024-02"
},
"email": {
"address": "andre.castillo.az@example.com",
"check": "Free webmail; first seen 2016; linked to commerce and social accounts; name matches"
},
"phone": {
"number": "(602) 555-0183",
"check": "Mobile, postpaid; in his name since 2020; no recent port"
},
"signup_device": {
"device_id": "dfp_c40e9b17a6",
"reported_as": "Android 16, Samsung Galaxy S22",
"emulator": "Not detected",
"app_cloner": "Not detected",
"rooted": "No",
"mock_location": "Off",
"device_time_zone": "America/Phoenix",
"accounts_on_device": 2,
"reset_history": "No factory reset: the same OS install ID since 2025-05-03; our app was deleted on 2025-08-27 and installed again on 2026-08-24"
},
"signup_ip": {
"ip": "198.51.100.177",
"check": "Residential cable ISP, Phoenix AZ, proxy score 4; used by this account since 2026-08-24 and by x0583 (Daniela Moreno) on 9 days in 2025"
}
},
"devices": [
{
"device_id": "dfp_c40e9b17a6",
"first_seen": "2025-05-03T22:15:40Z",
"last_seen": "2026-10-05T03:12:09Z",
"detections": "None",
"accounts_on_device": "This account since 2026-08-24; x0583 Daniela Moreno from 2025-05-03 to 2025-08-26 (closed); not seen on our app between 2025-08-26 and 2026-08-24"
}
],
"sessions_and_events": {
"columns": [
"ts",
"event",
"device_id",
"ip",
"detail"
],
"rows": [
[
"2026-08-25T01:52:48Z",
"Install attributed",
"dfp_c40e9b17a6",
"198.51.100.177",
"App installed from an affiliate link on a bank-bonus deals site ('Best checking bonuses this fall' page), clicked 2026-08-24T01:49Z"
],
[
"2026-08-25T02:06:48Z",
"Account opened",
"dfp_c40e9b17a6",
"198.51.100.177",
"Sign-up form completed in 4 minutes 40 seconds; fields typed; identity verification passed"
],
[
"2026-08-25T02:11:30Z",
"Bank account linked",
"dfp_c40e9b17a6",
"198.51.100.177",
"External checking x2290 at a large national bank, through account aggregation; owner name ANDRE CASTILLO, match"
],
[
"2026-08-25T14:02:18Z",
"Direct deposit form downloaded",
"dfp_c40e9b17a6",
"192.0.2.86",
"Mobile carrier network, Phoenix AZ"
],
[
"2026-08-29T00:30:01Z",
"Card activated",
"dfp_c40e9b17a6",
"198.51.100.177",
"Physical card activated; added to Google Pay"
],
"… 10 more in ambiguous.json"
]
},
"funding_and_payout_methods": [
{
"method": "External checking x2290 (transfers in and out)",
"added": "2026-08-24",
"issuer": "Large national bank; owner name ANDRE CASTILLO verified by account aggregation",
"used_on_our_platform": "Linked to this account only; the same numbers received a $676.19 'send to bank' payment from x0583 (Daniela Moreno) on 2025-08-26"
}
],
"transactions_since_open": {
"note": "Every posted item since the account opened on 2026-08-24; amounts signed (debits negative)",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"detail"
],
"rows": [
[
"2026-08-25T02:12:03Z",
"bank_transfer_in",
25,
25,
"Transfer from bank account x2290",
"external checking at a large national bank, owner name ANDRE CASTILLO verified by account aggregation"
],
[
"2026-08-29T17:36:20Z",
"card_purchase",
-6.2,
18.8,
"CIRCLE K 2709832 PHOENIX AZ",
"mcc 5499, Google Pay"
],
[
"2026-09-01T01:16:55Z",
"card_purchase",
-10.33,
8.47,
"TACO BELL #031240 PHOENIX AZ",
"mcc 5814, Google Pay"
],
[
"2026-09-01T01:20:44Z",
"bank_transfer_in",
100,
108.47,
"Transfer from bank account x2290",
"standard ACH"
],
[
"2026-09-01T16:45:46Z",
"card_purchase",
-6.5,
101.97,
"CIRCLE K 2709832 PHOENIX AZ",
"mcc 5499, Google Pay"
],
"… 15 more in ambiguous.json"
]
},
"qualifying_deposit_originator": {
"company_name": "DESERT RIDGE COL",
"company_id": "46xxxxx118",
"originating_bank": "A community bank in Arizona",
"first_seen_on_our_platform": "2024-03-01",
"accounts_credited": 4,
"accounts_credited_that_opened_since_2026_09_01": 0,
"credits": "Biweekly on Fridays; the other 3 accounts get varying amounts ($690 to $1,410); this account gets a fixed $500.00, which looks like a split deposit",
"moved_out_within_30_minutes": "0 of 4",
"comparison": "A small employer's payroll, paying 3 other customers since 2024."
},
"referral_graph": {
"referrer": null,
"note": "Not referred; this account has not referred anyone"
},
"linked_accounts": {
"note": "Accounts sharing an attribute with x6127, from our link analysis",
"columns": [
"link",
"accounts"
],
"rows": [
[
"Same device_id dfp_c40e9b17a6",
"x0583 Daniela Moreno, 2025-05-03 to 2025-08-26, closed by the customer"
],
[
"Same external bank account x2290",
"x0583 sent her closing balance to it on 2025-08-26"
],
[
"Same acquisition source",
"x0583 also came from the same deals site"
],
[
"Same IP",
"x0583 logged in 9 times from 198.51.100.177 in 2025, this account's home IP now"
],
[
"Same address, phone, email or SSN",
"None"
]
],
"linked_account_detail": {
"account": "x0583",
"name": "Daniela Moreno",
"opened": "2025-05-03",
"closed": "2025-08-27, by the customer in the app ('I don't need a second account')",
"acquisition": "Affiliate link from the same bank-bonus deals site (2025 spring bonus page)",
"date_of_birth": "1997-02-09",
"address": "Apartment, Mesa AZ 85201 (about 25 miles from this account's address in west Phoenix)",
"identity_verification": "Pass by database verification, on two records: name, date of birth and SSN first seen together in 2025-04, a month before opening; SSN issued in Arizona; thin file (one store card opened 2025-04); different SSN, date of birth, phone and email from this account; no address in common in either identity's address history",
"devices": "dfp_c40e9b17a6 (Samsung Galaxy S22) from 2025-05-03 to 2025-08-26; no other device",
"ips": "Mostly a residential cable ISP in Mesa AZ and a mobile carrier network; 9 of its 64 logins, all evenings or weekends between 2025-06 and 2025-08, came from 198.51.100.177, the home IP this account uses now (west Phoenix)",
"email": "dm.0503x@example.com: free webmail, first seen 2025-05-01 (two days before opening), no other history",
"phone": "(480) 555-0129: prepaid mobile, first seen 2025-04-28; disconnected since 2025-09",
"qualifying_deposits": "SONORAN GRILL GRP PAYROLL, biweekly, $412.18 to $633.90 (varied with hours); 7 credits from 2025-05-16 to 2025-08-08",
"card_use": "72 purchases, all in Mesa and Tempe (groceries, fuel, coffee, pharmacy)",
"reward": "$100 sign-up bonus paid 2025-06-20 (the campaign then); not clawed back (closed after 116 days)",
"closing_activity": "On 2025-08-26 sent her remaining $676.19 by 'send to bank' to an external account entered by routing and account number; that account's numbers match x2290, which this account linked on 2026-08-24 as its own (owner ANDRE CASTILLO)"
},
"linked_account_transactions": {
"note": "Every posted item on x0583 from opening to closing; amounts signed (debits negative)",
"columns": [
"ts",
"type",
"amount_usd",
"balance_usd",
"description",
"detail"
],
"rows": [
[
"2025-05-03T22:22:09Z",
"bank_transfer_in",
50,
50,
"Transfer from bank account x7711",
"external checking at a credit union, owner name DANIELA MORENO verified by account aggregation"
],
[
"2025-05-07T01:14:04Z",
"card_purchase",
-33.4,
16.6,
"WALGREENS #12904 MESA AZ",
"mcc 5912, Google Pay"
],
[
"2025-05-09T17:23:05Z",
"card_purchase",
-8.73,
7.87,
"DUTCH BROS #AZ0219 MESA AZ",
"mcc 5814, Google Pay"
],
[
"2025-05-16T10:01:14Z",
"ach_credit",
412.18,
420.05,
"SONORAN GRILL GRP PAYROLL",
"SEC PPD; company_name SONORAN GRILL G; entry_description PAYROLL; individual_name DANIELA MORENO"
],
[
"2025-05-17T17:48:09Z",
"card_purchase",
-7.35,
412.7,
"DUTCH BROS #AZ0219 MESA AZ",
"mcc 5814, Google Pay"
],
"… 80 more in ambiguous.json"
]
}
},
"reward_history": {
"this_account": "None before this bonus",
"linked": "x0583 received a $100 sign-up bonus on 2025-06-20"
},
"customer_contact": [
{
"ts": "2026-10-05T16:20:11Z",
"channel": "In-app chat",
"account": "x6127",
"summary": "Andre asked when his $150 bonus would arrive: 'Both deposits hit, 9/18 and 10/2, the tracker says done.' The agent said bonuses can take up to 5 business days."
}
],
"rules_fired": [
"DEV-04 device previously used by another customer's account",
"SUB-03 acquired through a deal or affiliate site and over 90% of qualifying deposits moved out within 48 hours",
"SUB-05 linked device's earlier account received a sign-up bonus"
],
"rewards_risk_score": 71,
"reward_under_review": {
"reward": "$150 sign-up bonus",
"promotion": "Fall new-customer bonus, FALL150",
"triggered_by": "DESERT RIDGE COL ACH credit of $500.00 posted 2026-10-02T10:00:52Z, completing $1,000 of qualifying direct deposits (SEC PPD)",
"held_at": "2026-10-02T10:05:00Z",
"reviewed_at": "2026-10-06T16:40:00Z",
"balance_now_usd": 9.69
}
},
"questions": {
"abuse_likelihood": {
"type": "score",
"instructions": "From the promotion owner's point of view, how likely is it that this reward is being claimed through abuse: by someone the terms exclude (an extra account of a person who already has one, a self-referral), or through qualifying activity that was faked, staged or paid for with money that will be reversed? A customer who simply meets the terms, even one who joined mainly for the reward, is not abuse.",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"abuse_pattern": {
"type": "choice",
"instructions": "Which best describes how this reward was earned?",
"criteria": {
"legitimate": "No abuse: an eligible customer earned the reward through genuine qualifying activity",
"multi_accounting": "Multi-accounting: a person who already has or had an account with us opened another, under their own or someone else's identity, to claim a one-per-person reward again",
"referral_ring": "Referral ring: referral rewards collected through referred accounts that the referrer controls or recruited only to collect the reward, however their qualifying activity was produced",
"fake_offer_completion": "Faked qualifying activity outside a referral scheme: sign-up, offer or cash-back rewards earned with completions from bots, emulators or install farms, or with deposits or purchases staged only to trigger the reward and then reversed or moved straight back",
"bonus_bust_out": "Bust-out: rewards collected and the balance cashed out with money that is later returned or charged back, leaving us with a loss",
"other_abuse": "Another kind of abuse of the promotion terms"
}
},
"linked_to_other_accounts": {
"type": "noul",
"instructions": "Is the account under review controlled by the same person as one or more other accounts on our platform? Judge from shared devices, payment and payout methods, addresses, phone numbers, emails and identity details. A shared public or mobile-carrier network, or a family member with their own identity, phone and payment methods, does not make it the same person."
},
"action": {
"type": "choice",
"instructions": "What should we do with the reward under review?",
"criteria": {
"pay": "Pay the reward now",
"hold_for_review": "Keep holding the reward and send the account to an analyst, who may ask the customer for more information or verification, before paying or denying",
"deny": "Deny this reward under the promotion terms and keep the account open",
"deny_and_close": "Deny the reward, claw back other rewards earned the same way, and close the account and the accounts it controls under the account agreement"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_86a61c659d084017b7c560bd89724e74",
"model": "grayson-1",
"answers": {
"abuse_likelihood": {
"type": "score",
"score": 0.751,
"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.5537,
"probabilities": {
"0": 0.643,
"1": 0.1842,
"2": 0.0283,
"3": 0.0678,
"4": 0.0768
}
},
"abuse_pattern": {
"type": "choice",
"choice": "legitimate",
"confidence": 0.8054,
"probabilities": {
"legitimate": 0.8378,
"multi_accounting": 0.0883,
"referral_ring": 0.0034,
"fake_offer_completion": 0.0287,
"bonus_bust_out": 0.005,
"other_abuse": 0.0368
}
},
"linked_to_other_accounts": {
"type": "noul",
"noul": 0.2018
},
"action": {
"type": "choice",
"choice": "pay",
"confidence": 0.8702,
"probabilities": {
"pay": 0.9026,
"hold_for_review": 0.0047,
"deny": 0.0654,
"deny_and_close": 0.0273
}
}
},
"usage": {
"input_tokens": 11330,
"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.
actionroutes the reward: pay or deny automatically when one option clears a high bar, and send the rest to your analysts. In the ambiguous example Grayson favors paying while giving the deny options about 10%; a team that holds whenever the deny options pass a few percent would hold it.abuse_patternpicks the follow-up: a referral ring means reviewing the referrer and every account in its tree, multi-accounting means checking the other accounts of the same person, and a bust-out means checking for returned deposits and chargebacks.linked_to_other_accountsis about the account, not the reward: when it is high, review the linked accounts' rewards too, even ones already paid.
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
Abuse rules key on shared attributes, and so do real households: spouses share an address, Wi-Fi and a surname, and roommates share an IP. A rule strict enough to catch a ring that rotates emulators and prepaid cards also holds every family referral, and a person with a factory-reset phone and a new email passes rules that look only at one attribute at a time. Analysts end up reading the whole account by hand to tell the two apart.
What to send
Send the held reward with what your platform knows about the account and the people around it. The examples send about 10,000 to 11,500 input tokens each.
- The promotion's terms. Who is eligible, what counts as qualifying activity, and the limits, so the answer follows your program's rules.
- Signup checks. Identity verification, email and phone age and type, and the signup session: a two-day-old email, a VoIP phone and fields pasted in seconds describe a farmed account.
- Devices and networks. Emulator, app cloner and root detections, how many accounts each device has opened, and proxy scores. A device reset between owners is common with used phones.
- The qualifying activity and the money afterward. Who sent the "direct deposit" and how many new accounts it paid, and how fast the money left and to where.
- Payout and funding methods across accounts. One prepaid card receiving payouts from a dozen names is the clearest link in a ring.
- The referral tree and linked accounts. The referrer's own history, its other referees and their status, and every account sharing a device, card, bank account, address or phone, with what that link is.
- Earlier rewards and clawbacks, and anything the customer has said.
Add your own policy
Programs differ on who may refer whom and on when to close an account, so put your operating rules in the request and Grayson applies them. This one makes referrals between people at the same address ineligible, without treating them as abuse.
Your household rule adds this to the state of the legitimate example:
{
"rewards_policy": "Referral program operating rule RP-6 (rev. 2026-07): A referral between two people who live at the same residential address is not eligible for either referral reward, even when each has their own identity, phone, device and pay, because the program pays for bringing in new households. Deny both rewards with the standard household notice and keep both accounts open. Don't treat it as abuse, and don't close or restrict either account unless there is other evidence of abuse."
}| Question | Without | With your household rule |
|---|---|---|
abuse_likelihood | 0.02 of 4, confidence 98% | 0.05 of 4, confidence 97% |
abuse_pattern | legitimate, confidence 99% | legitimate, confidence 50% |
linked_to_other_accounts | Under 1% true | 1% true |
action | pay, confidence 99% | deny, confidence 98% |
In the likely legitimate example, Marcus and his wife Megan co-own the home at the shared address, so under this rule the action moves from paying the referral reward to denying it, while the abuse likelihood stays low and the accounts are still judged to belong to two different people. abuse_pattern moves part of its weight to other_abuse, because the rule makes the referral ineligible without making it abuse.
Where to call it
- When a rewards rule holds a payout, before an analyst opens it, so clear cases are paid or denied on the spot.
- Before paying out at scale, for example on every referral reward from a referrer with an unusual number of referrals this month.
- On already-paid rewards when a new link appears, such as a shared payout card, to decide whether to claw back and close.
Cost and latency
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 10,058 | $0.00035 | $0.35 | 185 ms |
| Legitimate | 10,027 | $0.00035 | $0.35 | 182 ms |
| Ambiguous | 11,330 | $0.00040 | $0.40 | 205 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/promotion-abuse-detection/questions.json --label abuse_likelihood=<column> --label abuse_pattern=<column> --label linked_to_other_accounts=<column> --label action=<column>Each --label names the column with that question's right answer:
abuse_likelihood: a level, such as "Very likely (over 90%)"abuse_pattern:legitimate,multi_accounting,referral_ring,fake_offer_completion,bonus_bust_out,other_abuselinked_to_other_accounts:trueorfalseaction:pay,hold_for_review,deny,deny_and_close
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
Is a customer who joins only for the bonus committing abuse?
Not by itself. Someone who opens their first account for a bonus and meets the terms has done what the promotion asked, even if they move the money out afterward. The questions here treat abuse as breaking the terms: an extra account for a person who already has one, a self-referral, or qualifying activity that was staged or will be reversed. If your program also excludes people who open accounts mainly for bonuses, say so in the request, as with the household rule above.
Can Grayson see a whole referral ring from one account?
Only what the state contains. Send the referrer's other referees with their devices, payout methods, deposits and status, and the counts your link analysis already computes, such as how many accounts a payout card or deposit originator serves. With that, one referee's request is enough to judge the ring and to decide to close the accounts it controls.
What should we do when the answer is uncertain?
Keep holding the reward and ask for the one fact that would settle it. In the ambiguous example that is how the customer came to have the phone, and a document and selfie check showing that he isn't the earlier account's owner. Then call Grayson again with the answer in the state.
Related recipes
Detect account opening fraud and synthetic identities
Approve, step up or decline a deposit account application at risk of stolen or synthetic identity fraud.
Review merchant risk alerts on your payments platform
Whether a flagged merchant's activity is real business or fraud, how likely a loss is, and whether to hold payouts
Recipes
Every use case, with its questions and cost per decision.
Merchant risk alerts
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.
Claims and customer contacts
Fraud and scam claims, and the customer calls, chats and emails that report them. Ready-to-run Grayson recipes with real responses, cost and latency.