# Kara Liste ve Mükerrer Hesap

https://dev.wisecp.com/tr/kara-liste-ve-mukerrer-hesap

Bir müşteriyi kara listeye alan, kaydı düzenleyen, listeden çıkaran ve onunla aynı kişi olabilecek hesapları bulan beş uç.

## Genel Bakış

Bu uçlar iki işi birlikte yapar: bir müşteriyi kara listeye almak ve onunla **aynı kişi olabilecek** başka hesapları bulmak. İkisi aynı kararın parçasıdır — kara listeye alınan biri genellikle ikinci bir hesapla geri döner.

Kara liste tek başına bir işaret değildir: hangi kısıtlamaların açılacağını siz seçersiniz. Hiçbirini açmazsanız müşteri yalnız işaretlenmiş olur.

## Referans

### Kara Liste Durumu

get/api/v1/admin/clients/{id}/blacklist

`Clients/GetClientBlacklist` admin

Müşterinin kara listede olup olmadığını, nedenini ve hangi kısıtlamaların açık olduğunu döndürür.

Dönen alanlar data — 6

blacklistedboolKara listede mi.

reasonstringNeden. Değerler: `payment_fraud` · `chargeback` · `abuse` · `spam` · `tos_violation` · `false_info` · `other`

notesstringSerbest not.

restrictionsobject 4 alanAçık kısıtlamalar.

block_new_ordersboolYeni sipariş vermeyi engeller.

block_renewalsboolYenilemeleri engeller.

block_ticketsboolMüşterinin destek talebi açması engelli mi. Yürürlükteki engeli gösterir: hesabın kendi talep engeli açıkken de açıktır.

suspend_servicesboolHizmetleri askıya alır.

blacklisted_bystringKara listeye alan yöneticinin adı.

blacklisted_atstringKara listeye alınma zamanı.

Hatalar 2

not_found404Müşteri bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/blacklist');
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::Clients()->GetClientBlacklist(['id' => 42]);

if ($response['data']['blacklisted'] ?? false) {
    $reason = $response['data']['reason'];
}
```

### Kara Listeye Alma

post/api/v1/admin/clients/{id}/blacklist

`Clients/CreateClientBlacklist` admin hizmetleri askıya alabilir

Müşteriyi kara listeye alır ve seçtiğiniz kısıtlamaları uygular.

Gövde 3

reasonstringzorunluNeden. Değerler: `payment_fraud` · `chargeback` · `abuse` · `spam` · `tos_violation` · `false_info` · `other`

notesstringSerbest not. Kararı açıklamak için.

restrictionsobject 4 alanHangi kısıtlamaların açılacağı. Gönderilmezse hiçbiri açılmaz; müşteri yalnız işaretlenir.

block_new_ordersboolYeni sipariş vermeyi engeller.

block_renewalsboolYenilemeleri engeller.

block_ticketsboolDestek talebi açmayı engeller. Gönderilmezse hesabın mevcut engeli korunur. `true` engeli açar, açıkça gönderilen `false` kapatır.

suspend_servicesboolHizmetleri askıya alır.

Dönen alanlar data

dataobjectOluşan kara liste kaydı, `201` ile döner. Yukarıdaki durum ucuyla aynı şekilde gelir.

Hatalar 4

not_found404Müşteri bulunamadı.

reason_invalid422Neden, izin verilen değerlerden biri değil.

blocked_by_gate422Bir kanca (`gate:user.blacklist_add`) işlemi veto etti.

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/clients/42/blacklist' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"reason":"chargeback","notes":"Iki ters ibraz","restrictions":{"block_new_orders":true,"suspend_services":true}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/blacklist', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"reason":"chargeback","notes":"Iki ters ibraz","restrictions":{"block_new_orders":true,"suspend_services":true}}),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/blacklist');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'reason'       => 'chargeback',
        'notes'        => 'Iki ters ibraz',
        'restrictions' => [
            'block_new_orders' => true,
            'suspend_services' => true,
        ],
    ]),
]);

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

```php
$response = Api::Clients()->CreateClientBlacklist([
    'id'           => 42,
    'reason'       => 'chargeback',
    'notes'        => 'Iki ters ibraz',
    'restrictions' => [
        'block_new_orders' => true,
        'suspend_services' => true,
    ],
]);
```

### Kara Liste Kaydını Düzenleme

put/api/v1/admin/clients/{id}/blacklist

`Clients/UpdateClientBlacklist` admin hizmetleri askıya alabilir

Mevcut kaydın nedenini, notunu ve kısıtlamalarını değiştirir. Müşteriyi kara listeye alan kişi ve tarih olduğu gibi kalır.

Gövde 4

reasonstringzorunluYeni neden. Değerler kara listeye alırkenkiyle aynıdır.

notesstringYeni not. Kayıtlı notun yerine geçer; silmek için boş metin gönderin.

restrictionsobjectKısıtlamaların tamamı; alanlar kara listeye alırkenki dört alandır. Göndermediğiniz alan kapatılır, `block_tickets` dahil.

reactivate_servicesboolYalnız `suspend_services` açıktan kapalıya geçerken okunur: kara liste yüzünden askıya alınan hizmetleri yeniden açar.

Dönen alanlar data

dataobjectGüncellenen kayıt, `200` ile döner. Yukarıdaki durum ucuyla aynı biçimdedir.

Hatalar 5

not_found404Müşteri yok.

not_blacklisted422Müşteri kara listede değil.

reason_invalid422Neden izin verilen değerlerden biri değil.

blocked_by_gate422`gate:user.blacklist_update` kancasını dinleyen bir kod işlemi engelledi.

insufficient_scope403Anahtarın gerekli izni yok.

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

```bash
curl -X PUT 'https://panel.example.com/api/v1/admin/clients/42/blacklist' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"reason":"tos_violation","notes":"Reviewed with legal","restrictions":{"block_new_orders":true,"block_tickets":true}}'
```

```javascript
const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/blacklist', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"reason":"tos_violation","notes":"Reviewed with legal","restrictions":{"block_new_orders":true,"block_tickets":true}}),
});

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

```php
$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/blacklist');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'reason'       => 'tos_violation',
        'notes'        => 'Reviewed with legal',
        'restrictions' => [
            'block_new_orders' => true,
            'block_tickets'    => true,
        ],
    ]),
]);

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

```php
$current = Api::Clients()->GetClientBlacklist(['id' => 42]);

$response = Api::Clients()->UpdateClientBlacklist([
    'id'           => 42,
    'reason'       => 'tos_violation',
    'notes'        => 'Reviewed with legal',
    'restrictions' => $current['data']['restrictions'] ?? [],
]);
```

### Kara Listeden Çıkarma

delete/api/v1/admin/clients/{id}/blacklist

`Clients/DeleteClientBlacklist` admin

Kara liste kaydını kaldırır ve müşterinin destek talebi engelini de kapatır. Askıya alınan hizmetleri geri açmak ayrı bir tercihtir.

Gövde 1

reactivate_servicesboolKara liste yüzünden askıya alınan hizmetleri yeniden açar. Gönderilmezse hizmetler askıda kalır.

Dönen alanlar data

removedboolÇıkarma başarılı mı.

Hatalar 3

not_found404Müşteri bulunamadı.

not_blacklisted422Müşteri kara listede değil.

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/clients/42/blacklist' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"reactivate_services":true}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/blacklist', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ reactivate_services: true }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/blacklist');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['reactivate_services' => true]),
]);

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

```php
$response = Api::Clients()->DeleteClientBlacklist([
    'id'                  => 42,
    'reactivate_services' => true,
]);
```

### Mükerrer Hesap Taraması

get/api/v1/admin/clients/{id}/duplicates

`Clients/GetClientDuplicates` admin IP · ad · şirket

Müşteriyle aynı IP'yi, adı ya da şirket adını paylaşan diğer hesapları döndürür.

Dönen alanlar data — 2

currentobjectİncelenen müşterinin özeti: `id`, `full_name`, `company_name`, `ip`, `created_at`.

matchesobject[] 7 alanEşleşen hesaplar.

idintEşleşen müşterinin kimliği.

full_namestringAd soyad.

company_namestringŞirket adı.

ipstringHesabın kayıtlı IP'si; müşterinin her kendi girişinde güncellenir.

created_atstring | nullKayıt tarihi.

days_apartintİki hesabın kayıt tarihleri arasındaki gün farkı. Mutlak değer.

match_typesstring[]Neyin eşleştiği: `ip`, `name`, `company`.

matched_ipsstring[]`ip` eşleşmesini üreten adresler. Hesap yalnız ad ya da şirket adıyla eşleştiyse boş döner.

Hatalar 2

not_found404Müşteri bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

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

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

const sameIp = body.data.matches.filter((m) => m.match_types.includes('ip'));
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/duplicates');
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::Clients()->GetClientDuplicates(['id' => 42]);

foreach ($response['data']['matches'] as $match) {
    // Aynı IP ve birkaç gün arayla açılmış hesap, ada göre eşleşmeden daha güçlü bir işarettir.
    if (in_array('ip', $match['match_types'], true) && $match['days_apart'] < 7) {
        $suspects[] = $match['id'];
    }
}
```

Yanıt 200

```json
{
  "data": {
    "current": {
      "id": 42,
      "full_name": "Ayse Yilmaz",
      "company_name": "",
      "ip": "203.0.113.10",
      "created_at": "2026-01-01 10:00:00"
    },
    "matches": [
      {
        "id": 57,
        "full_name": "A. Yilmaz",
        "company_name": "",
        "ip": "203.0.113.10",
        "created_at": "2026-01-03 09:20:00",
        "days_apart": 2,
        "match_types": ["ip", "name"],
        "matched_ips": ["203.0.113.10"]
      }
    ]
  }
}
```

## Tuzaklar

> **Çıkarmak hizmetleri geri açmaz**
> 
> Kara listeden çıkarmak askıya alınmış hizmetleri kendiliğinden açmaz. Açılmasını istiyorsanız `reactivate_services` gönderin; yoksa müşteri kara listeden çıkar ama hizmetleri askıda kalır.

> **Destek talebi engeli iki anahtarlı tek ayardır**
> 
> Buradaki `block_tickets` ile destek ayarları ucundaki `ticket_blocked` birlikte yazılır. Kaydı kaldırmak ikisini de kapatır; `block_tickets` gönderilmeyen bir düzenleme de öyle.
> 
> Listeden çıkardığınız müşteride engelin kalmasını istiyorsanız `PATCH /clients/{id}/support-settings` ile yeniden açın. Kara listede olmayan müşteriye konan engel kendi başına kalır.

> **Eşleşme suç değildir**
> 
> Aynı IP bir ev ya da ofis olabilir, aynı ad bir tesadüf. `match_types` ile `days_apart` birlikte okunur: aynı IP'den birkaç gün arayla açılmış iki hesap, yalnız ada göre eşleşen iki hesaptan çok daha güçlü bir işarettir.

> **Personel adresleri kanıt sayılmaz**
> 
> IP kanıtı olarak kayıtlı IP ve müşterinin kendi giriş kayıtları kullanılır. Personelin çalıştığı adresler, **Müşteri Paneline Giriş Yap** ile açılan oturumlar dahil, dışarıda kalır. Eşleşmeyi hangi adresin ürettiğini `matched_ips` gösterir.

## İlgili Makaleler

- [Müşteri Uçları](https://dev.wisecp.com/tr/musteri-uclari)
- [Müşteri Güvenliği](https://dev.wisecp.com/tr/musteri-guvenligi)
- [İstek ve Yanıt Biçimi](https://dev.wisecp.com/tr/istek-ve-yanit-bicimi)
