API'ye Giriş
- 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 anahtar403 PRODUCT_NOT_ENABLED, yetkisi olmayan anahtar403 API_INSUFFICIENT_SCOPEalı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öntem | Yol | Yetki | Sayfa |
|---|---|---|---|
GET | /banks | bank-connect:view | Bankalar |
GET | /connections | bank-connect:view | Bağlantılar |
GET | /connections/{connectionId} | bank-connect:view | Bağlantılar |
GET | /accounts | bank-connect:view | Hesaplar |
GET | /accounts/{accountId} | bank-connect:view | Hesaplar |
POST | /accounts/{accountId}/sync | bank-connect:view | Şimdi Yenile |
GET | /balances | bank-connect:transactions:view | Bakiyeler |
GET | /transactions | bank-connect:transactions:view | Hareketler |
GET | /transactions/{transactionId} | bank-connect:transactions:view | Hareketler |
GET | /transfer-purposes | bank-connect:transfer | Para Transferi |
POST | /transfers | bank-connect:transfer | Para Transferi |
GET | /transfers | bank-connect:transfer | Para Transferi |
GET | /transfers/{transferId} | bank-connect:transfer | Para Transferi |
GET | /fx/rates | bank-connect:transfer | Döviz İşlemi |
POST | /fx/quotes | bank-connect:transfer | Döviz İşlemi |
POST | /fx/orders | bank-connect:transfer | Döviz İşlemi |
GET | /fx/orders | bank-connect:transfer | Döviz İşlemi |
GET | /fx/orders/{orderId} | bank-connect:transfer | Dö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ık | Değer |
|---|---|
X-Key-Id | Anahtarınızın kimliği — test için mk_test_…, canlı için mk_live_… |
X-Date | ISO 8601 zaman damgası; sunucu saatine göre ±5 dakika içinde |
X-Nonce | İstek başına benzersiz değer; tek kullanımlık |
X-Signature | Kanonik 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\ConfigurationExceptionile reddeder. - API hataları
Lunixi\Sdk\Exception\ApiExceptionolarak gelir;getStatusCode()vegetErrorCode()ile dallanın.
Yetkiler
İmza doğrulandıktan sonra iki şey denetlenir:
- Ürün. Anahtarınızda Banka Bağlantıları ürünü (
BANK_CONNECT) tanımlı olmalıdır; yoksa403 PRODUCT_NOT_ENABLED. → Hata Yönetimi › PRODUCT_NOT_ENABLED - Yetki. Anahtarınız ucun yetkisini taşımalıdır; yoksa
403 API_INSUFFICIENT_SCOPE.
| Yetki | Uçlar |
|---|---|
bank-connect:view | Bankalar, bağlantılar, hesaplar (maskeli, bakiyesiz) ve şimdi yenile |
bank-connect:transactions:view | Bakiyeler, hareket listesi ve hareket detayı |
bank-connect:transfer | Para 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:
- Anahtar oluştururken ya da güncellerken:
bank-connect:transferyetkisi yalnız IP izin listesi olan bir anahtara verilebilir. Liste boşken bu yetkiyi eklemeye çalışırsanız işlem400 organization.api_key.scope_requires_ip_allowlistile reddedilir. - 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 adres403 bank_connect.auth.ip_not_allowedalır. Liste geçici olarak doğrulanamazsa istek503 bank_connect.auth.ip_allowlist_unavailablealı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ı
| Kural | Ayrıntı |
|---|---|
| Tutarlar | Minor birimde (kuruş) tam sayı: "amountMinor": 150000 = ₺1.500,00. Ondalık yoktur. |
| Para birimi | ISO 4217, ör. TRY. |
| Zamanlar | ISO 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 yoktur | Boş 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. |
| Kimlikler | bankId, connectionId, accountId, transactionId UUID'dir. Biçim dışı kimlik 404 döner. |
| Maskeleme | IBAN, hesap numarası ve karşı taraf bilgileri yalnız maskeli döner. → Kavramlar › Maskeleme |
| Bilinmeyen parametre | Tanı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:
| Parametre | Açıklama |
|---|---|
limit | Sayfa 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.hasMoretrueise sonraki sayfayıcursor=<nextCursor>ile isteyin.- Bu uçlarda
pageInfo.totalCounther zamannull'dır;includeTotal=truegönderseniz de toplam sayı dönmez. İlerlemek içinhasMoreyeterlidir. - İmleci kendiniz üretmeyin ve değiştirmeyin. Bozuk imleç
400 bank_connect.cursor.invaliddö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
- Bağlanabilecek bankalar: Bankalar
- Hesaplarınız ve tazelik: Hesaplar
- Hareketleri okuma ve senkron tutma: Hareketler
- Para gönderme: Para Transferi
- Hesaplarınız arasında döviz alım satımı: Döviz İşlemi