# Sahip Olunan Hizmetler

https://dev.wisecp.com/tr/sahip-olunan-hizmetler

Sahip olunan hizmeti okuyan, ayarlayan, yenileyen ve iptalini isteyen on bir uç.

## Genel Bakış

Hizmet, müşterinin **sahip olduğu şeydir**: bir barındırma paketi, bir sunucu, bir yazılım lisansı. Bu on bir uç o kaydı okur, ayarlarını değiştirir, yeniler ve iptalini ister.

Yenileme iki adımdır: bu uçlar **fatura keser**, ödeme fatura uçlarında yapılır. Otomatik yenileme ise hesap düzeyinde ve hizmet düzeyinde iki ayrı anahtarla yönetilir.

Bazı ürünler kullanıma göre de ücretlenir. Ölçümler açılıp kapatılabilir, ama ödenmemiş bir kullanım faturası **yeniden açmayı kilitler**.

## Referans

### Hizmetleri Listeleme

get/api/v1/client/services

`Services/GetServices` anahtarın sahibi

Hesabın sahip olduğu hizmetleri döndürür.

Sorgu 5

pageintKaçıncı sayfa.

limitintSayfa başına satır. En çok 100.

statusstringDurum süzgeci. Rozet gruplarını alır: bekleyen hem kurulumdakini hem işlemdekini kapsar, iptal ise tamamlananı da içerir.

typestringÜrün türü süzgeci.

searchstringHizmet adında ve bağlı alan adında arar.

Dönen alanlar data[] — 10 + meta — 4

idintHizmetin numarası.

typestringÜrün türü.

namestringHizmetin adı. Sipariş anındaki ürün adının kopyasıdır.

statusstringHam durum.

hoststringBağlı alan adı ya da sunucu adı.

product_idintSipariş edilen ürünün numarası.

auto_renewboolHizmet bazlı otomatik yenileme açık mı.

priceobjectDönemsel tutar.

cyclestringFaturalama döngüsü.

created_atstringKurulduğu gün.

due_datestringBir sonraki ödeme günü.

totalintToplam hizmet. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/client/services?status=active' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/client/services?status=active', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const soon = data.filter((s) => s.due_date && s.due_date < horizon);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services?status=active');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Suzgec ROZET GRUBU alir, ham durum degil: bekleyen iki ham durumu birden kapsar.
$rows = Kernel::internal('client:Services/GetServices',
    ['owner_id' => $uid, 'status' => 'pending'])['data'];
```

### Hizmeti Okuma

get/api/v1/client/services/{id}

`Services/GetService` anahtarın sahibi

Hizmetin ayarlarını, erişim bilgilerini ve yenileme durumunu döndürür.

Dönen alanlar data — 16

idintHizmetin numarası.

typestringÜrün türü.

namestringHizmetin adı.

statusstringHam durum.

productobjectÜrün planı. Numara ve ad taşır.

hoststringBağlı alan adı ya da sunucu adı.

order_idintHizmeti doğuran siparişin numarası.

managedboolBir panel modülü yönetiyor mu. Doğruysa araç ve tek oturum uçları çalışır.

auto_renewboolHizmet bazlı otomatik yenileme.

auto_renew_lockedboolHesap geneli otomatik ödeme açık mı. Açıkken hizmet bazlı anahtar değiştirilemez.

billing_profile_idintAtanan fatura profili. Sıfır hesabın varsayılan adresi demektir.

priceobjectDönemsel tutar.

cyclestringFaturalama döngüsü.

accessobjectHizmete kayıtlı erişim bilgileri. Anahtarları hizmet türüne göre değişir ve boş değerler hiç gelmez. Hosting'de `nameservers`, hizmetin kendi ad sunucusu yoksa atandığı sunucunun NS1–NS4 değerlerini verir.

renewalobject renewalYenileme durumu.

availableboolYenileme faturası kesilebilir mi.

blocked_by_subscriptionboolBir abonelik yenilemeleri kendisi tahsil ediyor mu.

already_invoicedboolDönem zaten faturalanmış mı.

open_invoice_idintBağlanacak açık fatura.

cyclesarraySeçilebilecek yenileme döngüleri.

cancellationobjectAçık iptal talebi. Durum, aciliyet, gerekçe, not ve istek anını taşır.

has_metricsboolKullanıma göre ücretlenen ölçüm tanımlı mı.

Hatalar 2

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/client/services/622' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
if (data.renewal.available) showRenewButton(data.renewal.cycles);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// ALAN ADI hizmetleri bu uctan OKUNMAZ: onlarin kendi uclari vardir, burada bulunamadi doner.
$s = Kernel::internal('client:Services/GetService', ['owner_id' => $uid, 'id' => $id])['data'];
$panel = $s['managed'];
```

### Hizmet Tercihlerini Değiştirme

patch/api/v1/client/services/{id}

`Services/UpdateService` iki alan

Otomatik yenilemeyi ve fatura profilini değiştirir.

Gövde 2

auto_renewboolHizmet bazlı otomatik yenileme. Hesap geneli otomatik ödeme açıkken değiştirilemez.

billing_profile_idintFatura profilinin numarası. Sıfır hesabın varsayılanına döner.

Dönen alanlar data — 16

dataobjectGüncel hizmet. Okuma ucuyla aynı şekildedir.

Hatalar 6

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

nothing_to_update422Gövdede bilinen alan yok.

not_actionable422Hizmet etkin değilken otomatik yenileme gönderilmiş.

autorenew_locked422Hesap geneli otomatik ödeme açık.

no_auto_pay_source422Tahsil edilebilecek bir kaynak yokken açma denenmiş.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/client/services/622' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"auto_renew":true,"billing_profile_id":3}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ auto_renew: true }),
});

if (res.status === 422) explainLock(await res.json());
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['auto_renew' => true]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Hesap geneli otomatik odeme acikken hizmet anahtari KILITLIDIR; once cuzdan ayarina bakin.
$s = Kernel::internal('client:Services/GetService', ['owner_id' => $uid, 'id' => $id])['data'];
if (! $s['auto_renew_locked'])
    Kernel::internal('client:Services/UpdateService',
        ['owner_id' => $uid, 'id' => $id, 'auto_renew' => true]);
```

### Yenileme Faturası Kesme

post/api/v1/client/services/{id}/renew

`Services/RenewService` fatura üretir

Hizmet için bir yenileme faturası keser.

Gövde 1

cyclestringYenileme döngüsü. Hizmet detayındaki döngü listesinden seçilir; verilmezse mevcut döngü kullanılır.

Dönen alanlar data — 8

invoice_idintYenileme faturasının numarası.

numberstringGörünen fatura numarası.

statusstringHam fatura durumu.

statestringMüşteriye gösterilen durum.

totalobjectFatura toplamı.

created_atstringKesim tarihi.

due_datestringVade tarihi.

existingboolZaten açık olan bir fatura mı döndü. Doğruysa yeni bir belge kesilmemiştir.

Hatalar 7

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

not_renewable422Hizmet etkin ya da süresi dolmuş değil.

renew_blocked_subscription422Bir abonelik yenilemeleri kendisi tahsil ediyor.

cycle_invalid422Döngü ürünün yenilenebilir fiyat satırlarından biri değil.

already_invoiced422Dönem faturalanmış ve bağlanacak açık fatura yok.

renew_disabled422Operatör bu hizmette yenilemeyi kapatmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/services/622/renew' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"cycle":"annually"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/renew`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ cycle }),
});

const { data } = await res.json();
if (data.existing) note('An invoice was already open.');
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/renew');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['cycle' => $cycle]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Fatura KESER, odeme YAPMAZ: donen numarayi fatura odeme ucuna vermeniz gerekir.
$inv = Kernel::internal('client:Services/RenewService',
    ['owner_id' => $uid, 'id' => $id])['data'];

Kernel::internal('client:Invoices/PayInvoice',
    ['owner_id' => $uid, 'id' => $inv['invoice_id'], 'payment' => ['method' => 'balance']]);
```

### İptal Talebi Açma

post/api/v1/client/services/{id}/cancellation

`Services/CreateCancellation` aynı anda tek talep

Hizmetin iptali için bir talep açar.

Gövde 4

urgencystringreqNe zaman iptal edilsin: hemen ya da dönem sonunda.

reasonstringreqGerekçe. Beş değerden biri: gerek kalmadı, pahalı, başka yere geçiliyor, özellik eksik ya da diğer.

reason_detailstringSerbest açıklama. Gerekçe diğer ise zorunludur.

notestringOperatöre not.

Dönen alanlar data

dataobjectAçılan iptal talebi. Hizmet detayındaki iptal alanıyla aynı şekildedir.

Hatalar 5

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

not_actionable422Hizmet etkin değil.

cancellation_exists422Zaten açık bir talep var.

reason_detail_required422Gerekçe diğer iken açıklama boş ya da değerler geçersiz.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/services/622/cancellation' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"urgency":"period-ending","reason":"not-needed"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/cancellation`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ urgency: 'period-ending', reason, note }),
});

const { data } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/cancellation');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['urgency' => 'period-ending', 'reason' => $why]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// HEMEN secmek hizmeti o an kapatir: donem sonu secenegi kalan sureyi kullandirir.
Kernel::internal('client:Services/CreateCancellation',
    ['owner_id' => $uid, 'id' => $id, 'urgency' => 'period-ending', 'reason' => 'not-needed']);
```

### İptal Talebini Geri Çekme

delete/api/v1/client/services/{id}/cancellation

`Services/RevokeCancellation` anahtarın sahibi

Açık bir iptal talebini geri çeker.

Dönen alanlar data — 2

revokedboolGeri çekme çalıştı mı.

service_idintHizmetin numarası.

Hatalar 2

not_found404Bu hizmette açık bir talep yok.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/client/services/622/cancellation' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/cancellation`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${clientKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/cancellation');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Talep ONAYLANDIYSA geri cekmek hizmeti kurtarmayabilir; durumu detaydan okuyun.
$s = Kernel::internal('client:Services/GetService', ['owner_id' => $uid, 'id' => $id])['data'];
$pending = ($s['cancellation']['status'] ?? '') === 'pending';
```

### Hizmet Eklentilerini Okuma

get/api/v1/client/services/{id}/addons

`Services/GetServiceAddons` anahtarın sahibi

Hizmete bağlı ek hizmetleri döndürür.

Dönen alanlar data[] — 11

idintEk hizmet kaydının numarası.

addon_idintEk hizmet tanımının numarası.

option_idintSeçilen seçeneğin numarası.

namestringEk hizmetin adı.

optionstringSeçeneğin adı.

quantityintAlınan adet.

statusstringEk hizmetin durumu.

priceobjectSatırın dönemsel toplamı.

cyclestringFaturalama döngüsü.

due_datestringBir sonraki ödeme günü.

unpaid_invoice_idintÖdenmemiş satın alma faturası. Ek hizmet beklerken dolar.

cancellation_requestedboolDönem sonunda iptal planlanmış mı.

Hatalar 2

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/client/services/622/addons' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/addons`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const waiting = data.filter((a) => a.unpaid_invoice_id > 0);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/addons');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Bekleyen ek hizmet FATURASI odenene kadar etkinlesmez; numarayi buradan alip odeyin.
$rows = Kernel::internal('client:Services/GetServiceAddons',
    ['owner_id' => $uid, 'id' => $id])['data'];
$due = array_filter(array_column($rows, 'unpaid_invoice_id'));
```

### Hizmetin Faturalarını Okuma

get/api/v1/client/services/{id}/invoices

`Services/GetServiceInvoices` anahtarın sahibi

Bu hizmeti faturalayan belgeleri döndürür.

Sorgu 1

limitintEn çok satır. En çok 100.

Dönen alanlar data[] — 7

invoice_idintFaturanın numarası.

numberstringGörünen numara.

statusstringHam durum.

statestringMüşteriye gösterilen durum.

totalobjectBelge toplamı.

created_atstringKesim tarihi.

due_datestringVade tarihi.

Hatalar 2

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/client/services/622/invoices' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/invoices`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const open = data.filter((i) => i.state !== 'paid');
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/invoices');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// SAYFALAMA YOKTUR, yalniz bir ust sinir vardir: uzun gecmis icin fatura listesini kullanin.
$rows = Kernel::internal('client:Services/GetServiceInvoices',
    ['owner_id' => $uid, 'id' => $id, 'limit' => 100])['data'];
```

### Ölçümleri Okuma

get/api/v1/client/services/{id}/metrics

`Services/GetServiceMetrics` kullanıma göre ücret

Kullanıma göre ücretlenen ölçümleri ve tahmini bedeli döndürür.

Dönen alanlar data — 2

metricsobject[] metrics[]Ölçümler.

keystringÖlçümün anahtarı. Açma kapama ucuna bu değer verilir.

labelstringGörünen adı.

unitstringBirimi.

enabledboolŞu an ölçülüyor mu.

includedfloatÜcretsiz dahil miktar.

usagefloatBu dönemin kullanımı.

overagefloatDahil miktarın üstündeki faturalanabilir kullanım.

estimated_chargeobjectAşım için öngörülen ücret.

unit_priceobjectİlk etkin kademenin birim fiyatı.

lockedboolÖdenmemiş bir kullanım faturası açmayı engelliyor mu.

locked_by_invoice_idintEngelleyen faturanın numarası.

auto_disabledboolÖdenmemiş fatura yüzünden kendiliğinden kapandı mı.

has_unpaidboolHizmetin herhangi bir kullanım faturası ödenmemiş mi. Hizmet geneli bir kilittir.

Hatalar 2

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/client/services/622/metrics' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/metrics`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const bill = data.metrics.reduce((s, m) => s + (m.estimated_charge?.amount ?? 0), 0);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/metrics');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kapali bir olcumun O ANA KADARKI kullanimi yine faturalanir: kapatmak gecmisi silmez.
$m = Kernel::internal('client:Services/GetServiceMetrics',
    ['owner_id' => $uid, 'id' => $id])['data'];
$blocked = $m['has_unpaid'];
```

### Ölçümü Açma ve Kapatma

patch/api/v1/client/services/{id}/metrics/{key}

`Services/UpdateServiceMetric` ödenmemiş fatura kilitler

Bir ölçümü açar ya da kapatır.

Gövde 1

enabledboolreqİstenen durum.

Dönen alanlar data

dataobjectÖlçümün güncel hâli.

Hatalar 7

not_found404Ölçüm anahtarı ya da hizmet bulunamadı.

enabled_invalid422Durum alanı gönderilmemiş ya da yanlış türde.

not_actionable422Hizmet etkin değil.

metric_not_priced422Etkin bir fiyat kademesi yok.

metric_unpaid_lock422Ödenmemiş bir kullanım faturası açmayı engelliyor.

metric_module_rejected422Panel modülü değişikliği reddetti.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/client/services/622/metrics/storage' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"enabled":true}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/services/${id}/metrics/${key}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ enabled: true }),
});

if (res.status === 422) explainLock(await res.json());
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/metrics/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['enabled' => true]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kilidi acmanin tek yolu ENGELLEYEN FATURAYI odemektir; numarasi olcum kaydinda yazar.
$m = Kernel::internal('client:Services/GetServiceMetrics',
    ['owner_id' => $uid, 'id' => $id])['data'];
$blocker = array_column($m['metrics'], 'locked_by_invoice_id', 'key')[$key] ?? 0;
```

### Kullanım Fatura Geçmişi

get/api/v1/client/services/{id}/metrics/billing

`Services/GetServiceMetricBilling` anahtarın sahibi

Ölçümlerin dönem dönem faturalanmış kullanımını döndürür.

Sorgu 3

pageintKaçıncı sayfa.

limitintSayfa başına satır. En çok 100.

metricstringTek bir ölçüme daraltır.

Dönen alanlar data[] — 9 + meta — 4

metricstringÖlçümün anahtarı.

labelstringGörünen adı.

unitstringBirimi.

period_startstringFaturalanan dönemin başı.

period_endstringDönemin sonu.

usagefloatDönemin toplam kullanımı.

overagefloatFaturalanan pay.

amountobjectTutar.

statestringSatırın durumu: bekliyor, ödenmemiş, ödenmiş ya da iptal.

invoice_idintKullanım faturası. Henüz faturalanmadıysa sıfırdır.

totalintToplam satır. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa.

Hatalar 2

not_found404Böyle bir hizmet yok ya da başka bir müşteriye ait.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/client/services/622/metrics/billing?metric=storage' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const url = new URL(`https://panel.ornek.com/api/v1/client/services/${id}/metrics/billing`);
url.searchParams.set('metric', key);

const res = await fetch(url, { headers: { Authorization: `Bearer ${clientKey}` } });
const { data } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/services/' . $id . '/metrics/billing');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// BEKLIYOR satiri henuz faturalanmamis donemdir: fatura numarasi sifirdir ve tutar degisebilir.
$rows = Kernel::internal('client:Services/GetServiceMetricBilling',
    ['owner_id' => $uid, 'id' => $id])['data'];
$open = array_filter($rows, fn ($r) => $r['state'] === 'pending');
```

## Tuzaklar

> **Yenileme fatura keser, ödeme yapmaz**
> 
> Yenileme ucu bir **fatura üretir** ve orada durur; hizmetin süresi ancak o fatura ödendiğinde uzar. Dönen yanıttaki bir alan, yeni bir belge kesilmediğini ve zaten açık olan bir faturanın döndüğünü söyler. Numarayı fatura ödeme ucuna verin.

> **İki otomatik yenileme anahtarı vardır**
> 
> Hesap geneli otomatik ödeme açıkken hizmet bazlı anahtar **kilitlenir** ve değiştirme çağrısı reddedilir. Detaydaki kilit alanı bunu önceden söyler. Kilidi açmanın yolu hizmet ayarı değil, cüzdan ayarıdır.

> **Hemen iptal kalan süreyi yakar**
> 
> İptal talebinde aciliyet iki değerden birini alır. **Hemen** seçmek hizmeti o anda kapatır ve ödenmiş kalan süre geri gelmez; **dönem sonu** seçmek kalan süreyi kullandırır. Müşteriye bu farkı gösterin.

> **Ölçümü kapatmak geçmiş kullanımı silmez**
> 
> Bir ölçümü kapatmak o ana kadarki kullanımı **faturalanmaktan kurtarmaz**: dönem sonunda o kullanım yine belgeye girer. Ayrıca ödenmemiş bir kullanım faturası ölçümü yeniden açmayı kilitler ve kilit yalnız o fatura ödenerek açılır.

> **Alan adları bu uçlara ait değildir**
> 
> Alan adı kayıtları hizmet gibi görünse de bu uçlarda **bulunamadı** yanıtı verir; kendi uçları vardır. Bir hizmet listesinde alan adı arayan kod boş döner ve bunu hata sanabilir. Alan adları için alan adı makalelerine bakın.

> **Hizmetin fatura listesi sayfalanmaz**
> 
> Hizmetin faturalarını veren uç yalnız bir **üst sınır** alır; sayfalama yoktur. Uzun bir geçmiş için genel fatura listesini kullanın ve orada arayın. Aynı sınırlama ek hizmet listesinde de vardır.

## İlgili Makaleler

- [Hizmetin İçine Erişim](https://dev.wisecp.com/tr/hizmetin-icine-erisim)
- [Fatura Ödeme](https://dev.wisecp.com/tr/fatura-odeme-api)
- [Sahip Olunan Alan Adları](https://dev.wisecp.com/tr/sahip-olunan-alan-adlari)
