Hosting, Reseller və Domen Tarifləri
| Domen Adı | Qeydiyyat | Uzatma |
|---|
Xidmətlərim
Hosting, reseller və domen xidmətlərinizi bir mərkəzdən idarə edin.
Müştəri
Hesaba daxil olunmayıb
Hər sorğuya bu header-i əlavə edin: Authorization: Bearer OXBILLING_API_KEY. Uğurlu cavablar JSON və ok: true, səhvlər HTTP status və ok: false qaytarır. Marşrut prefiksi: /rest_api/v1.
PHP cURL müştəri nümunəsi
$BASE = 'https://billing.example.com/rest_api';
$API_KEY = getenv('OXBILLING_API_KEY');
function api(string $method, string $path, ?array $body = null): array {
global $BASE, $API_KEY;
$ch = curl_init($BASE.$path);
$headers = ['Accept: application/json', 'Authorization: Bearer '.$API_KEY];
if ($body !== null) $headers[] = 'Content-Type: application/json';
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_CUSTOMREQUEST=>$method, CURLOPT_HTTPHEADER=>$headers]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body, JSON_UNESCAPED_UNICODE));
$raw = curl_exec($ch); if ($raw === false) throw new RuntimeException(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch);
$data = json_decode($raw, true); if ($status >= 400) throw new RuntimeException($data['error'] ?? 'API error');
return $data;
}Node.js JavaScript müştəri nümunəsi
const BASE = 'https://billing.example.com/rest_api';
const API_KEY = process.env.OXBILLING_API_KEY; // Node.js server-side; browser bundle-ə qoymayın
async function api(method, path, body) {
const res = await fetch(BASE + path, {method, headers: {Accept:'application/json', Authorization:`Bearer ${API_KEY}`, ...(body ? {'Content-Type':'application/json'} : {})}, ...(body ? {body:JSON.stringify(body)} : {})});
const data = await res.json(); if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`); return data;
}GET /v1/account
Hesabın ID, adı, email və balansını qaytarır.
PHP çağırışı$result = api('GET', '/v1/account');JavaScript (Node.js) çağırışıconst result = await api('GET', '/v1/account');Nümunə cavab{
"ok": true,
"account": {
"id": 12,
"name": "Ali Vəliyev",
"email": "ali@example.com",
"role": "user"
},
"balance": 25.5
}GET /v1/catalog
Aktiv hosting, reseller və domen tariflərini qaytarır. İstəyə görə ?type=hosting|reseller|domain əlavə edin.
PHP çağırışı$result = api('GET', '/v1/catalog');JavaScript (Node.js) çağırışıconst result = await api('GET', '/v1/catalog');Nümunə cavab{
"ok": true,
"catalog": {
"hosting": [
{
"id": "h-basic",
"name": "Basic Hosting",
"price": 5.5
}
],
"reseller": [
{
"id": "r-basic",
"name": "Basic Reseller",
"price": 25
}
],
"domain": [
{
"id": "com",
"zone": ".com",
"reg": 18,
"ren": 22
}
]
}
}GET /v1/catalog/free-domains?tariffId=h-basic
Hosting/reseller tarifi üçün icazəli mövcud pulsuz domenləri qaytarır.
PHP çağırışı$result = api('GET', '/v1/catalog/free-domains?tariffId=h-basic');JavaScript (Node.js) çağırışıconst result = await api('GET', '/v1/catalog/free-domains?tariffId=h-basic');Nümunə cavab{
"ok": true,
"domains": [
"example.az",
"example.com"
]
}POST /v1/domains/lookup
Domen uzantılarını qeydiyyat qiymətinə görə ucuzdan bahaya, hər sorğuda maksimum 10 nəticə olmaqla yoxlayır. Növbəti sorğu üçün cavabın nextOffset dəyərini offset kimi göndərin.
PHP çağırışı$result = api('POST', '/v1/domains/lookup', ['query' => 'example', 'limit' => 10, 'offset' => 0]);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/domains/lookup', {"query": "example", "limit": 10, "offset": 0});Nümunə sorğu gövdəsi{
"query": "example",
"limit": 10,
"offset": 0
}Nümunə cavab{
"ok": true,
"query": "example",
"total": 150,
"offset": 0,
"limit": 10,
"nextOffset": 10,
"results": [
{
"domain": "example.com",
"tariffId": "com",
"zone": ".com",
"reg": 18,
"ren": 22,
"available": true,
"status": "available"
}
]
}POST /v1/promos/validate
Tarifə aid promo kodu yoxlayır; sifarişdən əvvəlki qiymət hesablamasına kömək edir.
PHP çağırışı$result = api('POST', '/v1/promos/validate', ['tariffId' => 'h-basic', 'code' => 'SAVE2026', 'duration' => 12]);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/promos/validate', {"tariffId": "h-basic", "code": "SAVE2026", "duration": 12});Nümunə sorğu gövdəsi{
"tariffId": "h-basic",
"code": "SAVE2026",
"duration": 12
}Nümunə cavab{
"ok": true,
"code": "SAVE2026",
"discountPercent": 10,
"baseAmount": 66,
"discountAmount": 6.6,
"total": 59.4
}GET /v1/services
API açarının sahibinə məxsus xidmətlərin siyahısı. Başqa istifadəçinin xidmətləri görünmür.
PHP çağırışı$result = api('GET', '/v1/services');JavaScript (Node.js) çağırışıconst result = await api('GET', '/v1/services');Nümunə cavab{
"ok": true,
"services": [
{
"id": "srv_123",
"type": "hosting",
"name": "Basic Hosting",
"target": "example.com",
"status": "Aktiv",
"price": 5.5,
"duration": 12
}
]
}GET /v1/services/{serviceId}
Açar sahibinə məxsus bir xidmətin detalları. Başqa hesabın ID-si 404 qaytarır.
PHP çağırışı$result = api('GET', '/v1/services/srv_123');JavaScript (Node.js) çağırışıconst result = await api('GET', '/v1/services/srv_123');Nümunə cavab{
"ok": true,
"service": {
"id": "srv_123",
"type": "hosting",
"target": "example.com",
"status": "Aktiv",
"expires_at": "2027-01-01 00:00:00"
}
}GET /v1/services/{serviceId}/tariffs
Xidmət üçün serverə uyğun tarif dəyişmə variantları.
PHP çağırışı$result = api('GET', '/v1/services/srv_123/operations');JavaScript (Node.js) çağırışıconst result = await api('GET', '/v1/services/srv_123/tariffs');Nümunə cavab{
"ok": true,
"currentPrice": 5.5,
"options": [
{
"id": "h-pro",
"name": "Pro Hosting",
"price": 9.5
}
]
}POST /v1/orders
Balansdan ödənişlə hosting və reseller sifarişi; müddət 1–36 ay aralığında 1 aylıq addımla seçilir. Tələb olunan təsdiqlər və tarif/server qaydaları tətbiq olunur.
PHP çağırışı$result = api('POST', '/v1/orders', ['type' => 'hosting', 'tariffId' => 'h-basic', 'duration' => 1, 'domainMode' => 'existing', 'domain' => 'example.com']);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/orders', {"type": "hosting", "tariffId": "h-basic", "duration": 1, "domainMode": "existing", "domain": "example.com"});Nümunə sorğu gövdəsi{
"type": "hosting",
"tariffId": "h-basic",
"duration": 1,
"domainMode": "existing",
"domain": "example.com"
}Nümunə cavab{
"ok": true,
"message": "Sifariş tamamlandı.",
"service": {
"id": "srv_123",
"type": "hosting",
"target": "example.com",
"status": "Aktiv"
},
"oneTimeCredentials": {
"username": "ex123",
"password": "yalnız_bir_dəfə"
}
}POST /v1/domain-orders
Yeni domen qeydiyyatı üçün admin təsdiqinə sifariş göndərir; müddət 1–10 il aralığında 1 illik addımla seçilir. Hər NS və uyğun IP-ni eyni nameserverRecords sətrində verin; domenə aid NS üçün IP tələb olunur.
PHP çağırışı$result = api('POST', '/v1/domain-orders', ['domain' => 'example.com', 'tariffId' => 'com', 'duration' => 1, 'nameserverRecords' => [['nameserver' => 'ns1.example.net', 'ip' => '203.0.113.10'], ['nameserver' => 'ns2.example.net', 'ip' => '203.0.113.11']]]);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/domain-orders', {"domain": "example.com", "tariffId": "com", "duration": 1, "nameserverRecords": [{"nameserver": "ns1.example.net", "ip": "203.0.113.10"}, {"nameserver": "ns2.example.net", "ip": "203.0.113.11"}]});Nümunə sorğu gövdəsi{
"domain": "example.com",
"tariffId": "com",
"duration": 1,
"nameserverRecords": [
{"nameserver": "ns1.example.net", "ip": "203.0.113.10"},
{"nameserver": "ns2.example.net", "ip": "203.0.113.11"}
]
}Nümunə cavab{
"ok": true,
"message": "Domen sifarişiniz admin təsdiqi üçün göndərildi.",
"orderId": "dord_123",
"status": "pending",
"domain": "example.com",
"price": 18
}POST /v1/services/{serviceId}/tariff
Xidmət tarifini dəyişir; fərq balansa tətbiq olunur. Email və WhatsApp təsdiqi tələb edilir.
PHP çağırışı$result = api('POST', '/v1/services/srv_123/tariff', ['tariffId' => 'h-pro']);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/services/srv_123/tariff', {"tariffId": "h-pro"});Nümunə sorğu gövdəsi{
"tariffId": "h-pro"
}Nümunə cavab{
"ok": true,
"message": "Tarif dəyişdirildi.",
"charge": 4,
"refund": 0,
"service": {
"id": "srv_123",
"name": "Pro Hosting",
"price": 9.5
}
}POST /v1/services/{serviceId}/renew
duration/unit parametrinə görə müddəti uzadır: hosting/reseller üçün 1–36 ay və ya 1–3 il (cəmi maksimum 36 ay), domen üçün 1–10 il. Email və WhatsApp təsdiqi tələb oluna bilər.
PHP çağırışı$result = api('POST', '/v1/services/srv_123/renew', ['duration' => 3, 'unit' => 'months']);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/services/srv_123/renew', {"duration": 3, "unit": "months"});Nümunə sorğu gövdəsi{
"duration": 3,
"unit": "months"
}Nümunə cavab{
"ok": true,
"message": "Xidmət müddəti yeniləndi.",
"service": {
"id": "srv_123",
"status": "Aktiv",
"expires_at": "2027-04-01 00:00:00"
}
}POST /v1/services/{serviceId}/actions
Xidmət panelindəki bütün müştəri əməliyyatlarını icra edir: local xidmətdə DirectAdmin-ə, API xidmətdə isə yalnız provayderin elan etdiyi action-a yönləndirir. Xidmətə uyğun operation ID-ləri GET /v1/services/{serviceId}/operations qaytarır. operation və params tələb olunur.
PHP çağırışı$result = api('POST', '/v1/services/srv_123/actions', ['operation' => 'backup.create', 'params' => []]);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/services/srv_123/actions', {"operation": "backup.create", "params": {}});Nümunə sorğu gövdəsi{
"operation": "backup.create",
"params": {}
}Nümunə cavab{
"ok": true,
"message": "Əməliyyat tamamlandı.",
"data": {
"lastBackup": "2026-10-06 17:00:00"
}
}Ümumi xətalar və davranış
{"ok":false,"error":"Balans kifayət etmir."}401 — açar yoxdur/etibarsızdır; 403 — hesab təsdiqi və ya icazə tələb olunur; 404 — endpoint/tarif/xidmət tapılmadı; 409 — təkrarlanan və ya ziddiyyətli əməliyyat; 422 — sorğu sahələri yanlışdır; 426 — açar idarəetməsi HTTPS tələb edir; 429 — limit; 5xx — provayder/server xətası. Qeyri-müəyyən provayder sifariş xətasında statusu yoxlamadan sifarişi təkrar göndərməyin.
Hosting/reseller sifarişində domainMode: existing + domain və ya free + subdomain/zone; yeni domen qeydiyyatı üçün ayrıca /domain-orders istifadə edin. Hesabda təsdiqlənmiş email/WhatsApp və kifayət qədər balans tələb oluna bilər. Domen sifarişi admin təsdiqini gözləyir.
oneTimeCredentials sifariş cavabında yalnız bir dəfə qaytarıla bilər; dərhal müştəriyə təhlükəsiz ötürün, loglarda saxlamayın.
Əlavə REST əməliyyatları, API açarı və avtomatik ödəniş
Bütün biznes API marşrutlarında Authorization: Bearer … API açarı məcburidir. Xidmət panelindəki əməliyyatlar POST /v1/services/{serviceId}/actions marşrutu ilə, operation və params body sahələri göndərilərək icra edilir; operation siyahısını GET /v1/services/{serviceId}/operations verir. /v1/catalog-da qaytarılan provider tarifi ilə POST /v1/orders və POST /v1/domain-orders çağırıldıqda sifariş provayder API-yə göndərilir, ödəniş/əməliyyat nəticəsi və yaradılan xidmət portalın əsas bazasına yazılır. Admin SMTP və WhatsApp ayarları bu istifadəçi REST API-sinə daxil deyil. Tarif, xidmət, domen, əməliyyat tarixçəsi, bildiriş və profil məlumatlarına açarsız çıxış verilmir. İstisna yalnız HTTP OPTIONS CORS preflight sorğusudur.
GET /v1/transactions,GET /v1/notifications,GET /v1/login-history,GET /v1/services/{serviceId}/operations— xidmətə uyğun bütün icazəli əməliyyatların siyahısıGET /v1/tariffs?type=hosting|reseller|domain—/v1/catalogilə eyni tarif kataloquGET /v1/domains/whois?domain=example.comvəPOST /v1/domains/whoisPOST /v1/services/{serviceId}/nameservers— domen xidmətinin NS/IP cütlərini yenilə; body:{"nameserverRecords":[{"nameserver":"ns1.example.net","ip":"203.0.113.10"}]}POST /v1/services/{serviceId}/autopay—{"enabled":true}/falsePOST /v1/profile/preferences,/v1/profile/password,/v1/profile/api-key,/v1/profile/verifications/send,/v1/profile/verifications/confirmPOST /v1/deposits/request,/v1/deposits/crypto/address,/v1/deposits/crypto/address/lock,/v1/deposits/crypto/address/release
const result = await api('POST', '/v1/services/srv_123/autopay', {enabled:true});Auto-pay hər xidmət üçün istifadəçi tərəfindən ayrıca aktiv edilir. Vaxtı çatanda balans yetərsə bir periodun qiyməti tutulub müddət uzadılır və xatırlatma göndərilmir; balans yetərsizdirsə tam billing məlumatı olan bildiriş göndərilir. Provayder API ilə idarə olunan xidmətlərdə idempotent renewal dəstəyi olmadığı üçün auto-pay aktiv edilmir.
Domen sifarişinin məbləği göndəriş anında balansdan rezerv olunur. Admin təsdiqində yenidən tutulmur; rədd ediləndə rezervasiya balansda geri qaytarılır. Təkrar təsdiq/rədd eyni maliyyə əməliyyatını təkrarlamır.