Screen card authorizations for fraud in real time
Grayson screens card authorizations for card testing, fallback and card-not-present fraud from recent card activity, and picks approve, step up or decline.
Grayson screens a card authorization against the card's recent activity and the cardholder's usual spending, and returns how likely it is to be fraud, whether the card number was just run through card testing, and whether to approve, step up or decline. It can run in parallel with your existing rules and models as an extra signal, and costs about $0.44 to $0.62 per 1,000 decisions.
- Decides: Score card authorizations for fraud and choose approve, step up or decline, next to your existing rules.
- Call it: When a card authorization request arrives
- Questions: 1 score, 1 yes/no, 1 choice
- Cost: $0.00044 to $0.00062 per decision ($0.44 to $0.62 per 1,000) for these examples' 12,661 to 17,676 input tokens
- Latency: 196 to 248 ms for these examples, the median of 5 calls each through api.finic.ai from US-West
Examples
Three authorizations, each sent with 90 to 110 days of the card's earlier authorizations (about 160 to 270 of them, with declines, refunds, reversals and recurring charges), the cardholder's devices and 3-D Secure history, activity at the merchant across the issuer's cards, and the scores and rules that already ran. They are a card number tested at a charity's donation page and then typed into a $749.99 electronics order, a traveler's first in-store purchase in Lisbon, and a $684.97 sneaker resale order from a new computer on a card exposed in a merchant breach.
Open in Playground
A tested card number in a keyed $749.99 electronics purchase. This evening a BIN attack hit a small charity's donation page, and this card number passed a $1.00 test there after two wrong expiration dates. Twenty-one minutes later it was typed into a $749.99 order at an online electronics store with no security code, no 3-D Secure and no address match, along with 16 other cards from the same attack, while the cardholder's own day looks ordinary.
| Question | Grayson's answer |
|---|---|
fraud_likelihood | 3.69 of 4, confidence 86% |
card_tested | 98% true |
action | decline, confidence 54% |
12,661 input tokens, $0.00044 per decision, answered in 198 ms.
The request, with long lists cut short. The full request is fraud.json (47 KB).
{
"model": "grayson-1",
"state": {
"cardholder": {
"account_id": "acct_77310",
"name_on_card": "MELISSA A VARGA",
"product": "Visa Signature rewards credit card",
"card": "x7193, chip and contactless, issued 2025-03-06 (reissue at expiry), expires 2029-03",
"account_open_since": "2019-04-11",
"billing_address": "Columbus, OH 43214, unchanged since 2019",
"phone_on_file": "(614) 555-0148, mobile, last changed 2023-01-15",
"email_on_file": "mvarga@example.net, unchanged since 2019",
"credit_limit_usd": 12000,
"current_balance_usd": 2659.82,
"available_credit_usd": 9340.18,
"payments": "Autopay of the full statement balance from checking x4410; never late",
"alerts": "Enrolled in two-way text alerts (fraud checks texted to the phone on file) since 2021-06-02",
"travel_notice": "None",
"card_status": "Active; no lost or stolen report, no block"
},
"devices": [
{
"device": "iPhone 14, our banking app",
"first_seen": "2023-02-04",
"last_seen": "2026-10-03T12:40:18Z",
"note": "Apple Pay token for this card (x5521) provisioned on it 2024-05-02, active"
},
{
"device": "Windows laptop, Chrome",
"first_seen": "2022-11-19",
"last_seen": "2026-09-09T00:41:19Z",
"note": "Seen only in 3-D Secure, from the cardholder's home connection"
}
],
"account_events_90_days": {
"columns": [
"ts",
"event",
"detail"
],
"rows": [
[
"2026-07-10T23:14:02Z",
"Password reset",
"Banking app on the iPhone 14; code texted to the phone on file"
],
[
"2026-07-15T09:00:00Z",
"Payment",
"Autopay 1,912.44"
],
[
"2026-08-15T09:00:00Z",
"Payment",
"Autopay 2,204.17"
],
[
"2026-08-21T22:29:55Z",
"Fraud text alert",
"VALUE CITY FURNITURE 486.20; reply YES at 22:33:06Z"
],
[
"2026-09-15T09:00:00Z",
"Payment",
"Autopay 1,788.90"
],
[
"2026-10-03T12:40:18Z",
"Banking app login",
"iPhone 14; viewed recent transactions"
]
],
"logins": "Banking app: 71 logins in 90 days, all from the iPhone 14 in the Columbus area. No web logins. No changes to phone, email, address or authorized users."
},
"three_d_secure_history_90_days": {
"columns": [
"ts",
"merchant",
"amount_usd",
"device",
"ip_location",
"ship_to",
"result"
],
"rows": [
[
"2026-07-19T00:35:50Z",
"SOUTHWEST AIRLINES",
286.4,
"Windows laptop, Chrome",
"198.51.100.23, residential cable ISP, Columbus OH",
"n/a",
"Frictionless, ECI 05"
],
[
"2026-08-03T01:04:21Z",
"ETSY.COM",
46.8,
"iPhone 14, Safari",
"Mobile carrier, Columbus OH",
"Billing address",
"Frictionless, ECI 05"
],
[
"2026-09-09T00:37:44Z",
"ULTA.COM",
72.14,
"Windows laptop, Chrome",
"198.51.100.23, residential cable ISP, Columbus OH",
"Billing address",
"Frictionless, ECI 05"
],
[
"2026-09-27T17:02:20Z",
"KOHLS.COM",
63.98,
"iPhone 14, Safari",
"198.51.100.23, residential cable ISP, Columbus OH",
"Store pickup, Columbus OH",
"Frictionless, ECI 05"
]
]
},
"spend_profile_12_months": {
"authorizations": 612,
"card_present_share_pct": 71,
"countries": [
"US"
],
"largest_purchase_usd": 486.2,
"electronics_purchases": "2 in 12 months, both in store with Apple Pay: $54.10 (2026-01) and $129.99 (2026-07)",
"card_not_present_merchants": "Amazon, Chewy, streaming and phone subscriptions, food delivery, Southwest, Etsy, Ulta, Kohl's"
},
"history_summary": {
"window": "2026-07-05 to 2026-10-03T22:08Z",
"authorization_requests": 158,
"approved_purchases": 150,
"approved_purchase_total_usd": 9292.79,
"card_present_share_pct": 78,
"median_purchase_usd": 50.28,
"p95_purchase_usd": 140.68,
"largest_purchase_usd": 486.2,
"declines": {
"05 do not honor": 1,
"N7 CVV2 mismatch": 1,
"54 expired card (expiration date does not match)": 2
},
"refunds": 3,
"merchant_countries": [
"US"
]
},
"legend": {
"entry": {
"05 chip": "POS entry mode 05: chip read, cryptogram verified",
"07 contactless": "07: contactless with the physical card",
"07 Apple Pay": "07: contactless with the Apple Pay token on the cardholder's phone",
"10 card on file": "10: credential stored at the merchant, purchase started by the cardholder",
"10 recurring": "10: merchant-initiated recurring charge on a stored credential",
"81 keyed e-commerce": "81: card number typed at an online checkout"
},
"checks": "ECI 05 = authenticated with 3-D Secure, ECI 07 = not authenticated; AVS Y = street and ZIP match, Z = ZIP only, N = no match; CVV2 M = match, N = no match",
"amount_usd": "Authorized amount; negative for refunds. Fuel pumps authorize an estimate first (note shows the completed amount).",
"mcc": {
"3066": "Southwest Airlines",
"4111": "Commuter transport",
"4121": "Taxis and rideshare",
"4814": "Telecommunication services",
"4899": "Cable, streaming and pay TV",
"5200": "Home supply warehouse stores",
"5310": "Discount stores",
"5311": "Department stores",
"5411": "Grocery stores",
"5542": "Automated fuel dispensers",
"5651": "Family clothing stores",
"5712": "Furniture stores",
"5732": "Electronics stores",
"5812": "Restaurants",
"5813": "Bars and taverns",
"5814": "Fast food",
"5815": "Digital media: music",
"5818": "Digital goods: large merchants",
"5912": "Drug stores",
"5942": "Book stores (incl. Amazon)",
"5977": "Cosmetic stores",
"5994": "News dealers",
"5995": "Pet shops and pet supplies",
"5999": "Miscellaneous retail",
"7011": "Hotels and lodging",
"7991": "Tourist attractions",
"7997": "Clubs and gyms",
"8398": "Charitable organizations",
"0742": "Veterinary services"
}
},
"authorization_history": {
"columns": [
"ts",
"merchant",
"mcc",
"country",
"amount_usd",
"… 4 more in fraud.json"
],
"rows": [
[
"2026-07-05T11:24:39Z",
"STARBUCKS STORE 08812 COLUMBUS OH",
"5814",
"US",
9.52,
"… 4 more in fraud.json"
],
[
"2026-07-05T23:34:26Z",
"SQ *NORTHSTAR NOODLE BAR COLUMBUS OH",
"5812",
"US",
72.97,
"… 4 more in fraud.json"
],
[
"2026-07-06T17:06:06Z",
"PANERA BREAD #601127 COLUMBUS OH",
"5814",
"US",
15.39,
"… 4 more in fraud.json"
],
[
"2026-07-08T18:33:49Z",
"SHELL OIL 57444012 COLUMBUS OH",
"5542",
"US",
175,
"… 4 more in fraud.json"
],
[
"2026-07-09T11:46:53Z",
"STARBUCKS STORE 08812 COLUMBUS OH",
"5814",
"US",
4.35,
"… 4 more in fraud.json"
],
"… 153 more in fraud.json"
]
},
"merchant_activity_on_our_cards": {
"GIVE*LANTERN HILL MISSION": {
"what_it_is": "Donation page of a small charity, through a payment facilitator; MCC 8398",
"first_seen_on_our_cards": "2025-11-02",
"usual_volume": "About 3 authorizations a day on our cards, $10 to $100",
"window": "2026-10-03T21:00:00Z to 22:08:00Z",
"authorization_attempts": 1840,
"distinct_card_numbers": 1712,
"amounts": "All $1.00",
"approved": 110,
"declines": {
"14 invalid card number": 1018,
"54 expiration date does not match": 545,
"05 do not honor": 167
},
"entry": "All keyed e-commerce, ECI 07, no AVS data, no CVV2",
"pattern": "Card numbers on this card's BIN in runs that differ only in the last 4 to 6 digits, 2 to 8 seconds apart; many numbers tried with 2 or 3 expiration dates before an approval",
"approved_cards_seen_since": "23 of the 110 approved card numbers have had card-not-present attempts at other merchants since 21:30Z, 16 of them at ARDENTCIRCUIT.COM"
},
"ARDENTCIRCUIT.COM": {
"what_it_is": "Ardent Circuit Supply, online electronics retailer; MCC 5732",
"first_seen_on_our_cards": "2021-08-14",
"last_30_days": {
"authorizations": 412,
"approved_pct": 93,
"median_amount_usd": 189.99
},
"confirmed_fraud_90_days": "0.6% of approved dollars (our e-commerce average is 0.4%)",
"three_d_secure": "Requests 3-D Secure on about 30% of our cards' purchases",
"last_60_minutes": "19 keyed authorizations on our cards (usually 1 to 3 an hour), $599.99 to $899.99; 16 on cards with a $1.00 approval at GIVE*LANTERN HILL MISSION since 21:00Z; none with 3-D Secure; 15 with AVS no match; 11 approved, 8 declined"
}
},
"authorization_under_review": {
"ts": "2026-10-03T22:08:31Z",
"merchant": "ARDENTCIRCUIT.COM 888-555-0142 NJ",
"merchant_category": "5732 Electronics stores",
"merchant_country": "US",
"amount_usd": 749.99,
"transaction": "Purchase",
"channel": "E-commerce",
"entry": "81 keyed e-commerce: card number typed at checkout (not a stored credential or wallet token)",
"expiration_date": "Matches",
"eci": "07 (e-commerce, not authenticated)",
"three_d_secure": "No authentication request from the merchant for this purchase",
"avs": "N: no match on street address or ZIP",
"cvv2": "Not provided by the merchant",
"first_purchase_at_merchant": true,
"available_credit_after_usd": 8590.19,
"scores": {
"network_risk_score": "41 (1 to 99, higher is riskier)",
"our_fraud_model": "538 (0 to 999; our strategy steps up at 700 and declines at 850)",
"our_model_reasons": [
"Keyed card-not-present entry",
"First purchase at merchant",
"Amount above the card's 95th percentile"
]
},
"rules_fired": "None"
}
},
"questions": {
"fraud_likelihood": {
"type": "score",
"instructions": "How likely is it that the authorization under review is fraudulent, meaning the cardholder didn't make it?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"card_tested": {
"type": "noul",
"instructions": "Was this card number checked by card testing before the authorization under review? Card testing means small or zero-amount authorizations, often at an unrelated merchant and often with failed attempts, used to confirm that a stolen or generated card number works."
},
"action": {
"type": "choice",
"instructions": "What should happen to the authorization under review?",
"criteria": {
"approve": "Approve the authorization",
"step_up": "Step up: confirm with the cardholder first (a 3-D Secure challenge, or a one-time code or text alert to the phone on file) and approve only if they confirm",
"decline": "Decline the authorization and block the card for reissue"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_28e9541846234b96b2b03f10c1ba2d01",
"model": "grayson-1",
"answers": {
"fraud_likelihood": {
"type": "score",
"score": 3.688,
"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.8576,
"probabilities": {
"0": 0.05,
"1": 0.0184,
"2": 0.0112,
"3": 0.0344,
"4": 0.8861
}
},
"card_tested": {
"type": "noul",
"noul": 0.9841
},
"action": {
"type": "choice",
"choice": "decline",
"confidence": 0.5387,
"probabilities": {
"approve": 0.0827,
"step_up": 0.2248,
"decline": 0.6925
}
}
},
"usage": {
"input_tokens": 12661,
"output_tokens": 0
}
}Open in Playground
A traveler's first in-store purchase abroad, hours after landing in Lisbon. The cardholder bought a Boston to Lisbon ticket on this card in July and paid a Lisbon hotel deposit in August, used the card at Boston Logan last night and took an Uber this morning. Her first in-store purchase abroad, a chip read at a tile shop, tripped our first-foreign-purchase rule and scored above our step-up line, but the chip cryptogram checks out and her own iPhone logged in from Lisbon two hours earlier.
| Question | Grayson's answer |
|---|---|
fraud_likelihood | 0.08 of 4, confidence 95% |
card_tested | 3% true |
action | approve, confidence 94% |
17,676 input tokens, $0.00062 per decision, answered in 248 ms.
The request, with long lists cut short. The full request is legitimate.json (69 KB).
{
"model": "grayson-1",
"state": {
"cardholder": {
"account_id": "acct_40862",
"name_on_card": "ELENA R MARSH",
"product": "Visa Signature travel rewards credit card (no foreign transaction fee)",
"card": "x4418, chip and contactless, no PIN set, issued 2024-09-12 (reissue at expiry), expires 2028-09",
"account_open_since": "2017-09-22",
"billing_address": "Somerville, MA 02144, unchanged since 2020-06",
"phone_on_file": "(617) 555-0172, mobile, unchanged since 2017",
"email_on_file": "elena.marsh@example.com, unchanged since 2017",
"credit_limit_usd": 18000,
"current_balance_usd": 3412.66,
"available_credit_usd": 14587.34,
"payments": "Autopay of the full statement balance from an external checking account; never late",
"alerts": "Enrolled in two-way text alerts since 2020-03-11",
"travel_notice": "None (optional in our app)",
"card_status": "Active; no lost or stolen report, no block"
},
"devices": [
{
"device": "iPhone 15, our banking app",
"first_seen": "2023-10-01",
"last_seen": "2026-10-04T09:31:07Z",
"note": "Apple Pay token for this card (x8830) provisioned on it 2023-10-01, active; app location sharing off"
},
{
"device": "MacBook, Safari",
"first_seen": "2021-03-14",
"last_seen": "2026-09-25T01:40:11Z",
"note": "Seen in 3-D Secure and web banking from the cardholder's home connection"
},
{
"device": "Windows PC, Edge",
"first_seen": "2026-09-21",
"last_seen": "2026-09-21T14:05:52Z",
"note": "One web banking login; passed a one-time code to the phone on file"
}
],
"account_events_90_days": {
"columns": [
"ts",
"event",
"detail"
],
"rows": [
[
"2026-06-25T09:00:00Z",
"Payment",
"Autopay 2,906.12"
],
[
"2026-07-25T09:00:00Z",
"Payment",
"Autopay 3,388.40"
],
[
"2026-08-25T09:00:00Z",
"Payment",
"Autopay 4,212.57"
],
[
"2026-09-21T14:05:52Z",
"Web banking login, new device",
"Windows PC, Edge; IP 203.0.113.18, corporate network, Cambridge MA; one-time code to the phone on file passed; viewed statements"
],
[
"2026-09-25T09:00:00Z",
"Payment",
"Autopay 2,741.09"
],
[
"2026-10-03T19:02:44Z",
"Banking app login",
"iPhone 15, mobile carrier, Boston MA; viewed balance"
],
[
"2026-10-04T09:31:07Z",
"Banking app login",
"iPhone 15; IP 192.0.2.144, Portuguese ISP, Lisbon (hotel or public Wi-Fi); viewed recent transactions and rewards"
]
],
"logins": "Banking app: 96 logins in 90 days, all from the iPhone 15. Web: 6 from the MacBook, 1 from the Windows PC above. No changes to phone, email, address or authorized users."
},
"three_d_secure_history_90_days": {
"columns": [
"ts",
"merchant",
"amount_usd",
"device",
"ip_location",
"ship_to",
"result"
],
"rows": [
[
"2026-07-11T00:02:20Z",
"BOOKSHOP.ORG",
41.52,
"MacBook, Safari",
"198.51.100.77, residential fiber ISP, Somerville MA",
"Billing address",
"Frictionless, ECI 05"
],
[
"2026-07-30T01:12:02Z",
"TAP AIR PORTUGAL",
1186.4,
"MacBook, Safari",
"198.51.100.77, residential fiber ISP, Somerville MA",
"n/a",
"Challenge: approved in our banking app on the iPhone 15, ECI 05"
],
[
"2026-08-03T23:47:40Z",
"HOTEL MIRADOURO DA GRACA",
214.27,
"MacBook, Safari",
"198.51.100.77, residential fiber ISP, Somerville MA",
"n/a",
"Frictionless, ECI 05"
],
[
"2026-09-02T16:30:51Z",
"UNIQLO USA ONLINE",
118.6,
"iPhone 15, Safari",
"Mobile carrier, Boston MA",
"Billing address",
"Frictionless, ECI 05"
],
[
"2026-09-25T01:39:58Z",
"REI.COM",
164.89,
"MacBook, Safari",
"198.51.100.77, residential fiber ISP, Somerville MA",
"Billing address",
"Frictionless, ECI 05"
]
]
},
"spend_profile_12_months": {
"authorizations": 1034,
"card_present_share_pct": 74,
"card_present_countries": [
"US"
],
"card_not_present_merchant_countries": [
"US",
"PT",
"NL"
],
"largest_purchase_usd": 1186.4,
"travel": "Domestic trips by Zipcar and air (Portland ME 2026-07, Chicago 2026-02); no card-present use outside the US"
},
"history_summary": {
"window": "2026-06-16 to 2026-10-04T11:42Z",
"authorization_requests": 265,
"approved_purchases": 260,
"approved_purchase_total_usd": 9990.65,
"card_present_share_pct": 80,
"median_purchase_usd": 13.09,
"p95_purchase_usd": 139,
"largest_purchase_usd": 1186.4,
"declines": {
"N7 CVV2 mismatch": 1
},
"refunds": 2,
"merchant_countries": [
"NL",
"PT",
"US"
]
},
"legend": {
"entry": {
"05 chip": "POS entry mode 05: chip read, cryptogram verified",
"07 contactless": "07: contactless with the physical card",
"07 Apple Pay": "07: contactless with the Apple Pay token on the cardholder's phone",
"10 card on file": "10: credential stored at the merchant, purchase started by the cardholder",
"10 recurring": "10: merchant-initiated recurring charge on a stored credential",
"81 keyed e-commerce": "81: card number typed at an online checkout"
},
"checks": "ECI 05 = authenticated with 3-D Secure, ECI 07 = not authenticated; AVS Y = street and ZIP match, Z = ZIP only, N = no match; CVV2 M = match, N = no match",
"amount_usd": "Authorized amount; negative for refunds. Fuel pumps authorize an estimate first (note shows the completed amount).",
"mcc": {
"4111": "Commuter transport",
"4121": "Taxis and rideshare",
"4511": "Airlines",
"4814": "Telecommunication services",
"4899": "Cable, streaming and pay TV",
"5310": "Discount stores",
"5411": "Grocery stores",
"5541": "Service stations",
"5651": "Family clothing stores",
"5812": "Restaurants",
"5813": "Bars and taverns",
"5814": "Fast food",
"5815": "Digital media: music",
"5818": "Digital goods: large merchants",
"5912": "Drug stores",
"5941": "Sporting goods",
"5942": "Book stores (incl. Amazon)",
"5968": "Subscription merchants",
"5994": "News dealers",
"7011": "Hotels and lodging",
"7512": "Car rental",
"7997": "Clubs and gyms"
}
},
"authorization_history": {
"columns": [
"ts",
"merchant",
"mcc",
"country",
"amount_usd",
"… 4 more in legitimate.json"
],
"rows": [
[
"2026-06-16T12:07:23Z",
"MBTA FARE BOSTON MA",
"4111",
"US",
2.4,
"… 4 more in legitimate.json"
],
[
"2026-06-16T13:34:28Z",
"TST* KENDALL COMMON CAFE CAMBRIDGE MA",
"5814",
"US",
7.9,
"… 4 more in legitimate.json"
],
[
"2026-06-16T17:21:05Z",
"CAVA KENDALL SQ CAMBRIDGE MA",
"5814",
"US",
14.6,
"… 4 more in legitimate.json"
],
[
"2026-06-17T13:30:16Z",
"TST* UNION SQ ROASTERY SOMERVILLE MA",
"5814",
"US",
9.08,
"… 4 more in legitimate.json"
],
[
"2026-06-17T22:30:07Z",
"CVS/PHARMACY #00412 SOMERVILLE MA",
"5912",
"US",
43.49,
"… 4 more in legitimate.json"
],
"… 260 more in legitimate.json"
]
},
"merchant_activity_on_our_cards": {
"CASA DOS AZULEJOS CHIADO": {
"what_it_is": "Ceramics and tile shop in Lisbon's Chiado district; MCC 5719",
"first_seen_on_our_cards": "2023-04-18",
"last_90_days": "37 authorizations on our cards, all card present (chip or contactless), median EUR 64.50, largest EUR 610.00",
"confirmed_fraud_on_our_cards": "None"
},
"our_cards_card_present_in_portugal_last_30_days": "1,214 authorizations; 0.08% confirmed fraud"
},
"authorization_under_review": {
"ts": "2026-10-04T11:42:16Z",
"merchant": "CASA DOS AZULEJOS CHIADO LISBOA PRT",
"merchant_category": "5719 Home furnishing specialty stores",
"merchant_country": "PT",
"amount": "EUR 389.00",
"amount_usd": 455.13,
"transaction": "Purchase",
"channel": "Card present, attended terminal",
"entry": "05 chip; application cryptogram (ARQC) verified",
"cardholder_verification": "Signature (no PIN on this card)",
"first_purchase_at_merchant": true,
"first_card_present_authorization_outside_the_us_on_this_card": true,
"available_credit_after_usd": 14132.21,
"scores": {
"network_risk_score": "62 (1 to 99, higher is riskier)",
"our_fraud_model": "712 (0 to 999; our strategy steps up at 700 and declines at 850)",
"our_model_reasons": [
"First card-present country",
"Amount above the card's 95th percentile",
"First purchase at merchant"
]
},
"rules_fired": [
{
"rule": "R-310 First card-present authorization outside the US on this card, over $250",
"action": "Decline unless our model scores under 700"
}
]
}
},
"questions": {
"fraud_likelihood": {
"type": "score",
"instructions": "How likely is it that the authorization under review is fraudulent, meaning the cardholder didn't make it?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"card_tested": {
"type": "noul",
"instructions": "Was this card number checked by card testing before the authorization under review? Card testing means small or zero-amount authorizations, often at an unrelated merchant and often with failed attempts, used to confirm that a stolen or generated card number works."
},
"action": {
"type": "choice",
"instructions": "What should happen to the authorization under review?",
"criteria": {
"approve": "Approve the authorization",
"step_up": "Step up: confirm with the cardholder first (a 3-D Secure challenge, or a one-time code or text alert to the phone on file) and approve only if they confirm",
"decline": "Decline the authorization and block the card for reissue"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_8523c05e07804688ba036da14d74c374",
"model": "grayson-1",
"answers": {
"fraud_likelihood": {
"type": "score",
"score": 0.076,
"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.9475,
"probabilities": {
"0": 0.958,
"1": 0.0255,
"2": 0.005,
"3": 0.005,
"4": 0.0065
}
},
"card_tested": {
"type": "noul",
"noul": 0.0293
},
"action": {
"type": "choice",
"choice": "approve",
"confidence": 0.943,
"probabilities": {
"approve": 0.962,
"step_up": 0.0329,
"decline": 0.005
}
}
},
"usage": {
"input_tokens": 17676,
"output_tokens": 0
}
}Open in Playground
A $684.97 sneaker resale order from a new computer on a card exposed in a breach. Three weeks ago this card was in a merchant breach that exposed its security code, billing address, email and phone. Tonight it was typed into a $684.97 order at a sneaker resale site from a computer we've never seen, with a new email, shipping to a private mailbox in Mesa. But the order came from a Mesa home connection (which our IP vendor rates a possible proxy) two and a half hours after the cardholder's Apple Pay paid for dinner in Mesa, and they buy sneakers and shop late at night.
| Question | Grayson's answer |
|---|---|
fraud_likelihood | 2.60 of 4, confidence 16% (Very unlikely 12%, Unlikely 14%, Uncertain 9%, Likely 33%, Very likely 33%) |
card_tested | 13% true |
action | step_up, confidence 63% |
12,871 input tokens, $0.00045 per decision, answered in 196 ms.
The request, with long lists cut short. The full request is ambiguous.json (49 KB).
{
"model": "grayson-1",
"state": {
"cardholder": {
"account_id": "acct_58217",
"name_on_card": "JORDAN T ELLERY",
"product": "Mastercard cash-back credit card",
"card": "x2056, chip and contactless, issued 2026-06-03 (reissue at expiry), expires 2031-06",
"account_open_since": "2021-06-18",
"billing_address": "Chandler, AZ 85225, unchanged since 2023-08",
"phone_on_file": "(480) 555-0116, mobile, unchanged since 2021",
"email_on_file": "jordan.ellery@example.com, unchanged since 2021",
"credit_limit_usd": 6500,
"current_balance_usd": 2587.41,
"available_credit_usd": 3912.59,
"payments": "Pays $600 to $700 a month by transfer from a checking account at another bank; carries a balance; never late",
"alerts": "Enrolled in two-way text alerts since 2021-06-18",
"travel_notice": "None",
"card_status": "Active; on our compromised-card watch list since 2026-09-16 (see compromise_alerts)"
},
"devices": [
{
"device": "iPhone 13, our banking app",
"first_seen": "2022-11-05",
"last_seen": "2026-10-09T19:10:22Z",
"note": "Apple Pay token for this card (x6610) provisioned on it 2026-06-07, active"
}
],
"account_events_90_days": {
"columns": [
"ts",
"event",
"detail"
],
"rows": [
[
"2026-07-24T16:20:11Z",
"Payment",
"650.00 by transfer"
],
[
"2026-08-24T15:02:40Z",
"Payment",
"600.00 by transfer"
],
[
"2026-09-16T13:00:00Z",
"Compromise alert received",
"Card added to watch list; see compromise_alerts"
],
[
"2026-09-24T17:45:09Z",
"Payment",
"700.00 by transfer"
],
[
"2026-10-09T19:10:22Z",
"Banking app login",
"iPhone 13, mobile carrier, Phoenix metro; viewed recent transactions"
]
],
"logins": "Banking app: 118 logins in 90 days, all from the iPhone 13, mostly in the Phoenix metro. No web logins. No changes to phone, email, address or authorized users."
},
"compromise_alerts": [
{
"received": "2026-09-16",
"source": "Card network compromised-account alert",
"event": "Data compromise at an e-commerce merchant (checkout-page skimmer); merchant not named",
"exposure_window": "2026-07-28 to 2026-09-02",
"data_exposed": [
"Card number",
"Expiration date",
"CVV2",
"Billing name and address",
"Email and phone entered at checkout"
],
"our_cards_in_alert": 3140,
"confirmed_fraud_since_alert": "47 cards (1.5%), mostly card-not-present: electronics, sneakers and gift cards",
"our_action": "Watch list (medium risk tier); not reissued; cardholder not contacted"
}
],
"three_d_secure_history_90_days": {
"columns": [
"ts",
"merchant",
"amount_usd",
"device",
"ip_location",
"ship_to",
"result"
],
"rows": [
[
"2026-08-13T04:26:51Z",
"NIKE.COM",
142.36,
"iPhone 13, Safari",
"198.51.100.140, residential cable ISP, Chandler AZ",
"Billing address",
"Frictionless, ECI 05"
],
[
"2026-09-14T05:03:58Z",
"TICKETMASTER",
168.4,
"iPhone 13, Safari",
"Mobile carrier, Phoenix metro",
"n/a (mobile tickets)",
"Frictionless, ECI 05"
],
[
"2026-09-29T06:36:31Z",
"GAMESTOP.COM",
64.79,
"iPhone 13, Safari",
"198.51.100.140, residential cable ISP, Chandler AZ",
"Billing address",
"Frictionless, ECI 05"
]
]
},
"spend_profile_12_months": {
"authorizations": 846,
"card_present_share_pct": 62,
"countries": [
"US"
],
"largest_purchase_usd": 420.6,
"sneaker_and_apparel": "NIKE.COM (2 orders, one returned), FOOT LOCKER in store; no resale sites",
"late_night": "About 1 in 6 authorizations is between 21:00 and 01:00 local, mostly games and food delivery",
"frequent_locations": "Chandler (home); Mesa and Tempe on many Friday and Saturday evenings"
},
"history_summary": {
"window": "2026-07-11 to 2026-10-10T05:51Z",
"authorization_requests": 167,
"approved_purchases": 163,
"approved_purchase_total_usd": 6424.84,
"card_present_share_pct": 72,
"median_purchase_usd": 29.99,
"p95_purchase_usd": 94.91,
"largest_purchase_usd": 420.6,
"declines": {
"54 expired card": 1,
"N7 CVV2 mismatch": 1
},
"refunds": 1,
"merchant_countries": [
"US"
]
},
"legend": {
"entry": {
"05 chip": "POS entry mode 05: chip read, cryptogram verified",
"07 contactless": "07: contactless with the physical card",
"07 Apple Pay": "07: contactless with the Apple Pay token on the cardholder's phone",
"10 card on file": "10: credential stored at the merchant, purchase started by the cardholder",
"10 recurring": "10: merchant-initiated recurring charge on a stored credential",
"81 keyed e-commerce": "81: card number typed at an online checkout"
},
"checks": "ECI 05 = authenticated with 3-D Secure, ECI 07 = not authenticated; AVS Y = street and ZIP match, Z = ZIP only, N = no match; CVV2 M = match, N = no match",
"amount_usd": "Authorized amount; negative for refunds. Fuel pumps authorize an estimate first (note shows the completed amount).",
"mcc": {
"4814": "Telecommunication services",
"4899": "Cable, streaming and pay TV",
"5310": "Discount stores",
"5411": "Grocery stores",
"5542": "Automated fuel dispensers",
"5651": "Family clothing stores",
"5661": "Shoe stores",
"5732": "Electronics stores",
"5812": "Restaurants",
"5813": "Bars and taverns",
"5814": "Fast food",
"5815": "Digital media: music",
"5816": "Digital games",
"5818": "Digital goods: large merchants",
"5912": "Drug stores",
"5942": "Book stores (incl. Amazon)",
"7832": "Movie theaters",
"7922": "Ticket agencies",
"7997": "Clubs and gyms"
}
},
"authorization_history": {
"columns": [
"ts",
"merchant",
"mcc",
"country",
"amount_usd",
"… 4 more in ambiguous.json"
],
"rows": [
[
"2026-07-11T14:24:23Z",
"MICROSOFT*XBOX GAME PASS MSBILL.INFO WA",
"5818",
"US",
18.31,
"… 4 more in ambiguous.json"
],
[
"2026-07-12T20:15:04Z",
"IN-N-OUT CHANDLER #212 CHANDLER AZ",
"5814",
"US",
19.85,
"… 4 more in ambiguous.json"
],
[
"2026-07-13T07:36:01Z",
"MICROSOFT*STORE MSBILL.INFO WA",
"5818",
"US",
10.77,
"… 4 more in ambiguous.json"
],
[
"2026-07-14T13:00:27Z",
"T-MOBILE*AUTO PAY BELLEVUE WA",
"4814",
"US",
95,
"… 4 more in ambiguous.json"
],
[
"2026-07-14T15:33:18Z",
"DUTCH BROS #AZ0123 CHANDLER AZ",
"5814",
"US",
12.14,
"… 4 more in ambiguous.json"
],
"… 162 more in ambiguous.json"
]
},
"merchant_activity_on_our_cards": {
"LACEWELL EXCHANGE": {
"what_it_is": "Online sneaker and streetwear resale marketplace; MCC 5661",
"first_seen_on_our_cards": "2025-03-11",
"last_30_days": {
"authorizations": 188,
"approved_pct": 91,
"median_amount_usd": 246
},
"confirmed_fraud_90_days": "2.4% of approved dollars (our e-commerce average is 0.4%)",
"three_d_secure": "Sends data-only 3-D Secure requests on almost every purchase; never asks for authentication",
"cards_from_the_same_compromise_alert": "6 of our cards in the 2026-09-16 alert have bought here since the alert: 1 confirmed fraud, 2 confirmed genuine by the cardholder, 3 with no report"
}
},
"authorization_under_review": {
"ts": "2026-10-10T05:51:12Z",
"merchant": "LACEWELL EXCHANGE 702-555-0137 NV",
"merchant_category": "5661 Shoe stores",
"merchant_country": "US",
"amount_usd": 684.97,
"transaction": "Purchase",
"channel": "E-commerce",
"entry": "81 keyed e-commerce: card number typed at checkout",
"expiration_date": "Matches",
"eci": "07 (not authenticated; the merchant sent a data-only 3-D Secure request)",
"avs": "Y: street address and ZIP match",
"cvv2": "M: match",
"first_purchase_at_merchant": true,
"three_d_secure_data_only_request": {
"ts": "2026-10-10T05:51:04Z",
"device": "Windows 11 desktop, Chrome 129, screen 1920x1080, language en-US, browser time zone UTC-07:00",
"device_seen_before_on_this_card": false,
"ip": "203.0.113.47, residential cable ISP, Mesa AZ (about 14 miles from the billing address); not seen before on our cards",
"ip_reputation": "Not a VPN or hosting range; our IP vendor rates it a possible residential proxy exit (medium confidence)",
"ship_to": "Mesa, AZ 85203, name J ELLERY; not the billing address; first use at this merchant",
"ship_to_address_check": "Deliverable; a private mailbox at a mail and shipping store (USPS commercial mail receiving agency flag); not seen before on our cards",
"merchant_account": "Created during this checkout; card added during this checkout",
"email_entered": "A free-mail address that is not the email on file and doesn't contain the cardholder's name; not seen before on our cards",
"phone_entered": "Matches the phone on file"
},
"available_credit_after_usd": 3227.62,
"scores": {
"network_risk_score": "512 (0 to 999, higher is riskier)",
"our_fraud_model": "664 (0 to 999; our strategy steps up at 700 and declines at 850)",
"our_model_reasons": [
"Card on compromise watch list",
"New device",
"Ship-to differs from billing",
"Amount above 12-month largest purchase"
]
},
"rules_fired": [
{
"rule": "R-412 Card on compromise watch list, card-not-present over $500",
"action": "Flag for review"
}
]
}
},
"questions": {
"fraud_likelihood": {
"type": "score",
"instructions": "How likely is it that the authorization under review is fraudulent, meaning the cardholder didn't make it?",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"card_tested": {
"type": "noul",
"instructions": "Was this card number checked by card testing before the authorization under review? Card testing means small or zero-amount authorizations, often at an unrelated merchant and often with failed attempts, used to confirm that a stolen or generated card number works."
},
"action": {
"type": "choice",
"instructions": "What should happen to the authorization under review?",
"criteria": {
"approve": "Approve the authorization",
"step_up": "Step up: confirm with the cardholder first (a 3-D Secure challenge, or a one-time code or text alert to the phone on file) and approve only if they confirm",
"decline": "Decline the authorization and block the card for reissue"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_0c6cddc0e871424cab6e86d31ef62db1",
"model": "grayson-1",
"answers": {
"fraud_likelihood": {
"type": "score",
"score": 2.602,
"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.157,
"probabilities": {
"0": 0.1198,
"1": 0.1357,
"2": 0.0933,
"3": 0.3256,
"4": 0.3256
}
},
"card_tested": {
"type": "noul",
"noul": 0.133
},
"action": {
"type": "choice",
"choice": "step_up",
"confidence": 0.6319,
"probabilities": {
"approve": 0.0547,
"step_up": 0.7546,
"decline": 0.1908
}
}
},
"usage": {
"input_tokens": 12871,
"output_tokens": 0
}
}A yes/no answer is Grayson's probability that it's true. A choice answer is the top option and Grayson's confidence: 0% when every option is equally likely, 100% when one option has all the probability. A score answer is the expected level, numbering the levels in its criteria from 0, with its confidence measured the same way and, when no level reaches 70%, each level's probability. A multiple-choice answer lists the options at 50% or more.
actionis the recommendation. Start by combining it with your existing decision, for example stepping up when your rules approve but Grayson favors decline.fraud_likelihood: threshold the sum of "Likely" and "Very likely", with separate cutoffs for card-present, card-not-present and cross-border authorizations.card_testedis about the card: a number that passed a test is compromised even if this purchase is declined, so block and reissue it.
Call it from your code
Save an example as request.json, such as fraud.json, and send it with your API key in GRAYSON_API_KEY:
curl https://api.finic.ai/v1/decide \
-H "Authorization: Bearer $GRAYSON_API_KEY" \
-H "Content-Type: application/json" \
--data @request.jsonThe problem
Rules check fixed conditions, so they miss a $749.99 purchase that follows a $1 test at a charity page when no single threshold is crossed, and they decline a traveling cardholder's first foreign purchase. The difference is in the context: what the card did in the last hour, activity at the same merchant across your cards, and how the cardholder usually pays.
What to send
Send the authorization with the card's history and what your systems already know about the card. The examples send 160 to 270 earlier authorizations each, in about 13,000 to 18,000 input tokens.
- 60 to 120 days of authorizations, including declines, refunds and reversals. $0 or $1 tests minutes before a larger purchase are card testing; the rest shows how, where and when the cardholder pays.
- Activity at the same merchant across your cards. A burst of declines on sequential numbers from one BIN is a BIN attack.
- How the card was read. A fallback read on a chip card that has never needed one is a classic counterfeit signal.
- Card-not-present checks and device data. 3-D Secure authentication, especially after a challenge, is strong evidence of the cardholder. A data-only request still gives you the device, IP address and ship-to.
- Account changes, devices and compromise alerts. A card in a breach alert makes a matching security code and address worth much less.
- Usual pattern and recent locations. These separate impossible travel from a cardholder who is simply traveling.
- Your existing scores and rule results. Grayson weighs them with the rest of the state.
Add your own policy
Whether to decline or step up trades fraud losses against false declines, so put your strategy in the request and Grayson applies it. This one gives cardholders enrolled in two-way text alerts a confirmation text instead of a hard decline on card-not-present authorizations under $1,000.
Your step-up policy adds this to the state of the obvious example:
{
"authorization_strategy": "Card-not-present authorization strategy (rev. 2026-08). 1) We never hard-decline a card-not-present authorization under $1,000 for suspected fraud when the cardholder is enrolled in two-way text alerts, whatever the fraud scores, rules or evidence. Step up instead: decline this attempt with a response that asks the cardholder to contact us, and text them at the phone on file. If they reply YES within 15 minutes, approve the merchant's retry. If they reply NO or don't reply, block the card and reissue it. 2) Hard-decline and block without a text only when the amount is $1,000 or more, the card is already blocked, or the cardholder has already reported the card lost or stolen."
}| Question | Without | With your step-up policy |
|---|---|---|
fraud_likelihood | 3.69 of 4, confidence 86% | 3.70 of 4, confidence 87% |
card_tested | 98% true | 99% true |
action | decline, confidence 54% | step_up, confidence 86% |
In the obvious-fraud example, the cardholder is enrolled in two-way text alerts and the keyed $749.99 purchase is under $1,000, so the action moves from decline to step-up, while the fraud likelihood and card testing answers stay the same.
Where to call it
- In parallel, with a timeout: run it alongside your rules and model, and fall back to your existing decision if the answer isn't back.
- Where it adds the most: card-not-present, fallback, cross-border and first-time-merchant authorizations, or your rules' borderline cases.
- At 3-D Secure authentication, if you control the risk decision there: a likely-fraud answer becomes a challenge.
Cost and latency
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 12,661 | $0.00044 | $0.44 | 198 ms |
| Legitimate | 17,676 | $0.00062 | $0.62 | 248 ms |
| Ambiguous | 12,871 | $0.00045 | $0.45 | 196 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/card-authorization-fraud/questions.json --label fraud_likelihood=<column> --label card_tested=<column> --label action=<column>Each --label names the column with that question's right answer:
fraud_likelihood: a level, such as "Very likely (over 90%)"card_tested:trueorfalseaction:approve,step_up,decline
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 Grayson fast enough for authorization?
Call Grayson in parallel with your existing checks so its time overlaps with theirs, set a timeout that fits your authorization budget, and use your existing decision when the answer doesn't arrive in time. If the budget is too tight to screen every authorization, call it where it adds the most, such as card-not-present and fallback authorizations, or at 3-D Secure authentication.
Can it detect card testing across many cards, not just one?
Grayson reads one state per request, so compute merchant-level counts in your stream processing (attempts, distinct card numbers, decline rate and reasons, numbers running in sequence on your BIN) and add them to each authorization's state, as in the examples. You can also send a merchant's recent authorizations on your cards as the state and ask directly whether the merchant is being used for card testing.
Do AVS and CVV2 matches mean the cardholder is making the purchase?
No. Card details stolen through phishing and checkout-page skimmers usually include the billing address and security code, so these checks tell you most when they fail. 3-D Secure authentication with a challenge to the cardholder's phone or banking app is much stronger evidence, which is why the step-up option uses it.
Related recipes
Classify card disputes and detect friendly fraud
Classify unauthorized-transaction claims and choose provisional credit, approval or denial.
Triage dark web credential and card alerts
Match a dark web alert to the customer, judge whether the exposure still works, and choose the response.
Recipes
Every use case, with its questions and cost per decision.
Card fraud
Decisions on card transactions and the claims that follow them: authorizations, disputes and fleet cards. Ready-to-run Grayson recipes with real responses, cost and latency.
Card disputes
Grayson classifies card disputes as friendly fraud, account takeover or stolen card from authentication, logins and past disputes, and recommends a resolution.