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). Ondalık ayırıcı nokta, binlik ayırıcı YOK: 6000 veya 6000.50. Türkçe biçim (6.000,50) 422 döner. |
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",
"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) | not_a_receipt (dekont değil — verdict undetermined, ücretlendirilmez) | engine_error (sistem hatası, HTTP 500).
parsed ve verify alanları veriye göre null olabilir.
name/amount/iban
alanlarından yalnızca birini gönderirseniz, göndermediğiniz alanlar da false döner
(null değil) ve bu yüzden verify.overall da false olur.
Bu bir hata göstergesi değildir. Yalnızca gönderdiğiniz alanın kendi sonucuna bakın
(ör. sadece isim doğruluyorsanız verify.name_match), overall alanını
ancak üç alanı birlikte gönderdiğinizde kullanın. verify.issues listesinde de
göndermediğiniz alanlar için bilgilendirici satırlar görebilirsiniz.verdict| Değer | Anlamı | Önerilen aksiyon |
|---|---|---|
| confirmed_fake | Dekont kesin olarak sahte/oynanmış | Reddet |
| suspicious | Sahtecilik bulguları var — kesin değil | Manuel incele |
| clean | Sahtecilik bulgusu yok | Kabul edilebilir |
| undetermined | Analiz için yeterli veri yok (ör. taranmış görüntü) | Manuel incele |
verdict tek karar alanınızdır: clean kabul edilebilir, suspicious incelenmeli, confirmed_fake reddedilmeli, undetermined yeterli veri yok.
status, sonra verdict.
status="not_a_receipt" geldiğinde sahtecilik analizi hiç yapılmaz ve
verdict daima undetermined döner. Bunu "manuel incele" diye ele almayın —
doğru aksiyon müşteriden ödemeye ait dekontu istemektir. Aynı şekilde
status="engine_error" geldiğinde verdict'e güvenmeyin, isteği tekrarlayın.
Karar akışı: status not_a_receipt/engine_error ise özel olarak ele al,
değilse verdict'e göre karar ver.clean, yapılan analizlerde
sahtecilik bulgusu olmadığını 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 kesin sahte mi
"name_match": true,
"iban_match": null
},
"receipts": [
{
"filename": "dekont1.pdf",
"status": "ok",
"verdict": "clean",
"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",
"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) |
not_a_receipt | Yüklenen belge dekont değil (hesap hareketi/ekstre ya da tamamen ilgisiz bir belge). Sahtecilik kontrolü yapılmaz, verdict undetermined döner ve ücretlendirilmez. Müşteriden dekont isteyin. |
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 (not_a_pdf) |
401 | API anahtarı geçersiz (invalid_api_key) |
402 | Bakiye yetersiz (insufficient_balance) — ön ödemeli hesaplarda bakiye izin verilen sınıra indi. Bakiye yükleyene kadar kontrol yapılmaz. Entegrasyonunuzda bu kodu mutlaka ele alın. |
403 | Anahtar veya hesap pasif |
404 | Böyle bir uç yok — adresi kontrol edin |
413 | PDF 15 MB'den büyük |
422 | Parametre doğrulama hatası — eksik/hatalı alan da bu kodu döner (ör. file gönderilmemiş, amount sayıya çevrilemiyor) |
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.