# KVKK Talepleri

https://dev.wisecp.com/tr/kvkk-talepleri

Müşterinin veri kaldırma taleplerini okuyan, karara bağlayan ve özelliğin ayarlarını yöneten on uç.

## Genel Bakış

Müşteri kendi verisinin kaldırılmasını isteyebilir. Bu uçlar o talepleri okur, karara bağlar ve özelliğin kendi ayarlarını yönetir.

Kaldırmanın üç kapsamı vardır ve **geri dönüşü yoktur**: erişimi kesmek, kimlik verisini anonimleştirmek, kullanıcıyı tamamen silmek. Hangisinin uygulandığını yanıttaki `remove_action` söyler.

## Referans

### Talepleri Listeleme

get/api/v1/admin/clients/gdpr-requests

`Clients/GetGdprRequests` admin

Müşterilerden gelen veri talepleri listesini döndürür.

Sorgu parametreleri 4

statusstringDuruma göre süzer.

typestringTalep türüne göre süzer.

pageintVarsayılan 1.

limitintVarsayılan 25, en çok 100.

Dönen alanlar data[] — 5

idintTalep kimliği.

user_idintTalebi açan müşteri.

typestringNe istendiği, örneğin `remove`.

statusstringTalebin durumu, örneğin `pending`.

created_atstringGeliş zamanı.

Meta 4

totalintEşleşen toplam talep.

pageintBulunduğunuz sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa; son sayfada `0`.

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/clients/gdpr-requests' \
  -H "Authorization: Bearer $API_KEY" \
  -d limit=50
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/clients/gdpr-requests');
url.searchParams.set('limit', '50');

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/clients/gdpr-requests?' . http_build_query(['limit' => 50]);

$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::Clients()->GetGdprRequests([], ['limit' => 50]);
```

### Talep Detayı

get/api/v1/admin/clients/gdpr-requests/{rid}

`Clients/GetGdprRequest` admin

Tek bir talebi döndürür. Karar vermeden önce bakılacak yer burasıdır.

Dönen alanlar data — 1

requestobject 7 alanTalep kaydı.

idintTalep kimliği.

statusstringTalebin durumu.

remove_typestringİstenen kapsam: `block_access`, `identifying_data` ya da `all`.

invoice_countintMüşterinin fatura sayısı. Karar verirken bakılır: fatura yasal saklama süresine tabidir.

processedboolİşlem tamamlandı mı.

processed_byintİşleyen yöneticinin kimliği.

created_atstringTalep tarihi.

Hatalar 2

not_found404Talep 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/gdpr-requests/9' \
  -H "Authorization: Bearer $API_KEY"
```

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9');
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()->GetGdprRequest(['rid' => 9]);

$request = $response['data']['request'];

// Faturasi olan bir musteride 'all' istemek yasal saklama ile carpisabilir.
$hasInvoices = $request['invoice_count'] > 0;
```

### Talebi İşleme

post/api/v1/admin/clients/gdpr-requests/{rid}/process

`Clients/ProcessGdprRequest` admin geri alınamaz

Talebi onaylar ya da reddeder. Onaylarsanız istenen kapsamda veri kaldırma çalışır.

Gövde 5

statusstringzorunluKarar: `remove`, `anonymize`, `destroy` ya da reddetmek için `cancelled`.

remove_typestringKaldırma kapsamı. Yalnız onay verirken anlamlı. `block_access` erişimi keser, `identifying_data` kimlik verisini anonimleştirir, `all` kullanıcıyı siler.

status_notestringKarara düşülen not. Reddederken sebebi buraya yazın.

notificationboolMüşteriye bildirim gönderir.

blacklistboolAynı işlemde müşteriyi kara listeye alır ya da çıkarır.

Dönen alanlar data — 4

processedboolİşlem tamamlandı mı.

statusstringUygulanan durum.

remove_actionstringGerçekte uygulanan kaldırma: `none`, `block_access`, `identifying_data` ya da `all`.

blacklistintİşlem sonrası kara liste durumu: `0` ya da `1`.

Hatalar 4

not_found404Talep bulunamadı.

status_invalid422`status` izinli değerlerden değil.

blocked_by_gate422Bir kanca işlemi veto etti. Kendi eklentiniz silmeyi engelliyor olabilir.

gdpr_delete_failed500Kullanıcı verisi silinemedi.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9/process' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"anonymize","remove_type":"identifying_data","status_note":"Talep dogrulandi","notification":true}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9/process', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    status: 'anonymize',
    remove_type: 'identifying_data',
    status_note: 'Talep dogrulandi',
    notification: true,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9/process');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'status'      => 'anonymize',
        'remove_type' => 'identifying_data',
        'status_note' => 'Talep dogrulandi',
    ]),
]);

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

```php
$response = Api::Clients()->ProcessGdprRequest([
    'rid'         => 9,
    'status'      => 'anonymize',
    'remove_type' => 'identifying_data',
    'status_note' => 'Talep dogrulandi',
]);

$applied = $response['data']['remove_action'] ?? 'none';
```

Yanıt 200 422

```json
{
  "data": {
    "processed": true,
    "status": "anonymize",
    "remove_action": "identifying_data",
    "blacklist": 0
  }
}
```

```json
{
  "error": {
    "code": "blocked_by_gate",
    "message": "The removal was blocked by a hook."
  }
}
```

### Talebi Silme

delete/api/v1/admin/clients/gdpr-requests/{rid}

`Clients/DeleteGdprRequest` admin

Talep kaydını siler. Müşterinin verisine dokunmaz; yalnız kayıt gider.

Dönen alanlar data — 2

deletedboolSilme başarılı mı.

idintSilinen talebin kimliği.

Hatalar 1

not_found404Talep bulunamadı.

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

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9');
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::Clients()->DeleteGdprRequest(['rid' => 9]);
```

### Ayarları Getirme

get/api/v1/admin/clients/gdpr-settings

`Clients/GetGdprSettings` admin

Özelliğin açık olup olmadığını, bağlı sözleşme sayfasını ve hazır red nedenlerini döndürür.

Dönen alanlar data — 4

enabledboolÖzellik açık mı.

requiredboolOnay zorunlu mu.

contract_page_idintBağlı sözleşme sayfasının kimliği.

denial_reasonsarrayHazır red nedenleri. Hiç yoksa boş dizi.

Hatalar 1

insufficient_scope403Anahtarda ilgili scope yok.

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

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-settings');
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()->GetGdprSettings();
```

### Ayarları Kaydetme

put/api/v1/admin/clients/gdpr-settings

`Clients/SaveGdprSettings` admin

Özelliği açar ya da kapatır ve sözleşme sayfasını bağlar.

Gövde 3

enabledboolÖzelliği açar ya da kapatır.

requiredboolOnayı zorunlu kılar.

contract_page_idintBağlanacak sözleşme sayfasının kimliği. Liste: `gdpr-contracts`.

Dönen alanlar data — 3

enabledboolYazım sonrası özelliğin açık olup olmadığı.

requiredboolOnayın zorunlu olup olmadığı.

contract_page_idintBağlı sözleşme sayfası.

Hatalar 1

insufficient_scope403Anahtarda ilgili scope yok.

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

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/clients/gdpr-settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"enabled":true,"required":true,"contract_page_id":12}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ enabled: true, required: true, contract_page_id: 12 }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'enabled'          => true,
        'required'         => true,
        'contract_page_id' => 12,
    ]),
]);

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

```php
$response = Api::Clients()->SaveGdprSettings([
    'enabled'          => true,
    'required'         => true,
    'contract_page_id' => 12,
]);
```

### Sözleşme Sayfalarını Arama

get/api/v1/admin/clients/gdpr-contracts

`Clients/GetGdprContracts` admin

Sözleşme olarak bağlanabilecek sayfaları döndürür. `contract_page_id` için kaynak budur.

Dönen alanlar data[] — 2

idintSayfa kimliği — `contract_page_id` olarak bunu gönderirsiniz.

titlestringSayfa başlığı.

Hatalar 1

insufficient_scope403Anahtarda ilgili scope yok.

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

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-contracts');
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()->GetGdprContracts();
```

### Red Nedenlerini Listeleme

get/api/v1/admin/clients/gdpr-denial-reasons

`Clients/GetGdprDenialReasons` admin

Talep reddederken kullanılan hazır metinleri döndürür.

Dönen alanlar data[]

datastring[]Düz bir metin listesi — burada kimlik yoktur, metnin kendisi kimliktir.

Hatalar 1

insufficient_scope403Anahtarda ilgili scope yok.

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

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons');
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()->GetGdprDenialReasons();
```

### Red Nedeni Ekleme

post/api/v1/admin/clients/gdpr-denial-reasons

`Clients/AddGdprDenialReason` admin

Listeye yeni bir hazır neden ekler.

Gövde 1

valuestringzorunluNeden metni.

Dönen alanlar data[]

datastring[]Ekleme sonrası listenin tamamı; eklenen metin tek başına dönmez.

Hatalar 1

value_required422`value` boş gönderildi.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"value":"Yasal saklama suresi dolmadi"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ value: 'Yasal saklama suresi dolmadi' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['value' => 'Yasal saklama suresi dolmadi']),
]);

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

```php
$response = Api::Clients()->AddGdprDenialReason(['value' => 'Yasal saklama suresi dolmadi']);
```

### Red Nedeni Silme

delete/api/v1/admin/clients/gdpr-denial-reasons

`Clients/DeleteGdprDenialReason` admin metinle silinir

Bir nedeni listeden çıkarır. Kimlik değil, metnin kendisi gönderilir.

Gövde 1

valuestringzorunluSilinecek metin. Listedekiyle birebir aynı olmalı.

Dönen alanlar data[]

datastring[]Geriye kalan nedenler. Eşleşmeyen bir metin listeyi değiştirmez — bir şeyin gidip gitmediğini karşılaştırarak anlarsınız.

Hatalar 1

value_required422`value` boş gönderildi.

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

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"value":"Yasal saklama suresi dolmadi"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ value: 'Yasal saklama suresi dolmadi' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['value' => 'Yasal saklama suresi dolmadi']),
]);

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

```php
$response = Api::Clients()->DeleteGdprDenialReason(['value' => 'Yasal saklama suresi dolmadi']);
```

## Tuzaklar

> **Fatura sayısına karar vermeden bakın**
> 
> Talep detayı `invoice_count` taşır. Fatura çoğu ülkede yasal saklama süresine tabidir; faturası olan bir müşteride `all` istemek o yükümlülükle çarpışabilir. Alan bu yüzden yanıttadır.

> **Bir kanca işlemi veto edebilir**
> 
> `blocked_by_gate` hatası isteğinizin yanlış olduğunu değil, kurulumdaki bir eklentinin silmeyi engellediğini söyler. Kendi kancanızı yazdıysanız önce oraya bakın.

> **Talebi silmek veriyi silmez**
> 
> Silme ucu yalnız talep kaydını kaldırır. Müşterinin verisi olduğu gibi kalır; kaldırma yalnız işleme ucundan çalışır.

## İlgili Makaleler

- [Müşteri Uçları](https://dev.wisecp.com/tr/musteri-uclari)
- [Kara Liste ve Mükerrer Hesap](https://dev.wisecp.com/tr/kara-liste-ve-mukerrer-hesap)
