⚠️ ÖNEMLİ: V1 Versiyonu Kapatılacaktır

RestBI API V1 sürümü, 01.06.2026 tarihinde tamamen kapatılacaktır. Kesintisiz hizmet için lütfen projelerinizi V2 sürümüne taşıyınız.

Migrasyon Rehberine Git

Giriş (Introduction)

Naeron RestBI Veri Entegrasyon Servisi'ne hoş geldiniz.

RestBI, Naeron Flight School Management sistemleri ile PowerBI, Tableau ve Qlik gibi kurumsal İş Zekası (BI) araçları arasında köprü kurmak için tasarlanmış, yüksek performanslı bir API'dir.

Kurumsal Hazır Yapı

V2 API'miz, cursor-tabanlı sayfalama, delta senkronizasyonu ve donanım düzeyinde çoklu-kiracı (tenancy) izolasyonu ile ölçeklenebilir yapıdadır.

Base URL (Temel Adres)

HTTP
https://api.naeron.com:3110/v2

Kimlik Doğrulama ve Güvenlik (Authentication & Security)

RestBI, verilere erişimi güvenli hale getirmek için API Anahtarı (API Key) kullanır. Bu anahtar, sadece kuruluşunuza ait verilere erişmenizi sağlar.

Anahtarınızı Güvende Tutun

API anahtarınız kuruluşunuzun hassas verilerine tam okuma yetkisi verir. Lütfen anahtarınızı halka açık yerlerde paylaşmayın.

Header Gereksinimi

Tüm API istekleri x-api-key başlığını içermelidir.

BASH / CURL
curl -X GET 'https://api.naeron.com:3110/v2/tables' \
  --header 'x-api-key: SIZE_VERILEN_ANAHTAR'
PYTHON
import requests
url = "https://api.naeron.com:3110/v2/tables"
headers = {"x-api-key": "SIZE_VERILEN_ANAHTAR"}
response = requests.get(url, headers=headers)
JAVASCRIPT
const headers = { 'x-api-key': 'SIZE_VERILEN_ANAHTAR' };
fetch('https://api.naeron.com:3110/v2/tables', { headers })
  .then(res => res.json());

V2 API Özellikleri (Features) Stable

Versiyon 2, tüm entegrasyonlar için önerilen standarttır. Eski API'nin kısıtlamalarını ortadan kaldırarak modern veri senkronizasyon yetenekleri sunar.

Özellik Açıklama
Cursor Sayfalama Milyonlarca kaydı performans kaybı olmadan tarayın.
Incremental Sync Sadece değişen verileri çekin (Delta Sync).
Hard Delete Log Silinen kayıtları takip ederek veri deponuzu güncel tutun.
7/24 Erişim V1'deki saat kısıtlaması (03:00-06:00) kaldırılmıştır.

V2 API Endpointleri (Endpoints)

RestBI V2 API, modern BI araçlarının ihtiyaç duyduğu tüm veri çekme yöntemlerini kapsayan 4 temel endpoint sunar. Her bir endpoint, tutarlı bir sayfalama ve yetkilendirme yapısına sahiptir.

Metot Endpoint Açıklama Kullanım Senaryosu
GET /v2/tables Tablo Listesi (Discovery) Erişilebilir tabloları ve özelliklerini keşfetmek için.
GET /v2/tables/:tableName/snapshot Tüm Kayıtlar (Full Snapshot) İlk yükleme veya tablonun tamamını yenilemek için.
GET /v2/tables/:tableName/changes Değişen Kayıtlar (Incremental) Sadece yeni veya güncellenmiş kayıtları çekmek için.
GET /v2/tables/:tableName/deleted Silinen Kayıtlar (Hard Delete Log) Kaynaktan silinen kayıtları temizlemek için.
Dinamik Parametre Desteği

Tüm veri endpointleri (Snapshot, Changes, Deleted) limit ve cursor parametrelerini standart olarak destekler. Bazı tablolar ek olarak startDate ve endDate gibi dinamik filtreleri de kabul eder.

Tablo Listesi (Discovery)

Erişilebilir tüm tabloları, birincil anahtarları ve desteklenen özellikleri öğrenin. Bu endpoint, BI araçlarınızın veri şemasını otomatik olarak tanıması için meta-veri sağlar.

Endpoint

GET /v2/tables

Yanıt Alanları (Response Fields)

Alan (Key) Tip Açıklama
name String API endpoint'lerinde kullanılacak tablo ID'si (Örn: bi_students).
pk String Tablonun birincil anahtar (Primary Key) kolonu. Sayfalama ve veri tekilleştirme için kullanılır.
dateColumn String Artımlı yükleme (incremental) için baz alınan zaman damgası kolonu.
supportsIncremental Boolean true ise /changes endpoint'i kullanılabilir.
supportsHardDelete Boolean true ise /deleted endpoint'i üzerinden silinen kayıt takibi yapılabilir.
queryParams Array Tablo bazlı dinamik filtreler. Örn: Başlangıç ve bitiş tarihi filtreleri.

Örnek Yanıt

JSON RESPONSE
{
  "tables": [
    {
      "name": "bi_students",
      "pk": "m_ID",
      "dateColumn": "__Log_Time",
      "supportsIncremental": true,
      "supportsHardDelete": true,
      "queryParams": []
    },
    {
      "name": "bi_flights",
      "pk": "m_ID",
      "dateColumn": "__Log_Time",
      "supportsIncremental": true,
      "supportsHardDelete": true,
      "queryParams": [
        { "name": "startDate", "type": "date" },
        { "name": "endDate", "type": "date" }
      ]
    },
    {
      "name": "bi_budgets_report",
      "pk": "order",
      "dateColumn": null,
      "supportsIncremental": false,
      "supportsHardDelete": false,
      "queryParams": [
        {
          "name": "startDate",
          "type": "date",
          "description": "Başlangıç tarihi (Esnek format, Örn: 2025-01-01 veya JS Date string)"
        },
        {
          "name": "endDate",
          "type": "date",
          "description": "Bitiş tarihi (Esnek format, Örn: 2025-12-31 veya JS Date string)"
        }
      ]
    }
  ]
}

Tüm Kayıtlar (Snapshot)

Tabloyu tamamen yeniden yüklemek istediğinizde kullanılır. Büyük tablolar için PK (Primary Key) tabanlı cursor sayfalama sistemini destekler.

GET /v2/tables/{tableName}/snapshot

Parametreler

Parametre Tip Zorunlu Açıklama
limit Integer Hayır Dönecek maksimum kayıt sayısı (Varsayılan: 1000, Max: 10000).
cursor String Hayır * Bir önceki yanıttan dönen nextCursor değeri. Snapshot'ta PK tabanlı ilerleme sağlar. (* Sayfalama için gereklidir)
cURL
# Tüm bi_bases tablosunu tek seferde çekme
curl 'https://api.naeron.com:3110/v2/tables/bi_bases/snapshot' \
  --header 'x-api-key: SIZE_VERILEN_ANAHTAR'
PYTHON
import requests

url = "https://api.naeron.com:3110/v2/tables/bi_bases/snapshot"
params = {"limit": 1000}
headers = {"x-api-key": "SIZE_VERILEN_ANAHTAR"}

while True:
    # Sayfalı olarak veriyi çekiyoruz
    response = requests.get(url, headers=headers, params=params)
    res = response.json()
    
    if 'data' in res:
        data_rows = res['data']
        print(f"{len(data_rows)} kayıt alındı.")
    
    # Daha fazla veri var mı kontrolü
    if not res.get('meta', {}).get('hasMore'):
        break
        
    # Bir sonraki sayfa için cursor
    params['cursor'] = res['meta']['cursor']
JAVASCRIPT
async function fullSyncBases() {
  const baseUrl = 'https://api.naeron.com:3110/v2/tables/bi_bases/snapshot';
  let cursor = null;
  const headers = { 'x-api-key': 'SIZE_VERILEN_ANAHTAR' };

  do {
    const url = `${baseUrl}?limit=1000${cursor ? '&cursor=' + encodeURIComponent(cursor) : ''}`;
    const response = await fetch(url, { headers });
    const res = await response.json();
    
    console.log(`${res.data.length} satır alındı.`);
    
    // Bir sonraki sayfa için cursor (nextCursor değeri kullanılır)
    cursor = res.meta && res.meta.hasMore ? res.meta.cursor : null;
  } while (cursor);
}

Değişen Kayıtlar (Incremental Sync)

BI verilerinizi güncel tutmanın en verimli yolu. Sadece son senkronizasyondan sonra eklenen veya güncellenen kayıtları döner.

Endpoint

GET /v2/tables/{tableName}/changes

Parametreler

Parametre Tip Zorunlu Açıklama
limit Integer Hayır Dönecek maksimum kayıt sayısı (Varsayılan: 1000, Max: 10000).
sinceDate String Hayır Moment.js tarafından desteklenen herhangi bir tarih formatı (Örn: 2025-01-01, 2025-01-01T00:00:00Z). Belirtilen tarihten sonraki verileri filtreler.
cursor String Hayır * Bir önceki yanıttan dönen nextCursor değeri. Sayfalama için kullanılır. (* Sayfalama için gereklidir)
cURL
# 100 kayıtlık limit ve başlangıç tarihi ile istek atma
curl 'https://api.naeron.com:3110/v2/tables/bi_students/changes?limit=100&sinceDate=2025-01-01T00:00:00Z' \
  --header 'x-api-key: SIZE_VERILEN_ANAHTAR'
PYTHON
import requests

url = "https://api.naeron.com:3110/v2/tables/bi_students/changes"
# İstek parametrelerini tanımlıyoruz
params = {
    "limit": 1000,
    "sinceDate": "2025-01-01T00:00:00Z" # İlk istekte belli bir tarihten başlatabilirsiniz
}
headers = {"x-api-key": "SIZE_VERILEN_ANAHTAR"}

while True:
    # API'ye istek gönderiyoruz
    response = requests.get(url, headers=headers, params=params)
    res = response.json()
    
    # Gelen veriyi işleme alanı
    # V2 formatında veriler 'data' anahtarı altında gelir
    if 'data' in res:
        data_rows = res['data']
        print(f"{len(data_rows)} yeni kayıt alındı.")
        # Burada veriyi veritabanınıza kaydedebilirsiniz
    
    # Daha fazla veri var mı kontrol ediyoruz (Sayfalama)
    if not res.get('meta', {}).get('hasMore'):
        print("Tüm güncel veriler senkronize edildi.")
        break
        
    # Bir sonraki sayfa için cursor değerini güncelliyoruz
    params['cursor'] = res['meta']['cursor']
JAVASCRIPT
async function syncStudents() {
  const baseUrl = 'https://api.naeron.com:3110/v2/tables/bi_students/changes';
  let cursor = null;
  const headers = { 'x-api-key': 'SIZE_VERILEN_ANAHTAR' };

  do {
    // Varsa cursor parametresini URL'e ekliyoruz
    const url = `${baseUrl}?limit=500${cursor ? '&cursor=' + encodeURIComponent(cursor) : ''}`;
    
    try {
      const response = await fetch(url, { headers });
      const res = await response.json();
      
      // Veriyi işliyoruz (V2 standart: res.data)
      console.log(`${res.data.length} satır işleniyor...`);
      
      // Bir sonraki sayfa için cursor'ı güncelliyoruz (hasMore false ise döngü biter)
      cursor = res.meta && res.meta.hasMore ? res.meta.cursor : null;
      
    } catch (err) {
      console.error('Senkronizasyon hatası:', err);
      break;
    }
  } while (cursor);
}

Silinen Kayıtlar (Deleted Records)

Kaynaktan (Naeron) kalıcı olarak silinen (Hard Delete) verileri kendi sisteminizden temizlemek için bu endpoint'i kullanın.

GET /v2/tables/{tableName}/deleted

Parametre Tip Zorunlu Açıklama
limit Integer Hayır Dönen kayıt sayısı (1-10000, Varsayılan: 1000).
sinceDate String Hayır Belirli bir tarihten sonraki silinenleri almak için (Esnek format, Örn: 2025-01-01).
cursor String Hayır * Bir sonraki veri kümesini almak için kullanılan Base64 imleç. (* Sayfalama için gereklidir)
cURL
# Silinmiş ilgili tablo kayıtlarını sorgulama
curl 'https://api.naeron.com:3110/v2/tables/bi_flights/deleted' \
  --header 'x-api-key: SIZE_VERILEN_ANAHTAR'
PYTHON
import requests

url = "https://api.naeron.com:3110/v2/tables/bi_flights/deleted"
headers = {"x-api-key": "SIZE_VERILEN_ANAHTAR"}
params = {"limit": 1000}

while True:
    # Silinen kayıt loglarını alıyoruz
    res = requests.get(url, headers=headers, params=params).json()
    
    if 'deletedRecords' in res and res['deletedRecords']:
        for record in res['deletedRecords']:
            # recordID: Silinen kaydın birincil anahtarı (PK)
            # deletedAt: Silinme zamanı
            print(f"ID: {record['recordID']} olan kayıt şu tarihte silindi: {record['deletedAt']}")
        
        # Cursor varsa devam ediyoruz
        if res.get('meta', {}).get('cursor'):
            params['cursor'] = res['meta']['cursor']
        else:
            break
    else:
        break
JAVASCRIPT
async function cleanupDeletedRecords() {
  let url = 'https://api.naeron.com:3110/v2/tables/bi_flights/deleted?limit=1000';
  let hasMore = true;

  while (hasMore) {
    const response = await fetch(url, {
      headers: { 'x-api-key': 'SIZE_VERILEN_ANAHTAR' }
    });
    const res = await response.json();

    if (res.deletedRecords && res.deletedRecords.length > 0) {
      res.deletedRecords.forEach(item => {
        console.log(`Veritabanından silinecek ID: ${item.recordID}`);
      });

      if (res.meta && res.meta.cursor) {
        url = `https://api.naeron.com:3110/v2/tables/bi_flights/deleted?cursor=${res.meta.cursor}`;
      } else {
        hasMore = false;
      }
    } else {
      hasMore = false;
    }
  }
}

Hata Kodları (Error Codes)

API bir hata ile karşılaştığında standart bir JSON formatında yanıt döner. Bu yanıt error objesi altında code, message ve statusCode alanlarını içerir.

JSON RESPONSE
{
  "error": {
    "code": "INVALID_API_KEY",
    "message": "Invalid or inactive API key",
    "statusCode": 403
  }
}
Hata Kodu HTTP Durumu Açıklama
MISSING_API_KEY 401 x-api-key başlığı (header) eksik.
INVALID_API_KEY 403 Geçersiz veya inaktif API anahtarı.
TABLE_NOT_FOUND 404 İstenen tablo mevcut değil veya erişime açık değil.
INVALID_PARAM 400 Parametre formatı hatalı (Örn: geçersiz tarih formatı).
INVALID_LIMIT 400 limit parametresi pozitif bir tam sayı değil.
INVALID_CURSOR 400 cursor değeri bozuk veya süresi dolmuş.
INCREMENTAL_NOT_SUPPORTED 400 İlgili tablo artımlı yüklemeyi (incremental) desteklemiyor.
DATABASE_ERROR 500 Sunucu tarafında veritabanı hatası oluştu.
EXTERNAL_API_ERROR 500 Harici veri kaynağından veri çekilirken hata oluştu.
DATA_TRANSFORM_ERROR 500 Veri dönüştürme işlemi sırasında hata oluştu.

V1 → V2 Migrasyon Rehberi (Migration Guide)

V1'den V2'ye geçiş son derece kolaydır. Kimlik doğrulama aynı kalmıştır, sadece URL ve yanıt formatı güncellenmelidir.

Özellik Legacy (V1) Modern (V2)
Base URL /v1 /v2
Yanıt Formatı Array [...] Object { meta, data }
Erişim Saatleri 03:00 - 06:00 7/24
Pagination Yok Cursor Based
Durum Deprecated Aktif
Migrasyon Kontrol Listesi
Base URL'i /v2 olarak güncelleyin.
Endpoint yollarını değiştirin (/snapshot, /changes).
Veriyi res.data içerisinden okuyun.
Büyük tablolar için Cursor döngüsünü ekleyin.

RestBI API V1 (Legacy)

Bu sürüm artık geliştirilmemekte olup yakında kapatılacaktır.

V1 Giriş

V1 servisi, Naeron verilerine eski usul (tek seferde tüm veri) erişim sağlar.

Çalışma Saatleri

V1 sadece sunucu saatiyle 03:00 - 06:00 arasında veri döndürür.

Base URL: https://api.naeron.com:3110/v1

V1 Endpointler

  • GET /v1/tableNames - Tablo isimleri
  • GET /v1/tables - Tüm tablolar
  • GET /v1/tables/{tableName} - Tek tablo verisi

V1 Tablolar

Tablo AdıAçıklama
bi_studentsÖğrenci Bilgileri
bi_employeesPersonel Bilgileri
bi_flightsUçuş Kayıtları
bi_aircrafts_simulatorsUçak ve Simülatörler