Abelsis AI Asistan
7/24 Satış Destek
Merhaba! 👋 Ben Abelsis AI Asistanıyım. Yazılım ürünlerimiz, güncel fiyatlar ve özel proje talepleri konusunda size yardımcı olabilirim.
📋 Teklif İçin Bilgileriniz
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-Key | ak_live_… (API Key) |
| X-Timestamp | Unix zaman damgası (saniye) |
| X-Signature | hex imza (aşağıdaki örneklerdeki gibi üretilir) |
| Content-Type | application/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ı |
|---|---|---|
| 400 | INVALID_JSON | Gövde geçerli bir JSON değil |
| 400 | MISSING_LICENSE_KEY | license_key gönderilmedi |
| 400 | MISSING_DOMAIN | domain gönderilmedi (activate için zorunlu) |
| 400 | INVALID_DOMAIN | Domain ayrıştırılamadı |
| 401 | API_KEY_MISSING | X-Api-Key header'ı yok |
| 401 | API_KEY_INVALID | API anahtarı bulunamadı |
| 401 | SIGNATURE_MISSING | X-Timestamp veya X-Signature yok |
| 401 | SIGNATURE_INVALID | İmza uyuşmuyor (gövde/zaman damgası değişmiş olabilir) |
| 401 | TIMESTAMP_INVALID | Zaman damgası sayı değil |
| 401 | TIMESTAMP_EXPIRED | Zaman damgası ±300 sn dışında |
| 403 | API_KEY_REVOKED | Anahtar iptal edilmiş |
| 403 | API_KEY_EXPIRED | Anahtarın süresi dolmuş |
| 403 | ACCOUNT_INACTIVE | Anahtarın sahibi hesap pasif |
| 403 | IP_NOT_ALLOWED | IP beyaz listeye uymuyor |
| 403 | LICENSE_NOT_ACTIVE | Lisans pasif veya süresi dolmuş |
| 403 | DOMAIN_LIMIT_EXCEEDED | Lisans planı domain limiti aşıldı |
| 403 | DOMAIN_IN_USE | Domain başka bir lisansa bağlı |
| 404 | LICENSE_NOT_FOUND | Lisans yok veya bu hesaba ait değil |
| 404 | ENDPOINT_NOT_FOUND | Böyle bir endpoint yok |
| 405 | METHOD_NOT_ALLOWED | Endpoint bu HTTP metodunu desteklemiyor |
| 429 | RATE_LIMIT_EXCEEDED | Dakikada 120 istek sınırı aşıldı (Retry-After header'ı) |
| 500 | SERVER_CONFIG_ERROR | Sunucu API yapılandırması eksik |
| 500 | ACTIVATION_FAILED | Domain aktivasyonu sırasında sunucu hatası |
| 503 | API_DISABLED | API 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/