Product
One tap surface.
Several rails beneath it.
The agent presses one button. TapProof decides which rail can actually carry the amount, whether the device is fit to transact, and whether the visit is permitted at all.
Rails
Why the card rail matters
UPI reaches RuPay credit only. Visa and Mastercard credit — the bulk of India's card base — cannot pay over UPI at all. Wherever the customer is standing in front of you with a card, that gap is the whole reason a card rail exists.
Amount
₹2,000
3 of 4 rails available
- Card · tapno PIN required at this amount
- UPI · intentavailable at any amount within UPI limits
- UPI Lite · tappre-funded, works offline
- Card · tap + PINphase two — PIN on glass is not certified yet
The ₹5,000 no-PIN contactless ceiling is unchanged since 1 January 2021 (RBI DPSS.CO.PD No.752/02). Phase one launches below it, which covers the great majority of doorstep, delivery and field-service transactions.

One surface, several rails
The operator presses one button.
We decide what can carry it.
Amount, merchant configuration and connectivity choose the rail. The app renders what it is told — it never invents policy of its own.
At the door
What happens in the twenty seconds that matter
Your operator is standing in front of a customer. Every decision below is made before the card is presented, so nothing fails in front of the person paying.

Is this device fit?

Is this visit permitted?

Which rail can carry it?

The twenty seconds that decide everything
At the door
Nothing fails in front of the customer
Every check that could refuse has already run by the time the card comes out. What is left is a tap.
A terminal that declines after the card is presented has already cost you the moment — and, often, the customer’s patience. TapProof front-loads every decision it can, so the only thing that can happen at the card is the payment.
Two shapes
Ships as an SDK and as an app, from one codebase
A fix in the standalone app is a fix for every embedding partner in the same release. There is deliberately one payment implementation, not two.
Drops into an app you already ship
An Android AAR for your collections or delivery app. You own authentication and hand TapProof a short-lived token — your agent never logs in twice.
val collect = rememberLauncherForActivityResult(TapProofContract()) {
when (it) {
is Approved -> markCollected(it.rrn, it.amountPaise)
is Declined -> offerAnotherCard(it.reason)
is Cancelled -> Unit
is Failed -> showError(it.message)
}
}
collect.launch(CollectRequest(amountPaise = 250_000))For a field force with no app of its own
Distributed through managed Google Play as a private app under Android Enterprise, which also gives the fleet MDM, forced updates and remote wipe.
That is deliberate. Play Integrity returns strong verdicts for Play-installed apps and weak ones for sideloads, and TapProof fails closed on a weak verdict. A rooted or tampered handset cannot open a payment session.
Device policy
Android 10+ with NFC. Enrolled against a hardware-backed keystore identity, re-attested on a four-hour heartbeat, hard-failed at twenty-four.
