Entegrasyon Dokümanı — v1

SlipScan API

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

PDF İndir
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)
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",
  "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.

Risk Kademeleri — verdict

DeğerAnlamıÖnerilen aksiyon
confirmed_fakeDekont kesin olarak sahte/oynanmışReddet
high_riskGüçlü sahtecilik bulgularıReddet veya manuel incele
medium_riskŞüpheli bulgularManuel incele
low_riskZayıf/tekil şüpheİzle
cleanSahtecilik bulgusu yokKabul edilebilir
undeterminedAnaliz 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.

Not: 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.

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 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ğ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)
engine_errorSistem hatası — tekrar deneyin (HTTP 500)

GET /v1/usage — Kullanım Özeti

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) veya eksik alan
401API anahtarı geçersiz
403Anahtar veya hesap pasif
413PDF 15 MB'den büyük
422Parametre doğrulama hatası
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.