joi-ulupinar-api // kontrol düzlemi

ETA · REST API

ETA verinize güvenli, kiracı bazlı erişim

Firmaların ETA muhasebe sistemindeki cari kartlarına ve firma (veritabanı) listesine; token tabanlı, IP kısıtlı ve her kiracının yalnız kendi verisini gördüğü bir REST API üzerinden ulaşın.

Üç adımda kullanım

Akış sıralıdır: önce kimlik bilgisi tanımlanır, sonra token alınır, en son veri çekilir.

01

Kimlik bilgisi

Yönetim panelinden firmaya kullanıcı adı, şifre ve apiKey tanımlanır; hangi ETA veritabanlarına erişebileceği ve (isteğe bağlı) izinli IP adresleri de burada belirlenir.

02

Token al

POST /api/auth/token ile üç bilgi gönderilir, karşılığında bir JWT döner. Sonraki tüm isteklerde Authorization: Bearer … başlığı olarak taşınır.

03

Veri çek

Önce /api/v1/firmalar ile geçerli etaDb değerleri alınır, ardından /api/v1/cariler seçilen firmanın cari kartlarını sayfalı döner.

Uç noktaları

Açık uçlar kimlik istemez; JWT uçları geçerli bir token ve kiracının IP kısıtından geçmeyi gerektirir. Yetkisiz IP 403 alır.

MetotErişimAçıklama
GET /api/v1/ping Açık Servis ayakta mı ve hangi sürüm.
POST /api/auth/token Açık Kullanıcı adı + şifre + apiKey → JWT token.
GET /api/v1/firmalar JWT Token sahibinin erişebildiği ETA veritabanları (geçerli etaDb değerleri).
GET /api/v1/cariler JWT Cari kartlar; her kayıtta adres ve kimlik satırları iç içe. Sayfalı.
GET /api/v1/stoklar JWT Stok kartları; istenirse fiyat satırları iç içe. Sayfalı.
GET /api/v1/stoklar/birimler JWT Birim tanımları (STKBIRIM). Kurulum geneli küçük bir katalog; stok kartına bağlı değildir. Sayfalı.
GET /api/v1/stoklar/fiyatlar JWT Fiyat satırları (STKFIYAT) — stok kartından bağımsız, kendi başına sayfalı. Sayfalı.
GET /api/v1/hizmetler JWT Hizmet kartları. Sayfalı.
GET /api/v1/gelen-faturalar JWT Entegratörden gelen e-Fatura başlıkları. Sayfalı, tarih aralığı zorunlu (azami 31 gün).
GET /api/v1/gelen-faturalar/{uuid} JWT Tek e-Faturanın UBL'inden çözümlenmiş tam detayı (taraflar, satırlar, vergiler).
GET /api/v1/gelen-faturalar/{uuid}/xml JWT Aynı belgenin ham UBL XML'i (application/xml). Çözümlenmez, e-imza bozulmasın diye içeriğine dokunulmaz.
GET /api/v1/gelen-irsaliyeler JWT Entegratörden gelen e-İrsaliye başlıkları. Sayfalı, tarih aralığı zorunlu (azami 31 gün).
GET /api/v1/gelen-irsaliyeler/{uuid} JWT Tek e-İrsaliyenin tam detayı (teslimat adresi, taşıyıcı, satırlar).
GET /api/v1/master/fatura-fis-tipleri JWT Fatura fiş tipleri (FATGENFISTIP). Master veritabanından. Sayfalı.
GET /api/v1/master/irsaliye-fis-tipleri JWT İrsaliye fiş tipleri (IRSGENFISTIP). Master veritabanından. Sayfalı.
GET /api/v1/master/cari-fis-tipleri JWT Cari fiş tipleri (CARGENFISTIP). Master veritabanından. Sayfalı.
GET /api/v1/master/stok-fis-tipleri JWT Stok fiş tipleri (STKGENFISTIP). Master veritabanından. Sayfalı.
GET /api/v1/master/muhasebe-fis-tipleri JWT Muhasebe fiş tipleri (MUHGENFISTIP). Master veritabanından. Sayfalı.
GET /api/v1/master/kdv-kisimlari JWT KDV kısımları / oran tanımları (KDVKISIM). Master veritabanından. Sayfalı.
GET /api/v1/master/doviz-tanimlari JWT Döviz cinsi tanımları (DOVTAN). Master veritabanından. Sayfalı.
GET /api/v1/master/doviz-kur-turleri JWT Kur türü tanımları (DOVTUR). Master veritabanından. Sayfalı.
GET /api/v1/master/doviz-kurlari JWT Döviz kuru geçmişi (DOVHAR). Master veritabanından. Sayfalı, tarih aralığı filtreli.
POST /api/v1/rf-fisleri JWT YAZMA. Fatura ya da irsaliyeyi ETA aktarım (RF) tablolarına yazar. Gerçek ETA belgesi burada oluşmaz; onu üreten saklı yordamı ETA tarafındaki kendi işiniz çağırır.
GET /api/v1/rf-fisleri/{masterSatirId} JWT Yazılan fişin aktarım durumu: ETA belgesine çevrildi mi, hangi referans numaraları üretildi.
GET /swagger/v1/swagger.json Açık OpenAPI 3 belgesi. Uygulamanın kendi uç tanımlarından üretilir; istemci modelleri buradan üretilebilir.
GET /swagger Açık Aynı belgenin gezilebilir arayüzü (Swagger UI).

/api/v1/cariler parametreleri: etaDb (zorunlu), kodOnek, aktif (true/false), skip, take (öntanımlı 100, azami 500).

/api/v1/stoklar parametreleri: etaDb (zorunlu), kodOnek, aktif (true/false), fiyatlar (true/false), skip, take. fiyatlar öntanımlı olarak kapalıdır — açılırsa her kayda fiyatlar dizisi eklenir; bir stokta 70'e kadar fiyat satırı bulunabildiği için yanıt hızla büyür.

/api/v1/hizmetler parametreleri: etaDb (zorunlu), kodOnek, skip, take. aktif parametresi yoktur: ETA'nın HIZMET tablosunda aktiflik alanı bulunmamaktadır.

Belge uçları (/api/v1/gelen-faturalar, /api/v1/gelen-irsaliyeler)

Bu uçlar entegratörden (EDM / Digital Planet) okur, ETA veritabanından değil. etaDb alırlar ama oradan veri çekmezler: entegratör kimliği (kullanıcı, şifre, tip) ETA'daki SABITLER tablosundan okunur ve istek müşterinin entegratör hesabına gider. Yani aynı uç, kiracıdan kiracıya farklı bir dış servise bağlanır.

Liste parametreleri: etaDb (zorunlu), baslangicTarihi, bitisTarihi (ikisi de zorunlu, yyyy-MM-dd, dahil), gonderenVkn (10 hane VKN veya 11 hane TCKN), belgeNo, skip, take. Tarih aralığı en fazla 31 gündür; daha genişi 400 TARIH_ARALIGI_GECERSIZ döner. Detay uçları yalnız etaDb alır, belge uuid'si yoldadır.

Yalnız GELEN (alış) belgeler listelenir ve entegratördeki okundu işareti değiştirilmez. Liste ucu belgenin UBL'ini indirmez; satır ayrıntısı için detay ucu kullanılır. ⚠ toplam alanı bu uçlarda null gelebilir — entegratör gerçek bir eşleşen kayıt sayısı vermez, sayfalamanın bittiği dönen kayıt sayısının take'ten küçük olmasıyla anlaşılır. Entegratör o belge türünü sunmuyorsa 501 BELGE_TURU_DESTEKLENMIYOR döner; bu bir yetki hatası değildir.

e-İrsaliyede skip pahalıdır. EDM'in irsaliye arama anahtarında fatura tarafındaki OFFSET alanının karşılığı yoktur; atlama, entegratörden skip + take kadar kayıt çekilip fazlası API tarafında atılarak yapılır. Sonuç doğrudur ama derin sayfalamada (ör. skip=5000) her istek entegratörden 5000+ kayıt çeker. Geniş taramaları skip ile değil tarih aralığını daraltarak yapın.

/api/v1/stoklar/birimler parametreleri: etaDb (zorunlu), kodOnek, skip, take. STKBIRIM stok kartına bağlı değildir: kurulum geneli bir birim kataloğudur (ölçülen dört kurulumda 21–31 satır) ve stok kartlarındaki birim alanları buna atıfta bulunur. ⚠ stkbirimcarpan ve stkbirimbolen ölçülen kurulumların tamamında 0'dır; birim dönüşümünde doğrudan kullanılamazlar.

/api/v1/stoklar/fiyatlar parametreleri: etaDb (zorunlu), stokKodu (tam eşleşme), kodOnek (ön ek), depoKodu (tam eşleşme), fiyatNo, skip, take. Tek bir stokun fiyatları için stokKodu kullanın: kodOnek=159 ön eki 159 03 01 001 gibi alt kodları da getirir. ⚠ depoKodu bazı kurulumlarda tamamen boştur ve filtre o kurulumlarda hiç sonuç döndürmez.

/api/v1/stoklar/fiyatlar ucunda mükerrer satırlar bulunabilir. STKFIYAT tablosunda hiçbir kolon bileşimi tekil değildir; ölçülen kurulumlarda 26 kolonun tamamı aynı olan tam kopya satırlar bulundu (bir kurulumda 12.170 satırın 11.975'i farklı, bir grupta 7 kopya). Bunun sonucu: art arda çekilen iki sayfada bir kopya iki kez görünüp diğeri hiç görünmeyebilir. Satırlar birbirinin aynısı olduğu için veri kümesi yine de doğrudur — "kayıt kayboldu" diye yorumlanmamalıdır.

Aynı fiyat satırları /api/v1/stoklar?fiyatlar=true ile stok kartının içinde de dönebilir. Ayrı uç, fiyatları karttan bağımsız çekmek içindir: fiyatlar sık, katalog seyrek değişir — ayrı uç olmasaydı fiyat tazelemek için 157 kolonluk stok kartlarını da her seferinde indirmek gerekirdi.

Fiş yazma uçları (/api/v1/rf-fisleri)

Bu uçlar veri okumaz, ETA'ya kayıt yazar. Fiş, ETA'nın aktarım (RF) tablolarına — RF_FISMASTER, RF_FISHAREKET, RF_FISTOPLAMtek bir veritabanı işlemi içinde yazılır: ya üçü de yazılır ya da hiçbiri.

Gerçek ETA belgesi (FATFIS / IRSFIS) bu uçta OLUŞMAZ. Fişi belgeye çeviren saklı yordamı (SP_RFCREATEINVOICERECEIPT / SP_RFCREATEDISPATCHORDER) ETA tarafındaki kendi işiniz çağırır. Aktarımın gerçekleşip gerçekleşmediği GET /api/v1/rf-fisleri/{masterSatirId} ile izlenir; yanıttaki aktarildi alanı bayrağa değil, belge türüne karşılık gelen referans numarasının üretilmiş olmasına bakar.

Mükerrer yazım engellenir. disReferans alanı (çağıran sistemdeki belge kimliği) zorunludur ve veritabanı düzeyinde benzersizdir; aynı değerle ikinci bir istek 409 FIS_ZATEN_KAYITLI ile reddedilir ve hata detayında mevcut kaydın masterSatirId'si bildirilir. Yani zaman aşımına uğrayan bir istek güvenle yeniden denenebilir.

Ön koşul: cariKodu ETA'da CARKART'ta, tüm stokKodu değerleri STKKART'ta tanımlı olmalıdır; değilse istek 409 KART_BULUNAMADI ile reddedilir. ⚠ Kod karşılaştırması ETA'nın harmanlamasına göre büyük/küçük harf duyarlı olabilir.

Belge numarasında iki tür arasında fark vardır. İrsaliyede belgeNo zorunludur — ETA irsaliye numarasını kendisi üretmez, gönderdiğinizi kullanır. Faturada ise isteğe bağlıdır ve aktarım sırasında ETA kendi evrak sayacından ürettiği numarayı bu alanın üzerine yazar; kendi numaranızı korumak için disReferans kullanın (o alan ETA belgesine değişmeden taşınır).

Tutarları API hesaplar. Satır tutarı, KDV matrahı, KDV tutarı, kalem iskontoları ve KDV kırılımı gönderdiğiniz miktar, fiyat, kdvOrani ve iskontoYuzdeleri değerlerinden türetilir; yanıtta hesaplanan toplamlar döner ve kendi hesabınızla karşılaştırabilirsiniz. kdvDahil=true gönderilirse fiyatlar KDV dahil kabul edilip matrah geriye hesaplanır.

Adlandırılmış alanların yetmediği yerde hamAlanlar sözlüğüyle istediğiniz ETA kolonunu doğrudan yazabilirsiniz (satır bazında da vardır). Tanınmayan bir kolon adı sessizce yok sayılmaz, 400 döner; kolona sığmayan bir metin de kırpılmaz, reddedilir. Kimlik, mükerrer koruması ve aktarım durumu kolonları API tarafından yönetilir ve bu yolla yazılamaz.

Kurulum adımı: mükerrer koruması, ETA veritabanınızda database/04_rf_fis_yazma.sql betiğiyle kurulan filtreli benzersiz indekse dayanır. Betik çalıştırılmadan uç çalışır ama aynı fiş ikinci kez yazılabilir. Betik kiracıya tanımlı her ETA veritabanında ayrı ayrı çalıştırılmalıdır.

Master uçları (/api/v1/master/…)

Bu uçlar kart uçlarından farklı bir kaynaktan okur: fiş tipleri, KDV kısımları, döviz ve kur türü tanımları ile döviz kurları bir firmaya değil ETA kurulumunun tamamına aittir ve firma veritabanlarında bulunmazlar. Bu yüzden etaDb değil masterDb alırlar; /api/v1/firmalar listesindeki değerler burada kullanılamaz (tersi de geçerlidir — her iki durumda 403).

Beş fiş tipi ucu ile /api/v1/master/kdv-kisimlari, /api/v1/master/doviz-tanimlari ve /api/v1/master/doviz-kur-turleri parametreleri: masterDb, kodOnek, skip, take. masterDb zorunlu değildir: kiracıda tek master tanımlıysa o kullanılır; birden fazla tanımlıysa (ör. hem ETA_MASTER hem ETA_MASTERV8) hangisinin okunacağı belirsiz olduğu için 400 döner ve ad açıkça istenir. Hiç tanım yoksa 409 MASTER_DB_TANIMSIZ döner — bu yetki hatası değildir, yönetim panelinden tanım eklenmesi gerekir. KDV kısımlarında kodOnek filtresi KDVKISOZELKOD alanına uygulanır ve bu alan çoğu kurulumda boştur; oran değeri kdvkisoran alanındadır (20 = %20), açıklamadaki yüzde eskimiş olabilir.

/api/v1/master/doviz-kurlari parametreleri: masterDb, dovizKodu, kurTuru, baslangicTarihi, bitisTarihi (ikisi de yyyy-MM-dd ve dahil), skip, take. dovizKodu ve kurTuru ön ek değil TAM EŞLEŞMEDİR: aynı kurulumda hem EUR hem EURO kodu bulunabildiği için ön ek araması ikisini birden getirirdi. Kur türleri kuruluma göre değişir (MBNKALS, MBNKSAT, MBNKEALS, MBNKESAT…). Tarih aralığında gün sınırı yoktur; sıralama dovhartar + dovharkod + dovhartur üzerinde artandır, yeni kurlar listenin sonuna eklendiği için devam eden bir tarama kaymaz.

Döviz üçlüsü — biri diğerinin sözlüğü değildir. kurTuru parametresinin tanımlı değerleri /api/v1/master/doviz-kur-turleri ucundan okunabilir; ancak liste “kur bulunan türler” değil “tanımlı türler”dir (ölçülen bir kurulumda 13 türden 8'inin hiç kur satırı yoktu). dovizKodu için /api/v1/master/doviz-tanimlari YETMEZ: iki tablo birbirini kapsamaz — ölçülen kurulumda DOVHAR'da kur satırı bulunan sekiz kod (AZN, AED, EUR, KRW, PKR, QAR, STERLİN, XDR) DOVTAN'da hiç yoktu, DOVTAN'daki üç kod (ILS, JOD, SYP) için ise DOVHAR'da tek satır yoktu. Kod kümesi kur verisinin kendisinden öğrenilmelidir. Döviz tanımlarındaki dovtaneslkod ETA kodunun ISO 4217 karşılığıdır (EUROEUR); dovtancarpan / dovtanbolen ölçülen kurulumların hepsinde 0 geldi.

Örnek akış

1 · Token iste
POST /api/auth/token
Content-Type: application/json

{
  "kullaniciAdi": "delta",
  "sifre": "***",
  "apiKey": "e5174e75e807c8bfe…"
}
Yanıt
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6…",
  "gecerlilikBitis": "2026-07-27T20:00:00Z"
}
2 · Erişilebilir firmalar
GET /api/v1/firmalar
Authorization: Bearer eyJhbGciOiJ…

 [ { "etaDb": "ETA_IZYAPIAS_2026", "gorunenAd": "İZYAPI 2026" } ]
3 · Cari kartlar (120 ile başlayan, aktif, ilk 100)
GET /api/v1/cariler?etaDb=ETA_IZYAPIAS_2026&kodOnek=120&aktif=true&take=100
Authorization: Bearer eyJhbGciOiJ…

Kurallar & sınırlar

JOI_ULUPINAR.API · ETA REST API · 2026