Banka Hesapları
API Referansı
API'ye Giriş

API'ye Giriş

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:view · bank-connect:transactions:view · bank-connect:transfer. Ü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.

Banka Hesapları API'si, panelden bağladığınız bankalardaki hesapları, bakiyeleri ve hareketleri kendi sunucunuzdan okumanızı sağlar. Bağlantınız destekliyorsa aynı API ile bağlı hesabınızdan para transferi ve hesaplarınız arasında döviz işlemi de yapabilirsiniz. Para hareketi uçları ayrı bir yetki ve IP izin listesi ister; okuma uçları bunlardan etkilenmez.

Uçlar

Taban adres: https://api-gateway.lunixi.com/api/v1/bank-connect

YöntemYolYetkiSayfa
GET/banksbank-connect:viewBankalar
GET/connectionsbank-connect:viewBağlantılar
GET/connections/{connectionId}bank-connect:viewBağlantılar
GET/accountsbank-connect:viewHesaplar
GET/accounts/{accountId}bank-connect:viewHesaplar
POST/accounts/{accountId}/syncbank-connect:viewŞimdi Yenile
GET/balancesbank-connect:transactions:viewBakiyeler
GET/transactionsbank-connect:transactions:viewHareketler
GET/transactions/{transactionId}bank-connect:transactions:viewHareketler
GET/transfer-purposesbank-connect:transferPara Transferi
POST/transfersbank-connect:transferPara Transferi
GET/transfersbank-connect:transferPara Transferi
GET/transfers/{transferId}bank-connect:transferPara Transferi
GET/fx/ratesbank-connect:transferDöviz İşlemi
POST/fx/quotesbank-connect:transferDöviz İşlemi
POST/fx/ordersbank-connect:transferDöviz İşlemi
GET/fx/ordersbank-connect:transferDöviz İşlemi
GET/fx/orders/{orderId}bank-connect:transferDöviz İşlemi

Bankayı bağlama ve bağlantıyı kesme için uç yoktur; bunlar yalnız panelden yapılır. → Panelden Banka Bağlama

Kimlik doğrulama

Bu uçlar her istekte API anahtarınızla imzalanmış istek ister. Authorization: Bearer jetonu ve panel oturumu kimlik yerine geçmez; imza başlıkları olmayan istek 401 AUTH_HEADERS_MISSING alır.

BaşlıkDeğer
X-Key-IdAnahtarınızın kimliği — test için mk_test_…, canlı için mk_live_…
X-DateISO 8601 zaman damgası; sunucu saatine göre ±5 dakika içinde
X-Nonceİstek başına benzersiz değer; tek kullanımlık
X-SignatureKanonik dizinin Base64 Ed25519 imzası

İmzalanan kanonik dizi YÖNTEM, tam yol, X-Date:… ve X-Nonce:… satırlarının \n ile birleşimidir. Okuma uçlarının gövdesi olmadığı için Digest satırı yazılmaz; gövdeli para hareketi isteklerinin imzası: Para Transferi › Gövdeli isteği imzalama. Kanonik dizinin kuralları ve anahtar yönetimi: Kimlik Doğrulama › Kanonik dize.

⚠️

İmzalanan yol sorgu dizesini de içerir ve gönderdiğiniz yolla birebir aynı olmalıdır: GET /api/v1/bank-connect/transactions?limit=50&direction=CREDIT imzalanırken ikinci satır /api/v1/bank-connect/transactions?limit=50&direction=CREDIT olur.

Bu bölümdeki cURL örnekleri imzayı aşağıdaki kabuk fonksiyonuyla hesaplar (OpenSSL 3.0 veya üstü gerekir):

# lunixi-sign.sh — Kullanım: source lunixi-sign.sh; lunixi_sign GET "/api/v1/bank-connect/accounts"
LUNIXI_KEY_ID="mk_test_..."
LUNIXI_KEY_FILE="lunixi-signing.key"
 
lunixi_sign() {
  local method="$1" req_path="$2"
  DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
  NONCE=$(openssl rand -hex 16)
  printf '%s\n%s\nX-Date:%s\nX-Nonce:%s' "$method" "$req_path" "$DATE" "$NONCE" > canonical.txt
  SIGNATURE=$(openssl pkeyutl -sign -inkey "$LUNIXI_KEY_FILE" -rawin -in canonical.txt | base64 | tr -d '\n')
}

PHP SDK

PHP örnekleri PHP SDK'nın (lunixi/php-sdk, 0.14.0 ve üstü; para transferi ve döviz için 0.22.0 ve üstü) bankConnect() istemcisini kullanır. SDK her isteği sizin yerinize imzalar:

use Lunixi\Sdk\LunixiClient;
 
$lunixi = LunixiClient::create([
    'baseUrl'     => 'https://api-gateway.lunixi.com',
    'keyId'       => getenv('LUNIXI_KEY_ID'),
    'privateKey'  => getenv('LUNIXI_PRIVATE_KEY_PEM'),
    'environment' => 'TEST', // anahtarınızın ortamı: TEST ya da LIVE
]);
 
$bankConnect = $lunixi->bankConnect();
  • Liste yöntemleri (listBanks, listConnections, listAccounts, listBalances, listTransactions) tek bir sayfa döner: items(), hasMore(), nextCursor(). Aynı adlı iterate… yöntemleri bütün sayfaları sizin yerinize dolaşır.
  • SDK tanımadığı süzgeçleri, değer kümesi dışındaki değerleri ve kurala uymayan tarih ya da tutar aralıklarını istek göndermeden Lunixi\Sdk\Exception\ConfigurationException ile reddeder.
  • API hataları Lunixi\Sdk\Exception\ApiException olarak gelir; getStatusCode() ve getErrorCode() ile dallanın.

Yetkiler

İmza doğrulandıktan sonra iki şey denetlenir:

  1. Ürün. Anahtarınızda Banka Bağlantıları ürünü (BANK_CONNECT) tanımlı olmalıdır; yoksa 403 PRODUCT_NOT_ENABLED. → Hata Yönetimi › PRODUCT_NOT_ENABLED
  2. Yetki. Anahtarınız ucun yetkisini taşımalıdır; yoksa 403 API_INSUFFICIENT_SCOPE.
YetkiUçlar
bank-connect:viewBankalar, bağlantılar, hesaplar (maskeli, bakiyesiz) ve şimdi yenile
bank-connect:transactions:viewBakiyeler, hareket listesi ve hareket detayı
bank-connect:transferPara transferi ve döviz işlemi uçları (okuma dahil). Yalnız IP izin listesi tanımlı anahtara verilir.
⚠️

bank-connect:view bakiye ve hareket okumaya yetmez. Bakiye ve hareketler hassas veri olduğu için ayrı yetkidedir. Mevcut anahtarlarınız bu yetkileri kendiliğinden almaz; panelde API anahtarınızın yetkilerine ihtiyacınız olanları ekleyin ya da bu iş için yeni bir anahtar oluşturun.

IP izin listesi

Para hareketi yapan uçlarda (bank-connect:transfer) doğrulama kodu yoktur; onay anahtar yetkisi, istek imzası ve isteğin geldiği IP adresidir. Bu yüzden:

  1. Anahtar oluştururken ya da güncellerken: bank-connect:transfer yetkisi yalnız IP izin listesi olan bir anahtara verilebilir. Liste boşken bu yetkiyi eklemeye çalışırsanız işlem 400 organization.api_key.scope_requires_ip_allowlist ile reddedilir.
  2. Her istekte: isteğin geldiği IP adresi anahtarın listesinde olmalıdır. Listesi boş anahtar 403 bank_connect.auth.ip_allowlist_required, listede olmayan adres 403 bank_connect.auth.ip_not_allowed alır. Liste geçici olarak doğrulanamazsa istek 503 bank_connect.auth.ip_allowlist_unavailable alır; aynı istekle yeniden deneyin.

Listeye tek tek IP adresleri yazılır (IPv4 ya da IPv6); adres aralıkları (CIDR) kabul edilmez, en çok 50 adres eklenebilir. Listede yaptığınız değişiklik en geç 15 saniye içinde geçerli olur. Okuma uçları (bank-connect:view, bank-connect:transactions:view) bu kurala tabi değildir.

Sunucunuzun dışarıya çıktığı IP adresini listeye yazın. Yük dengeleyici, NAT ya da yeni bir sunucu çıkış adresini değiştirdiyse listeyi güncelleyin. → Kimlik Doğrulama › IP izin listesi

Ortam

Ortamı (test ya da canlı) anahtarınızın ortamı belirler. Test anahtarı yalnız test ortamındaki bağlantıları ve verileri, canlı anahtar yalnız canlı ortamdakileri görür. Sorguda environment gönderilmez; gönderilirse istek 400 VALIDATION_ERROR alır. Başka bir organizasyonun ya da diğer ortamın kaydı 404 döner.

Yanıt zarfı

Başarılı yanıtta veri data altındadır. Tek kayıt dönen uçlarda data kaydın kendisidir. Liste uçlarında kayıtlar data.items içindedir ve sayfalama bilgisi pageInfo, data'nın yanındadır:

{
  "status": "success",
  "code": "SUCCESS",
  "data": {
    "items": [ ]
  },
  "pageInfo": { "hasMore": false, "nextCursor": null, "totalCount": null },
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}

Örneklerde kısalık için gösterilmeyen zarf alanları (message, timestamp …) da yanıtta bulunur; alanların tam listesi ve hata zarfı için: Hata Yönetimi. Hata durumunda message'a göre değil code'a göre dallanın. Bu ürünün kodları: Hata Kodları.

Ortak alan kuralları

KuralAyrıntı
TutarlarMinor birimde (kuruş) tam sayı: "amountMinor": 150000 = ₺1.500,00. Ondalık yoktur.
Para birimiISO 4217, ör. TRY.
ZamanlarISO 8601. Yanıtlar UTC döner (2026-01-01T07:00:00.000Z); sorgu süzgeçlerinde saat dilimli değer gönderin (2026-01-01T10:00:00+03:00).
Değer yoksa alan yokturBoş ya da bilinmeyen bir değer null ya da boş metin olarak dönmez; alan yanıtta hiç bulunmaz. Kodunuzu alanın olmayabileceğine göre yazın.
KimliklerbankId, connectionId, accountId, transactionId UUID'dir. Biçim dışı kimlik 404 döner.
MaskelemeIBAN, hesap numarası ve karşı taraf bilgileri yalnız maskeli döner. → Kavramlar › Maskeleme
Bilinmeyen parametreTanımlanmamış bir sorgu parametresi ya da gövde alanı 400 VALIDATION_ERROR döner.
Para hareketi yanıtlarıTransfer, döviz teklifi ve döviz işlemi yanıtlarında değeri olmayan alanlar null döner; alan yanıtta bulunur.

Sayfalama

Liste uçları cursor tabanlı sayfalama kullanır:

ParametreAçıklama
limitSayfa başına kayıt, 1–100. Varsayılan 25. 100'ün üstü 400 döner.
cursorÖnceki yanıttaki pageInfo.nextCursor. İlk sayfada gönderilmez.
  • pageInfo.hasMore true ise sonraki sayfayı cursor=<nextCursor> ile isteyin.
  • Bu uçlarda pageInfo.totalCount her zaman null'dır; includeTotal=true gönderseniz de toplam sayı dönmez. İlerlemek için hasMore yeterlidir.
  • İmleci kendiniz üretmeyin ve değiştirmeyin. Bozuk imleç 400 bank_connect.cursor.invalid döner; ilk sayfadan yeniden başlayın.
  • Süzgeçleri değiştirdiğinizde imleci sıfırlayın; bir süzgeç kümesinin imleci başka süzgeçlerle kullanılmaz.

Sıradaki adım