AnkSOFT Bayi API v1

Bayi API Belgesi
Sipariş, Kurulum ve Yönetim Tek Arayüzde.

AnkSOFT hizmetlerini kendi sisteminizden sipariş edin ve yönetin. Sade bir REST/JSON arayüzü, ön ödemeli bakiye, deneme ortamı, webhook bildirimleri ve hazır WHMCS, WiseCP modülleri.

Temel adres https://www.anksoft.net/api/bayi/v1

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.

KonuDeğer
Temel adreshttps://www.anksoft.net/api/bayi/v1
BiçimJSON (UTF-8). Yalnız GET ve POST kullanılır.
Tutarlar2 ondalıklı metin, örneğin "206.91". Para birimi TRY.
KDVKatalog ve fiyat listeleri KDV hariç; teklif ve sipariş toplamları KDV dahil (subtotal, tax, total).
İstek kimliğiHer 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

ÖnekOrtamAçı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ğiUçlar
catalog.readÜrün kataloğunu ve fiyatları okumakGET /catalog, GET /catalog/{id}
orders.writeFiyat teklifi almak ve sipariş vermek (IP listesi zorunlu)POST /orders/quote, POST /orders
services.readHizmetleri, işleri ve VDS durumunu okumakGET /services, GET /services/{id}, GET /jobs/{id}, POST /services/{id}/actions/status
services.powerVDS başlatma, durdurma, yeniden başlatmaPOST /services/{id}/actions/start, .../stop, .../restart
services.cancelHizmet iptaliPOST /services/{id}/cancel
services.credentialsGiriş bilgilerini okumakGET /services/{id}/credentials
billing.readBakiyeyi okumakGET /balance
domains.readAlan adı fiyatlarını, uygunluğu ve alan adlarını okumakGET /domains/tlds, GET /domains/check, GET /domains, GET /domains/{id}, GET /domains/{id}/epp
domains.writeAlan adı kaydı, transferi ve değişiklikleri (IP listesi zorunlu)POST /domains, POST /domains/{id}/nameservers, .../lock, .../auto-renew

5. İlk siparişiniz

  1. Kataloğu okuyun: GET /catalog
  2. Kesin tutarı alın: POST /orders/quote
  3. Siparişi verin: POST /orders (Idempotency-Key başlığıyla)
  4. Kurulum işini izleyin: GET /jobs/{id} ya da service.created bildirimi
  5. 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 anahtar

Kimlik 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.

Kota

Sınırlar ve hız

İstek hızı

TürAnahtar başına dakikada
Okuma120
Yazma30
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ırDeğerHata
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ünGünde 10 hizmet ve 5.000 TRY429 daily_service_limit, 429 daily_spend_limit
Hesap, 30 günden eskiGünde 50 hizmet ve 50.000 TRY429 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önetimi

Hata 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"
  }
}
HTTPKodAnlamı
400invalid_jsonGövde geçerli JSON değil.
400invalid_idempotency_keyIdempotency-Key yok ya da geçersiz (8 ile 64 karakter, A-Z a-z 0-9 _ -).
401unauthorizedAnahtar yok ya da geçersiz.
402insufficient_balanceBakiye yetersiz. required alanı gereken tutarı verir.
403reseller_not_activeHesabınızda bayi API'si etkin değil.
403insufficient_scopeAnahtarda gerekli kapsam yok. scope alanı eksik kapsamı verir.
403ip_not_allowedİstek, anahtarın IP listesinde olmayan bir adresten geldi.
403ip_allowlist_requiredBu anahtar için IP listesi zorunlu (orders.write, domains.write).
403unsupported_currencyHesap para birimi desteklenmiyor; API TRY ile çalışır.
404not_foundKaynak bulunamadı. Başka bir hesaba ait kaynaklar için de bu döner.
404product_not_foundÜrün bulunamadı ya da size açık değil.
405method_not_allowedBu uç bu HTTP yöntemini kabul etmez.
409out_of_stockÜrün şu an stokta yok.
409idempotency_conflictAynı Idempotency-Key farklı bir gövdeyle gönderildi.
409request_in_progressAynı anahtarla gönderilen ilk istek hâlâ işleniyor; biraz sonra aynı isteği tekrarlayın.
409price_changedFiyat değişti; kataloğu ya da teklifi yeniden alın.
409service_not_activeİşlem yalnız etkin (active) hizmette yapılabilir.
409service_not_readyHizmet henüz hazır değil; kurulum işi bitince tekrar deneyin.
409action_not_supportedGüç işlemi bu hizmet türünde yok; durum, başlatma, durdurma ve yeniden başlatma yalnız VDS içindir.
409domain_not_availableAlan adı kayıt için uygun değil.
409domain_not_activeİşlem yalnız etkin (active) alan adında yapılabilir.
413payload_too_largeGövde 64 KB'den büyük.
422invalid_parameterBir alan geçersiz. field alanı hangisi olduğunu verir.
422invalid_end_customer_refend_customer_ref 1 ile 64 karakter olmalı: A-Z a-z 0-9 . _ -.
422not_sellableÜrün ya da dönem size satışa açık değil.
422invalid_scopeGeçersiz kapsam adı.
422invalid_ipGeçersiz IP adresi.
422invalid_optionÜrün seçeneği ya da değeri geçersiz. option_id alanı seçeneği verir.
422tld_not_availableUzantı ya da işlem şu an size satışa açık değil.
429rate_limitedDakikalık istek sınırı aşıldı; Retry-After kadar bekleyin.
429daily_service_limitHesabın günlük hizmet sınırı doldu.
429daily_spend_limitHesabın günlük harcama sınırı doldu.
429key_spend_limitAnahtarın günlük harcama sınırı doldu.
502order_failedSipariş oluşturulamadı, hiçbir şey açılmadı. Yeni bir Idempotency-Key ile güvenle tekrar deneyebilirsiniz.
502order_state_unknownSiparişin durumu belirlenemedi. Tekrar denemeyin; X-Request-Id ile destek ekibine yazın.
503service_closedBayi API'si geçici olarak kapalı.
503service_unavailableHizmet geçici olarak kullanılamıyor.
503busySistem yoğun; Retry-After kadar bekleyin.

Ne zaman tekrar denenir?

DurumNe yapmalı
Ağ hatası ya da zaman aşımı (sipariş)Aynı Idempotency-Key ve aynı gövdeyle tekrar gönderin.
429, 503 busyRetry-After kadar bekleyip tekrar deneyin.
502 order_failedYeni bir Idempotency-Key ile tekrar deneyin.
502 order_state_unknownTekrar denemeyin; destek ekibine yazın.
İş durumu failedSipariş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ünler

Katalog 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

AlanTürAçıklama
idintegerÜrün numarası; siparişte product_id.
namestringÜrün adı.
groupstringÜrün grubu.
typestringvds, hosting ya da game.
in_stockbooleanStok durumu. Stokta olmayan ürün siparişi 409 out_of_stock döner.
hostname_requiredbooleantrue ise (hosting) müşterinin alan adını hostname olarak gönderin.
currencystringTRY
tax_excludedbooleanFiyatlar KDV hariç (true).
cyclesobjectDönem adı → {price, setup}. Yalnız satın alabileceğiniz dönemler listelenir.
optionsarrayOption nesneleri.

Option nesnesi

AlanTürAçıklama
idintegerSeçenek numarası; siparişte options anahtarı.
namestringSeçenek adı.
typestringselect, quantity ya da yesno.
defaultintegerSeçeneği göndermezseniz kullanılan değer: seçim numarası (select), miktar (quantity) ya da 0/1 (yesno).
min, maxintegerYalnız quantity: izin verilen miktar aralığı.
choicesarrayYalnız select: {id, name, cycles} seçimleri.
cyclesobjectQuantity için birim fiyat, yesno için 1 seçildiğindeki fiyat.

Dönemler: monthly, quarterly, semiannually, annually, biennially, triennially.

GET/catalog
catalog.read

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"
            }
          }
        }
      ]
    }
  ]
}
GET/catalog/{id}
catalog.read

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 önce

Fiyat teklifi

Teklif, siparişte bakiyenizden düşecek kesin tutarı KDV dahil verir. Hiçbir şey oluşturmaz.

POST/orders/quote
orders.writeIP listesi

Ürün, dönem ve seçeneklere göre tutar.

İstek gövdesi

AlanTürZorunluAçıklama
product_idintegerEvetKatalogdaki ürün numarası.
billing_cyclestringEvetmonthly, quarterly, semiannually, annually, biennially, triennially
optionsobjectHayırSeç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şi

Sipariş

Sipariş bakiyenizden ödenir ve hizmet otomatik kurulur. Yanıt 202 ile hemen döner; kurulumu GET /jobs/{job_id} ile izleyin.

POST/orders
orders.writeIP listesiIdempotency-Key

Yeni hizmet siparişi.

İstek gövdesi

AlanTürZorunluAçıklama
product_idintegerEvetKatalogdaki ürün numarası.
billing_cyclestringEvetmonthly, quarterly, semiannually, annually, biennially, triennially
end_customer_refstringEvetKendi müşteri referansınız: 1 ile 64 karakter, A-Z a-z 0-9 . _ -. Kişisel veri koymayın.
hostnamestringHosting'de evetVDS ve oyunda isteğe bağlı; hosting'de zorunlu (müşterinin alan adı).
optionsobjectHayırSeç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.

DurumSonuç
Aynı anahtar, aynı gövdeİlk sonucun aynısı döner; ikinci sipariş açılmaz.
Aynı anahtar, farklı gövde409 idempotency_conflict
İlk istek hâlâ işleniyor409 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.

DurumAnlamı
queuedSırada.
runningKuruluyor.
doneTamamlandı.
cancelledİptal edildi.
failedDestek ekibimiz tamamlar. Siparişi asla yeniden vermeyin.
GET/jobs/{id}
services.read

İş 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ş bilgisi

Hizmetler

Service nesnesi

AlanTürAçıklama
idintegerHizmet numarası (service_id).
order_id, invoice_idintegerİlk sipariş ve fatura.
end_customer_refstringSiparişte verdiğiniz referans.
type, product_idstring, integerÜrün türü ve numarası.
statusstringpending, active, suspended, terminated, cancelled, fraud
next_due_date, billing_cyclestringSonraki vade (YYYY-MM-DD) ve dönem.
capabilitiesarrayYapılabilecek işlemler. VDS: status, start, stop, restart, cancel; hosting ve oyun: cancel.
hostname, ip, ipsstring, string, arrayYalnız tek hizmet yanıtında.
GET/services
services.read

Hizmetleriniz, sayfa başına 100 kayıt. Sonraki sayfa için son kaydın id değerini after olarak gönderin.

Sorgu parametreleri

AlanTürZorunluAçıklama
afterintegerHayı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"
      ]
    }
  ]
}
GET/services/{id}
services.read

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"
}
AlanTürAçıklama
service_idintegerHizmet numarası.
hostname, ip, ipsstring, string, arrayHizmetin adı ve IP adresleri.
username, passwordstringGiriş bilgileri.
server_hostname, server_ipstringHosting'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

AlanTürZorunluAçıklama
typestringEvetend_of_period ya da immediate
reasonstringHayı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 hesap

Bakiye

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.

GET/balance
billing.read

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önetim

Alan 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

AlanTürAçıklama
id, domain, order_idinteger, string, integerAlan adı kaydı.
end_customer_refstringSiparişte verdiğiniz referans.
statusstringpending, active, expired, transferred_away, cancelled ve diğerleri.
registration_date, expiry_date, next_due_datestringYYYY-MM-DD
auto_renewbooleanfalse ise süre sonunda bakiyenizden yenilenmez.
nameserversarrayAd sunucuları.
GET/domains/tlds
domains.read

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
    }
  ]
}
GET/domains/check
domains.read

Alan adının kayıt için uygunluğu ve 1 yıllık kayıt fiyatı.

Sorgu parametreleri

AlanTürZorunluAçıklama
domainstringEvetSorgulanacak 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"
}
POST/domains
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

AlanTürZorunluAçıklama
domainstringEvetAlan adı.
typestringEvetregister ya da transfer
yearsintegerEvet1 ile 10
end_customer_refstringEvetKendi müşteri referansınız; kişisel veri koymayın.
nameserversarrayHayır2 ile 5 ad sunucusu.
epp_codestringHayırTransfer için yetki (EPP) kodu.
id_protectionbooleanHayırKimlik koruması.
additional_fieldsobjectHayırUzantı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"
}
GET/domains
domains.read

Alan adlarınız; sayfalama after ile hizmetlerdeki gibidir.

Sorgu parametreleri

AlanTürZorunluAçıklama
afterintegerHayı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"
      ]
    }
  ]
}
GET/domains/{id}
domains.read

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

AlanTürZorunluAçıklama
nameserversarrayEvetYeni 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']);
Yanıt 200
{
  "ok": true
}
GET/domains/{id}/epp
domains.read

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>"
}
POST/domains/{id}/lock
domains.writeIP listesi

Transfer kilidini açar ya da kapatır.

İstek gövdesi

AlanTürZorunluAçıklama
lockedbooleanEvettrue 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);
Yanıt 200
{
  "ok": true
}
POST/domains/{id}/auto-renew
domains.writeIP listesi

Otomatik yenileme. false ise süre sonunda bakiyenizden yenilenmez.

İstek gövdesi

AlanTürZorunluAçıklama
enabledbooleanEvettrue 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);
Yanıt 200
{
  "ok": true
}
Olay bildirimleri

Bildirimler (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ıkAçıklama
X-AnkSOFT-EventOlay adı.
X-AnkSOFT-DeliveryTeslimat numarası (gövdedeki id). Aynı bildirimi iki kez işlememek için kullanın.
X-AnkSOFT-Signaturet=<unix saniye>,v1=<hex HMAC-SHA256(secret, "<t>.<ham gövde>")>

Olaylar

OlayNe zamandata alanları
service.created, service.suspended, service.unsuspended, service.terminatedHizmet oluşturuldu, askıya alındı, askı kalktı, sonlandırıldı.service_id, order_id, end_customer_ref, reason (yalnız suspended)
service.renewedHizmet yenilendi.service_id, end_customer_ref, invoice_id, next_due_date
invoice.createdFatura oluşturuldu.invoice_id, total, due_date, services: [{service_id, end_customer_ref}]
invoice.paidFatura ödendi.invoice_id, total, services
domain.registered, domain.transferred, domain.renewedAlan adı kaydedildi, transfer edildi, yenilendi.domain_id, domain, end_customer_ref, expiry_date
balance.lowBakiye eşiğin altına düştü (günde en çok bir kez).balance, threshold, currency
pingBayi 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:

SenaryoNasılSonuç
Başarılı siparişNormal siparişİş saniyeler içinde done olur.
Kurulum hatasıhostname: sandbox-setup-fail.testİş failed olur.
Askıdaki hizmethostname: sandbox-suspended.testHizmet suspended durumunda oluşur.
Yetersiz bakiyeBaşlık X-Sandbox-Scenario: insufficient_balance402 insufficient_balance
Alınmış alan adıEtikette taken geçen ad, örneğin foo.sandbox-taken.testavailable: 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İndirimSon 30 günde ödenen
Başlangıç%100 ile 4.999 TRY
Bronz%155.000 ile 19.999 TRY
Gümüş%2020.000 ile 49.999 TRY
Altın%2550.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 kurulum

WHMCS ve WiseCP kurulumu

WHMCS sunucu modülü

Gereksinimler: WHMCS 8.x, cURL eklentili PHP 7.4+, bayi API anahtarı.

  1. Zip'teki modules/servers/anksoftbayi/ klasörünü WHMCS kök dizinine yükleyin.
  2. 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.
  3. Bu sunucuyla bir sunucu grubu oluşturun.
  4. Ü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.
  5. 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ü

  1. Zip'teki modules klasörünü WHMCS kök dizinine yükleyin.
  2. Setup > Products/Services > Domain Registrars bölümünde AnkSOFT modülünü etkinleştirin ve API anahtarınızı girin.
  3. Anahtarda domains.read ve domains.write kapsamları olsun; işleri izlemek için services.read ekleyin. WHMCS sunucunuzun IP adresini listeye ekleyin.
  4. 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ı).

  1. Zip'teki coremio klasörünü WiseCP kök dizinine kopyalayın: <wisecp>/coremio/modules/Servers/AnksoftBayi/AnksoftBayi.php.
  2. Ü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.
  3. Ü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.
  4. 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 edilenler

Sı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.

Entegrasyona başlayın

Önce Deneme Anahtarıyla Sınayın.

Bayi Paneli'nden bir ank_test_ anahtarı oluşturun, tüm akışı gerçek sunucu açmadan deneyin.

TR| EN