OTP is not fraud detection.
Digital payments in South Asia are growing 40-50% year over year. Fraud is growing faster. SIM swaps, social engineering, money mule networks, authorized push payment fraud — attacks that OTP was never designed to stop.
OTP answers one question: do you have this phone number? It says nothing about the device, the behavior, the timing, the recipient, or the pattern. When an attacker swaps your SIM, OTP helps them. When a victim is socially engineered into reading their OTP aloud, OTP is irrelevant.
Most payment companies rely on blanket rules — block everything above a threshold, require OTP for every transaction, freeze accounts after failed logins. These rules block legitimate users as often as they block fraudsters.
Rs 50L+
Lost to fraud annually by a single mid-size PSP
73%
of fraud bypasses OTP-only protection
5-10x
higher false positive rates with rule-based systems
Flint replaces blanket rules with intelligent, per-transaction decisions. 90% of users experience zero friction. Fraudsters get blocked before money moves.
Score a transaction. See the logic.
Adjust the parameters below and watch how the risk score changes. This is a simplified version of the scoring logic. The production engine uses 50+ signals and per-user behavioral profiles.
Low risk: Trusted device attempting Rs 5,000 transfer at 2:00 PM. Transaction proceeds without friction.
Drop it into your stack
Add our SDK to your app, add one API call to your backend. If Flint disappears tomorrow, your system works exactly as before. Device fingerprinting SDKs are open source under the MIT license — read every line on GitHub.
// 1. Add SDK to your app (one time)
// <script src="https://cdn.flintsecure.app/v1/fp.js"></script>
// 2. Get device fingerprint
const fp = await FlintFP.load({ apiKey: 'YOUR_KEY' })
const { fingerprint } = await fp.get()
// 3. Score transaction before processing
const response = await fetch('https://api.flintsecure.app/v1/score', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sender_id: user.id,
amount: 5000,
device_fingerprint: fingerprint,
receiver_id: recipient.id
})
})
const { decision } = await response.json()
// 4. Act on the decision
if (decision === 'ALLOW') processPayment()
if (decision === 'FLAG') requestOTP()
if (decision === 'BLOCK') rejectTransaction()Fail-Open by Design
If Flint is slow or down, your transactions proceed normally. We set a 150ms timeout. If we don't respond, your system continues as if Flint doesn't exist. Flint can never cause a payment to fail.
Zero Infrastructure Change
No database changes. No code rewrites. No infrastructure to manage. Add a few lines of code to your app and backend. Everything runs on Flint's infrastructure. Remove it anytime.