İçeriğe geç
GELİŞTİRİCİ DOKÜMANI

Lisans Doğrulama API

Viasly'den satın alınan eklenti ve script'ler, çalıştıkları sunucuda lisansı bu REST uçlarıyla doğrular. Yanıt her zaman JSON'dur ve RS256 ile imzalıdır — eklenti, açık anahtarımızla yanıtın gerçekten Viasly'den geldiğini doğrulayabilir.

Nasıl çalışır

  1. Eklenti açılışta /api/license/verify ucuna anahtarı gönderir.
  2. Sunucu anahtarı doğrular ve çağrının kaynak IP'sini lisansa kilitler. Kilit sayısı lisansın activationLimit değeri kadardır.
  3. Sonraki sorgular aynı IP'den geldiği sürece yeni slot harcanmaz; yalnız “son görülme” bilgisi tazelenir.
  4. Sunucu değiştiğinde müşteri panelden eski sunucuyu bırakır (bir IP değişim hakkı harcanır) ya da eklenti /api/license/release çağırır.
Kilit için istemcinin bildirdiği IP kullanılmaz, isteğin gerçek kaynak adresi esas alınır. Gövdeye ip yazmak kilidi değiştirmez.

Uçlar

POSThttps://viasly.com/api/license/verify
Lisans doğrula ve sunucuyu kilitle

Eklentinin normalde çağırdığı uç. Slot boşsa çağıran sunucuyu lisansa bağlar.

GEThttps://viasly.com/api/license/info?key=VSL-XXXX-XXXX-XXXX
Durum sorgula (yan etkisiz)

Kilide DOKUNMAZ, slot harcamaz, JWT dönmez. Kurulum sihirbazı ve destek için.

POSThttps://viasly.com/api/license/release
Sunucu kilidini bırak

Yalnız çağıran IP'ye ait kilidi düşürür ve bir IP değişim hakkı harcar.

GEThttps://viasly.com/api/license/product?slug=ornek-plugin&version=1.3.0
Ürün / sürüm sorgusu (anahtarsız)

Ücretsiz ürünler ve güncelleme bildirimi için. Anahtar gerekmez, slot harcamaz.

GEThttps://viasly.com/api/license/test-vectors
Test vektörleri (geliştirme)

İmza doğrulayıcını dene: geçerli imza, bozuk imza, bozuk yük, süresi geçmiş kira, yanlış nonce.

İstek

Gövde JSON veya application/x-www-form-urlencoded olabilir; alanlar sorgu dizesiyle de geçilebilir.

AlanDurumAçıklama
keyzorunluLisans anahtarı — VSL-XXXX-XXXX-XXXX. Küçük harf ve boşluk tolere edilir.
productopsiyonelÜrün slug'ı. Verilirse anahtarın o ürüne ait olduğu da doğrulanır.
hostopsiyonelSunucu adı/alan adı. Yalnız gösterim içindir, kimlik doğrulamaz.
nonceönerilirHer istekte ürettiğin rastgele değer. İmzalanan yüke aynen konur; eski bir yanıtın tekrar oynatılmasını engeller.
curl
curl -X POST https://viasly.com/api/license/verify \
  -H "content-type: application/json" \
  -d '{"key":"VSL-A1B2-C3D4-E5F6","product":"ornek-plugin","host":"mc.sunucum.net"}'

Yanıt

Geçerli lisansta valid: true döner. Yanıt gövdesi geçersiz durumlarda da aynı şekildedir — tek bir çözümleyici yeter.

200 OK
{
  "valid": true,
  "reason": null,
  "message": "Lisans geçerli.",
  "license": {
    "key": "VSL-A1B2-C3D4-E5F6",
    "type": "TEKIL",
    "status": "AKTIF",
    "issuedAt": "2026-08-20T09:14:00.000Z",
    "expiresAt": null,
    "daysLeft": null,
    "activations": { "used": 1, "limit": 1, "remaining": 0, "unlimited": false },
    "ipChanges":   { "used": 0, "limit": 3, "remaining": 3 }
  },
  "product": { "slug": "ornek-plugin", "name": "Örnek Plugin", "version": "1.4.0", "type": "PLUGIN" },
  "owner":   { "name": "Ad Soyad", "email": "ad****@ornek.com" },
  "server":  { "ip": "88.230.x.x", "host": "mc.sunucum.net", "boundAt": "...", "newBinding": true },
  "boundServers": [ { "ip": "88.230.x.x", "host": "mc.sunucum.net", "lastSeenAt": "..." } ],
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "checkedAt": "2026-08-29T12:00:00.000Z",
  "apiVersion": "1"
}

Hata durumları

HTTP durum kodu anlamlıdır, ancak basit istemciler yalnız valid alanına da bakabilir.

reasonHTTPAnlamı
missing_key400Anahtar gönderilmedi.
not_found404Anahtar kayıtlı değil.
revoked403Lisans iptal edilmiş.
inactive403Lisans aktif değil.
expired403Süresi dolmuş.
product_mismatch403Anahtar başka bir ürüne ait.
limit_reached409Tüm sunucu slotları dolu; başka bir sunucuya kilitli.
rate_limited429Hız sınırı (IP başına dakikada 60 sorgu).
server_error503Lisans servisi geçici olarak yanıt veremiyor.
503'te eklentiyi kapatma. Bu kod “lisans geçersiz” demek değildir, “şu an cevap veremiyoruz” demektir. Geçici ağ kesintisinde çalışan sunucuları durdurmamak için son başarılı yanıtı bir süre önbellekte tutman önerilir.

Yanıt imzası (RS256) — bunu mutlaka doğrula

Her /verify, /info ve /product yanıtı signed, signature, keyId ve alg alanlarını taşır. İmza RS256'dır (RSA-2048 + SHA-256); açık anahtarı yayımlıyoruz, özel anahtar yalnız bizde kalır.

Sözleşme: signed = base64url(UTF-8(JSON yük)) ve signature = base64url(RS256(ASCII(signed))) — ikisi de padding'siz. İmza JSON'un kendisi üzerinde değil, signed dizesinin baytları üzerindedir; böylece iki taraf da JSON'u yeniden serileştirmez.

Açık anahtar: https://viasly.com//.well-known/viasly-license.pub (PEM) · tüm anahtarlar ve keyId eşlemesi: https://viasly.com//.well-known/viasly-license.json. Anahtarı jar'a göm, çalışma anında indirme — indirirsen sahte bir sunucu onu da yönlendirip kendi anahtarını verebilir.

Doğrulayıcını test etmek için: https://viasly.com//api/license/test-vectors — geçerli imza, bozuk imza, bozuk yük, süresi geçmiş notAfter ve yanlış nonce vektörleri döner.

Eski token alanı (HS256 JWT) hâlâ dönüyor ama onu doğrulamaya çalışma: sırrı paylaşılmaz. Kararlarını signed içindeki alanlara dayandır.

Örnek entegrasyon

Java (Bukkit/Spigot) — basitleştirilmiş
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://viasly.com/api/license/verify"))
    .header("content-type", "application/json")
    .timeout(Duration.ofSeconds(10))
    .POST(HttpRequest.BodyPublishers.ofString(
        "{\"key\":\"" + licenseKey + "\",\"product\":\"ornek-plugin\"}"))
    .build();

HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
JsonObject body = JsonParser.parseString(res.body()).getAsJsonObject();

if (body.get("valid").getAsBoolean()) {
    getLogger().info("Lisans geçerli.");
} else if (res.statusCode() == 503) {
    // Servis geçici olarak yanıt vermiyor — eklentiyi KAPATMA.
    getLogger().warning("Lisans servisi yanıt vermedi, son duruma göre devam ediliyor.");
} else {
    getLogger().severe("Lisans geçersiz: " + body.get("message").getAsString());
    getServer().getPluginManager().disablePlugin(this);
}
PHP
$ch = curl_init("https://viasly.com/api/license/verify");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_HTTPHEADER     => ["content-type: application/json"],
    CURLOPT_POSTFIELDS     => json_encode([
        "key"     => $licenseKey,
        "product" => "ornek-script",
        "host"    => $_SERVER["HTTP_HOST"] ?? "",
    ]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);

if (!empty($data["valid"])) {
    // Lisans geçerli — script çalışmaya devam eder.
} else {
    die("Lisans doğrulanamadı: " . ($data["message"] ?? "bilinmeyen hata"));
}

Anahtarın nerede?

Satın aldığın lisans anahtarları müşteri panelindeki Lisanslarım sayfasındadır. Aynı sayfadan license.json dosyasını indirebilir, kilitli sunucuları görebilir ve IP değişim hakkını kullanabilirsin.