Genel bakışBaşlarken
AnkSOFT Bayi API, AnkSOFT hizmetlerini kendi sisteminizden (WHMCS, WiseCP ya da kendi yazılımınız) sipariş etmenizi ve yönetmenizi sağlayan bir REST/JSON arayüzüdür. Siparişler bakiyenizden ödenir ve otomatik kurulur.
| Konu | Değer |
|---|
| Temel adres | https://www.anksoft.net/api/bayi/v1 |
| Biçim | JSON (UTF-8). Yalnız GET ve POST kullanılır. |
| Tutarlar | 2 ondalıklı metin, örneğin "206.91". Para birimi TRY. |
| KDV | Katalog ve fiyat listeleri KDV hariç; teklif ve sipariş toplamları KDV dahil (subtotal, tax, total). |
| İstek kimliği | Her yanıtta X-Request-Id başlığı döner. Destek talebinde bu değeri iletin. |
1. Bayi Paneli'ni açın
Her AnkSOFT müşterisi bayiliği kendisi açar: Müşteri Paneli > Satış Ortaklığı > Bayi Paneli. Vergi levhası, imza sirküleri ve kimlik belgenizi yükleyerek başvurursunuz; inceleme sürerken test anahtarı kullanılır, canlı anahtar onaydan sonra açılır. Bayi Paneli'nde API anahtarlarınızı oluşturur, anahtar başına IP listesi tanımlar ve webhook adresinizi girersiniz.
2. Anahtar türleri
| Önek | Ortam | Açıklama |
|---|
ank_live_ | Canlı | Gerçek sipariş verir, tutar bakiyenizden düşer. |
ank_test_ | Deneme ortamı | Aynı uçlar; gerçek hiçbir şey oluşturulmaz. 100.000,00 TRY tutarında ayrı bir sahte bakiye kullanılır. |
Anahtar biçimi: ank_live_<12 hex>_<43 base64url> (deneme için ank_test_...).
3. IP listesi
orders.write ya da domains.write kapsamı olan anahtarlar yalnız o anahtarın IP listesindeki adreslerden çalışır. Listede olmayan adresten gelen istek 403 ip_not_allowed, IP listesi tanımlanmamış böyle bir anahtar 403 ip_allowlist_required döner. WHMCS ya da WiseCP sunucunuzun genel (public) IP adresini listeye ekleyin.
4. Kapsamlar
Her anahtara yalnız ihtiyaç duyduğu kapsamları verin. Gerekli kapsam yoksa API 403 insufficient_scope döner.
| Kapsam | İzin verdiği | Uçlar |
|---|
catalog.read | Ürün kataloğunu ve fiyatları okumak | GET /catalog, GET /catalog/{id} |
orders.write | Fiyat teklifi almak ve sipariş vermek (IP listesi zorunlu) | POST /orders/quote, POST /orders |
services.read | Hizmetleri, işleri ve VDS durumunu okumak | GET /services, GET /services/{id}, GET /jobs/{id}, POST /services/{id}/actions/status |
services.power | VDS başlatma, durdurma, yeniden başlatma | POST /services/{id}/actions/start, .../stop, .../restart |
services.cancel | Hizmet iptali | POST /services/{id}/cancel |
services.credentials | Giriş bilgilerini okumak | GET /services/{id}/credentials |
billing.read | Bakiyeyi okumak | GET /balance |
domains.read | Alan adı fiyatlarını, uygunluğu ve alan adlarını okumak | GET /domains/tlds, GET /domains/check, GET /domains, GET /domains/{id}, GET /domains/{id}/epp |
domains.write | Alan adı kaydı, transferi ve değişiklikleri (IP listesi zorunlu) | POST /domains, POST /domains/{id}/nameservers, .../lock, .../auto-renew |
5. İlk siparişiniz
- Kataloğu okuyun:
GET /catalog - Kesin tutarı alın:
POST /orders/quote - Siparişi verin:
POST /orders (Idempotency-Key başlığıyla) - Kurulum işini izleyin:
GET /jobs/{id} ya da service.created bildirimi - Giriş bilgilerini alın:
GET /services/{id}/credentials
PHP kütüphanesiyle uçtan uca
<?php
require __DIR__ . '/AnksoftBayiClient.php';
$api = new AnksoftBayiClient(getenv('ANKSOFT_API_KEY'));
$products = $api->catalog(); // 1. katalog
$quote = $api->quote(105, 'monthly', ['90' => 301]); // 2. teklif (KDV dahil)
$order = $api->createOrder(105, 'monthly', 'cust-42', // 3. sipariş
'vm1.example.com', 'siparis-1001', ['90' => 301]);
$job = $api->waitForJob($order['job_id']); // 4. kurulum işi
if ($job['status'] === 'done') {
$login = $api->credentials($order['service_id']); // 5. giriş bilgileri
}
Bearer anahtarKimlik doğrulama
Her istekte anahtarınızı Authorization başlığında gönderin. Anahtar yoksa ya da geçersizse API 401 unauthorized döner.
Başlık
Authorization: Bearer ank_live_<12 hex>_<43 base64url>
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/balance" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
Yanıt 401
{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}
Hesap koşulları
- Bayi API'si hesabınızda etkin değilse:
403 reseller_not_active. - API
TRY ile çalışır; hesap para birimi desteklenmiyorsa: 403 unsupported_currency. - Anahtarda gerekli kapsam yoksa:
403 insufficient_scope (scope alanı eksik kapsamı verir).
Anahtarı yalnız sunucu tarafında tutun; tarayıcıya, mobil uygulamaya ya da herkese açık depoya koymayın.
Her sistem için ayrı anahtar ve en az kapsam kullanın. Anahtarın sızdığını düşünürseniz Bayi Paneli'nde yenisini oluşturun ve eskisini kaldırın.
KotaSınırlar ve hız
İstek hızı
| Tür | Anahtar başına dakikada |
|---|
| Okuma | 120 |
| Yazma | 30 |
| Sipariş | 10 |
Sınır aşılınca API 429 rate_limited ve Retry-After başlığı (saniye) döner. Bu süre kadar bekleyip isteği tekrarlayın.
Harcama ve hizmet sınırları
| Sınır | Değer | Hata |
|---|
| Anahtar günlük harcama sınırı | Her anahtarın TRY cinsinden günlük harcama sınırı vardır. | 429 key_spend_limit |
| Hesap, ilk 30 gün | Günde 10 hizmet ve 5.000 TRY | 429 daily_service_limit, 429 daily_spend_limit |
| Hesap, 30 günden eski | Günde 50 hizmet ve 50.000 TRY | 429 daily_service_limit, 429 daily_spend_limit |
AnkSOFT hesap sınırlarını değiştirebilir.
Diğer
- İstek gövdesi en çok 64 KB olabilir; büyükse
413 payload_too_large. - Sistem yoğunsa
503 busy ve Retry-After döner.
Hata yönetimiHata kodları
Hatalar HTTP durum koduyla ve aşağıdaki gövdeyle döner. Bazı kodlarda ek alan bulunur (required, scope, field, option_id). Programınızda message yerine code alanına göre karar verin.
Hata gövdesi
{
"error": {
"code": "insufficient_balance",
"message": "Insufficient balance.",
"required": "255.49"
}
}
| HTTP | Kod | Anlamı |
|---|
| 400 | invalid_json | Gövde geçerli JSON değil. |
| 400 | invalid_idempotency_key | Idempotency-Key yok ya da geçersiz (8 ile 64 karakter, A-Z a-z 0-9 _ -). |
| 401 | unauthorized | Anahtar yok ya da geçersiz. |
| 402 | insufficient_balance | Bakiye yetersiz. required alanı gereken tutarı verir. |
| 403 | reseller_not_active | Hesabınızda bayi API'si etkin değil. |
| 403 | insufficient_scope | Anahtarda gerekli kapsam yok. scope alanı eksik kapsamı verir. |
| 403 | ip_not_allowed | İstek, anahtarın IP listesinde olmayan bir adresten geldi. |
| 403 | ip_allowlist_required | Bu anahtar için IP listesi zorunlu (orders.write, domains.write). |
| 403 | unsupported_currency | Hesap para birimi desteklenmiyor; API TRY ile çalışır. |
| 404 | not_found | Kaynak bulunamadı. Başka bir hesaba ait kaynaklar için de bu döner. |
| 404 | product_not_found | Ürün bulunamadı ya da size açık değil. |
| 405 | method_not_allowed | Bu uç bu HTTP yöntemini kabul etmez. |
| 409 | out_of_stock | Ürün şu an stokta yok. |
| 409 | idempotency_conflict | Aynı Idempotency-Key farklı bir gövdeyle gönderildi. |
| 409 | request_in_progress | Aynı anahtarla gönderilen ilk istek hâlâ işleniyor; biraz sonra aynı isteği tekrarlayın. |
| 409 | price_changed | Fiyat değişti; kataloğu ya da teklifi yeniden alın. |
| 409 | service_not_active | İşlem yalnız etkin (active) hizmette yapılabilir. |
| 409 | service_not_ready | Hizmet henüz hazır değil; kurulum işi bitince tekrar deneyin. |
| 409 | action_not_supported | Güç işlemi bu hizmet türünde yok; durum, başlatma, durdurma ve yeniden başlatma yalnız VDS içindir. |
| 409 | domain_not_available | Alan adı kayıt için uygun değil. |
| 409 | domain_not_active | İşlem yalnız etkin (active) alan adında yapılabilir. |
| 413 | payload_too_large | Gövde 64 KB'den büyük. |
| 422 | invalid_parameter | Bir alan geçersiz. field alanı hangisi olduğunu verir. |
| 422 | invalid_end_customer_ref | end_customer_ref 1 ile 64 karakter olmalı: A-Z a-z 0-9 . _ -. |
| 422 | not_sellable | Ürün ya da dönem size satışa açık değil. |
| 422 | invalid_scope | Geçersiz kapsam adı. |
| 422 | invalid_ip | Geçersiz IP adresi. |
| 422 | invalid_option | Ürün seçeneği ya da değeri geçersiz. option_id alanı seçeneği verir. |
| 422 | tld_not_available | Uzantı ya da işlem şu an size satışa açık değil. |
| 429 | rate_limited | Dakikalık istek sınırı aşıldı; Retry-After kadar bekleyin. |
| 429 | daily_service_limit | Hesabın günlük hizmet sınırı doldu. |
| 429 | daily_spend_limit | Hesabın günlük harcama sınırı doldu. |
| 429 | key_spend_limit | Anahtarın günlük harcama sınırı doldu. |
| 502 | order_failed | Sipariş oluşturulamadı, hiçbir şey açılmadı. Yeni bir Idempotency-Key ile güvenle tekrar deneyebilirsiniz. |
| 502 | order_state_unknown | Siparişin durumu belirlenemedi. Tekrar denemeyin; X-Request-Id ile destek ekibine yazın. |
| 503 | service_closed | Bayi API'si geçici olarak kapalı. |
| 503 | service_unavailable | Hizmet geçici olarak kullanılamıyor. |
| 503 | busy | Sistem yoğun; Retry-After kadar bekleyin. |
Ne zaman tekrar denenir?
| Durum | Ne yapmalı |
|---|
| Ağ hatası ya da zaman aşımı (sipariş) | Aynı Idempotency-Key ve aynı gövdeyle tekrar gönderin. |
429, 503 busy | Retry-After kadar bekleyip tekrar deneyin. |
502 order_failed | Yeni bir Idempotency-Key ile tekrar deneyin. |
502 order_state_unknown | Tekrar denemeyin; destek ekibine yazın. |
İş durumu failed | Siparişi yeniden vermeyin; destek ekibimiz tamamlar. |
4xx | İsteği düzeltmeden tekrar göndermeyin. |
PHP kütüphanesinde hata yakalama
try {
$order = $api->createOrder(105, 'monthly', 'cust-42', 'vm1.example.com', 'siparis-1001');
} catch (AnksoftBayiException $e) {
// $e->httpStatus, $e->errorCode, $e->details, $e->retryAfter
if ($e->errorCode === 'insufficient_balance') {
$gereken = $e->details['required'];
} elseif ($e->httpStatus === 429) {
sleep($e->retryAfter ?? 60);
}
}
ÜrünlerKatalog ve ürün seçenekleri
Katalog, size satışa açık ürünleri ve satın alabileceğiniz her dönemin fiyatını verir. Fiyatlara bayi seviyenizin indirimi zaten uygulanmıştır ve KDV hariçtir.
Product nesnesi
| Alan | Tür | Açıklama |
|---|
id | integer | Ürün numarası; siparişte product_id. |
name | string | Ürün adı. |
group | string | Ürün grubu. |
type | string | vds, hosting ya da game. |
in_stock | boolean | Stok durumu. Stokta olmayan ürün siparişi 409 out_of_stock döner. |
hostname_required | boolean | true ise (hosting) müşterinin alan adını hostname olarak gönderin. |
currency | string | TRY |
tax_excluded | boolean | Fiyatlar KDV hariç (true). |
cycles | object | Dönem adı → {price, setup}. Yalnız satın alabileceğiniz dönemler listelenir. |
options | array | Option nesneleri. |
Option nesnesi
| Alan | Tür | Açıklama |
|---|
id | integer | Seçenek numarası; siparişte options anahtarı. |
name | string | Seçenek adı. |
type | string | select, quantity ya da yesno. |
default | integer | Seçeneği göndermezseniz kullanılan değer: seçim numarası (select), miktar (quantity) ya da 0/1 (yesno). |
min, max | integer | Yalnız quantity: izin verilen miktar aralığı. |
choices | array | Yalnız select: {id, name, cycles} seçimleri. |
cycles | object | Quantity için birim fiyat, yesno için 1 seçildiğindeki fiyat. |
Dönemler: monthly, quarterly, semiannually, annually, biennially, triennially.
Satışa açık tüm ürünler.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/catalog" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$products = $api->catalog(); // [Product, ...]
Yanıt 200
{
"data": [
{
"id": 105,
"name": "VDS 1",
"group": "Xeon Vds Sunucu",
"type": "vds",
"in_stock": true,
"hostname_required": false,
"currency": "TRY",
"tax_excluded": true,
"cycles": {
"monthly": {
"price": "206.91",
"setup": "0.00"
},
"quarterly": {
"price": "620.73",
"setup": "0.00"
}
},
"options": [
{
"id": 90,
"name": "İşletim Sistemi Seçiniz",
"type": "select",
"default": 301,
"choices": [
{
"id": 301,
"name": "Ubuntu 24.04",
"cycles": {
"monthly": {
"price": "0.00",
"setup": "0.00"
}
}
}
]
},
{
"id": 88,
"name": "Ek Disk (GB)",
"type": "quantity",
"default": 0,
"min": 0,
"max": 50,
"cycles": {
"monthly": {
"price": "3.00",
"setup": "0.00"
}
}
}
]
}
]
}
Tek ürün. Ürün yoksa ya da size açık değilse 404 product_not_found.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/catalog/105" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$product = $api->product(105);
Yanıt 200
{
"id": 105,
"name": "VDS 1",
"group": "Xeon Vds Sunucu",
"type": "vds",
"in_stock": true,
"hostname_required": false,
"currency": "TRY",
"tax_excluded": true,
"cycles": {
"monthly": {
"price": "206.91",
"setup": "0.00"
},
"quarterly": {
"price": "620.73",
"setup": "0.00"
}
},
"options": [
{
"id": 90,
"name": "İşletim Sistemi Seçiniz",
"type": "select",
"default": 301,
"choices": [
{
"id": 301,
"name": "Ubuntu 24.04",
"cycles": {
"monthly": {
"price": "0.00",
"setup": "0.00"
}
}
}
]
},
{
"id": 88,
"name": "Ek Disk (GB)",
"type": "quantity",
"default": 0,
"min": 0,
"max": 50,
"cycles": {
"monthly": {
"price": "3.00",
"setup": "0.00"
}
}
}
]
}
Siparişten önceFiyat teklifi
Teklif, siparişte bakiyenizden düşecek kesin tutarı KDV dahil verir. Hiçbir şey oluşturmaz.
Ürün, dönem ve seçeneklere göre tutar.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
product_id | integer | Evet | Katalogdaki ürün numarası. |
billing_cycle | string | Evet | monthly, quarterly, semiannually, annually, biennially, triennially |
options | object | Hayır | Seçenek numarası → değer: seçim numarası (select), miktar (quantity) ya da 0/1 (yesno). Gönderilmeyen seçenekte default kullanılır. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/orders/quote" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": 105, "billing_cycle": "monthly", "options": {"90": 301, "88": 2}}'
PHP kütüphanesi
$quote = $api->quote(105, 'monthly', ['90' => 301, '88' => 2]);
echo $quote['total'];
Yanıt 200
{
"subtotal": "212.91",
"tax": "42.58",
"total": "255.49",
"currency": "TRY",
"billing_cycle": "monthly"
}
Ürün siparişiSipariş
Sipariş bakiyenizden ödenir ve hizmet otomatik kurulur. Yanıt 202 ile hemen döner; kurulumu GET /jobs/{job_id} ile izleyin.
orders.writeIP listesiIdempotency-Key
Yeni hizmet siparişi.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
product_id | integer | Evet | Katalogdaki ürün numarası. |
billing_cycle | string | Evet | monthly, quarterly, semiannually, annually, biennially, triennially |
end_customer_ref | string | Evet | Kendi müşteri referansınız: 1 ile 64 karakter, A-Z a-z 0-9 . _ -. Kişisel veri koymayın. |
hostname | string | Hosting'de evet | VDS ve oyunda isteğe bağlı; hosting'de zorunlu (müşterinin alan adı). |
options | object | Hayır | Seçenek numarası → değer: seçim numarası (select), miktar (quantity) ya da 0/1 (yesno). Gönderilmeyen seçenekte default kullanılır. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/orders" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: whmcs-1001" \
-d '{"product_id": 105, "billing_cycle": "monthly", "end_customer_ref": "cust-42", "hostname": "vm1.example.com", "options": {"90": 301, "88": 2}}'
PHP kütüphanesi
$order = $api->createOrder(
105, // product_id
'monthly', // billing_cycle
'cust-42', // end_customer_ref
'vm1.example.com', // hostname
'whmcs-1001', // Idempotency-Key: siparişe özgü, sabit
['90' => 301, '88' => 2]
);
// $order['service_id'], $order['job_id']
Yanıt 202
{
"order_id": 9001,
"service_id": 20123,
"invoice_id": 145000,
"job_id": 5521,
"status": "processing",
"total": "255.49"
}
Idempotency: aynı sipariş iki kez açılmaz
POST /orders ve POST /domains isteklerinde Idempotency-Key başlığı zorunludur: 8 ile 64 karakter, A-Z a-z 0-9 _ -. Bu anahtar, bir siparişin kimliğidir. Bağlantı koptuğunda ya da yanıt gelmediğinde aynı isteği aynı anahtarla güvenle tekrar gönderirsiniz; API ikinci bir sipariş açmaz, ilk sonucu döndürür.
| Durum | Sonuç |
|---|
| Aynı anahtar, aynı gövde | İlk sonucun aynısı döner; ikinci sipariş açılmaz. |
| Aynı anahtar, farklı gövde | 409 idempotency_conflict |
| İlk istek hâlâ işleniyor | 409 request_in_progress |
| Başlık yok ya da biçimi hatalı | 400 invalid_idempotency_key |
- Anahtarı siparişi başlatan kayıttan türetin, örneğin
whmcs-<hizmet no>. Her denemede yeni rastgele değer üretirseniz koruma işe yaramaz. - PHP kütüphanesinde
createOrder() ve createDomain() anahtar verilmezse rastgele bir anahtar üretir; yeniden denemelerde kendi sabit anahtarınızı verin. 502 order_failed: hiçbir şey oluşturulmadı, yeni anahtarla tekrar deneyebilirsiniz.502 order_state_unknown: tekrar denemeyin, destek ekibine yazın.
Siparişte sık görülen hatalar: 402 insufficient_balance, 409 out_of_stock, 409 price_changed, 422 invalid_option, 422 not_sellable ve 429 günlük sınırlar.
Kurulum takibiİşler
Her sipariş bir iş (job) başlatır. İş tamamlanınca hizmet kullanıma hazırdır.
| Durum | Anlamı |
|---|
queued | Sırada. |
running | Kuruluyor. |
done | Tamamlandı. |
cancelled | İptal edildi. |
failed | Destek ekibimiz tamamlar. Siparişi asla yeniden vermeyin. |
İş durumu. Alan adı siparişlerinin işleri de bu uçla izlenir.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/jobs/5521" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$job = $api->job(5521);
// bitene kadar bekle: en çok 120 sn, 5 sn arayla
$job = $api->waitForJob(5521, 120, 5);
Yanıt 200
{
"id": 5521,
"type": "order",
"status": "done"
}
Durum, güç, iptal, giriş bilgisiHizmetler
Service nesnesi
| Alan | Tür | Açıklama |
|---|
id | integer | Hizmet numarası (service_id). |
order_id, invoice_id | integer | İlk sipariş ve fatura. |
end_customer_ref | string | Siparişte verdiğiniz referans. |
type, product_id | string, integer | Ürün türü ve numarası. |
status | string | pending, active, suspended, terminated, cancelled, fraud |
next_due_date, billing_cycle | string | Sonraki vade (YYYY-MM-DD) ve dönem. |
capabilities | array | Yapılabilecek işlemler. VDS: status, start, stop, restart, cancel; hosting ve oyun: cancel. |
hostname, ip, ips | string, string, array | Yalnız tek hizmet yanıtında. |
Hizmetleriniz, sayfa başına 100 kayıt. Sonraki sayfa için son kaydın id değerini after olarak gönderin.
Sorgu parametreleri
| Alan | Tür | Zorunlu | Açıklama |
|---|
after | integer | Hayır | Önceki sayfanın son hizmet numarası. |
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/services?after=20100" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$after = 0;
do {
$page = $api->services($after);
foreach ($page as $s) {
$after = $s['id'];
}
} while (count($page) === 100);
Yanıt 200
{
"data": [
{
"id": 20123,
"order_id": 9001,
"invoice_id": 145000,
"end_customer_ref": "cust-42",
"type": "vds",
"product_id": 105,
"status": "active",
"next_due_date": "2026-12-09",
"billing_cycle": "monthly",
"capabilities": [
"status",
"start",
"stop",
"restart",
"cancel"
]
}
]
}
Tek hizmet; hostname, ip ve ips alanlarıyla.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/services/20123" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$service = $api->service(20123);
Yanıt 200
{
"id": 20123,
"order_id": 9001,
"invoice_id": 145000,
"end_customer_ref": "cust-42",
"type": "vds",
"product_id": 105,
"status": "active",
"next_due_date": "2026-12-09",
"billing_cycle": "monthly",
"capabilities": [
"status",
"start",
"stop",
"restart",
"cancel"
],
"hostname": "vm1.example.com",
"ip": "185.118.141.120",
"ips": []
}
GET/services/{id}/credentials
services.credentials
Müşterinize ileteceğiniz giriş bilgileri. Yalnız etkin hizmetlerde çalışır. Şifreyi düz metin olarak kaydetmeyin ve loglamayın.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/services/20124/credentials" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$login = $api->credentials(20124);
Yanıt 200
{
"service_id": 20124,
"hostname": "ornekmusteri.com",
"ip": "185.118.141.30",
"ips": [],
"username": "ornekmus",
"password": "<password>",
"server_hostname": "hosting1.example.net",
"server_ip": "185.118.141.30"
}
| Alan | Tür | Açıklama |
|---|
service_id | integer | Hizmet numarası. |
hostname, ip, ips | string, string, array | Hizmetin adı ve IP adresleri. |
username, password | string | Giriş bilgileri. |
server_hostname, server_ip | string | Hosting'de kontrol paneli sunucusu, oyunda panel. |
POST/services/{id}/actions/status
services.read
VDS anlık durumu. state: running, off ya da unknown. Yalnız VDS; diğer türlerde 409 action_not_supported.
İstek gövdesi gerekmez.
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/services/20123/actions/status" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$st = $api->status(20123);
Yanıt 200
{
"state": "running",
"cpu_percent": 12,
"ram_percent": 41
}
POST/services/{id}/actions/start
POST/services/{id}/actions/stop
POST/services/{id}/actions/restart
services.power
VDS başlatma, durdurma ve yeniden başlatma. Yalnız VDS; diğer türlerde 409 action_not_supported.
İstek gövdesi gerekmez.
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/services/20123/actions/restart" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$api->start(20123);
$api->stop(20123);
$api->restart(20123);
Yanıt 200
{
"ok": true,
"action": "restart"
}
POST/services/{id}/cancel
services.cancel
Hizmeti AnkSOFT tarafında iptal eder. end_of_period dönem sonunda iptal eder (yenileme faturası oluşmaz), immediate hemen iptal eder.
Yenilemeler bakiyenizden otomatik ödenir: müşterinizin artık ödemediği hizmetleri iptal edin.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
type | string | Evet | end_of_period ya da immediate |
reason | string | Hayır | İptal nedeni. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/services/20123/cancel" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "end_of_period", "reason": "customer left"}'
PHP kütüphanesi
$api->cancel(20123); // dönem sonunda
$api->cancel(20123, true, 'müşteri ayrıldı'); // hemen
Yanıt 202
{
"ok": true,
"service_id": 20123,
"type": "end_of_period"
}
Ön ödemeli hesapBakiye
Siparişler ve yenilemeler bakiyenizden ödenir. Bakiyeyi müşteri panelinden Havale/EFT ile yüklersiniz. Bakiye eşiğin altına düşünce balance.low bildirimi gelir.
balance toplam bakiye, reserved henüz ödenmemiş siparişlere ayrılan tutar, available kullanılabilir tutar.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/balance" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$b = $api->balance();
echo $b['available'];
Yanıt 200
{
"balance": "12500.00",
"reserved": "255.49",
"available": "12244.51",
"currency": "TRY"
}
Kayıt, transfer, yönetimAlan adları
Okuma uçları domains.read, sipariş ve değişiklikler domains.write kapsamı ister (IP listesi zorunlu). Kayıt sahibi (registrant) olarak bayi hesabınızın bilgileri kullanılır.
Fiyat, AnkSOFT alan adı liste fiyatından bayi indiriminizin düşülmesiyle bulunur (müşteri panelindeki sepetle aynı). Bir uzantı ya da işlem, bu fiyat kayıt kuruluşu maliyetinin bir güvenlik payı üzerinde kaldığı sürece satışa açıktır; maliyetler her gün kayıt kuruluşundan okunur. Aksi halde uzantı /domains/tlds listesinde görünmez ve sipariş 422 tld_not_available döner.
Satıştaki uzantılar maliyet kuralına göre değişebilir; listeyi kodunuza sabit yazmayın, güncel uzantıları ve fiyatları her zaman GET /domains/tlds ile alın. Ad sunucusu, kilit ve otomatik yenileme değişiklikleri yalnız etkin alan adında yapılır; aksi halde 409 domain_not_active.
Domain nesnesi
| Alan | Tür | Açıklama |
|---|
id, domain, order_id | integer, string, integer | Alan adı kaydı. |
end_customer_ref | string | Siparişte verdiğiniz referans. |
status | string | pending, active, expired, transferred_away, cancelled ve diğerleri. |
registration_date, expiry_date, next_due_date | string | YYYY-MM-DD |
auto_renew | boolean | false ise süre sonunda bakiyenizden yenilenmez. |
nameservers | array | Ad sunucuları. |
Satabileceğiniz uzantılar; kayıt, transfer ve yenileme fiyatları yıl sayısına göre (KDV hariç).
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/domains/tlds" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$tlds = $api->domainTlds();
Yanıt 200
{
"data": [
{
"tld": ".net",
"register": {
"1": "737.10",
"2": "1474.20"
},
"transfer": {
"1": "737.10"
},
"renew": {
"1": "737.10"
},
"currency": "TRY",
"tax_excluded": true
}
]
}
Alan adının kayıt için uygunluğu ve 1 yıllık kayıt fiyatı.
Sorgu parametreleri
| Alan | Tür | Zorunlu | Açıklama |
|---|
domain | string | Evet | Sorgulanacak alan adı. |
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/domains/check?domain=example.net" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$r = $api->domainCheck('example.net');
Yanıt 200
{
"domain": "example.net",
"tld": ".net",
"available": true,
"register_price_1y": "737.10"
}
domains.writeIP listesiIdempotency-Key
Alan adı kaydı ya da transferi; bakiyenizden ödenir. Idempotency-Key kuralları ürün siparişiyle aynıdır.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
domain | string | Evet | Alan adı. |
type | string | Evet | register ya da transfer |
years | integer | Evet | 1 ile 10 |
end_customer_ref | string | Evet | Kendi müşteri referansınız; kişisel veri koymayın. |
nameservers | array | Hayır | 2 ile 5 ad sunucusu. |
epp_code | string | Hayır | Transfer için yetki (EPP) kodu. |
id_protection | boolean | Hayır | Kimlik koruması. |
additional_fields | object | Hayır | Uzantının istediği ek alanlar, ad → değer. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/domains" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: alanadi-3001" \
-d '{"domain": "example.net", "type": "register", "years": 1, "end_customer_ref": "cust-42", "nameservers": ["ns1.example.net", "ns2.example.net"], "id_protection": false}'
PHP kütüphanesi
$r = $api->createDomain('example.net', 'register', 1, 'cust-42', [
'nameservers' => ['ns1.example.net', 'ns2.example.net'],
'id_protection' => false,
], 'alanadi-3001');
Yanıt 202
{
"order_id": 9002,
"domain_id": 3310,
"invoice_id": 145001,
"job_id": 5522,
"status": "processing",
"total": "884.52"
}
Alan adlarınız; sayfalama after ile hizmetlerdeki gibidir.
Sorgu parametreleri
| Alan | Tür | Zorunlu | Açıklama |
|---|
after | integer | Hayır | Önceki sayfanın son alan adı numarası. |
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/domains" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$list = $api->domains();
Yanıt 200
{
"data": [
{
"id": 3310,
"domain": "example.net",
"order_id": 9002,
"end_customer_ref": "cust-42",
"status": "active",
"registration_date": "2026-11-09",
"expiry_date": "2027-11-09",
"next_due_date": "2027-11-09",
"auto_renew": true,
"nameservers": [
"ns1.example.net",
"ns2.example.net"
]
}
]
}
Tek alan adı.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/domains/3310" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$d = $api->domain(3310);
Yanıt 200
{
"id": 3310,
"domain": "example.net",
"order_id": 9002,
"end_customer_ref": "cust-42",
"status": "active",
"registration_date": "2026-11-09",
"expiry_date": "2027-11-09",
"next_due_date": "2027-11-09",
"auto_renew": true,
"nameservers": [
"ns1.example.net",
"ns2.example.net"
]
}
POST/domains/{id}/nameservers
domains.writeIP listesi
Ad sunucularını değiştirir.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
nameservers | array | Evet | Yeni ad sunucuları. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/domains/3310/nameservers" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"nameservers": ["ns1.example.net", "ns2.example.net"]}'
PHP kütüphanesi
$api->setNameservers(3310, ['ns1.example.net', 'ns2.example.net']);
Transfer yetki (EPP) kodu.
Örnek istek (curl)
curl "https://www.anksoft.net/api/bayi/v1/domains/3310/epp" \
-H "Authorization: Bearer $ANKSOFT_API_KEY"
PHP kütüphanesi
$code = $api->eppCode(3310)['epp_code'];
Yanıt 200
{
"epp_code": "<epp_code>"
}
Transfer kilidini açar ya da kapatır.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
locked | boolean | Evet | true kilitli. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/domains/3310/lock" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"locked": true}'
PHP kütüphanesi
$api->setLock(3310, true);
POST/domains/{id}/auto-renew
domains.writeIP listesi
Otomatik yenileme. false ise süre sonunda bakiyenizden yenilenmez.
İstek gövdesi
| Alan | Tür | Zorunlu | Açıklama |
|---|
enabled | boolean | Evet | true açık. |
Örnek istek (curl)
curl -X POST "https://www.anksoft.net/api/bayi/v1/domains/3310/auto-renew" \
-H "Authorization: Bearer $ANKSOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled": false}'
PHP kütüphanesi
$api->setAutoRenew(3310, false);
Olay bildirimleriBildirimler (webhook)
Bayi Paneli'nde tek bir HTTPS adresi tanımlarsınız (443 portu, genel IP). Her olay bu adrese JSON gövdeli POST olarak gönderilir.
Örnek gövde
{
"id": 812,
"event": "service.created",
"created_at": "2026-11-09T10:00:00+03:00",
"data": {
"service_id": 20123,
"order_id": 9001,
"end_customer_ref": "cust-42"
}
}
Başlıklar
| Başlık | Açıklama |
|---|
X-AnkSOFT-Event | Olay adı. |
X-AnkSOFT-Delivery | Teslimat numarası (gövdedeki id). Aynı bildirimi iki kez işlememek için kullanın. |
X-AnkSOFT-Signature | t=<unix saniye>,v1=<hex HMAC-SHA256(secret, "<t>.<ham gövde>")> |
Olaylar
| Olay | Ne zaman | data alanları |
|---|
service.created, service.suspended, service.unsuspended, service.terminated | Hizmet oluşturuldu, askıya alındı, askı kalktı, sonlandırıldı. | service_id, order_id, end_customer_ref, reason (yalnız suspended) |
service.renewed | Hizmet yenilendi. | service_id, end_customer_ref, invoice_id, next_due_date |
invoice.created | Fatura oluşturuldu. | invoice_id, total, due_date, services: [{service_id, end_customer_ref}] |
invoice.paid | Fatura ödendi. | invoice_id, total, services |
domain.registered, domain.transferred, domain.renewed | Alan adı kaydedildi, transfer edildi, yenilendi. | domain_id, domain, end_customer_ref, expiry_date |
balance.low | Bakiye eşiğin altına düştü (günde en çok bir kez). | balance, threshold, currency |
ping | Bayi Paneli'ndeki test düğmesi. | message |
İmza doğrulama
İmza tutmuyorsa ya da t 5 dakikadan eskiyse isteği reddedin. İmzayı ham gövde üzerinden hesaplayın; JSON'u çözüp yeniden kodlamayın.
PHP
<?php
$secret = getenv('ANKSOFT_WEBHOOK_SECRET');
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $_SERVER['HTTP_X_ANKSOFT_SIGNATURE'] ?? ''), $s);
$ok = isset($s['t'], $s['v1']) && abs(time() - (int) $s['t']) < 300
&& hash_equals(hash_hmac('sha256', $s['t'] . '.' . $body, $secret), $s['v1']);
if (!$ok) {
http_response_code(400); // imza geçersiz ya da 5 dakikadan eski
exit;
}
$event = json_decode($body, true);
$delivery = $_SERVER['HTTP_X_ANKSOFT_DELIVERY'] ?? '';
// Aynı teslimat daha önce işlendiyse yalnız 200 dönün (kendi kaydınıza bakın)
// Ağır işleri kuyruğa atın: yanıt 6 saniye içinde dönmeli
http_response_code(200);
Yeniden deneme
Alıcınız 6 saniye içinde 2xx dönmezse bildirim şu aralıklarla yeniden gönderilir: 1 dk, 5 dk, 30 dk, 2 sa, 6 sa, 24 sa. Aynı bildirim birden fazla gelebilir; X-AnkSOFT-Delivery ile tekilleştirin.
ank_test_ anahtarlarıDeneme ortamı senaryoları
ank_test_ anahtarlarıyla aynı uçları kullanırsınız; gerçek hiçbir şey oluşturulmaz ve 100.000,00 TRY tutarında ayrı bir sahte bakiye kullanılır. Siparişler saniyeler içinde tamamlanır. Hata akışlarını şu senaryolarla sınayın:
| Senaryo | Nasıl | Sonuç |
|---|
| Başarılı sipariş | Normal sipariş | İş saniyeler içinde done olur. |
| Kurulum hatası | hostname: sandbox-setup-fail.test | İş failed olur. |
| Askıdaki hizmet | hostname: sandbox-suspended.test | Hizmet suspended durumunda oluşur. |
| Yetersiz bakiye | Başlık X-Sandbox-Scenario: insufficient_balance | 402 insufficient_balance |
| Alınmış alan adı | Etikette taken geçen ad, örneğin foo.sandbox-taken.test | available: false |
Yetersiz bakiye senaryosu
curl -X POST "https://www.anksoft.net/api/bayi/v1/orders" \
-H "Authorization: Bearer $ANKSOFT_TEST_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: sandbox-0001" \
-H "X-Sandbox-Scenario: insufficient_balance" \
-d '{"product_id": 105, "billing_cycle": "monthly", "end_customer_ref": "test-1"}'
Bayi fiyatlandırmasıSeviyeler
Seviyeniz son 30 günde ödediğiniz tutara göre belirlenir. Katalog ve alan adı fiyatlarına indiriminiz zaten uygulanmıştır.
| Seviye | İndirim | Son 30 günde ödenen |
|---|
| Başlangıç | %10 | 0 ile 4.999 TRY |
| Bronz | %15 | 5.000 ile 19.999 TRY |
| Gümüş | %20 | 20.000 ile 49.999 TRY |
| Altın | %25 | 50.000 TRY ve üstü |
- Seviye her ay başında kontrol edilir; yükselme hemen uygulanır, düşüş ancak 2 ay eşiğin altında kalınca olur.
- İndirim yinelenen ücretlere ve alan adlarına uygulanır. Kurulum ücretleri indirimsizdir.
- Uzun dönem indirimleriyle birlikte bir ürün aylık liste fiyatının %30'undan fazla altında satılmaz; bu sınırı aşan dönemler katalogda gösterilmez.
Modüller ve araçlarİndirmeler
Hazır modüllerle kod yazmadan bağlanın ya da PHP kütüphanesiyle kendi entegrasyonunuzu yazın.
Kısa kurulumWHMCS ve WiseCP kurulumu
WHMCS sunucu modülü
Gereksinimler: WHMCS 8.x, cURL eklentili PHP 7.4+, bayi API anahtarı.
- Zip'teki
modules/servers/anksoftbayi/ klasörünü WHMCS kök dizinine yükleyin. - Setup > Products/Services > Servers > Add New Server: Module AnkSOFT Reseller, Hostname
www.anksoft.net, Password alanına API anahtarınız. Test Connection ile deneyin. Kurulumu önce ank_test_ anahtarıyla sınayabilirsiniz. - Bu sunucuyla bir sunucu grubu oluşturun.
- Ürün oluşturun (Server/VPS). Module Settings'te modülü ve grubu seçin, AnkSOFT Product listesinden ürünü seçin, satış fiyatınızı Pricing'de kendiniz belirleyin ve "Automatically setup the product as soon as the first payment is received" seçeneğini işaretleyin.
- Anahtar kapsamları:
catalog.read, orders.write, services.read, services.power, services.cancel, services.credentials, billing.read. WHMCS sunucunuzun genel IP adresini anahtarın IP listesine ekleyin.
WHMCS'te askıya alma sunucuyu kapatır ama AnkSOFT faturalamaya devam eder; müşteriniz ayrıldığında hizmeti Terminate edin. Yenileme AnkSOFT bakiyenizden otomatik ödenir.
WHMCS alan adı modülü
- Zip'teki
modules klasörünü WHMCS kök dizinine yükleyin. - Setup > Products/Services > Domain Registrars bölümünde AnkSOFT modülünü etkinleştirin ve API anahtarınızı girin.
- Anahtarda
domains.read ve domains.write kapsamları olsun; işleri izlemek için services.read ekleyin. WHMCS sunucunuzun IP adresini listeye ekleyin. - Satacağınız uzantıları Domain Pricing bölümünde bu modüle bağlayın.
WiseCP modülü
Gereksinimler: WiseCP 3.x ya da WiseCP 5, cURL eklentili PHP 7.4+, bayi API anahtarı (giriş bilgileri için services.credentials kapsamı).
- Zip'teki
coremio klasörünü WiseCP kök dizinine kopyalayın: <wisecp>/coremio/modules/Servers/AnksoftBayi/AnksoftBayi.php. - Ürünler/Hizmetler > Sunucu Ayarları > Yeni Sunucu Ekle: modül AnkSOFT Bayi, Hostname
www.anksoft.net, kullanıcı adı herhangi bir değer, API anahtarı Access Hash alanına (alan yoksa Şifre alanına). Bağlantıyı Test Et bakiyenizi okur. - Ürünün Modül sekmesinde bu sunucuyu ve AnkSOFT ürününü seçin; kurulum bekleme süresini (varsayılan 45, en çok 120 saniye) ve iptal biçimini (varsayılan dönem sonu) ayarlayın.
- Satış fiyatınızı ve dönemleri WiseCP ürününde siz belirlersiniz. Yalnız 1, 3, 6, 12, 24 ve 36 aylık dönemleri açın.
Merak edilenlerSık sorulan sorular
Bayi API'yi nasıl açarım?
Müşteri Paneli > Satış Ortaklığı > Bayi Paneli sayfasından belgelerinizi (vergi levhası, imza sirküleri, kimlik) yükleyerek başvurun. İnceleme sürerken aynı sayfada test anahtarı oluşturabilirsiniz; onaydan sonra canlı anahtar açılır.
Test anahtarıyla gerçek sunucu açılır mı?
Hayır. ank_test_ anahtarlarıyla gerçek hiçbir şey oluşturulmaz ve 100.000,00 TRY tutarında ayrı bir sahte bakiye kullanılır.
Sipariş isteğim zaman aşımına uğradı, tekrar gönderebilir miyim?
Evet. Aynı Idempotency-Key ve aynı gövdeyle gönderin; API ikinci sipariş açmaz, ilk sonucu döndürür.
Kurulum işi failed oldu, ne yapmalıyım?
Siparişi yeniden vermeyin. Destek ekibimiz kurulumu tamamlar.
Fiyatlar KDV dahil mi?
Katalog ve alan adı fiyat listeleri KDV hariçtir. Fiyat teklifi ve sipariş toplamı KDV dahildir.
Yenilemeler nasıl ödenir?
Yenilemeler bakiyenizden otomatik ödenir. Müşterinizin artık ödemediği hizmetleri iptal edin, alan adlarında gerekirse otomatik yenilemeyi kapatın.
Müşterimin kişisel verilerini göndermem gerekir mi?
Hayır. end_customer_ref alanına yalnız kendi referansınızı yazın, kişisel veri koymayın. Alan adlarında kayıt sahibi olarak bayi hesabınızın bilgileri kullanılır.
Paket yükseltme API ile yapılabilir mi?
API'de paket değişikliği ucu yoktur. Bu işlem için destek bileti açın.
Bakiyemi nasıl yüklerim?
Müşteri panelinden Havale/EFT ile yüklersiniz. Bakiye eşiğin altına düşünce balance.low bildirimi gönderilir.
Destek ekibine yazarken neyi iletmeliyim?
İlgili yanıttaki X-Request-Id başlığının değerini ve hata kodunu iletin.