# Sunucular

https://dev.wisecp.com/tr/sunucular

Hizmetlerin kurulduğu sunucuları tanımlayan, sınayan ve mevcut hesapları içe aktaran on bir uç.

## Genel Bakış

Sunucu, hizmetlerin gerçekten kurulduğu yerdir. Bu uçlar sunucuyu tanımlar, bağlantısını sınar, panel üzerindeki görünürlüğünü ayarlar ve sunucuda hâlihazırda duran hesapları WISECP'ye taşır.

Kimlik bilgileri tek yönlüdür: parolayı ve erişim anahtarını yazarsınız ama **hiçbir uçtan geri okuyamazsınız**. Detayda yalnız tanımlı olup olmadıkları görünür.

## Referans

### Sunucuları Listeleme

get/api/v1/admin/products/servers

`Products/GetServers` admin sayfalı

Hizmetlerin kurulduğu sunucuları döndürür.

Sorgu parametreleri 4

searchstringSunucu adında ve adresinde arar.

groupintSunucu grubuna göre süzer.

pageintVarsayılan 1.

limitintVarsayılan 25, en çok 100.

Dönen alanlar data[] — 6

idintSunucu kimliği.

namestringSunucu adı.

typestringBağlı sunucu modülü.

ipstringSunucunun adresi.

statusstring`active` ya da `inactive`.

max_accountsintKurulabilecek en çok hesap sayısı.

Meta 4

totalintSüzgece uyan toplam kayıt.

pageintBulunduğunuz sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa. Sıfır son sayfada olduğunuz anlamına gelir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/servers' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/servers', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
$response = Api::Products()->GetServers();
```

### Sunucu Detayı

get/api/v1/admin/products/servers/{id}

`Products/GetServer` admin gizli veri dönmez

Bir sunucunun tüm ayarlarını döndürür. Parola ve erişim anahtarı hiçbir zaman geri gelmez.

Dönen alanlar data — 16

idintSunucu kimliği.

namestringSunucu adı.

typestringBağlı sunucu modülü.

ipstringSunucunun adresi.

usernamestringBağlantı kullanıcı adı.

has_passwordboolParola tanımlı mı. Parolanın kendisi hiçbir zaman dönmez.

has_access_hashboolErişim anahtarı tanımlı mı.

portintBağlantı portu.

secureboolBağlantı şifreli mi.

nameserversstring[]Sunucunun ad sunucuları. En çok dört tane; boş olanlar atılır.

max_accountsintKurulabilecek en çok hesap sayısı.

full_alertintDoluluk uyarısının verileceği eşik.

costobject 2 alanSunucunun size maliyeti.

pricefloatSunucunun size maliyeti.

currency_idintPara birimi kimliği.

statusstring`active` ya da `inactive`.

fieldsobjectModüle özgü ayarlar. Alanlar tamamen modüle bağlıdır; gizli işaretli olanlar yıldızlarla maskelenir.

disabled_featuresobject | nullPanelde kapatılmış özellikler. Hiçbiri kapatılmamışsa boş döner.

Hatalar 2

not_found404Sunucu bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/servers/34' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/34', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/34');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
$response = Api::Products()->GetServer(['id' => 34]);

// Parolanin kendisi yok; yalnizca tanimli olup olmadigi var.
$ready = $response['data']['has_password'] || $response['data']['has_access_hash'];
```

Yanıt 200

```json
{
  "data": {
    "id": 34,
    "name": "srv1.example.com",
    "type": "cPanel",
    "ip": "192.0.2.10",
    "username": "root",
    "has_password": true,
    "has_access_hash": false,
    "port": 2087,
    "secure": true,
    "nameservers": ["ns1.example.com", "ns2.example.com"],
    "max_accounts": 200,
    "full_alert": 0,
    "cost": { "price": 0, "currency_id": 147 },
    "status": "active",
    "fields": { "api_url": "https://panel.example.com/" },
    "disabled_features": null
  }
}
```

### Sunucu Ekleme

post/api/v1/admin/products/servers

`Products/CreateServer` admin 201

Yeni bir provizyon sunucusu ekler.

Gövde 13

typestringzorunluSunucu modülünün adı.

namestringzorunluSunucu adı.

ipstringzorunluSunucunun adresi.

usernamestringzorunluBağlantı kullanıcı adı.

passwordstringParola. Parola ya da erişim anahtarından biri gerekir; şifreli saklanır.

access_hashstringErişim anahtarı. Parolanın yerini tutar.

portintBağlantı portu.

secureboolBağlantıyı şifreler.

max_accountsintKurulabilecek en çok hesap sayısı. Varsayılan 200.

full_alertintDoluluk uyarısının verileceği eşik.

nameserversstring[]Ad sunucuları. En çok dört tane.

costobject 2 alanSunucunun size maliyeti.

pricefloatSunucunun size maliyeti.

currency_idintPara birimi kimliği.

fieldsobjectModüle özgü ayarlar.

Dönen alanlar 201 — data

dataobjectOluşan sunucu. Detay ucuyla aynı şekildedir, dolayısıyla hiçbir sır geri dönmez: parola ve erişim anahtarı `has_password` ile `has_access_hash` olarak bildirilir, sır işaretli modül alanları maskelenir.

Hatalar 6

name_required422Sunucu adı boş.

type_required422Sunucu tipi boş.

ip_required422Adres boş.

username_required422Kullanıcı adı boş.

credentials_required422Ne parola ne erişim anahtarı verildi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/servers' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"cPanel","name":"srv1.example.com","ip":"192.0.2.10","username":"root","password":"secret","port":2087,"secure":true,"nameservers":["ns1.example.com","ns2.example.com"]}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'cPanel',
    name: 'srv1.example.com',
    ip: '192.0.2.10',
    username: 'root',
    password: 'secret',
    port: 2087,
    secure: true,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'     => 'cPanel',
        'name'     => 'srv1.example.com',
        'ip'       => '192.0.2.10',
        'username' => 'root',
        'password' => $secret,
        'port'     => 2087,
        'secure'   => true,
    ]),
]);

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

```php
// Eklemeden once ayni govdeyle baglantiyi deneyin: test hicbir sey yazmaz.
$test = Api::Products()->TestServerConnection([
    'type'     => 'cPanel',
    'ip'       => '192.0.2.10',
    'username' => 'root',
    'password' => $secret,
]);

if ($test['data']['connected'] ?? false) {
    Api::Products()->CreateServer([
        'type'     => 'cPanel',
        'name'     => 'srv1.example.com',
        'ip'       => '192.0.2.10',
        'username' => 'root',
        'password' => $secret,
    ]);
}
```

### Sunucuyu Güncelleme

patch/api/v1/admin/products/servers/{id}

`Products/UpdateServer` admin tip değişimi taşır

Gönderdiğiniz alanları uygular. Parola göndermezseniz mevcut parola korunur.

Gövde 13

typestringzorunluSunucu modülünün adı.

namestringzorunluSunucu adı.

ipstringzorunluSunucunun adresi.

usernamestringzorunluBağlantı kullanıcı adı.

passwordstringParola. Parola ya da erişim anahtarından biri gerekir; şifreli saklanır.

access_hashstringErişim anahtarı. Parolanın yerini tutar.

portintBağlantı portu.

secureboolBağlantıyı şifreler.

max_accountsintKurulabilecek en çok hesap sayısı. Varsayılan 200.

full_alertintDoluluk uyarısının verileceği eşik.

nameserversstring[]Ad sunucuları. En çok dört tane.

costobject 2 alanSunucunun size maliyeti.

pricefloatSunucunun size maliyeti.

currency_idintPara birimi kimliği.

fieldsobjectModüle özgü ayarlar.

Dönen alanlar data

dataobjectGüncel sunucu. Detay ucuyla aynı şekildedir, sırlardan arınmış olarak döner.

Hatalar 7

not_found404Sunucu bulunamadı.

name_required422Sunucu adı boş.

type_required422Sunucu tipi boş.

ip_required422Adres boş.

username_required422Kullanıcı adı boş.

credentials_required422Ne parola ne erişim anahtarı verildi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/products/servers/34' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"max_accounts":300,"secure":true}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/34', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ max_accounts: 300, secure: true }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/34');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['max_accounts' => 300, 'secure' => true]),
]);

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

```php
// Detaydan okunan maskeli parolayi geri gondermek zararsizdir: mevcut parola korunur.
Api::Products()->UpdateServer([
    'id'           => 34,
    'max_accounts' => 300,
]);
```

### Sunucuyu Silme

delete/api/v1/admin/products/servers/{id}

`Products/DeleteServer` admin bağlıysa reddedilir

Sunucuyu siler. Üzerinde iptal edilmemiş hizmet varsa silme reddedilir.

Dönen alanlar data — 2

deletedboolSilme başarılı mı.

idintSilinen sunucunun kimliği.

Hatalar 4

not_found404Sunucu bulunamadı.

server_in_use422Sunucuya bağlı, iptal edilmemiş hizmetler var.

blocked_by_gate422`gate:product.server_delete` kancası işlemi veto etti.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/products/servers/34' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/34', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/34');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
$response = Api::Products()->DeleteServer(['id' => 34]);
```

### Toplu Durum Değiştirme

post/api/v1/admin/products/servers/bulk

`Products/BulkServers` admin hep ya da hiç

Birden çok sunucunun durumunu değiştirir. Doğrulama yazmadan önce tüm liste için yapılır.

Gövde 2

idsint[]zorunluSunucu kimlikleri.

actionstringzorunlu`active` ya da `inactive`.

Dönen alanlar data — 2

updatedint[]Durumu değişen kimlikler.

actionstringUygulanan durum.

Hatalar 4

ids_required422`ids` boş.

invalid_action422İşlem iki değerden biri değil.

server_in_use422Bir sunucu hâlâ ürünlere ya da iptal edilmemiş hizmetlere bağlı. Hata ayrıntısı hangi sunucunun ve hangi bağın engellediğini söyler.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/servers/bulk' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"ids":[34,35],"action":"inactive"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/bulk', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ids: [34, 35], action: 'inactive' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'ids'    => [34, 35],
        'action' => 'inactive',
    ]),
]);

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

```php
// Tek bir sunucu reddedilirse HICBIRI degismez; yarim uygulanmis durum olusmaz.
$response = Api::Products()->BulkServers([
    'ids'    => [34, 35],
    'action' => 'inactive',
]);
```

### Bağlantıyı Deneme

post/api/v1/admin/products/servers/test-connection

`Products/TestServerConnection` admin hiçbir şey yazmaz

Verilen bağlantı bilgileriyle sunucuya ulaşılıp ulaşılmadığını denemekle kalır.

Gövde 13

typestringzorunluSunucu modülünün adı.

namestringzorunluSunucu adı.

ipstringzorunluSunucunun adresi.

usernamestringzorunluBağlantı kullanıcı adı.

passwordstringParola. Parola ya da erişim anahtarından biri gerekir; şifreli saklanır.

access_hashstringErişim anahtarı. Parolanın yerini tutar.

portintBağlantı portu.

secureboolBağlantıyı şifreler.

max_accountsintKurulabilecek en çok hesap sayısı. Varsayılan 200.

full_alertintDoluluk uyarısının verileceği eşik.

nameserversstring[]Ad sunucuları. En çok dört tane.

costobject 2 alanSunucunun size maliyeti.

pricefloatSunucunun size maliyeti.

currency_idintPara birimi kimliği.

fieldsobjectModüle özgü ayarlar.

Dönen alanlar data — 2

connectedboolSunucuya ulaşıldı mı.

auto_fillobjectModülün sunucudan okuyup önerdiği ayarlar. Her modül döndürmez.

Hatalar 4

type_required422Sunucu tipi boş.

ip_required422Adres boş.

invalid_type422Sunucu modülü bulunamadı.

test_failed422Bağlantı kurulamadı.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/servers/test-connection' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"cPanel","ip":"192.0.2.10","username":"root","password":"secret","port":2087}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/test-connection', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'cPanel',
    ip: '192.0.2.10',
    username: 'root',
    password: secret,
    port: 2087,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/test-connection');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'     => 'cPanel',
        'ip'       => '192.0.2.10',
        'username' => 'root',
        'password' => $secret,
        'port'     => 2087,
    ]),
]);

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

```php
// Test var olan bir sunucuyu DENEMEZ; govdedeki bilgileri dener.
// Kayitli bir sunucuyu sinamak icin bilgilerini yeniden gonderirsiniz.
$test = Api::Products()->TestServerConnection([
    'type'     => 'cPanel',
    'ip'       => '192.0.2.10',
    'username' => 'root',
    'password' => $secret,
]);
```

### Panel Özelliklerini Kapatma

patch/api/v1/admin/products/servers/{id}/preferences

`Products/SetServerPreferences` admin

Bu sunucudaki hizmetlerde müşteriye gösterilmeyecek araç ve kartları belirler.

Gövde 1

disabled_featuresobjectzorunluKapatılacaklar: `tools` araç adları, `cards` kart adları, `card_items` kart başına gizlenecek satırlar.

Dönen alanlar data — 2

idintSunucu kimliği.

disabled_featuresobjectKaydedilen ayar.

Hatalar 2

not_found404Sunucu bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/products/servers/34/preferences' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"disabled_features":{"tools":["backup"],"cards":[],"card_items":{}}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/34/preferences', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    disabled_features: { tools: ['backup'], cards: [], card_items: {} },
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/34/preferences');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'disabled_features' => [
            'tools'      => ['backup'],
            'cards'      => [],
            'card_items' => new stdClass(),
        ],
    ]),
]);

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

```php
$response = Api::Products()->SetServerPreferences([
    'id'                => 34,
    'disabled_features' => [
        'tools'      => ['backup'],
        'cards'      => [],
        'card_items' => [],
    ],
]);
```

### Sunucu Paneline Giriş

post/api/v1/admin/products/servers/{id}/sso

`Products/GetServerSso` admin modüle bağlı

Sunucunun yönetim paneline giriş bağlantısı üretir.

Gövde —

——Gövde gerekmez, boş gönderin. Sunucuyu adres belirler, kimlik bilgileri de kayıtlı sunucu kaydından gelir.

Dönen alanlar data — 1

login_urlstringOturum bilgisini taşıyan giriş bağlantısı.

Hatalar 4

not_found404Sunucu bulunamadı.

not_supported422Modül panel girişini desteklemiyor.

sso_failed422Giriş bağlantısı üretilemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/servers/34/sso' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/34/sso', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/34/sso');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Baglanti sunucunun YONETIM paneline acilir, bir musteri hesabina degil.
$response = Api::Products()->GetServerSso(['id' => 34]);
$url      = $response['data']['login_url'] ?? null;
```

### İçe Aktarılabilir Hesapları Listeleme

get/api/v1/admin/products/servers/{id}/importable

`Products/GetServerImportable` admin şema modülden gelir

Sunucuda var olan ama WISECP'de karşılığı olmayan hesapları döndürür.

Sorgu parametreleri 3

searchstringHesaplarda arar.

pageintSayfa. Yalnız sayfalayabilen modüllerde işler.

limitintSayfa boyutu. En çok 200.

Dönen alanlar data[]

data[]objectHer satır, modülün sunucudan okuduğu ham hesap kaydıdır. Alanlar modüle göre değişir; içe aktarırken bu nesneyi olduğu gibi geri gönderirsiniz.

Meta 4

totalintBulunan hesap sayısı.

methodstringModülün kullandığı listeleme yöntemi.

pageintBulunduğunuz sayfa. Sayfalanabilen yöntemde döner.

limitintSayfa boyutu.

Hatalar 5

not_found404Sunucu bulunamadı.

module_not_found422Sunucu modülü bulunamadı.

import_not_supported422Modül hesap listeleyemiyor.

list_failed422Hesaplar listelenemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -G 'https://panel.ornek.com/api/v1/admin/products/servers/34/importable' \
  -H "Authorization: Bearer $API_KEY" \
  -d limit=200
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/products/servers/34/importable');
url.searchParams.set('limit', '200');

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/products/servers/34/importable?' . http_build_query(['limit' => 200]);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
$accounts = Api::Products()->GetServerImportable(['id' => 34], ['limit' => 200]);

// 'method' hangi listeleme yolunun kullanildigini soyler; sayfalama ona bagli.
$paged = ($accounts['meta']['method'] ?? '') === 'list';
```

### Hesapları İçe Aktarma

post/api/v1/admin/products/servers/{id}/import

`Products/ImportServerAccounts` admin 201

Sunucudaki hesapları WISECP hizmetlerine dönüştürür. Her satır bir müşteri ve ürüne bağlanır.

Gövde 1

itemsobject[]zorunluİçe aktarılacak satırlar. Her satır listeleme ucundan aldığınız ham hesap kaydını, müşteri kimliğini, ürün kimliğini, fiyat kimliğini ve başlangıç tarihini taşır; bitiş tarihi isteğe bağlıdır.

Dönen alanlar data — 1

importedobject[]Oluşturulan hizmetler. Her eleman hizmet kimliği ve adını taşır.

Hatalar 5

not_found404Sunucu bulunamadı.

items_required422`items` boş.

no_valid_items422Hiçbir satırda eşleme tamamlanmadı. Eksik müşteri, ürün ya da fiyat kimliği olan satırlar sessizce elenir.

import_failed422İçe aktarma reddedildi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/servers/34/import' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "items": [
      {
        "info": { "username": "acct1", "domain": "client-domain.example" },
        "user_id": 42,
        "product_id": 15,
        "price_id": 88,
        "start": "2026-01-01 00:00:00"
      }
    ]
  }'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/servers/34/import', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    items: [
      {
        info: account,
        user_id: 42,
        product_id: 15,
        price_id: 88,
        start: '2026-01-01 00:00:00',
      },
    ],
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/servers/34/import');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'items' => [[
            'info'       => $account,
            'user_id'    => 42,
            'product_id' => 15,
            'price_id'   => 88,
            'start'      => '2026-01-01 00:00:00',
        ]],
    ]),
]);

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

```php
// 'info' listeleme ucundan geldigi gibi gonderilir; degistirmeyin.
$accounts = Api::Products()->GetServerImportable(['id' => 34])['data'];

$items = [];
foreach ($accounts as $account)
    $items[] = [
        'info'       => $account,
        'user_id'    => 42,
        'product_id' => 15,
        'price_id'   => 88,
        'start'      => '2026-01-01 00:00:00',
    ];

$done = Api::Products()->ImportServerAccounts(['id' => 34, 'items' => $items]);

// Gonderilen ile olusan sayiyi karsilastirin: eksik eslemeli satirlar elenmistir.
$dropped = count($items) - count($done['data']['imported']);
```

## Tuzaklar

> **Gizli veri geri okunamaz**
> 
> Parola ve erişim anahtarı hiçbir yanıtta yer almaz; detayda yalnız tanımlı olup olmadıkları görünür. Modülün gizli işaretli alanları da yıldızlarla maskelenir. Bu maskeyi güncellemede geri göndermek zararsızdır: mevcut değer korunur, maske kaydedilmez.

> **Bağlantı testi kayıtlı sunucuyu denemez**
> 
> Test ucu gövdede verdiğiniz bilgileri dener ve **hiçbir şey yazmaz**. Kayıtlı bir sunucunun hâlâ çalışıp çalışmadığını sınamak isterseniz bilgilerini yeniden göndermeniz gerekir; parolayı geri okuyamayacağınız için o parolayı kendi tarafınızda tutuyor olmalısınız.

> **Toplu işlem yarım kalmaz**
> 
> Toplu durum değiştirme önce listenin tamamını doğrular, sonra yazar. Bir sunucu hâlâ bir ürüne ya da aktif bir hizmete bağlıysa istek reddedilir ve **hiçbir sunucu** değişmez. Hata ayrıntısı hangi sunucunun ve hangi bağın engellediğini söyler.

> **İçe aktarmada eksik satır sessizce elenir**
> 
> Müşteri, ürün ya da fiyat kimliği eksik olan satırlar atlanır ve yanıtta yer almaz. Hepsi eksikse `no_valid_items` alırsınız, ama bazıları eksikse istek başarılı görünür. Gönderdiğiniz satır sayısıyla dönen hizmet sayısını karşılaştırın.

## İlgili Makaleler

- [Sunucu Grupları](https://dev.wisecp.com/tr/sunucu-gruplari)
- [Ürün Uçları](https://dev.wisecp.com/tr/urun-uclari)
