FraudOxidizer

Inspiration

Credit card fraud is boring to find manually. We wanted a tool that catches it before a human has to scroll through 1,000 rows of transactions wondering if QuickPay Online is supposed to charge $847.

What it does

Ingests a CSV of transactions and flags fraud across 4 patterns:

Pattern Description
Card Testing Micro-burst of online charges in under 30 min
Cashout Suspiciously large gift card / electronics purchase vs. card's normal spend
Merchant Ring One merchant overcharging multiple cards (invisible unless you look cross-card)
Impossible Travel Card used in-person in a country it's never been to

Each flag gets a human-readable reason and a combined fraud score (noisy-OR across signals). A reviewer queue lets you triage one transaction at a time: approve, dismiss, escalate.

How we built it

  • Rust backend (model + ui crates) for parsing, validation, and the reviewer interface
  • Jupyter notebook for exploratory analysis and visual validation of the 4 patterns
  • Per-card baselines use median + MAD — robust enough that a card that always shops at Best Buy won't self-incriminate

Challenges we ran into

The Merchant Ring pattern is invisible if you look at transactions card by card. Took us longer than we'd like to admit to zoom out. Also, Rust compile times are not a hackathon's best friend.

Accomplishments that we're proud of

Caught all 4 fraud patterns with zero hardcoded global thresholds — everything is relative to each card's own behavior. A stolen card that normally buys $800 TVs won't trip the cashout rule. One that usually buys coffee will.

What we learned

Cross-card aggregation is the unlock. Three of the four patterns are relatively clear; the Merchant Ring only shows up when you stop thinking per-card and start thinking per-merchant.

What's next for FraudOxidizer

  • Cost-aware tuning slider (false positive vs. missed fraud tradeoff)
  • See the behaviour on real data

Built With

Share this project:

Updates