Bank Statement Fraud Detection API
Detect altered, manipulated, and synthetic bank statements using structured risk signals and behavioral anomaly detection.
Analyze bank statements for manipulation, synthetic income, balance tampering, and behavioral risk signals. Designed for lenders, fintech platforms, and forensic teams.
Quick start (fraud detection)
Fraud analysis runs after a bank statement job completes. Upload a document, create a bank statement job, then request fraud signals for that document.
bash
# 1. Upload a bank statement (same as Bank Statement OCR API)
curl -X POST "https://www.docuclipper.com/api/v1/protected/document" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "document=@statement.pdf"
# 2. Create a bank statement job, wait for status=Succeeded (or use webhooks)
# 3. Get fraud signals for the document (after job completes, fraud analysis runs)
curl -X GET "https://www.docuclipper.com/api/v1/protected/document/DOCUMENT_ID/fraudSignals" \
-H "Authorization: Bearer YOUR_API_KEY"Or, if you already have a processed documentId:
bash
# Get fraud signals for a processed document
curl -X GET "https://www.docuclipper.com/api/v1/protected/document/DOCUMENT_ID/fraudSignals" \
-H "Authorization: Bearer YOUR_API_KEY"Response shape
json
// GET /protected/document/:documentId/fraudSignals (200)
{
"total": 3,
"signals": [
{
"id": 1,
"documentId": 12345,
"type": "balance_tampering",
"confidence": 0.92,
"reasonCode": "BALANCE_MISMATCH",
"metadata": { "expected": 5000, "stated": 12000 }
},
{
"type": "synthetic_income",
"confidence": 0.78,
"reasonCode": "REPEATED_DEPOSIT_PATTERN"
}
],
"score": {
"documentId": 12345,
"authenticityScore": 67,
"riskLevel": "medium"
}
}Full example (no SDK)
Complete flow: upload → create bank job → poll until Succeeded → GET /protected/document/:documentId/fraudSignals.
javascript
const fs = require('fs');
const BASE = 'https://www.docuclipper.com/api/v1';
const API_KEY = process.env.DOCUCLIPPER_API_KEY;
const auth = (h = {}) => ({ Authorization: `Bearer ${API_KEY}`, ...h });
const form = new FormData();
form.append('document', new Blob([fs.readFileSync('statement.pdf')]), 'statement.pdf');
const up = await fetch(`${BASE}/protected/document`, { method: 'POST', headers: auth(), body: form });
const docId = (await up.json()).document.id;
const job = await fetch(`${BASE}/protected/job`, {
method: 'POST', headers: auth({ 'Content-Type': 'application/json' }),
body: JSON.stringify({ jobName: '', documents: [docId], enableBankMode: true })
});
const jobId = (await job.json()).id;
let status;
while ((status = (await fetch(`${BASE}/protected/job/${jobId}`, { headers: auth() }).then(r => r.json())).status) !== 'Succeeded') {
if (status === 'Failed') throw new Error('Job failed');
await new Promise(r => setTimeout(r, 2000));
}
const fraud = await fetch(`${BASE}/protected/document/${docId}/fraudSignals`, { headers: auth() });
const { signals, score } = await fraud.json();
console.log('Score:', score?.authenticityScore, 'Signals:', signals?.length);Query parameters (fraudSignals)
type– Filter signals by type (e.g. balance_tampering, synthetic_income).minConfidence/maxConfidence– Filter by confidence (0–1).limit/offset– Limit results (default limit 100).
Use cases
- Loan underwriting and income verification
- Fintech KYC and document authenticity checks
- Forensic accounting and dispute resolution
- Mortgage and tenant screening