Banka dekontu (PDF) sahtecilik analizi ve içerik doğrulama servisi.
PDF dekontu gönderirsiniz; sistem sahtecilik risk kademesini, dekonttan okunan bilgileri ve (isteğe bağlı) beklediğiniz isim/tutar/IBAN ile uyuşma sonucunu döner.
Her istekte size verilen API anahtarını Authorization header'ında gönderin:
Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
İçerik türü: multipart/form-data
| Alan | Zorunlu | Açıklama |
|---|---|---|
file | ✔ | Dekont PDF dosyası (max 15 MB). Yalnızca PDF kabul edilir. |
name | — | Beklenen alıcı adı (verilirse uyuşma kontrolü yapılır) |
amount | — | Beklenen tutar (TL) |
iban | — | Beklenen IBAN |
request_id | — | Kendi referansınız; yanıtta aynen döner |
curl -X POST https://slipscan.eu/v1/check \
-H "Authorization: Bearer dk_live_..." \
-F "file=@dekont.pdf" \
-F "name=Ahmet Yılmaz" \
-F "amount=1500" \
-F "iban=TR330006100519786457841326"
import requests
resp = requests.post(
"https://slipscan.eu/v1/check",
headers={"Authorization": "Bearer dk_live_..."},
files={"file": open("dekont.pdf", "rb")},
data={"name": "Ahmet Yılmaz", "amount": 1500, "iban": "TR33..."},
timeout=60,
)
print(resp.json())
{
"check_id": 1042,
"request_id": null,
"status": "ok",
"verdict": "clean",
"score": 0,
"is_image_based": false,
"parsed": {
"bank": "Ziraat",
"amount": 1500.0,
"iban": "TR33...",
"name": "Ahmet Yılmaz",
"date": "12/04/2026-17:49:51"
},
"verify": {
"name_match": true,
"amount_match": true,
"iban_match": true,
"overall": true,
"issues": []
},
"duration_ms": 320
}
status: ok | parse_failed (tutar/alan okunamadı, verdict yine geçerli) |
image_based_no_ocr (taranmış görüntü PDF) | engine_error (sistem hatası, HTTP 500).
parsed ve verify alanları veriye göre null olabilir.
verdict| Değer | Anlamı | Önerilen aksiyon |
|---|---|---|
| confirmed_fake | Dekont kesin olarak sahte/oynanmış | Reddet |
| high_risk | Güçlü sahtecilik bulguları | Reddet veya manuel incele |
| medium_risk | Şüpheli bulgular | Manuel incele |
| low_risk | Zayıf/tekil şüphe | İzle |
| clean | Sahtecilik bulgusu yok | Kabul edilebilir |
| undetermined | Analiz için yeterli veri yok (ör. taranmış görüntü) | Manuel incele |
score (0–100): risk puanı; 100 = confirmed_fake. Kademeler bu puandan türetilir.
clean, dekontun bankadan geldiğini garanti etmez;
sahtecilik tespit bulgularının temiz olduğunu ifade eder. Kritik tutarlarda
verify alanlarını da kontrol edin.Bir ödeme birden çok dekontla (parçalı havale) yapıldığında kullanılır. Tüm dekontları tek istekte gönderirsiniz; her biri sahtecilik açısından ayrı ayrı kontrol edilir, aynı dekont birden çok kez yüklenmişse (mükerrer) elenir ve geçerli dekontların tutarları toplanıp beklenen tutarla karşılaştırılır.
İçerik türü: multipart/form-data
| Alan | Zorunlu | Açıklama |
|---|---|---|
files | ✔ | Birden çok PDF (aynı alan adıyla tekrarlanır). En fazla 20 dekont. |
total_amount | — | Beklenen toplam tutar (₺). Verilirse dekont toplamıyla karşılaştırılır. |
name | — | Beklenen alıcı adı (her dekontta doğrulanır) |
iban | — | Beklenen IBAN |
request_id | — | Kendi referansınız |
curl -X POST https://slipscan.eu/v1/check-multi \
-H "Authorization: Bearer dk_live_..." \
-F "files=@dekont1.pdf" \
-F "files=@dekont2.pdf" \
-F "total_amount=24950" \
-F "name=Ahmet Yılmaz"
{
"request_id": null,
"summary": {
"receipt_count": 2,
"duplicate_count": 0,
"total_parsed": 24950.0, // geçerli dekontların toplamı
"expected_total": 24950.0,
"total_match": true, // toplam beklenenle uyuştu mu
"any_fake": false, // herhangi biri sahte/yüksek risk mi
"name_match": true,
"iban_match": null
},
"receipts": [
{
"filename": "dekont1.pdf",
"status": "ok",
"verdict": "clean",
"score": 0,
"is_image_based": false,
"is_duplicate": false,
"duplicate_of": null,
"parsed": { "bank": "TEB", "amount": 6000.0, "iban": "TR68...", "name": "...", "date": "..." }
},
{
"filename": "dekont2.pdf",
"status": "ok",
"verdict": "clean",
"score": 0,
"is_image_based": false,
"is_duplicate": false,
"duplicate_of": null,
"parsed": { "bank": "Ziraat", "amount": 18950.0, "iban": "TR24...", "name": "...", "date": "..." }
}
]
}
summary.total_match: total_amount verilmediyse null
döner. Mükerrer dekont bulunursa is_duplicate=true olur ve o dekont
total_parsed'a eklenmez (duplicate_of, aynı olduğu
dekontun sırasını belirtir). Her dekontun verdict değeri tekli kontroldeki
kademelerle aynıdır.
status| Değer | Anlamı |
|---|---|
ok | Analiz tamam |
parse_failed | PDF analiz edildi ama tutar/alan okunamadı (verdict yine geçerli) |
image_based_no_ocr | Metin çıkarılamadı (taranmış görüntü PDF) |
engine_error | Sistem hatası — tekrar deneyin (HTTP 500) |
GET /v1/usage?period=monthly
GET /v1/usage?period=custom&start=2026-07-01&end=2026-07-15
period: daily | weekly | monthly |
custom (custom ile start ve end zorunlu, YYYY-MM-DD).
Dönemin kontrol sayısı, hacmi ve günlük kırılımı döner.
{
"client_name": "Örnek Müşteri",
"period": { "type": "monthly", "start": "2026-07-01", "end": "2026-08-01" },
"check_count": 128, // dönemdeki toplam kontrol
"parse_failed_count": 2, // tutar/alan okunamayan kontrol
"kesin_fake_count": 5, // confirmed_fake sonucu sayısı
"volume": 1875400.0, // kontrol edilen dekont tutarları toplamı (₺)
"daily": [
{ "day": "2026-07-16", "check_count": 12, "volume": 154000.0 }
]
}
| HTTP | Anlamı |
|---|---|
400 | Geçersiz dosya (PDF değil) veya eksik alan |
401 | API anahtarı geçersiz |
403 | Anahtar veya hesap pasif |
413 | PDF 15 MB'den büyük |
422 | Parametre doğrulama hatası |
429 | Hız limiti aşıldı — bekleyip tekrar deneyin |
500 | Sistem hatası |
Hata gövdesi: {"detail": {"error": "<kod>"}}
GET /v1/health — auth gerektirmez, servis durumu döner.