# Sahiplik Transferi

https://dev.wisecp.com/tr/sahiplik-transferi

Bir hizmetin sahibini başka bir müşteriye taşıyan devir taleplerini yöneten dört uç.

## Genel Bakış

Bir müşteri hizmetini başka bir müşteriye devredebilir. Bu dört uç o talepleri okur ve karara bağlar; onay, hizmetin sahibini hedef müşteriye taşır.

Adreslerde geçen kimlik **talebin** kimliğidir, hizmetin değil. Talepler olay kayıtlarında tutulduğu için hizmetten bağımsız bir numara taşırlar.

Bu **lisans transferi değildir**. Lisansın bir kurulumdan diğerine taşınması ayrı bir sistemdir ve kendi uçları vardır.

## Referans

### Talepleri Listeleme

get/api/v1/admin/services/transfer-requests

`Services/GetTransferRequests` admin sayfalı

Hizmet devir taleplerini döndürür. Bekleyenler listenin başında gelir.

Sorgu parametreleri 7

searchstringİki taraftaki müşterinin adında, e-postasında, firmasında ve hizmet adında arar.

statusstring`pending` ya da `approved`.

from_idintDevreden müşteriye göre süzer.

to_idintDevralan müşteriye göre süzer.

service_idintHizmete göre süzer.

pageintVarsayılan 1.

limitintVarsayılan 25, en çok 100.

Dönen alanlar data[] — 8

idintTalebin kimliği. Bu bir olay kimliğidir, hizmet kimliği **değildir**; diğer uçlar bunu bekler.

service_idintDevredilen hizmetin kimliği.

statusstring`pending` bekliyor, `approved` onaylanmış.

reasonstringTalebin gerekçesi.

created_atstringTalebin açıldığı zaman.

serviceobject 3 alanDevredilen hizmetin özeti.

idintHizmet kimliği.

namestringHizmet adı.

typestringHizmet tipi.

fromobject 4 alanDevreden müşteri.

idintMüşteri kimliği.

full_namestringAd ve soyad.

company_namestringFirma adı.

emailstringE-posta adresi.

toobject 4 alanDevralan müşteri.

idintMüşteri kimliği.

full_namestringAd ve soyad.

company_namestringFirma adı.

emailstringE-posta adresi.

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 -G 'https://panel.ornek.com/api/v1/admin/services/transfer-requests' \
  -H "Authorization: Bearer $API_KEY" \
  -d status=pending
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/services/transfer-requests');
url.searchParams.set('status', 'pending');

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/services/transfer-requests?' . http_build_query(['status' => 'pending']);

$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
$response = Api::Services()->GetTransferRequests([], ['status' => 'pending']);
```

Yanıt 200

```json
{
  "data": [
    {
      "id": 7382,
      "service_id": 558,
      "status": "pending",
      "reason": "Sold to another account",
      "created_at": "2026-06-21 18:00:00",
      "service": { "id": 558, "name": "example.com", "type": "hosting" },
      "from": {
        "id": 88,
        "full_name": "John Doe",
        "company_name": "",
        "email": "john@example.com"
      },
      "to": {
        "id": 89,
        "full_name": "Jane Doe",
        "company_name": "",
        "email": "jane@example.com"
      }
    }
  ],
  "meta": { "total": 1, "page": 1, "limit": 25, "next_page": 0 }
}
```

### Talep Detayı

get/api/v1/admin/services/transfer-requests/{eid}

`Services/GetTransferRequest` admin talep kimliği

Tek bir devir talebini, onaylandıysa onay bilgisiyle birlikte döndürür.

Dönen alanlar data — 9

idintTalebin kimliği. Bu bir olay kimliğidir, hizmet kimliği **değildir**; diğer uçlar bunu bekler.

service_idintDevredilen hizmetin kimliği.

statusstring`pending` bekliyor, `approved` onaylanmış.

reasonstringTalebin gerekçesi.

created_atstringTalebin açıldığı zaman.

serviceobject 3 alanDevredilen hizmetin özeti.

idintHizmet kimliği.

namestringHizmet adı.

typestringHizmet tipi.

fromobject 4 alanDevreden müşteri.

idintMüşteri kimliği.

full_namestringAd ve soyad.

company_namestringFirma adı.

emailstringE-posta adresi.

toobject 4 alanDevralan müşteri.

idintMüşteri kimliği.

full_namestringAd ve soyad.

company_namestringFirma adı.

emailstringE-posta adresi.

approvedobject | nullOnay bilgisi: onaylayanın kimliği, adı ve onay zamanı. Talep beklerken boş döner.

Hatalar 2

not_found404Transfer talebi bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/services/transfer-requests/7382' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Adresteki kimlik TALEBIN kimligidir; hizmet kimligini vermek 404 dondurur.
$response = Api::Services()->GetTransferRequest(['eid' => 7382]);
```

### Talebi Onaylama

post/api/v1/admin/services/transfer-requests/{eid}/approve

`Services/ApproveTransferRequest` admin geri alınamaz

Hizmetin sahipliğini hedef müşteriye taşır ve talebi onaylanmış olarak işaretler.

Gövde —

——Gövde gerekmez, boş gönderin. Hedef müşteri saklı talepte adı geçen müşteridir ve onay anında değiştirilemez.

Dönen alanlar data — 5

statusstringİşlem sonrası durum.

idintTalebin kimliği.

service_idintDevredilen hizmetin kimliği.

old_owner_idintÖnceki sahibin kimliği.

new_owner_idintYeni sahibin kimliği.

Hatalar 6

not_found404Talep ya da hizmet bulunamadı.

not_pending422Talep zaten onaylanmış.

invalid_target422Talepte hedef müşteri yok.

target_not_found422Hedef müşteri bulunamadı.

blocked_by_gate422`gate:service.transfer_approve` kancası işlemi veto etti. Kendi eklentiniz devri engelliyor olabilir.

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/services/transfer-requests/7382/approve' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/services/transfer-requests/7382/approve', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/transfer-requests/7382/approve');
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
// Onay tek yonludur: geri almanin yolu ters yonde YENI bir talep acmaktir.
$response = Api::Services()->ApproveTransferRequest(['eid' => 7382]);

$movedFrom = $response['data']['old_owner_id'];
$movedTo   = $response['data']['new_owner_id'];
```

Yanıt 200 422

```json
{
  "data": {
    "status": "approved",
    "id": 7382,
    "service_id": 558,
    "old_owner_id": 88,
    "new_owner_id": 89
  }
}
```

```json
{
  "error": {
    "code": "not_pending",
    "message": "Transfer request is not pending."
  }
}
```

### Talebi Silme

delete/api/v1/admin/services/transfer-requests/{eid}

`Services/DeleteTransferRequest` admin

Talep kaydını siler. Hizmetin sahipliğine dokunmaz.

Dönen alanlar data — 2

deletedboolSilme başarılı mı.

idintSilinen talebin kimliği.

Hatalar 2

not_found404Transfer talebi bulunamadı.

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/services/transfer-requests/7382' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/services/transfer-requests/7382', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/transfer-requests/7382');
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
// Onaylanmis bir talebi silmek sahipligi GERI ALMAZ; yalniz kayit gider.
$response = Api::Services()->DeleteTransferRequest(['eid' => 7382]);
```

## Tuzaklar

> **Adresteki kimlik hizmetin değil**
> 
> Bu uçlar **talep kimliği** bekler; hizmet kimliğini vermek `404` döndürür. İkisi de sayı olduğu için hata sessizce yanlış kayda gitmez, ama karışması kolaydır: listedeki `id` talebin, `service_id` hizmetindir.

> **Onay geri alınamaz**
> 
> Onaylanmış bir talebi tekrar onaylamak `not_pending` döndürür ve silmek sahipliği **geri getirmez** — yalnız kayıt gider. Devri geri almanın tek yolu ters yönde yeni bir talep açmaktır.

> **Bir kanca devri engelleyebilir**
> 
> `blocked_by_gate` hatası isteğinizin yanlış olduğunu değil, kurulumdaki bir eklentinin devri reddettiğini söyler. Devredilemeyen hizmet türleri böyle tanımlanır; kendi kancanızı yazdıysanız önce oraya bakın.

> **Lisans transferiyle karıştırmayın**
> 
> Buradaki devir hizmetin **sahibini** değiştirir: hizmet aynı kalır, faturası başka müşteriye çıkmaya başlar. Lisansın bir sunucudan diğerine taşınması bambaşka bir iştir ve kendi uçlarında yaşar.

## İlgili Makaleler

- [Hizmet Uçları](https://dev.wisecp.com/tr/hizmet-uclari)
- [Lisans Transferi](https://dev.wisecp.com/tr/lisans-transferi)
