API Dokümantasyonu

RBL Watch REST API referansı. Tüm endpoint'ler JSON formatında yanıt döner.

Hızlı Başlangıç

API anahtarınızı Ayarlar sayfasından oluşturabilirsiniz. Aşağıdaki örnekle hemen test edebilirsiniz:

curl -H "Authorization: Bearer YOUR_API_KEY" https://rbl.watch/api/ips

Tüm istekler https://rbl.watch temel URL'si üzerinden yapılır.

Kimlik Doğrulama

Session Cookie (Web)

Tarayıcı üzerinden giriş yaptığınızda otomatik olarak rbl_session cookie'si oluşturulur. Web arayüzü bu yöntemi kullanır.

API Key (Programatik Erişim)

Tüm API isteklerinde Authorization header'ı ile API anahtarınızı göndermeniz gerekir:

Authorization: Bearer <api_key>
Pro+ API erişimi Pro plan ve üzerini gerektirir.

Rate Limiting

API istekleri plan bazında sınırlandırılmıştır. Aşılan limitler 429 Too Many Requests yanıtı döner.

Plan İstek / dakika Tarama / gün
Ücretsiz-5
Pro60100
Business120500
Enterprise300Sınırsız

Yanıt header'larında X-RateLimit-Remaining ve X-RateLimit-Reset bilgileri yer alır.

IP Yönetimi

GET /api/ips IP listesi
Parametreler
page     : int    - Sayfa numarasi (varsayilan: 1)
size     : int    - Sayfa boyutu (varsayilan: 20)
status   : string - Filtre: clean, listed, unknown
service_tag : string - Servis etiketi filtresi
search   : string - IP veya hostname arama
Örnek Yanıt
{
  "items": [
    {
      "id": 1,
      "ip_address": "192.168.1.10",
      "hostname": "mail.example.com",
      "service_tag": "mail-server",
      "status": "clean",
      "last_scan_at": "2026-03-27T10:30:00Z",
      "listed_count": 0
    }
  ],
  "total": 42,
  "page": 1,
  "size": 20
}
POST /api/ips Yeni IP ekle
İstek Gövdesi (JSON)
{
  "ip_address": "192.168.1.10",
  "hostname": "mail.example.com",
  "service_tag": "mail-server",
  "description": "Ana mail sunucusu"
}
Örnek Yanıt
{
  "id": 2,
  "ip_address": "192.168.1.10",
  "hostname": "mail.example.com",
  "service_tag": "mail-server",
  "status": "unknown",
  "created_at": "2026-03-27T10:30:00Z"
}
DELETE /api/ips/{id} IP sil
Örnek Yanıt
{ "ok": true }

Başarılı silme işleminde 204 No Content döner.

POST /api/ips/bulk CSV ile toplu import Pro+
İstek (multipart/form-data)
file : CSV dosyası (ip_address, hostname, service_tag, description sütunları)
Örnek Yanıt
{
  "imported": 15,
  "skipped": 2,
  "errors": []
}
POST /api/ips/cidr CIDR blok import Pro+
İstek Gövdesi (JSON)
{
  "cidr": "192.168.1.0/28",
  "service_tag": "web-servers",
  "description": "Web sunucu blogu"
}
Örnek Yanıt
{
  "imported": 14,
  "skipped": 0,
  "cidr": "192.168.1.0/28"
}
GET /api/ips/export/csv CSV export

Tüm IP'leri CSV formatında indirir. Yanıt Content-Type: text/csv header'ı ile döner.

Tarama

GET /api/scan/jobs Tarama geçmişi
Örnek Yanıt
[
  {
    "id": 10,
    "type": "full",
    "status": "completed",
    "total_ips": 42,
    "listed_count": 3,
    "started_at": "2026-03-27T08:00:00Z",
    "completed_at": "2026-03-27T08:05:30Z"
  }
]
POST /api/ips/{id}/scan Tekli IP tara
Örnek Yanıt
{
  "job_id": 11,
  "status": "running",
  "ip_address": "192.168.1.10"
}
GET /api/scan/jobs/{id}/listed Tarama sonuçları
Örnek Yanıt
[
  {
    "ip_address": "192.168.1.10",
    "rbl_host": "zen.spamhaus.org",
    "listed": true,
    "response": "127.0.0.2",
    "checked_at": "2026-03-27T08:01:12Z"
  }
]

Listelenme

GET /api/listings Aktif listelenme listesi
Örnek Yanıt
[
  {
    "id": 5,
    "ip_address": "192.168.1.10",
    "rbl_host": "zen.spamhaus.org",
    "rbl_name": "Spamhaus ZEN",
    "first_seen": "2026-03-25T14:00:00Z",
    "last_seen": "2026-03-27T08:01:12Z",
    "status": "active"
  }
]
GET /api/listings/export/csv CSV export

Aktif listelenmeleri CSV formatında indirir.

GET /api/ips/{id}/active-listings IP bazında aktif listelenme
Örnek Yanıt
[
  {
    "rbl_host": "zen.spamhaus.org",
    "rbl_name": "Spamhaus ZEN",
    "first_seen": "2026-03-25T14:00:00Z",
    "last_seen": "2026-03-27T08:01:12Z"
  }
]
GET /api/ips/{id}/history IP tarama geçmişi
Örnek Yanıt
[
  {
    "scan_job_id": 10,
    "status": "clean",
    "listed_count": 0,
    "checked_at": "2026-03-27T08:01:00Z"
  }
]

RBL Sunucuları

GET /api/rbls RBL listesi
Örnek Yanıt
[
  {
    "id": 1,
    "name": "Spamhaus ZEN",
    "host": "zen.spamhaus.org",
    "is_active": true,
    "category": "spam"
  }
]

Gruplar

GET /api/groups Grup listesi
Örnek Yanıt
[
  {
    "id": 1,
    "name": "Mail Sunucuları",
    "description": "Tüm mail sunucuları",
    "ip_count": 12,
    "created_at": "2026-03-20T10:00:00Z"
  }
]
POST /api/groups Grup oluştur
İstek Gövdesi (JSON)
{
  "name": "Web Sunucuları",
  "description": "Frontend sunuculari",
  "ip_ids": [1, 2, 5]
}
Örnek Yanıt
{
  "id": 2,
  "name": "Web Sunucuları",
  "description": "Frontend sunuculari",
  "ip_count": 3,
  "created_at": "2026-03-27T10:00:00Z"
}
PUT /api/groups/{id} Grup güncelle
İstek Gövdesi (JSON)
{
  "name": "Web Sunucuları (Güncellendi)",
  "description": "Tüm frontend sunucuları",
  "ip_ids": [1, 2, 5, 8]
}
DELETE /api/groups/{id} Grup sil

Başarılı silme işleminde 204 No Content döner. Gruba ait IP'ler silinmez.

POST /api/groups/{id}/scan Grup taraması başlat
Örnek Yanıt
{
  "job_id": 12,
  "status": "running",
  "group_name": "Mail Sunucuları",
  "total_ips": 12
}

Bildirim Kontaklari

GET /api/contacts Kontak listesi
Örnek Yanıt
[
  {
    "id": 1,
    "name": "DevOps Ekibi",
    "type": "email",
    "value": "devops@example.com",
    "is_active": true
  }
]
POST /api/contacts Kontak ekle
İstek Gövdesi (JSON)
{
  "name": "Sistem Yoneticisi",
  "type": "email",
  "value": "admin@example.com"
}
PUT /api/contacts/{id} Kontak güncelle
İstek Gövdesi (JSON)
{
  "name": "Sistem Yoneticisi",
  "type": "email",
  "value": "sysadmin@example.com",
  "is_active": true
}
DELETE /api/contacts/{id} Kontak sil

Başarılı silme işleminde 204 No Content döner.

Dashboard

GET /api/dashboard/stats Dashboard istatistikleri
Örnek Yanıt
{
  "total_ips": 42,
  "clean_ips": 39,
  "listed_ips": 3,
  "active_listings": 5,
  "last_scan_at": "2026-03-27T08:00:00Z",
  "rbls_checked": 45
}

Profil

GET /api/profile Profil bilgileri
Örnek Yanıt
{
  "username": "john",
  "display_name": "John Doe",
  "email": "john@example.com",
  "role": "admin",
  "tenant": "Acme Corp",
  "plan": "pro"
}
PUT /api/profile Profil güncelle
İstek Gövdesi (JSON)
{
  "display_name": "John Doe",
  "email": "john@example.com"
}
PUT /api/profile/password Şifre değiştir
İstek Gövdesi (JSON)
{
  "current_password": "eski_şifre",
  "new_password": "yeni_güçlü_şifre_123!"
}

Hata Kodları

Kod Anlamı Açıklama
400Bad RequestGeçersiz istek parametreleri
401UnauthorizedKimlik doğrulama gerekli
403ForbiddenYetkiniz yok (rol veya plan sınırı)
404Not FoundKaynak bulunamadı
409ConflictKaynak zaten mevcut (örneğin aynı IP)
429Too Many RequestsRate limit aşıldı
500Internal Server ErrorSunucu hatası
Hata Yanıt Formatı
{
  "detail": "Hata aciklamasi burada yer alir."
}