Entegrasyon Dokümanı — v1

SlipScan API

Banka dekontu (PDF) sahtecilik analizi ve içerik doğrulama servisi.

Kimlik Doğrulama POST /v1/check Risk Kademeleri POST /v1/check-multi GET /v1/usage Hata Kodları Limitler

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.

Kimlik Doğrulama

Her istekte size verilen API anahtarını Authorization header'ında gönderin:

Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Anahtarınızı gizli tutun. Sızdığından şüpheleniyorsanız yeni anahtar talep edin — eski anahtar aynı anda geçersiz kılınır (hesap başına tek aktif anahtar).

POST /v1/check — Dekont Kontrolü

İçerik türü: multipart/form-data

AlanZorunluAçıklama
fileDekont PDF dosyası (max 15 MB). Yalnızca PDF kabul edilir.
nameBeklenen alıcı adı (verilirse uyuşma kontrolü yapılır)
amountBeklenen 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.
ibanBeklenen IBAN
request_idKendi referansınız; yanıtta aynen döner

Örnek — curl

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"

Örnek — Python

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())

Yanıt

{
  "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.

Kısmi doğrulama — dikkat. 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.

Sonuç Kademeleri — verdict

DeğerAnlamıÖnerilen aksiyon
confirmed_fakeDekont kesin olarak sahte/oynanmışReddet
suspiciousSahtecilik bulguları var — kesin değilManuel incele
cleanSahtecilik bulgusu yokKabul edilebilir
undeterminedAnaliz 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.

Önce 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.
Not: clean, yapılan analizlerde sahtecilik bulgusu olmadığını ifade eder. Kritik tutarlarda verify alanlarını da kontrol edin.

POST /v1/check-multi — Çoklu / Parçalı Dekont

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

AlanZorunluAçıklama
filesBirden çok PDF (aynı alan adıyla tekrarlanır). En fazla 20 dekont.
total_amountBeklenen toplam tutar (₺). Verilirse dekont toplamıyla karşılaştırılır.
nameBeklenen alıcı adı (her dekontta doğrulanır)
ibanBeklenen IBAN
request_idKendi referansınız

Örnek — curl

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"

Yanıt

{
  "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ğerAnlamı
okAnaliz tamam
parse_failedPDF analiz edildi ama tutar/alan okunamadı (verdict yine geçerli)
image_based_no_ocrMetin çıkarılamadı (taranmış görüntü PDF)
not_a_receiptYü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_errorSistem hatası — tekrar deneyin (HTTP 500)

GET /v1/usage — Kullanım Özeti

Fatura ve bakiye nerede? Bu uç yalnızca kullanım (adet ve hacim) döner; tutar/oran bilgisi içermez. Faturanızı, ödemelerinizi ve (ön ödemeli hesaplarda) kalan bakiyenizi müşteri portalından görebilirsiniz — giriş bilgileriniz size iletilir.
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.

Yanıt

{
  "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 }
  ]
}

Hata Kodları

HTTPAnlamı
400Geçersiz dosya — PDF değil (not_a_pdf)
401API anahtarı geçersiz (invalid_api_key)
402Bakiye 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.
403Anahtar veya hesap pasif
404Böyle bir uç yok — adresi kontrol edin
413PDF 15 MB'den büyük
422Parametre doğrulama hatası — eksik/hatalı alan da bu kodu döner (ör. file gönderilmemiş, amount sayıya çevrilemiyor)
429Hız limiti aşıldı — bekleyip tekrar deneyin
500Sistem hatası

Hata gövdesi: {"detail": {"error": "<kod>"}}

Limitler

GET /v1/health — auth gerektirmez, servis durumu döner.