Sistem Aktif
WhatsApp'tan Yazın
Geliştirici API · Sürüm 1.0

API Dokümantasyonu

Abelsis yazılımlarını kendi uygulamalarınıza entegre edin. Lisans doğrulama, domain aktivasyonu, hesap ve abonelik bilgilerini HMAC imzalı isteklerle otomatikleştirin.

1. API Anahtarı ve Secret Oluşturma

Hesabım → API Anahtarları bölümünden anahtar oluşturun. Her anahtar için API Key ve Secret Key çifti üretilir:

API Key (ak_live_…): isteklerde kimlik olarak gönderilir.

Secret Key (sk_live_…): imza üretmek için kullanılır ve yalnızca bir kez gösterilir. Kaybederseniz anahtarı iptal edip yenisini oluşturun.

Secret key hiçbir zaman istemci uygulamasında ( mobil uygulama, tarayıcı JS ) tutulmamalıdır. İmza sunucunuzda üretilmelidir.

2. Base URL

http://www.abelsis.com.tr/api/v1/

Servis durumunu kimlik doğrulaması olmadan görmek için: GET http://www.abelsis.com.tr/api/v1/

3. İstek İmzalama (HMAC-SHA256)

Her istekte üç zorunlu header gönderilir. İmza, aşağıdaki kanonik dizenin secret key ile HMAC-SHA256 imzasıdır:

// 1) Gövdenin SHA-256 özeti (GET için boş gövde: e3b0c44…)
body_sha256 = sha256_hex(raw_body)

// 2) Kanonik dize (her satır \n ile ayrılır, sonda \n YOK)
METHOD + "\n" + PATH + "\n" + TIMESTAMP + "\n" + body_sha256

// 3) İmza
X-Signature = hmac_sha256_hex(canonical_string, secret_key)

PATH değeri tam istek yoludur (/api/v1/license/activate), sorgu dizesi hariç. Aşağıdaki örneklerde imzalanan yol "/api/v1" . $endpoint ile oluşturulur. body_sha256 ise imzalamadan önce gönderdiğiniz ham (ham JSON) gövdenin özetidir. Zaman damgası sunucu saatinden en fazla ±300 saniye sapmalı olabilir.

Zorunlu Header'lar

Header Değer
X-Api-Keyak_live_… (API Key)
X-TimestampUnix zaman damgası (saniye)
X-Signaturehex imza (aşağıdaki örneklerdeki gibi üretilir)
Content-Typeapplication/json (POST isteklerinde)

4. Örnek İstekler

PHP

$apiKey    = 'ak_live_...';
$secretKey = 'sk_live_...';
$base      = 'http://www.abelsis.com.tr/api/v1/';

$endpoint  = '/license/activate';           // base URL'e gore goreli yol
$body      = json_encode([
    'license_key' => 'LISANS-ANAHTARI-123',
    'domain'      => 'musteri.com',
]);

$timestamp = time();
$bodyHash  = hash('sha256', $body);                    // ham govdenin ozeti
$canonical = "POST\n/api/v1" . $endpoint . "\n" . $timestamp . "\n" . $bodyHash;
$signature = hash_hmac('sha256', $canonical, $secretKey);

$ch = curl_init(rtrim($base, '/') . $endpoint);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $body,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'X-Api-Key: ' . $apiKey,
        'X-Timestamp: ' . $timestamp,
        'X-Signature: ' . $signature,
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

if (($response['status'] ?? '') === 'success') {
    // activate icin: $response['data']['message'] (orn. "Domain lisansa bağlandı.")
    // validate icin: $response['data']['valid'] === true
    echo "Tamam: " . ($response['data']['message'] ?? 'lisans doğrulandı');
} else {
    echo "Hata: " . ($response['errorMessage'] ?? 'bilinmeyen');
}

Python

import hashlib, hmac, json, time, urllib.request

API_KEY    = "ak_live_..."
SECRET_KEY = "sk_live_..."
BASE       = "http://www.abelsis.com.tr/api/v1/"

def call(method, endpoint, payload=None):
    """endpoint: '/license/validate' gibi base URL'e gore goreli yol"""
    path      = "/api/v1" + endpoint                 # imzalanan tam yol
    body      = json.dumps(payload).encode() if payload is not None else b""
    timestamp = str(int(time.time()))
    body_hash = hashlib.sha256(body).hexdigest()
    canonical = "\n".join([method, path, timestamp, body_hash])
    signature = hmac.new(SECRET_KEY.encode(), canonical.encode(), hashlib.sha256).hexdigest()

    req = urllib.request.Request(
        BASE.rstrip("/") + endpoint, data=body or None, method=method)
    req.add_header("Content-Type", "application/json")
    req.add_header("X-Api-Key", API_KEY)
    req.add_header("X-Timestamp", timestamp)
    req.add_header("X-Signature", signature)

    with urllib.request.urlopen(req, timeout=20) as r:
        return json.loads(r.read())

result = call("POST", "/license/validate",
              {"license_key": "LISANS-ANAHTARI-123", "domain": "musteri.com"})
print(result["data"]["valid"])

Node.js (sunucu tarafı)

import crypto from 'node:crypto';

const API_KEY    = 'ak_live_...';
const SECRET_KEY = 'sk_live_...';
const BASE       = 'http://www.abelsis.com.tr/api/v1/';

export async function call(method, endpoint, payload) {
  // endpoint: '/license/validate' gibi base URL'e gore goreli yol
  const path     = '/api/v1' + endpoint;              // imzalanan tam yol
  const body     = payload ? JSON.stringify(payload) : '';
  const ts       = Math.floor(Date.now() / 1000).toString();
  const bodyHash = crypto.createHash('sha256').update(body).digest('hex');
  const canonical = [method, path, ts, bodyHash].join('\n');
  const signature = crypto.createHmac('sha256', SECRET_KEY).update(canonical).digest('hex');

  const res = await fetch(BASE.replace(/\/$/, '') + endpoint, {
    method,
    headers: {
      'Content-Type': 'application/json',
      'X-Api-Key': API_KEY,
      'X-Timestamp': ts,
      'X-Signature': signature,
    },
    body: payload ? body : undefined,
  });
  return res.json();
}

cURL / Bash

API_KEY="ak_live_..."
SECRET_KEY="sk_live_..."
BASE="http://www.abelsis.com.tr/api/v1/"
METHOD="POST"
ENDPOINT="/license/validate"
BODY='{"license_key":"LISANS-ANAHTARI-123","domain":"musteri.com"}'

SIGNED_PATH="/api/v1${ENDPOINT}"          # imzalanan tam yol
TS=$(date +%s)
BODY_HASH=$(printf '%s' "$BODY" | sha256sum | cut -d' ' -f1)
SIGNATURE=$(printf '%s\n%s\n%s\n%s' "$METHOD" "$SIGNED_PATH" "$TS" "$BODY_HASH" \
  | openssl dgst -sha256 -hmac "$SECRET_KEY" -r | cut -d' ' -f1)

curl -X "$METHOD" "${BASE%/}${ENDPOINT}" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Timestamp: $TS" \
  -H "X-Signature: $SIGNATURE" \
  -d "$BODY"

5. Endpoint'ler

Metot Yol Açıklama
GET /account Anahtarın sahibi hesabın bilgileri ve anahtar istatistikleri
GET /licenses Hesaba ait tüm lisanslar (özet + domain sayısı)
GET /licenses/{license_key} Tek lisansın detayı, domain listesi ve bitiş tarihi
POST /license/activate Domain'i lisansa bağlar (lisans planı limiti kadar)
POST /license/validate Lisans + domain doğrulaması (uygulama açılış kontrolü)
GET /subscriptions Hesabın aktif/geçmiş abonelikleri
GET /plans Ürün, sürüm ve lisans planları fiyatları

Gövde Örnekleri

// POST /api/v1/license/activate
{
  "license_key": "LISANS-ANAHTARI-123",
  "domain": "musteri.com"
}

// "domain" alanina tam URL de yazabilirsiniz:
// "https://www.musteri.com/panel" -> "www.musteri.com"
// POST /api/v1/license/validate
{
  "license_key": "LISANS-ANAHTARI-123",
  "domain": "musteri.com"
}

// domain gonderilmezse yalnizca lisans durumu kontrol edilir
{
  "license_key": "LISANS-ANAHTARI-123"
}

6. Yanıt Formatı

Başarılı (HTTP 200)

{
  "status": "success",
  "systemTime": 1735689600,
  "data": {
    "license_key": "LISANS-ANAHTARI-123",
    "valid": true,
    "status": "active",
    "checked_at": "2026-09-30T04:10:05+03:00",
    "domain": "musteri.com",
    "domain_registered": true,
    "domain_allowed": true
  }
}

Hata (HTTP 4xx / 5xx)

{
  "status": "error",
  "errorCode": "SIGNATURE_INVALID",
  "errorMessage": "İmza doğrulaması başarısız.",
  "systemTime": 1735689600
}

validate isteğinde lisans geçersizse HTTP 200 döner ve data.valid = false olur (istemci tarafı hata değil, doğrulama sonucudur).

7. Hata Kodları

HTTP errorCode Anlamı
400INVALID_JSONGövde geçerli bir JSON değil
400MISSING_LICENSE_KEYlicense_key gönderilmedi
400MISSING_DOMAINdomain gönderilmedi (activate için zorunlu)
400INVALID_DOMAINDomain ayrıştırılamadı
401API_KEY_MISSINGX-Api-Key header'ı yok
401API_KEY_INVALIDAPI anahtarı bulunamadı
401SIGNATURE_MISSINGX-Timestamp veya X-Signature yok
401SIGNATURE_INVALIDİmza uyuşmuyor (gövde/zaman damgası değişmiş olabilir)
401TIMESTAMP_INVALIDZaman damgası sayı değil
401TIMESTAMP_EXPIREDZaman damgası ±300 sn dışında
403API_KEY_REVOKEDAnahtar iptal edilmiş
403API_KEY_EXPIREDAnahtarın süresi dolmuş
403ACCOUNT_INACTIVEAnahtarın sahibi hesap pasif
403IP_NOT_ALLOWEDIP beyaz listeye uymuyor
403LICENSE_NOT_ACTIVELisans pasif veya süresi dolmuş
403DOMAIN_LIMIT_EXCEEDEDLisans planı domain limiti aşıldı
403DOMAIN_IN_USEDomain başka bir lisansa bağlı
404LICENSE_NOT_FOUNDLisans yok veya bu hesaba ait değil
404ENDPOINT_NOT_FOUNDBöyle bir endpoint yok
405METHOD_NOT_ALLOWEDEndpoint bu HTTP metodunu desteklemiyor
429RATE_LIMIT_EXCEEDEDDakikada 120 istek sınırı aşıldı (Retry-After header'ı)
500SERVER_CONFIG_ERRORSunucu API yapılandırması eksik
500ACTIVATION_FAILEDDomain aktivasyonu sırasında sunucu hatası
503API_DISABLEDAPI servisi geçici olarak kapalı

8. Limitler ve Güvenlik

Hız limiti

IP başına dakikada 120 istek. Aşılırsa HTTP 429 ve Retry-After header'ı döner.

Zaman penceresi

İstek zaman damgası sunucu saatinden en fazla ±300 saniye sapmalı olabilir (replay koruması).

Anahtar limiti

Hesap başına en fazla 5 aktif anahtar. Anahtarlar hesabınıza aittir, başka hesaplar göremez.

IP beyaz listesi

Anahtar oluştururken sunucu IP'lerinizi sınırlayabilirsiniz (virgülle ayrılmış liste).

9. Servis Durumu

Bu endpoint imza gerektirmez; sunucunun ayakta olduğunu doğrulamak için kullanabilirsiniz:

curl http://www.abelsis.com.tr/api/v1/