Screen loan applications for fraud before the credit decision
Grayson screens personal loan, credit card and small-business loan applications for stolen identities, inflated income, edited pay stubs and other people's bank accounts, and picks proceed, verify income, verify identity or decline.
Grayson screens a loan application for fraud and misrepresentation before your credit decision, and returns how likely it is to be fraudulent, which problems the evidence shows (an inflated income, an employer nobody can confirm, an edited pay stub, a stolen or synthetic identity, loan stacking, a bank account that isn't the applicant's), whether the connected bank account supports the stated income, and whether to proceed, verify income, verify identity or decline. This is the fraud screen only: whether the applicant can repay a loan made on true facts is still your credit decision. It costs about $0.45 to $0.59 per 1,000 decisions.
- Decides: Screen a loan application for fraud and misrepresentation, and choose proceed, verify income, verify identity or decline.
- Call it: When a loan or card application is complete, before the credit decision
- Questions: 1 score, 1 multiple choice, 1 yes/no, 1 choice
- Cost: $0.00045 to $0.00059 per decision ($0.45 to $0.59 per 1,000) for these examples' 12,962 to 16,952 input tokens
- Latency: 236 to 302 ms for these examples, the median of 5 calls each through api.finic.ai from US-West
Examples
Three online personal loan applications, each sent with everything our checks return before the credit decision: the identity match, a credit file with 24 months of history, the employment database and employer checks, the analysis of each uploaded pay stub, 90 days of the connected checking account (about 110 to 190 transactions), device and session data, and velocity at our bank and in a lending consortium. They are a homeowner's stolen identity paid into a stranger's account, a nurse whose second job the employment database can't see, and a laid-off technician's new job at a small company that pays him by Zelle.
Open in Playground
A homeowner's identity used for a $40,000 loan paid into a stranger's account. The name, SSN, birth date and address belong to a 57-year-old Illinois homeowner with a fraud alert he placed in September, and he really does work at the stated employer. Everything else is new or someone else's: a four-day-old email, a VoIP phone, pay stubs edited to show $214,000 instead of $121,500, a computer in Atlanta used on two other applications, and a checking account owned by a stranger that received and emptied another lender's $11,500 loan last month.
| Question | Grayson's answer |
|---|---|
fraud_likelihood | 3.93 of 4, confidence 96% |
problems | income_overstated, employer_unverifiable, document_altered, stolen_identity, bank_account_not_applicants |
income_supported | Under 1% true |
action | decline, confidence 89% |
15,392 input tokens, $0.00054 per decision, answered in 236 ms.
The request, with long lists cut short. The full request is fraud.json (57 KB).
{
"model": "grayson-1",
"state": {
"lender": "Our bank (U.S. bank): unsecured personal loans, applied for online",
"application": {
"id": "pl_8QV31K",
"product": "Unsecured personal loan, $3,000 to $50,000, 24 to 60 months, fixed rate. Funds go by ACH to the applicant's own checking account, or for debt consolidation straight to the creditors.",
"channel": "Web (desktop)",
"started_at": "2026-10-06T07:34:08Z",
"submitted_at": "2026-10-06T07:36:52Z",
"applicant": {
"name": "Steven M. Haldane",
"date_of_birth": "1969-04-22",
"age": 57,
"ssn": "xxx-xx-4418",
"citizenship": "U.S. citizen"
},
"home_address": "1418 Larkspur Ct, Naperville, IL 60565",
"time_at_address": "10 years or more",
"housing": {
"status": "Own, with a mortgage",
"monthly_payment_usd": 2400
},
"email": "steven.haldane1969@example.com",
"mobile_phone": "(312) 555-0174",
"employment": {
"status": "Employed full time",
"employer": "Corvane Logistics Group",
"employer_address": "Aurora, IL",
"employer_phone": "(312) 555-0190",
"job_title": "Operations Manager",
"start_date": "2011-03",
"pay_frequency": "Every two weeks",
"gross_annual_income_usd": 214000
},
"other_income": "None",
"total_gross_annual_income_usd": 214000,
"loan_request": {
"amount_usd": 40000,
"term_months": 60,
"purpose": "Home improvement",
"funds_to": "My checking account (connected below)"
},
"loans_taken_in_last_60_days_not_on_credit_report": "None",
"existing_customer": "No"
},
"identity_verification": {
"name_ssn_dob_address": "Match: name, SSN, date of birth and address appear together in credit-header records since 2004",
"identity_first_reported": "1987-09",
"ssn": "Valid; issued 1984 to 1986, before randomization, consistent with the date of birth; 1 name and 1 date of birth associated; no Death Master File match",
"address_history": [
{
"address": "1418 Larkspur Ct, Naperville, IL 60565",
"first_reported": "2004-06",
"last_reported": "2026-09",
"sources": 6
},
{
"address": "Aurora, IL 60506",
"first_reported": "1996-03",
"last_reported": "2004-05",
"sources": 3
}
],
"phones_in_identity_records": [
{
"phone": "(630) 555-0129",
"type": "Mobile",
"first_reported": "2009-02",
"last_reported": "2026-09"
},
{
"phone": "(630) 555-0172",
"type": "Landline",
"first_reported": "2004-06",
"last_reported": "2019-11"
}
],
"emails_in_identity_records": [
{
"email": "shaldane@example.net",
"first_reported": "2006-01",
"last_reported": "2026-09"
}
],
"application_phone": "(312) 555-0174: not in any record for this identity",
"application_email": "steven.haldane1969@example.com: not in any record for this identity",
"email_check": {
"first_seen": "2026-10-02",
"domain_type": "Free webmail",
"name_match": "Full name match",
"appears_in_known_data_breaches": 0,
"deliverable": true,
"risk_score": {
"score": 811,
"scale": "0-999, higher is riskier",
"reasons": [
"Email first seen 4 days ago",
"No online history"
]
}
},
"phone_check": {
"line_type": "Non-fixed VoIP",
"carrier": "Internet calling provider",
"first_seen": "2026-09-30",
"subscriber_name": "Not available",
"ported_last_90_days": false,
"sms_one_time_code": "Delivered and entered correctly",
"risk_score": {
"score": 790,
"scale": "0-999, higher is riskier",
"reasons": [
"Non-fixed VoIP",
"Phone first seen 6 days ago",
"Not linked to the identity"
]
}
},
"identity_theft_score": {
"score": 902,
"scale": "0-999, higher is riskier",
"reasons": [
"Email and phone not linked to the identity",
"Email created in the last 7 days",
"Device location far from the identity's address",
"Fraud alert on file"
]
}
},
"credit_file": {
"pulled_at": "2026-10-06T07:36:55Z",
"pull_type": "Hard inquiry, with the applicant's consent, for this loan",
"file_created": "1987-09",
"name_on_file": "STEVEN M HALDANE",
"also_known_as": [],
"employment_on_file": "CORVANE LOGISTICS GROUP (reported 2023-04)",
"score": {
"model": "Generic risk score, 300-850",
"value": 806,
"factors": [
"Too many accounts with balances",
"Total of balances on installment accounts is too high"
]
},
"alerts_and_freezes": {
"fraud_alert": "Initial fraud alert added 2026-09-03 at the consumer's request, expires 2027-09-03. Consumer statement: 'My information was in a data breach. Call me at (630) 555-0129 before opening any credit.'",
"security_freeze": "None",
"active_duty_alert": "None"
},
"summary": {
"file_age_years": 39,
"tradelines_total": 9,
"tradelines_open": 7,
"authorized_user_tradelines": 0,
"revolving_limit_usd": 93500,
"revolving_balance_usd": 3812,
"revolving_utilization_pct": 4.1,
"installment_balance_usd": 206148,
"monthly_payments_on_file_usd": 2529,
"accounts_opened_last_6_months": 0,
"accounts_opened_last_12_months": 0,
"hard_inquiries_last_30_days": 1,
"hard_inquiries_last_90_days": 1,
"hard_inquiries_last_12_months": 1,
"late_payments_last_24_months": 0,
"collections": 0,
"public_records": 0
},
"tradelines": [
{
"creditor_type": "Mortgage",
"account": "x2207",
"ownership": "Joint",
"opened": "2015-06",
"original_amount_usd": 312000,
"term_months": 360,
"monthly_payment_usd": 1648,
"balance_usd": 189408,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC"
},
{
"creditor_type": "Auto loan (auto finance company)",
"account": "x9184",
"ownership": "Joint",
"opened": "2023-04",
"original_amount_usd": 41200,
"term_months": 60,
"monthly_payment_usd": 742,
"balance_usd": 16740,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC"
},
{
"creditor_type": "Bank credit card",
"account": "x4410",
"ownership": "Individual",
"opened": "1996-02",
"credit_limit_usd": 25000,
"balance_usd": 544,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
544,
456,
621,
1209,
1285,
"… 19 more in fraud.json"
]
},
{
"creditor_type": "Bank credit card",
"account": "x8832",
"ownership": "Individual",
"opened": "2009-08",
"credit_limit_usd": 18000,
"balance_usd": 1028,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
1028,
1684,
1427,
692,
1862,
"… 19 more in fraud.json"
]
},
{
"creditor_type": "Credit union credit card",
"account": "x0577",
"ownership": "Individual",
"opened": "2014-05",
"credit_limit_usd": 12000,
"balance_usd": 72,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
72,
175,
342,
341,
247,
"… 19 more in fraud.json"
]
},
"… 4 more in fraud.json"
],
"inquiries_last_24_months": [
{
"date": "2024-11-14",
"industry": "Bank credit card"
},
{
"date": "2026-10-05",
"industry": "Personal loan (online lender)"
}
]
},
"employment_verification": {
"employment_database": {
"searched_at": "2026-10-06T07:36:57Z",
"result": "Found",
"employer": "CORVANE LOGISTICS GROUP",
"employee": "STEVEN M HALDANE, SSN matches",
"status": "Active",
"hire_date": "2011-03-14",
"job_title": "Operations Manager",
"pay_frequency": "Biweekly",
"base_pay": "$121,500.00 a year",
"last_pay_date": "2026-10-02",
"last_gross_pay_usd": 4673.08,
"annual_gross_pay_usd": {
"2024": 113412.5,
"2025": 117940,
"2026_to_date": 99461.6
}
},
"stated_vs_database": "Stated $214,000 is 76% above the database's base pay of $121,500",
"employer_phone_on_application": "(312) 555-0190: non-fixed VoIP, internet calling provider, first seen 2026-09-30; not a number listed for the employer",
"employer_listed_main_number": "(630) 555-0110 (business directory and the employer's website)",
"previous_employer": "Not asked (more than 2 years at current employer)",
"verification_call": "Not attempted. We call employers only when the fraud screen holds an application for income verification."
},
"documents": {
"uploaded": [
{
"file": "paystub_0918.pdf",
"pages": 1,
"produced_by": "A large payroll provider's employee pay statement system, 2026-09-16",
"modified": "2026-10-05T23:48:12Z, in a desktop PDF editor",
"tamper_findings": [
"Text in the gross pay, net pay and year-to-date gross fields was replaced in the 2026-10-05 edit; those fields use a different embedded font from the rest of the stub",
"Taxes and deductions are 19.8% of the stated gross; Social Security ($289.73) is 6.2% of $4,673.08, not of the stated gross $8,230.77",
"Year-to-date Social Security ($5,876.89) is 6.2% of $94,788.52, not of the stated year-to-date gross $156,384.63"
],
"extracted": {
"employer": "Corvane Logistics Group, Aurora, IL",
"employee": "Steven M Haldane",
"employee_ssn_last4": "4418",
"employee_address": "Naperville, IL",
"pay_date": "2026-09-18",
"pay_period": "2026-08-30 to 2026-09-12",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular salary",
80,
null,
8230.77
]
]
},
"gross_pay_usd": 8230.77,
"deductions": {
"federal_income_tax_usd": 598.15,
"illinois_income_tax_usd": 231.32,
"social_security_usd": 289.73,
"medicare_usd": 67.76,
"401k_usd": 280.38,
"medical_usd": 142.5,
"dental_usd": 18.2
},
"net_pay_usd": 6602.73,
"year_to_date": {
"gross_usd": 156384.63,
"social_security_usd": 5876.89,
"medicare_usd": 1374.43,
"401k_usd": 5687.31
}
}
},
{
"file": "paystub_1002.pdf",
"pages": 1,
"produced_by": "A large payroll provider's employee pay statement system, 2026-09-30",
"modified": "2026-10-05T23:57:40Z, in a desktop PDF editor",
"tamper_findings": [
"Same edits as paystub_0918.pdf: gross, net and year-to-date gross replaced, different font",
"Social Security ($289.73) is 6.2% of $4,673.08, not of the stated gross $8,230.77"
],
"extracted": {
"employer": "Corvane Logistics Group, Aurora, IL",
"employee": "Steven M Haldane",
"employee_ssn_last4": "4418",
"employee_address": "Naperville, IL",
"pay_date": "2026-10-02",
"pay_period": "2026-09-13 to 2026-09-26",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular salary",
80,
null,
8230.77
]
]
},
"gross_pay_usd": 8230.77,
"deductions": {
"federal_income_tax_usd": 598.15,
"illinois_income_tax_usd": 231.32,
"social_security_usd": 289.73,
"medicare_usd": 67.76,
"401k_usd": 280.38,
"medical_usd": 142.5,
"dental_usd": 18.2
},
"net_pay_usd": 6602.73,
"year_to_date": {
"gross_usd": 164615.4,
"social_security_usd": 6166.62,
"medicare_usd": 1442.19,
"401k_usd": 5967.7
}
}
}
],
"id_document": "Not collected at submission. Document and selfie verification runs only when the fraud screen holds an application for identity verification."
},
"connected_bank_account": {
"linked_at": "2026-10-06T07:36:03Z",
"link_method": "Instant account link: the applicant signed in to the bank's online banking",
"used_for": "Income verification, the loan funds, and autopay of the loan",
"institution": "Large national bank",
"account": "Checking x3391, opened 2025-11",
"owner_on_account": {
"names": [
"COREY J LINDQVIST"
],
"address": "Atlanta, GA 30315",
"email": "cjlindq@example.net",
"phone": "(404) 555-0119"
},
"owner_match_to_application": {
"name": "No match",
"address": "No match",
"email": "No match",
"phone": "No match"
},
"income_detected": [
{
"payer": "HARLOW GATE DIST PAYROLL",
"type": "Payroll",
"frequency": "Weekly",
"deposits_90_days": 13,
"first": "2026-07-10",
"last": "2026-10-02",
"average_usd": 659.13,
"total_90_days_usd": 8568.64
},
{
"payer": "FERNWAY LENDING",
"type": "Loan disbursement (not income)",
"frequency": "Once",
"deposits_90_days": 1,
"first": "2026-09-24",
"last": "2026-09-24",
"average_usd": 11500,
"total_90_days_usd": 11500
}
],
"income_from_stated_employer": "None: no deposits from CORVANE LOGISTICS GROUP",
"other_lender_activity": "One loan disbursement in: FERNWAY LENDING, $11,500.00 on 2026-09-24. No loan payments out.",
"current_balance_usd": 2243.41,
"average_daily_balance_90_days_usd": 1535.11,
"lowest_balance_90_days_usd": 331.3,
"overdrafts_or_nsf_90_days": 0,
"cash_flow_by_month": {
"columns": [
"month",
"credits_usd",
"debits_usd"
],
"rows": [
[
"2026-07 (from 07-08)",
2634.09,
1287.14
],
[
"2026-08",
2861.95,
2647.98
],
[
"2026-09",
14245.69,
13307.06
],
[
"2026-10 (to 10-05)",
1566.91,
2241.67
]
]
},
"transactions": {
"note": "Posted items 2026-07-08 to 2026-10-05 from the account link; debits negative; balance computed back from the current balance",
"columns": [
"posted",
"description",
"amount_usd",
"category",
"balance_usd"
],
"rows": [
[
"2026-07-08",
"POPEYES 4410 ATLANTA GA",
-15.68,
"Restaurants",
402.94
],
[
"2026-07-08",
"DOORDASH*CHIPOTLE",
-24.34,
"Restaurants",
378.6
],
[
"2026-07-09",
"WENDYS #6612 ATLANTA GA",
-7.04,
"Restaurants",
371.56
],
[
"2026-07-09",
"PLAYSTATION NETWORK",
-17.99,
"Subscriptions",
353.57
],
[
"2026-07-09",
"WENDYS #6612 ATLANTA GA",
-22.27,
"Restaurants",
331.3
],
"… 151 more in fraud.json"
]
}
},
"device_and_session": {
"device_id": "dev_41c9e07ba2d5",
"device_type": "Desktop",
"os": "Windows 11",
"browser": "Chrome 141",
"language": "en-US",
"timezone": "America/New_York",
"local_time_at_submission": "2026-10-06T03:36:52-04:00",
"ip_address": "203.0.113.58",
"ip_type": "Residential broadband (cable ISP)",
"ip_location": "Atlanta, GA",
"distance_from_home_address_miles": 590,
"proxy_vpn_tor_or_hosting": "None detected",
"fingerprint_integrity": "Consistent; no spoofing detected",
"remote_access_software": "None detected",
"first_seen_at_our_bank": "2026-09-29T06:12:44Z",
"duration_seconds": 164,
"median_duration_seconds_for_this_form": 690,
"fields_typed": 9,
"fields_pasted": 5,
"fields_autofilled": 0,
"times_left_page": 4,
"events": {
"columns": [
"offset_s",
"page",
"field",
"event",
"detail"
],
"rows": [
[
0,
"Your loan",
"",
"page_view",
""
],
[
8.9,
"Your loan",
"loan_amount",
"typed",
"5 characters in 0.6 s, 0 corrections"
],
[
10.1,
"Your loan",
"term",
"selected",
"60 months"
],
[
12.8,
"Your loan",
"purpose",
"selected",
"Home improvement"
],
[
14,
"About you",
"",
"page_view",
""
],
"… 30 more in fraud.json"
]
}
},
"velocity_and_consortium": {
"our_bank_last_90_days": {
"same_device_other_applications": {
"count": 2,
"detail": {
"columns": [
"date",
"name_and_ssn",
"address_state",
"same_bank_account",
"outcome"
],
"rows": [
[
"2026-09-29",
"Different name and SSN",
"IL",
true,
"Declined: bank account owner didn't match"
],
[
"2026-10-02",
"Different name and SSN",
"WI",
false,
"Held for identity verification; not completed"
]
]
}
},
"same_phone_or_email_other_applications": 0,
"same_ip_other_applications_last_30_days": 2,
"same_bank_account_other_applications": 1,
"same_address_other_applications": 0
},
"lending_consortium": {
"applications_with_this_ssn": {
"last_7_days": 1,
"last_30_days": 1,
"last_90_days": 1
},
"recent": {
"columns": [
"date",
"member_type",
"product",
"same_phone",
"same_email",
"… 4 more in fraud.json"
],
"rows": [
[
"2026-10-05",
"Online lender",
"Personal loan",
true,
true,
"… 4 more in fraud.json"
]
]
},
"this_bank_account_with_other_names_or_ssns_last_30_days": "2 applications at members under 2 other identities; 1 confirmed identity theft reported 2026-10-01 (loan funded 2026-09-24, victim disputed)",
"this_phone_or_email_with_other_names": 0,
"confirmed_fraud_reports_on_this_ssn": 0
}
},
"rules_fired": [
{
"rule": "LN-104",
"description": "Fraud alert on the credit file"
},
{
"rule": "LN-111",
"description": "Application phone and email not linked to the identity"
},
{
"rule": "LN-118",
"description": "Email first seen in the last 30 days"
},
{
"rule": "LN-122",
"description": "Non-fixed VoIP phone"
},
{
"rule": "LN-207",
"description": "Stated income more than 20% above the employment database (76%)"
},
"… 6 more in fraud.json"
],
"decision_request": {
"stage": "Fraud screen before the credit decision; all automated checks returned",
"requested_at": "2026-10-06T07:37:01Z",
"next_step": "Credit decision by our underwriting model and policy, then a signed loan agreement; funds go out by ACH the next business day after signing."
}
},
"questions": {
"fraud_likelihood": {
"type": "score",
"instructions": "How likely is it that this application is fraudulent: made with a stolen or synthetic identity, or with the income, employment, documents, debts or bank account misrepresented to get credit? Judge the honesty of the application, not whether the applicant could repay a loan made on true facts.",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"problems": {
"type": "multi_choice",
"instructions": "Which of these problems does the evidence show in this application? Choose every one that applies, and none if none does.",
"criteria": {
"income_overstated": "The stated income, from all sources together, is more than about 15% above what pay records, deposits or tax records support, comparing gross pay with gross pay",
"employer_unverifiable": "No source independent of the applicant (employment or payroll records, or a phone number found independently) confirms that the person named on the application works for the stated employer, or those sources contradict it",
"document_altered": "A pay stub, bank statement, tax form or ID the applicant uploaded was edited after it was produced, or is fabricated",
"stolen_identity": "Someone is applying as a real person without that person's knowledge",
"synthetic_identity": "The identity is fabricated from a mix of real and invented details, with a credit file built recently or on strangers' authorized-user cards",
"loan_stacking": "The applicant has taken out or applied for several other loans or cards in the last 30 days, beyond normal rate shopping, and hasn't disclosed them",
"bank_account_not_applicants": "The bank account connected to verify income, or chosen to receive the loan, belongs to someone other than the person named on the application"
}
},
"income_supported": {
"type": "noul",
"instructions": "Do the deposits in the applicant's connected bank account support the income stated on the application? Take-home pay is usually 65 to 80 percent of gross pay. Answer no if deposits from the stated sources are clearly lower than the stated income would produce, come from a different payer, or aren't in an account the applicant owns."
},
"action": {
"type": "choice",
"instructions": "This is the fraud screen before the credit decision, not the credit decision itself. What should the fraud screen do with this application now?",
"criteria": {
"proceed": "Proceed: send the application on to the credit decision with no fraud hold",
"verify_income": "Verify income: hold the application until income and employment are confirmed independently, by a call to the employer at a number we find ourselves, a payroll account connection, or IRS tax transcripts (Form 4506-C)",
"verify_identity": "Verify identity: hold the application until the applicant passes document and selfie verification and confirms the application at a phone number from the credit file, not the one on the application",
"decline": "Decline the application for fraud"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_70936766d1de452b9875b1b0e2c4d519",
"model": "grayson-1",
"answers": {
"fraud_likelihood": {
"type": "score",
"score": 3.928,
"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.9642,
"probabilities": {
"0": 0.0108,
"1": 0.004,
"2": 0.0031,
"3": 0.0108,
"4": 0.9714
}
},
"problems": {
"type": "multi_choice",
"multi_choice": [
"income_overstated",
"employer_unverifiable",
"document_altered",
"stolen_identity",
"bank_account_not_applicants"
],
"probabilities": {
"income_overstated": 0.9859,
"employer_unverifiable": 0.867,
"document_altered": 0.9993,
"stolen_identity": 0.8933,
"synthetic_identity": 0.0036,
"loan_stacking": 0.0675,
"bank_account_not_applicants": 0.9985
}
},
"income_supported": {
"type": "noul",
"noul": 0.0009
},
"action": {
"type": "choice",
"choice": "decline",
"confidence": 0.8935,
"probabilities": {
"proceed": 0.008,
"verify_income": 0.0131,
"verify_identity": 0.0588,
"decline": 0.9201
}
}
},
"usage": {
"input_tokens": 15392,
"output_tokens": 0
}
}Open in Playground
A nurse whose stated income includes a second job the database can't see. A hospital nurse of seven years wants $18,500 paid straight to three credit cards. Six rules fired and the record explains each: the employment database only knows her main job, but her stubs and deposits show the per diem second job she listed; she moved in August with a change of address filed; her phone and bills switched carriers in September; she applied through iCloud Private Relay; and the September inquiries and new auto loan are a car purchase she disclosed.
| Question | Grayson's answer |
|---|---|
fraud_likelihood | 0.03 of 4, confidence 98% |
problems | None at 50% or more |
income_supported | 98% true |
action | proceed, confidence 98% |
16,952 input tokens, $0.00059 per decision, answered in 302 ms.
The request, with long lists cut short. The full request is legitimate.json (63 KB).
{
"model": "grayson-1",
"state": {
"lender": "Our bank (U.S. bank): unsecured personal loans, applied for online",
"application": {
"id": "pl_3HT90C",
"product": "Unsecured personal loan, $3,000 to $50,000, 24 to 60 months, fixed rate. Funds go by ACH to the applicant's own checking account, or for debt consolidation straight to the creditors.",
"channel": "Mobile web (iPhone)",
"started_at": "2026-10-05T00:58:21Z",
"submitted_at": "2026-10-05T01:08:16Z",
"applicant": {
"name": "Renee M. Castellano",
"date_of_birth": "1988-03-09",
"age": 38,
"ssn": "xxx-xx-2083",
"citizenship": "U.S. citizen"
},
"home_address": "2207 Wexford Glen Dr, Apt 314, Charlotte, NC 28211",
"time_at_address": "2 months",
"previous_address": "Silver Oak Apartments, Matthews, NC 28105 (2019-06 to 2026-07)",
"housing": {
"status": "Rent",
"monthly_payment_usd": 1685
},
"email": "renee.castellano@example.com",
"mobile_phone": "(704) 555-0138",
"employment": {
"status": "Employed full time",
"employer": "Larkhaven Regional Medical Center",
"employer_address": "Charlotte, NC",
"employer_phone": "(704) 555-0181",
"job_title": "Registered Nurse II",
"start_date": "2019-06",
"pay_frequency": "Every two weeks",
"gross_annual_income_usd": 82000
},
"other_income": [
{
"source": "Second job: per diem RN at Briar Hollow Surgery Center, since 2024-03",
"gross_annual_income_usd": 22000
}
],
"total_gross_annual_income_usd": 104000,
"loan_request": {
"amount_usd": 18500,
"term_months": 48,
"purpose": "Debt consolidation",
"funds_to": {
"paid_directly_to_creditors": [
{
"card": "x4471",
"amount_usd": 7940
},
{
"card": "x0915",
"amount_usd": 6910
},
{
"card": "x2290",
"amount_usd": 3620
}
],
"remainder_to_my_checking_usd": 30
}
},
"loans_taken_in_last_60_days_not_on_credit_report": "Auto loan, September 2026, $512 a month",
"existing_customer": "No"
},
"identity_verification": {
"name_ssn_dob_address": "Match: name, SSN and date of birth appear together in credit-header records since 2006; application address reported by 1 source since 2026-09",
"identity_first_reported": "2006-09",
"ssn": "Valid; issued 1988 to 1990, before randomization, consistent with the date of birth; 2 names (current and maiden) and 1 date of birth associated; no Death Master File match",
"address_history": [
{
"address": "2207 Wexford Glen Dr, Apt 314, Charlotte, NC 28211",
"first_reported": "2026-09",
"last_reported": "2026-09",
"sources": 1
},
{
"address": "Silver Oak Apartments, Matthews, NC 28105",
"first_reported": "2019-07",
"last_reported": "2026-08",
"sources": 5
},
{
"address": "Charlotte, NC 28205",
"first_reported": "2012-04",
"last_reported": "2019-06",
"sources": 4
}
],
"usps_change_of_address": "Filed 2026-08-11, from Matthews, NC 28105 to the application address",
"phones_in_identity_records": [
{
"phone": "(704) 555-0138",
"type": "Mobile",
"first_reported": "2014-03",
"last_reported": "2026-09"
}
],
"emails_in_identity_records": [
{
"email": "renee.castellano@example.com",
"first_reported": "2011-05",
"last_reported": "2026-09"
},
{
"email": "rpruitt88@example.net",
"first_reported": "2007-02",
"last_reported": "2015-10"
}
],
"application_phone": "(704) 555-0138: in this identity's records since 2014",
"application_email": "renee.castellano@example.com: in this identity's records since 2011",
"email_check": {
"first_seen": "2011-05-19",
"domain_type": "Free webmail",
"name_match": "Full name match",
"appears_in_known_data_breaches": 3,
"deliverable": true,
"risk_score": {
"score": 104,
"scale": "0-999, higher is riskier",
"reasons": [
"Long history"
]
}
},
"phone_check": {
"line_type": "Mobile",
"carrier": "Major U.S. wireless carrier",
"first_seen": "2014-03",
"subscriber_name": "RENEE CASTELLANO (carrier record)",
"ported_last_90_days": true,
"port_detail": "Ported 2026-09-02 from another major carrier; no SIM change since",
"sms_one_time_code": "Delivered and entered correctly",
"risk_score": {
"score": 288,
"scale": "0-999, higher is riskier",
"reasons": [
"Ported in the last 90 days"
]
}
},
"identity_theft_score": {
"score": 187,
"scale": "0-999, higher is riskier",
"reasons": [
"Recent address change",
"Recent phone port"
]
}
},
"credit_file": {
"pulled_at": "2026-10-05T01:08:19Z",
"pull_type": "Hard inquiry, with the applicant's consent, for this loan",
"file_created": "2006-09",
"name_on_file": "RENEE M CASTELLANO",
"also_known_as": [
"RENEE M PRUITT (2006 to 2015)"
],
"employment_on_file": "LARKHAVEN REGIONAL MEDICAL CENTER (reported 2024-02)",
"score": {
"model": "Generic risk score, 300-850",
"value": 718,
"factors": [
"Proportion of balances to credit limits on revolving accounts is too high",
"Too many inquiries in the last 12 months",
"Recently opened installment account"
]
},
"alerts_and_freezes": {
"fraud_alert": "None",
"security_freeze": "None",
"active_duty_alert": "None"
},
"summary": {
"file_age_years": 20,
"tradelines_total": 8,
"tradelines_open": 6,
"authorized_user_tradelines": 0,
"revolving_limit_usd": 36000,
"revolving_balance_usd": 19985,
"revolving_utilization_pct": 55.5,
"installment_balance_usd": 28400,
"monthly_payments_on_file_usd": 931,
"accounts_opened_last_6_months": 1,
"accounts_opened_last_12_months": 2,
"hard_inquiries_last_30_days": 3,
"hard_inquiries_last_90_days": 3,
"hard_inquiries_last_12_months": 4,
"late_payments_last_24_months": 0,
"collections": 0,
"public_records": 0
},
"tradelines": [
{
"creditor_type": "Auto loan (auto finance company)",
"account": "x7720",
"ownership": "Individual",
"opened": "2021-03",
"closed": "2026-09",
"original_amount_usd": 22500,
"term_months": 60,
"monthly_payment_usd": 412,
"balance_usd": 0,
"status": "Closed, paid in full",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC"
},
{
"creditor_type": "Auto loan (auto finance company)",
"account": "x1846",
"ownership": "Individual",
"opened": "2026-09",
"original_amount_usd": 28400,
"term_months": 72,
"monthly_payment_usd": 512,
"balance_usd": 28400,
"status": "Open, current; first payment due 2026-10-28",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "C-----------------------"
},
{
"creditor_type": "Bank credit card",
"account": "x4471",
"ownership": "Individual",
"opened": "2012-04",
"credit_limit_usd": 12000,
"balance_usd": 7940,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
7940,
7512,
5208,
4630,
3893,
"… 19 more in legitimate.json"
]
},
{
"creditor_type": "Bank credit card",
"account": "x0915",
"ownership": "Individual",
"opened": "2016-09",
"credit_limit_usd": 9500,
"balance_usd": 6910,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
6910,
6655,
4401,
3028,
3810,
"… 19 more in legitimate.json"
]
},
{
"creditor_type": "Bank credit card",
"account": "x2290",
"ownership": "Individual",
"opened": "2020-01",
"credit_limit_usd": 6000,
"balance_usd": 3620,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
3620,
3418,
970,
1413,
1103,
"… 19 more in legitimate.json"
]
},
{
"creditor_type": "Credit union credit card",
"account": "x6604",
"ownership": "Individual",
"opened": "2014-02",
"credit_limit_usd": 3500,
"balance_usd": 245,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
245,
37,
183,
138,
304,
"… 19 more in legitimate.json"
]
},
{
"creditor_type": "Bank credit card",
"account": "x3318",
"ownership": "Individual",
"opened": "2025-12",
"credit_limit_usd": 5000,
"balance_usd": 1270,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCC--------------",
"statement_balances_24m_newest_first": [
1270,
684,
665,
380,
422,
"… 19 more in legitimate.json"
]
},
{
"creditor_type": "Student loan (federal servicer)",
"account": "x0921",
"ownership": "Individual",
"opened": "2006-09",
"closed": "2018-05",
"original_amount_usd": 18400,
"term_months": 120,
"monthly_payment_usd": 196,
"balance_usd": 0,
"status": "Closed, paid as agreed",
"last_reported": "2018-05"
}
],
"inquiries_last_24_months": [
{
"date": "2025-12-08",
"industry": "Bank credit card"
},
{
"date": "2026-09-12",
"industry": "Auto finance"
},
{
"date": "2026-09-12",
"industry": "Auto finance"
},
{
"date": "2026-09-13",
"industry": "Auto finance"
}
]
},
"employment_verification": {
"employment_database": {
"searched_at": "2026-10-05T01:08:21Z",
"result": "Found",
"employer": "LARKHAVEN REGIONAL MEDICAL CENTER",
"employee": "RENEE M CASTELLANO, SSN matches",
"status": "Active",
"hire_date": "2019-06-10",
"job_title": "RN II",
"pay_frequency": "Biweekly",
"base_pay": "$39.38 an hour; 80 scheduled hours a pay period",
"annualized_base_pay_usd": 81910.4,
"last_pay_date": "2026-09-25",
"annual_gross_pay_usd": {
"2024": 81630.12,
"2025": 86214.77,
"2026_to_date": 69365.36
}
},
"second_employer_in_database": "BRIAR HOLLOW SURGERY CENTER: not found (the database doesn't cover this employer)",
"stated_vs_database": "Stated total $104,000 is 27% above the database's annualized base pay of $81,910 for the main employer",
"employer_phone_on_application": "(704) 555-0181: the hospital's listed main number",
"second_employer_checks": {
"business_registry": "Briar Hollow Surgery Center, LLC: active, formed 2009",
"state_facility_license": "Ambulatory surgical center, licensed",
"listed_phone": "(704) 555-0146"
},
"previous_employer": "Not asked (more than 2 years at current employer)",
"verification_call": "Not attempted. We call employers only when the fraud screen holds an application for income verification."
},
"documents": {
"uploaded": [
{
"file": "Larkhaven_paystub_0911.pdf",
"pages": 1,
"produced_by": "A large payroll provider's employee pay statement system, 2026-09-09",
"modified": "Not modified after it was produced",
"tamper_findings": [],
"extracted": {
"employer": "Larkhaven Regional Medical Center, Charlotte, NC",
"employee": "Renee M Castellano",
"employee_ssn_last4": "2083",
"employee_address": "Matthews, NC (her previous address)",
"pay_date": "2026-09-11",
"pay_period": "2026-08-23 to 2026-09-05",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular",
80,
39.38,
3150.4
],
[
"Night differential",
36,
3.5,
126
],
[
"Weekend differential",
12,
2.25,
27
]
]
},
"gross_pay_usd": 3303.4,
"deductions": {
"403b_usd": 165.17,
"medical_usd": 96.4,
"dental_usd": 9.8,
"federal_income_tax_usd": 327.46,
"nc_income_tax_usd": 120.98,
"social_security_usd": 198.23,
"medicare_usd": 46.36
},
"net_pay_usd": 2339,
"year_to_date": {
"gross_usd": 66076.96,
"403b_usd": 3303.85
}
}
},
{
"file": "Larkhaven_paystub_0925.pdf",
"pages": 1,
"produced_by": "A large payroll provider's employee pay statement system, 2026-09-23",
"modified": "Not modified after it was produced",
"tamper_findings": [],
"extracted": {
"employer": "Larkhaven Regional Medical Center, Charlotte, NC",
"employee": "Renee M Castellano",
"employee_ssn_last4": "2083",
"employee_address": "Charlotte, NC 28211",
"pay_date": "2026-09-25",
"pay_period": "2026-09-06 to 2026-09-19",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular",
80,
39.38,
3150.4
],
[
"Night differential",
24,
3.5,
84
],
[
"Weekend differential",
24,
2.25,
54
]
]
},
"gross_pay_usd": 3288.4,
"deductions": {
"403b_usd": 164.42,
"medical_usd": 96.4,
"dental_usd": 9.8,
"federal_income_tax_usd": 325.92,
"nc_income_tax_usd": 120.41,
"social_security_usd": 197.3,
"medicare_usd": 46.14
},
"net_pay_usd": 2328.01,
"year_to_date": {
"gross_usd": 69365.36,
"403b_usd": 3468.27
}
}
},
{
"file": "BriarHollow_0930.pdf",
"pages": 1,
"produced_by": "A small-business payroll service's pay statement system, 2026-09-29",
"modified": "Not modified after it was produced",
"tamper_findings": [],
"extracted": {
"employer": "Briar Hollow Surgery Center, Charlotte, NC",
"employee": "Renee M Castellano",
"employee_ssn_last4": "2083",
"employee_address": "Charlotte, NC 28211",
"pay_date": "2026-09-30",
"pay_period": "2026-09-16 to 2026-09-30",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Per diem shift (12 h)",
24,
58,
1392
]
]
},
"gross_pay_usd": 1392,
"deductions": {
"federal_income_tax_usd": 167.04,
"nc_income_tax_usd": 55.54,
"social_security_usd": 86.3,
"medicare_usd": 20.18
},
"net_pay_usd": 1062.94,
"year_to_date": {
"gross_usd": 16704
}
}
}
],
"consistency": "Net pay on each stub matches a payroll deposit in the connected account to the cent",
"id_document": "Not collected at submission. Document and selfie verification runs only when the fraud screen holds an application for identity verification."
},
"connected_bank_account": {
"linked_at": "2026-10-05T01:05:57Z",
"link_method": "Instant account link: the applicant signed in to the credit union's online banking",
"used_for": "Income verification, any loan funds not paid to creditors, and autopay of the loan",
"institution": "Credit union, North Carolina",
"account": "Checking x5502, opened 2012-05",
"owner_on_account": {
"names": [
"RENEE M CASTELLANO"
],
"address": "2207 Wexford Glen Dr Apt 314, Charlotte, NC 28211",
"email": "renee.castellano@example.com",
"phone": "(704) 555-0138"
},
"owner_match_to_application": {
"name": "Match",
"address": "Match",
"email": "Match",
"phone": "Match"
},
"income_detected": [
{
"payer": "LARKHAVEN REGIONAL MC PAYROLL",
"type": "Payroll",
"frequency": "Every two weeks",
"deposits_90_days": 6,
"first": "2026-07-17",
"last": "2026-09-25",
"average_usd": 2452.27,
"total_90_days_usd": 14713.6
},
{
"payer": "BRIAR HOLLOW SURGERY PAYROLL",
"type": "Payroll",
"frequency": "Twice a month, varying",
"deposits_90_days": 6,
"first": "2026-07-15",
"last": "2026-09-30",
"average_usd": 797.21,
"total_90_days_usd": 4783.23
}
],
"income_from_stated_employer": "Yes: LARKHAVEN REGIONAL MC every two weeks, and BRIAR HOLLOW SURGERY (the stated second job) twice a month",
"other_lender_activity": "Auto loan payments to x7720 through August; a $2,500.00 debit at QUEEN CITY AUTO SALES on 2026-09-13. No loan disbursements in.",
"current_balance_usd": 3935.23,
"average_daily_balance_90_days_usd": 3940.07,
"lowest_balance_90_days_usd": -51.13,
"overdrafts_or_nsf_90_days": 1,
"cash_flow_by_month": {
"columns": [
"month",
"credits_usd",
"debits_usd"
],
"rows": [
[
"2026-07 (from 07-06)",
6734.62,
6338.61
],
[
"2026-08",
7967.29,
4024.49
],
[
"2026-09",
6261.42,
7571.28
],
[
"2026-10 (to 10-04)",
0,
1968.05
]
]
},
"transactions": {
"note": "Posted items 2026-07-06 to 2026-10-04 from the account link; debits negative; balance computed back from the current balance",
"columns": [
"posted",
"description",
"amount_usd",
"category",
"balance_usd"
],
"rows": [
[
"2026-07-06",
"GEICO *AUTO",
-138.4,
"Insurance",
2735.93
],
[
"2026-07-06",
"DOORDASH*WINGSTOP",
-29.52,
"Restaurants",
2706.41
],
[
"2026-07-06",
"ALDI 64021 CHARLOTTE NC",
-46.05,
"Groceries",
2660.36
],
[
"2026-07-06",
"STARBUCKS STORE 12872 CHARLOTTE NC",
-5.53,
"Coffee",
2654.83
],
[
"2026-07-07",
"STARBUCKS STORE 12872 CHARLOTTE NC",
-8.22,
"Coffee",
2646.61
],
"… 186 more in legitimate.json"
]
}
},
"device_and_session": {
"device_id": "dev_9a07f3e61c28",
"device_type": "Mobile phone",
"os": "iOS 26",
"browser": "Safari",
"language": "en-US",
"timezone": "America/New_York",
"local_time_at_submission": "2026-10-04T21:08:16-04:00",
"ip_address": "198.51.100.211",
"ip_type": "Privacy relay (iCloud Private Relay egress)",
"ip_location": "Charlotte, NC region",
"distance_from_home_address_miles": "Under 25 (relay region)",
"proxy_vpn_tor_or_hosting": "Privacy relay detected (a phone setting, not a VPN or hosting provider)",
"fingerprint_integrity": "Consistent; no spoofing detected",
"remote_access_software": "None detected",
"first_seen_at_our_bank": "This session (device model released 2026-09)",
"duration_seconds": 595,
"median_duration_seconds_for_this_form": 690,
"fields_typed": 11,
"fields_pasted": 0,
"fields_autofilled": 4,
"times_left_page": 0,
"events": {
"columns": [
"offset_s",
"page",
"field",
"event",
"detail"
],
"rows": [
[
0,
"Your loan",
"",
"page_view",
""
],
[
65.5,
"Your loan",
"loan_amount",
"typed",
"5 characters in 1.5 s, 1 correction"
],
[
67,
"Your loan",
"term",
"selected",
"48 months"
],
[
68.2,
"Your loan",
"purpose",
"selected",
"Debt consolidation"
],
[
70.7,
"About you",
"",
"page_view",
""
],
"… 23 more in legitimate.json"
]
}
},
"velocity_and_consortium": {
"our_bank_last_90_days": {
"same_device_other_applications": 0,
"same_phone_or_email_other_applications": 0,
"same_ip_other_applications_last_30_days": "Not counted for privacy-relay addresses",
"same_bank_account_other_applications": 0,
"same_address_other_applications": 0
},
"lending_consortium": {
"applications_with_this_ssn": {
"last_7_days": 0,
"last_30_days": 1,
"last_90_days": 1
},
"recent": {
"columns": [
"date",
"member_type",
"product",
"same_phone",
"same_email",
"… 4 more in legitimate.json"
],
"rows": [
[
"2026-09-13",
"Auto lender",
"Auto loan",
true,
true,
"… 4 more in legitimate.json"
]
]
},
"this_bank_account_with_other_names_or_ssns_last_30_days": 0,
"this_phone_or_email_with_other_names": 0,
"confirmed_fraud_reports_on_this_ssn": 0
}
},
"rules_fired": [
{
"rule": "LN-131",
"description": "Application address reported by fewer than 2 sources"
},
{
"rule": "LN-134",
"description": "Phone ported in the last 90 days"
},
{
"rule": "LN-207",
"description": "Stated income more than 20% above the employment database (27%)"
},
{
"rule": "LN-311",
"description": "3 or more hard inquiries in 30 days"
},
{
"rule": "LN-314",
"description": "New installment account in the last 30 days"
},
{
"rule": "LN-506",
"description": "Proxy or privacy relay detected"
}
],
"decision_request": {
"stage": "Fraud screen before the credit decision; all automated checks returned",
"requested_at": "2026-10-05T01:08:25Z",
"next_step": "Credit decision by our underwriting model and policy, then a signed loan agreement; funds go out by ACH the next business day after signing."
}
},
"questions": {
"fraud_likelihood": {
"type": "score",
"instructions": "How likely is it that this application is fraudulent: made with a stolen or synthetic identity, or with the income, employment, documents, debts or bank account misrepresented to get credit? Judge the honesty of the application, not whether the applicant could repay a loan made on true facts.",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"problems": {
"type": "multi_choice",
"instructions": "Which of these problems does the evidence show in this application? Choose every one that applies, and none if none does.",
"criteria": {
"income_overstated": "The stated income, from all sources together, is more than about 15% above what pay records, deposits or tax records support, comparing gross pay with gross pay",
"employer_unverifiable": "No source independent of the applicant (employment or payroll records, or a phone number found independently) confirms that the person named on the application works for the stated employer, or those sources contradict it",
"document_altered": "A pay stub, bank statement, tax form or ID the applicant uploaded was edited after it was produced, or is fabricated",
"stolen_identity": "Someone is applying as a real person without that person's knowledge",
"synthetic_identity": "The identity is fabricated from a mix of real and invented details, with a credit file built recently or on strangers' authorized-user cards",
"loan_stacking": "The applicant has taken out or applied for several other loans or cards in the last 30 days, beyond normal rate shopping, and hasn't disclosed them",
"bank_account_not_applicants": "The bank account connected to verify income, or chosen to receive the loan, belongs to someone other than the person named on the application"
}
},
"income_supported": {
"type": "noul",
"instructions": "Do the deposits in the applicant's connected bank account support the income stated on the application? Take-home pay is usually 65 to 80 percent of gross pay. Answer no if deposits from the stated sources are clearly lower than the stated income would produce, come from a different payer, or aren't in an account the applicant owns."
},
"action": {
"type": "choice",
"instructions": "This is the fraud screen before the credit decision, not the credit decision itself. What should the fraud screen do with this application now?",
"criteria": {
"proceed": "Proceed: send the application on to the credit decision with no fraud hold",
"verify_income": "Verify income: hold the application until income and employment are confirmed independently, by a call to the employer at a number we find ourselves, a payroll account connection, or IRS tax transcripts (Form 4506-C)",
"verify_identity": "Verify identity: hold the application until the applicant passes document and selfie verification and confirms the application at a phone number from the credit file, not the one on the application",
"decline": "Decline the application for fraud"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_bb59495a06d24c10a1dba93e8e86c6cb",
"model": "grayson-1",
"answers": {
"fraud_likelihood": {
"type": "score",
"score": 0.028,
"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.9769,
"probabilities": {
"0": 0.9816,
"1": 0.014,
"2": 0.0011,
"3": 0.0011,
"4": 0.0021
}
},
"problems": {
"type": "multi_choice",
"multi_choice": [],
"probabilities": {
"income_overstated": 0.0421,
"employer_unverifiable": 0.0159,
"document_altered": 0.0013,
"stolen_identity": 0.0124,
"synthetic_identity": 0.0009,
"loan_stacking": 0.0851,
"bank_account_not_applicants": 0.0006
}
},
"income_supported": {
"type": "noul",
"noul": 0.982
},
"action": {
"type": "choice",
"choice": "proceed",
"confidence": 0.9838,
"probabilities": {
"proceed": 0.9878,
"verify_income": 0.0046,
"verify_identity": 0.0036,
"decline": 0.004
}
}
},
"usage": {
"input_tokens": 16952,
"output_tokens": 0
}
}Open in Playground
A new job at a small HVAC company, paid by Zelle and shown on generated pay stubs. A technician laid off in July says he started at a small HVAC company on September 8 at a 12% raise. The company is real and licensed, the employer phone is its listed number, and three Zelle payments from its business account match the stubs' net pay to the cent. But no payroll record confirms the job, the stubs come from a free online generator and were all made the night before he applied, he already knew the owner, his cards went from under 20% to 78% used while he was out of work, and six days ago he told another lender he earns $86,000.
| Question | Grayson's answer |
|---|---|
fraud_likelihood | 0.77 of 4, confidence 58% (Very unlikely 67%, Unlikely 15%, Uncertain 3%, Likely 7%, Very likely 9%) |
problems | employer_unverifiable |
income_supported | 11% true |
action | proceed, confidence 76% |
12,962 input tokens, $0.00045 per decision, answered in 285 ms.
The request, with long lists cut short. The full request is ambiguous.json (48 KB).
{
"model": "grayson-1",
"state": {
"lender": "Our bank (U.S. bank): unsecured personal loans, applied for online",
"application": {
"id": "pl_6MW24R",
"product": "Unsecured personal loan, $3,000 to $50,000, 24 to 60 months, fixed rate. Funds go by ACH to the applicant's own checking account, or for debt consolidation straight to the creditors.",
"channel": "Mobile web (Android)",
"started_at": "2026-10-07T17:51:09Z",
"submitted_at": "2026-10-07T18:01:47Z",
"applicant": {
"name": "Kyle D. Brannigan",
"date_of_birth": "1993-01-27",
"age": 33,
"ssn": "xxx-xx-7731",
"citizenship": "U.S. citizen"
},
"home_address": "1640 S Ocotillo Bend, Apt 207, Mesa, AZ 85210",
"time_at_address": "4 years",
"housing": {
"status": "Rent",
"monthly_payment_usd": 1450
},
"email": "kbrannigan93@example.com",
"mobile_phone": "(480) 555-0163",
"employment": {
"status": "Employed full time",
"employer": "Dry Wash Heating & Cooling LLC",
"employer_address": "Gilbert, AZ",
"employer_phone": "(480) 555-0155",
"job_title": "HVAC Technician",
"start_date": "2026-09",
"pay_frequency": "Weekly",
"gross_annual_income_usd": 78000
},
"previous_employer": {
"employer": "Copper Basin Mechanical Contractors",
"job_title": "Field Service Technician",
"dates": "2019-05 to 2026-07"
},
"other_income": "None",
"total_gross_annual_income_usd": 78000,
"loan_request": {
"amount_usd": 20000,
"term_months": 48,
"purpose": "Debt consolidation",
"funds_to": "My checking account (connected below)"
},
"loans_taken_in_last_60_days_not_on_credit_report": "None",
"existing_customer": "No"
},
"identity_verification": {
"name_ssn_dob_address": "Match: name, SSN, date of birth and address appear together in credit-header records since 2022",
"identity_first_reported": "2011-02",
"ssn": "Valid; issued 1993 to 1994, before randomization, consistent with the date of birth; 1 name and 1 date of birth associated; no Death Master File match",
"address_history": [
{
"address": "1640 S Ocotillo Bend, Apt 207, Mesa, AZ 85210",
"first_reported": "2022-09",
"last_reported": "2026-09",
"sources": 5
},
{
"address": "Tempe, AZ 85281",
"first_reported": "2016-08",
"last_reported": "2022-08",
"sources": 4
}
],
"phones_in_identity_records": [
{
"phone": "(480) 555-0163",
"type": "Mobile",
"first_reported": "2015-06",
"last_reported": "2026-09"
}
],
"emails_in_identity_records": [
{
"email": "kbrannigan93@example.com",
"first_reported": "2012-10",
"last_reported": "2026-09"
}
],
"application_phone": "(480) 555-0163: in this identity's records since 2015",
"application_email": "kbrannigan93@example.com: in this identity's records since 2012",
"email_check": {
"first_seen": "2012-10-03",
"domain_type": "Free webmail",
"name_match": "Partial name match",
"appears_in_known_data_breaches": 2,
"deliverable": true,
"risk_score": {
"score": 96,
"scale": "0-999, higher is riskier",
"reasons": [
"Long history"
]
}
},
"phone_check": {
"line_type": "Mobile (prepaid)",
"carrier": "Prepaid brand on a major U.S. network",
"first_seen": "2015-06",
"subscriber_name": "KYLE BRANNIGAN (carrier record)",
"ported_last_90_days": false,
"sms_one_time_code": "Delivered and entered correctly",
"risk_score": {
"score": 214,
"scale": "0-999, higher is riskier",
"reasons": [
"Prepaid line"
]
}
},
"identity_theft_score": {
"score": 71,
"scale": "0-999, higher is riskier",
"reasons": [
"No significant reasons"
]
}
},
"credit_file": {
"pulled_at": "2026-10-07T18:01:50Z",
"pull_type": "Hard inquiry, with the applicant's consent, for this loan",
"file_created": "2011-02",
"name_on_file": "KYLE D BRANNIGAN",
"also_known_as": [],
"employment_on_file": "COPPER BASIN MECHANICAL CONTRACTORS (reported 2023-06)",
"score": {
"model": "Generic risk score, 300-850",
"value": 664,
"factors": [
"Proportion of balances to credit limits on revolving accounts is too high",
"Recent increase in revolving balances",
"Too many inquiries in the last 12 months"
]
},
"alerts_and_freezes": {
"fraud_alert": "None",
"security_freeze": "None",
"active_duty_alert": "None"
},
"summary": {
"file_age_years": 15,
"tradelines_total": 6,
"tradelines_open": 4,
"authorized_user_tradelines": 0,
"revolving_limit_usd": 18500,
"revolving_balance_usd": 14440,
"revolving_utilization_pct": 78.1,
"installment_balance_usd": 10605,
"monthly_payments_on_file_usd": 786,
"accounts_opened_last_6_months": 0,
"accounts_opened_last_12_months": 0,
"hard_inquiries_last_30_days": 2,
"hard_inquiries_last_90_days": 2,
"hard_inquiries_last_12_months": 2,
"late_payments_last_24_months": 0,
"collections": 0,
"public_records": 0
},
"tradelines": [
{
"creditor_type": "Auto loan (credit union)",
"account": "x0417-L1",
"ownership": "Individual",
"opened": "2023-06",
"original_amount_usd": 26000,
"term_months": 60,
"monthly_payment_usd": 498,
"balance_usd": 10605,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC"
},
{
"creditor_type": "Bank credit card",
"account": "x7710",
"ownership": "Individual",
"opened": "2013-03",
"credit_limit_usd": 6000,
"balance_usd": 4960,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
4960,
3820,
2140,
1223,
1347,
"… 19 more in ambiguous.json"
]
},
{
"creditor_type": "Credit union credit card",
"account": "x0522",
"ownership": "Individual",
"opened": "2016-08",
"credit_limit_usd": 4500,
"balance_usd": 3610,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
3610,
2955,
1310,
697,
1231,
"… 19 more in ambiguous.json"
]
},
{
"creditor_type": "Bank credit card",
"account": "x5528",
"ownership": "Individual",
"opened": "2022-02",
"credit_limit_usd": 8000,
"balance_usd": 5870,
"status": "Open, current",
"last_reported": "2026-09",
"payment_history_24m_newest_first": "CCCCCCCCCCCCCCCCCCCCCCCC",
"statement_balances_24m_newest_first": [
5870,
4410,
2280,
1401,
1742,
"… 19 more in ambiguous.json"
]
},
{
"creditor_type": "Unsecured personal loan (online lender)",
"account": "x3360",
"ownership": "Individual",
"opened": "2021-02",
"closed": "2023-12",
"original_amount_usd": 6000,
"term_months": 36,
"monthly_payment_usd": 198,
"balance_usd": 0,
"status": "Closed, paid as agreed",
"last_reported": "2023-12"
},
{
"creditor_type": "Education loan (trade school)",
"account": "x8812",
"ownership": "Individual",
"opened": "2012-08",
"closed": "2019-04",
"original_amount_usd": 9400,
"term_months": 96,
"monthly_payment_usd": 104,
"balance_usd": 0,
"status": "Closed, paid as agreed",
"last_reported": "2019-04"
}
],
"inquiries_last_24_months": [
{
"date": "2025-02-19",
"industry": "Bank credit card"
},
{
"date": "2026-10-01",
"industry": "Personal loan (online lender)"
},
{
"date": "2026-10-03",
"industry": "Personal loan (online lender)"
}
]
},
"employment_verification": {
"employment_database": {
"searched_at": "2026-10-07T18:01:52Z",
"result": "Employer not found",
"detail": "No record for DRY WASH HEATING & COOLING LLC (the database covers employers whose payroll provider reports to it; many small employers aren't covered)"
},
"previous_employer_in_database": {
"employer": "COPPER BASIN MECHANICAL CONTRACTORS",
"employee": "KYLE D BRANNIGAN, SSN matches",
"status": "Inactive",
"hire_date": "2019-05-13",
"last_day": "2026-07-17",
"job_title": "Field Service Technician",
"base_pay": "$30.75 an hour",
"annual_gross_pay_usd": {
"2024": 66112.08,
"2025": 69480.55,
"2026_to_date": 40862.31
}
},
"stated_vs_database": "No current-employer record. Stated $78,000 is 12% above the previous employer's 2025 pay",
"employer_checks": {
"business_registry": "Dry Wash Heating & Cooling LLC: active, formed 2023-02-14; member and organizer Ruben A. Salcido; principal address a single-family home in Gilbert, AZ",
"contractor_license": "Active residential air-conditioning contractor license since 2023-04; no complaints on file",
"web_presence": "Website domain registered 2023-03; map listing with 23 customer reviews since 2023",
"listed_phone": "(480) 555-0155 on the website and map listing",
"employer_phone_on_application": "(480) 555-0155: matches the listed number; mobile line, carrier subscriber R. SALCIDO",
"link_to_applicant": "The applicant sent ZELLE TO RUBEN SALCIDO $60.00 on 2026-07-12, before the stated start date"
},
"verification_call": "Not attempted. We call employers only when the fraud screen holds an application for income verification."
},
"documents": {
"uploaded": [
{
"file": "paystub_sep19.pdf",
"pages": 1,
"produced_by": "A free online pay stub generator's standard template, 2026-10-07T04:14Z (21:14 MST on 2026-10-06)",
"modified": "Not modified after it was produced",
"tamper_findings": [],
"template_findings": [
"Layout matches a free online pay stub generator; small employers without payroll software use these, and so do fake-employer schemes",
"Employer EIN is in a valid format; it can't be checked against payroll records"
],
"extracted": {
"employer": "Dry Wash Heating & Cooling LLC, Gilbert, AZ (a residential address)",
"employee": "Kyle D Brannigan",
"employee_ssn_last4": "7731",
"employee_address": "Mesa, AZ 85210",
"pay_date": "2026-09-19",
"pay_period": "2026-09-08 to 2026-09-14",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular",
40,
37.5,
1500
]
]
},
"gross_pay_usd": 1500,
"deductions": {
"federal_income_tax_usd": 159,
"social_security_usd": 93,
"medicare_usd": 21.75,
"arizona_income_tax_usd": 30
},
"net_pay_usd": 1196.25,
"year_to_date": {
"gross_usd": 1500
},
"payment_method_on_stub": "Direct deposit"
}
},
{
"file": "paystub_sep26.pdf",
"pages": 1,
"produced_by": "A free online pay stub generator's standard template, 2026-10-07T04:16Z (21:16 MST on 2026-10-06)",
"modified": "Not modified after it was produced",
"tamper_findings": [],
"template_findings": [
"Layout matches a free online pay stub generator; small employers without payroll software use these, and so do fake-employer schemes",
"Employer EIN is in a valid format; it can't be checked against payroll records"
],
"extracted": {
"employer": "Dry Wash Heating & Cooling LLC, Gilbert, AZ (a residential address)",
"employee": "Kyle D Brannigan",
"employee_ssn_last4": "7731",
"employee_address": "Mesa, AZ 85210",
"pay_date": "2026-09-26",
"pay_period": "2026-09-15 to 2026-09-21",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular",
40,
37.5,
1500
],
[
"Overtime",
2,
56.25,
112.5
]
]
},
"gross_pay_usd": 1612.5,
"deductions": {
"federal_income_tax_usd": 172.5,
"social_security_usd": 99.97,
"medicare_usd": 23.38,
"arizona_income_tax_usd": 32.25
},
"net_pay_usd": 1284.4,
"year_to_date": {
"gross_usd": 3112.5
},
"payment_method_on_stub": "Direct deposit"
}
},
{
"file": "paystub_oct3.pdf",
"pages": 1,
"produced_by": "A free online pay stub generator's standard template, 2026-10-07T04:19Z (21:19 MST on 2026-10-06)",
"modified": "Not modified after it was produced",
"tamper_findings": [],
"template_findings": [
"Layout matches a free online pay stub generator; small employers without payroll software use these, and so do fake-employer schemes",
"Employer EIN is in a valid format; it can't be checked against payroll records"
],
"extracted": {
"employer": "Dry Wash Heating & Cooling LLC, Gilbert, AZ (a residential address)",
"employee": "Kyle D Brannigan",
"employee_ssn_last4": "7731",
"employee_address": "Mesa, AZ 85210",
"pay_date": "2026-10-03",
"pay_period": "2026-09-22 to 2026-09-28",
"earnings": {
"columns": [
"type",
"hours",
"rate_usd",
"amount_usd"
],
"rows": [
[
"Regular",
40,
37.5,
1500
]
]
},
"gross_pay_usd": 1500,
"deductions": {
"federal_income_tax_usd": 159,
"social_security_usd": 93,
"medicare_usd": 21.75,
"arizona_income_tax_usd": 30
},
"net_pay_usd": 1196.25,
"year_to_date": {
"gross_usd": 4612.5
},
"payment_method_on_stub": "Direct deposit"
}
}
],
"consistency": "Arithmetic is consistent on all three (hours times rate, year-to-date sums, Social Security 6.2%, Medicare 1.45%, Arizona withholding 2.0%). Net pay matches each Zelle payment from the employer to the cent. All three stubs were produced within 5 minutes on the night before the application, 3 to 17 days after their pay dates, and say 'Direct deposit' though the money came by Zelle.",
"id_document": "Not collected at submission. Document and selfie verification runs only when the fraud screen holds an application for identity verification."
},
"connected_bank_account": {
"linked_at": "2026-10-07T17:59:04Z",
"link_method": "Instant account link: the applicant signed in to the credit union's online banking",
"used_for": "Income verification, the loan funds, and autopay of the loan",
"institution": "Credit union, Arizona",
"account": "Checking x0417, opened 2016-08",
"owner_on_account": {
"names": [
"KYLE D BRANNIGAN"
],
"address": "1640 S Ocotillo Bend, Apt 207, Mesa, AZ 85210",
"email": "kbrannigan93@example.com",
"phone": "(480) 555-0163"
},
"owner_match_to_application": {
"name": "Match",
"address": "Match",
"email": "Match",
"phone": "Match"
},
"income_detected": [
{
"payer": "COPPER BASIN MECH PAYROLL",
"type": "Payroll (ended)",
"frequency": "Every two weeks",
"deposits_90_days": 2,
"first": "2026-07-09",
"last": "2026-07-23",
"average_usd": 2282.46,
"total_90_days_usd": 4564.92
},
{
"payer": "AZ DES UI BENEFITS",
"type": "Unemployment benefits (ended)",
"frequency": "Weekly",
"deposits_90_days": 6,
"first": "2026-08-04",
"last": "2026-09-08",
"average_usd": 373.33,
"total_90_days_usd": 2240
},
{
"payer": "ZELLE FROM DRY WASH HEATING & COOLING LLC",
"type": "Person-to-person transfer from a business account; not classified as payroll",
"frequency": "Weekly",
"deposits_90_days": 3,
"first": "2026-09-19",
"last": "2026-10-03",
"average_usd": 1225.63,
"total_90_days_usd": 3676.9
}
],
"income_from_stated_employer": "Three weekly Zelle payments from DRY WASH HEATING & COOLING LLC's business account since 2026-09-19, each equal to a stub's net pay; no payroll (ACH) deposits from it",
"other_lender_activity": "Auto loan payments to x0417-L1. No loan disbursements in.",
"current_balance_usd": 3191.77,
"average_daily_balance_90_days_usd": 3530.87,
"lowest_balance_90_days_usd": 2279.17,
"overdrafts_or_nsf_90_days": 0,
"cash_flow_by_month": {
"columns": [
"month",
"credits_usd",
"debits_usd"
],
"rows": [
[
"2026-07 (from 07-09)",
4564.92,
2241.09
],
[
"2026-08",
2800,
3385.09
],
[
"2026-09",
3620.65,
3780.84
],
[
"2026-10 (to 10-06)",
1196.25,
1894.9
]
]
},
"transactions": {
"note": "Posted items 2026-07-09 to 2026-10-06 from the account link; debits negative; balance computed back from the current balance",
"columns": [
"posted",
"description",
"amount_usd",
"category",
"balance_usd"
],
"rows": [
[
"2026-07-09",
"COPPER BASIN MECH PAYROLL PPD",
1946.52,
"Income: payroll",
4258.39
],
[
"2026-07-12",
"CRICKET WIRELESS",
-55,
"Phone",
4203.39
],
[
"2026-07-12",
"ZELLE TO RUBEN SALCIDO",
-60,
"Transfer out: P2P",
4143.39
],
[
"2026-07-13",
"FILIBERTOS #44 MESA AZ",
-31.11,
"Restaurants",
4112.28
],
[
"2026-07-14",
"NETFLIX.COM",
-15.49,
"Subscriptions",
4096.79
],
"… 104 more in ambiguous.json"
]
}
},
"device_and_session": {
"device_id": "dev_c3d1885e07fa",
"device_type": "Mobile phone",
"os": "Android 16",
"browser": "Chrome 141",
"language": "en-US",
"timezone": "America/Phoenix",
"local_time_at_submission": "2026-10-07T11:01:47-07:00",
"ip_address": "198.51.100.77",
"ip_type": "Mobile carrier",
"ip_location": "Phoenix metro, AZ",
"distance_from_home_address_miles": "Under 25 (carrier region)",
"proxy_vpn_tor_or_hosting": "None detected",
"fingerprint_integrity": "Consistent; no spoofing detected",
"remote_access_software": "None detected",
"first_seen_at_our_bank": "This session",
"duration_seconds": 638,
"median_duration_seconds_for_this_form": 690,
"fields_typed": 9,
"fields_pasted": 0,
"fields_autofilled": 5,
"times_left_page": 0,
"events": {
"columns": [
"offset_s",
"page",
"field",
"event",
"detail"
],
"rows": [
[
0,
"Your loan",
"",
"page_view",
""
],
[
77.8,
"Your loan",
"loan_amount",
"typed",
"5 characters in 1.1 s, 0 corrections"
],
[
79.9,
"Your loan",
"term",
"selected",
"48 months"
],
[
82.5,
"Your loan",
"purpose",
"selected",
"Debt consolidation"
],
[
85.1,
"About you",
"",
"page_view",
""
],
"… 22 more in ambiguous.json"
]
}
},
"velocity_and_consortium": {
"our_bank_last_90_days": {
"same_device_other_applications": 0,
"same_phone_or_email_other_applications": 0,
"same_ip_other_applications_last_30_days": 0,
"same_bank_account_other_applications": 0,
"same_address_other_applications": 0
},
"lending_consortium": {
"applications_with_this_ssn": {
"last_7_days": 1,
"last_30_days": 2,
"last_90_days": 2
},
"recent": {
"columns": [
"date",
"member_type",
"product",
"same_phone",
"same_email",
"… 4 more in ambiguous.json"
],
"rows": [
[
"2026-10-01",
"Online lender",
"Personal loan",
true,
true,
"… 4 more in ambiguous.json"
],
[
"2026-10-03",
"Online lender",
"Personal loan",
true,
true,
"… 4 more in ambiguous.json"
]
]
},
"this_bank_account_with_other_names_or_ssns_last_30_days": 0,
"this_phone_or_email_with_other_names": 0,
"confirmed_fraud_reports_on_this_ssn": 0
}
},
"rules_fired": [
{
"rule": "LN-201",
"description": "Current employer not found in the employment database"
},
{
"rule": "LN-203",
"description": "Under 90 days at current employer"
},
{
"rule": "LN-221",
"description": "Income deposits by person-to-person transfer, not payroll"
},
{
"rule": "LN-306",
"description": "Pay stub matches an online generator template"
},
{
"rule": "LN-308",
"description": "Pay stubs produced more than 3 days after their pay dates"
},
{
"rule": "LN-312",
"description": "2 or more personal loan inquiries in 14 days"
},
{
"rule": "LN-318",
"description": "Revolving utilization above 75%, up from under 30% in 6 months"
},
{
"rule": "LN-415",
"description": "Stated income differs by more than 5% from another application in 30 days ($86,000 on 2026-10-01)"
}
],
"decision_request": {
"stage": "Fraud screen before the credit decision; all automated checks returned",
"requested_at": "2026-10-07T18:01:56Z",
"next_step": "Credit decision by our underwriting model and policy, then a signed loan agreement; funds go out by ACH the next business day after signing."
}
},
"questions": {
"fraud_likelihood": {
"type": "score",
"instructions": "How likely is it that this application is fraudulent: made with a stolen or synthetic identity, or with the income, employment, documents, debts or bank account misrepresented to get credit? Judge the honesty of the application, not whether the applicant could repay a loan made on true facts.",
"criteria": [
"Very unlikely (under 10%)",
"Unlikely (10-40%)",
"Uncertain (40-60%)",
"Likely (60-90%)",
"Very likely (over 90%)"
]
},
"problems": {
"type": "multi_choice",
"instructions": "Which of these problems does the evidence show in this application? Choose every one that applies, and none if none does.",
"criteria": {
"income_overstated": "The stated income, from all sources together, is more than about 15% above what pay records, deposits or tax records support, comparing gross pay with gross pay",
"employer_unverifiable": "No source independent of the applicant (employment or payroll records, or a phone number found independently) confirms that the person named on the application works for the stated employer, or those sources contradict it",
"document_altered": "A pay stub, bank statement, tax form or ID the applicant uploaded was edited after it was produced, or is fabricated",
"stolen_identity": "Someone is applying as a real person without that person's knowledge",
"synthetic_identity": "The identity is fabricated from a mix of real and invented details, with a credit file built recently or on strangers' authorized-user cards",
"loan_stacking": "The applicant has taken out or applied for several other loans or cards in the last 30 days, beyond normal rate shopping, and hasn't disclosed them",
"bank_account_not_applicants": "The bank account connected to verify income, or chosen to receive the loan, belongs to someone other than the person named on the application"
}
},
"income_supported": {
"type": "noul",
"instructions": "Do the deposits in the applicant's connected bank account support the income stated on the application? Take-home pay is usually 65 to 80 percent of gross pay. Answer no if deposits from the stated sources are clearly lower than the stated income would produce, come from a different payer, or aren't in an account the applicant owns."
},
"action": {
"type": "choice",
"instructions": "This is the fraud screen before the credit decision, not the credit decision itself. What should the fraud screen do with this application now?",
"criteria": {
"proceed": "Proceed: send the application on to the credit decision with no fraud hold",
"verify_income": "Verify income: hold the application until income and employment are confirmed independently, by a call to the employer at a number we find ourselves, a payroll account connection, or IRS tax transcripts (Form 4506-C)",
"verify_identity": "Verify identity: hold the application until the applicant passes document and selfie verification and confirms the application at a phone number from the credit file, not the one on the application",
"decline": "Decline the application for fraud"
}
}
}
}The response. Probabilities and confidence are shortened to four decimals here, and the score to three; responses carry full precision.
{
"id": "dec_120f7bf8464042aeba003ac19511c7db",
"model": "grayson-1",
"answers": {
"fraud_likelihood": {
"type": "score",
"score": 0.771,
"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.5819,
"probabilities": {
"0": 0.6655,
"1": 0.1485,
"2": 0.0258,
"3": 0.0701,
"4": 0.0901
}
},
"problems": {
"type": "multi_choice",
"multi_choice": [
"employer_unverifiable"
],
"probabilities": {
"income_overstated": 0.2689,
"employer_unverifiable": 0.8176,
"document_altered": 0.2689,
"stolen_identity": 0.0097,
"synthetic_identity": 0.0015,
"loan_stacking": 0.0851,
"bank_account_not_applicants": 0.0005
}
},
"income_supported": {
"type": "noul",
"noul": 0.1067
},
"action": {
"type": "choice",
"choice": "proceed",
"confidence": 0.7579,
"probabilities": {
"proceed": 0.8184,
"verify_income": 0.1255,
"verify_identity": 0.0038,
"decline": 0.0523
}
}
},
"usage": {
"input_tokens": 12962,
"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 application: senddeclineabove a high bar to your fraud decline flow,verify_incomeandverify_identityto those queues, and everything else to the credit decision. When no option is clearly ahead, verify rather than decline.problemstells the reviewer what to check and gives you the reason to record: an edited pay stub or a mismatched bank account calls for different follow-up than an employer nobody has confirmed yet.fraud_likelihoodorders your review queue: add the "Likely" and "Very likely" probabilities and sort on the sum.
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
Each rule on its own fires on good applicants all the time: a stated income above the employment database, a new phone, a recent move, a cluster of inquiries. The applications that are really fraudulent tend to pass the identity match, because the name, SSN and address are real. What gives them away is how the pieces fit: whether the deposits come from the stated employer, whose name is on the bank account, when and how the pay stubs were made.
What to send
Send the application with everything your checks return before the credit decision. The examples send about 13,000 to 17,000 input tokens each.
- The application as submitted. Stated income by source, employer and employer phone, loan amount, purpose and where the funds go.
- The identity match, and whether the phone and email belong to the identity. A stolen identity passes the name, SSN and address match but brings new contact details.
- The credit file and its alerts. Under the Fair Credit Reporting Act, a fraud alert on the file means you must take reasonable steps to verify identity before extending credit, at the consumer's phone number if the alert gives one. Recent inquiries and new accounts show loan stacking.
- Employment database and employer checks. What the database shows for each employer, and whether the employer phone on the application is the employer's listed number.
- Document analysis. Edits after production, which tool produced each stub, and whether taxes and year-to-date figures agree with the stated pay.
- The connected bank account. The owner's name and contact details, detected income, and 90 days of transactions: deposits from the stated employer, and loan money arriving and leaving.
- Device and velocity. The same device, phone, email or bank account on other applications under other names.
Add your own policy
Many lenders require independent proof of income above certain loan amounts or income gaps, whatever the fraud evidence shows. Put that standard in the request and Grayson applies it alongside its own judgment.
Your income verification standard adds this to the state of the legitimate example:
{
"income_verification_standard": "Personal loan income verification standard (rev. 2026-07): For any loan of $15,000 or more, when the stated total income is more than 20% above the employment database's annualized base pay for the primary employer, hold the application for income verification before the credit decision. Deposits in a connected bank account and pay stubs uploaded by the applicant don't satisfy this standard, however consistent they are. It is satisfied only by the employment database for each employer, IRS tax transcripts through Form 4506-C, or a call to each additional employer at a number we find ourselves. Apply this whatever the fraud evidence shows; it is a documentation requirement, not a fraud finding."
}| Question | Without | With your income verification standard |
|---|---|---|
fraud_likelihood | 0.03 of 4, confidence 98% | 0.04 of 4, confidence 97% |
problems | None at 50% or more | None at 50% or more |
income_supported | 98% true | 98% true |
action | proceed, confidence 98% | verify_income, confidence 68% |
In the likely-legitimate example, the nurse asks for $18,500 and her stated $104,000 is 27% above the database's base pay for her main job. Her deposits and stubs show the second job, but under this standard they don't count, so the action moves from proceed to verify income, while the fraud likelihood stays very low and the deposits still support her income.
Where to call it
- After the credit pull, document analysis and account link return, and before the credit decision or any offer.
- Again after a hold, with the verification result added to the state, so the same screen makes the final call.
- Before the funds go out, if the bank account for the funds changes after approval.
Cost and latency
| Example | Input tokens | Per decision | Per 1,000 decisions | Latency |
|---|---|---|---|---|
| Obvious | 15,392 | $0.00054 | $0.54 | 236 ms |
| Legitimate | 16,952 | $0.00059 | $0.59 | 302 ms |
| Ambiguous | 12,962 | $0.00045 | $0.45 | 285 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/loan-application-fraud/questions.json --label fraud_likelihood=<column> --label problems=<column> --label income_supported=<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%)"problems: option keys separated by|(income_overstated,employer_unverifiable,document_altered,stolen_identity,synthetic_identity,loan_stacking,bank_account_not_applicants)income_supported:trueorfalseaction:proceed,verify_income,verify_identity,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
Does it work for credit cards and small-business loans?
Yes. The questions don't depend on the product, so send what your application and checks hold for it. For a credit card there is often no connected bank account, so income_supported relies on what you do have; for a small-business loan, add the business's registration, its bank statements and the owners' identity checks, as in the business onboarding recipe.
Can it catch loan stacking when the other new loans aren't on the credit report yet?
Only from what you send. New loans take weeks to appear on a credit report, so send what shows sooner: inquiries, lending consortium applications with the same SSN, and loan money arriving in the connected account. Grayson weighs these against the applicant's answer about recent loans.
What do we tell an applicant we decline?
A declined credit applicant is still owed an adverse action notice under the Equal Credit Opportunity Act and Regulation B, with the specific principal reasons. Regulation B's sample notice includes reasons such as "unable to verify income" and "unable to verify employment", and problems helps you choose the accurate one. Your compliance team decides the wording.
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 business onboarding (KYB) applications
Approve, approve with limits, request documents or decline a business applying for card processing or another business product.
Recipes
Every use case, with its questions and cost per decision.
Business onboarding
Grayson reviews a small business's application for card processing, checks that the business is real and sells what it says, scores shell, impersonation and bust-out risk, and picks approve, approve with limits, request documents or decline.
AML and sanctions
Transaction monitoring alerts, money mule accounts and sanctions and watchlist screening. Ready-to-run Grayson recipes with real responses, cost and latency.