| Domen Adı | Qeydiyyat | Uzatma | Status | Əməliyyat |
|---|
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 adı və ya etiket üzrə mövcud domen tariflərinin qeydiyyat statusunu yoxlayır.
PHP çağırışı$result = api('POST', '/v1/domains/lookup', ['query' => 'example']);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/domains/lookup', {"query": "example"});Nümunə sorğu gövdəsi{
"query": "example"
}Nümunə cavab{
"ok": true,
"query": "example",
"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/tariffs');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. 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. nameservers siyahısında ən azı bir NS olmalıdır.
PHP çağırışı$result = api('POST', '/v1/domain-orders', ['domain' => 'example.com', 'tariffId' => 'com', 'duration' => 1, 'nameservers' => ['ns1.example.net', 'ns2.example.net'], 'ips' => []]);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/domain-orders', {"domain": "example.com", "tariffId": "com", "duration": 1, "nameservers": ["ns1.example.net", "ns2.example.net"], "ips": []});Nümunə sorğu gövdəsi{
"domain": "example.com",
"tariffId": "com",
"duration": 1,
"nameservers": [
"ns1.example.net",
"ns2.example.net"
],
"ips": []
}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
Xidməti months parametrinə görə uzadır; mövcud xidmət və provayder qaydaları tətbiq olunur. Email və WhatsApp təsdiqi tələb edilə bilər.
PHP çağırışı$result = api('POST', '/v1/services/srv_123/renew', ['months' => 3]);JavaScript (Node.js) çağırışıconst result = await api('POST', '/v1/services/srv_123/renew', {"months": 3});Nümunə sorğu gövdəsi{
"months": 3
}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
Öz xidmətində yalnız portalın həmin xidmət növü üçün tanıdığı əməliyyatları icra edir. 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.