POST /donate/chargeBlockedScript cycling cards on a $1 donation
- Same actor, 38 cards in 10 min
- Automation behind a real browser
- New proxy exit per attempt
Solution
A card testing attack is when bots run many small or zero-value payments on a merchant's site to learn which stolen card numbers are still valid, then use or sell the working ones elsewhere. Kavra recognizes the automation, proxies and repeated devices behind the attempts, so you stop them before they reach your payment processor.
POST /donate/chargeBlockedScript cycling cards on a $1 donation
Card testing, also called card checking and closely tied to carding, is how criminals find out which stolen card numbers still work. A list of cards bought on a criminal marketplace contains many that are expired, blocked or already reported. Testing sorts them: each card is tried with a tiny payment or a zero-value check, and the ones that are approved become far more valuable, either for resale or for bigger payment fraud somewhere else.
The merchant used for testing is rarely the final target. It is chosen because its checkout is easy to automate and each attempt is cheap: a donation form, a low-price digital item, a free trial that asks for a card, or an "add payment method" page. The attacker does not care about what they buy. They care about the answer from the issuer.
Attackers look for a payment step with no login, no rate limit and small amounts. Some skip the page entirely and call the payment endpoint the page uses.
A checker script takes a list of stolen cards, or generates candidates from one bank identification number in a BIN attack, cycling through card numbers, expiry dates and security codes.
Requests go out through residential proxies and fresh browser sessions, so no single IP address or cookie shows many tries.
Approvals, and even specific decline reasons, tell the script which cards are live. Some attacks run for minutes, others trickle for days to stay under alert thresholds.
Validated cards are sold at a premium or used for high-value purchases on other sites, while the testing merchant deals with the fallout.
Both hit your checkout the same way, but they start from different data. In classic card testing, the attacker already has full card records and only needs to know which ones are alive. In a BIN attack, the attacker has only the first digits that identify the issuing bank and guesses the rest, which produces huge volumes of declines with the occasional approval.
BIN attacks tend to be louder and more obviously scripted. Card testing with real card lists can look like a steady stream of normal small orders. Both are stopped the same way: by recognizing the actor and the automation, not by judging each card in isolation.
The amounts are small. The consequences are not.
| Cost | What happens | Why it hurts |
|---|---|---|
| Authorization fees | Many processors charge per attempt, approved or declined | Thousands of attempts add up to a real bill |
| Disputes and refunds | Cardholders notice small unknown charges and dispute them | Each dispute adds a fee and raises your dispute ratio |
| Processor relationship | Spikes in declines and fraud trigger reviews | Higher fees, rolling reserves, or a closed merchant account |
| Network monitoring | Card networks track merchants with excess fraud and disputes | Fines and remediation plans passed down by the acquirer |
| Lower approval rates | Issuers start to distrust your merchant ID | Real customers see more declines on good cards |
| Team time | Refunds, reconciliation, support tickets | Hours spent cleaning up after a weekend attack |
Attacks often start at night or on weekends, when nobody is watching the payment dashboard.
Decline rates jump, often with reasons like invalid number, wrong security code or expired card, outside your normal sales hours.
Clusters of the smallest donation amount, the cheapest item or zero-value card checks, with no other activity in the session.
Card numbers that share the first digits, or the same card tried with different expiry dates and codes.
Random names, mismatched billing addresses and disposable emails, changing on every attempt.
Sessions go straight to payment, fill the form at machine speed and leave, or call the payment API with no page view.
Each attempt arrives with a new IP and fingerprint, but the device underneath is the same.
Most merchants already run some of these checks. Each one covers a single layer, and checker scripts are tuned to slip between them.
| Defense | The gap attackers use |
|---|---|
| Per-IP rate limits | Residential proxy pools give every attempt a different home IP |
| Velocity rules per card | Each card is tried once or twice; the volume is across cards |
| CAPTCHA on checkout | Solving services pass it cheaply, and real buyers pay the friction |
| Minimum order amounts | Attackers move to zero-value checks or the add-card page |
| Processor fraud screening | It scores each card, but a clean stolen card still looks clean |
| Blocking by country | Proxies exit in your own market |
The cheapest place to stop card testing is before your server asks the processor anything. Every refused attempt then costs nothing and tells the attacker nothing.
How Kavra helps
Kavra checks every payment attempt with 3,000+ data points and gives your backend a clear verdict before you call the processor.
Headless browsers, stealth plugins and HTTP clients imitating browsers are caught by contradictions between what they claim and how they behave.
Fingerprint rotation is treated as a signal, so a device cycling through cards and disguises stays one actor with many attempts.
Kavra measures real exit IPs of commercial residential and mobile proxy networks, so rotating home IPs do not reset the count.
Signed, single-use, short-lived tokens tie each assessment to one payment action. Replays are refused and reported.
Surges of new devices, shared infrastructure and velocity anomalies reveal an attack in progress, even when it trickles slowly.
Refuse attempts before authorization, get webhooks during an attack, and start in observe-only mode to see it first.
FAQ
Something else? Talk to our team.
Small charges are the cheapest way to confirm a card works without alerting the cardholder or the bank. A one-dollar donation or a zero-value card check rarely stands out on a statement. Once a card is confirmed live, it is sold at a higher price or used for large purchases on other sites.
For approved test charges that are later disputed, the merchant usually bears the chargeback and fee. Declined attempts can still cost authorization fees. Beyond direct costs, high decline and dispute rates can lead your processor to raise fees, hold funds or close the account, so the practical liability falls on the merchant.
Usually yes, and quickly. Refunding confirmed test charges before the cardholder disputes them avoids chargeback fees and keeps them out of your dispute ratio. Then stop the source, because refunds do not prevent the next wave. Check your processor's guidance, since some recommend specific steps during an active attack.
Donation forms let the payer choose a tiny amount, often need no account or shipping address, and are built to be as frictionless as possible. That makes them ideal for fast automated attempts. Nonprofits also tend to have fewer fraud tools than large retailers, which attackers know.
Only after the fact. Payment data shows spikes in declines and small approvals, but by then the fees and issuer damage have happened. Device and network evidence identifies the bot and the repeat actor before the authorization request, so refused attempts never reach the processor at all.
Run Kavra on your own traffic in observe-only mode. No risk to your customers, and a clear report of the fraud it finds.