KVKK Talepleri

1.6k görüntülenme Markdown

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 -G 'https://panel.ornek.com/api/v1/admin/clients/gdpr-requests' \
  -H "Authorization: Bearer $API_KEY" \
  -d limit=50
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();
$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);
$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
requestobjectTalep 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 'https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$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);
$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_invalid422status 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 -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}'
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();
$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);
$response = Api::Clients()->ProcessGdprRequest([
    'rid'         => 9,
    'status'      => 'anonymize',
    'remove_type' => 'identifying_data',
    'status_note' => 'Talep dogrulandi',
]);

$applied = $response['data']['remove_action'] ?? 'none';
Yanıt
{
  "data": {
    "processed": true,
    "status": "anonymize",
    "remove_action": "identifying_data",
    "blacklist": 0
  }
}
{
  "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 -X DELETE 'https://panel.ornek.com/api/v1/admin/clients/gdpr-requests/9' \
  -H "Authorization: Bearer $API_KEY"
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();
$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);
$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 'https://panel.ornek.com/api/v1/admin/clients/gdpr-settings' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$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);
$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 -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}'
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();
$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);
$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 'https://panel.ornek.com/api/v1/admin/clients/gdpr-contracts' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-contracts', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$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);
$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 'https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/gdpr-denial-reasons', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$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);
$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_required422value boş gönderildi.
İstek
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"}'
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();
$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);
$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_required422value boş gönderildi.
İstek
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"}'
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();
$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);
$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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.