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
- Eklenti açılışta
/api/license/verifyucuna anahtarı gönderir. - Sunucu anahtarı doğrular ve çağrının kaynak IP'sini lisansa kilitler. Kilit sayısı lisansın
activationLimitdeğeri kadardır. - Sonraki sorgular aynı IP'den geldiği sürece yeni slot harcanmaz; yalnız “son görülme” bilgisi tazelenir.
- 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.
ip yazmak kilidi değiştirmez.Uçlar
https://viasly.com/api/license/verifyEklentinin normalde çağırdığı uç. Slot boşsa çağıran sunucuyu lisansa bağlar.
https://viasly.com/api/license/info?key=VSL-XXXX-XXXX-XXXXKilide DOKUNMAZ, slot harcamaz, JWT dönmez. Kurulum sihirbazı ve destek için.
https://viasly.com/api/license/releaseYalnız çağıran IP'ye ait kilidi düşürür ve bir IP değişim hakkı harcar.
https://viasly.com/api/license/product?slug=ornek-plugin&version=1.3.0Ücretsiz ürünler ve güncelleme bildirimi için. Anahtar gerekmez, slot harcamaz.
https://viasly.com/api/license/test-vectorsİ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.
| Alan | Durum | Açıklama |
|---|---|---|
| key | zorunlu | Lisans anahtarı — VSL-XXXX-XXXX-XXXX. Küçük harf ve boşluk tolere edilir. |
| product | opsiyonel | Ürün slug'ı. Verilirse anahtarın o ürüne ait olduğu da doğrulanır. |
| host | opsiyonel | Sunucu adı/alan adı. Yalnız gösterim içindir, kimlik doğrulamaz. |
| nonce | önerilir | Her istekte ürettiğin rastgele değer. İmzalanan yüke aynen konur; eski bir yanıtın tekrar oynatılmasını engeller. |
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.
{
"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.
| reason | HTTP | Anlamı |
|---|---|---|
| missing_key | 400 | Anahtar gönderilmedi. |
| not_found | 404 | Anahtar kayıtlı değil. |
| revoked | 403 | Lisans iptal edilmiş. |
| inactive | 403 | Lisans aktif değil. |
| expired | 403 | Süresi dolmuş. |
| product_mismatch | 403 | Anahtar başka bir ürüne ait. |
| limit_reached | 409 | Tüm sunucu slotları dolu; başka bir sunucuya kilitli. |
| rate_limited | 429 | Hız sınırı (IP başına dakikada 60 sorgu). |
| server_error | 503 | Lisans servisi geçici olarak yanıt veremiyor. |
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
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);
}$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.

