Banka Hesapları
API Referansı
Hareketler

Hareketler

Bu uçları kim çağırır?Dış API (s2s)
Taban yol
/api/v1/bank-connect
Kimlik
Her istekte Ed25519 istek imzası — X-Key-Id, X-Date, X-Nonce, X-Signature. Zaman penceresi ±5 dk, nonce tek kullanımlık. Bearer jetonu ya da panel oturumu bu uçlarda kabul edilmez (401 AUTH_HEADERS_MISSING).
Yetki
Anahtarınız Banka Bağlantıları ürününü (BANK_CONNECT) ve bu sayfadaki uçların yetkisini taşımalıdır: bank-connect:transactions:view. Ürünü olmayan anahtar 403 PRODUCT_NOT_ENABLED, yetkisi olmayan anahtar 403 API_INSUFFICIENT_SCOPE alır. Bkz. API'ye Giriş › Yetkiler.
Çapraz yüzey
Bu uçlar s2s yüzeyindedir; kendi sunucunuzdan imzalı istekle çağırırsınız. Aynı verinin panelde ekranları var, ama panel uçları API anahtarıyla çağrılamaz; bu uçlar da panel oturumuyla çağrılamaz. Bankayı bağlama ve kesme yalnız panelde yapılır.

Hareket, hesap ekstresindeki tek satırdır. Bu uçlar bağlı hesaplarınızın hareketlerini döner. Hareket yönü ve tipleri: Kavramlar › Hareket yönü ve tipi.

Hareketleri listeleme

GET /api/v1/bank-connect/transactions

Sorgu parametresiTipAçıklama
accountIdstringVirgülle ayrılmış hesap kimlikleri (UUID), en çok 100. Verilmezse anahtarınızın ortamındaki bütün hesaplar.
bookedFromstring (ISO 8601)İşlem tarihi (bookedAt) bu andan itibaren — dahil. Saat dilimiyle gönderin.
bookedTostring (ISO 8601)İşlem tarihi bu andan önce — hariç. Yalnız bookedFrom ile birlikte gönderilebilir.
directionstringCREDIT ya da DEBIT.
minAmountMinorintegerEn az tutar, minor birimde — dahil.
maxAmountMinorintegerEn çok tutar, minor birimde — dahil.
canonicalTypestringVirgülle ayrılmış hareket tipleri, ör. TRANSFER_IN,POS_SETTLEMENT.
limitintegerSayfa başına kayıt, 1–100. Varsayılan 25.
cursorstringÖnceki yanıttaki pageInfo.nextCursor.

Tarih aralığı kuralları

  • bookedFrom ve bookedTo arası tek istekte en çok 92 gün olabilir.
  • Yalnız bookedFrom gönderirseniz üst sınır istek anıdır; aralık yine en çok 92 gündür.
  • Yalnız bookedTo gönderilemez; bookedFrom da gerekir.
  • İkisini de göndermezseniz tarih süzgeci uygulanmaz ve bütün hareketler sayfalanır.

Bu kurallara uymayan istek 400 bank_connect.validation.invalid döner; sebep details.errors[].reason alanındadır:

reasonSebep
booked_from_requiredbookedTo var, bookedFrom yok.
after_booked_tobookedFrom, bookedTo'dan sonra.
range_too_largeAralık 92 günden uzun.
invalidTarih okunamadı.
min_greater_than_maxminAmountMinor, maxAmountMinor'dan büyük.

Süzgeç örnekleri

Ne istiyorsunuzSorgu
Tek hesabın hareketleri?accountId=00000000-0000-0000-0000-000000000100
İki hesabın hareketleri?accountId=00000000-0000-0000-0000-000000000100,00000000-0000-0000-0000-000000000101
Ocak 2026'daki hareketler?bookedFrom=2026-01-01T00:00:00%2B03:00&bookedTo=2026-02-01T00:00:00%2B03:00
Yalnız gelen para?direction=CREDIT
1.000 TL ile 5.000 TL arası?minAmountMinor=100000&maxAmountMinor=500000
Gelen havale/EFT'ler ve POS geçişleri?canonicalType=TRANSFER_IN,POS_SETTLEMENT
⚠️

Sorgu dizesinde + karakterini %2B olarak kodlayın; kodlanmamış + boşluk olarak okunur ve tarih geçersiz sayılır. İmzaladığınız yol, gönderdiğiniz kodlanmış yolla birebir aynı olmalıdır.

Açıklama metninde arama yapan bir süzgeç yoktur; tanımlanmamış her parametre 400 VALIDATION_ERROR döner.

source lunixi-sign.sh
REQ_PATH="/api/v1/bank-connect/transactions?direction=CREDIT&canonicalType=TRANSFER_IN&limit=50"
lunixi_sign GET "$REQ_PATH"
 
curl "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "X-Signature: $SIGNATURE"

PHP örneğindeki $bankConnect: API'ye Giriş › PHP SDK.

Sıralama

Hareketler kayda alınma anına (receivedAt) göre en yeniden eskiye sıralanır. receivedAt, hareketin bankadan okunup Lunixi'de kaydedildiği andır ve sonradan değişmez. İşlem tarihi (bookedAt) yalnız süzgeçtir, sıralama anahtarı değildir.

Bu yüzden banka bir hareketi geç bildirirse, işlem tarihi eski olsa da listenin başında görünür.

Yanıt

{
  "status": "success",
  "code": "SUCCESS",
  "data": {
    "items": [
      {
        "transactionId": "00000000-0000-0000-0000-000000001000",
        "accountId": "00000000-0000-0000-0000-000000000100",
        "direction": "CREDIT",
        "amountMinor": 150000,
        "currency": "TRY",
        "bookedAt": "2026-01-01T07:00:00.000Z",
        "canonicalType": "TRANSFER_IN",
        "description": "ORNEK ACIKLAMA",
        "counterpartyNameMasked": "Ö**** A****",
        "counterpartyIbanMasked": "TR00 **** **** **** **** **00 00",
        "receivedAt": "2026-01-01T07:05:00.000Z"
      }
    ]
  },
  "pageInfo": { "hasMore": true, "nextCursor": "eyJ0IjoiMjAyNi0wMS0wMVQwNzowNTowMFoifQ", "totalCount": null },
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}

Tek hareket

GET /api/v1/bank-connect/transactions/{transactionId} tek bir hareketi döner. Liste alanlarına ek olarak hareketten sonraki bakiyeyi, belge numarasını ve bankayı içerir. Bilinmeyen, başka bir organizasyona ya da diğer ortama ait hareket 404 bank_connect.transaction.not_found döner.

{
  "status": "success",
  "code": "SUCCESS",
  "data": {
    "transactionId": "00000000-0000-0000-0000-000000001000",
    "accountId": "00000000-0000-0000-0000-000000000100",
    "direction": "CREDIT",
    "amountMinor": 150000,
    "currency": "TRY",
    "bookedAt": "2026-01-01T07:00:00.000Z",
    "canonicalType": "TRANSFER_IN",
    "description": "ORNEK ACIKLAMA",
    "counterpartyNameMasked": "Ö**** A****",
    "counterpartyIbanMasked": "TR00 **** **** **** **** **00 00",
    "receivedAt": "2026-01-01T07:05:00.000Z",
    "counterpartyBankCode": "0000",
    "counterpartyBankName": "ÖRNEK BANKA",
    "balanceAfterMinor": 990000,
    "documentNo": "0000000",
    "bank": { "bankId": "00000000-0000-0000-0000-000000000001", "eftCode": "0000", "name": "ÖRNEK BANKA" }
  },
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}

Hareket nesnesi

AlanTipAçıklama
transactionIdstring (UUID)Hareketin kimliği. Aynı hareket için her zaman aynıdır; tekilleştirmede bunu kullanın.
accountIdstring (UUID)Hareketin ait olduğu hesap.
directionstringCREDIT (giren) ya da DEBIT (çıkan).
amountMinorintegerTutar, minor birimde. Her zaman sıfır ya da pozitif; yön direction alanındadır.
currencystringPara birimi (ISO 4217).
bookedAtstringİşlem tarihi. Değer yoksa alan yoktur.
valueAtstringValör tarihi. Banka bildirmiyorsa alan yoktur.
canonicalTypestringBankadan bağımsız hareket tipi. → Hareket tipleri
descriptionstringBankanın yazdığı açıklama, maskelenmeden. Değer yoksa alan yoktur.
counterpartyNameMaskedstringKarşı tarafın maskeli adı. Değer yoksa alan yoktur.
counterpartyIbanMaskedstringKarşı tarafın maskeli IBAN'ı. Değer yoksa alan yoktur.
receiptNostringDekont numarası. Değer yoksa alan yoktur.
receivedAtstringHareketin Lunixi'de kaydedildiği an; sıralama anahtarı.
isReversalbooleanYalnız true olduğunda gelir: bu satır önceki bir hareketin ters kaydıdır (iptal ya da iade). Ters kayıt değilse alan yoktur.
reversalOfTransactionIdstring (UUID)Ters kaydın bağlı olduğu asıl hareket. Banka bağlantıyı bildirmiyorsa alan yoktur.
counterpartyBankCodestringKarşı taraf bankanın EFT kodu. Banka bildirmiyorsa alan yoktur.
counterpartyBankNamestringKarşı taraf bankanın adı. Banka bildirmiyorsa alan yoktur.
balanceAfterMinorintegerYalnız tek hareket ucunda. Hareketten sonraki bakiye. Banka bildirmiyorsa alan yoktur.
documentNostringYalnız tek hareket ucunda. Bankanın belge numarası. Değer yoksa alan yoktur.
bankobjectYalnız tek hareket ucunda. bankId, eftCode ve varsa name.

Hareketleri senkron tutma

Yeni hareketleri öğrenmenin birincil yolu webhook olayıdır. Liste ucu, webhook'u kaçırdığınız ya da ilk kez veri çektiğiniz durumlar için güvenilir kaynaktır. İkisini birlikte şöyle kullanın:

Hareketleri senkron tutmakVeri akışı: hareketler webhook’tan (hızlı) ve liste ucunun düzenli telafi okumalarından gelir; ikisi de saklanmadan önce transactionId ile tekilleştirilir, saklanan en yeni receivedAt bir sonraki telafi okumasının durma noktasıdır.HIZLITELAFİTEK KEZ YAZDURMA NOKTASIWebhookbank_account.transaction.receivedListe ucuGET …/transactionsTekilleştirmetransactionId ileKayıtlarınızen yeni receivedAtLEJANTKAYNAKTEKİLLEŞTİRMESİZİN SİSTEMİNİZSONRAKİ TELAFİ BURADA DURUR
İki kaynak tek başına yetmez: webhook kaçırılabilir, liste ise aralıklarla okunur. Sıralamayı ve durma noktasını bookedAt ile değil, receivedAt ile belirleyin.
  1. İlk yükleme. Süzgeçsiz (ya da yalnız accountId ile) ilk sayfayı isteyin ve pageInfo.hasMore false olana kadar nextCursor ile sayfalayın. Her hareketi transactionId ile kaydedin ve gördüğünüz en yeni receivedAt değerini saklayın.
  2. Düzenli tamamlama. Belirli aralıklarla aynı süzgeçlerle ilk sayfadan (imleçsiz) başlayın. Liste en yeniden eskiye sıralı olduğundan, sakladığınız en yeni receivedAt değerinin gerisine düşene kadar sayfalayın ve sonra durun.
  3. Tekilleştirin. Durma noktasını sakladığınız receivedAt değerinin biraz gerisine koyun ve gelen her hareketi transactionId ile tekilleştirin; aynı hareketi webhook'tan ve listeden iki kez almak böylece sorun olmaz.
⚠️

Senkronu işlem tarihine (bookedAt) göre kurmayın. Banka bir hareketi geç bildirebilir; işlem tarihi eski olan bir hareket, son kontrolünüzden sonra listeye girebilir. receivedAt bu yüzden sıralama ve durma noktası için doğru alandır.

Süzgeçleri değiştirdiğinizde imleci sıfırlayıp ilk sayfadan başlayın.

Hatalar

HTTPcodeNe yapmalı
400VALIDATION_ERRORTanımlanmamış bir parametre (ör. açıklama araması), bilinmeyen canonicalType ya da direction, UUID olmayan accountId, 100'den fazla hesap ya da limit 1–100 dışında.
400bank_connect.validation.invalidTarih aralığı ya da tutar aralığı kurala uymuyor; details.errors[].reason alanına bakın.
400bank_connect.cursor.invalidİmleci değiştirmeden gönderin ya da ilk sayfadan başlayın.
403API_INSUFFICIENT_SCOPEAnahtarınıza bank-connect:transactions:view yetkisini ekleyin; bank-connect:view yetmez.
404bank_connect.transaction.not_foundKimliği ve anahtarınızın ortamını kontrol edin.